369 lines
14 KiB
CMake
Executable file
369 lines
14 KiB
CMake
Executable file
# This module defines several macros that are useful for setting up library,
|
|
# plugin, and executable targets.
|
|
|
|
|
|
INCLUDE( ArgumentParser )
|
|
|
|
function(enable_unity_build UB_SUFFIX SOURCE_VARIABLE_NAME)
|
|
set(files ${${SOURCE_VARIABLE_NAME}})
|
|
# Generate a unique filename for the unity build translation unit
|
|
set(unit_build_file ${CMAKE_CURRENT_BINARY_DIR}/ub_${UB_SUFFIX}.cpp)
|
|
# Exclude all translation units from compilation
|
|
set_source_files_properties(${files} PROPERTIES HEADER_FILE_ONLY true)
|
|
# Open the ub file
|
|
FILE(WRITE ${unit_build_file} "// Unity Build generated by CMake\n")
|
|
# Add include statement for each translation unit
|
|
foreach(source_file ${files} )
|
|
FILE( APPEND ${unit_build_file} "#include <${CMAKE_CURRENT_SOURCE_DIR}/${source_file}>\n")
|
|
endforeach(source_file)
|
|
# Complement list of translation units with the name of ub
|
|
set(${SOURCE_VARIABLE_NAME} ${${SOURCE_VARIABLE_NAME}} ${unit_build_file} PARENT_SCOPE)
|
|
endfunction(enable_unity_build)
|
|
|
|
# SETUP_LIBRARY Macro
|
|
# Sets up to build a library target. The macro uses the following global
|
|
# variables to define default values (you may change these variables to change
|
|
# the defaults:
|
|
# DEFAULT_HEADER_INSTALL_DIR
|
|
# DEFAULT_LIBRARY_INSTALL_DIR
|
|
#
|
|
# Usage:
|
|
# SETUP_LIBRARY( target
|
|
# SOURCES source1 [source2...]
|
|
# MOC_HEADERS header1 [header2...]
|
|
# LIBRARIES library1 [library2...]
|
|
# INSTALL_HEADERS header1 [header2...]
|
|
# HEADER_INSTALL_DIR dir
|
|
# LIBRARY_INSTALL_DIR dir
|
|
# DEBUG_POSTFIX string
|
|
# LIBRARY_TYPE string
|
|
# AUTO_INSTALL_HEADERS
|
|
# DONT_INSTALL_LIBRARY )
|
|
#
|
|
# Parameters:
|
|
# target The target library.
|
|
# SOURCES Follow with the sources to compile.
|
|
# MOC_HEADERS Follow with the headers to moc (Requires Qt).
|
|
# LIBRARIES Follow with the libraries to link.
|
|
# INSTALL_HEADERS Follow with the headers to install.
|
|
# HEADER_INSTALL_DIR Follow with the directory to install the headers
|
|
# in (${DEFAULT_HEADER_INSTALL_DIR} by default).
|
|
# LIBRARY_INSTALL_DIR Follow with the directory to install the library
|
|
# in (${DEFAULT_LIBRARY_INSTALL_DIR} by default).
|
|
# DEBUG_POSTFIX Follow with the postfix to use when building in
|
|
# debug mode (${CMAKE_DEBUG_POSTFIX} by default).
|
|
# LIBRARY_TYPE Follow with the type of library to build: SHARED,
|
|
# STATIC, or MODULE (if not passed, then the
|
|
# behavior is defined by BUILD_SHARED_LIBS).
|
|
# AUTO_INSTALL_HEADERS If passed, all *.h files in the current directory
|
|
# will be installed.
|
|
# DONT_INSTALL_LIBRARY If passed, the library will not be installed.
|
|
MACRO( SETUP_LIBRARY target )
|
|
|
|
# Setup the list headers.
|
|
SET( list_headers
|
|
SOURCES
|
|
MOC_HEADERS
|
|
LIBRARIES
|
|
INSTALL_HEADERS
|
|
HEADER_INSTALL_DIR
|
|
LIBRARY_INSTALL_DIR
|
|
DEBUG_POSTFIX
|
|
LIBRARY_TYPE
|
|
)
|
|
|
|
# Setup the boolean headers.
|
|
SET( bool_headers
|
|
AUTO_INSTALL_HEADERS
|
|
DONT_INSTALL_LIBRARY
|
|
)
|
|
|
|
# Parse the arguments into variables.
|
|
ARGUMENT_PARSER( "" "${list_headers}" "${bool_headers}" ${ARGN} )
|
|
|
|
# Set the default values for the header_install_dir, library_install_dir,
|
|
# and debug_postfix.
|
|
IF( NOT "${ARGN}" MATCHES "(^|;)HEADER_INSTALL_DIR($|;)" )
|
|
SET( header_install_dir ${DEFAULT_HEADER_INSTALL_DIR} )
|
|
ENDIF( NOT "${ARGN}" MATCHES "(^|;)HEADER_INSTALL_DIR($|;)" )
|
|
|
|
IF( NOT "${ARGN}" MATCHES "(^|;)LIBRARY_INSTALL_DIR($|;)" )
|
|
SET( library_install_dir ${DEFAULT_LIBRARY_INSTALL_DIR} )
|
|
ENDIF( NOT "${ARGN}" MATCHES "(^|;)LIBRARY_INSTALL_DIR($|;)" )
|
|
|
|
IF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" )
|
|
SET( debug_postfix ${CMAKE_DEBUG_POSTFIX} )
|
|
ENDIF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" )
|
|
|
|
# Configure the header_install_dir and library_install_dir so that ${target}
|
|
# may be used in them. Setting target to itself is REQUIRED for the
|
|
# configuration to work.
|
|
SET( target "${target}" )
|
|
STRING( CONFIGURE "${header_install_dir}" header_install_dir )
|
|
STRING( CONFIGURE "${library_install_dir}" library_install_dir )
|
|
|
|
# Setup the library_type.
|
|
IF( NOT library_type )
|
|
SET( library_type STATIC )
|
|
IF( BUILD_SHARED_LIBS )
|
|
SET( library_type SHARED )
|
|
ENDIF( BUILD_SHARED_LIBS )
|
|
ENDIF( NOT library_type )
|
|
|
|
# Clear the moc_sources.
|
|
SET( moc_sources "" )
|
|
|
|
# If Qt is being used...
|
|
IF( QT_FOUND AND QT_LIBRARIES )
|
|
# Setup QT to build a shared library.
|
|
IF( library_type MATCHES SHARED )
|
|
ADD_DEFINITIONS( -DQT_SHARED )
|
|
ENDIF( library_type MATCHES SHARED )
|
|
|
|
# Setup the moc sources.
|
|
IF( moc_headers )
|
|
QT4_WRAP_CPP( moc_sources ${moc_headers} )
|
|
ENDIF( moc_headers )
|
|
ENDIF( QT_FOUND AND QT_LIBRARIES )
|
|
|
|
# Fatal error if moc_headers given but moc_sources not created.
|
|
IF( moc_headers AND NOT moc_sources )
|
|
MESSAGE( FATAL_ERROR "Calling SETUP_LIBRARY() with MOC_HEADERS failed. "
|
|
"Make sure that you included \${QT_USE_FILE} prior to calling "
|
|
"SETUP_LIBRARY()." )
|
|
ENDIF( moc_headers AND NOT moc_sources )
|
|
|
|
|
|
IF( UNITY_BUILD )
|
|
enable_unity_build( ${target} sources )
|
|
ENDIF( UNITY_BUILD )
|
|
|
|
# Add the library.
|
|
ADD_LIBRARY( "${target}" ${library_type} ${sources} ${moc_sources} )
|
|
|
|
# Setup the debug_postfix.
|
|
SET_TARGET_PROPERTIES ( "${target}" PROPERTIES
|
|
DEBUG_POSTFIX "${debug_postfix}" )
|
|
|
|
# Link in the dependency libraries.
|
|
TARGET_LINK_LIBRARIES( "${target}" ${libraries} )
|
|
|
|
# If auto_install_headers, then set the headers to all .h files in the
|
|
# directory.
|
|
IF( auto_install_headers )
|
|
FILE( GLOB install_headers *.h )
|
|
ENDIF( auto_install_headers )
|
|
|
|
# Install the headers.
|
|
IF( install_headers )
|
|
INSTALL( FILES ${install_headers} DESTINATION "${header_install_dir}" )
|
|
ENDIF( install_headers )
|
|
|
|
# Install the library.
|
|
IF( NOT dont_install_library )
|
|
INSTALL( TARGETS "${target}"
|
|
LIBRARY DESTINATION "${library_install_dir}"
|
|
ARCHIVE DESTINATION "${library_install_dir}" )
|
|
ENDIF( NOT dont_install_library )
|
|
|
|
ENDMACRO( SETUP_LIBRARY )
|
|
|
|
|
|
# SETUP_MODULE Macro
|
|
# Sets up to build a module (also setup as a Qt plugin if using Qt). A module is
|
|
# built as a shared library; however, modules are typically loaded dynamically
|
|
# rather than linked against. Therefore, this macro does not install header
|
|
# files and uses its own default install directory. The macro uses the following
|
|
# global variables to define default values (you may change these variables to
|
|
# change the defaults:
|
|
# DEFAULT_MODULE_INSTALL_DIR
|
|
#
|
|
# Usage:
|
|
# SETUP_MODULE( target
|
|
# SOURCES source1 [source2...]
|
|
# MOC_HEADERS header1 [header2...]
|
|
# LIBRARIES library1 [library2...]
|
|
# MODULE_INSTALL_DIR dir
|
|
# DEBUG_POSTFIX string
|
|
# DONT_INSTALL_MODULE )
|
|
#
|
|
# Parameters:
|
|
# target The target module (built as a shared library).
|
|
# SOURCES Follow with the sources to compile.
|
|
# MOC_HEADERS Follow with the headers to moc (Requires Qt).
|
|
# LIBRARIES Follow with the libraries to link.
|
|
# MODULE_INSTALL_DIR Follow with the directory to install the module in
|
|
# (${DEFAULT_MODULE_INSTALL_DIR} by default).
|
|
# DEBUG_POSTFIX Follow with the postfix to use when building in
|
|
# debug mode (${CMAKE_DEBUG_POSTFIX} by default).
|
|
# DONT_INSTALL_MODULE If passed, the module will not be installed.
|
|
MACRO( SETUP_MODULE target )
|
|
|
|
# Setup the list headers.
|
|
SET( list_headers
|
|
SOURCES
|
|
MOC_HEADERS
|
|
LIBRARIES
|
|
MODULE_INSTALL_DIR
|
|
DEBUG_POSTFIX
|
|
)
|
|
|
|
# Setup the boolean headers.
|
|
SET( bool_headers
|
|
DONT_INSTALL_MODULE
|
|
)
|
|
|
|
# Parse the arguments into variables.
|
|
ARGUMENT_PARSER( "" "${list_headers}" "${bool_headers}" ${ARGN} )
|
|
|
|
# Set the default values for the module_install_dir and debug postfix.
|
|
IF( NOT "${ARGN}" MATCHES "(^|;)MODULE_INSTALL_DIR($|;)" )
|
|
SET( module_install_dir ${DEFAULT_MODULE_INSTALL_DIR} )
|
|
ENDIF( NOT "${ARGN}" MATCHES "(^|;)MODULE_INSTALL_DIR($|;)" )
|
|
|
|
IF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" )
|
|
SET( debug_postfix ${CMAKE_DEBUG_POSTFIX} )
|
|
ENDIF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" )
|
|
|
|
# Configure the module_install_dir so that ${target} may be used in it.
|
|
# Setting target to itself is REQUIRED for the configuration to work.
|
|
SET( target "${target}" )
|
|
STRING( CONFIGURE "${module_install_dir}" module_install_dir )
|
|
|
|
# Clear the moc_sources.
|
|
SET( moc_sources "" )
|
|
|
|
# If Qt is being used...
|
|
IF( QT_FOUND AND QT_LIBRARIES )
|
|
ADD_DEFINITIONS( -DQT_PLUGIN )
|
|
|
|
# Setup the moc sources.
|
|
IF( moc_headers )
|
|
QT4_WRAP_CPP( moc_sources ${moc_headers} )
|
|
ENDIF( moc_headers )
|
|
ENDIF( QT_FOUND AND QT_LIBRARIES )
|
|
|
|
# Fatal error if moc_headers given but moc_sources not created.
|
|
IF( moc_headers AND NOT moc_sources )
|
|
MESSAGE( FATAL_ERROR "Calling SETUP_MODULE() with MOC_HEADERS failed. "
|
|
"Make sure that you included \${QT_USE_FILE} prior to calling "
|
|
"SETUP_MODULE()." )
|
|
ENDIF( moc_headers AND NOT moc_sources )
|
|
|
|
# Add the module (built as a shared library).
|
|
ADD_LIBRARY( "${target}" SHARED ${sources} ${moc_sources} )
|
|
|
|
# Setup the debug postfix.
|
|
SET_TARGET_PROPERTIES ( "${target}" PROPERTIES
|
|
DEBUG_POSTFIX "${debug_postfix}" )
|
|
|
|
# Link in the dependency libraries.
|
|
TARGET_LINK_LIBRARIES( "${target}" ${libraries} )
|
|
|
|
# Install the module.
|
|
IF( NOT dont_install_module )
|
|
INSTALL( TARGETS "${target}"
|
|
LIBRARY DESTINATION "${module_install_dir}" )
|
|
ENDIF( NOT dont_install_module )
|
|
|
|
ENDMACRO( SETUP_MODULE )
|
|
|
|
|
|
# SETUP_EXECUTABLE Macro
|
|
# Sets up to build an executable target. The macro uses the following global
|
|
# variables to define default values (you may change these variables to change
|
|
# the defaults:
|
|
# DEFAULT_EXECUTABLE_INSTALL_DIR
|
|
#
|
|
# Usage:
|
|
# SETUP_EXECUTABLE( target
|
|
# SOURCES source1 [source2...]
|
|
# MOC_HEADERS header1 [header2...]
|
|
# LIBRARIES library1 [library2...]
|
|
# EXECUTABLE_INSTALL_DIR dir
|
|
# DEBUG_POSTFIX string
|
|
# DONT_INSTALL_EXECUTABLE )
|
|
#
|
|
# Parameters:
|
|
# target The target executable.
|
|
# SOURCES Follow with the sources to compile.
|
|
# MOC_HEADERS Follow with the headers to moc (Requires Qt).
|
|
# LIBRARIES Follow with the libraries to link.
|
|
# EXECUTABLE_INSTALL_DIR Follow with the directory to install the
|
|
# executable in
|
|
# (${DEFAULT_EXECUTABLE_INSTALL_DIR} by default).
|
|
# DEBUG_POSTFIX Follow with the postfix to use when building in
|
|
# debug mode (${CMAKE_DEBUG_POSTFIX} by
|
|
# default).
|
|
# DONT_INSTALL_EXECUTABLE If passed, the executable will not be
|
|
# installed.
|
|
MACRO( SETUP_EXECUTABLE target )
|
|
|
|
# Setup the list headers.
|
|
SET( list_headers
|
|
SOURCES
|
|
MOC_HEADERS
|
|
LIBRARIES
|
|
EXECUTABLE_INSTALL_DIR
|
|
DEBUG_POSTFIX
|
|
)
|
|
|
|
# Setup the boolean headers.
|
|
SET( bool_headers
|
|
DONT_INSTALL_EXECUTABLE
|
|
)
|
|
|
|
# Parse the arguments into variables.
|
|
ARGUMENT_PARSER( "" "${list_headers}" "${bool_headers}" ${ARGN} )
|
|
|
|
# Set the default values for the executable_install_dir and debug postfix.
|
|
IF( NOT "${ARGN}" MATCHES "(^|;)EXECUTABLE_INSTALL_DIR($|;)" )
|
|
SET( executable_install_dir ${DEFAULT_EXECUTABLE_INSTALL_DIR} )
|
|
ENDIF( NOT "${ARGN}" MATCHES "(^|;)EXECUTABLE_INSTALL_DIR($|;)" )
|
|
|
|
IF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" )
|
|
SET( debug_postfix ${CMAKE_DEBUG_POSTFIX} )
|
|
ENDIF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" )
|
|
|
|
# Configure the executable_install_dir so that ${target} may be used in it.
|
|
# Setting target to itself is REQUIRED for the configuration to work.
|
|
SET( target "${target}" )
|
|
STRING( CONFIGURE "${executable_install_dir}" executable_install_dir )
|
|
|
|
# Clear the moc_sources.
|
|
SET( moc_sources "" )
|
|
|
|
# If Qt is being used...
|
|
IF( QT_FOUND AND QT_LIBRARIES )
|
|
ADD_DEFINITIONS( -DQT_SHARED )
|
|
|
|
# Setup the moc sources.
|
|
IF( moc_headers )
|
|
QT4_WRAP_CPP( moc_sources ${moc_headers} )
|
|
ENDIF( moc_headers )
|
|
ENDIF( QT_FOUND AND QT_LIBRARIES )
|
|
|
|
# Fatal error if moc_headers given but moc_sources not created.
|
|
IF( moc_headers AND NOT moc_sources )
|
|
MESSAGE( FATAL_ERROR "Calling SETUP_EXECUTABLE() with MOC_HEADERS failed. "
|
|
"Make sure that you included \${QT_USE_FILE} prior to calling "
|
|
"SETUP_EXECUTABLE()." )
|
|
ENDIF( moc_headers AND NOT moc_sources )
|
|
|
|
# Add the executable.
|
|
ADD_EXECUTABLE( "${target}" ${sources} ${moc_sources} )
|
|
|
|
# Setup the debug postfix.
|
|
SET_TARGET_PROPERTIES ( "${target}" PROPERTIES
|
|
DEBUG_POSTFIX "${debug_postfix}" )
|
|
|
|
# Link in the dependency libraries.
|
|
TARGET_LINK_LIBRARIES( "${target}" ${libraries} )
|
|
|
|
# Install the executable.
|
|
IF( NOT dont_install_executable )
|
|
INSTALL( TARGETS "${target}" RUNTIME DESTINATION
|
|
"${executable_install_dir}" )
|
|
ENDIF( NOT dont_install_executable )
|
|
|
|
ENDMACRO( SETUP_EXECUTABLE )
|