mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-04 12:49:36 -06:00
The variables in this module are used to configure a header file with defines whose name depends on the name of the target. As valid names of targets may be invalid for use as defines, convert the names of the defines used to C identifiers first. This is already done in C++ code for the DEFINE_SYMBOL property. This is not as simple as ensuring that the BASE_NAME is a C identifier, because most of the define names are configurable, and because use of a BASE_NAME which is not a C identifier, such as 4square can become a C identifier by specifying a prefix in the generate_export_header macro.
188 lines
5.0 KiB
CMake
188 lines
5.0 KiB
CMake
cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR)
|
|
|
|
project(GenerateExportHeader)
|
|
|
|
# Prevent timeout on Watcom by not running the tests.
|
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES Watcom)
|
|
file(WRITE
|
|
"${CMAKE_CURRENT_BINARY_DIR}/main.cxx"
|
|
"int main() { return 0; }
|
|
"
|
|
)
|
|
|
|
add_executable(
|
|
GenerateExportHeader
|
|
"${CMAKE_CURRENT_BINARY_DIR}/main.cxx"
|
|
)
|
|
return()
|
|
endif()
|
|
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
set( CMAKE_INCLUDE_CURRENT_DIR ON )
|
|
|
|
macro(TEST_FAIL value msg)
|
|
if (${value})
|
|
message (SEND_ERROR "Test fail:" ${msg} ${Out} )
|
|
endif ()
|
|
endmacro()
|
|
|
|
macro(TEST_PASS value msg)
|
|
if (NOT ${value})
|
|
message (SEND_ERROR "Test fail:" ${msg} ${Out} )
|
|
endif ()
|
|
endmacro()
|
|
|
|
check_cxx_compiler_flag(-Werror HAS_WERROR_FLAG)
|
|
|
|
if(HAS_WERROR_FLAG)
|
|
set(ERROR_FLAG "-Werror")
|
|
else()
|
|
# MSVC
|
|
# And intel on windows?
|
|
# http://software.intel.com/en-us/articles/how-to-handle-warnings-message-in-compiler/?wapkw=%28compiler+warning+message%29
|
|
check_cxx_compiler_flag("/WX" HAS_WX_FLAG)
|
|
if(HAS_WX_FLAG)
|
|
set(ERROR_FLAG "/WX")
|
|
else()
|
|
# Sun CC
|
|
# http://www.acsu.buffalo.edu/~charngda/sunstudio.html
|
|
check_cxx_compiler_flag("-errwarn=%all" HAS_ERRWARN_ALL)
|
|
if (HAS_ERRWARN_ALL)
|
|
set(ERROR_FLAG "-errwarn=%all")
|
|
else()
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
set(DEPS
|
|
libshared
|
|
libstatic
|
|
lib_shared_and_static
|
|
)
|
|
|
|
foreach(DEP ${DEPS})
|
|
try_compile(Result ${CMAKE_CURRENT_BINARY_DIR}/${DEP}_build
|
|
${CMAKE_CURRENT_SOURCE_DIR}/${DEP}
|
|
${DEP}
|
|
OUTPUT_VARIABLE Out
|
|
)
|
|
if (NOT Result)
|
|
message("OUTPUT: ${Out}")
|
|
endif()
|
|
endforeach()
|
|
|
|
# The _do_build macro is called from a child scope, where
|
|
# the current source and binary dir are different. Save them here
|
|
# for use in the macro.
|
|
set(TEST_TOP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
|
set(TEST_TOP_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
|
|
# We seem to get race conditions is writing this stuff to the same file at least on MinGW
|
|
# So to write to separate source and build directories, we use a count to differentiate.
|
|
set (COUNT 0)
|
|
macro(_do_build Include Library LibrarySource Source)
|
|
|
|
math(EXPR COUNT "${COUNT} + 1" )
|
|
|
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test${COUNT}/src.cpp" "#include \"${Include}\"\n"
|
|
"int main() { ${Source}; }\n"
|
|
)
|
|
|
|
if ("${Library}" STREQUAL "static_variant")
|
|
set(CONDITIONAL_STATIC_DEFINE "add_definitions(-DLIBSHARED_AND_STATIC_STATIC_DEFINE)\n")
|
|
endif()
|
|
|
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test${COUNT}/CMakeLists.txt"
|
|
"cmake_minimum_required(VERSION 2.8)\n"
|
|
|
|
"project(compiletest)\n"
|
|
|
|
"set(CMAKE_INCLUDE_CURRENT_DIR ON)\n"
|
|
|
|
"set(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"\${CMAKE_CURRENT_BINARY_DIR}\")\n"
|
|
|
|
"include(GenerateExportHeader)\n"
|
|
|
|
"add_compiler_export_flags()\n"
|
|
|
|
"if(NOT \"${ERROR_FLAG}\" STREQUAL \"\")\n"
|
|
" add_definitions(${ERROR_FLAG})\n"
|
|
"endif()\n"
|
|
|
|
"include(\"${TEST_TOP_BINARY_DIR}/${LibrarySource}_build/Targets.cmake\")\n"
|
|
|
|
"include_directories(\"${TEST_TOP_SOURCE_DIR}/${LibrarySource}\"\n"
|
|
" \"${TEST_TOP_BINARY_DIR}/${LibrarySource}_build\")\n"
|
|
|
|
"${CONDITIONAL_STATIC_DEFINE}"
|
|
|
|
"add_executable(compiletest src.cpp)\n"
|
|
"target_link_libraries(compiletest ${Library})\n"
|
|
)
|
|
|
|
try_compile(Result ${CMAKE_CURRENT_BINARY_DIR}/fail${COUNT}
|
|
${CMAKE_CURRENT_BINARY_DIR}/test${COUNT}
|
|
compiletest
|
|
OUTPUT_VARIABLE Out
|
|
)
|
|
endmacro()
|
|
|
|
macro(build_fail Include Library LibrarySource Source Message)
|
|
_do_build(${Include} ${Library} ${LibrarySource} "${Source}")
|
|
test_fail(Result ${Message})
|
|
endmacro()
|
|
|
|
macro(build_pass Include Library LibrarySource Source Message)
|
|
_do_build(${Include} ${Library} ${LibrarySource} "${Source}")
|
|
test_pass(Result ${Message})
|
|
endmacro()
|
|
|
|
include(GenerateExportHeader)
|
|
|
|
add_compiler_export_flags()
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
message("#### COMPILER_HAS_DEPRECATED: " ${COMPILER_HAS_DEPRECATED})
|
|
message("#### COMPILER_HAS_HIDDEN_VISIBILITY: " ${COMPILER_HAS_HIDDEN_VISIBILITY})
|
|
message("#### WIN32: " ${WIN32})
|
|
message("#### HAS_WERROR_FLAG: " ${HAS_WERROR_FLAG})
|
|
|
|
set(link_libraries)
|
|
macro(macro_add_test_library name)
|
|
add_subdirectory(${name})
|
|
include_directories(${name}
|
|
${${name}_BINARY_DIR} # For the export header.
|
|
)
|
|
list(APPEND link_libraries ${name})
|
|
add_subdirectory(${name}test)
|
|
endmacro()
|
|
|
|
macro_add_test_library(libshared)
|
|
macro_add_test_library(libstatic)
|
|
add_subdirectory(lib_shared_and_static)
|
|
add_subdirectory(lib_shared_and_statictest)
|
|
|
|
add_subdirectory(override_symbol)
|
|
add_subdirectory(nodeprecated)
|
|
add_subdirectory(prefix)
|
|
if(NOT BORLAND)
|
|
add_subdirectory(c_identifier)
|
|
endif()
|
|
|
|
if (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))
|
|
# We deliberately call deprecated methods, and test for that elsewhere.
|
|
# No need to clutter the test output with warnings.
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
|
|
endif()
|
|
|
|
if(MSVC AND COMPILER_HAS_DEPRECATED)
|
|
add_definitions(/wd4996)
|
|
endif()
|
|
|
|
add_executable(GenerateExportHeader exportheader_test.cpp)
|
|
|
|
target_link_libraries(GenerateExportHeader ${link_libraries})
|