2014-09-05 8 views
7

के माध्यम से एक बैश कमांड चलाना मैं सीएमके को या तो तीन बैश कमांड या बैश स्क्रिप्ट चलाने की कोशिश कर रहा हूं। हालांकि, मैं इसे काम करने के लिए प्रतीत नहीं कर सकता।सीएमके

बैश आदेशों हैं:

cd ${CMAKE_SOURCE_DIR}/dependencies/library 
    make 
    cd ${CMAKE_BINARY_DIR} 

अनिवार्य रूप से, मैं CMake चाहते हैं कि निर्देशिका में पुस्तकालय का निर्माण करता है, तो यह पहले से ही मौजूद नहीं है।

if(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 
    execute_process(COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/library) 
    execute_process(COMMAND make) 
    execute_process(COMMAND cd ${CMAKE_BINARY_DIR}) 
endif(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 

हालांकि, यह कुछ भी निर्माण नहीं कर रहा है:

यहाँ CMake कोड मैंने कोशिश की है। मैं क्या गलत कर रहा हूं?

इसके अलावा, जबकि मैं यहां यह पूछ रहा हूं: तीसरा आदेश, बाइनरी फ़ोल्डर में जाने के लिए, शामिल होना चाहिए?

धन्यवाद!

+3

सबसे पहले आप उन 'cd' आदेशों के बजाय' WORKING_DIRECTORY' पैरामीटर का उपयोग क्यों नहीं कर रहे हैं? कुछ 'execute_process (COMMAND WORKING_DIRECTORY $ {CMAKE_SOURCE_DIR}/निर्भरता/लाइब्रेरी) की तरह कुछ। मुझे लगता है, 'execute_process()' कॉल समान वातावरण साझा नहीं करता है। इसके अलावा, अगर मैं आप थे, तो मैं ['add_custom_target()'] (http://www.cmake.org/cmake/help/v3.0/command/add_custom_target.html?highlight=add_custom_target) देखता हूं। और ['add_custom_command()'] (http://www.cmake.org/cmake/help/v3.0/command/add_custom_command.html?highlight=add_custom_command) इस तरह की चीज़ के लिए। – Kamiccolo

+1

मैं @Kamiccolo के अधिकांश लोगों पर टिप्पणी नहीं कर सकता लेकिन मैं कह सकता हूं कि मुझे लगता है कि 'execute_process' के बारे में विस्तार राज्य को साझा नहीं करना लगभग निश्चित रूप से सटीक है। यह * अविश्वसनीय रूप से * संभव है कि पहले कमांड में 'सीडी' केवल उस प्रक्रिया के लिए निर्देशिका को बदलता है, न कि किसी अन्य के लिए। –

+1

यदि आप किसी तृतीय पक्ष लाइब्रेरी का निर्माण करना चाहते हैं, तो संभवतः आप [बाहरी प्रोजेक्ट] (http://www.cmake.org/cmake/help/v3.0/module/ExternalProject.html) मॉड्यूल का उपयोग करना बंद कर सकते हैं। – sakra

उत्तर

11

execute_process() कॉन्फ़िगरेशन समय के दौरान निष्पादित किया जाता है। लेकिन आप इसे बिल्ड समय पर चलाना चाहते हैं, इस प्रकार add_custom_command() और add_custom_target() वह है जिसे आप ढूंढ रहे हैं।

इस विशेष मामले तुम, कोई आउटपुट फ़ाइल उत्पन्न करने के लिए ताकि आप add_custom_command() के लिए जाना चाहिए (दोनों मूलतः एक ही हैं चाहते हैं, लेकिन command cmake टुकड़ा जबकि target नहीं है, एक या एक से अधिक उत्पादन फ़ाइलें पैदा करता है।

इस निम्नलिखित कुछ ऐसा दिखाई देगा के लिए:

add_custom_command(
    OUTPUT ${CMAKE_SOURCE_DIR}/dependencies/library/lib.o 
    WORKING_DIR ${CMAKE_SOURCE_DIR}/dependencies/library 
    COMMAND make 
) 

फिर आप निर्भरता के रूप में एक और लक्ष्य में आउटपुट फ़ाइल जोड़ने के लिए, और सब कुछ करना चाहिए (उम्मीद) अपेक्षित तरीके से

कुछ इनपुट स्रोतों के बदले में आप ऑब्जेक्ट फ़ाइल को पुनर्निर्माण करने के लिए add_custom_command() कॉल पर DEPENDS कथन भी जोड़ सकते हैं।