2010-10-24 15 views
12

मैं एक निर्देशिका में add_custom_command द्वारा उत्पादित फ़ाइल प्राप्त करने का प्रयास कर रहा हूं ताकि किसी अन्य निर्देशिका में add_custom_command की निर्भरता हो।सेमेक: add_custom_command निर्भरताओं के साथ संघर्ष

पहले निर्देशिका (lib/कोर) मैं एक निर्माण आदेश है कि इस तरह दिखता है में:

:

add_custom_command(
    OUTPUT libcore.bc 
    COMMAND tartln -filetype=bc -link-as-library -o libcore.bc ${STDLIB_BC_FILES} 
    DEPENDS ${STDLIB_BC_FILES} tartln 
    COMMENT "Linking libcore.bc") 

दूसरा निर्देशिका में, मैं एक आदेश है कि आदेश के उत्पादन का उपयोग करता है

add_custom_command(OUTPUT ${OBJ_FILE} 
    COMMAND tartln -disable-fp-elim -filetype=obj -o ${OBJ_FILE} ${BC_FILE} 
     "${PROJECT_BINARY_DIR}/lib/core/libcore.bc" 
    MAIN_DEPENDENCY "${BC_FILE}" 
    DEPENDS "${PROJECT_BINARY_DIR}/lib/core/libcore.bc" 
    COMMENT "Linking Tart bitcode file ${BC_FILE}") 

हालांकि, जब मैं बनाने की कोशिश, मैं निम्नलिखित त्रुटि मिलती है:

make[3]: *** No rule to make target `lib/core/libcore.bc', needed by `test/stdlib/ReflectionTest.o'. Stop. 

एक अजीब बात जो कि मैं देखता हूं कि त्रुटि संदेश में पथ एक सापेक्ष है, एक पूर्ण पथ नहीं है, इस तथ्य के बावजूद कि मुझे पता है कि $ {PROJECT_BINARY_DIR} एक पूर्ण, सही पथ है। मुझे नहीं पता कि यह एक समस्या है या सिर्फ बनाने की अजीबता है।

मैं भी libcore पुस्तकालय के लिए एक उच्च-स्तरीय लक्ष्य बनाने की कोशिश की है, lib/कोर निर्देशिका में:

add_custom_target(libcore DEPENDS libcore.bc libcore.deps) 

और फिर का उपयोग कर DEPENDS खंड में है। इसके बारे में अजीब बात यह है कि यह पहली बार काम करता है जब आप एक स्वच्छ निर्माण करते हैं, लेकिन किसी भी बाद के निर्माण पर कोई त्रुटि देता है। किसी भी मामले में, मेरी समझ है कि डिस्पेंड केवल फ़ाइल निर्भरताओं के लिए काम करना चाहिए, इसलिए यह सही समाधान की तरह प्रतीत नहीं होता है। (आपके पास कस्टम कमांड कैसे है जो तब शीर्ष-स्तरीय लक्ष्य पर निर्भर करता है?)

मैंने हर जगह पूर्ण पथ डालने का भी प्रयास किया है, कोई प्रभाव नहीं।

उत्तर

7

cmake प्रलेखन DEPENDS पैरामीटर के बारे में निम्नलिखित कहते हैं:

The DEPENDS option specifies files on which the command depends. If any dependency is an OUTPUT of another custom command in the same directory (CMakeLists.txt file) CMake automatically brings the other custom command into the target in which this command is built. If DEPENDS specifies any target (created by an ADD_* command) a target-level dependency is created to make sure the target is built before any target using this custom command.

इसलिए मुझे लगता है कि आप एक add_custom_target का उपयोग कर लक्ष्य निर्धारित करने की है और इस पर निर्भर करेगा।

add_custom_target के लिए दस्तावेज़ का कहना है:

  1. पहले निर्देशिका ईसा पूर्व फ़ाइल पैदा तुम क्या

    :

    Dependencies listed with the DEPENDS argument may reference files and outputs of custom commands created with add_custom_command() in the same directory (CMakeLists.txt file).

    तो तुम इस प्रकार add_custom_command और add_custom_target का उपयोग करना होगा add_custom_command(OUTPUT libcore.bc ...) # just as in your question add_custom_target (LibCoreBC DEPENDS libcore.bc)

  2. दूसरा निर्देशिका में आप

    add_custom_command (OUT ${OBJ_FILE} DEPENDS LibCoreBC ....)

+4

दुर्भाग्यवश, यह समाधान काम नहीं करता है। (मुझे एहसास है कि लगभग एक वर्ष बीत जाने के बाद शायद यह निराशाजनक जवाब दे रहा है।) जहां तक ​​मैं कह सकता हूं, add_custom_command का DEPENDS पैरामीटर फ़ाइल-स्तर निर्भरता होना चाहिए - हालांकि दस्तावेज़ कहते हैं कि एक लक्ष्य-स्तर निर्भरता * उसी में निर्देशिका * काम करेगा, वास्तव में मैंने पिछले 11 महीनों में कई अलग-अलग क्रमिक प्रयास किए हैं, और उनमें से कोई भी काम नहीं करता है। यही है, अगर मैं एक ही निर्देशिका में कस्टम लक्ष्य "foo" परिभाषित करता हूं, और उसके बाद "foo" का कहना है, तो यह केवल "लक्ष्य बनाने के लिए कोई नियम नहीं है" foo '... " – Talin

+0

@Talin तो यह एक प्रतीत होता है बग, क्या इस मुद्दे के लिए [सीएमके बगट्रैकर] (http://www.cmake.org/Bug/my_view_page.php) पर रिपोर्ट की गई है? – lef

0

करना मुझे नहीं लगता कि add_custom_target मैं क्या चाहते हैं के लिए काम करेंगे है। सेमेक दस्तावेजों के मुताबिक, add_custom_target द्वारा बनाए गए एक कस्टम लक्ष्य को हमेशा तारीख से बाहर माना जाता है और हमेशा बनाया जाता है।

समस्या यह है कि मैं एक add_custom_command से आउटपुट लेने की कोशिश कर रहा हूं, और इसे एक अलग निर्देशिका में add_custom_command के इनपुट में फ़ीड कर रहा हूं।मैं केवल यह करना चाहता हूं कि मूल स्रोत फ़ाइल पुरानी है - अगर मैंने add_custom_target का उपयोग किया था, तो आउटपुट हमेशा तब भी पुनर्निर्मित किया जाएगा जब स्रोत फ़ाइल नहीं बदली गई हो। यह देखते हुए कि सैकड़ों स्रोत फाइलें हैं, इससे निर्माण बहुत धीमा हो जाएगा।

यहां मैं जो करने की कोशिश कर रहा हूं: मेरे पास एक प्रोग्राम है जो एक स्रोत फ़ाइल को एक .bc फ़ाइल (एलएलवीएम बिटकोड) उत्पन्न करता है। इनमें से बहुत सी स्रोत फ़ाइलें हैं, जो बहुत सी बीबी फाइलें बनाती हैं।

एक दूसरा प्रोग्राम सभी .bc फ़ाइलों को एकल .obj (ELF ऑब्जेक्ट) फ़ाइल में बदल देता है। तो परिवर्तन चरणों इस तरह दिखेगा: क्योंकि वे कक्षाओं के पुस्तकालय हैं

source file -> .bc  (via add_custom_command) 
    .bc   -> .obj (via add_custom_command) 
    .obj  -> .exe (via add_executable) 

मूल स्रोत कोड फ़ाइलों अलग निर्देशिका में कर रहे हैं - मैं एक ही में हर वर्ग पुस्तकालय के लिए सभी कोड डाल करने के लिए नहीं करना चाहते हैं निर्देशिका।

3

यह एक गैर-उत्तर है लेकिन उपरोक्त आपके answers में से एक को स्पष्टीकरण है।

According to the cmake documents, a custom target created by add_custom_target is always considered out of date and is always built.

IMO, cmake दस्तावेजों के बजाय कहना चाहिए:

A custom target created by add_custom_target is always considered out of date and is always built, but only when requested.

इसका मतलब है कि आप add_custom_target आदेशों नए लक्ष्य बनाने के अगर आपके सभी लक्ष्यों के EXCLUDE_FROM_ALL के रूप में चिह्नित कर रहे हैं, और, और आप टाइप make कमांड लाइन से निर्दिष्ट कोई लक्ष्य नहीं है, add_custom_target के साथ जोड़े गए लक्ष्य निर्मित नहीं हैं। लेकिन अगर आप उन्हें make कमांड लाइन पर स्पष्ट रूप से स्पेल करते हैं, तो वे बनाए जाते हैं। इसके अलावा, ALL कीवर्ड है जिसे आप add_custom_target पर निर्दिष्ट कर सकते हैं ताकि उन सभी नियमों के हिस्से के रूप में बनने के लिए मजबूर किया जा सके, जिसका मेरा मानना ​​है कि make तर्क के बिना निष्पादित किया गया है।

+0

मैं सहमत हूं। शब्द "हमेशा निर्मित" शब्द सचमुच सच नहीं है। –

संबंधित मुद्दे