2014-06-25 3 views
12

add_custom_command और एकाधिक आउटपुट फ़ाइलों के साथ काम करते समय मैं cmake में कुछ संभावित गलत व्यवहार को देख रहा हूं। मैं समस्या को कम से कम उदाहरण में अलग करने में सक्षम हूं (नीचे देखें)। ऐसा लगता है कि जब मेरे पास add_custom_command में निर्दिष्ट दो आउटपुट फाइलें हैं, तो दूसरी आउटपुट फ़ाइल की अपस्ट्रीम निर्भरताओं को कुछ मामलों में सही तरीके से ट्रैक नहीं किया जा रहा है। cmake documentation स्पष्ट रूप से उल्लेख करता है कि एकाधिक आउटपुट फ़ाइलों की अनुमति है। यहां दिलचस्प बात यह है कि आउटपुट फाइलों के क्रम को स्वैप करने से विभिन्न व्यवहार होते हैं, यह सुझाव देते हुए कि पहली OUTPUT फ़ाइल का अलग-अलग व्यवहार किया जा रहा है।cmake add_custom_command एकाधिक आउटपुट फ़ाइलों के साथ समस्या

कृपया नीचे दिए गए खिलौने का उदाहरण देखें जो इस व्यवहार को प्रदर्शित करता है। रन बनाने के लिए पहला कॉल ठीक है। a.txt को छूने के बाद, Copying baz.cpp to baz2.cpp नियम make पर पहली कॉल पर निष्पादित नहीं होता है, लेकिन दूसरी कॉल पर make पर चलता है। इसका मतलब है कि बिल्ड अभी भी एक कॉल के बाद make पर बाँध जाएगा।

> touch a.txt 
> cmake . 
    ...snip... (configuration runs fine) 
> make 
Scanning dependencies of target mytarget 
[ 20%] Generating bar.cpp and baz.cpp 
[ 40%] Copying baz.cpp to baz2.cpp 
[ 60%] Running mytarget 
[ 60%] Built target mytarget 
Scanning dependencies of target mybaz 
[ 80%] Building CXX object CMakeFiles/mybaz.dir/baz.cpp.o 
Linking CXX static library libmybaz.a 
[100%] Built target mybaz 
    (everything looks good) 

> touch a.txt 
> make 
[ 20%] Generating bar.cpp and baz.cpp 
[ 40%] Running mytarget 
[ 60%] Built target mytarget 
Scanning dependencies of target mybaz 
[ 80%] Building CXX object CMakeFiles/mybaz.dir/baz.cpp.o 
Linking CXX static library libmybaz.a 
[100%] Built target mybaz 
    (I seem to be missing the 'Copying baz.cpp to baz2.cpp' line) 

> make 
[ 20%] Copying baz.cpp to baz2.cpp 
[ 40%] Running mytarget 
[ 60%] Built target mytarget 
[100%] Built target mybaz 
    (The 'Copying baz.cpp to baz2.cpp' executes this time) 

यह CMake का उपयोग कर परीक्षण किया गया है: ध्यान दें कि इस मुद्दे OUTPUT baz.cpp bar.cpp

Example CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 

add_library(mybaz baz.cpp) 

add_custom_command(
    OUTPUT baz2.cpp 
    COMMAND cp baz.cpp baz2.cpp 
    DEPENDS baz.cpp 
    COMMENT "Copying baz.cpp to baz2.cpp") 

add_custom_target(mytarget 
    DEPENDS baz2.cpp 
    COMMENT "Running mytarget") 

add_dependencies(mybaz mytarget) 

add_custom_command(
    OUTPUT bar.cpp baz.cpp 
    COMMAND cat a.txt > bar.cpp 
    COMMAND cat a.txt > baz.cpp 
    DEPENDS a.txt 
    COMMENT "Generating bar.cpp and baz.cpp") 

नीचे करने के लिए add_custom_command में आउटपुट का क्रम बदलकर तय हो गई है आज्ञाओं कि मैं चलाते हैं एक लिनक्स मशीन पर संस्करण 2.8.12.2।

आपकी मदद के लिए अग्रिम धन्यवाद!

+1

उदाहरण के लिए +1 IMHO यह एक बग –

+0

मैं कुछ सवाल है:

CMake बग रिपोर्ट देखें। 1) क्या समस्या का पुनरुत्पादन करने के लिए कस्टम लक्ष्य 'mytarget' आवश्यक है? 2) लाइब्रेरी में 'bar.cpp' और 'baz2.cpp' फ़ाइलों को क्यों नहीं जोड़ा गया है? – legalize

+0

यह सीएमके में एक बग नहीं हो सकता है, यह एक फाइल सिस्टम दौड़ की स्थिति हो सकती है। क्या आपने सीएमके के साथ एक बग रिपोर्ट दायर की है? – Beanz

उत्तर

5

यह वास्तव में सीएमके 2.8.12.1 में एक बग है। सीएमके लोगों के मुताबिक, पहले आउटपुट का विशेष रूप से मेकफ़ाइल जनरेटर द्वारा इलाज किया जा रहा है (हालांकि, संभवतः इसका इलाज करने का कोई कारण नहीं है)। सीएमके के लिए एक फिक्स बनाया गया है, और इसे सीएमके 3.2 के लिए लक्षित किया गया है। , http://www.cmake.org/Bug/view.php?id=15116

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