سؤال

وأنا أحاول أن الإعداد أمر ما بعد البناء ل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()، أنصحك لتجنيب نفسك من خيبة الأمل.

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