get_directory_property(parent_directory PARENT_DIRECTORY) set(is_root_project $) set(USE_STATIC_RUNTIME "${is_root_project}" CACHE BOOL "Link the runtime statically") set(STRIP_SYMBOL_TABLE "${is_root_project}" CACHE BOOL "Strip symbol tables") if(is_root_project) if(MSVC) add_compile_options(/MP /W4) elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) add_compile_options(-Wall -Wextra) endif() endif() set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) function(use_static_runtime_msvc target) target_compile_options("${target}" PRIVATE $<$:/MTd> $<$>:/MT>) endfunction() function(use_static_runtime_gcc target) get_target_property(target_type "${target}" TYPE) if(target_type STREQUAL EXECUTABLE) target_link_libraries("${target}" PRIVATE -static) endif() endfunction() function(use_static_runtime target) if(MSVC) use_static_runtime_msvc("${target}") elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) use_static_runtime_gcc("${target}") else() message(WARNING "Unrecognized toolset") endif() endfunction() function(strip_symbol_table_gcc target) target_link_libraries("${target}" PRIVATE $<$,$>:-s>) endfunction() function(strip_symbol_table target) if(MSVC) elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) strip_symbol_table_gcc("${target}") else() message(WARNING "Unrecognized toolset") endif() endfunction() macro(add_executable target) _add_executable(${ARGV}) if(TARGET "${target}") if(USE_STATIC_RUNTIME) use_static_runtime("${target}") endif() if(STRIP_SYMBOL_TABLE) strip_symbol_table("${target}") endif() endif() endmacro() macro(add_library target) _add_library(${ARGV}) if(TARGET "${target}") if(USE_STATIC_RUNTIME) use_static_runtime("${target}") endif() endif() endmacro()