2012-05-21 10 views
30

क्या यह किसी भी तरह से समानांतर निर्माण करने में सक्षम होना संभव है चाहे कोई भी उपकरण का उपयोग न किया जाए?सीएमके में पोर्टेबल समांतर बिल्ड को कॉन्फ़िगर कैसे करें?

यूनिक्स के अंतर्गत हम make -jN जोड़ सकते हैं जहां N मैं CXX_FLAG "/MP" को जोड़ा गया धागे की और Windows के तहत संख्या जो तब दृश्य स्टूडियो में प्रयोग किया जाता है समानांतर निर्माण करने के लिए कर रहे हैं ...? मैं अपने संस्करण को कैसे बना सकता हूं कि CMAKE_MAKE_PROGRAM जब मैं सीएमके चलाता हूं तो हमेशा विस्तारित नहीं होता है?

सामान्य समाधान क्या है?

मैं इस के साथ आया था:

#Add some multithreaded build support 
MARK_AS_ADVANCED(MULTITHREADED_BUILD) 
set(MULTITHREADED_BUILD 12 CACHE STRING "How many threads are used to build the project") 
if(MULTITHREADED_BUILD) 
    if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles") 
      message(STATUS ${CMAKE_BUILD_TOOL}) 
      set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j${MULTITHREADED_BUILD}") 
      message(STATUS "Added arguments to CMAKE_BUILD_TOOL: ${CMAKE_MAKE_PROGRAM}") 
    elseif(MSVC) 
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") 
     message(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") 
    endif() 
endif() 
+1

नहीं सु फिर से किया जा सकता है, वैसे भी यह एक अच्छा विचार मत सोचो। सीएमके का वर्णन है कि परियोजना कैसे बनाई जाती है और सीएमके से इसकी बात कैसे अलग होती है। – Lap

+0

अपने दृष्टिकोण को विस्तारित करना केवल cmake की कमांड लाइन में '-DMULTITHREADED_BUILD = 12' जोड़ें। और 'SET (MULTITHREADED_BUILD ...)' – bikram990

+0

हटाएं ग्रहण सीडीटी के साथ मेरे मामले में त्रुटि में परिणाम: "/ usr/bin/make -j8" सभी प्रोग्राम "/ usr/bin/make -j8" प्रोग्राम नहीं चलाया जा सकता: अज्ञात कारण त्रुटि: प्रोग्राम "/ usr/bin/make -j8" पाथ –

उत्तर

10

आप cmake v2.8.8 या उच्चतर है, तो आप GNU make

mkdir build 
cd build 
cmake -G Ninja .. 
ninja    # Parallel build (no need -j12) 

या

का एक वैकल्पिक
mkdir build 
cd build 
cmake -G Ninja .. 
cmake --build . # Parallel build using ninja 

ninja सभी उपलब्ध कोर डिफ़ॉल्ट रूप से उपयोग करता है और आईओ तक पहुँचता का अनुकूलन के रूप में ninja उपयोग कर सकते हैं। हालांकि, इसके JSON कॉन्फ़िगरेशन को हाथ से लिखना आसान नहीं है और मैं इसे उच्च स्तर के टूल का उपयोग करके cmake के रूप में हमेशा उत्पन्न करता हूं। (ninja एक निम्न स्तरीय निर्माण प्रणाली है।)

Qt Creator v2.6 (और शायद अन्य आईडीई) निंजा का उपयोग कर सकते हैं। इसलिए, CMAKE_MAKE_PROGRAM की आवश्यकता के बिना, निर्माण समानांतर में चलाया जाता है।

एमएस-विंडोज (मिनीजीडब्ल्यू/एमएसवाईएस/सिगविन) पर पोर्टेज के लिए http://clausklein.github.io/ninja/ भी देखें।

4

आप इस पार मंच नहीं कर सकते। -जेएन विकल्प जेनरेट मेकफ़ाइल का हिस्सा बनाने के लिए एक पैरामीटर है। हालांकि, आप सीएमके को एक बैश स्क्रिप्ट उत्पन्न कर सकते हैं जो आपके प्रोजेक्ट के लिए -जेएन का उपयोग करके चलता है (जहां स्क्रिप्ट आपके पास कोर की संख्या को देखती है)।

+4

विजुअल स्टूडियो के लिए: 'msbuild your_project.sln/maxcpucount: N' –

+2

@ जेन डेवी: आप' cmake --build 'कॉल करके सीएमके बिल्ड टूल का उपयोग करके इस पैरामीटर को भी पास कर सकते हैं।-/maxcpucount: 8' क्योंकि सीमैक बिल्ड उपकरण में "खाली" '--' के बाद सभी पैरामीटर पास करता है। –

+0

@ रोलैंड सरराज़िन हाँ, मेरी वर्तमान लिपि 'cmake --build है। - लक्ष्य स्थापित करें - कॉन्फिग रिलीज -/एम' और ऐसा लगता है कि यह सभी कोर पर काम कर रहा है। [इस चर्चा] के लिए धन्यवाद (https://cmake.org/pipermail/cmake/2011- नवंबर/047784.html)। मैं यह भी सुझाव देता हूं कि सटीक संख्या निर्दिष्ट न करें, इस मामले में एमएसबिल्ड इस बात पर विचार करेगा कि निर्माण सभी उपलब्ध कोरों पर किया जाना चाहिए, लेकिन अस्तित्व से अधिक नहीं। –

3

इस पोस्ट पहले से ही एक सा पुराना है के रूप में:

मेरे दृष्टिकोण मैं करने के लिए Unix Makefiles आधारित जेनरेटर यह यहां किया जाता है के लिए एक parallelmake.sh स्क्रिप्ट लिख रहा है नीचे बसे है https://github.com/gabyx/ApproxMVBB

और प्रासंगिक भागों में cmake फ़ाइल:

https://github.com/gabyx/ApproxMVBB/blob/master/CMakeLists.txt#L89

#Add some multithreaded build support ===================================================================================================== 
MARK_AS_ADVANCED(MULTITHREADED_BUILD) 
SET(MULTITHREADED_BUILD ON CACHE BOOL "Parallel build with as many threads as possible!") 
if(MULTITHREADED_BUILD) 
    if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles") 
      file(COPY ${ApproxMVBB_ROOT_DIR}/cmake/parallelmake.sh DESTINATION ${PROJECT_BINARY_DIR} 
       FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE 
       NO_SOURCE_PERMISSIONS 
      ) 
      SET(CMAKE_MAKE_PROGRAM "${PROJECT_BINARY_DIR}/parallelmake.sh") 
      MESSAGE(STATUS "Set make program to ${PROJECT_BINARY_DIR}/parallelmake.sh") 
    elseif(MSVC) 
     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" "/MP") 
     MESSAGE(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") 
    endif() 
endif() 
# ========================================================================================================================================