بناء خطوة بعد فقط من أجل الإفراج بناء
-
06-07-2019 - |
سؤال
وأنا أحاول أن الإعداد أمر ما بعد البناء لCMake، التي فعلت باستخدام التوجيه ADD_CUSTOM_COMMAND كما جاء في وثائق CMake. ما أود أن تفعل ذلك، وليس لدي سوى على المدى بعد بناء إذا أنا خلق إنشاء إصدار من بلدي قابل للتنفيذ.
وكيف واحد لا تحقيق ذلك؟
المحلول
لمولدات أساس ماكيفيلي-يمكنك التحقق من متغير CMAKE_BUILD_TYPE
والعمل على قيمته:
if(CMAKE_BUILD_TYPE STREQUAL Debug)
message(STATUS "Do debug stuff")
elseif(CMAKE_BUILD_TYPE STREQUAL Release)
message(STATUS "Do release stuff")
elseif(CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
message(STATUS "Do release with debug info stuff")
elseif(CMAKE_BUILD_TYPE STREQUAL MinSizeRel)
message(STATUS "Do minimal size release stuff")
endif()
وبالنسبة ل Visual Studio أساس يبني، هذا السؤال SO يبدو تشير إلى أن CMAKE_BUILD_TYPE
يعمل أيضا مع VS 2005 +.
نصائح أخرى
وأنا واجهت شيئا من هذا القبيل، والرغبة في نسخ ملف DLL إلى الدليل الوجهة ولكن فقط لنسخ الإصدار. بعد الكثير من الشعر ممزقة تمكنت من الحصول عليها للعمل باستخدام بعض العبارات مولد (على ثينجيس $<...>
). أضع هنا سبع سنوات في وقت لاحق وليس ذلك بكثير على حل المشكلة (على الرغم من أنني سوف نعجب مستواك في وثاقة الصلة)، ولكن من أجل إنقاذ الشعر الجمجمة للشخص القادم جود نفس هذه المشكلة وإيجاد هذا السؤال على جوجل:
set(no_copy $<NOT:$<CONFIG:Release>>) # An abbreviation to make the example easier to read.
add_custom_command(TARGET myDLL POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E
# do nothing for non-Release build
$<${no_copy}:echo>
# output text to make clear that the copy command is not actually issued
$<${no_copy}:"copy omitted for non-release build, command would have been ">
# the actual copy command, which is overridden by the "echo" above
# in the case of a non-release build
copy_if_different $<TARGET_FILE:myDLL> ${DIR_FOR_DLL})
وهو خدعة لكتابة echo
أمام الأمر التي لولاها تصدر. بهذه الطريقة، لا يتم تنفيذ الأمر، على الرغم من أن قليلا من الضجيج الناتج. يمكن للمرء أن أرفق ما تبقى من سطر الأوامر في عدد من التعابير مولد لتقصير الانتاج على حساب ملف cmake غير قابل للقراءة تماما. من ناحية أخرى يبدو أن هناك أي وسيلة لقمع نسخة تنقليا دون توليد أي إخراج. وأخيرا، إذا كنت تعتقد أن هناك من سهل ويمكنك فقط إرسال if($<CONFIG:Release>) ... endif()
، أنصحك لتجنيب نفسك من خيبة الأمل.