سؤال

قررت إضافة بعض الأعلام للتحكم في الطريقة التي يتم بها تجميع ملف C Source (أي شيء مثل الاستخدام-clang ، استخدام الاستخدام وما إلى ذلك).

      C-Sources:    c_lib/tiger.c
      Include-Dirs: c_lib
      Install-Includes: tiger.h

      if flag(debug)
          GHC-Options: -debug -Wall -fno-warn-orphans
          CPP-Options: -DDEBUG
          CC-Options: -DDEBUG -g
      else
          GHC-Options: -Wall -fno-warn-orphans

السؤال هو: ما هي الخيارات في ملف descritpion يجب تعديلها لتغيير برنامج التحويل البرمجي C؟ لقد وجدت فقط CC- خيارات.

هل كانت مفيدة؟

المحلول

لا يبدو أن هناك أي طريقة لتحديد هذا في ملف .cabal ؛ الشيء الوحيد الذي يبدو أننا في الوقت الحالي سيكون مفيدًا حتى عن بُعد هنا --with-<prog>=path.

أقترح عليك محاولة تقديم تذكرة ضد Cabal على تراك.

نصائح أخرى

لا توجد طريقة مباشرة ، لكنها ممكنة.

على افتراض أنك تستخدم التوزيع. simple ، فأنت بحاجة أساسًا إلى إضافة خطاف المستخدم إلى مرحلة الإنشاء.

كل التغييرات التالية تحتاج إلى الظهور في setup.hs:

تغيير رئيسي لاستخدام خطاف البناء ، شيء مثل:

main :: IO ()
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook }

بعد ذلك تحتاج إلى خطاف بناء. من المحتمل أن تبدو مثل ما يلي:

myBuildHook pkg_descr local_bld_info user_hooks bld_flags =
    do
    let lib       = fromJust (library pkg_descr)
        lib_bi    = libBuildInfo lib
        custom_bi = customFieldsBI lib_bi
        cpp_name  = fromJust (lookup "x-cc-name" custom_bi)
        c_srcs    = cSources lib_bi
        cc_opts   = ccOptions lib_bi
        inc_dirs  = includeDirs lib_bi
        lib_dirs  = extraLibDirs lib_bi
        bld_dir   = buildDir local_bld_info
    -- Compile C/C++ sources
    putStrLn "invoking my compile phase"
    objs <- mapM (compileCxx cpp_name cc_opts inc_dirs bld_dir) c_srcs
    -- Remove C/C++ source code from the hooked build (don't change libs)
    let lib_bi'    = lib_bi { cSources = [] }
        lib'       = lib    { libBuildInfo = lib_bi' }
        pkg_descr' = pkg_descr { library = Just lib' }
    -- The following line invokes the standard build behaviour
    putStrLn "Invoke default build hook"
    bh <- buildHook simpleUserHooks pkg_descr' local_bld_info user_hooks bld_flags
    return bh

الرمز أعلاه ربما يحتاج إلى تفريغ قليلا. تتمثل الجمل في الأساس حول تفريغ حقول البيانات المطلوبة من الهياكل التي تم تمريرها إلى خطاف البناء. لاحظ أنه يمكنك إنشاء مقطع مخصص في foo.cabal الخاص بك. لقد قدمت الرمز لدعم stanza شيء مثل:

x-cc-name: icc

كوسيلة لتحديد المترجم الخاص بك. بعد استخراج جميع الملفات المصدر ، تقوم بتخطيط فوقها باستخدام وظيفة لتجميع ملف واحد (NB: هذا هو الأمثل دون المستوى الأمثل في بعض الحالات ، على سبيل المثال ، تلك المجمعات التي يمكنها تجميع ملفات مصدر متعددة بكفاءة لإنتاج إخراج كائن واحد وفائدة من التحسينات على نطاق واسع ، لكننا سنترك ذلك جانباً في الوقت الحالي).

أخيرًا ، كما قمنا الآن بتجميع رمز C/C ++ ، قم بإزالته من هياكل البناء قبل نقل كل شيء إلى خطاف البناء الافتراضي.

آسف لأن هذا أكثر من "Howto" من الإجابة المعلبة ، ولكن يجب أن يساعدك على الذهاب.

أود أن أذكر أن الكود لم يتم اختباره. لقد قمت بتكييفها من بعض الأعمال التي كنت أقوم بها على نظام إنشاء WXHaskell ، لذلك أعرف أن الفكرة تعمل بشكل جيد. تم توثيق واجهة برمجة تطبيقات Cabal بشكل جيد في الواقع - فهي تعاني بشكل أساسي من كونها غير مستقرة إلى حد ما حول بعض هذه المناطق.

4.10.1. استبدال البرنامج لمرحلة واحدة أو أكثر

-pgmc CMD
يستخدم CMD كما المترجم C.

هذا يعمل ل ghc --make, ، لكنني لست متأكدًا من كيفية الحصول على cabal لتطبيق هذا على مجموعة ملف C.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top