From d5c159414177a34753181fb6c85b004929e24881 Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Thu, 19 Nov 2020 18:56:55 +0200 Subject: [PATCH 1/9] Adds possibility to build xvega statically --- CMakeLists.txt | 209 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 169 insertions(+), 40 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d1a9e8d..f12a053 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,15 @@ set(${PROJECT_NAME}_VERSION ${XVEGA_VERSION_MAJOR}.${XVEGA_VERSION_MINOR}.${XVEGA_VERSION_PATCH}) message(STATUS "xvega v${${PROJECT_NAME}_VERSION}") +# Build options +# ============= + +OPTION(XVG_DISABLE_ARCH_NATIVE "disable -march=native flag" OFF) +OPTION(XVG_DISABLE_TUNE_GENERIC "disable -mtune=generic flag" OFF) + +OPTION(XVEGA_BUILD_STATIC "Build xvega static library" ON) +OPTION(XVEGA_BUILD_SHARED "Split xvega build into executable and library" ON) + # Dependencies # ============ @@ -51,8 +60,11 @@ set(nlohmann_json_REQUIRED_VERSION 3.7.3) find_package(nlohmann_json ${nlohmann_json_REQUIRED_VERSION} REQUIRED) message(STATUS "Found nlohmann_json: ${nlohmann_json_INCLUDE_DIRS}/nlohmann_json") -# Build -# ===== +# Target and link +# =============== + +# xvega source directory +set(XVEGA_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) set(XVEGA_HEADERS ${XVEGA_INCLUDE_DIR}/xvega/xvega.hpp @@ -331,29 +343,122 @@ set(XVEGA_SOURCES ${XVEGA_SOURCE_DIR}/grammar/config/view_config.cpp ) -add_library(xvega SHARED ${XVEGA_SOURCES} ${XVEGA_HEADERS}) -target_include_directories(xvega PUBLIC $ - $) -target_link_libraries(xvega PUBLIC xtl) -target_link_libraries(xvega PUBLIC xproperty) -# target_link_libraries(xvega PUBLIC nlohmann_json) - -if (MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") -endif (MSVC) - -set_target_properties(xvega PROPERTIES -# LINKER_LANGUAGE CXX -# PUBLIC_HEADER DESTINATION "${XVEGA_HEADERS}" - COMPILE_DEFINITIONS "XVEGA_EXPORTS" -# PREFIX "" -# VERSION ${${PROJECT_NAME}_VERSION} -# SOVERSION ${${PROJECT_NAME}_VERSION} -# OUTPUT_NAME "libxvega") - ) +set(CMAKE_AR "gcc-ar") +set(CMAKE_CXX_ARCHIVE_CREATE " qcs ") +set(CMAKE_CXX_ARCHIVE_FINISH true) -# Installation -# ============ +# Targets and link - Macros +# ========================= + +include(CheckCXXCompilerFlag) + +set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) +string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE) + +set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib; ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + +macro(xvega_set_common_options target_name) + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR + CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR + CMAKE_CXX_COMPILER_ID MATCHES "Intel") + + target_compile_options(${target_name} PUBLIC -Wunused-parameter -Wextra -Wreorder) + + # Mtune generic/native + if (XVEGA_DISABLE_ARCH_NATIVE AND NOT XVEGA_DISABLE_TUNE_GENERIC) + target_compile_options(${target_name} PUBLIC -mtune=generic) + elseif (XVEGA_DISABLE_TUNE_GENERIC) + else () + target_compile_options(${target_name} PUBLIC -march=native) + endif () + + # C++14 flag + CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG) + if (HAS_CPP14_FLAG) + target_compile_features(${target_name} PRIVATE cxx_std_17) + else () + message(FATAL_ERROR "Unsupported compiler -- xvega requires C++14 support!") + endif () + + endif () + + if (APPLE) + set_target_properties(${target_name} PROPERTIES + MACOSX_RPATH ON + ) + else () + set_target_properties(${target_name} PROPERTIES + BUILD_WITH_INSTALL_RPATH 1 + SKIP_BUILD_RPATH FALSE + ) + endif () + + set_target_properties(${target_name} PROPERTIES + INSTALL_RPATH_USE_LINK_PATH TRUE + ) +endmacro() + +# Common macro for shared and static library xvega +macro(xvega_create_target target_name linkage output_name) + string(TOUPPER "${linkage}" linkage_upper) + + if (NOT ${linkage_upper} MATCHES "^(SHARED|STATIC)$") + message(FATAL_ERROR "Invalid library linkage: ${linkage}") + endif () + + add_library(${target_name} ${linkage_upper} ${XVEGA_SOURCES} ${XVEGA_HEADERS}) + xvega_set_common_options(${target_name}) + + if (MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") + endif (MSVC) + + set_target_properties(${target_name} PROPERTIES + PUBLIC_HEADER "${XVEGA_HEADERS}" + # COMPILE_DEFINITIONS "XEUS_SQLITE_EXPORTS" + PREFIX "" + VERSION ${${PROJECT_NAME}_VERSION} + SOVERSION ${XVEGA_VERSION_MAJOR} + OUTPUT_NAME "lib${output_name}") + + target_compile_definitions(${target_name} PUBLIC "XVEGA_EXPORTS") + + target_include_directories(${target_name} + PUBLIC + ${XVEGA_INCLUDE_DIRS} + $ + $) + + target_link_libraries(${target_name} PUBLIC + xtl + xproperty + ) +endmacro() + +# xvega +# ===== + +set(XVEGA_TARGETS "") + +if (XVEGA_BUILD_SHARED) + # Build libraries + xvega_create_target(xvega SHARED xvega) + list(APPEND XVEGA_TARGETS xvega) +endif () + +if (XVEGA_BUILD_STATIC) + # On Windows, a static library should use a different output name + # to avoid the conflict with the import library of a shared one. + if (CMAKE_HOST_WIN32) + xvega_create_target(xvega-static STATIC xvega-static) + else () + xvega_create_target(xvega-static STATIC xvega) + endif () + list(APPEND XVEGA_TARGETS xvega-static) +endif () + +# Tests +# ===== OPTION(BUILD_TESTS "xvega test suite" OFF) OPTION(DOWNLOAD_GTEST "build gtest from downloaded sources" OFF) @@ -366,32 +471,56 @@ if(BUILD_TESTS) add_subdirectory(test) endif() -install(TARGETS xvega - EXPORT ${PROJECT_NAME}-targets) - -# Makes the project importable from the build directory -export(EXPORT ${PROJECT_NAME}-targets - FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake") +# Installation +# ============ -install(DIRECTORY ${XVEGA_INCLUDE_DIR}/xvega - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +include(CMakePackageConfigHelpers) set(XVEGA_CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" CACHE STRING "install path for xvegaConfig.cmake") +# Install xvega +if (XVEGA_BUILD_SHARED OR XVEGA_BUILD_STATIC) + install(TARGETS ${XVEGA_TARGETS} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/xvega) + + # Makes the project importable from the build directory + export(EXPORT ${PROJECT_NAME}-targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake") +endif () + +# Configure 'xvegaConfig.cmake' for a build tree +set(XVEGA_CONFIG_CODE "####### Expanded from \@XVEGA_CONFIG_CODE\@ #######\n") +set(XVEGA_CONFIG_CODE "${XVEGA_CONFIG_CODE}set(CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake;\${CMAKE_MODULE_PATH}\")\n") +set(XVEGA_CONFIG_CODE "${XVEGA_CONFIG_CODE}##################################################") configure_package_config_file(${PROJECT_NAME}Config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" - INSTALL_DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) + INSTALL_DESTINATION ${PROJECT_BINARY_DIR}) + # INSTALL_DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) -# Remove CMAKE_SIZEOF_VOID_P from xvegaConfigVersion.cmake so that an xvegaConfig.cmake -# generated for a 64 bit target can be used for 32 bit targets and vice versa. write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake VERSION ${${PROJECT_NAME}_VERSION} COMPATIBILITY AnyNewerVersion) + +# Remove CMAKE_SIZEOF_VOID_P from xvegaConfigVersion.cmake so that an xvegaConfig.cmake +# generated for a 64 bit target can be used for 32 bit targets and vice versa. set(CMAKE_SIZEOF_VOID_P ${_XVEGA_CMAKE_SIZEOF_VOID_P}) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${PROJECT_NAME}Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake - DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) -install(EXPORT ${PROJECT_NAME}-targets - FILE ${PROJECT_NAME}Targets.cmake - DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) + DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) + +if (XVEGA_BUILD_SHARED) + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}Targets.cmake + DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) +endif () + +# Installation +# ============ +# install(DIRECTORY ${XVEGA_INCLUDE_DIR}/xvega +# DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) From ca60fcfbd8c63e8cec36ccb6babdc5579ca63d4c Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Thu, 19 Nov 2020 19:24:37 +0200 Subject: [PATCH 2/9] Trim --- CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f12a053..14024e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -518,9 +518,3 @@ if (XVEGA_BUILD_SHARED) FILE ${PROJECT_NAME}Targets.cmake DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) endif () - -# Installation -# ============ - -# install(DIRECTORY ${XVEGA_INCLUDE_DIR}/xvega -# DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) From f04f5f0aa7d185354a833ed503c87d1ab2a39004 Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Fri, 20 Nov 2020 10:13:45 +0200 Subject: [PATCH 3/9] Update conda --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ecde4c5..3a7d6a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,7 @@ jobs: - uses: actions/checkout@v2 - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v1.7.0 + uses: conda-incubator/setup-miniconda@v2.0.0 - name: Install Dependencies shell: bash -l {0} From 04841255364c8a5672e81868c3833c5d860b98cf Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Fri, 20 Nov 2020 11:51:18 +0200 Subject: [PATCH 4/9] Add static to congifcmake --- xvegaConfig.cmake.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xvegaConfig.cmake.in b/xvegaConfig.cmake.in index a682afa..5434b99 100644 --- a/xvegaConfig.cmake.in +++ b/xvegaConfig.cmake.in @@ -22,6 +22,10 @@ find_dependency(xproperty @xproperty_REQUIRED_VERSION@) if(NOT TARGET @PROJECT_NAME@) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") get_target_property(@PROJECT_NAME@_INCLUDE_DIR @PROJECT_NAME@ INTERFACE_INCLUDE_DIRECTORIES) + + if (TARGET xvega-static) + get_target_property(@PROJECT_NAME@_STATIC_LIBRARY xvega-static LOCATION) + endif () endif() set(@PROJECT_NAME@_LIBRARY "") From b7a72d3dc6f0014bc83c21c0a6d7c8be753a5036 Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Fri, 20 Nov 2020 15:03:35 +0200 Subject: [PATCH 5/9] Fix xvegacmake.config --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14024e5..3f3a323 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -501,6 +501,12 @@ configure_package_config_file(${PROJECT_NAME}Config.cmake.in INSTALL_DESTINATION ${PROJECT_BINARY_DIR}) # INSTALL_DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) +# Configure 'xvegaConfig.cmake' for an install tree +set(XVEGA_CONFIG_CODE "") +configure_package_config_file(${PROJECT_NAME}Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION ${XVEGA_CMAKECONFIG_INSTALL_DIR}) + write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake VERSION ${${PROJECT_NAME}_VERSION} COMPATIBILITY AnyNewerVersion) From 0aef11ad49fc8d0aba34e19f7809a407e5da578b Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Fri, 20 Nov 2020 18:10:32 +0200 Subject: [PATCH 6/9] Activate verbose --- .github/workflows/build.yml | 2 +- xvegaConfig.cmake.in | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3a7d6a0..8e57b7e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,7 +47,7 @@ jobs: - name: Build working-directory: ${{runner.workspace}}/build shell: bash -l {0} - run: cmake --build . --config $BUILD_TYPE --target install + run: cmake --build . --config $BUILD_TYPE --target install -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON - name: Run Tests Windows if: matrix.os == 'windows-latest' diff --git a/xvegaConfig.cmake.in b/xvegaConfig.cmake.in index 5434b99..8e1f1bd 100644 --- a/xvegaConfig.cmake.in +++ b/xvegaConfig.cmake.in @@ -18,7 +18,6 @@ find_dependency(xtl @xtl_REQUIRED_VERSION@) find_dependency(nlohmann_json @nlohmann_json_REQUIRED_VERSION@) find_dependency(xproperty @xproperty_REQUIRED_VERSION@) - if(NOT TARGET @PROJECT_NAME@) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") get_target_property(@PROJECT_NAME@_INCLUDE_DIR @PROJECT_NAME@ INTERFACE_INCLUDE_DIRECTORIES) From 530758ad9aa1d60dc6e357e81a4a423cca28ef99 Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Mon, 23 Nov 2020 10:39:27 +0200 Subject: [PATCH 7/9] Fix call verbose --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8e57b7e..8c14d05 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,12 +42,12 @@ jobs: # Note the current convention is to use the -S and -B options here to specify source # and build directories, but this is only available with CMake 3.13 and higher. # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 - run: cmake $GITHUB_WORKSPACE -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DDOWNLOAD_GTEST=ON + run: cmake $GITHUB_WORKSPACE -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DDOWNLOAD_GTEST=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON - name: Build working-directory: ${{runner.workspace}}/build shell: bash -l {0} - run: cmake --build . --config $BUILD_TYPE --target install -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + run: cmake --build . --config $BUILD_TYPE --target install - name: Run Tests Windows if: matrix.os == 'windows-latest' From 47f9ee9e09b75d29b8d7952f4ed234650e954b17 Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Mon, 23 Nov 2020 10:50:06 +0200 Subject: [PATCH 8/9] Remove archiver tool override for static LTO builds --- CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f3a323..e78af38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -343,10 +343,6 @@ set(XVEGA_SOURCES ${XVEGA_SOURCE_DIR}/grammar/config/view_config.cpp ) -set(CMAKE_AR "gcc-ar") -set(CMAKE_CXX_ARCHIVE_CREATE " qcs ") -set(CMAKE_CXX_ARCHIVE_FINISH true) - # Targets and link - Macros # ========================= From 575d008837d235ad0f9cee7622c17c0da150d86b Mon Sep 17 00:00:00 2001 From: Mariana Meireles Date: Mon, 23 Nov 2020 11:53:20 +0200 Subject: [PATCH 9/9] Correctly set CMAKE_EXE_LINKER_FLAGS --- test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e8d5c16..b10aad4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -46,7 +46,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR (CMAKE_CXX_COMPILER_ID MATCHES "Intel" set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast -Wunused-variable -ftemplate-backtrace-limit=0") elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_cxx_std_flag} /MP /bigobj") - set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -59,7 +59,7 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast -Wunused-variable") else() # We are using clang-cl set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_cxx_std_flag} /bigobj") - set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING) endif()