CGII/framework/cmake/buildCoreComponents.cmake

161 lines
5.5 KiB
CMake

# Only include file once
if (BUILD_CORE_COMPONENTS)
return()
endif()
set(BUILD_CORE_COMPONENTS TRUE)
# Set build settings for the standard elements of the framework bundle
get_filename_component(BASE_CORE_PATH "${CMAKE_CURRENT_LIST_FILE}" PATH)
include("${BASE_CORE_PATH}/buildSettings.cmake")
include("${BASE_CORE_PATH}/cgvConfigMacros.cmake")
# define macros to build core components
include("${BASE_CORE_PATH}/CMakeMacroParseArguments.cmake")
macro(_cgv_define_source_group basename)
foreach(source ${ARGN})
if (IS_ABSOLUTE ${source})
source_group(${basename} FILES ${source})
else()
get_filename_component(fpath "${source}" PATH)
if (fpath)
set(fpath "${fpath}/")
endif()
string(REPLACE "/" "\\" fpath "${fpath}")
source_group("${fpath}${basename}" FILES ${source})
endif()
endforeach()
endmacro()
macro(_cgv_add_core_library target_name)
# Parse the argument list
parse_arguments(COMPONENT "SOURCES;HEADERS;PUBLIC_HEADERS;CGV_DEPENDENCIES;SHARED_DEFINITIONS;STATIC_DEFINITIONS;SHADERS" "HEADERS_ONLY" ${ARGN})
# Do nothing if this component only consists of headers
if (NOT COMPONENT_HEADERS_ONLY)
# Expand the dependencies by prepending a "cgv_" to every element
set(CGV_DEPENDENCIES_EXP "")
foreach(dep ${COMPONENT_CGV_DEPENDENCIES})
list(APPEND CGV_DEPENDENCIES_EXP "cgv_${dep}")
endforeach()
# Set include directory
include_directories(${CMAKE_CURRENT_SOURCE_DIR}
"${CMAKE_BINARY_DIR}/${BUILD_BASE}/${INSTALL_HEADER_PATH}")
# Add a library
add_library(${target_name} ${COMPONENT_SOURCES} ${COMPONENT_HEADERS} ${COMPONENT_PUBLIC_HEADERS})
# Set dependent components
target_link_libraries(${target_name} ${CGV_DEPENDENCIES_EXP})
# Create some filters for IDEs
_cgv_define_source_group("Sources" ${COMPONENT_SOURCES})
_cgv_define_source_group("Headers" ${COMPONENT_HEADERS} ${COMPONENT_PUBLIC_HEADERS})
# Create installation rules for the target
install(TARGETS ${target_name} DESTINATION "${INSTALL_BASE}/${INSTALL_LIB_PATH}" EXPORT ${CGV_EXPORTS_ID})
# Append this element to the list of targets
set(CGV_LIB_TARGETS ${CGV_LIB_TARGETS} ${target_name} PARENT_SCOPE)
# Set a source folder for VisualStudio
set_target_properties(${target_name} PROPERTIES FOLDER "${FOLDER_NAME_CGV}")
_cgv_set_cxx_standard(${target_name})
# Set definitions for shared and static libraries.
string(TOUPPER ${target_name} TARGET_UPPER)
_cgv_set_definitions(${target_name}
COMMON UNICODE _UNICODE
SHARED "${TARGET_UPPER}_EXPORTS" ${COMPONENT_SHARED_DEFINITIONS}
STATIC "${TARGET_UPPER}_FORCE_STATIC;CGV_FORCE_STATIC" ${COMPONENT_STATIC_DEFINITIONS})
# Add definitions to use unicode
# FIXME: This might be a hack
add_definitions("-DUNICODE -D_UNICODE")
else()
# Create a dummy target for dependency checks
add_custom_target(${target_name})
endif()
endmacro()
macro(cgv_add_core_component target_name)
# a component is an expanded cgv-library
_cgv_add_core_library(cgv_${target_name} ${ARGN})
# set_target_properties(cgv_${target_name} PROPERTIES LINK_FLAGS -nostdlib)
# Create installation rules for the public headers
_cgv_install_public_headers("cgv/${target_name}" ${COMPONENT_PUBLIC_HEADERS})
endmacro()
macro(build_core_components_finish)
# HACK: Since CMake has no way to enumerate targets they are written
# in a cmake file which will also be installed
SET(LOCAL_EXPORTS_DIR "${CMAKE_BINARY_DIR}/${BUILD_BASE}/${INSTALL_CMAKE_PATH}")
set(CGV_TARGETS_DEFINITIONS "")
foreach(target ${CGV_LIB_TARGETS})
get_target_property(SHARED_DEF ${target} _SHARED_DEFINITIONS)
get_target_property(STATIC_DEF ${target} _STATIC_DEFINITIONS)
set(CGV_TARGETS_DEFINITIONS "${CGV_TARGETS_DEFINITIONS}\nset(${target}_SHARED_DEFINITIONS \"${SHARED_DEF}\")")
set(CGV_TARGETS_DEFINITIONS "${CGV_TARGETS_DEFINITIONS}\nset(${target}_STATIC_DEFINITIONS \"${STATIC_DEF}\")")
endforeach()
configure_file("${CGV_BASE}/cmake/${CGV_TARGETS_CONFIG_NAME}.in"
"${LOCAL_EXPORTS_DIR}/${CGV_TARGETS_CONFIG_NAME}"
@ONLY)
# file(WRITE "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_INDEX_NAME}"
# "SET(CGV_TARGETS ${CGV_LIB_TARGETS})")
# install(FILES "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_INDEX_NAME}"
# DESTINATION "${INSTALL_BASE}/${INSTALL_CMAKE_PATH}")
export(TARGETS ${CGV_LIB_TARGETS} FILE "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_NAME}")
# Export all targets
install(EXPORT ${CGV_EXPORTS_ID} DESTINATION "${INSTALL_BASE}/${INSTALL_CMAKE_PATH}")
install(FILES ${CGV_BASE}/cmake/base.cmake
${CGV_BASE}/cmake/buildCoreComponents.cmake
${CGV_BASE}/cmake/buildSettings.cmake
${CGV_BASE}/cmake/cgvConfig.cmake
${CGV_BASE}/cmake/cgvConfigGeneral.cmake
${CGV_BASE}/cmake/cgvConfigMacros.cmake
${CGV_BASE}/cmake/cgvConfigVersion.cmake
${CGV_BASE}/cmake/cgvTargetsConfig.cmake.in
${CGV_BASE}/cmake/CMakeMacroParseArguments.cmake
${CGV_BASE}/cmake/CMakePackageConfigHelpers.cmake
${CGV_BASE}/cmake/createConfigScript.cmake
${CGV_BASE}/cmake/FindPkg.cmake.in
${CGV_BASE}/cmake/PkgBinConfig.cmake.in
${CGV_BASE}/cmake/PkgLibConfig.cmake.in
DESTINATION "${INSTALL_BASE}/cmake")
install(FILES ${CGV_BASE}/cmake/launcher.sh.in
DESTINATION "${INSTALL_BASE}/${OS_PREFIX}/cmake")
# TODO: Comment this
set(LOCAL_BUILD_ANNOUNCED TRUE)
set(LOCAL_BUILD_DIR "${CMAKE_BINARY_DIR}/${BUILD_BASE}")
file(WRITE "${CGV_BASE}/cmake/local_build_dir.cmake"
"set(LOCAL_BUILD_DIR \"${LOCAL_BUILD_DIR}\")")
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
"${CGV_BASE}/cmake/local_build_dir.cmake")
endmacro()