2009-01-02 22 views
14

मैं cmake उपयोग कर रहा हूँ अपने प्रोजेक्ट बनाने के लिए। यूनिक्स के लिए, मैं अपने प्रोजेक्ट के रूट निर्देशिका से make टाइप करें, और cmake उचित Makefiles बनाने के लिए लागू किया (अगर वे अभी तक अस्तित्व में नहीं है) और फिर अपने प्रोजेक्ट का निर्माण करना चाहते हैं। मैं cmake "आंतरिक" फ़ाइलें (वस्तु फ़ाइलें, cmake आंतरिक Makefiles, आदि) नहीं देने के लिए (उदाहरण के लिए एक .build निर्देशिका में डाल) की तरह है, तो यह अपने प्रोजेक्ट निर्देशिका को अस्त-व्यस्त नहीं करता होगा।मेकफ़ाइल बनाने के लिए सेमेक कॉल करें?

मेरे परियोजना कई उप परियोजनाएं हैं (विशेष रूप से, एक पुस्तकालय, एक उपयोगकर्ता निष्पादन, और एक इकाई परीक्षण निष्पादन)। मुझे मेकफ़ाइल (यानी मैं make टाइप करता हूं और ऐसा होता है) प्रत्येक उप-प्रोजेक्ट के लिए cmake (ऊपर के रूप में) निष्पादित करने के लिए और केवल उस उप-प्रोजेक्ट का निर्माण (निर्भरताओं के साथ, इसलिए लाइब्रेरी निष्पादन योग्य 'मेकफ़ाइल से बनाई जाएगी, यदि आवश्यक हो)। परिणामस्वरूप बाइनरी (.so पुस्तकालय या निष्पादन योग्य) उप-प्रोजेक्ट की निर्देशिका में होना चाहिए।

मैं एक Makefile हालांकि यह कुछ हद तक hackish महसूस करता है जो कुछ हद तक अच्छी तरह से मुख्य परियोजना सा होता है, बना दिया। मैं इसे का उपयोग कर विशिष्ट लक्ष्यों निर्माण नहीं कर सकते, क्योंकि मेरे Makefile बस cmake के निर्माण निर्देशिका में make कहता है।

ध्यान दें कि लाइब्रेरी एकमात्र निर्भरता है (और शायद मैन्युअल रूप से निर्माण करने की आवश्यकता नहीं है, और क्योंकि मैं आलसी हूं) मैंने इसे अपने मेकफ़ाइल में छोड़ दिया।

BUILD_DIR := .build 

.PHONY: all clean project-gui ${BUILD_DIR}/Makefile 

all: project-gui project-test 

clean: 
    @([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} clean && rm -r ${BUILD_DIR}) || echo Nothing to clean 

project-gui: ${BUILD_DIR}/Makefile 
    @make -C ${BUILD_DIR} project-gui 
    @cp ${BUILD_DIR}/project-gui/project-gui [email protected] 

project-test: ${BUILD_DIR}/Makefile 
    @make -C ${BUILD_DIR} project-test 
    @cp ${BUILD_DIR}/project-test/project-test [email protected] 

${BUILD_DIR}/Makefile: 
    @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR} 
    @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CMAKE_OPTS} ..) 

यदि यह मदद करता है, यहाँ अपने प्रोजेक्ट संरचना है (अगर यह है "गलत" कृपया मुझे बताओ - मैं अभी भी सीख रहा हूँ cmake):

project/ 
project/CMakeLists.txt 
project/common.cmake 
project/Makefile -- see Makefile above for this; should be replaced with something better, building libproject, project-gui, and project-test 

project/libproject/ 
project/libproject/CMakeLists.txt 
project/libproject/libproject.so -- after build 
project/libproject/Makefile -- doesn't exist yet; should build libproject only 
project/libproject/source/ 
project/libproject/include/ 

project/project-gui/ 
project/project-gui/CMakeLists.txt 
project/project-gui/Makefile -- doesn't exist yet; should build libproject then project-gui 
project/project-gui/source/ 
project/project-gui/include/ 

project/project-test/ 
project/project-test/CMakeLists.txt 
project/project-test/Makefile -- doesn't exist yet; should build libproject then project-test 
project/project-test/source/ 
project/project-test/include/ 

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

धन्यवाद!

उत्तर

8

cmake makefiles पैदा कर रहा है, तो आप बस मास्टर makefile में उत्पन्न makefile, जैसे

# makefile 
all:    # Default 
include $GENERATED 
$GENERATED:$CMAKEFILE 
    # Generate the makefile here` 

शामिल कर सकते हैं यह शामिल फ़ाइलों तो उत्पन्न कर रहे हैं बनाने के लिए नए शामिल फ़ाइलों के साथ दोबारा शुरू किया गया है। शामिल फ़ाइलों को लक्ष्य, आदि का विवरण देना चाहिए

आपको वीपीएथ निर्देश का उपयोग कर प्रयुक्त फ़ाइलों का स्थान बदलने में सक्षम होना चाहिए, उदाहरण के लिए देखें Gnu make manual,

vpath %.o project/.build 

किसी और कठिन रास्ता आवश्यक निर्देशिका के नोट बनाने नियमों को फिर से लिखने के लिए है।

एड: शायद हमें एक फ्लैट मेकफ़ाइल का उपयोग नहीं करना चाहिए।

की तरह कुछ का प्रयास करें:

# makefile 
all: gui test 
clean: 
    $(MAKE) -f $(GUI-MAKE) clean 
    $(MAKE) -f $(TEST-MAKE) clean 

gui:$(GUI-MAKE) 
    $(MAKE) -f $(GUI-MAKE) all 
$(GUI-MAKE):$(GUI-CMAKE) 
    # Generate 

# Same for test 

अगर $ (बनाने) यह काम करना चाहिए -f $ (जीयूआई बनाने) कमांड लाइन पर सभी आदेश काम करता है, और हम पैदा लक्ष्य में cmake द्वारा छिपाए गए । आपको किसी अन्य लक्ष्य को मास्टर मेकफ़ाइल पर भी कॉपी करना होगा, और समानांतर में देखभाल करने की देखभाल करना होगा।

के माध्यम से वस्तु फ़ाइलों प्रचार

%.o:$(GUI-MAKE) 
    $(MAKE) -f $(GUI-MAKE) [email protected] 

कुछ

की तरह हालांकि आप शायद परीक्षण वस्तुओं

+0

वाह बनाने के लिए मिल की कोशिश कर रहा त्रुटियों जाएगा शामिल करना चाहिए! मैंने इसके बारे में भी सोचा नहीं! यद्यपि एक समस्या है: मेकफ़ाइल ($ अनुमानित) परियोजना प्रोजेक्ट की तुलना में एक अलग pwd/$ CUR_DIR की अपेक्षा करता है (ऐसा लगता है कि यह प्रोजेक्ट/.build में है)। इसे ठीक करने का कोई उपाय? – strager

+0

मुझे नहीं लगता कि आप नियमों के बीच कार्यशील निर्देशिका को बदल सकते हैं, हालांकि मैंने vpath पर एक नोट जोड़ा है, जो आपको सही जगह पर अपनी ऑब्जेक्ट फाइल आदि ढूंढने की अनुमति देनी चाहिए। – cramsin

+0

मुझे vpath के बिना निम्न त्रुटि मिलती है: [1]: CMakeFiles/Makefile2: ऐसी कोई फ़ाइल या निर्देशिका नहीं। यह सेमेक से उत्पन्न मेकफ़ाइल कॉलिंग के कारण होता है: $ (मेक) -फ सीएमकेफ़ाइल/मेकफ़ाइल 2 सभी। सीएमकेफ़ाइल मेरी बिल्ड निर्देशिका में एक उप-निर्देशिका है। [जारी ...] – strager