문제

어떤 빌드 도구를 사용하든 상관없이 병렬 빌드를 할 수 있는 방법이 있나요?

Unix에서는 다음을 추가할 수 있습니다. make -jN 여기서 N은 스레드 수이고 Windows에서는 CXX_FLAG "/MP" 그런 다음 Visual Studio에서 병렬 빌드에 사용됩니다...(?) 내 버전을 다음과 같이 만들 수 있는 방법은 무엇입니까? CMAKE_MAKE_PROGRAM CMake를 실행할 때 항상 확장되지는 않나요?

일반적인 해결책은 무엇입니까?

나는 이것을 생각해 냈습니다 :

# 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()
도움이 되었습니까?

해결책

cmake 3.12와 함께 가능합니다.릴리스 노트에서 :

"CMAKE (1)"빌드 툴 모드 ( "cmake -build")가 얻었습니다. "- 병렬 [] "및"-J [] "옵션은 병렬 빌드 레벨을 지정합니다. 그들은 기본 빌드 도구의 해당 옵션에 매핑됩니다.

dkg에서 언급 한 것처럼 환경 변수 CMAKE_BUILD_PARALLEL_LEVEL를 설정할 수도 있습니다.

cmake의 문서에 대한 링크 :

다른 팁

CMake v2.8.8 이상이면 다음을 사용할 수 있습니다. 닌자 대안으로 암소 비슷한 일종의 영양 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

보시다시피 사용할 필요가 없습니다. CMAKE_MAKE_PROGRAM, 빌드는 기본적으로 병렬로 실행되어 사용 가능한 CPU 코어에 따라 작업 수를 최적화합니다.

Ninja는 시작 단계의 속도를 높이기 위해 낮은 수준의 JSON 구성을 기반으로 합니다.따라서 JSON 구성은 직접 작성하기가 쉽지 않으며 항상 고급 도구/IDE를 사용하여 생성합니다.

C++ 빌드에는 많은 메모리가 필요한 경우가 많으므로 컴퓨터는 CPU 코어 수만큼 많은 메모리를 제공해야 합니다.

가 지적한 바와 같이 루슬란, CMake 3.12 (2018)에는 새로운 옵션 cmake --build -j <N> 빌드를 제한하려면 <N> 코어(작업)를 사용하여 메모리 소비를 제한합니다(또한 선적 서류 비치).이전 CMake 버전을 사용하는 경우에도 계속 사용할 수 있습니다. cmake --build -- -j <N>.옵션 -- 나머지는 기본 빌더 도구에 직접 전달하도록 CMake에 지시합니다. 여기서는 Ninja입니다.

이 교차 플랫폼을 수행 할 수 없습니다.-jn 옵션은 생성 된 makefile의 일부가 아닌 make를 만들 수있는 매개 변수입니다.그러나 cmake는 -jn을 사용하여 프로젝트를 실행하는 Bash 스크립트를 생성 할 수 있습니다. (스크립트가있는 코어 수를 찾는 곳)

parallelmake.sh 기반 발전기에 대해 Unix Makefiles 스크립트를 작성하기 위해 해결되었습니다.이것은 다음과 같습니다. 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()
# ========================================================================================================================================
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top