Skip to content

Commit 0085ade

Browse files
authored
Better scoping of variables (#5)
In gt_bindings.cmake the variables were set at include scope, however they might have been unset before the macro is called. Now they are set (and unset) in local scope.
1 parent ed8e04b commit 0085ade

3 files changed

Lines changed: 34 additions & 25 deletions

File tree

cmake/bindings.cmake

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
function(generate_gt_bindings)
2-
set(BINDINGS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/src)
3-
set(BINDINGS_CMAKE_DIR ${PROJECT_SOURCE_DIR}/cmake)
4-
set(BINDINGS_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
2+
set(__C_BINDINGS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/src)
3+
set(__C_BINDINGS_CMAKE_DIR ${PROJECT_SOURCE_DIR}/cmake)
4+
set(__C_BINDINGS_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
55
configure_file(cmake/gt_bindings.cmake.in
66
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/bindings_for_build/gt_bindings.cmake
77
@ONLY)
8-
unset(BINDINGS_SOURCE_DIR)
9-
unset(BINDINGS_CMAKE_DIR)
10-
unset(BINDINGS_INCLUDE_DIR)
8+
unset(__C_BINDINGS_SOURCE_DIR)
9+
unset(__C_BINDINGS_CMAKE_DIR)
10+
unset(__C_BINDINGS_INCLUDE_DIR)
1111
endfunction()
1212

1313
generate_gt_bindings()

cmake/export.cmake

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@ install(
3434
DESTINATION lib/cmake
3535
)
3636

37-
set(BINDINGS_CMAKE_DIR "\${gt_c_bindings_MODULE_PATH}") #TODO refactor the variable names gt_c_bindings_MODULE_PATH, etc.
38-
set(BINDINGS_SOURCE_DIR "\${gt_c_bindings_SOURCES_PATH}")
39-
set(BINDINGS_INCLUDE_DIR "\${gt_c_bindings_INCLUDE_PATH}")
40-
message(STATUS "${BINDINGS_INCLUDE_PATH}")
37+
set(__C_BINDINGS_CMAKE_DIR "\${gt_c_bindings_MODULE_PATH}") #TODO refactor the variable names gt_c_bindings_MODULE_PATH, etc.
38+
set(__C_BINDINGS_SOURCE_DIR "\${gt_c_bindings_SOURCES_PATH}")
39+
set(__C_BINDINGS_INCLUDE_DIR "\${gt_c_bindings_INCLUDE_PATH}")
4140
configure_file(cmake/gt_bindings.cmake.in
4241
${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/build-install/lib/cmake/gt_bindings.cmake
4342
@ONLY)
43+
unset(__C_BINDINGS_CMAKE_DIR)
44+
unset(__C_BINDINGS_SOURCE_DIR)
45+
unset(__C_BINDINGS_INCLUDE_DIR)
4446

4547
set(CMAKE_SOURCES
4648
"${PROJECT_SOURCE_DIR}/cmake/gt_bindings_generate.cmake"

cmake/gt_bindings.cmake.in

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,35 +26,39 @@
2626
# - <library_name>_c the C-bindings with <library_name> linked to it
2727
# - <library_name>_fortran the Fortran-bindings with <library_name> linked to it
2828

29-
3029
option(GT_ENABLE_BINDINGS_GENERATION "If turned off, bindings will not be generated." ON)
3130

32-
set(BINDINGS_SOURCE_DIR @BINDINGS_SOURCE_DIR@)
33-
set(BINDINGS_CMAKE_DIR @BINDINGS_CMAKE_DIR@)
34-
set(BINDINGS_INCLUDE_DIR @BINDINGS_INCLUDE_DIR@)
31+
# variables are unset after use for scoping, they need to be redefined in the macros
32+
set(__C_BINDINGS_SOURCE_DIR @__C_BINDINGS_SOURCE_DIR@)
33+
set(__C_BINDINGS_INCLUDE_DIR @__C_BINDINGS_INCLUDE_DIR@)
3534

36-
add_library(c_bindings_generator ${BINDINGS_SOURCE_DIR}/c_bindings/generator.cpp)
35+
add_library(c_bindings_generator ${__C_BINDINGS_SOURCE_DIR}/c_bindings/generator.cpp)
3736
# PUBLIC to make export.hpp available in the sources passed to add_bindings_library()
38-
target_include_directories(c_bindings_generator PUBLIC ${BINDINGS_INCLUDE_DIR})
37+
target_include_directories(c_bindings_generator PUBLIC ${__C_BINDINGS_INCLUDE_DIR})
3938
target_compile_features(c_bindings_generator PUBLIC cxx_std_11)
4039
target_link_libraries(c_bindings_generator PUBLIC Boost::boost)
4140

42-
add_library(c_bindings_handle ${BINDINGS_SOURCE_DIR}/c_bindings/handle.cpp)
43-
target_include_directories(c_bindings_handle PRIVATE ${BINDINGS_INCLUDE_DIR})
41+
add_library(c_bindings_handle ${__C_BINDINGS_SOURCE_DIR}/c_bindings/handle.cpp)
42+
target_include_directories(c_bindings_handle PRIVATE ${__C_BINDINGS_INCLUDE_DIR})
4443
target_compile_features(c_bindings_handle PRIVATE cxx_std_11)
4544
target_link_libraries(c_bindings_generator PRIVATE Boost::boost) #TODO make an interface target for options
4645

46+
unset(__C_BINDINGS_SOURCE_DIR)
47+
unset(__C_BINDINGS_INCLUDE_DIR)
48+
4749
# gt_enable_bindings_library_fortran()
4850
#
4951
# Create a target to compile the generated Fortran module.
5052
# In the default case, when Fortran is enabled on the call to gt_add_bindings_library(), this target is automatically created.
5153
# In case when the Fortran language was not enabled, we cannot create a library (add_library()) with Fortran files.
5254
# However if the user wants to use the target at a later stage, e.g. in testing (with Fortran enabled), the target can
5355
# be created by a call to gt_enable_bindings_library_fortran().
54-
macro(gt_enable_bindings_library_fortran target_name)
56+
function(gt_enable_bindings_library_fortran target_name)
57+
set(__C_BINDINGS_SOURCE_DIR @__C_BINDINGS_SOURCE_DIR@)
58+
5559
if(CMAKE_Fortran_COMPILER_LOADED)
5660
if(NOT TARGET fortran_bindings_handle)
57-
add_library(fortran_bindings_handle ${BINDINGS_SOURCE_DIR}/c_bindings/array_descriptor.f90 ${BINDINGS_SOURCE_DIR}/c_bindings/handle.f90)
61+
add_library(fortran_bindings_handle ${__C_BINDINGS_SOURCE_DIR}/c_bindings/array_descriptor.f90 ${__C_BINDINGS_SOURCE_DIR}/c_bindings/handle.f90)
5862
target_link_libraries(fortran_bindings_handle PUBLIC c_bindings_handle)
5963
target_include_directories(fortran_bindings_handle PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
6064
endif()
@@ -69,14 +73,17 @@ macro(gt_enable_bindings_library_fortran target_name)
6973
elseif(NOT ${ARGN}) # internal: the second (optional) parameter can be used to surpress this fatal error
7074
message(FATAL_ERROR "Please enable_language(Fortran) to compile the Fortran bindings.")
7175
endif()
72-
endmacro()
76+
endfunction()
7377

74-
macro(gt_add_bindings_library target_name)
78+
function(gt_add_bindings_library target_name)
7579
set(options)
7680
set(one_value_args FORTRAN_OUTPUT_DIR C_OUTPUT_DIR FORTRAN_MODULE_NAME)
7781
set(multi_value_args SOURCES)
7882
cmake_parse_arguments(ARG "${options}" "${one_value_args};" "${multi_value_args}" ${ARGN})
7983

84+
set(__C_BINDINGS_SOURCE_DIR @__C_BINDINGS_SOURCE_DIR@)
85+
set(__C_BINDINGS_CMAKE_DIR @__C_BINDINGS_CMAKE_DIR@)
86+
8087
if(NOT DEFINED ARG_FORTRAN_MODULE_NAME)
8188
set(ARG_FORTRAN_MODULE_NAME ${target_name}) # default value
8289
endif()
@@ -99,7 +106,7 @@ macro(gt_add_bindings_library target_name)
99106
if(GT_ENABLE_BINDINGS_GENERATION)
100107
# generator
101108
add_executable(${target_name}_decl_generator
102-
${BINDINGS_SOURCE_DIR}/c_bindings/generator_main.cpp)
109+
${__C_BINDINGS_SOURCE_DIR}/c_bindings/generator_main.cpp)
103110
set_target_properties(${target_name}_decl_generator PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/decl_generator")
104111
target_link_libraries(${target_name}_decl_generator c_bindings_generator)
105112

@@ -119,7 +126,7 @@ macro(gt_add_bindings_library target_name)
119126
-DBINDINGS_C_DECL_FILENAME=${bindings_c_decl_filename}
120127
-DBINDINGS_FORTRAN_DECL_FILENAME=${bindings_fortran_decl_filename}
121128
-DFORTRAN_MODULE_NAME=${ARG_FORTRAN_MODULE_NAME}
122-
-P ${BINDINGS_CMAKE_DIR}/gt_bindings_generate.cmake
129+
-P ${__C_BINDINGS_CMAKE_DIR}/gt_bindings_generate.cmake
123130
BYPRODUCTS ${bindings_c_decl_filename} ${bindings_fortran_decl_filename}
124131
DEPENDS $<TARGET_FILE:${target_name}_decl_generator>)
125132
else()
@@ -145,4 +152,4 @@ macro(gt_add_bindings_library target_name)
145152
set(GT_${target_name}_fortran_bindings_path ${bindings_fortran_decl_filename}
146153
CACHE INTERNAL "Path to the generated Fortran file for ${target_name}")
147154
gt_enable_bindings_library_fortran(${target_name} TRUE)
148-
endmacro()
155+
endfunction()

0 commit comments

Comments
 (0)