From 3988fc18ba65af0ea5b17994c481d1c67ff40fae Mon Sep 17 00:00:00 2001 From: Stephen McDowell Date: Mon, 7 Oct 2019 07:18:51 -0400 Subject: [PATCH] add object library support for parent projects - Transitive dependency management via `target_link_libraries` with object libraries introduced in CMake 3.12. - Update a few minor elements related to switching to new CMake. --- CMakeLists.txt | 6 +----- src/CMakeLists.txt | 44 ++++++++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 04174cd1a..d75795dca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,9 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.12) project(GLFW VERSION 3.4.0 LANGUAGES C) set(CMAKE_LEGACY_CYGWIN_WIN32 OFF) -if (POLICY CMP0054) - cmake_policy(SET CMP0054 NEW) -endif() - if (POLICY CMP0077) cmake_policy(SET CMP0077 NEW) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 068673084..d3a1ccfae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -92,7 +92,19 @@ if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR COMPILE_FLAGS -Wdeclaration-after-statement) endif() -add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS}) +add_library(glfw-objects OBJECT ${glfw_SOURCES} ${glfw_HEADERS}) +add_library(glfw "") +target_link_libraries(glfw PUBLIC glfw-objects) + +# XCode bug: need at least one "real" source file. See: +# https://cmake.org/Bug/view.php?id=14044 +# https://cmake.org/cmake/help/latest/command/add_library.html#object-libraries +if (XCODE) + set(glfw_xcode_dummy "${CMAKE_CURRENT_BINARY_DIR}/xcode_dummy.c") + file(WRITE ${glfw_xcode_dummy} "") + target_sources(glfw PRIVATE ${glfw_xcode_dummy}) +endif() + set_target_properties(glfw PROPERTIES OUTPUT_NAME ${GLFW_LIB_NAME} VERSION ${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR} @@ -100,11 +112,11 @@ set_target_properties(glfw PROPERTIES POSITION_INDEPENDENT_CODE ON FOLDER "GLFW3") -target_compile_definitions(glfw PRIVATE _GLFW_USE_CONFIG_H) -target_include_directories(glfw PUBLIC +target_compile_definitions(glfw-objects PRIVATE _GLFW_USE_CONFIG_H) +target_include_directories(glfw-objects PUBLIC "$" "$") -target_include_directories(glfw PRIVATE +target_include_directories(glfw-objects PRIVATE "${GLFW_SOURCE_DIR}/src" "${GLFW_BINARY_DIR}/src" ${glfw_INCLUDE_DIRS}) @@ -113,11 +125,11 @@ target_include_directories(glfw PRIVATE # the inclusion of stddef.h (by glfw3.h), which is itself included before # win32_platform.h. We define them here until a saner solution can be found # NOTE: MinGW-w64 and Visual C++ do /not/ need this hack. -target_compile_definitions(glfw PRIVATE +target_compile_definitions(glfw-objects PRIVATE "$<$:UNICODE;WINVER=0x0501>") # Enable a reasonable set of warnings (no, -Wextra is not reasonable) -target_compile_options(glfw PRIVATE +target_compile_options(glfw-objects PRIVATE "$<$:-Wall>" "$<$:-Wall>" "$<$:-Wall>") @@ -139,19 +151,23 @@ if (BUILD_SHARED_LIBS) set_target_properties(glfw PROPERTIES IMPORT_SUFFIX "dll.lib") endif() - target_compile_definitions(glfw INTERFACE GLFW_DLL) + target_compile_definitions(glfw-objects INTERFACE GLFW_DLL) elseif (APPLE) # Add -fno-common to work around a bug in Apple's GCC - target_compile_options(glfw PRIVATE "-fno-common") + target_compile_options(glfw-objects PRIVATE "-fno-common") set_target_properties(glfw PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_LIBDIR}") endif() - if (UNIX) - # Hide symbols not explicitly tagged for export from the shared library - target_compile_options(glfw PRIVATE "-fvisibility=hidden") - endif() + # Hide symbols not explicitly tagged for export from the shared library. + # Results in e.g., -fvisibility=hidden for gcc/clang. Requires PIC code. + set_target_properties(glfw-objects glfw + PROPERTIES + C_VISIBILITY_PRESET "hidden" + VISIBILITY_INLINES_HIDDEN ON + POSITION_INDEPENDENT_CODE ON + ) target_link_libraries(glfw PRIVATE ${glfw_LIBRARIES}) else() @@ -159,11 +175,11 @@ else() endif() if (MSVC) - target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS) + target_compile_definitions(glfw-objects PRIVATE _CRT_SECURE_NO_WARNINGS) endif() if (GLFW_INSTALL) - install(TARGETS glfw + install(TARGETS glfw glfw-objects EXPORT glfwTargets RUNTIME DESTINATION "bin" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"