Skip to content

Commit 2e7f3f4

Browse files
authored
Deduplicate CMake arguments passed through ExternalProject_Add (#819)
1 parent 9d024dc commit 2e7f3f4

6 files changed

Lines changed: 109 additions & 137 deletions

File tree

cmake/benchmark.cmake

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,20 @@
11
include_guard()
22

3-
include(ExternalProject)
4-
5-
ExternalProject_Add(
3+
ppc_external_project_add(
64
ppc_benchmark
7-
SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/benchmark"
8-
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark"
9-
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/build"
10-
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/install"
11-
EXCLUDE_FROM_ALL TRUE
12-
CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
13-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
14-
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
15-
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
16-
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
17-
-DCMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED}
18-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
19-
${PPC_EXTERNAL_PROJECT_CMAKE_ARGS}
20-
-DCMAKE_C_FLAGS=-w
21-
-DCMAKE_CXX_FLAGS=-w
22-
-DBENCHMARK_ENABLE_TESTING=OFF
23-
-DBENCHMARK_ENABLE_GTEST_TESTS=OFF
24-
-DBENCHMARK_ENABLE_WERROR=OFF
25-
-DBENCHMARK_ENABLE_INSTALL=ON
26-
-DBENCHMARK_ENABLE_LIBPFM=OFF
27-
BUILD_COMMAND
28-
"${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/build"
29-
--config $<CONFIG> --parallel
30-
INSTALL_COMMAND
31-
"${CMAKE_COMMAND}" --install
32-
"${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/build" --config $<CONFIG>
33-
--prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/install"
34-
${PPC_EXTERNAL_PROJECT_LOG_ARGS})
5+
USE_PROJECT_CXX_STANDARD
6+
SOURCE_DIR
7+
"${CMAKE_SOURCE_DIR}/3rdparty/benchmark"
8+
EXCLUDE_FROM_ALL
9+
TRUE
10+
CMAKE_ARGS
11+
-DCMAKE_C_FLAGS=-w
12+
-DCMAKE_CXX_FLAGS=-w
13+
-DBENCHMARK_ENABLE_TESTING=OFF
14+
-DBENCHMARK_ENABLE_GTEST_TESTS=OFF
15+
-DBENCHMARK_ENABLE_WERROR=OFF
16+
-DBENCHMARK_ENABLE_INSTALL=ON
17+
-DBENCHMARK_ENABLE_LIBPFM=OFF)
3518

3619
function(ppc_include_benchmark target_name)
3720
target_include_directories(

cmake/configure.cmake

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,16 @@ option(PPC_EXTERNAL_PROJECTS_VERBOSE
4646
"Show full configure/build/install logs for ExternalProject dependencies"
4747
OFF)
4848

49+
set(PPC_EXTERNAL_PROJECT_CMAKE_ARGS
50+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
51+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
52+
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
53+
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
54+
-DCMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED}
55+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})
56+
4957
if(PPC_EXTERNAL_PROJECTS_VERBOSE)
5058
set(PPC_EXTERNAL_PROJECT_LOG_ARGS "")
51-
set(PPC_EXTERNAL_PROJECT_CMAKE_ARGS "")
5259
else()
5360
set(PPC_EXTERNAL_PROJECT_LOG_ARGS
5461
LOG_CONFIGURE
@@ -59,9 +66,64 @@ else()
5966
ON
6067
LOG_OUTPUT_ON_FAILURE
6168
ON)
62-
set(PPC_EXTERNAL_PROJECT_CMAKE_ARGS -DCMAKE_INSTALL_MESSAGE=NEVER)
69+
list(APPEND PPC_EXTERNAL_PROJECT_CMAKE_ARGS -DCMAKE_INSTALL_MESSAGE=NEVER)
6370
endif()
6471

72+
include(ExternalProject)
73+
74+
function(ppc_external_project_add target_name)
75+
cmake_parse_arguments(PARSE_ARGV 1 arg "USE_PROJECT_CXX_STANDARD"
76+
"EXCLUDE_FROM_ALL;SOURCE_DIR" "CMAKE_ARGS;TEST_COMMAND")
77+
78+
if(NOT arg_SOURCE_DIR)
79+
message(FATAL_ERROR "ppc_external_project_add requires SOURCE_DIR")
80+
endif()
81+
82+
set(project_dir "${CMAKE_CURRENT_BINARY_DIR}/${target_name}")
83+
set(build_dir "${project_dir}/build")
84+
set(install_dir "${project_dir}/install")
85+
86+
if(DEFINED arg_EXCLUDE_FROM_ALL)
87+
set(exclude_from_all_args EXCLUDE_FROM_ALL "${arg_EXCLUDE_FROM_ALL}")
88+
else()
89+
set(exclude_from_all_args "")
90+
endif()
91+
92+
if(arg_TEST_COMMAND)
93+
set(test_command_args TEST_COMMAND ${arg_TEST_COMMAND})
94+
else()
95+
set(test_command_args "")
96+
endif()
97+
98+
if(arg_USE_PROJECT_CXX_STANDARD)
99+
set(cxx_standard_args -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD})
100+
else()
101+
set(cxx_standard_args "")
102+
endif()
103+
104+
set(build_command_args BUILD_COMMAND "${CMAKE_COMMAND}" --build
105+
"${build_dir}" --config $<CONFIG> --parallel)
106+
set(install_command_args
107+
INSTALL_COMMAND "${CMAKE_COMMAND}" --install "${build_dir}" --config
108+
$<CONFIG> --prefix "${install_dir}")
109+
110+
ExternalProject_Add(
111+
${target_name}
112+
SOURCE_DIR "${arg_SOURCE_DIR}"
113+
PREFIX "${project_dir}"
114+
BINARY_DIR "${build_dir}"
115+
INSTALL_DIR "${install_dir}"
116+
${exclude_from_all_args}
117+
CMAKE_ARGS ${PPC_EXTERNAL_PROJECT_CMAKE_ARGS}
118+
${cxx_standard_args}
119+
${arg_CMAKE_ARGS}
120+
${build_command_args}
121+
${install_command_args}
122+
${test_command_args}
123+
${PPC_EXTERNAL_PROJECT_LOG_ARGS}
124+
${arg_UNPARSED_ARGUMENTS})
125+
endfunction()
126+
65127
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
66128
set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}/ppc_onetbb/install/lib")
67129

cmake/gtest.cmake

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,21 @@
11
include_guard()
22

3-
include(ExternalProject)
3+
if(MSVC)
4+
set(ppc_googletest_MSVC_ARGS -Dgtest_force_shared_crt=ON)
5+
else()
6+
set(ppc_googletest_MSVC_ARGS "")
7+
endif()
48

5-
ExternalProject_Add(
9+
ppc_external_project_add(
610
ppc_googletest
7-
SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/googletest"
8-
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest"
9-
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build"
10-
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/install"
11-
CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
12-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
13-
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
14-
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
15-
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
16-
-DCMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED}
17-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
18-
${PPC_EXTERNAL_PROJECT_CMAKE_ARGS}
19-
-DCMAKE_C_FLAGS=-w
20-
-DCMAKE_CXX_FLAGS=-w
21-
-DBUILD_GMOCK=OFF
22-
$<$<BOOL:MSVC>:-Dgtest_force_shared_crt=ON>
23-
BUILD_COMMAND
24-
"${CMAKE_COMMAND}" --build
25-
"${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --config $<CONFIG>
26-
--parallel
27-
INSTALL_COMMAND
28-
"${CMAKE_COMMAND}" --install
29-
"${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/build" --config $<CONFIG>
30-
--prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_googletest/install"
31-
${PPC_EXTERNAL_PROJECT_LOG_ARGS})
11+
USE_PROJECT_CXX_STANDARD
12+
SOURCE_DIR
13+
"${CMAKE_SOURCE_DIR}/3rdparty/googletest"
14+
CMAKE_ARGS
15+
-DCMAKE_C_FLAGS=-w
16+
-DCMAKE_CXX_FLAGS=-w
17+
-DBUILD_GMOCK=OFF
18+
${ppc_googletest_MSVC_ARGS})
3219

3320
function(ppc_link_gtest exec_func_lib)
3421
# Add external project include directories

cmake/json.cmake

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,8 @@
11
include_guard()
22

3-
include(ExternalProject)
4-
5-
ExternalProject_Add(
6-
ppc_json
7-
SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/json"
8-
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ppc_json"
9-
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/build"
10-
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/install"
11-
CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
12-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
13-
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
14-
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
15-
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
16-
-DCMAKE_CXX_STANDARD_REQUIRED=ON
17-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
18-
${PPC_EXTERNAL_PROJECT_CMAKE_ARGS}
19-
-DJSON_BuildTests=OFF
20-
BUILD_COMMAND
21-
"${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/build"
22-
--config $<CONFIG> --parallel
23-
INSTALL_COMMAND
24-
"${CMAKE_COMMAND}" --install "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/build"
25-
--config $<CONFIG> --prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_json/install"
26-
${PPC_EXTERNAL_PROJECT_LOG_ARGS})
3+
ppc_external_project_add(
4+
ppc_json USE_PROJECT_CXX_STANDARD SOURCE_DIR
5+
"${CMAKE_SOURCE_DIR}/3rdparty/json" CMAKE_ARGS -DJSON_BuildTests=OFF)
276

287
function(ppc_link_json exec_func_lib)
298
# Add external project include directories

cmake/libenvpp.cmake

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,8 @@
11
include_guard()
22

3-
include(ExternalProject)
4-
ExternalProject_Add(
5-
ppc_libenvpp
6-
SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/libenvpp"
7-
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp"
8-
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/build"
9-
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/install"
10-
CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
11-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
12-
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
13-
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
14-
-DCMAKE_CXX_STANDARD_REQUIRED=ON
15-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
16-
${PPC_EXTERNAL_PROJECT_CMAKE_ARGS}
17-
-DLIBENVPP_TESTS=OFF
18-
-DLIBENVPP_EXAMPLES=OFF
19-
BUILD_COMMAND
20-
"${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/build"
21-
--config $<CONFIG> --parallel
22-
INSTALL_COMMAND
23-
"${CMAKE_COMMAND}" --install
24-
"${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/build" --config $<CONFIG>
25-
--prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_libenvpp/install"
26-
${PPC_EXTERNAL_PROJECT_LOG_ARGS})
3+
ppc_external_project_add(
4+
ppc_libenvpp SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/libenvpp" CMAKE_ARGS
5+
-DLIBENVPP_TESTS=OFF -DLIBENVPP_EXAMPLES=OFF)
276

287
string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower)
298
if(cmake_build_type_lower STREQUAL "debug")

cmake/onetbb.cmake

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,26 @@
11
include_guard()
22

3-
include(ExternalProject)
4-
53
option(ENABLE_SYSTEM_TBB "Use system TBB instead of bundled version" OFF)
64

75
if(NOT ENABLE_SYSTEM_TBB)
86
if(WIN32)
9-
set(ppc_onetbb_TEST_COMMAND
10-
"${CMAKE_COMMAND}" -E copy_directory
7+
set(ppc_onetbb_TEST_COMMAND_ARGS
8+
TEST_COMMAND "${CMAKE_COMMAND}" -E copy_directory
119
"${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/install/bin"
1210
"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
1311
else()
14-
set(ppc_onetbb_TEST_COMMAND "")
12+
set(ppc_onetbb_TEST_COMMAND_ARGS "")
1513
endif()
1614

17-
ExternalProject_Add(
15+
ppc_external_project_add(
1816
ppc_onetbb
19-
SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/onetbb"
20-
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb"
21-
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/build"
22-
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/install"
23-
CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
24-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
25-
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
26-
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
27-
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
28-
-DCMAKE_CXX_STANDARD_REQUIRED=ON
29-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
30-
${PPC_EXTERNAL_PROJECT_CMAKE_ARGS}
31-
-DTBB_STRICT=OFF
32-
-DTBB_TEST=OFF
33-
BUILD_COMMAND
34-
"${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/build"
35-
--config $<CONFIG> --parallel
36-
INSTALL_COMMAND
37-
"${CMAKE_COMMAND}" --install
38-
"${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/build" --config $<CONFIG> --prefix
39-
"${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/install"
40-
${PPC_EXTERNAL_PROJECT_LOG_ARGS}
41-
TEST_COMMAND ${ppc_onetbb_TEST_COMMAND})
17+
USE_PROJECT_CXX_STANDARD
18+
SOURCE_DIR
19+
"${CMAKE_SOURCE_DIR}/3rdparty/onetbb"
20+
CMAKE_ARGS
21+
-DTBB_STRICT=OFF
22+
-DTBB_TEST=OFF
23+
${ppc_onetbb_TEST_COMMAND_ARGS})
4224

4325
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ppc_onetbb/install/"
4426
DESTINATION "${CMAKE_INSTALL_PREFIX}")

0 commit comments

Comments
 (0)