Spaces:
Sleeping
Sleeping
# Provide factory names as list of arguments to use for later | |
macro( PangolinRegisterFactory interface_name) | |
list(APPEND PANGO_FACTORY_INTERFACES "${interface_name}") | |
list(REMOVE_DUPLICATES PANGO_FACTORY_INTERFACES) | |
foreach(arg ${ARGN}) | |
list(APPEND PANGO_FACTORY_${interface_name} "${arg}") | |
endforeach() | |
endmacro() | |
# Actually Create the method call file | |
macro(create_factory_registry_file_now filename namespace interface_name) | |
list(APPEND factory_names ${ARGN}) | |
file(WRITE ${filename} "// CMake generated file. Do Not Edit.\n\n#pragma once\n\nnamespace ${namespace} {\n\n") | |
file(APPEND ${filename} " // Forward declarations\n") | |
foreach(factory_name ${factory_names}) | |
# file(APPEND ${filename} " bool Load${factory_name}Success;\n") | |
file(APPEND ${filename} " bool Register${factory_name}Factory();\n") | |
endforeach() | |
file(APPEND ${filename} "\n\n") | |
file(APPEND ${filename} " inline bool RegisterFactories${interface_name}() {\n") | |
file(APPEND ${filename} " bool success = true;\n") | |
foreach(factory_name ${factory_names}) | |
# file(APPEND ${filename} " success &= Load${factory_name}Success;\n") | |
file(APPEND ${filename} " success &= Register${factory_name}Factory();\n") | |
endforeach() | |
file(APPEND ${filename} " return success;\n") | |
file(APPEND ${filename} " }\n") | |
file(APPEND ${filename} "\n\n} // ${namespace}\n") | |
endmacro() | |
# Sets up target for creating the file. | |
macro(create_factory_registry_file directory interface_name) | |
set(filename "${directory}/RegisterFactories${interface_name}.h") | |
add_custom_command( | |
OUTPUT ${filename} | |
DEPENDS ${PROJECT_SOURCE_DIR}/cmake/PangolinFactory.cmake | |
COMMAND | |
${CMAKE_COMMAND} -DFILENAME=${filename} | |
-DNAMESPACE=pangolin | |
-DINTERFACE_NAME=${interface_name} | |
"\"-DFACTORY_NAMES=${PANGO_FACTORY_${interface_name}}\"" | |
-P ${PROJECT_SOURCE_DIR}/cmake/PangolinFactory.cmake | |
COMMENT "Creating ${filename} factory registry header" | |
) | |
endmacro() | |
if(CMAKE_SCRIPT_MODE_FILE AND NOT CMAKE_PARENT_LIST_FILE) | |
# Running in script mode as part of build-time procedure to actually to the thing | |
create_factory_registry_file_now(${FILENAME} ${NAMESPACE} ${INTERFACE_NAME} ${FACTORY_NAMES} ) | |
endif() | |