Tenho um arquivo CMakeLists.txt de nível superior que inclui 2 subdiretórios. Ele é compilado corretamente, desde que -j ou --parallel não estejam na linha de comando do cmake. O arquivo CMakeLists.txt documenta o problema. Além de documentar o problema, há uma maneira de evitar compilações paralelas no arquivo CMakeLists.txt?
cmake_minimum_required(VERSION 3.25)
# Do not attempt to build in parallel using either --parallel or -j
# There can be a race codition between generating the performance test
# header file and building the tests.
project(TestDictionary LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_subdirectory(src/PerformanceTestGenerator)
add_subdirectory(src/tests)
cmake_minimum_required(VERSION 3.25)
project(createPerformanceTest LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(createPerformanceTest main.cpp PerformanceTestGenerator.cpp TestParameters.cpp)
target_compile_features(createPerformanceTest PUBLIC cxx_std_23)
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
# warning level 4 and all warnings as errors
target_compile_options(createPerformanceTest PRIVATE /W3 /WX -D_CRT_SECURE_NO_WARNINGS)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# require at least gcc 12 to get full C++20 support
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12)
message(FATAL_ERROR "GCC version must be at least 12!")
endif()
endif()
# lots of warnings and all warnings as errors
target_compile_options(createPerformanceTest PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/performanceTest.h
COMMAND createPerformanceTest --output-file ${CMAKE_CURRENT_SOURCE_DIR}/performanceTest.h --test-count 3 --radix-16 --test-size 10 --test-size 20 --test-size ff --both-tests
COMMENT "Generating performanceTest.h header file"
VERBATIM
)
add_custom_target(
GeneratedHeader ALL
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/performanceTest.h
)
cmake_minimum_required(VERSION 3.25)
project(testTest LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(testTest testtest.cpp FunctionalityTests.cpp TestGenericDictionary.cpp)
target_include_directories(testTest
PUBLIC ../..
PRIVATE ./ ../PerformanceTestGenerator
)
target_compile_features(testTest PUBLIC cxx_std_23)
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
# warning level 4 and all warnings as errors
target_compile_options(testTest PRIVATE /W4 /WX -D_CRT_SECURE_NO_WARNINGS)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# require at least gcc 12 to get full C++20 support
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12)
message(FATAL_ERROR "GCC version must be at least 12!")
endif()
endif()
# lots of warnings and all warnings as errors
target_compile_options(testTest PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
Não, você não pode impedir a construção em paralelo. O CMake criará arquivos de construção como os arquivos Makefile ou Ninja. Essas ferramentas decidem como construir os alvos. Você pode dizer ao make e ao ninja para usar um único thread. Não há uma maneira genérica.
Se preferir
cmake --build
chamar a ferramenta de compilação nativa, você pode definirCMAKE_BUILD_PARALLEL_LEVEL
como 1. Ainda assim, isso precisa ser definido e não pode ser definido durante o tempo de configuração.