اختيار المترجم C في حزمة Cabal
سؤال
قررت إضافة بعض الأعلام للتحكم في الطريقة التي يتم بها تجميع ملف 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.