From 30880707c094ac5c0edd85d0857afb6fbae55326 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 13 Jul 2011 02:13:33 +0200 Subject: [PATCH 01/72] Add the GenerateExportMacro with unit tests. Reviewed-by: Marcus D. Hanwell --- Modules/GenerateExportHeader.cmake | 251 ++++++++++++++++++ Modules/exportheader.cmake.in | 30 +++ Tests/CMakeLists.txt | 2 + .../GenerateExportHeader/CMakeLists.txt | 122 +++++++++ .../exportheader_test.cpp | 82 ++++++ .../lib_shared_and_static/CMakeLists.txt | 12 + .../libshared_and_static.cpp | 91 +++++++ .../libshared_and_static.h | 58 ++++ .../lib_shared_and_statictest/CMakeLists.txt | 23 ++ .../libshared/CMakeLists.txt | 6 + .../libshared/libshared.cpp | 91 +++++++ .../libshared/libshared.h | 59 ++++ .../libsharedtest/CMakeLists.txt | 27 ++ .../libstatic/CMakeLists.txt | 8 + .../libstatic/libstatic.cpp | 87 ++++++ .../libstatic/libstatic.h | 54 ++++ .../libstatictest/CMakeLists.txt | 13 + 17 files changed, 1016 insertions(+) create mode 100644 Modules/GenerateExportHeader.cmake create mode 100644 Modules/exportheader.cmake.in create mode 100644 Tests/Module/GenerateExportHeader/CMakeLists.txt create mode 100644 Tests/Module/GenerateExportHeader/exportheader_test.cpp create mode 100644 Tests/Module/GenerateExportHeader/lib_shared_and_static/CMakeLists.txt create mode 100644 Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.cpp create mode 100644 Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h create mode 100644 Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt create mode 100644 Tests/Module/GenerateExportHeader/libshared/CMakeLists.txt create mode 100644 Tests/Module/GenerateExportHeader/libshared/libshared.cpp create mode 100644 Tests/Module/GenerateExportHeader/libshared/libshared.h create mode 100644 Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt create mode 100644 Tests/Module/GenerateExportHeader/libstatic/CMakeLists.txt create mode 100644 Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp create mode 100644 Tests/Module/GenerateExportHeader/libstatic/libstatic.h create mode 100644 Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake new file mode 100644 index 000000000..c7178999b --- /dev/null +++ b/Modules/GenerateExportHeader.cmake @@ -0,0 +1,251 @@ + +# - Function for generation of export macros for libraries +# +# This module provides the function GENERATE_EXPORT_HEADER() and the +# accompanying ADD_COMPILER_EXPORT_FLAGS() function. +# +# The GENERATE_EXPORT_HEADER function can be used to generate a file suitable +# for preprocessor inclusion which contains EXPORT macros to be used in +# library classes. +# +# GENERATE_EXPORT_HEADER( LIBRARY_TARGET +# [BASE_NAME ] +# [EXPORT_MACRO_NAME ] +# [EXPORT_FILE_NAME ] +# [DEPRECATED_NAME ] +# [NO_EXPORT_MACRO_NAME ] +# [STATIC_DEFINE ] +# ) +# +# ADD_COMPILER_EXPORT_FLAGS( [FATAL_WARNINGS] ) +# +# By default GENERATE_EXPORT_HEADER() generates macro names in a file name +# determined by the name of the library. The ADD_COMPILER_EXPORT_FLAGS macro adds +# -fvisibility=hidden to CMAKE_CXX_FLAGS if supported, and is a no-op on Windows +# which does not need extra compiler flags for exporting support. +# +# This means that in the simplest case, users of these functions will be equivalent to: +# +# add_compiler_export_flags() +# +# add_library(somelib someclass.cpp) +# +# generate_export_header(somelib) +# +# install(TARGETS somelib DESTINATION ${LIBRARY_INSTALL_DIR}) +# +# install(FILES +# someclass.h +# ${PROJECT_BINARY_DIR}/somelib_export.h DESTINATION ${INCLUDE_INSTALL_DIR} +# ) +# +# And in the ABI header files: +# +# \code +# #include "somelib_export.h" +# +# class SOMELIB_EXPORT SomeClass { +# +# }; +# \endcode +# +# The CMake fragment will generate a file in the ${CMAKE_CURRENT_BUILD_DIR} called +# somelib_export.h containing the macros SOMELIB_EXPORT, SOMELIB_NO_EXPORT, +# SOMELIB_DEPRECATED, SOMELIB_DEPRECATED_EXPORT and SOMELIB_DEPRECATED_NO_EXPORT. +# The resulting file should be installed with other headers in the library. +# +# The BASE_NAME argument can be used to override the file name and the names +# used for the macros +# +# add_library(somelib someclass.cpp) +# generate_export_header(somelib +# BASE_NAME other_name +# ) +# +# Generates a file called other_name_export.h containing the macros +# OTHER_NAME_EXPORT, OTHER_NAME_NO_EXPORT and OTHER_NAME_DEPRECATED etc. +# +# The BASE_NAME may be overridden by specifiying other options in the function. +# For example: +# +# add_library(somelib someclass.cpp) +# generate_export_header(somelib +# EXPORT_MACRO_NAME OTHER_NAME_EXPORT +# ) +# +# creates the macro OTHER_NAME_EXPORT instead of SOMELIB_EXPORT, but other macros +# and the generated file name is as default. +# +# add_library(somelib someclass.cpp) +# generate_export_header(somelib +# DEPRECATED_NAME KDE_DEPRECATED +# ) +# +# creates the macro KDE_DEPRECATED instead of SOMELIB_DEPRECATED. +# +# If LIBRARY_TARGET is a static library, macros are defined without values. +# +# If the same sources are used to create both a shared and a static library, the +# uppercased symbol ${BASE_NAME}_STATIC_DEFINE should be used when building the +# static library +# +# add_library(shared_variant SHARED ${lib_SRCS}) +# add_library(static_variant ${lib_SRCS}) +# +# generate_export_header(shared_variant BASE_NAME libshared_and_static) +# +# set_target_properties(static_variant PROPERTIES COMPILE_FLAGS -DLIBSHARED_AND_STATIC_STATIC_DEFINE) +# +# This will cause the export macros to expand to nothing when building the static library. + +include(CMakeParseArguments) +include(CheckCXXCompilerFlag) + +macro(_test_compiler_hidden_visibility) + check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) + check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) + option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) + mark_as_advanced(USE_COMPILER_HIDDEN_VISIBILITY) +endmacro() + +set(myDir ${CMAKE_CURRENT_LIST_DIR}) + +macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) + set(DEFINE_DEPRECATED) + set(DEFINE_EXPORT) + set(DEFINE_IMPORT) + set(DEFINE_NO_EXPORT) + + if(WIN32) + set(DEFINE_DEPRECATED "__declspec(deprecated)") + else() + set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") + endif() + + get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) + + if(NOT ${type} STREQUAL "STATIC_LIBRARY") + if(WIN32) + set(DEFINE_EXPORT "__declspec(dllexport)") + set(DEFINE_IMPORT "__declspec(dllimport)") + elseif(CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Intel AND UNIX)) + if(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) + set(DEFINE_EXPORT "__attribute__((visibility(\"default\")))") + set(DEFINE_IMPORT "__attribute__((visibility(\"default\")))") + set(DEFINE_NO_EXPORT "__attribute__((visibility(\"hidden\")))") + endif() + endif() + endif() +endmacro() + +macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) + # Option overrides + set(options) + set(oneValueArgs PREFIX_NAME BASE_NAME EXPORT_MACRO_NAME EXPORT_FILE_NAME DEPRECATED_NAME NO_EXPORT_MACRO_NAME STATIC_DEFINE) + set(multiValueArgs) + + cmake_parse_arguments(_GEH "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(BASE_NAME "${TARGET_LIBRARY}") + + if(_GEH_BASE_NAME) + set(BASE_NAME ${_GEH_BASE_NAME}) + endif() + + string(TOUPPER ${BASE_NAME} BASE_NAME_UPPER) + string(TOLOWER ${BASE_NAME} BASE_NAME_LOWER) + + # Default options + set(EXPORT_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_EXPORT") + set(NO_EXPORT_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_NO_EXPORT") + set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME_LOWER}_export.h") + set(DEPRECATED_NAME "${PREFIX}${BASE_NAME_UPPER}_DEPRECATED") + set(STATIC_DEFINE "${PREFIX}${BASE_NAME_UPPER}_STATIC_DEFINE") + + if(_GEH_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to GENERATE_EXPORT_HEADER(): \"${_GEH_UNPARSED_ARGUMENTS}\"") + endif() + + if(_GEH_EXPORT_MACRO_NAME) + set(EXPORT_MACRO_NAME ${PREFIX}${_GEH_EXPORT_MACRO_NAME}) + endif() + if(_GEH_EXPORT_FILE_NAME) + if(IS_ABSOLUTE _GEH_EXPORT_FILE_NAME) + set(EXPORT_FILE_NAME ${_GEH_EXPORT_FILE_NAME}) + else() + set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${_GEH_EXPORT_FILE_NAME}") + endif() + endif() + if(_GEH_DEPRECATED_NAME) + set(DEPRECATED_NAME ${PREFIX}${_GEH_DEPRECATED_NAME}) + endif() + if(_GEH_NO_EXPORT_MACRO_NAME) + set(NO_EXPORT_MACRO_NAME ${PREFIX}${_GEH_NO_EXPORT_MACRO_NAME}) + endif() + if(_GEH_STATIC_DEFINE) + set(STATIC_DEFINE ${PREFIX}${_GEH_STATIC_DEFINE}) + endif() + + set(INCLUDE_GUARD_NAME "${PREFIX}${EXPORT_MACRO_NAME}_H") + + configure_file(${myDir}/exportheader.cmake.in ${EXPORT_FILE_NAME} @ONLY) +endmacro() + +function(GENERATE_EXPORT_HEADER TARGET_LIBRARY) + get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) + if(${type} STREQUAL "MODULE") + message(WARNING "This macro should not be used with libraries of type MODULE") + return() + endif() + if(NOT ${type} STREQUAL "STATIC_LIBRARY" AND NOT ${type} STREQUAL "SHARED_LIBRARY") + message(WARNING "This macro can only be used with libraries") + return() + endif() + _test_compiler_hidden_visibility() + _do_set_macro_values(${TARGET_LIBRARY}) + _do_generate_export_header(${TARGET_LIBRARY} ${ARGN}) +endfunction() + +function(add_compiler_export_flags) + + if(NOT CMAKE_COMPILER_IS_GNUCXX OR MINGW) + return() + endif() + + set(options) + set(oneValueArgs FATAL_WARNINGS) + set(multiValueArgs) + + cmake_parse_arguments(_EGHV "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(MESSAGE_TYPE WARNING) + + if(_EGHV_FATAL_WARNINGS) + set(MESSAGE_TYPE FATAL_ERROR) + endif() + + if (CMAKE_COMPILER_IS_GNUCXX) + exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) + string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") + # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the + # patch level, handle this here: + if(NOT _gcc_version) + string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") + endif() + + if(${_gcc_version} VERSION_LESS "4.2") + return() + endif() + endif() + + _test_compiler_hidden_visibility() + + if(USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) + set (EXTRA_FLAGS "-fvisibility=hidden") + + if(COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) + set (EXTRA_FLAGS "${EXTRA_FLAGS} -fvisibility-inlines-hidden") + endif() + endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}" PARENT_SCOPE) +endfunction() \ No newline at end of file diff --git a/Modules/exportheader.cmake.in b/Modules/exportheader.cmake.in new file mode 100644 index 000000000..083e95cbc --- /dev/null +++ b/Modules/exportheader.cmake.in @@ -0,0 +1,30 @@ + +#ifndef @INCLUDE_GUARD_NAME@ +#define @INCLUDE_GUARD_NAME@ + +#ifdef @STATIC_DEFINE@ +# define @EXPORT_MACRO_NAME@ +# define @NO_EXPORT_MACRO_NAME@ +#else +# ifndef @EXPORT_MACRO_NAME@ +# ifdef @TARGET_LIBRARY@_EXPORTS + /* We are building this library */ +# define @EXPORT_MACRO_NAME@ @DEFINE_EXPORT@ +# else + /* We are using this library */ +# define @EXPORT_MACRO_NAME@ @DEFINE_IMPORT@ +# endif +# endif + +# ifndef @NO_EXPORT_MACRO_NAME@ +# define @NO_EXPORT_MACRO_NAME@ @DEFINE_NO_EXPORT@ +# endif +#endif + +#ifndef @DEPRECATED_NAME@ +# define @DEPRECATED_NAME@ @DEFINE_DEPRECATED@ +# define @DEPRECATED_NAME@_EXPORT @EXPORT_MACRO_NAME@ @DEFINE_DEPRECATED@ +# define @DEPRECATED_NAME@_NO_EXPORT @NO_EXPORT_MACRO_NAME@ @DEFINE_DEPRECATED@ +#endif + +#endif // @INCLUDE_GUARD_NAME@ \ No newline at end of file diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 4bf83b780..eececb020 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -221,6 +221,8 @@ IF(BUILD_TESTING) ADD_TEST_MACRO(Module.CheckTypeSize CheckTypeSize) + ADD_TEST_MACRO(Module.GenerateExportHeader GenerateExportHeader) + ADD_TEST(LinkFlags-prepare ${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE} --build-and-test diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt new file mode 100644 index 000000000..2d6eabe06 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -0,0 +1,122 @@ +cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR) + +project(GenerateExportHeader) + +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() + +# 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" + ) + + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/../${LibrarySource}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/test${COUNT}") + + 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" + + "include(GenerateExportHeader)\n" + + "add_compiler_export_flags()\n" + + "if(CMAKE_COMPILER_IS_GNUCXX)\n" + " add_definitions(-Werror)\n" + "else()\n" + " if(MSVC)\n" + # Treat deprecation warnings as errors. + " add_definitions(/we4996)\n" + " endif()\n" + "endif()\n" + + "if(MSVC)\n" + " add_definitions(-DCOMPILER_IS_MSVC)\n" + "endif()\n" + + "add_subdirectory(${LibrarySource})\n" + + "include_directories(${LibrarySource} \${CMAKE_CURRENT_BINARY_DIR}/${LibrarySource})\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} + compilefail + 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() + +if (MSVC) + add_definitions(-DCOMPILER_IS_MSVC) +endif() + +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) + +if (CMAKE_COMPILER_IS_GNUCXX) + # 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) + add_definitions(/wd4996) +endif() + +add_executable(GenerateExportHeader exportheader_test.cpp) + +target_link_libraries(GenerateExportHeader ${link_libraries}) diff --git a/Tests/Module/GenerateExportHeader/exportheader_test.cpp b/Tests/Module/GenerateExportHeader/exportheader_test.cpp new file mode 100644 index 000000000..cfc1a053f --- /dev/null +++ b/Tests/Module/GenerateExportHeader/exportheader_test.cpp @@ -0,0 +1,82 @@ + +#include "libshared.h" + +#include "libstatic.h" + +// #define BUILD_FAIL + +#ifndef BUILD_FAIL +#define DOES_NOT_BUILD(function) +#else +#define DOES_NOT_BUILD(function) function +#endif + +int main() +{ + { + Libshared l; + l.libshared(); + l.libshared_exported(); + l.libshared_deprecated(); + l.libshared_not_exported(); + + DOES_NOT_BUILD(l.libshared_excluded();) + } + + { + LibsharedNotExported l; + DOES_NOT_BUILD(l.libshared();) + l.libshared_exported(); + l.libshared_deprecated(); + DOES_NOT_BUILD(l.libshared_not_exported();) + DOES_NOT_BUILD(l.libshared_excluded();) + } + + { + LibsharedExcluded l; + DOES_NOT_BUILD(l.libshared();) + l.libshared_exported(); + l.libshared_deprecated(); + DOES_NOT_BUILD(l.libshared_not_exported();) + DOES_NOT_BUILD(l.libshared_excluded();) + } + + libshared_exported(); + libshared_deprecated(); + DOES_NOT_BUILD(libshared_not_exported();) + DOES_NOT_BUILD(libshared_excluded();) + + { + Libstatic l; + l.libstatic(); + l.libstatic_exported(); + l.libstatic_deprecated(); + l.libstatic_not_exported(); + l.libstatic_excluded(); + } + + { + LibstaticNotExported l; + l.libstatic(); + l.libstatic_exported(); + l.libstatic_deprecated(); + l.libstatic_not_exported(); + l.libstatic_excluded(); + } + + { + LibstaticExcluded l; + l.libstatic(); + l.libstatic_exported(); + l.libstatic_deprecated(); + l.libstatic_not_exported(); + l.libstatic_excluded(); + } + + libstatic_exported(); + libstatic_deprecated(); + libstatic_not_exported(); + libstatic_excluded(); + + return 0; +} \ No newline at end of file diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_static/CMakeLists.txt b/Tests/Module/GenerateExportHeader/lib_shared_and_static/CMakeLists.txt new file mode 100644 index 000000000..d19b6dc2f --- /dev/null +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_static/CMakeLists.txt @@ -0,0 +1,12 @@ +project(shared_and_static) + +set(lib_SRCS + libshared_and_static.cpp +) + +add_library(shared_variant SHARED ${lib_SRCS}) +add_library(static_variant ${lib_SRCS}) + +generate_export_header(shared_variant BASE_NAME libshared_and_static) + +set_target_properties(static_variant PROPERTIES COMPILE_FLAGS -DLIBSHARED_AND_STATIC_STATIC_DEFINE) diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.cpp b/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.cpp new file mode 100644 index 000000000..1e0727362 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.cpp @@ -0,0 +1,91 @@ + +#include "libshared_and_static.h" + +int LibsharedAndStatic::libshared_and_static() const +{ + return 0; +} + +int LibsharedAndStatic::libshared_and_static_exported() const +{ + return 0; +} + +int LibsharedAndStatic::libshared_and_static_deprecated() const +{ + return 0; +} + +int LibsharedAndStatic::libshared_and_static_not_exported() const { + return 0; +} + +int LibsharedAndStatic::libshared_and_static_excluded() const { + return 0; +} + +int LibsharedAndStaticNotExported::libshared_and_static() const +{ + return 0; +} + +int LibsharedAndStaticNotExported::libshared_and_static_exported() const +{ + return 0; +} + +int LibsharedAndStaticNotExported::libshared_and_static_deprecated() const +{ + return 0; +} + +int LibsharedAndStaticNotExported::libshared_and_static_not_exported() const { + return 0; +} + +int LibsharedAndStaticNotExported::libshared_and_static_excluded() const { + return 0; +} + +int LibsharedAndStaticExcluded::libshared_and_static() const +{ + return 0; +} + +int LibsharedAndStaticExcluded::libshared_and_static_exported() const +{ + return 0; +} + +int LibsharedAndStaticExcluded::libshared_and_static_deprecated() const +{ + return 0; +} + +int LibsharedAndStaticExcluded::libshared_and_static_not_exported() const { + return 0; +} + +int LibsharedAndStaticExcluded::libshared_and_static_excluded() const { + return 0; +} + +int libshared_and_static() { + return 0; +} + +int libshared_and_static_exported() { + return 0; +} + +int libshared_and_static_deprecated() { + return 0; +} + +int libshared_and_static_not_exported() { + return 0; +} + +int libshared_and_static_excluded() { + return 0; +} diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h b/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h new file mode 100644 index 000000000..7df769460 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h @@ -0,0 +1,58 @@ + +#ifndef SHARED_AND_STATIC_H +#define SHARED_AND_STATIC_H + +#include "libshared_and_static_export.h" + +class LIBSHARED_AND_STATIC_EXPORT LibsharedAndStatic { +public: + int libshared_and_static() const; + +#ifdef COMPILER_IS_MSVC + int libshared_and_static_exported() const; +#else + int LIBSHARED_AND_STATIC_EXPORT libshared_and_static_exported() const; +#endif + + int LIBSHARED_AND_STATIC_DEPRECATED libshared_and_static_deprecated() const; + + int libshared_and_static_not_exported() const; + + int LIBSHARED_AND_STATIC_NO_EXPORT libshared_and_static_excluded() const; +}; + +class LibsharedAndStaticNotExported { +public: + int libshared_and_static() const; + + int LIBSHARED_AND_STATIC_EXPORT libshared_and_static_exported() const; + + int LIBSHARED_AND_STATIC_DEPRECATED libshared_and_static_deprecated() const; + + int libshared_and_static_not_exported() const; + + int LIBSHARED_AND_STATIC_NO_EXPORT libshared_and_static_excluded() const; +}; + +class LIBSHARED_AND_STATIC_NO_EXPORT LibsharedAndStaticExcluded { +public: + int libshared_and_static() const; + + int LIBSHARED_AND_STATIC_EXPORT libshared_and_static_exported() const; + + int LIBSHARED_AND_STATIC_DEPRECATED libshared_and_static_deprecated() const; + + int libshared_and_static_not_exported() const; + + int LIBSHARED_AND_STATIC_NO_EXPORT libshared_and_static_excluded() const; +}; + +LIBSHARED_AND_STATIC_EXPORT int libshared_and_static_exported(); + +LIBSHARED_AND_STATIC_DEPRECATED int libshared_and_static_deprecated(); + +int libshared_and_static_not_exported(); + +int LIBSHARED_AND_STATIC_NO_EXPORT libshared_and_static_excluded(); + +#endif diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt new file mode 100644 index 000000000..2030de68b --- /dev/null +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt @@ -0,0 +1,23 @@ + +macro(shared_variant_build_pass Source Message) + build_pass("libshared_and_static.h" "shared_variant" "lib_shared_and_static" "${Source}" ${Message}) +endmacro() + +macro(shared_variant_build_fail Source Message) + build_fail("libshared_and_static.h" "shared_variant" "lib_shared_and_static" "${Source}" ${Message}) +endmacro() + +macro(static_variant_build_pass Source Message) + build_pass("libshared_and_static.h" "static_variant" "lib_shared_and_static" "${Source}" ${Message}) +endmacro() + +macro(static_variant_build_fail Source Message) + build_fail("libshared_and_static.h" "static_variant" "lib_shared_and_static" "${Source}" ${Message}) +endmacro() + +static_variant_build_pass("return libshared_and_static_exported();" "Failed to build static variant") +shared_variant_build_pass("return libshared_and_static_exported();" "Failed to build shared variant") +shared_variant_build_fail("return libshared_and_static_deprecated();" "Built shared deprecated variant") +static_variant_build_fail("return libshared_and_static_deprecated();" "Built static deprecated variant") +static_variant_build_pass("return libshared_and_static_not_exported();" "Failed to build static not exported variant") +shared_variant_build_fail("return libshared_and_static_not_exported();" "Built shared not exported variant") diff --git a/Tests/Module/GenerateExportHeader/libshared/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libshared/CMakeLists.txt new file mode 100644 index 000000000..8e4ee2b31 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/libshared/CMakeLists.txt @@ -0,0 +1,6 @@ + +project(libshared) + +add_library(libshared SHARED libshared.cpp) + +generate_export_header(libshared) diff --git a/Tests/Module/GenerateExportHeader/libshared/libshared.cpp b/Tests/Module/GenerateExportHeader/libshared/libshared.cpp new file mode 100644 index 000000000..9812f5569 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/libshared/libshared.cpp @@ -0,0 +1,91 @@ + +#include "libshared.h" + +int Libshared::libshared() const +{ + return 0; +} + +int Libshared::libshared_exported() const +{ + return 0; +} + +int Libshared::libshared_deprecated() const +{ + return 0; +} + +int Libshared::libshared_not_exported() const { + return 0; +} + +int Libshared::libshared_excluded() const { + return 0; +} + +int LibsharedNotExported::libshared() const +{ + return 0; +} + +int LibsharedNotExported::libshared_exported() const +{ + return 0; +} + +int LibsharedNotExported::libshared_deprecated() const +{ + return 0; +} + +int LibsharedNotExported::libshared_not_exported() const { + return 0; +} + +int LibsharedNotExported::libshared_excluded() const { + return 0; +} + +int LibsharedExcluded::libshared() const +{ + return 0; +} + +int LibsharedExcluded::libshared_exported() const +{ + return 0; +} + +int LibsharedExcluded::libshared_deprecated() const +{ + return 0; +} + +int LibsharedExcluded::libshared_not_exported() const { + return 0; +} + +int LibsharedExcluded::libshared_excluded() const { + return 0; +} + +int libshared() { + return 0; +} + +int libshared_exported() { + return 0; +} + +int libshared_deprecated() { + return 0; +} + +int libshared_not_exported() { + return 0; +} + +int libshared_excluded() { + return 0; +} \ No newline at end of file diff --git a/Tests/Module/GenerateExportHeader/libshared/libshared.h b/Tests/Module/GenerateExportHeader/libshared/libshared.h new file mode 100644 index 000000000..280e18571 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/libshared/libshared.h @@ -0,0 +1,59 @@ + +#ifndef LIBSHARED_H +#define LIBSHARED_H + +#include "libshared_export.h" + +class LIBSHARED_EXPORT Libshared { +public: + int libshared() const; + +#ifdef COMPILER_IS_MSVC + // Double exporting not possible with MSVC + int libshared_exported() const; +#else + int LIBSHARED_EXPORT libshared_exported() const; +#endif + + int LIBSHARED_DEPRECATED libshared_deprecated() const; + + int libshared_not_exported() const; + + int LIBSHARED_NO_EXPORT libshared_excluded() const; +}; + +class LibsharedNotExported { +public: + int libshared() const; + + int LIBSHARED_EXPORT libshared_exported() const; + + int LIBSHARED_DEPRECATED_EXPORT libshared_deprecated() const; + + int libshared_not_exported() const; + + int LIBSHARED_NO_EXPORT libshared_excluded() const; +}; + +class LIBSHARED_NO_EXPORT LibsharedExcluded { +public: + int libshared() const; + + int LIBSHARED_EXPORT libshared_exported() const; + + int LIBSHARED_DEPRECATED_EXPORT libshared_deprecated() const; + + int libshared_not_exported() const; + + int LIBSHARED_NO_EXPORT libshared_excluded() const; +}; + +LIBSHARED_EXPORT int libshared_exported(); + +LIBSHARED_DEPRECATED_EXPORT int libshared_deprecated(); + +int libshared_not_exported(); + +int LIBSHARED_NO_EXPORT libshared_excluded(); + +#endif diff --git a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt new file mode 100644 index 000000000..7a05205b4 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt @@ -0,0 +1,27 @@ + +macro(shared_build_pass Source Message) + build_pass("libshared.h" "libshared" "libshared" "${Source}" ${Message}) +endmacro() + +macro(shared_build_fail Source Message) + build_fail("libshared.h" "libshared" "libshared" "${Source}" ${Message}) +endmacro() + +shared_build_pass("Libshared l; return l.libshared_exported();" "Failed to build exported") + +shared_build_fail("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") +if (COMPILER_HAS_HIDDEN_VISIBILITY) + shared_build_fail("Libshared l; return l.libshared_excluded();" "Built use of excluded class method. This should not be possible.") +else() + # There is no MSVC equivalent to hiding symbols. + shared_build_pass("Libshared l; return l.libshared_excluded();" "Built use of excluded class method. This is possible on MSVC.") +endif() +shared_build_fail("LibsharedNotExported l; return l.libshared();" "Built use of not-exported class method. This should not be possible.") +shared_build_fail("LibsharedNotExported l; return l.libshared_not_exported();" "Built use of not-exported class method. This should not be possible.") +shared_build_fail("LibsharedNotExported l; return l.libshared_excluded();" "Built use of not-exported class method. This should not be possible.") +shared_build_fail("LibsharedExcluded l; return l.libshared();" "Built use of excluded class method. This should not be possible.") +shared_build_fail("LibsharedExcluded l; return l.libshared_not_exported();" "Built use of excluded class method. This should not be possible.") +shared_build_fail("LibsharedExcluded l; return l.libshared_excluded();" "Built use of excluded class method. This should not be possible.") + +shared_build_fail("return libshared_excluded();" "Built use of excluded function. This should not be possible.") +shared_build_fail("return libshared_not_exported();" "Built use of not-exported function. This should not be possible.") diff --git a/Tests/Module/GenerateExportHeader/libstatic/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libstatic/CMakeLists.txt new file mode 100644 index 000000000..8db182710 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/libstatic/CMakeLists.txt @@ -0,0 +1,8 @@ + +project(libstatic) + +# Show that the export header has no effect on a static library. + +add_library(libstatic STATIC libstatic.cpp) + +generate_export_header(libstatic) diff --git a/Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp b/Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp new file mode 100644 index 000000000..c8b7d4454 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp @@ -0,0 +1,87 @@ + +#include "libstatic.h" + +int Libstatic::libstatic() const +{ + return 0; +} + +int Libstatic::libstatic_exported() const +{ + return 0; +} + +int Libstatic::libstatic_deprecated() const +{ + return 0; +} + +int Libstatic::libstatic_not_exported() const { + return 0; +} + +int Libstatic::libstatic_excluded() const { + return 0; +} + +int LibstaticNotExported::libstatic() const +{ + return 0; +} + +int LibstaticNotExported::libstatic_exported() const +{ + return 0; +} + +int LibstaticNotExported::libstatic_deprecated() const +{ + return 0; +} + +int LibstaticNotExported::libstatic_not_exported() const { + return 0; +} + +int LibstaticNotExported::libstatic_excluded() const { + return 0; +} + +int LibstaticExcluded::libstatic() const +{ + return 0; +} + +int LibstaticExcluded::libstatic_exported() const +{ + return 0; +} + +int LibstaticExcluded::libstatic_deprecated() const +{ + return 0; +} + +int LibstaticExcluded::libstatic_not_exported() const { + return 0; +} + +int LibstaticExcluded::libstatic_excluded() const { + return 0; +} + +int libstatic_exported() { + return 0; +} + +int libstatic_deprecated() { + return 0; +} + +int libstatic_not_exported() { + return 0; +} + +int libstatic_excluded() { + return 0; +} \ No newline at end of file diff --git a/Tests/Module/GenerateExportHeader/libstatic/libstatic.h b/Tests/Module/GenerateExportHeader/libstatic/libstatic.h new file mode 100644 index 000000000..c6562ecb6 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/libstatic/libstatic.h @@ -0,0 +1,54 @@ + +#ifndef LIBSTATIC_H +#define LIBSTATIC_H + +#include "libstatic_export.h" + +class LIBSTATIC_EXPORT Libstatic { +public: + int libstatic() const; + + int LIBSTATIC_EXPORT libstatic_exported() const; + + int LIBSTATIC_DEPRECATED libstatic_deprecated() const; + + int libstatic_not_exported() const; + + int LIBSTATIC_NO_EXPORT libstatic_excluded() const; +}; + +class LibstaticNotExported { +public: + int libstatic() const; + + int LIBSTATIC_EXPORT libstatic_exported() const; + + int LIBSTATIC_DEPRECATED libstatic_deprecated() const; + + int libstatic_not_exported() const; + + int LIBSTATIC_NO_EXPORT libstatic_excluded() const; +}; + +class LIBSTATIC_NO_EXPORT LibstaticExcluded { +public: + int libstatic() const; + + int LIBSTATIC_EXPORT libstatic_exported() const; + + int LIBSTATIC_DEPRECATED libstatic_deprecated() const; + + int libstatic_not_exported() const; + + int LIBSTATIC_NO_EXPORT libstatic_excluded() const; +}; + +LIBSTATIC_EXPORT int libstatic_exported(); + +LIBSTATIC_DEPRECATED int libstatic_deprecated(); + +int libstatic_not_exported(); + +int LIBSTATIC_NO_EXPORT libstatic_excluded(); + +#endif diff --git a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt new file mode 100644 index 000000000..58b875a07 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt @@ -0,0 +1,13 @@ + +macro(static_build_pass Source Message) + build_pass("libstatic.h" "libstatic" "libstatic" "${Source}" ${Message}) +endmacro() + +macro(static_build_fail Source Message) + build_fail("libstatic.h" "libstatic" "libstatic" "${Source}" ${Message}) +endmacro() + +static_build_pass("Libstatic l; return l.libstatic_exported();" "Failed to build exported.") + +static_build_fail("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") +static_build_fail("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") From def0a54e0ae20d783aecf2761a4add5f40687cd6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 8 Aug 2011 02:08:10 +0200 Subject: [PATCH 02/72] Handle the case where the user changes the DEFINE_SYMBOL property. This eases porting of KDE code. --- Modules/GenerateExportHeader.cmake | 6 ++++++ Modules/exportheader.cmake.in | 2 +- Tests/Module/GenerateExportHeader/CMakeLists.txt | 2 ++ .../override_symbol/CMakeLists.txt | 11 +++++++++++ .../GenerateExportHeader/override_symbol/main.cpp | 9 +++++++++ .../override_symbol/someclass.cpp | 7 +++++++ .../GenerateExportHeader/override_symbol/someclass.h | 8 ++++++++ 7 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Tests/Module/GenerateExportHeader/override_symbol/CMakeLists.txt create mode 100644 Tests/Module/GenerateExportHeader/override_symbol/main.cpp create mode 100644 Tests/Module/GenerateExportHeader/override_symbol/someclass.cpp create mode 100644 Tests/Module/GenerateExportHeader/override_symbol/someclass.h diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index c7178999b..3665817f7 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -188,6 +188,12 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) set(INCLUDE_GUARD_NAME "${PREFIX}${EXPORT_MACRO_NAME}_H") + get_target_property(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY} DEFINE_SYMBOL) + + if (NOT EXPORT_IMPORT_CONDITION) + set(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY}_EXPORTS) + endif() + configure_file(${myDir}/exportheader.cmake.in ${EXPORT_FILE_NAME} @ONLY) endmacro() diff --git a/Modules/exportheader.cmake.in b/Modules/exportheader.cmake.in index 083e95cbc..62ed3ff92 100644 --- a/Modules/exportheader.cmake.in +++ b/Modules/exportheader.cmake.in @@ -7,7 +7,7 @@ # define @NO_EXPORT_MACRO_NAME@ #else # ifndef @EXPORT_MACRO_NAME@ -# ifdef @TARGET_LIBRARY@_EXPORTS +# ifdef @EXPORT_IMPORT_CONDITION@ /* We are building this library */ # define @EXPORT_MACRO_NAME@ @DEFINE_EXPORT@ # else diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 2d6eabe06..457028092 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -107,6 +107,8 @@ macro_add_test_library(libstatic) add_subdirectory(lib_shared_and_static) add_subdirectory(lib_shared_and_statictest) +add_subdirectory(override_symbol) + if (CMAKE_COMPILER_IS_GNUCXX) # We deliberately call deprecated methods, and test for that elsewhere. # No need to clutter the test output with warnings. diff --git a/Tests/Module/GenerateExportHeader/override_symbol/CMakeLists.txt b/Tests/Module/GenerateExportHeader/override_symbol/CMakeLists.txt new file mode 100644 index 000000000..aeeef20ee --- /dev/null +++ b/Tests/Module/GenerateExportHeader/override_symbol/CMakeLists.txt @@ -0,0 +1,11 @@ +project(override_symbol) + +add_library(somelib SHARED someclass.cpp) + +set_target_properties(somelib PROPERTIES DEFINE_SYMBOL SOMELIB_MAKEDLL) + +generate_export_header(somelib) + +add_executable(consumer main.cpp) + +target_link_libraries(consumer somelib) diff --git a/Tests/Module/GenerateExportHeader/override_symbol/main.cpp b/Tests/Module/GenerateExportHeader/override_symbol/main.cpp new file mode 100644 index 000000000..445a65204 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/override_symbol/main.cpp @@ -0,0 +1,9 @@ + +#include "someclass.h" + +int main(int, char**) +{ + SomeClass sc; + sc.someMethod(); + return 0; +} \ No newline at end of file diff --git a/Tests/Module/GenerateExportHeader/override_symbol/someclass.cpp b/Tests/Module/GenerateExportHeader/override_symbol/someclass.cpp new file mode 100644 index 000000000..7326b780a --- /dev/null +++ b/Tests/Module/GenerateExportHeader/override_symbol/someclass.cpp @@ -0,0 +1,7 @@ + +#include "someclass.h" + +void SomeClass::someMethod() const +{ + +} \ No newline at end of file diff --git a/Tests/Module/GenerateExportHeader/override_symbol/someclass.h b/Tests/Module/GenerateExportHeader/override_symbol/someclass.h new file mode 100644 index 000000000..ae5e84454 --- /dev/null +++ b/Tests/Module/GenerateExportHeader/override_symbol/someclass.h @@ -0,0 +1,8 @@ + +#include "somelib_export.h" + +class SOMELIB_EXPORT SomeClass +{ +public: + void someMethod() const; +}; From 896371661504fa0a3b5c7a611dbfc7a4bc44a889 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 9 Aug 2011 00:18:00 +0200 Subject: [PATCH 03/72] Add a newline at the end of the file. Hopefully fix the test execution reported on CDash. --- Tests/Module/GenerateExportHeader/libshared/libshared.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/libshared/libshared.cpp b/Tests/Module/GenerateExportHeader/libshared/libshared.cpp index 9812f5569..d4041b36d 100644 --- a/Tests/Module/GenerateExportHeader/libshared/libshared.cpp +++ b/Tests/Module/GenerateExportHeader/libshared/libshared.cpp @@ -88,4 +88,4 @@ int libshared_not_exported() { int libshared_excluded() { return 0; -} \ No newline at end of file +} From 706ed2b1b0376c8f6bce064315d83b564931d811 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 9 Aug 2011 00:18:00 +0200 Subject: [PATCH 04/72] Add a newline at the end of the file. Hopefully fix the test execution reported on CDash. --- Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp b/Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp index c8b7d4454..0710c3e9e 100644 --- a/Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp +++ b/Tests/Module/GenerateExportHeader/libstatic/libstatic.cpp @@ -84,4 +84,4 @@ int libstatic_not_exported() { int libstatic_excluded() { return 0; -} \ No newline at end of file +} From b19911ecab8178230ef5f1605e7730f842b39633 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 9 Aug 2011 19:03:16 +0200 Subject: [PATCH 05/72] Add missing licence header. --- Modules/GenerateExportHeader.cmake | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 3665817f7..67a16a932 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -98,6 +98,20 @@ # # This will cause the export macros to expand to nothing when building the static library. + +#============================================================================= +# Copyright 2011 Stephen Kelly +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + include(CMakeParseArguments) include(CheckCXXCompilerFlag) From 4718233a37f0180b1716db31df090a3f649e854a Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 10:24:04 +0200 Subject: [PATCH 06/72] Remove the fatal_warnings option which is no longer used. --- Modules/GenerateExportHeader.cmake | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 67a16a932..659b32ab9 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -232,18 +232,6 @@ function(add_compiler_export_flags) return() endif() - set(options) - set(oneValueArgs FATAL_WARNINGS) - set(multiValueArgs) - - cmake_parse_arguments(_EGHV "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - set(MESSAGE_TYPE WARNING) - - if(_EGHV_FATAL_WARNINGS) - set(MESSAGE_TYPE FATAL_ERROR) - endif() - if (CMAKE_COMPILER_IS_GNUCXX) exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") From 3b188c833b1d349dd610d5f5c929804d34b1967f Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 10:26:16 +0200 Subject: [PATCH 07/72] Test for features, not specific compilers. --- Modules/GenerateExportHeader.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 659b32ab9..73ed5e2ee 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -228,7 +228,9 @@ endfunction() function(add_compiler_export_flags) - if(NOT CMAKE_COMPILER_IS_GNUCXX OR MINGW) + _test_compiler_hidden_visibility() + + if(NOT (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR MINGW) return() endif() @@ -246,8 +248,6 @@ function(add_compiler_export_flags) endif() endif() - _test_compiler_hidden_visibility() - if(USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) set (EXTRA_FLAGS "-fvisibility=hidden") From c7a937b71258d063bdcd0249b927bcd987ab3273 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 10:28:15 +0200 Subject: [PATCH 08/72] Simplify. We already know we have hidden visibility at this point. --- Modules/GenerateExportHeader.cmake | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 73ed5e2ee..6ee7bd72b 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -248,12 +248,10 @@ function(add_compiler_export_flags) endif() endif() - if(USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) - set (EXTRA_FLAGS "-fvisibility=hidden") + set (EXTRA_FLAGS "-fvisibility=hidden") - if(COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) - set (EXTRA_FLAGS "${EXTRA_FLAGS} -fvisibility-inlines-hidden") - endif() + if(COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) + set (EXTRA_FLAGS "${EXTRA_FLAGS} -fvisibility-inlines-hidden") endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}" PARENT_SCOPE) endfunction() \ No newline at end of file From 3574b759160bc4609fb799862e75a33b25c932e7 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 10:32:58 +0200 Subject: [PATCH 09/72] Simplify the compiler feature check --- Modules/GenerateExportHeader.cmake | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 6ee7bd72b..978a92445 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -142,12 +142,10 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) if(WIN32) set(DEFINE_EXPORT "__declspec(dllexport)") set(DEFINE_IMPORT "__declspec(dllimport)") - elseif(CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Intel AND UNIX)) - if(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) - set(DEFINE_EXPORT "__attribute__((visibility(\"default\")))") - set(DEFINE_IMPORT "__attribute__((visibility(\"default\")))") - set(DEFINE_NO_EXPORT "__attribute__((visibility(\"hidden\")))") - endif() + elseif(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) + set(DEFINE_EXPORT "__attribute__((visibility(\"default\")))") + set(DEFINE_IMPORT "__attribute__((visibility(\"default\")))") + set(DEFINE_NO_EXPORT "__attribute__((visibility(\"hidden\")))") endif() endif() endmacro() From d123bce1ebb9ef8406272fece45e44b66b3df11a Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 10:33:14 +0200 Subject: [PATCH 10/72] Add some debug output. Hopefully this shows up in continuous test output. --- Modules/GenerateExportHeader.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 978a92445..7e644b1f9 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -229,6 +229,7 @@ function(add_compiler_export_flags) _test_compiler_hidden_visibility() if(NOT (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR MINGW) + message(WARNING "Compiler doesn't have hidden visibility") return() endif() @@ -242,6 +243,7 @@ function(add_compiler_export_flags) endif() if(${_gcc_version} VERSION_LESS "4.2") + message(WARNING "GCC version older than 4.2") return() endif() endif() From 6aca0e257be36949299b28cbfa12225269e28a03 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 10:41:38 +0200 Subject: [PATCH 11/72] Short-circuit the tests on unsupported compilers. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 457028092..52fe79f6b 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -88,6 +88,12 @@ include(GenerateExportHeader) add_compiler_export_flags() +if(NOT ((USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR WIN32)) + message(WARNING "Compiler does not support export feature") + return() +endif() + + if (MSVC) add_definitions(-DCOMPILER_IS_MSVC) endif() From ffaa127b191a6be0463160dd433b513ce28d8fe9 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 11:34:31 +0200 Subject: [PATCH 12/72] Test expected no-op instead of aborting the build. Aborting causes make clean to fail if the executable is not created. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 52fe79f6b..4f40b9259 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -76,7 +76,10 @@ endmacro() macro(build_fail Include Library LibrarySource Source Message) _do_build(${Include} ${Library} ${LibrarySource} "${Source}") - test_fail(Result ${Message}) + if((USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR WIN32) + test_fail(Result ${Message}) + endif() + test_pass(Result ${Message}) endmacro() macro(build_pass Include Library LibrarySource Source Message) @@ -88,12 +91,6 @@ include(GenerateExportHeader) add_compiler_export_flags() -if(NOT ((USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR WIN32)) - message(WARNING "Compiler does not support export feature") - return() -endif() - - if (MSVC) add_definitions(-DCOMPILER_IS_MSVC) endif() From 44430379b778b71f59d36c52870e5256ab456fd6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 13:41:47 +0200 Subject: [PATCH 13/72] Fix tests with clang. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 4f40b9259..fd541dc82 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -44,7 +44,7 @@ macro(_do_build Include Library LibrarySource Source) "add_compiler_export_flags()\n" - "if(CMAKE_COMPILER_IS_GNUCXX)\n" + "if(CMAKE_COMPILER_IS_GNUCXXOR OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))\n" " add_definitions(-Werror)\n" "else()\n" " if(MSVC)\n" @@ -76,10 +76,11 @@ endmacro() macro(build_fail Include Library LibrarySource Source Message) _do_build(${Include} ${Library} ${LibrarySource} "${Source}") - if((USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR WIN32) + if((USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR WIN32 OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang)) test_fail(Result ${Message}) - endif() + else() test_pass(Result ${Message}) + endif() endmacro() macro(build_pass Include Library LibrarySource Source Message) @@ -112,7 +113,7 @@ add_subdirectory(lib_shared_and_statictest) add_subdirectory(override_symbol) -if (CMAKE_COMPILER_IS_GNUCXX) +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") From 002ddf253c75b88b9eb6b3f4540511178092e903 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 14:58:00 +0200 Subject: [PATCH 14/72] Fix typo and tests failing as a result. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index fd541dc82..140b39919 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -44,7 +44,7 @@ macro(_do_build Include Library LibrarySource Source) "add_compiler_export_flags()\n" - "if(CMAKE_COMPILER_IS_GNUCXXOR OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))\n" + "if(CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))\n" " add_definitions(-Werror)\n" "else()\n" " if(MSVC)\n" From 61726f867eef69bea9237fb0b20c29b1ab3e35c1 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 15:16:28 +0200 Subject: [PATCH 15/72] Only run the failure tests with gcc >= 4.2 --- .../Module/GenerateExportHeader/CMakeLists.txt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 140b39919..637408788 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -74,9 +74,24 @@ macro(_do_build Include Library LibrarySource Source) ) endmacro() +if (CMAKE_COMPILER_IS_GNUCXX) + exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) + string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") + # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the + # patch level, handle this here: + if(NOT _gcc_version) + string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") + endif() + + if(${_gcc_version} VERSION_LESS "4.2") + set(GCC_IS_LESS_THAN_4_2 TRUE) + message(WARNING "GCC version older than 4.2. Actual version: ${_gcc_version}") + endif() +endif() + macro(build_fail Include Library LibrarySource Source Message) _do_build(${Include} ${Library} ${LibrarySource} "${Source}") - if((USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR WIN32 OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang)) + if(NOT GCC_IS_LESS_THAN_4_2 AND (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR WIN32 OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang)) test_fail(Result ${Message}) else() test_pass(Result ${Message}) From af443b830b550454cf9bdd21a49183eb6e4ba22e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 21:01:42 +0200 Subject: [PATCH 16/72] Set the CMAKE_RUNTIME_OUTPUT_DIRECTORY for windows builds. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 637408788..0cc67a9aa 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -40,6 +40,8 @@ macro(_do_build Include Library LibrarySource Source) "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" @@ -111,6 +113,8 @@ if (MSVC) add_definitions(-DCOMPILER_IS_MSVC) endif() +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set(link_libraries) macro(macro_add_test_library name) add_subdirectory(${name}) From cff94935982def7302cca11d521bf55587b8ebf7 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 21:13:33 +0200 Subject: [PATCH 17/72] Only set the COMPILER_HAS_HIDDEN_VISIBILITY if GCC >= 4.2 Hearsay has it that before that version it didn't work properly. Hopefully this will fix more dashboard builds. --- Modules/GenerateExportHeader.cmake | 41 ++++++++++--------- .../GenerateExportHeader/CMakeLists.txt | 17 +------- 2 files changed, 23 insertions(+), 35 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 7e644b1f9..cb7b0d84f 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -116,10 +116,28 @@ include(CMakeParseArguments) include(CheckCXXCompilerFlag) macro(_test_compiler_hidden_visibility) - check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) - check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) - option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) - mark_as_advanced(USE_COMPILER_HIDDEN_VISIBILITY) + + if (CMAKE_COMPILER_IS_GNUCXX) + exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) + string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") + # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the + # patch level, handle this here: + if(NOT _gcc_version) + string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") + endif() + + if(${_gcc_version} VERSION_LESS "4.2") + set(GCC_TOO_OLD TRUE) + message(WARNING "GCC version older than 4.2") + endif() + endif() + + if (NOT GCC_TOO_OLD) + check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) + check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) + option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) + mark_as_advanced(USE_COMPILER_HIDDEN_VISIBILITY) + endif() endmacro() set(myDir ${CMAKE_CURRENT_LIST_DIR}) @@ -233,21 +251,6 @@ function(add_compiler_export_flags) return() endif() - if (CMAKE_COMPILER_IS_GNUCXX) - exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) - string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") - # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the - # patch level, handle this here: - if(NOT _gcc_version) - string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") - endif() - - if(${_gcc_version} VERSION_LESS "4.2") - message(WARNING "GCC version older than 4.2") - return() - endif() - endif() - set (EXTRA_FLAGS "-fvisibility=hidden") if(COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 0cc67a9aa..064b9e3b1 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -76,24 +76,9 @@ macro(_do_build Include Library LibrarySource Source) ) endmacro() -if (CMAKE_COMPILER_IS_GNUCXX) - exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) - string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") - # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the - # patch level, handle this here: - if(NOT _gcc_version) - string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") - endif() - - if(${_gcc_version} VERSION_LESS "4.2") - set(GCC_IS_LESS_THAN_4_2 TRUE) - message(WARNING "GCC version older than 4.2. Actual version: ${_gcc_version}") - endif() -endif() - macro(build_fail Include Library LibrarySource Source Message) _do_build(${Include} ${Library} ${LibrarySource} "${Source}") - if(NOT GCC_IS_LESS_THAN_4_2 AND (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR WIN32 OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang)) + if(COMPILER_HAS_HIDDEN_VISIBILITY OR WIN32 OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang)) test_fail(Result ${Message}) else() test_pass(Result ${Message}) From bab4a22036a988f49e1b711d092416c18cc16870 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 21:28:42 +0200 Subject: [PATCH 18/72] Disable all export macros on Borland. --- Modules/GenerateExportHeader.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index cb7b0d84f..1395f15b4 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -148,7 +148,7 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_IMPORT) set(DEFINE_NO_EXPORT) - if(WIN32) + if(WIN32 AND NOT (${CMAKE_CXX_COMPILER_ID} MATCHES Borland)) set(DEFINE_DEPRECATED "__declspec(deprecated)") else() set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") @@ -157,7 +157,7 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) if(NOT ${type} STREQUAL "STATIC_LIBRARY") - if(WIN32) + if(WIN32 AND NOT (${CMAKE_CXX_COMPILER_ID} MATCHES Borland)) set(DEFINE_EXPORT "__declspec(dllexport)") set(DEFINE_IMPORT "__declspec(dllimport)") elseif(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) From fc3772edc9efc924f9d76c630719914c556e1d4e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 21:43:16 +0200 Subject: [PATCH 19/72] Another attempt to fix the tests on Borland. --- Modules/GenerateExportHeader.cmake | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 1395f15b4..1578365d1 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -148,8 +148,10 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_IMPORT) set(DEFINE_NO_EXPORT) - if(WIN32 AND NOT (${CMAKE_CXX_COMPILER_ID} MATCHES Borland)) - set(DEFINE_DEPRECATED "__declspec(deprecated)") + if(WIN32) + if (${CMAKE_CXX_COMPILER_ID} MATCHES Borland) + set(DEFINE_DEPRECATED "__declspec(deprecated)") + endif() else() set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") endif() @@ -157,9 +159,11 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) if(NOT ${type} STREQUAL "STATIC_LIBRARY") - if(WIN32 AND NOT (${CMAKE_CXX_COMPILER_ID} MATCHES Borland)) - set(DEFINE_EXPORT "__declspec(dllexport)") - set(DEFINE_IMPORT "__declspec(dllimport)") + if(WIN32) + if (NOT (${CMAKE_CXX_COMPILER_ID} MATCHES Borland)) + set(DEFINE_EXPORT "__declspec(dllexport)") + set(DEFINE_IMPORT "__declspec(dllimport)") + endif() elseif(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) set(DEFINE_EXPORT "__attribute__((visibility(\"default\")))") set(DEFINE_IMPORT "__attribute__((visibility(\"default\")))") From b4434591fb70a424510a331b68d5f472da93fcf6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 21:50:06 +0200 Subject: [PATCH 20/72] Use the correct project name compiletest not compilefail Should fix windows VS solution based builds. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 064b9e3b1..eb19afbc8 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -71,7 +71,7 @@ macro(_do_build Include Library LibrarySource Source) try_compile(Result ${CMAKE_CURRENT_BINARY_DIR}/fail${COUNT} ${CMAKE_CURRENT_BINARY_DIR}/test${COUNT} - compilefail + compiletest OUTPUT_VARIABLE Out ) endmacro() From 50460ea9de40d7c8ef631bbdb5d44b9aa4c14718 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 21:53:58 +0200 Subject: [PATCH 21/72] Fix off-by-not in test for Borland. --- Modules/GenerateExportHeader.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 1578365d1..5ecb80744 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -149,7 +149,7 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_NO_EXPORT) if(WIN32) - if (${CMAKE_CXX_COMPILER_ID} MATCHES Borland) + if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) set(DEFINE_DEPRECATED "__declspec(deprecated)") endif() else() From 7924c1d6a8db87ded487e744ba3e8881e8336d00 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 22:19:39 +0200 Subject: [PATCH 22/72] Another attempt at fixing Borland. Apparently it still needs to be exported, but only declspec(deprecated) does not work. --- Modules/GenerateExportHeader.cmake | 6 ++---- .../lib_shared_and_statictest/CMakeLists.txt | 9 +++++++-- .../GenerateExportHeader/libsharedtest/CMakeLists.txt | 6 +++++- .../GenerateExportHeader/libstatictest/CMakeLists.txt | 4 +++- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 5ecb80744..c921d8913 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -160,10 +160,8 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) if(NOT ${type} STREQUAL "STATIC_LIBRARY") if(WIN32) - if (NOT (${CMAKE_CXX_COMPILER_ID} MATCHES Borland)) - set(DEFINE_EXPORT "__declspec(dllexport)") - set(DEFINE_IMPORT "__declspec(dllimport)") - endif() + set(DEFINE_EXPORT "__declspec(dllexport)") + set(DEFINE_IMPORT "__declspec(dllimport)") elseif(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) set(DEFINE_EXPORT "__attribute__((visibility(\"default\")))") set(DEFINE_IMPORT "__attribute__((visibility(\"default\")))") diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt index 2030de68b..d25eed07f 100644 --- a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt @@ -17,7 +17,12 @@ endmacro() static_variant_build_pass("return libshared_and_static_exported();" "Failed to build static variant") shared_variant_build_pass("return libshared_and_static_exported();" "Failed to build shared variant") -shared_variant_build_fail("return libshared_and_static_deprecated();" "Built shared deprecated variant") -static_variant_build_fail("return libshared_and_static_deprecated();" "Built static deprecated variant") +if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) + shared_variant_build_fail("return libshared_and_static_deprecated();" "Built shared deprecated variant") + static_variant_build_fail("return libshared_and_static_deprecated();" "Built static deprecated variant") +else() + shared_variant_build_pass("return libshared_and_static_deprecated();" "Built shared deprecated variant") + static_variant_build_pass("return libshared_and_static_deprecated();" "Built static deprecated variant") +endif() static_variant_build_pass("return libshared_and_static_not_exported();" "Failed to build static not exported variant") shared_variant_build_fail("return libshared_and_static_not_exported();" "Built shared not exported variant") diff --git a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt index 7a05205b4..9edc53fcb 100644 --- a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt @@ -9,7 +9,11 @@ endmacro() shared_build_pass("Libshared l; return l.libshared_exported();" "Failed to build exported") -shared_build_fail("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") +if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) + shared_build_fail("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") +else() + shared_build_pass("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") +endif() if (COMPILER_HAS_HIDDEN_VISIBILITY) shared_build_fail("Libshared l; return l.libshared_excluded();" "Built use of excluded class method. This should not be possible.") else() diff --git a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt index 58b875a07..a41b168a6 100644 --- a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt @@ -9,5 +9,7 @@ endmacro() static_build_pass("Libstatic l; return l.libstatic_exported();" "Failed to build exported.") -static_build_fail("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") +if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) + static_build_fail("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") +endif() static_build_fail("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") From 7fa559232e6bca09c0f24c0a3da2a83a5c395be3 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 10 Aug 2011 23:57:04 +0200 Subject: [PATCH 23/72] Add some debug output to narrow down deprecation test issues Particularly Borland and VS7.0 seem to still be failing. --- Modules/GenerateExportHeader.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index c921d8913..9dd8f4a2e 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -149,7 +149,9 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_NO_EXPORT) if(WIN32) + message("Compiler is ${CMAKE_CXX_COMPILER_ID}") if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) + message("Deprecation macro enabled.") set(DEFINE_DEPRECATED "__declspec(deprecated)") endif() else() From 3f7e03643d5437ec494956f2678c7b3c905d8250 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 00:18:33 +0200 Subject: [PATCH 24/72] Export deprecated free methods too. That way they can be linked to even after being deprecated. --- .../lib_shared_and_static/libshared_and_static.h | 2 +- Tests/Module/GenerateExportHeader/libstatic/libstatic.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h b/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h index 7df769460..400d66471 100644 --- a/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h @@ -49,7 +49,7 @@ public: LIBSHARED_AND_STATIC_EXPORT int libshared_and_static_exported(); -LIBSHARED_AND_STATIC_DEPRECATED int libshared_and_static_deprecated(); +LIBSHARED_AND_STATIC_DEPRECATED_EXPORT int libshared_and_static_deprecated(); int libshared_and_static_not_exported(); diff --git a/Tests/Module/GenerateExportHeader/libstatic/libstatic.h b/Tests/Module/GenerateExportHeader/libstatic/libstatic.h index c6562ecb6..cd68cdc78 100644 --- a/Tests/Module/GenerateExportHeader/libstatic/libstatic.h +++ b/Tests/Module/GenerateExportHeader/libstatic/libstatic.h @@ -45,7 +45,7 @@ public: LIBSTATIC_EXPORT int libstatic_exported(); -LIBSTATIC_DEPRECATED int libstatic_deprecated(); +LIBSTATIC_DEPRECATED_EXPORT int libstatic_deprecated(); int libstatic_not_exported(); From 1c6b41bee7fb1e2b85be4ab3497889ab72089f69 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 00:19:20 +0200 Subject: [PATCH 25/72] Remember to surround the other deprecated test in the Borland check. --- .../Module/GenerateExportHeader/libstatictest/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt index a41b168a6..168cae800 100644 --- a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt @@ -11,5 +11,8 @@ static_build_pass("Libstatic l; return l.libstatic_exported();" "Failed to build if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) static_build_fail("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") + static_build_fail("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") +else() + static_build_pass("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") + static_build_pass("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") endif() -static_build_fail("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") From 399f415b1558397e51502914ae36b6d055668eeb Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 10:28:50 +0200 Subject: [PATCH 26/72] Only set the deprecated attribute if hidden visibilty is enabled. This is what is tested in the unit test. If it makes sense, another option can be added later. --- Modules/GenerateExportHeader.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 9dd8f4a2e..0b93941d9 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -155,7 +155,9 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_DEPRECATED "__declspec(deprecated)") endif() else() - set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") + if(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) + set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") + endif() endif() get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) From 1f3be450486c9f3eb140a58fb9bf0f5ef4c858ab Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 10:39:51 +0200 Subject: [PATCH 27/72] Make sure the hidden visibility variables never get set on MINGW. --- Modules/GenerateExportHeader.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 0b93941d9..322439be7 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -132,7 +132,7 @@ macro(_test_compiler_hidden_visibility) endif() endif() - if (NOT GCC_TOO_OLD) + if (NOT GCC_TOO_OLD AND NOT MINGW) check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) @@ -252,7 +252,7 @@ function(add_compiler_export_flags) _test_compiler_hidden_visibility() - if(NOT (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY) OR MINGW) + if(NOT (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY)) message(WARNING "Compiler doesn't have hidden visibility") return() endif() From 750b67c5a1957f5fa2c7a483050f0ef0959c9924 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 10:53:58 +0200 Subject: [PATCH 28/72] Don't use hidden visibility on non-mingw windows either. --- Modules/GenerateExportHeader.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 322439be7..92b943368 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -132,7 +132,7 @@ macro(_test_compiler_hidden_visibility) endif() endif() - if (NOT GCC_TOO_OLD AND NOT MINGW) + if (NOT GCC_TOO_OLD AND NOT WIN32) check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) From 1590d5fe4f95a800635ba9078e822d742a96dc18 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 10:54:21 +0200 Subject: [PATCH 29/72] Don't export methods on already exported classes. This is always a mistake. --- .../lib_shared_and_static/libshared_and_static.h | 4 ---- Tests/Module/GenerateExportHeader/libshared/libshared.h | 5 ----- Tests/Module/GenerateExportHeader/libstatic/libstatic.h | 2 +- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h b/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h index 400d66471..049bfe9c4 100644 --- a/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_static/libshared_and_static.h @@ -8,11 +8,7 @@ class LIBSHARED_AND_STATIC_EXPORT LibsharedAndStatic { public: int libshared_and_static() const; -#ifdef COMPILER_IS_MSVC int libshared_and_static_exported() const; -#else - int LIBSHARED_AND_STATIC_EXPORT libshared_and_static_exported() const; -#endif int LIBSHARED_AND_STATIC_DEPRECATED libshared_and_static_deprecated() const; diff --git a/Tests/Module/GenerateExportHeader/libshared/libshared.h b/Tests/Module/GenerateExportHeader/libshared/libshared.h index 280e18571..3d9bbff4f 100644 --- a/Tests/Module/GenerateExportHeader/libshared/libshared.h +++ b/Tests/Module/GenerateExportHeader/libshared/libshared.h @@ -8,12 +8,7 @@ class LIBSHARED_EXPORT Libshared { public: int libshared() const; -#ifdef COMPILER_IS_MSVC - // Double exporting not possible with MSVC int libshared_exported() const; -#else - int LIBSHARED_EXPORT libshared_exported() const; -#endif int LIBSHARED_DEPRECATED libshared_deprecated() const; diff --git a/Tests/Module/GenerateExportHeader/libstatic/libstatic.h b/Tests/Module/GenerateExportHeader/libstatic/libstatic.h index cd68cdc78..cc7a35b4e 100644 --- a/Tests/Module/GenerateExportHeader/libstatic/libstatic.h +++ b/Tests/Module/GenerateExportHeader/libstatic/libstatic.h @@ -8,7 +8,7 @@ class LIBSTATIC_EXPORT Libstatic { public: int libstatic() const; - int LIBSTATIC_EXPORT libstatic_exported() const; + int libstatic_exported() const; int LIBSTATIC_DEPRECATED libstatic_deprecated() const; From 9554e1013ef5d9971092ed0cd45daf59b8a6bd87 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 18:17:12 +0200 Subject: [PATCH 30/72] Split the deprecated available check from setting macro values. --- Modules/GenerateExportHeader.cmake | 22 +++++++++++++++---- .../lib_shared_and_statictest/CMakeLists.txt | 2 +- .../libsharedtest/CMakeLists.txt | 2 +- .../libstatictest/CMakeLists.txt | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 92b943368..f690655cd 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -140,6 +140,20 @@ macro(_test_compiler_hidden_visibility) endif() endmacro() +macro(_test_compiler_has_deprecated) + if (WIN32) + if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) + set(COMPILER_HAS_DEPRECATED TRUE) + endif() + else() + # TODO: Test properly for this + if(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) + set(COMPILER_HAS_DEPRECATED TRUE) + endif() + endif() + set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED}" CACHE INTERNAL "Compiler support for a deprecated attribute") +endmacro() + set(myDir ${CMAKE_CURRENT_LIST_DIR}) macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) @@ -149,13 +163,11 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_NO_EXPORT) if(WIN32) - message("Compiler is ${CMAKE_CXX_COMPILER_ID}") - if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) - message("Deprecation macro enabled.") + if (COMPILER_HAS_DEPRECATED) set(DEFINE_DEPRECATED "__declspec(deprecated)") endif() else() - if(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) + if(COMPILER_HAS_DEPRECATED) set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") endif() endif() @@ -244,6 +256,7 @@ function(GENERATE_EXPORT_HEADER TARGET_LIBRARY) return() endif() _test_compiler_hidden_visibility() + _test_compiler_has_deprecated() _do_set_macro_values(${TARGET_LIBRARY}) _do_generate_export_header(${TARGET_LIBRARY} ${ARGN}) endfunction() @@ -251,6 +264,7 @@ endfunction() function(add_compiler_export_flags) _test_compiler_hidden_visibility() + _test_compiler_has_deprecated() if(NOT (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY)) message(WARNING "Compiler doesn't have hidden visibility") diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt index d25eed07f..1401eec38 100644 --- a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt @@ -17,7 +17,7 @@ endmacro() static_variant_build_pass("return libshared_and_static_exported();" "Failed to build static variant") shared_variant_build_pass("return libshared_and_static_exported();" "Failed to build shared variant") -if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) +if (COMPILER_HAS_DEPRECATED) shared_variant_build_fail("return libshared_and_static_deprecated();" "Built shared deprecated variant") static_variant_build_fail("return libshared_and_static_deprecated();" "Built static deprecated variant") else() diff --git a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt index 9edc53fcb..b763036e6 100644 --- a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt @@ -9,7 +9,7 @@ endmacro() shared_build_pass("Libshared l; return l.libshared_exported();" "Failed to build exported") -if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) +if (COMPILER_HAS_DEPRECATED) shared_build_fail("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") else() shared_build_pass("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") diff --git a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt index 168cae800..14ca05b4c 100644 --- a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt @@ -9,7 +9,7 @@ endmacro() static_build_pass("Libstatic l; return l.libstatic_exported();" "Failed to build exported.") -if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) +if (COMPILER_HAS_DEPRECATED) static_build_fail("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") static_build_fail("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") else() From e1f7ee3de71fc0e7a34bf05ec2cf4ec586ff9e32 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 18:18:19 +0200 Subject: [PATCH 31/72] Test for compiler features, instead of for specific platforms. --- Modules/GenerateExportHeader.cmake | 38 +++++++++++-------- .../GenerateExportHeader/CMakeLists.txt | 4 +- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index f690655cd..578d71f32 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -115,6 +115,20 @@ include(CMakeParseArguments) include(CheckCXXCompilerFlag) + +# TODO: Install this macro separately? +macro(_check_cxx_compiler_attribute _ATTRIBUTE _RESULT) + check_cxx_source_compiles("${_ATTRIBUTE} int somefunc() { return 0; } int main() { return somefunc();}" ${_RESULT} + # Some compilers do not fail with a bad flag + FAIL_REGEX "unrecognized .*option" # GNU + FAIL_REGEX "ignoring unknown option" # MSVC + FAIL_REGEX "warning D9002" # MSVC, any lang + FAIL_REGEX "[Uu]nknown option" # HP + FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro + FAIL_REGEX "command option .* is not recognized" # XL + ) +endmacro() + macro(_test_compiler_hidden_visibility) if (CMAKE_COMPILER_IS_GNUCXX) @@ -141,15 +155,11 @@ macro(_test_compiler_hidden_visibility) endmacro() macro(_test_compiler_has_deprecated) - if (WIN32) - if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) - set(COMPILER_HAS_DEPRECATED TRUE) - endif() + _check_cxx_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED_DECLSPEC) + if(COMPILER_HAS_DEPRECATED_DECLSPEC) + set(COMPILER_HAS_DEPRECATED ${COMPILER_HAS_DEPRECATED_DECLSPEC}) else() - # TODO: Test properly for this - if(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY) - set(COMPILER_HAS_DEPRECATED TRUE) - endif() + _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED) endif() set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED}" CACHE INTERNAL "Compiler support for a deprecated attribute") endmacro() @@ -162,14 +172,10 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_IMPORT) set(DEFINE_NO_EXPORT) - if(WIN32) - if (COMPILER_HAS_DEPRECATED) - set(DEFINE_DEPRECATED "__declspec(deprecated)") - endif() - else() - if(COMPILER_HAS_DEPRECATED) - set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") - endif() + if (COMPILER_HAS_DEPRECATED_DECLSPEC) + set(DEFINE_DEPRECATED "__declspec(deprecated)") + elseif(COMPILER_HAS_DEPRECATED) + set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") endif() get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index eb19afbc8..05d151933 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -49,7 +49,7 @@ macro(_do_build Include Library LibrarySource Source) "if(CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))\n" " add_definitions(-Werror)\n" "else()\n" - " if(MSVC)\n" + " if(MSVC AND COMPILER_HAS_DEPRECATED)\n" # Treat deprecation warnings as errors. " add_definitions(/we4996)\n" " endif()\n" @@ -123,7 +123,7 @@ if (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang)) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") endif() -if(MSVC) +if(MSVC AND COMPILER_HAS_DEPRECATED) add_definitions(/wd4996) endif() From 78a6e1c1224bbeb92f44dd681cc914030bbf8c82 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 11 Aug 2011 18:18:19 +0200 Subject: [PATCH 32/72] Exclude the XL compiler from the hidden-visibility test. --- Modules/GenerateExportHeader.cmake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 578d71f32..05f36f386 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -146,7 +146,10 @@ macro(_test_compiler_hidden_visibility) endif() endif() - if (NOT GCC_TOO_OLD AND NOT WIN32) + # Exclude XL here because it misinterprets -fvisibility=hidden even though + # the check_cxx_compiler_flag passes + # http://www.cdash.org/CDash/testDetails.php?test=109109951&build=1419259 + if (NOT GCC_TOO_OLD AND NOT WIN32 AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL) check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) From df4615e3380cda2bf29d3dfdcfd26b020a64e707 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 12 Aug 2011 00:21:13 +0200 Subject: [PATCH 33/72] Add the COMPILER_HAS_DEPRECATED only if it has a declspec variant _check_cxx_compiler_attribute does it in the alternative. --- Modules/GenerateExportHeader.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 05f36f386..c833a014d 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -160,11 +160,10 @@ endmacro() macro(_test_compiler_has_deprecated) _check_cxx_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED_DECLSPEC) if(COMPILER_HAS_DEPRECATED_DECLSPEC) - set(COMPILER_HAS_DEPRECATED ${COMPILER_HAS_DEPRECATED_DECLSPEC}) + set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_DECLSPEC}" CACHE INTERNAL "Compiler support for a deprecated attribute") else() _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED) endif() - set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED}" CACHE INTERNAL "Compiler support for a deprecated attribute") endmacro() set(myDir ${CMAKE_CURRENT_LIST_DIR}) From 856bdb317bc0d38327a7a9c7e9105ee1cd39f18a Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 12 Aug 2011 00:30:31 +0200 Subject: [PATCH 34/72] Don't change the expected build result based on the platform. Hopefully the compiler feature tests will cover those cases. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 05d151933..febf90f41 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -78,11 +78,7 @@ endmacro() macro(build_fail Include Library LibrarySource Source Message) _do_build(${Include} ${Library} ${LibrarySource} "${Source}") - if(COMPILER_HAS_HIDDEN_VISIBILITY OR WIN32 OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang)) - test_fail(Result ${Message}) - else() - test_pass(Result ${Message}) - endif() + test_fail(Result ${Message}) endmacro() macro(build_pass Include Library LibrarySource Source Message) From 9aab2aa77f12a938ef4a819ebb9830a1918f65ce Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 12 Aug 2011 10:42:16 +0200 Subject: [PATCH 35/72] Expect the tests to pass if hidden visibilty is not enabled. --- .../lib_shared_and_statictest/CMakeLists.txt | 7 ++++- .../libsharedtest/CMakeLists.txt | 29 ++++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt index 1401eec38..28d6c65c6 100644 --- a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt @@ -25,4 +25,9 @@ else() static_variant_build_pass("return libshared_and_static_deprecated();" "Built static deprecated variant") endif() static_variant_build_pass("return libshared_and_static_not_exported();" "Failed to build static not exported variant") -shared_variant_build_fail("return libshared_and_static_not_exported();" "Built shared not exported variant") + +if (WIN32 OR COMPILER_HAS_HIDDEN_VISIBILITY) + shared_variant_build_fail("return libshared_and_static_not_exported();" "Built shared not exported variant") +else() + shared_variant_build_pass("return libshared_and_static_not_exported();" "Built shared not exported variant") +endif() diff --git a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt index b763036e6..288089ef6 100644 --- a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt @@ -20,12 +20,25 @@ else() # There is no MSVC equivalent to hiding symbols. shared_build_pass("Libshared l; return l.libshared_excluded();" "Built use of excluded class method. This is possible on MSVC.") endif() -shared_build_fail("LibsharedNotExported l; return l.libshared();" "Built use of not-exported class method. This should not be possible.") -shared_build_fail("LibsharedNotExported l; return l.libshared_not_exported();" "Built use of not-exported class method. This should not be possible.") -shared_build_fail("LibsharedNotExported l; return l.libshared_excluded();" "Built use of not-exported class method. This should not be possible.") -shared_build_fail("LibsharedExcluded l; return l.libshared();" "Built use of excluded class method. This should not be possible.") -shared_build_fail("LibsharedExcluded l; return l.libshared_not_exported();" "Built use of excluded class method. This should not be possible.") -shared_build_fail("LibsharedExcluded l; return l.libshared_excluded();" "Built use of excluded class method. This should not be possible.") -shared_build_fail("return libshared_excluded();" "Built use of excluded function. This should not be possible.") -shared_build_fail("return libshared_not_exported();" "Built use of not-exported function. This should not be possible.") +if (WIN32 OR COMPILER_HAS_HIDDEN_VISIBILITY) + shared_build_fail("LibsharedNotExported l; return l.libshared();" "Built use of not-exported class method. This should not be possible.") + shared_build_fail("LibsharedNotExported l; return l.libshared_not_exported();" "Built use of not-exported class method. This should not be possible.") + shared_build_fail("LibsharedNotExported l; return l.libshared_excluded();" "Built use of not-exported class method. This should not be possible.") + shared_build_fail("LibsharedExcluded l; return l.libshared();" "Built use of excluded class method. This should not be possible.") + shared_build_fail("LibsharedExcluded l; return l.libshared_not_exported();" "Built use of excluded class method. This should not be possible.") + shared_build_fail("LibsharedExcluded l; return l.libshared_excluded();" "Built use of excluded class method. This should not be possible.") + + shared_build_fail("return libshared_excluded();" "Built use of excluded function. This should not be possible.") + shared_build_fail("return libshared_not_exported();" "Built use of not-exported function. This should not be possible.") +else() + shared_build_pass("LibsharedNotExported l; return l.libshared();" "Built use of not-exported class method.") + shared_build_pass("LibsharedNotExported l; return l.libshared_not_exported();" "Built use of not-exported class method.") + shared_build_pass("LibsharedNotExported l; return l.libshared_excluded();" "Built use of not-exported class method.") + shared_build_pass("LibsharedExcluded l; return l.libshared();" "Built use of excluded class method.") + shared_build_pass("LibsharedExcluded l; return l.libshared_not_exported();" "Built use of excluded class method.") + shared_build_pass("LibsharedExcluded l; return l.libshared_excluded();" "Built use of excluded class method.") + + shared_build_pass("return libshared_excluded();" "Built use of excluded function.") + shared_build_pass("return libshared_not_exported();" "Built use of not-exported function.") +endif() From 01e9e983e31dcd33bd5991b67e131e80e37f86e1 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 12 Aug 2011 10:47:08 +0200 Subject: [PATCH 36/72] Test -Werror instead of enabling it per compiler. Maybe the Intel compiler supports it too. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index febf90f41..b3f646f16 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -46,7 +46,9 @@ macro(_do_build Include Library LibrarySource Source) "add_compiler_export_flags()\n" - "if(CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))\n" + "check_cxx_compiler_flag(-Werror HAS_WERROR_FLAG)\n" + + "if(HAS_WERROR_FLAG)\n" " add_definitions(-Werror)\n" "else()\n" " if(MSVC AND COMPILER_HAS_DEPRECATED)\n" From fb88c6e32ad78895c45b4651748e45a388a81cb0 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 12 Aug 2011 11:39:21 +0200 Subject: [PATCH 37/72] Add some messaging output to make remaining issues findable. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index b3f646f16..a310eb948 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -98,6 +98,10 @@ endif() 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}) + set(link_libraries) macro(macro_add_test_library name) add_subdirectory(${name}) From c448b09ad39c35b129d7b91710bea4f26fabdfe4 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 13 Aug 2011 22:20:54 +0200 Subject: [PATCH 38/72] Perform the -Werror test only once. This way, the output of the test should be visible on CDash. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index a310eb948..46ab88514 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR) project(GenerateExportHeader) +include(CheckCXXCompilerFlag) + set( CMAKE_INCLUDE_CURRENT_DIR ON ) macro(TEST_FAIL value msg) @@ -16,6 +18,8 @@ macro(TEST_PASS value msg) endif () endmacro() +check_cxx_compiler_flag(-Werror HAS_WERROR_FLAG) + # 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) @@ -46,9 +50,7 @@ macro(_do_build Include Library LibrarySource Source) "add_compiler_export_flags()\n" - "check_cxx_compiler_flag(-Werror HAS_WERROR_FLAG)\n" - - "if(HAS_WERROR_FLAG)\n" + "if(${HAS_WERROR_FLAG})\n" " add_definitions(-Werror)\n" "else()\n" " if(MSVC AND COMPILER_HAS_DEPRECATED)\n" @@ -101,6 +103,7 @@ 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) From aed84517c942a4c40f493fcf997cdf6a047349f8 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 13 Aug 2011 22:33:30 +0200 Subject: [PATCH 39/72] Test for deprecated attribute before declspec. The attribute seems more common, and some compilers seem to silently ignore the declspec. --- Modules/GenerateExportHeader.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index c833a014d..044e2b439 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -158,11 +158,11 @@ macro(_test_compiler_hidden_visibility) endmacro() macro(_test_compiler_has_deprecated) - _check_cxx_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED_DECLSPEC) - if(COMPILER_HAS_DEPRECATED_DECLSPEC) - set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_DECLSPEC}" CACHE INTERNAL "Compiler support for a deprecated attribute") + _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) + if(COMPILER_HAS_DEPRECATED_ATTR) + set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_ATTR}" CACHE INTERNAL "Compiler support for a deprecated attribute") else() - _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED) + _check_cxx_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED) endif() endmacro() From c41c68bfa437d4ea1b2ae5153f6f20430c47d902 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 13 Aug 2011 23:06:01 +0200 Subject: [PATCH 40/72] Try to error on deprecated on Intel and SunCC. --- .../GenerateExportHeader/CMakeLists.txt | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 46ab88514..dc7268942 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -20,6 +20,27 @@ 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() + + # 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) @@ -50,13 +71,8 @@ macro(_do_build Include Library LibrarySource Source) "add_compiler_export_flags()\n" - "if(${HAS_WERROR_FLAG})\n" - " add_definitions(-Werror)\n" - "else()\n" - " if(MSVC AND COMPILER_HAS_DEPRECATED)\n" - # Treat deprecation warnings as errors. - " add_definitions(/we4996)\n" - " endif()\n" + "if(NOT \"${ERROR_FLAG}\" STREQUAL \"\")\n" + " add_definitions(${ERROR_FLAG})\n" "endif()\n" "if(MSVC)\n" From 2aeab4f973144fe859d5751e969512a92ae08d96 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 13 Aug 2011 23:30:35 +0200 Subject: [PATCH 41/72] Borland can't do deprecated. --- Modules/GenerateExportHeader.cmake | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 044e2b439..5b42b7761 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -158,11 +158,15 @@ macro(_test_compiler_hidden_visibility) endmacro() macro(_test_compiler_has_deprecated) - _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) - if(COMPILER_HAS_DEPRECATED_ATTR) - set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_ATTR}" CACHE INTERNAL "Compiler support for a deprecated attribute") + if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland) + set(COMPILER_HAS_DEPRECATED "" CACHE INTERNAL "Compiler support for a deprecated attribute") else() - _check_cxx_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED) + _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) + if(COMPILER_HAS_DEPRECATED_ATTR) + set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_ATTR}" CACHE INTERNAL "Compiler support for a deprecated attribute") + else() + _check_cxx_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED) + endif() endif() endmacro() From 97392a7dd3ca141285e22507bfdae6c640512e76 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 14 Aug 2011 15:37:24 +0200 Subject: [PATCH 42/72] Fixup forgotten part of aed84517c942a4c40f493fcf997cdf6a047349f8 --- Modules/GenerateExportHeader.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 5b42b7761..758eb2514 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -178,10 +178,10 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_IMPORT) set(DEFINE_NO_EXPORT) - if (COMPILER_HAS_DEPRECATED_DECLSPEC) - set(DEFINE_DEPRECATED "__declspec(deprecated)") - elseif(COMPILER_HAS_DEPRECATED) + if (COMPILER_HAS_DEPRECATED_ATTR) set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))") + elseif(COMPILER_HAS_DEPRECATED) + set(DEFINE_DEPRECATED "__declspec(deprecated)") endif() get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) From 10d8c446d5893446eaf4bd6e295fb6ea0d83d7f4 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 14 Aug 2011 15:42:31 +0200 Subject: [PATCH 43/72] Disable testing of deprecated macros. It is not possible to test for it sanely across multiple ancient compilers supported by cmake. --- .../lib_shared_and_statictest/CMakeLists.txt | 14 +++++++------- .../libsharedtest/CMakeLists.txt | 10 +++++----- .../libstatictest/CMakeLists.txt | 14 +++++++------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt index 28d6c65c6..207534d6e 100644 --- a/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/lib_shared_and_statictest/CMakeLists.txt @@ -17,13 +17,13 @@ endmacro() static_variant_build_pass("return libshared_and_static_exported();" "Failed to build static variant") shared_variant_build_pass("return libshared_and_static_exported();" "Failed to build shared variant") -if (COMPILER_HAS_DEPRECATED) - shared_variant_build_fail("return libshared_and_static_deprecated();" "Built shared deprecated variant") - static_variant_build_fail("return libshared_and_static_deprecated();" "Built static deprecated variant") -else() - shared_variant_build_pass("return libshared_and_static_deprecated();" "Built shared deprecated variant") - static_variant_build_pass("return libshared_and_static_deprecated();" "Built static deprecated variant") -endif() +# if (COMPILER_HAS_DEPRECATED) +# shared_variant_build_fail("return libshared_and_static_deprecated();" "Built shared deprecated variant") +# static_variant_build_fail("return libshared_and_static_deprecated();" "Built static deprecated variant") +# else() +# shared_variant_build_pass("return libshared_and_static_deprecated();" "Built shared deprecated variant") +# static_variant_build_pass("return libshared_and_static_deprecated();" "Built static deprecated variant") +# endif() static_variant_build_pass("return libshared_and_static_not_exported();" "Failed to build static not exported variant") if (WIN32 OR COMPILER_HAS_HIDDEN_VISIBILITY) diff --git a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt index 288089ef6..a5804fcfb 100644 --- a/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/libsharedtest/CMakeLists.txt @@ -9,11 +9,11 @@ endmacro() shared_build_pass("Libshared l; return l.libshared_exported();" "Failed to build exported") -if (COMPILER_HAS_DEPRECATED) - shared_build_fail("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") -else() - shared_build_pass("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") -endif() +# if (COMPILER_HAS_DEPRECATED) +# shared_build_fail("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") +# else() +# shared_build_pass("Libshared l; return l.libshared_deprecated();" "Built use of deprecated class method. This should not be possible.") +# endif() if (COMPILER_HAS_HIDDEN_VISIBILITY) shared_build_fail("Libshared l; return l.libshared_excluded();" "Built use of excluded class method. This should not be possible.") else() diff --git a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt index 14ca05b4c..eb6bb874c 100644 --- a/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/libstatictest/CMakeLists.txt @@ -9,10 +9,10 @@ endmacro() static_build_pass("Libstatic l; return l.libstatic_exported();" "Failed to build exported.") -if (COMPILER_HAS_DEPRECATED) - static_build_fail("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") - static_build_fail("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") -else() - static_build_pass("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") - static_build_pass("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") -endif() +# if (COMPILER_HAS_DEPRECATED) +# static_build_fail("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") +# static_build_fail("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") +# else() +# static_build_pass("Libstatic l; return l.libstatic_deprecated();" "Built use of deprecated class method. This should not be possible.") +# static_build_pass("libstatic_deprecated();" "Built use of deprecated function. This should not be possible.") +# endif() From 9672b332b15a0ba66b929e28fdac2f5d854d9b99 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 16 Aug 2011 01:13:10 +0200 Subject: [PATCH 44/72] Don't enable deprecated on HP. --- Modules/GenerateExportHeader.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 758eb2514..c15a5bec9 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -158,7 +158,7 @@ macro(_test_compiler_hidden_visibility) endmacro() macro(_test_compiler_has_deprecated) - if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland) + if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland OR "${CMAKE_CXX_COMPILER_ID}" MATCHES HP) set(COMPILER_HAS_DEPRECATED "" CACHE INTERNAL "Compiler support for a deprecated attribute") else() _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) From f84c7db5928dcb4a46c3f8d51d910e4ad4367113 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 16 Aug 2011 01:17:26 +0200 Subject: [PATCH 45/72] Don't enable deprecated on old GCC Hopefully a fix for http://www.cdash.org/CDash/testDetails.php?test=109688480&build=1432057 --- Modules/GenerateExportHeader.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index c15a5bec9..f3a183619 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -158,7 +158,7 @@ macro(_test_compiler_hidden_visibility) endmacro() macro(_test_compiler_has_deprecated) - if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland OR "${CMAKE_CXX_COMPILER_ID}" MATCHES HP) + if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland OR "${CMAKE_CXX_COMPILER_ID}" MATCHES HP OR GCC_TOO_OLD) set(COMPILER_HAS_DEPRECATED "" CACHE INTERNAL "Compiler support for a deprecated attribute") else() _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) From f4264960551d088d3a0f1eea3049d2d8ecfd285b Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 16 Aug 2011 01:19:37 +0200 Subject: [PATCH 46/72] Exclude cygwin from the hidden visibility feature. --- Modules/GenerateExportHeader.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index f3a183619..f73748c38 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -149,7 +149,7 @@ macro(_test_compiler_hidden_visibility) # Exclude XL here because it misinterprets -fvisibility=hidden even though # the check_cxx_compiler_flag passes # http://www.cdash.org/CDash/testDetails.php?test=109109951&build=1419259 - if (NOT GCC_TOO_OLD AND NOT WIN32 AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL) + if (NOT GCC_TOO_OLD AND NOT WIN32 AND NOT CYGWIN AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL) check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) From 1ae3365e9f4126688d57137648e190ca5f4ef8dc Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 16 Aug 2011 01:21:59 +0200 Subject: [PATCH 47/72] Exclude PGI from exports and deprecated. --- Modules/GenerateExportHeader.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index f73748c38..7a4b6d312 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -149,7 +149,7 @@ macro(_test_compiler_hidden_visibility) # Exclude XL here because it misinterprets -fvisibility=hidden even though # the check_cxx_compiler_flag passes # http://www.cdash.org/CDash/testDetails.php?test=109109951&build=1419259 - if (NOT GCC_TOO_OLD AND NOT WIN32 AND NOT CYGWIN AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL) + if (NOT GCC_TOO_OLD AND NOT WIN32 AND NOT CYGWIN AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES PGI) check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) @@ -158,7 +158,7 @@ macro(_test_compiler_hidden_visibility) endmacro() macro(_test_compiler_has_deprecated) - if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland OR "${CMAKE_CXX_COMPILER_ID}" MATCHES HP OR GCC_TOO_OLD) + if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland OR "${CMAKE_CXX_COMPILER_ID}" MATCHES HP OR GCC_TOO_OLD OR "${CMAKE_CXX_COMPILER_ID}" MATCHES PGI) set(COMPILER_HAS_DEPRECATED "" CACHE INTERNAL "Compiler support for a deprecated attribute") else() _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) From afae7a95a06bf1cbec47b3b4471e5f11a41065cb Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 17 Aug 2011 02:34:23 +0200 Subject: [PATCH 48/72] Start testing expected values for compiler flags. Should help catch unhandled flag warnings so far not handled by check_cxx_compiler_flag FAIL_REGEXen. --- Tests/CMakeLists.txt | 2 + .../CheckCXXCompilerFlag/CMakeLists.txt | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index eececb020..aad908cf9 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -223,6 +223,8 @@ IF(BUILD_TESTING) ADD_TEST_MACRO(Module.GenerateExportHeader GenerateExportHeader) + ADD_TEST_MACRO(Module.CheckCXXCompilerFlag CheckCXXCompilerFlag) + ADD_TEST(LinkFlags-prepare ${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE} --build-and-test diff --git a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt new file mode 100644 index 000000000..70bafb6d7 --- /dev/null +++ b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt @@ -0,0 +1,63 @@ +cmake_minimum_required(VERSION 2.8) +project(CheckCXXCompilerFlag) + +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() + +if(CMAKE_COMPILER_IS_GNUCXX) + exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) + string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") + # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the + # patch level, handle this here: + if(NOT _gcc_version) + string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") + endif() +endif() + +if(CMAKE_COMPILER_ID MATCHES Clang) + exec_program(${CMAKE_CXX_COMPILER} ARGS --version OUTPUT_VARIABLE _clang_version_info) + string (REGEX MATCH "version [345]\\.[0-9]" _clang_version "${_clang_version_info}") +endif() + +message("Platform:\n WIN32: ${WIN32}\n UNIX: ${UNIX}\n APPLE: ${APPLE}\n MINGW: ${MINGW}\n CYGWIN: ${CYGWIN}\n" + " MSVC: ${MSVC}\n MSVC60: ${MSVC60}\n MSVC70: ${MSVC70}\n MSVC71: ${MSVC71}\n MSVC80: ${MSVC80}\n MSVC90: ${MSVC90}\n MSVC10: ${MSVC10}\n" + " GCC: ${_gcc_version}\n" + " Clang: ${_clang_version}\n" +) + +include(CheckCXXCompilerFlag) + +check_cxx_compiler_flag(-fvisibility=hidden HAS_HIDDEN_VISIBILITY) + +message("HAS_HIDDEN_VISIBILITY: ${HAS_HIDDEN_VISIBILITY}\n\nCOMPILE OUTPUT:\n${OUTPUT}") + +if(CMAKE_COMPILER_IS_GNUCXX) + test_pass(HAS_HIDDEN_VISIBILITY "GCC should support hidden visibility, but does not.") +else() + message("Unhandled Platform") +endif() + +# +# This is a no-op executable... If this test is going to fail, it fails during +# the configure step while cmake is configuring this CMakeLists.txt file... +# + +file(WRITE + "${CMAKE_CURRENT_BINARY_DIR}/main.cxx" + "int main() { return 0; } +" +) + +add_executable( + CheckCXXCompilerFlag + "${CMAKE_CURRENT_BINARY_DIR}/main.cxx" +) From a9a8b9e8d194eb78cf5fb74fb902a0cf233f8ac0 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 17 Aug 2011 02:40:56 +0200 Subject: [PATCH 49/72] Exclude win32 from hidden visibility checks. --- Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt index 70bafb6d7..7775e147c 100644 --- a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt +++ b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt @@ -41,7 +41,9 @@ check_cxx_compiler_flag(-fvisibility=hidden HAS_HIDDEN_VISIBILITY) message("HAS_HIDDEN_VISIBILITY: ${HAS_HIDDEN_VISIBILITY}\n\nCOMPILE OUTPUT:\n${OUTPUT}") if(CMAKE_COMPILER_IS_GNUCXX) - test_pass(HAS_HIDDEN_VISIBILITY "GCC should support hidden visibility, but does not.") + if(NOT WIN32) + test_pass(HAS_HIDDEN_VISIBILITY "GCC should support hidden visibility, but does not.") + endif() else() message("Unhandled Platform") endif() From b6ee2ee03addc4b22dfba6aeae27719c139e0727 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 17 Aug 2011 02:41:28 +0200 Subject: [PATCH 50/72] Comment the test assertion for now At least until I know which gcc versions do not pass. --- Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt index 7775e147c..8294c8f38 100644 --- a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt +++ b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt @@ -42,7 +42,7 @@ message("HAS_HIDDEN_VISIBILITY: ${HAS_HIDDEN_VISIBILITY}\n\nCOMPILE OUTPUT:\n${O if(CMAKE_COMPILER_IS_GNUCXX) if(NOT WIN32) - test_pass(HAS_HIDDEN_VISIBILITY "GCC should support hidden visibility, but does not.") +# test_pass(HAS_HIDDEN_VISIBILITY "GCC should support hidden visibility, but does not.") endif() else() message("Unhandled Platform") From a493d1a35305d26e9c360f82b969adde1dfd64ae Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 17 Aug 2011 13:32:20 +0200 Subject: [PATCH 51/72] Test the correct cxx variable. --- Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt index 8294c8f38..fcffa8778 100644 --- a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt +++ b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt @@ -23,7 +23,7 @@ if(CMAKE_COMPILER_IS_GNUCXX) endif() endif() -if(CMAKE_COMPILER_ID MATCHES Clang) +if(CMAKE_CXX_COMPILER_ID MATCHES Clang) exec_program(${CMAKE_CXX_COMPILER} ARGS --version OUTPUT_VARIABLE _clang_version_info) string (REGEX MATCH "version [345]\\.[0-9]" _clang_version "${_clang_version_info}") endif() From aa4f0b6ba813c69e73d66c51ece183e8e97f622b Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 17 Aug 2011 13:32:48 +0200 Subject: [PATCH 52/72] Fix the version extraction regex for clang. --- Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt index fcffa8778..7d5291215 100644 --- a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt +++ b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt @@ -25,7 +25,7 @@ endif() if(CMAKE_CXX_COMPILER_ID MATCHES Clang) exec_program(${CMAKE_CXX_COMPILER} ARGS --version OUTPUT_VARIABLE _clang_version_info) - string (REGEX MATCH "version [345]\\.[0-9]" _clang_version "${_clang_version_info}") + string (REGEX REPLACE ".*version ([0-9]\\.[0-9]).*" "\\1" _clang_version "${_clang_version_info}") endif() message("Platform:\n WIN32: ${WIN32}\n UNIX: ${UNIX}\n APPLE: ${APPLE}\n MINGW: ${MINGW}\n CYGWIN: ${CYGWIN}\n" From bf73e759413d33f7d2950ecb46530cffebfbd333 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 17 Aug 2011 13:37:57 +0200 Subject: [PATCH 53/72] Hopefully add version extraction for Intel. --- Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt index 7d5291215..0133f8e07 100644 --- a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt +++ b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt @@ -28,10 +28,16 @@ if(CMAKE_CXX_COMPILER_ID MATCHES Clang) string (REGEX REPLACE ".*version ([0-9]\\.[0-9]).*" "\\1" _clang_version "${_clang_version_info}") endif() +if(CMAKE_CXX_COMPILER_ID MATCHES Intel) + exec_program(${CMAKE_CXX_COMPILER} ARGS -V OUTPUT_VARIABLE _intel_version_info) + string (REGEX REPLACE ".*Version ([0-9]+(\\.[0-9]+)+).*" _intel_version "${_intel_version_info}") +endif() + message("Platform:\n WIN32: ${WIN32}\n UNIX: ${UNIX}\n APPLE: ${APPLE}\n MINGW: ${MINGW}\n CYGWIN: ${CYGWIN}\n" " MSVC: ${MSVC}\n MSVC60: ${MSVC60}\n MSVC70: ${MSVC70}\n MSVC71: ${MSVC71}\n MSVC80: ${MSVC80}\n MSVC90: ${MSVC90}\n MSVC10: ${MSVC10}\n" " GCC: ${_gcc_version}\n" " Clang: ${_clang_version}\n" + " Intel: ${_intel_version}\n" ) include(CheckCXXCompilerFlag) From a147a069a533e24d749412f471aaac911cfdb573 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 17 Aug 2011 14:03:12 +0200 Subject: [PATCH 54/72] Add some settings for non-truncation of test output. --- Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt index 0133f8e07..fa48a4811 100644 --- a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt +++ b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt @@ -1,6 +1,9 @@ cmake_minimum_required(VERSION 2.8) project(CheckCXXCompilerFlag) +message(STATUS "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)") +set(CMAKE_VERBOSE_MAKEFILE 1) + macro(TEST_FAIL value msg) if (${value}) message (SEND_ERROR "Test fail:" ${msg} ${Out} ) From 42154ec01cc6250097880c6c13ea5bba88e3a6b0 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 18 Aug 2011 13:29:06 +0200 Subject: [PATCH 55/72] Fix up the regex command for Intel. --- Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt index fa48a4811..77f50060f 100644 --- a/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt +++ b/Tests/Module/CheckCXXCompilerFlag/CMakeLists.txt @@ -33,7 +33,7 @@ endif() if(CMAKE_CXX_COMPILER_ID MATCHES Intel) exec_program(${CMAKE_CXX_COMPILER} ARGS -V OUTPUT_VARIABLE _intel_version_info) - string (REGEX REPLACE ".*Version ([0-9]+(\\.[0-9]+)+).*" _intel_version "${_intel_version_info}") + string (REGEX REPLACE ".*Version ([0-9]+(\\.[0-9]+)+).*" "\\1" _intel_version "${_intel_version_info}") endif() message("Platform:\n WIN32: ${WIN32}\n UNIX: ${UNIX}\n APPLE: ${APPLE}\n MINGW: ${MINGW}\n CYGWIN: ${CYGWIN}\n" From 32eff0caec8fa896fdbb58d259c5cff2614279c3 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Aug 2011 19:49:39 +0200 Subject: [PATCH 56/72] Test for too-old-intel compilers. --- Modules/GenerateExportHeader.cmake | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 7a4b6d312..1d4c4822e 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -146,10 +146,21 @@ macro(_test_compiler_hidden_visibility) endif() endif() + if(CMAKE_CXX_COMPILER_ID MATCHES Intel) + exec_program(${CMAKE_CXX_COMPILER} ARGS -V OUTPUT_VARIABLE _intel_version_info) + string (REGEX REPLACE ".*Version ([0-9]+(\\.[0-9]+)+).*" "\\1" _intel_version "${_intel_version_info}") + + if(${_intel_version} VERSION_LESS "12.0") + set(_INTEL_TOO_OLD TRUE) + message(WARNING "Intel compiler older than 12.0") + endif() + endif() + + # Exclude XL here because it misinterprets -fvisibility=hidden even though # the check_cxx_compiler_flag passes # http://www.cdash.org/CDash/testDetails.php?test=109109951&build=1419259 - if (NOT GCC_TOO_OLD AND NOT WIN32 AND NOT CYGWIN AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES PGI) + if (NOT GCC_TOO_OLD AND NOT _INTEL_TOO_OLD AND NOT WIN32 AND NOT CYGWIN AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES PGI) check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) From e253348ecd8cedc0f5fe640e613b2d19bd5641ae Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Aug 2011 19:49:52 +0200 Subject: [PATCH 57/72] Possibly fix test on HPUX. --- Tests/Module/GenerateExportHeader/exportheader_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/exportheader_test.cpp b/Tests/Module/GenerateExportHeader/exportheader_test.cpp index cfc1a053f..55c3c1ad6 100644 --- a/Tests/Module/GenerateExportHeader/exportheader_test.cpp +++ b/Tests/Module/GenerateExportHeader/exportheader_test.cpp @@ -79,4 +79,4 @@ int main() libstatic_excluded(); return 0; -} \ No newline at end of file +} From 6adeda9f55ca81b3715dd7512f2cd3c3218bd6ab Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Aug 2011 19:58:42 +0200 Subject: [PATCH 58/72] Possibly fix configuration test on AIX. --- Modules/CheckCXXCompilerFlag.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/CheckCXXCompilerFlag.cmake b/Modules/CheckCXXCompilerFlag.cmake index 788bf35b4..91008c375 100644 --- a/Modules/CheckCXXCompilerFlag.cmake +++ b/Modules/CheckCXXCompilerFlag.cmake @@ -33,6 +33,7 @@ MACRO (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT) FAIL_REGEX "[Uu]nknown option" # HP FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro FAIL_REGEX "command option .* is not recognized" # XL + FAIL_REGEX "not supported in this configuration; ignored" # AIX ) SET (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") ENDMACRO (CHECK_CXX_COMPILER_FLAG) From 03d60c7d818584c5c44d2992b6cba1e202cdd498 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Aug 2011 20:04:56 +0200 Subject: [PATCH 59/72] Try to make the macros do almost nothing for Watcom. --- Modules/GenerateExportHeader.cmake | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 1d4c4822e..6225f70fa 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -160,7 +160,13 @@ macro(_test_compiler_hidden_visibility) # Exclude XL here because it misinterprets -fvisibility=hidden even though # the check_cxx_compiler_flag passes # http://www.cdash.org/CDash/testDetails.php?test=109109951&build=1419259 - if (NOT GCC_TOO_OLD AND NOT _INTEL_TOO_OLD AND NOT WIN32 AND NOT CYGWIN AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES PGI) + if (NOT GCC_TOO_OLD + AND NOT _INTEL_TOO_OLD + AND NOT WIN32 + AND NOT CYGWIN + AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES XL + AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES PGI + AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES Watcom) check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) check_cxx_compiler_flag(-fvisibility-inlines-hidden COMPILER_HAS_HIDDEN_INLINE_VISIBILITY) option(USE_COMPILER_HIDDEN_VISIBILITY "Use HIDDEN visibility support if available." ON) @@ -169,7 +175,11 @@ macro(_test_compiler_hidden_visibility) endmacro() macro(_test_compiler_has_deprecated) - if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland OR "${CMAKE_CXX_COMPILER_ID}" MATCHES HP OR GCC_TOO_OLD OR "${CMAKE_CXX_COMPILER_ID}" MATCHES PGI) + if("${CMAKE_CXX_COMPILER_ID}" MATCHES Borland + OR "${CMAKE_CXX_COMPILER_ID}" MATCHES HP + OR GCC_TOO_OLD + OR "${CMAKE_CXX_COMPILER_ID}" MATCHES PGI + OR "${CMAKE_CXX_COMPILER_ID}" MATCHES Watcom) set(COMPILER_HAS_DEPRECATED "" CACHE INTERNAL "Compiler support for a deprecated attribute") else() _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED_ATTR) From 1b031d1a3f236f7c2c301e042bdc22bdfc4064c0 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Aug 2011 23:19:31 +0200 Subject: [PATCH 60/72] More consistency in the macro options. --- Modules/GenerateExportHeader.cmake | 12 ++++++------ Modules/exportheader.cmake.in | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 6225f70fa..0fe69a8bd 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -12,7 +12,7 @@ # [BASE_NAME ] # [EXPORT_MACRO_NAME ] # [EXPORT_FILE_NAME ] -# [DEPRECATED_NAME ] +# [DEPRECATED_MACRO_NAME ] # [NO_EXPORT_MACRO_NAME ] # [STATIC_DEFINE ] # ) @@ -78,7 +78,7 @@ # # add_library(somelib someclass.cpp) # generate_export_header(somelib -# DEPRECATED_NAME KDE_DEPRECATED +# DEPRECATED_MACRO_NAME KDE_DEPRECATED # ) # # creates the macro KDE_DEPRECATED instead of SOMELIB_DEPRECATED. @@ -222,7 +222,7 @@ endmacro() macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) # Option overrides set(options) - set(oneValueArgs PREFIX_NAME BASE_NAME EXPORT_MACRO_NAME EXPORT_FILE_NAME DEPRECATED_NAME NO_EXPORT_MACRO_NAME STATIC_DEFINE) + set(oneValueArgs PREFIX_NAME BASE_NAME EXPORT_MACRO_NAME EXPORT_FILE_NAME DEPRECATED_MACRO_NAME NO_EXPORT_MACRO_NAME STATIC_DEFINE) set(multiValueArgs) cmake_parse_arguments(_GEH "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -240,7 +240,7 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) set(EXPORT_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_EXPORT") set(NO_EXPORT_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_NO_EXPORT") set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME_LOWER}_export.h") - set(DEPRECATED_NAME "${PREFIX}${BASE_NAME_UPPER}_DEPRECATED") + set(DEPRECATED_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_DEPRECATED") set(STATIC_DEFINE "${PREFIX}${BASE_NAME_UPPER}_STATIC_DEFINE") if(_GEH_UNPARSED_ARGUMENTS) @@ -257,8 +257,8 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${_GEH_EXPORT_FILE_NAME}") endif() endif() - if(_GEH_DEPRECATED_NAME) - set(DEPRECATED_NAME ${PREFIX}${_GEH_DEPRECATED_NAME}) + if(_GEH_DEPRECATED_MACRO_NAME) + set(DEPRECATED_MACRO_NAME ${PREFIX}${_GEH_DEPRECATED_MACRO_NAME}) endif() if(_GEH_NO_EXPORT_MACRO_NAME) set(NO_EXPORT_MACRO_NAME ${PREFIX}${_GEH_NO_EXPORT_MACRO_NAME}) diff --git a/Modules/exportheader.cmake.in b/Modules/exportheader.cmake.in index 62ed3ff92..83a93354e 100644 --- a/Modules/exportheader.cmake.in +++ b/Modules/exportheader.cmake.in @@ -21,10 +21,10 @@ # endif #endif -#ifndef @DEPRECATED_NAME@ -# define @DEPRECATED_NAME@ @DEFINE_DEPRECATED@ -# define @DEPRECATED_NAME@_EXPORT @EXPORT_MACRO_NAME@ @DEFINE_DEPRECATED@ -# define @DEPRECATED_NAME@_NO_EXPORT @NO_EXPORT_MACRO_NAME@ @DEFINE_DEPRECATED@ +#ifndef @DEPRECATED_MACRO_NAME@ +# define @DEPRECATED_MACRO_NAME@ @DEFINE_DEPRECATED@ +# define @DEPRECATED_MACRO_NAME@_EXPORT @EXPORT_MACRO_NAME@ @DEFINE_DEPRECATED@ +# define @DEPRECATED_MACRO_NAME@_NO_EXPORT @NO_EXPORT_MACRO_NAME@ @DEFINE_DEPRECATED@ #endif #endif // @INCLUDE_GUARD_NAME@ \ No newline at end of file From e0cc024dc90c74ff504995ce9ccd3671f9bf3db2 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Aug 2011 23:26:43 +0200 Subject: [PATCH 61/72] Add missing NO_EXPORT macro variant. --- Modules/GenerateExportHeader.cmake | 13 +++++++++++-- Modules/exportheader.cmake.in | 7 ++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 0fe69a8bd..e02811a28 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -221,8 +221,8 @@ endmacro() macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) # Option overrides - set(options) - set(oneValueArgs PREFIX_NAME BASE_NAME EXPORT_MACRO_NAME EXPORT_FILE_NAME DEPRECATED_MACRO_NAME NO_EXPORT_MACRO_NAME STATIC_DEFINE) + set(options DEFINE_NO_DEPRECATED) + set(oneValueArgs PREFIX_NAME BASE_NAME EXPORT_MACRO_NAME EXPORT_FILE_NAME DEPRECATED_MACRO_NAME NO_EXPORT_MACRO_NAME STATIC_DEFINE NO_DEPRECATED_MACRO_NAME) set(multiValueArgs) cmake_parse_arguments(_GEH "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -242,6 +242,7 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME_LOWER}_export.h") set(DEPRECATED_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_DEPRECATED") set(STATIC_DEFINE "${PREFIX}${BASE_NAME_UPPER}_STATIC_DEFINE") + set(NO_DEPRECATED_MACRO_NAME "${BASE_NAME_UPPER}_NO_DEPRECATED") if(_GEH_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unknown keywords given to GENERATE_EXPORT_HEADER(): \"${_GEH_UNPARSED_ARGUMENTS}\"") @@ -267,6 +268,14 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) set(STATIC_DEFINE ${PREFIX}${_GEH_STATIC_DEFINE}) endif() + if (_GEH_DEFINE_NO_DEPRECATED) + set(DEFINE_NO_DEPRECATED TRUE) + endif() + + if (_GEH_NO_DEPRECATED_MACRO_NAME) + set(NO_DEPRECATED_MACRO_NAME ${PREFIX}${_GEH_NO_DEPRECATED_MACRO_NAME}) + endif() + set(INCLUDE_GUARD_NAME "${PREFIX}${EXPORT_MACRO_NAME}_H") get_target_property(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY} DEFINE_SYMBOL) diff --git a/Modules/exportheader.cmake.in b/Modules/exportheader.cmake.in index 83a93354e..131d3a77d 100644 --- a/Modules/exportheader.cmake.in +++ b/Modules/exportheader.cmake.in @@ -27,4 +27,9 @@ # define @DEPRECATED_MACRO_NAME@_NO_EXPORT @NO_EXPORT_MACRO_NAME@ @DEFINE_DEPRECATED@ #endif -#endif // @INCLUDE_GUARD_NAME@ \ No newline at end of file +#cmakedefine01 DEFINE_NO_DEPRECATED +#if DEFINE_NO_DEPRECATED +# define @NO_DEPRECATED_MACRO_NAME@ +#endif + +#endif // @INCLUDE_GUARD_NAME@ From 89108b99eca60cfa71cee9727f3af052f5b9da4c Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 24 Aug 2011 19:43:04 +0200 Subject: [PATCH 62/72] Look for errors reported by PGI too. --- Modules/CheckCXXCompilerFlag.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/CheckCXXCompilerFlag.cmake b/Modules/CheckCXXCompilerFlag.cmake index 91008c375..77851483a 100644 --- a/Modules/CheckCXXCompilerFlag.cmake +++ b/Modules/CheckCXXCompilerFlag.cmake @@ -34,6 +34,7 @@ MACRO (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT) FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro FAIL_REGEX "command option .* is not recognized" # XL FAIL_REGEX "not supported in this configuration; ignored" # AIX + FAIL_REGEX "File with unknown suffix passed to linker" # PGI ) SET (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") ENDMACRO (CHECK_CXX_COMPILER_FLAG) From 7ac0ab1f88b66d162a89d055517551b3b7ecd8a6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 24 Aug 2011 19:50:31 +0200 Subject: [PATCH 63/72] Quote paths in case there is a space in one of them. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index dc7268942..914147189 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -65,7 +65,7 @@ macro(_do_build Include Library LibrarySource Source) "set(CMAKE_INCLUDE_CURRENT_DIR ON)\n" - "set(CMAKE_RUNTIME_OUTPUT_DIRECTORY \${CMAKE_CURRENT_BINARY_DIR})\n" + "set(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"\${CMAKE_CURRENT_BINARY_DIR}\")\n" "include(GenerateExportHeader)\n" @@ -79,9 +79,9 @@ macro(_do_build Include Library LibrarySource Source) " add_definitions(-DCOMPILER_IS_MSVC)\n" "endif()\n" - "add_subdirectory(${LibrarySource})\n" + "add_subdirectory(\"${LibrarySource}\")\n" - "include_directories(${LibrarySource} \${CMAKE_CURRENT_BINARY_DIR}/${LibrarySource})\n" + "include_directories(\"${LibrarySource}\" \"\${CMAKE_CURRENT_BINARY_DIR}/${LibrarySource}\")\n" "${CONDITIONAL_STATIC_DEFINE}" From 99b2aabd460d0c508ffa7b21283a0512e322e717 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 24 Aug 2011 19:58:00 +0200 Subject: [PATCH 64/72] Disable the tests for Watcom. They are timing out and showing up on the dashboard. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 914147189..5372f92eb 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -2,6 +2,21 @@ cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR) project(GenerateExportHeader) +# Prevent timeout on Watcom by not running the tests. +if ("${CMAKE_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 ) From 36d28f2e6b60b684fa26dc8b906dcf51a5c93a0f Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 24 Aug 2011 20:21:30 +0200 Subject: [PATCH 65/72] Fix Compiler id variable name. --- Tests/Module/GenerateExportHeader/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Module/GenerateExportHeader/CMakeLists.txt b/Tests/Module/GenerateExportHeader/CMakeLists.txt index 5372f92eb..fee836e1d 100644 --- a/Tests/Module/GenerateExportHeader/CMakeLists.txt +++ b/Tests/Module/GenerateExportHeader/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR) project(GenerateExportHeader) # Prevent timeout on Watcom by not running the tests. -if ("${CMAKE_COMPILER_ID}" MATCHES Watcom) +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES Watcom) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cxx" "int main() { return 0; } From 3449f6b88c0e8b11c13eae78e0932fd3140dfa89 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 25 Aug 2011 18:29:26 +0200 Subject: [PATCH 66/72] Add quotes in case cmake is installed in a prefix with a space. --- Modules/GenerateExportHeader.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index e02811a28..8ba26d870 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -191,7 +191,7 @@ macro(_test_compiler_has_deprecated) endif() endmacro() -set(myDir ${CMAKE_CURRENT_LIST_DIR}) +set(myDir "${CMAKE_CURRENT_LIST_DIR}") macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_DEPRECATED) @@ -284,7 +284,7 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) set(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY}_EXPORTS) endif() - configure_file(${myDir}/exportheader.cmake.in ${EXPORT_FILE_NAME} @ONLY) + configure_file("${myDir}/exportheader.cmake.in" "${EXPORT_FILE_NAME}" @ONLY) endmacro() function(GENERATE_EXPORT_HEADER TARGET_LIBRARY) From 51bc63a7cb524bd9f9942bd0d49491cf9d1e36f8 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 25 Aug 2011 18:51:37 +0200 Subject: [PATCH 67/72] Fix the feature of using a specific prefix for macros. --- Modules/GenerateExportHeader.cmake | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 8ba26d870..7ed7edcc2 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -237,19 +237,19 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) string(TOLOWER ${BASE_NAME} BASE_NAME_LOWER) # Default options - set(EXPORT_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_EXPORT") - set(NO_EXPORT_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_NO_EXPORT") + set(EXPORT_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_EXPORT") + set(NO_EXPORT_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_NO_EXPORT") set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME_LOWER}_export.h") - set(DEPRECATED_MACRO_NAME "${PREFIX}${BASE_NAME_UPPER}_DEPRECATED") - set(STATIC_DEFINE "${PREFIX}${BASE_NAME_UPPER}_STATIC_DEFINE") - set(NO_DEPRECATED_MACRO_NAME "${BASE_NAME_UPPER}_NO_DEPRECATED") + set(DEPRECATED_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_DEPRECATED") + set(STATIC_DEFINE "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_STATIC_DEFINE") + set(NO_DEPRECATED_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_NO_DEPRECATED") if(_GEH_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unknown keywords given to GENERATE_EXPORT_HEADER(): \"${_GEH_UNPARSED_ARGUMENTS}\"") endif() if(_GEH_EXPORT_MACRO_NAME) - set(EXPORT_MACRO_NAME ${PREFIX}${_GEH_EXPORT_MACRO_NAME}) + set(EXPORT_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_EXPORT_MACRO_NAME}) endif() if(_GEH_EXPORT_FILE_NAME) if(IS_ABSOLUTE _GEH_EXPORT_FILE_NAME) @@ -259,13 +259,13 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) endif() endif() if(_GEH_DEPRECATED_MACRO_NAME) - set(DEPRECATED_MACRO_NAME ${PREFIX}${_GEH_DEPRECATED_MACRO_NAME}) + set(DEPRECATED_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_DEPRECATED_MACRO_NAME}) endif() if(_GEH_NO_EXPORT_MACRO_NAME) - set(NO_EXPORT_MACRO_NAME ${PREFIX}${_GEH_NO_EXPORT_MACRO_NAME}) + set(NO_EXPORT_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_NO_EXPORT_MACRO_NAME}) endif() if(_GEH_STATIC_DEFINE) - set(STATIC_DEFINE ${PREFIX}${_GEH_STATIC_DEFINE}) + set(STATIC_DEFINE ${_GEH_PREFIX_NAME}${_GEH_STATIC_DEFINE}) endif() if (_GEH_DEFINE_NO_DEPRECATED) @@ -273,10 +273,10 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) endif() if (_GEH_NO_DEPRECATED_MACRO_NAME) - set(NO_DEPRECATED_MACRO_NAME ${PREFIX}${_GEH_NO_DEPRECATED_MACRO_NAME}) + set(NO_DEPRECATED_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_NO_DEPRECATED_MACRO_NAME}) endif() - set(INCLUDE_GUARD_NAME "${PREFIX}${EXPORT_MACRO_NAME}_H") + set(INCLUDE_GUARD_NAME "${EXPORT_MACRO_NAME}_H") get_target_property(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY} DEFINE_SYMBOL) From 8b9b8e1676887a5b35dca0fb39e8538c10b2b00a Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 25 Aug 2011 18:56:02 +0200 Subject: [PATCH 68/72] Add documentation about the prefix and no_deprecated options. --- Modules/GenerateExportHeader.cmake | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 7ed7edcc2..8d6cab986 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -15,6 +15,9 @@ # [DEPRECATED_MACRO_NAME ] # [NO_EXPORT_MACRO_NAME ] # [STATIC_DEFINE ] +# [NO_DEPRECATED_MACRO_NAME ] +# [DEFINE_NO_DEPRECATED] +# [PREFIX_NAME ] # ) # # ADD_COMPILER_EXPORT_FLAGS( [FATAL_WARNINGS] ) @@ -97,6 +100,45 @@ # set_target_properties(static_variant PROPERTIES COMPILE_FLAGS -DLIBSHARED_AND_STATIC_STATIC_DEFINE) # # This will cause the export macros to expand to nothing when building the static library. +# +# If DEFINE_NO_DEPRECATED is specified, then a macro ${BASE_NAME}_NO_DEPRECATED will be defined +# This macro can be used to remove deprecated code from preprocessor output. +# +# option(EXCLUDE_DEPRECATED "Exclude deprecated parts of the library" FALSE) +# +# if (EXCLUDE_DEPRECATED) +# set(NO_BUILD_DEPRECATED DEFINE_NO_DEPRECATED) +# endif() +# +# generate_export_header(somelib ${NO_BUILD_DEPRECATED}) +# +# And then in somelib: +# +# \code +# class SOMELIB_EXPORT SomeClass +# { +# public: +# #ifndef SOMELIB_NO_DEPRECATED +# SOMELIB_DEPRECATED void oldMethod(); +# #endif +# }; +# +# // ... +# +# #ifndef SOMELIB_NO_DEPRECATED +# void SomeClass::oldMethod() { } +# #endif +# +# \endcode +# +# If PREFIX_NAME is specified, the argument will be used as a prefix to all +# generated macros. +# +# For example: +# +# generate_export_header(somelib PREFIX_NAME VTK_) +# +# Generates the macros VTK_SOMELIB_EXPORT etc. #============================================================================= From 826374a45ac8eb7fef9c41a391b1ca759c5a2b31 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 25 Aug 2011 20:30:58 +0200 Subject: [PATCH 69/72] Remove blank line at the start of the file. A blank line excludes the file from documentation processing. --- Modules/GenerateExportHeader.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 8d6cab986..b441f3cd3 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -1,6 +1,4 @@ - # - Function for generation of export macros for libraries -# # This module provides the function GENERATE_EXPORT_HEADER() and the # accompanying ADD_COMPILER_EXPORT_FLAGS() function. # From 75596e62f9a54c36943be0a89a0ad9874f50bf99 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 25 Aug 2011 20:31:42 +0200 Subject: [PATCH 70/72] Don't start a line with a dash(-) That is a special character in cmake dox. --- Modules/GenerateExportHeader.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index b441f3cd3..b6901e48e 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -21,8 +21,8 @@ # ADD_COMPILER_EXPORT_FLAGS( [FATAL_WARNINGS] ) # # By default GENERATE_EXPORT_HEADER() generates macro names in a file name -# determined by the name of the library. The ADD_COMPILER_EXPORT_FLAGS macro adds -# -fvisibility=hidden to CMAKE_CXX_FLAGS if supported, and is a no-op on Windows +# determined by the name of the library. The ADD_COMPILER_EXPORT_FLAGS macro +# adds -fvisibility=hidden to CMAKE_CXX_FLAGS if supported, and is a no-op on Windows # which does not need extra compiler flags for exporting support. # # This means that in the simplest case, users of these functions will be equivalent to: From 5ca8c565bc3ebabea06bd7de655d9a120a7f008c Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 25 Aug 2011 20:38:13 +0200 Subject: [PATCH 71/72] Fix up verbatim code sections of the dox. --- Modules/GenerateExportHeader.cmake | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index b6901e48e..0f5c4139f 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -28,13 +28,9 @@ # This means that in the simplest case, users of these functions will be equivalent to: # # add_compiler_export_flags() -# # add_library(somelib someclass.cpp) -# # generate_export_header(somelib) -# # install(TARGETS somelib DESTINATION ${LIBRARY_INSTALL_DIR}) -# # install(FILES # someclass.h # ${PROJECT_BINARY_DIR}/somelib_export.h DESTINATION ${INCLUDE_INSTALL_DIR} @@ -42,13 +38,10 @@ # # And in the ABI header files: # -# \code # #include "somelib_export.h" -# # class SOMELIB_EXPORT SomeClass { -# +# ... # }; -# \endcode # # The CMake fragment will generate a file in the ${CMAKE_CURRENT_BUILD_DIR} called # somelib_export.h containing the macros SOMELIB_EXPORT, SOMELIB_NO_EXPORT, @@ -92,9 +85,7 @@ # # add_library(shared_variant SHARED ${lib_SRCS}) # add_library(static_variant ${lib_SRCS}) -# # generate_export_header(shared_variant BASE_NAME libshared_and_static) -# # set_target_properties(static_variant PROPERTIES COMPILE_FLAGS -DLIBSHARED_AND_STATIC_STATIC_DEFINE) # # This will cause the export macros to expand to nothing when building the static library. @@ -103,16 +94,13 @@ # This macro can be used to remove deprecated code from preprocessor output. # # option(EXCLUDE_DEPRECATED "Exclude deprecated parts of the library" FALSE) -# # if (EXCLUDE_DEPRECATED) # set(NO_BUILD_DEPRECATED DEFINE_NO_DEPRECATED) # endif() -# # generate_export_header(somelib ${NO_BUILD_DEPRECATED}) # # And then in somelib: # -# \code # class SOMELIB_EXPORT SomeClass # { # public: @@ -121,14 +109,10 @@ # #endif # }; # -# // ... -# # #ifndef SOMELIB_NO_DEPRECATED # void SomeClass::oldMethod() { } # #endif # -# \endcode -# # If PREFIX_NAME is specified, the argument will be used as a prefix to all # generated macros. # From 6a6393c905bd5bdddfaf0eb666ee479eed54ec28 Mon Sep 17 00:00:00 2001 From: David Faure Date: Sat, 27 Aug 2011 09:42:26 +0200 Subject: [PATCH 72/72] Don't use a variable name that might be used in other files. myDir is also used in the Grantlee config file, so if Grantlee was found, this call failed. --- Modules/GenerateExportHeader.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake index 0f5c4139f..4eb67b515 100644 --- a/Modules/GenerateExportHeader.cmake +++ b/Modules/GenerateExportHeader.cmake @@ -215,7 +215,7 @@ macro(_test_compiler_has_deprecated) endif() endmacro() -set(myDir "${CMAKE_CURRENT_LIST_DIR}") +get_filename_component(_GENERATE_EXPORT_HEADER_MODULE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY) set(DEFINE_DEPRECATED) @@ -308,7 +308,7 @@ macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY) set(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY}_EXPORTS) endif() - configure_file("${myDir}/exportheader.cmake.in" "${EXPORT_FILE_NAME}" @ONLY) + configure_file("${_GENERATE_EXPORT_HEADER_MODULE_DIR}/exportheader.cmake.in" "${EXPORT_FILE_NAME}" @ONLY) endmacro() function(GENERATE_EXPORT_HEADER TARGET_LIBRARY) @@ -343,4 +343,4 @@ function(add_compiler_export_flags) set (EXTRA_FLAGS "${EXTRA_FLAGS} -fvisibility-inlines-hidden") endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}" PARENT_SCOPE) -endfunction() \ No newline at end of file +endfunction()