मैं 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
वहां नहीं था: जैसे कि मेरी परियोजना में केवल मेकफ़ाइल शामिल हैं। क्या यह किया जा सकता है? समाधान सुरुचिपूर्ण, या गन्दा है? क्या मुझे इसके बजाय कुछ और करने की कोशिश करनी चाहिए?
धन्यवाद!
वाह बनाने के लिए मिल की कोशिश कर रहा त्रुटियों जाएगा शामिल करना चाहिए! मैंने इसके बारे में भी सोचा नहीं! यद्यपि एक समस्या है: मेकफ़ाइल ($ अनुमानित) परियोजना प्रोजेक्ट की तुलना में एक अलग pwd/$ CUR_DIR की अपेक्षा करता है (ऐसा लगता है कि यह प्रोजेक्ट/.build में है)। इसे ठीक करने का कोई उपाय? – strager
मुझे नहीं लगता कि आप नियमों के बीच कार्यशील निर्देशिका को बदल सकते हैं, हालांकि मैंने vpath पर एक नोट जोड़ा है, जो आपको सही जगह पर अपनी ऑब्जेक्ट फाइल आदि ढूंढने की अनुमति देनी चाहिए। – cramsin
मुझे vpath के बिना निम्न त्रुटि मिलती है: [1]: CMakeFiles/Makefile2: ऐसी कोई फ़ाइल या निर्देशिका नहीं। यह सेमेक से उत्पन्न मेकफ़ाइल कॉलिंग के कारण होता है: $ (मेक) -फ सीएमकेफ़ाइल/मेकफ़ाइल 2 सभी। सीएमकेफ़ाइल मेरी बिल्ड निर्देशिका में एक उप-निर्देशिका है। [जारी ...] – strager