Skip to content

Commit 63dd072

Browse files
authored
Allow project-specific default option values (#84)
2 parents 2f154a8 + b598fbd commit 63dd072

File tree

12 files changed

+267
-0
lines changed

12 files changed

+267
-0
lines changed

cmake/ecbuild_add_option.cmake

+8
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,14 @@ macro( ecbuild_add_option )
153153
# define the option -- for cmake GUI
154154

155155
option( ENABLE_${_p_FEATURE} "${_p_DESCRIPTION}" ${_p_DEFAULT} )
156+
# Important: Creating the option, as above, is not enough in multi-project scenarios,
157+
# as the variable is not set in case it is already available in the cache.
158+
# When the user does not provide an overriding (<project>_)ENABLE_<FEATURE> option,
159+
# we must use the provided default value to set ENABLE_<FEATURE>.
160+
# This is done without changing any cached value, as it is applicable to the current project only.
161+
if ( NOT ${_p_FEATURE}_user_provided_input AND NOT (DEFINED ${PNAME}_ENABLE_${_p_FEATURE}) )
162+
set( ENABLE_${_p_FEATURE} ${_p_DEFAULT} )
163+
endif()
156164

157165
ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): defining option ENABLE_${_p_FEATURE} '${_p_DESCRIPTION}' ${_p_DEFAULT}")
158166
ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): ENABLE_${_p_FEATURE}=${ENABLE_${_p_FEATURE}}")

tests/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
add_subdirectory( bundle_options )
12
add_subdirectory( bundle_subdir )
23
add_subdirectory( bundle_subproj ) # ECBUILD-460
34
add_subdirectory( bundle_override_features ) # ECBUILD-486
45
add_subdirectory( ecbuild_regex_escape )
56
add_subdirectory( ecbuild_remove_fortran_flags ) # ECBUILD-484
67
add_subdirectory( ecbuild_find_package )
78
add_subdirectory( ecbuild_add_option )
9+
add_subdirectory( ecbuild_add_option_multiproject_defaults )
810
add_subdirectory( ecbuild_add_flags )
911
add_subdirectory( find_ecbuild )
1012
add_subdirectory( ecbuild_shared_libs )

tests/bundle_options/CMakeLists.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
ecbuild_add_test(
3+
TARGET test_ecbuild_bundle_options
4+
TYPE SCRIPT
5+
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh
6+
ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
7+
)

tests/bundle_options/clean.sh

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"}
6+
7+
# --------------------- cleanup ------------------------
8+
echo "cleaning $HERE"
9+
rm -rf $HERE/build_*

tests/bundle_options/configure.sh

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
function EXPECT_ONE_OF()
6+
{
7+
local file=$1
8+
local pattern=$2
9+
local found=$(cat ${file} | grep -e "${pattern}" | wc -l | xargs)
10+
11+
if [ "$found" != "1" ]; then
12+
echo "File ${file} does not contain exacly one of '$2'"
13+
exit 1
14+
fi
15+
}
16+
17+
HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"}
18+
SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE}
19+
20+
# Add ecbuild to path
21+
export PATH=$SOURCE/../../bin:$PATH
22+
echo $PATH
23+
echo $SOURCE
24+
25+
# --------------------- cleanup ------------------------
26+
$SOURCE/clean.sh
27+
28+
# ----------------- configure project ---------------------
29+
30+
# (0) Options: (default)
31+
# proja, FEATURE_A is enabled (by default)
32+
# projb, FEATURE_A is disabled (by default)
33+
34+
TC=0
35+
36+
mkdir -p $HERE/build_${TC}
37+
ecbuild $SOURCE/projx -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
38+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(ON): ''.*"
39+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(OFF): ''.*"
40+
EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written"
41+
42+
# (1) Options: -DSOME_PACKAGE_FOUND
43+
# proja, FEATURE_A is enabled (by default)
44+
# projb, FEATURE_A is disabled (by default), event if the conditional package is found
45+
46+
TC=1
47+
48+
mkdir -p $HERE/build_${TC}
49+
ecbuild $SOURCE/projx -DSOME_PACKAGE_FOUND=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
50+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(ON): ''.*"
51+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(OFF): ''.*"
52+
EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written"
53+
54+
# (2) Options: -DENABLE_FEATURE_A=ON
55+
# proja, FEATURE_A is explicitly enabled (by global option)
56+
# projb, FEATURE_A is explicitly enabled (by global option), but fails since the conditional package is not found
57+
58+
TC=2
59+
60+
mkdir -p $HERE/build_${TC}
61+
ecbuild $SOURCE/projx -DENABLE_FEATURE_A=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
62+
EXPECT_ONE_OF $HERE/build_${TC}.log " Configuring incomplete, errors occurred"
63+
64+
# (3) Options: -DENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON
65+
# proja, FEATURE_A is explicitly enabled (by global option)
66+
# projb, FEATURE_A is explicitly enabled (by global option), and succeeds because the conditional package is found
67+
68+
TC=3
69+
70+
mkdir -p $HERE/build_${TC}
71+
ecbuild $SOURCE/projx -DENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
72+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(ON): ''.*"
73+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(ON): ''.*"
74+
EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written"
75+
76+
# (4) Options: -DENABLE_FEATURE_A=OFF
77+
# proja, FEATURE_A is explicitly disabled (by global option)
78+
# projb, FEATURE_A is explicitly disabled (by global option)
79+
80+
TC=4
81+
82+
mkdir -p $HERE/build_${TC}
83+
ecbuild $SOURCE/projx -DENABLE_FEATURE_A=OFF -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
84+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(OFF): ''.*"
85+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(OFF): ''.*"
86+
EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written"
87+
88+
# (5) Options: -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON
89+
# proja, FEATURE_A is explicitly disabled (by global option)
90+
# projb, FEATURE_A is explicitly enabled (by project-specific option), but fails since the conditional package is not found
91+
92+
TC=5
93+
94+
mkdir -p $HERE/build_${TC}
95+
ecbuild $SOURCE/projx -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
96+
EXPECT_ONE_OF $HERE/build_${TC}.log " Configuring incomplete, errors occurred"
97+
98+
# (6) Options: -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON
99+
# proja, FEATURE_A is explicitly disabled (by global option)
100+
# projb, FEATURE_A is explicitly enabled (by project-specific option), possible because the conditional package is found
101+
102+
TC=6
103+
104+
mkdir -p $HERE/build_${TC}
105+
ecbuild $SOURCE/projx -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
106+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(OFF): ''.*"
107+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(ON): ''.*"
108+
EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written"
109+
110+
# (7) Options: -DENABLE_FEATURE_A=ON -DPROJA_ENABLE_FEATURE_A=OFF
111+
# proja, FEATURE_A is explicitly disabled (by project-specific option)
112+
# projb, FEATURE_A is explicitly enabled (by global option), but fails since the conditional package is not found
113+
114+
TC=7
115+
116+
mkdir -p $HERE/build_${TC}
117+
ecbuild $SOURCE/projx -DENABLE_FEATURE_A=ON -DPROJA_ENABLE_FEATURE_A=OFF -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
118+
EXPECT_ONE_OF $HERE/build_${TC}.log " Configuring incomplete, errors occurred"
119+
120+
# (8) Options: -DENABLE_FEATURE_A=ON -DPROJB_ENABLE_FEATURE_A=OFF -DSOME_PACKAGE_FOUND=ON
121+
# proja, FEATURE_A is explicitly enabled (by global option)
122+
# projb, FEATURE_A is explicitly disabled (by project-specific option), event if the conditional package is found
123+
124+
TC=8
125+
126+
mkdir -p $HERE/build_${TC}
127+
ecbuild $SOURCE/projx -DENABLE_FEATURE_A=ON -DPROJB_ENABLE_FEATURE_A=OFF -DSOME_PACKAGE_FOUND=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log
128+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(ON): ''.*"
129+
EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(OFF): ''.*"
130+
EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
cmake_minimum_required( VERSION 3.18.4 FATAL_ERROR )
2+
find_package( ecbuild 3.4 REQUIRED )
3+
4+
project( projx LANGUAGES NONE VERSION 0.1 )
5+
6+
add_subdirectory( proja )
7+
add_subdirectory( projb )
8+
9+
ecbuild_print_summary()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
find_package( ecbuild 3.4 REQUIRED )
3+
4+
project( proja LANGUAGES NONE VERSION 0.1 )
5+
ecbuild_add_option(
6+
FEATURE FEATURE_A
7+
DEFAULT ON
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
find_package( ecbuild 3.4 REQUIRED )
3+
4+
project( projb LANGUAGES NONE VERSION 0.2 )
5+
ecbuild_add_option(
6+
FEATURE FEATURE_A
7+
DEFAULT OFF
8+
CONDITION SOME_PACKAGE_FOUND
9+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
ecbuild_add_test(
3+
TARGET test_ecbuild_add_option_multiproject_defaults
4+
TYPE SCRIPT
5+
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh
6+
ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
7+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"}
6+
7+
# --------------------- cleanup ------------------------
8+
echo "cleaning $HERE"
9+
rm -rf $HERE/build_*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
function EXPECT_ONE_OF()
6+
{
7+
local file=$1
8+
local pattern=$2
9+
local found=$(cat ${file} | grep "${pattern}" | wc -l | xargs)
10+
11+
if [ "$found" != "1" ]; then
12+
echo "File ${file} does not contain exacly one of '$2'"
13+
exit 1
14+
fi
15+
}
16+
17+
HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"}
18+
SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE}
19+
20+
# Add ecbuild to path
21+
export PATH=$SOURCE/../../bin:$PATH
22+
echo $PATH
23+
echo $SOURCE
24+
25+
# --------------------- cleanup ------------------------
26+
$SOURCE/clean.sh
27+
28+
# ----------------- configure project ---------------------
29+
30+
# Options: (default)
31+
32+
mkdir -p $HERE/build_1
33+
ecbuild $SOURCE/test_project -B $HERE/build_1 | tee $HERE/build_1.log
34+
EXPECT_ONE_OF $HERE/build_1.log "FEATURE_A, proja(ON): '', projb(OFF): '', projc(OFF): ''"
35+
36+
# Options: -DENABLE_FEATURE_A=ON (fails because of projc depends on nonexisting package)
37+
38+
mkdir -p $HERE/build_2
39+
ecbuild -DENABLE_FEATURE_A=ON $SOURCE/test_project -B $HERE/build_2 | tee $HERE/build_2.log
40+
EXPECT_ONE_OF $HERE/build_2.log "Configuring incomplete, errors occurred!"
41+
42+
# Options: -DPROJB_ENABLE_FEATURE_A=ON
43+
44+
mkdir -p $HERE/build_3
45+
ecbuild -DPROJB_ENABLE_FEATURE_A=ON $SOURCE/test_project -B $HERE/build_3 | tee $HERE/build_3.log
46+
EXPECT_ONE_OF $HERE/build_3.log "FEATURE_A, proja(ON): '', projb(ON): '', projc(OFF): ''"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
cmake_minimum_required( VERSION 3.18.4 FATAL_ERROR )
2+
find_package( ecbuild 3.4 REQUIRED )
3+
4+
project( proja LANGUAGES NONE VERSION 0.2 )
5+
ecbuild_add_option(
6+
FEATURE FEATURE_A
7+
DEFAULT ON
8+
)
9+
10+
project( projb LANGUAGES NONE VERSION 0.1 )
11+
ecbuild_add_option(
12+
FEATURE FEATURE_A
13+
DEFAULT OFF
14+
)
15+
16+
project( projc LANGUAGES NONE VERSION 0.3 )
17+
ecbuild_add_option(
18+
FEATURE FEATURE_A
19+
DEFAULT ON
20+
REQUIRED_PACKAGES nonexistent
21+
)
22+
23+
ecbuild_print_summary()

0 commit comments

Comments
 (0)