cmake
कस्टम बिल्ड-स्टेप्स
खोज…
परिचय
कस्टम बिल्ड चरण आपके प्रोजेक्ट बिल्ड में कस्टम लक्ष्य को चलाने के लिए या आसानी से फ़ाइलों की प्रतिलिपि बनाने के लिए उपयोगी होते हैं, इसलिए आपको इसे मैन्युअल रूप से करने की आवश्यकता नहीं है (शायद dlls?)। यहां मैं आपको दो उदाहरण दिखाऊंगा, पहला है आपकी परियोजनाओं के लिए dlls (विशेष रूप से Qt5 dlls) में बाइनरी डायरेक्ट्री (या तो डीबग या रिलीज़) और दूसरा आपके समाधान में कस्टम लक्ष्य (Doxygen) चलाने के लिए है (यदि आप विजुअल स्टूडियो का उपयोग कर रहे हैं)।
टिप्पणियों
जैसा कि आप देख सकते हैं, आप cmake में कस्टम बिल्ड टारगेट और स्टेप्स के साथ बहुत कुछ कर सकते हैं, लेकिन आपको इनका उपयोग करने में सावधानी बरतनी चाहिए, खासकर जब dlls कॉपी करते हैं। हालांकि ऐसा करने के लिए यह आश्वस्त है, यह कई बार परिणाम में हो सकता है जिसे प्यार से "dll नरक" कहा जाता है।
मूल रूप से इसका मतलब है कि आप खो सकते हैं जिसमें आपका निष्पादन योग्य डीएलएस वास्तव में निर्भर करता है, कि इसकी लोडिंग कौन सी है, और किन लोगों को इसे चलाने की आवश्यकता है (हो सकता है कि आपके कंप्यूटर के पथ चर के कारण)।
उपरोक्त चेतावनी के अलावा, कस्टम लक्ष्य बनाने के लिए स्वतंत्र महसूस करें जो आप चाहते हैं! वे शक्तिशाली और लचीले हैं और किसी भी cmake परियोजना के लिए एक अमूल्य उपकरण हैं।
Qt5 dll प्रतिलिपि उदाहरण
तो मान लें कि आपके पास एक प्रोजेक्ट है जो Qt5 पर निर्भर करता है और आपको अपने निर्माण निर्देशिका में संबंधित dll को कॉपी करने की आवश्यकता है और आप इसे मैन्युअल रूप से नहीं करना चाहते हैं; आप निम्न कार्य कर सकते हैं:
cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project
# add the executable
add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
add_custom_command(TARGET MyQtProj POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
)
इसलिए अब हर बार जब आप अपनी परियोजना का निर्माण करते हैं, यदि लक्ष्य dll को बदल दिया है जिसे आप कॉपी करना चाहते हैं, तो उन्हें आपके लक्ष्य के बाद कॉपी किया जाएगा (इस मामले में मुख्य निष्पादन योग्य) बनाया गया है ( copy_if_different
कमांड को नोटिस करें); अन्यथा, उन्हें कॉपी नहीं किया जाएगा।
इसके अतिरिक्त, यहां जनरेटर के भावों के उपयोग पर ध्यान दें। इनका उपयोग करने के साथ लाभ यह है कि आपको स्पष्ट रूप से यह नहीं कहना है कि dll या कौन से वेरिएंट का उपयोग करना है। हालांकि इनका उपयोग करने में सक्षम होने के लिए, आप जिस परियोजना का उपयोग कर रहे हैं (इस मामले में Qt5) के पास आयातित लक्ष्य होना चाहिए।
यदि आप डिबग में निर्माण कर रहे हैं, तो CMake जानता है (आयातित लक्ष्य के आधार पर) Qt5Cored.dll, Qt5Guid.dll, और Qt5Widgetsd.dll की प्रतिलिपि बनाने के लिए आप फ़ोल्डर बनाएँ डीबग करें। यदि आप रिलीज़ में निर्माण कर रहे हैं, तो .dll के रिलीज़ संस्करण को रिलीज़ फ़ोल्डर में कॉपी किया जाएगा।
कस्टम लक्ष्य चलाना
जब आप किसी विशेष कार्य को करना चाहते हैं तो चलाने के लिए एक कस्टम लक्ष्य भी बना सकते हैं। ये आम तौर पर निष्पादन योग्य होते हैं जो आप अलग-अलग काम करने के लिए चलाते हैं। कुछ ऐसा जो विशेष उपयोग का हो सकता है, वह है अपने प्रोजेक्ट के लिए डॉक्यूमेंटेशन बनाने के लिए Doxygen को चलाना। ऐसा करने के लिए आप अपने CMakeLists.txt
में निम्न कार्य कर सकते हैं (सादगी के लिए हम अपने Qt5 प्रोजेक्ट उदाहरण का विरोध करेंगे):
cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project
add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
add_custom_command(TARGET MyQtProj POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
)
#Add target to build documents from visual studio.
set(DOXYGEN_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile)
#set the output directory of the documentation
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/docs)
# sanity check...
message("Doxygen Output ${DOXYGEN_OUTPUT_DIR}")
find_package(Doxygen)
if(DOXYGEN_FOUND)
# create the output directory where the documentation will live
file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
# configure our Doxygen configuration file. This will be the input to the doxygen
# executable
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
# now add the custom target. This will create a build target called 'DOCUMENTATION'
# in your project
ADD_CUSTOM_TARGET(DOCUMENTATION
COMMAND ${CMAKE_COMMAND} -E echo_append "Building API Documentation..."
COMMAND ${CMAKE_COMMAND} -E make_directory ${DOXYGEN_OUTPUT_DIR}
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E echo "Done."
WORKING_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
endif(DOXYGEN_FOUND)
अब जब हम अपना समाधान बनाते हैं (फिर से आप विजुअल स्टूडियो का उपयोग कर रहे हैं), तो आपके पास एक लक्ष्य होगा जिसे DOCUMENTATION
कहा जाता है जिसे आप अपनी परियोजना के प्रलेखन को पुन: बनाने के लिए बना सकते हैं।