Skip to content

Commit 3291da2

Browse files
committed
Simplifying the number of targets that CMake Tracks for Code Generators. We used to break these down per file to avoid recompiles, but in pratice it doesn't help reduce rebuilds and it slows down processing
1 parent 13623b3 commit 3291da2

File tree

6 files changed

+85
-63
lines changed

6 files changed

+85
-63
lines changed

cmake/common/FindCodeSynthesis.cmake

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ option (XSD_USE_SHORT_TARGET_NAMES "Reduces the name of targets to a minimum" OF
3131
# list_directory
3232
#
3333
# Utility function returns a list of all children in a directory for iteration
34+
3435
function(list_directory _result _curdir)
3536
cmake_parse_arguments( ""
3637
"DEBUG"
@@ -52,7 +53,8 @@ function(list_directory _result _curdir)
5253
endforeach()
5354
set(${_result} ${_list} PARENT_SCOPE)
5455
endfunction()
55-
#######################################################################################################################
56+
57+
#dd######################################################################################################################
5658

5759
# Register All files ending XSD in a directory and its subdirectories
5860
#
@@ -81,21 +83,31 @@ endfunction()
8183
# -- TARGETS
8284
# Variable where generated targets will be stored for used in setting target_dependecies
8385
# Defaults to _REGISTER_XSD_DIR_TARGETS
86+
#
87+
# -- HEADERS_VAR
88+
# Variable which all resulting .hxx files will be stored. DEfaults to _XSD_HEADERS
89+
#
90+
# -- SOURCES_VAR
91+
# Variable which all resulting .cxx files will be stored. Defaults to _XSD_SOURCES
92+
#
8493
# Multi arguments
8594
#
8695
# -- DEPENDS
8796
# List of targets which the generated targets depend on.
8897
function(REGISTER_XSD_DIR _directory)
8998
cmake_parse_arguments( "_l"
90-
"STAGE;INSTALL"
91-
"WORKING_DIR;PROJECT;COMPONENT;RESOURCE_FOLDER;CONFIG;TARGETS"
99+
"STAGE;INSTALLi;NO_TARGETS"
100+
"WORKING_DIR;PROJECT;COMPONENT;RESOURCE_FOLDER;CONFIG;TARGETS;HEADERS_VAR;SOURCES_VAR"
92101
"DEPENDS"
93102
${ARGN}
94103
)
95104

96105
if (NOT _directory)
97106
set (_directory "${PROJECT_SOURCE_DIR}/share/xsd")
98107
endif()
108+
if(_l_NO_TARGETS)
109+
list(APPEND _flags NO_TARGETS)
110+
endif()
99111
if(_l_STAGE)
100112
list(APPEND _flags STAGE)
101113
endif()
@@ -105,6 +117,12 @@ function(REGISTER_XSD_DIR _directory)
105117
if (NOT _l_TARGETS )
106118
set(_l_TARGETS _REGISTER_XSD_DIR_TARGETS )
107119
endif()
120+
if (NOT _l_HEADERS_VAR)
121+
set(_l_HEADERS_VAR _XSD_HEADERS )
122+
endif()
123+
if (NOT _l_SOURCES_VAR)
124+
set(_l_SOURCES_VAR _XSD_SOURCES )
125+
endif()
108126
if( NOT _l_WORKING_DIR)
109127
set (_l_WORKING_DIR "${_directory}")
110128
endif()
@@ -113,7 +131,6 @@ function(REGISTER_XSD_DIR _directory)
113131
set(_component ${_l_COMPONENT} )
114132
set(_resource_path ${_l_RESOURCE_FOLDER})
115133
set(_working_directory ${_l_WORKING_DIR})
116-
117134
if ( NOT EXISTS "${_directory}" )
118135
message(FATAL_ERROR "REGISTER_XSD_DIR called on non existant directory ${_directory}")
119136
endif()
@@ -123,23 +140,33 @@ function(REGISTER_XSD_DIR _directory)
123140
REGISTER_XSD_DIR( ${_directory}/${_item} CONFIG ${_config_file}
124141
PROJECT ${_project} COMPONENT ${_component}/${_item}
125142
RESOURCE_PATH ${_resource_path}/${_item} ${_flags} TARGETS ${_l_TARGETS} ${_verbose_Flag}
126-
WORKING_DIR ${_working_directory} DEPENDS ${_DEPENDS} )
143+
WORKING_DIR ${_working_directory}
144+
HEADERS_VAR ${_l_HEADERS_VAR}
145+
SOURCES_VAR ${_l_SOURCES_VAR}
146+
DEPENDS ${_DEPENDS}
147+
)
127148
elseif( _item MATCHES ".*\\.xsd")
128149
REGISTER_XSD_FILE( ${_directory}/${_item} CONFIG ${_config_file}
129150
PROJECT ${_project} COMPONENT ${_component}/
130151
RESOURCE_PATH ${_resource_path}/ ${_flags} TARGETS ${_l_TARGETS}
131-
WORKING_DIR ${_working_directory} DEPENDS ${_DEPENDS} )
152+
WORKING_DIR ${_working_directory}
153+
HEADERS_VAR ${_l_HEADERS_VAR}
154+
SOURCES_VAR ${_l_SOURCES_VAR}
155+
DEPENDS ${_DEPENDS}
156+
)
132157
endif()
133158
endforeach()
134159
set(${_l_TARGETS} ${${_l_TARGETS}} PARENT_SCOPE)
160+
set(${_l_HEADERS_VAR} ${${_l_HEADERS_VAR}} PARENT_SCOPE)
161+
set(${_l_SOURCES_VAR} ${${_l_SOURCES_VAR}} PARENT_SCOPE)
135162
endfunction(REGISTER_XSD_DIR)
136163
#######################################################################################################################
137164
#REGISTER_XSD_FILE
138165
#######################################################################################################################
139166
function(REGISTER_XSD_FILE _filepath )
140167
cmake_parse_arguments( "_l"
141-
"STAGE;INSTALL"
142-
"WORKING_DIR;PROJECT;COMPONENT;RESOURCE_FOLDER;CONFIG;TARGETS"
168+
"STAGE;INSTALL;NO_TARGETS"
169+
"WORKING_DIR;PROJECT;COMPONENT;RESOURCE_FOLDER;CONFIG;TARGETS;HEADERS_VAR;SOURCES_VAR"
143170
"DEPENDS"
144171
${ARGN}
145172
)
@@ -184,12 +211,13 @@ function(REGISTER_XSD_FILE _filepath )
184211

185212
string(REPLACE "//" "/" _safe_unique_name ${_component}/${_schema} )
186213
string(MAKE_C_IDENTIFIER ${_component}/${_schema} _safe_unique_name)
214+
187215
if(XSD_USE_SHORT_TARGET_NAMES)
188-
set ( _gen_target_name "xsd_${_schema}")
189-
set ( _mv_target_name "xsd_mv_${_schema}")
216+
set ( _gen_target_name "xsd_${_schema}")
217+
set ( _mv_target_name "xsd_mv_${_schema}")
190218
else ()
191-
set ( _gen_target_name "xsd_gen${_safe_unique_name}")
192-
set ( _mv_target_name "${_mv_target_name}")
219+
set ( _gen_target_name "xsd_gen${_safe_unique_name}")
220+
set ( _mv_target_name "${_mv_target_name}")
193221
endif()
194222

195223
add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_project}/${_component}/${_schema}.hxx ${CMAKE_CURRENT_BINARY_DIR}/${_project}/${_component}/${_schema}.cxx ${_l_OUTPUTS}
@@ -199,32 +227,37 @@ function(REGISTER_XSD_FILE _filepath )
199227
DEPENDS ${CodeSynthesis_EXECUTABLE} ${_config_file}
200228
DEPENDS ${_l_DEPENDS}
201229
COMMENT "Generating source code from XML ${_filepath}" )
202-
203-
add_custom_target( ${_gen_target_name} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_project}/${_component}/${_schema}.hxx ${CMAKE_CURRENT_BINARY_DIR}/${_project}/${_component}/${_schema}.cxx
204-
COMMENT "Checking if re-generation is required" )
205-
206-
get_filename_component(SOLUTION_FOLDER "${_component}${_schema}" DIRECTORY )
207-
208-
set_target_properties(${_gen_target_name}
230+
list(APPEND ${_l_HEADERS_VAR} ${CMAKE_CURRENT_BINARY_DIR}/${_project}/${_component}/${_schema}.hxx )
231+
list(APPEND ${_l_SOURCES_VAR} ${CMAKE_CURRENT_BINARY_DIR}/${_project}/${_component}/${_schema}.cxx )
232+
get_filename_component(SOLUTION_FOLDER "${_component}${_schema}" DIRECTORY )
233+
if( NOT _l_NO_TARGETS )
234+
add_custom_target( ${_gen_target_name}
235+
COMMENT "Checking if re-generation is required"
236+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_project}/${_component}/${_schema}.hxx ${CMAKE_CURRENT_BINARY_DIR}/${_project}/${_component}/${_schema}.cxx)
237+
set_target_properties(${_gen_target_name}
209238
PROPERTIES
210239
FOLDER "Code Generators/${SOLUTION_FOLDER}")
240+
list(APPEND ${_l_TARGETS} ${_gen_target_name})
241+
endif()
211242

212-
list(APPEND ${_l_TARGETS} ${_gen_target_name})
213-
if(_l_STAGE)
214-
add_custom_target( ${_mv_target_name} DEPENDS ${CMAKE_BINARY_DIR}/${_resource_path}/${_schema}.xsd
215-
COMMENT "Checking if re-generation is required" )
216243

244+
if(_l_STAGE)
217245
add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_schema}.xsd
218246
WORKING_DIRECTORY ${_l_WORKING_DIR}
219247
COMMAND ${CMAKE_COMMAND} -E copy ${_filepath} ${CMAKE_BINARY_DIR}/${_resource_path}/
220248
DEPENDS ${_filepath}
221249
DEPENDS ${_config_file}
222250
COMMENT "Staging XSD Template for runtime" )
223-
224-
set_target_properties(${_mv_target_name}
251+
if (NOT _l_NO_TARGETS )
252+
add_custom_target( ${_mv_target_name}
253+
DEPENDS ${CMAKE_BINARY_DIR}/${_resource_path}/${_schema}.xsd
254+
COMMENT "Checking if re-generation is required"
255+
)
256+
set_target_properties(${_mv_target_name}
225257
PROPERTIES
226258
FOLDER "Code Generators")
227-
list(APPEND ${_l_TARGETS} ${_gen_target_name})
259+
list(APPEND ${_l_TARGETS} ${_gen_target_name})
260+
endif()
228261
endif()
229262

230263
if(_l_INSTALL)
@@ -234,6 +267,8 @@ get_filename_component(SOLUTION_FOLDER "${_component}${_schema}" DIRECTORY )
234267
)
235268
endif()
236269
set(${_l_TARGETS} ${${_l_TARGETS}} PARENT_SCOPE)
270+
set(${_l_HEADERS_VAR} ${${_l_HEADERS_VAR}} PARENT_SCOPE)
271+
set(${_l_SOURCES_VAR} ${${_l_SOURCES_VAR}} PARENT_SCOPE)
237272
endfunction(REGISTER_XSD_FILE)
238273

239274
#################################################################################################################

projects/biogears/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,13 @@ set (BIOGEARS_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
5353
REGISTER_XSD_DIR( "${PROJECT_SOURCE_DIR}/share/xsd/"
5454
CONFIG "${PROJECT_SOURCE_DIR}/share/xsd/BioGearsDataModel.cfg"
5555
PROJECT "generated/biogears" COMPONENT "schema" RESOURCE_FOLDER "resources/schema"
56-
TARGETS XSD_TARGETS VERBOSITY 1)
56+
NO_TARGETS SOURCES_VAR XSD_SRCS HEADERS_VAR XSD_HDRS VERBOSITY 1)
5757

58+
add_custom_target(xsd_bindings
59+
COMMENT "Generates XML Bindings from XSD Files"
60+
DEPENDS ${XSD_SRCS} ${XSD_HDRS}
61+
)
62+
set_target_properties(xsd_bindings PROPERTIES Folder "Code Generators")
5863
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/libBiogears/src/version.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/libBiogears/src/version.cpp NEWLINE_STYLE LF)
5964
###############################################################################
6065
#Sorce and Header Defines

projects/biogears/libBiogears/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ if(${PREFIX}_BUILD_STATIC)
8787
if(ANDROID)
8888
target_link_libraries(lib${PUBLIC_NAME} PUBLIC android log)
8989
endif()
90-
add_dependencies(lib${PROJECT_NAME} ${XSD_TARGETS} prepare_runtime_dir)
90+
add_dependencies(lib${PROJECT_NAME} xsd_bindings prepare_runtime_dir)
9191

9292
else()
9393
###############################################################################

projects/biogears/libCDM/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ set(LIB${PREFIX}_CDM_SOURCES ${CDM_PUBLIC_SRCS} ${CDM_GEN_SRCS})
3333
CXX_STANDARD 14
3434
)
3535
set_target_properties(lib${PROJECT_NAME}_cdm PROPERTIES SOVERSION "${${ROOT_PROJECT_NAME}_LIB_VERSION}")
36-
add_dependencies(lib${PROJECT_NAME}_cdm ${XSD_TARGETS})
36+
add_dependencies(lib${PROJECT_NAME}_cdm xsd_bindings)
3737

3838
###############################################################################
3939
# libBiogears_cdm COMPILATION & LINKAGE MODIFICATIONS

projects/biogears/libIO/CMakeLists.txt

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ option(Biogears_IO_USE_SHORT_TARGET_NAMES "Reduce the size of target names to ac
66
###############################################################################
77
#Source files
88
###############################################################################
9-
function(generate_hex_header)
9+
function(generate_hex_header GENERATED_HDRS GENERATED_SRCS)
1010
set(options SHORT_NAMES)
11-
set(oneValueArgs INPUT OUTPUT PREFIX FOLDER PATH)
11+
set(oneValueArgs INPUT OUTPUT PREFIX PATH)
1212
set(multiValueArgs NAMESPACE)
1313

1414
cmake_parse_arguments("" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
@@ -21,45 +21,23 @@ function(generate_hex_header)
2121
set(_header ${_OUTPUT}.hxx)
2222
set(_source ${_OUTPUT}.cxx)
2323

24-
2524
if (_INPUT AND _OUTPUT)
26-
2725
get_filename_component( content_name ${_INPUT} NAME_WE)
2826
string (REPLACE "@" "_at_" content_name "${content_name}")
2927
string(MAKE_C_IDENTIFIER "${content_name}" _c_safe_content_name)
3028
get_filename_component(_source_name ${_OUTPUT} NAME)
3129
get_filename_component(_source_directory ${_OUTPUT} DIRECTORY )
3230

33-
if(NOT CMAKE_GENERATOR STREQUAL "Unix Makefiles")
34-
if( NOT EXISTS ${_header} OR NOT EXISTS ${_source} )
35-
36-
message(STATUS " ${_source_name}.{hxx,cxx}")
37-
file(WRITE ${_header} "//! THIS IS PLACEHOLDER DATA THAT WILL BE REPLACED BY THE FIRST RUN OF TARGET generate_${content_name}")
38-
file(WRITE ${_source} "//! THIS IS PLACEHOLDER DATA THAT WILL BE REPLACED BY THE FIRST RUN OF TARGET generate_${content_name}")
39-
endif()
40-
endif()
31+
if( NOT EXISTS ${_header} OR NOT EXISTS ${_source} )
32+
message(STATUS " ${_source_name}.{hxx,cxx}")
33+
endif()
4134

4235
add_custom_command(
4336
OUTPUT "${_OUTPUT}.hxx" "${_OUTPUT}.cxx"
4437
DEPENDS ${_INPUT} ${PROJECT_SOURCE_DIR}/cmake/common/c_encode_file.cmake
4538
COMMAND ${CMAKE_COMMAND} -DIN="${_INPUT}" -DOUT="${_OUTPUT}" -DNS="${_NS_SAFE}" -DPATH="${_PATH}" -P "${PROJECT_SOURCE_DIR}/cmake/common/c_encode_file.cmake"
4639
)
4740

48-
if(_SHORT_NAMES)
49-
add_custom_target( C_${_c_safe_content_name}
50-
DEPENDS "${_OUTPUT}.hxx" "${_OUTPUT}.cxx"
51-
)
52-
set_target_properties(C_${_c_safe_content_name} PROPERTIES
53-
FOLDER ${_FOLDER}
54-
)
55-
else ()
56-
add_custom_target( generate_${_c_safe_prefix}_${_c_safe_content_name}
57-
DEPENDS "${_OUTPUT}.hxx" "${_OUTPUT}.cxx"
58-
)
59-
set_target_properties(generate_${_c_safe_prefix}_${_c_safe_content_name} PROPERTIES
60-
FOLDER ${_FOLDER}
61-
)
62-
endif()
6341
else()
6442
message(FATAL_ERROR "generate_hex_header requires arguments INPUT <file> and OUTPUT <file> ")
6543
endif()
@@ -89,7 +67,7 @@ function(configure_io_directory_file )
8967
endif()
9068

9169
generate_hex_header( NAMESPACE biogears io INPUT ${_RESOURCE_PATH}/${_true_source} OUTPUT ${BIOGEARS_BINARY_DIR}/generated/${IO_INCLUDE}/biogears/io/${_true_source}
92-
FOLDER "Code Generators/IO/${src_dir}" PATH ${src} PREFIX ${src_dir} ${ADDITIONAL_ARGS})
70+
PATH ${src} PREFIX ${src_dir} ${ADDITIONAL_ARGS})
9371

9472

9573
LIST(APPEND ${_HEADERS} "${BIOGEARS_BINARY_DIR}/generated/${IO_INCLUDE}/biogears/io/${_true_source}.hxx")
@@ -156,7 +134,7 @@ set ( IO_VERSION "${${ROOT_PROJECT_NAME}_LIB_VERSION}")
156134
set ( IO_INCLUDE "c_encoded/${IO_VERSION}")
157135

158136
message(STATUS " Iterating over source files to be encoded as C strings. This is a long operation, but only on the initial pass or when the source file changes.")
159-
message(STATUS " Encoding: runtime/")
137+
message(STATUS " Registering file encoding")
160138

161139
message(STATUS " : xsd/")
162140
FILE(GLOB_RECURSE XSD_FILES RELATIVE "${PROJECT_SOURCE_DIR}/share/xsd" LIST_DIRECTORIES false CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/share/xsd/*.xsd" )
@@ -219,7 +197,14 @@ add_source_files(INTERFACE_HEADERS LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/include/
219197
REGEX "*.h" SOURCE_GROUP "Headers\\Public\\")
220198
add_source_files(INTERFACE_SOURCES LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/
221199
REGEX "*.cpp" SOURCE_GROUP "Sources\\")
222-
200+
##############################################################################
201+
# Generator Target
202+
##############################################################################
203+
add_custom_target( hex_bindings
204+
COMMENT "Generating hex encoding headers"
205+
DEPENDS ${GEN_HDRS} ${GEN_SRCS} )
206+
set_target_properties( hex_bindings PROPERTIES
207+
FOLDER "Code Generators" )
223208

224209
###############################################################################
225210
# libBiogears_io
@@ -237,7 +222,7 @@ set_target_properties(lib${PROJECT_NAME}_io
237222
CXX_STANDARD 14
238223
)
239224
set_target_properties(lib${PROJECT_NAME}_io PROPERTIES SOVERSION "${${ROOT_PROJECT_NAME}_LIB_VERSION}")
240-
add_dependencies(lib${PROJECT_NAME}_io ${XSD_TARGETS})
225+
add_dependencies(lib${PROJECT_NAME}_io hex_bindings xsd_bindings)
241226
target_compile_definitions(lib${PROJECT_NAME}_io PUBLIC BIOGEARS_IO_PRESENT
242227
$<$<BOOL:${Biogears_IO_INCLUDE_STATES}>:BIOGEARS_IO_EMBED_STATES>
243228
$<$<BOOL:${Biogears_IO_INCLUDE_DATA_TEMPLATES}>:BIOGEARS_IO_EMBED_TEMPLATES>

projects/zip/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ option(MZ_BUILD_TEST "Builds minizip test executable" OFF)
2525
option(MZ_BUILD_UNIT_TEST "Builds minizip unit test project" OFF)
2626
option(MZ_BUILD_FUZZ_TEST "Builds minizip fuzzer executables" OFF)
2727

28-
if(POLICY CMP0074)
29-
cmake_policy(SET CMP0074 OLD)
30-
endif()
3128
# ZLIB_ROOT - Parent directory of zlib installation
3229
# BZIP2_ROOT - Parent directory of BZip2 installation
3330
# OPENSSL_ROOT - Parent directory of OpenSSL installation

0 commit comments

Comments
 (0)