В следующем файле cmake я пытаюсь использовать некоторые флаги компилятора, которые я хочу применять только к своему коду, а не к различным библиотекам, которые он использует. Например, Wshadow и eve::eve не очень хорошо работают вместе, но поскольку я не писал eve, я хочу, чтобы этот флаг относился только к моему коду.
Я думал, что смогу сделать это с помощью target_compile_options, но это не сработало.
##############################################
# Find/Install system dependencies
include(FetchContent)
include(ExternalProject)
# TODO: consider using std::format from cpp23
# Formatting library
FetchContent_Declare(
fmtlib
GIT_REPOSITORY https://github.com/fmtlib/fmt.git
GIT_TAG 10.1.1)
set(FMT_INSTALL ON)
# Adds fmt::fmt
FetchContent_MakeAvailable(fmtlib)
# Eigen
FetchContent_Declare(
Eigen
GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
GIT_TAG 3.4.0
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE)
set(EIGEN_BUILD_DOC OFF)
set(BUILD_TESTING OFF)
set(EIGEN_BUILD_PKGCONFIG OFF)
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
FetchContent_MakeAvailable(Eigen)
find_package (Eigen3 3.4 REQUIRED NO_MODULE)
# Fast float
FetchContent_Declare(
fast_float
GIT_REPOSITORY https://github.com/fastfloat/fast_float.git
GIT_TAG tags/v6.0.0
GIT_SHALLOW TRUE)
set(FASTFLOAT_INSTALL OFF)
# Adds fast_float
FetchContent_MakeAvailable(fast_float)
# Fast unordered map and set
FetchContent_Declare(
unordered_dense
GIT_REPOSITORY https://github.com/martinus/unordered_dense.git
GIT_TAG tags/v4.3.1
GIT_SHALLOW TRUE)
# Adds unordered_dense::unordered_dense
FetchContent_MakeAvailable(unordered_dense)
# SIMD vector operations
FetchContent_Declare(
vectorclass
GIT_REPOSITORY https://github.com/vectorclass/version2.git
GIT_TAG tags/v2.02.01)
FetchContent_MakeAvailable(vectorclass)
# Fast hash Functions
FetchContent_Declare(
xxhash
GIT_REPOSITORY https://github.com/Cyan4973/xxHash.git
GIT_TAG tags/v0.8.2
GIT_SHALLOW TRUE)
set(XXHASH_BUNDLED_MODE ON)
set(XXH_INLINE_ALL ON)
# Adds xxhash
FetchContent_MakeAvailable(xxHash)
file(GLOB XXHASH_SOURCES ${xxhash_SOURCE_DIR}/*.c)
list(REMOVE_ITEM XXHASH_SOURCES ${xxhash_SOURCE_DIR}/xxhsum.c)
list(REMOVE_ITEM XXHASH_SOURCES ${xxhash_SOURCE_DIR}/xxh_x86dispatch.c)
add_library(xxhash STATIC ${XXHASH_SOURCES})
target_include_directories(xxhash PUBLIC ${xxhash_SOURCE_DIR})
# EVE vector engine
#TODO: setup eve like this [https://github.com/STEllAR-GROUP/hpx/bl ... .cmake#L31]
FetchContent_Declare(
eve
GIT_REPOSITORY https://github.com/jfalcou/eve.git
GIT_TAG tags/v2023.02.15
GIT_SHALLOW TRUE)
set(EVE_BUILD_DOCUMENTATION OFF)
set(EVE_BUILD_TEST OFF)
FetchContent_MakeAvailable(eve)
# MDSpan
find_package(mdspan QUIET)
if (NOT mdspan_FOUND)
message(STATUS "No installed mdspan found, fetching from Github")
include(FetchContent)
FetchContent_Declare(
mdspan
GIT_REPOSITORY https://github.com/kokkos/mdspan.git
GIT_TAG stable
)
FetchContent_MakeAvailable(mdspan)
FetchContent_GetProperties(mdspan)
if(NOT mdspan_POPULATED)
FetchContent_Populate(mdspan)
add_subdirectory(${mdspan_SOURCE_DIR} ${mdspan_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
endif()
# Sorter vector engine
FetchContent_Declare(
cpp-sort
GIT_REPOSITORY https://github.com/Morwenn/cpp-sort.git
GIT_TAG 1.15.0
GIT_SHALLOW TRUE)
FetchContent_MakeAvailable(cpp-sort)
# taskflow
FetchContent_Declare(
taskflow
GIT_REPOSITORY https://github.com/taskflow/taskflow.git
GIT_TAG v3.6.0
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
)
FetchContent_GetProperties(taskflow)
if(NOT taskflow_POPULATED)
FetchContent_Populate(taskflow)
endif()
set(TF_BUILD_TESTS OFF CACHE BOOL "Enables build of tests")
set(TF_BUILD_EXAMPLES OFF CACHE BOOL "Enables build of examples")
FetchContent_MakeAvailable(taskflow)
add_library(taskflow INTERFACE)
target_include_directories(taskflow INTERFACE ${taskflow_SOURCE_DIR})
##############################################
# Create target and set properties
file(GLOB_RECURSE HEADER_LIST CONFIGURE_DEPENDS
"${PROJECT_SOURCE_DIR}/include/my_project/*/*.hpp"
"${PROJECT_SOURCE_DIR}/include/vstat/*.hpp"
"${PROJECT_SOURCE_DIR}/include/csv/*.hpp"
"${PROJECT_SOURCE_DIR}/include/ceres/*.h"
)
file(GLOB_RECURSE SRC_LIST CONFIGURE_DEPENDS
"${PROJECT_SOURCE_DIR}/src/*/*.cpp"
)
add_library(myproject
${SRC_LIST}
${HEADER_LIST}
)
#Add an alias so that library can be used inside the build tree, e.g. when testing
add_library(Myproject::myproject ALIAS myproject)
#Set target properties
target_include_directories(myproject
PUBLIC
$
$
${PROJECT_SOURCE_DIR}/include
${vectorclass_SOURCE_DIR}
)
# TODO: put -Werror in there again once the fmtlib tautological bug is fixed (C++ is 90% busy work for large projects)
target_compile_features(myproject PRIVATE cxx_auto_type)
#target_compile_options(myproject PRIVATE
# $)
if (${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
target_compile_definitions(myproject PRIVATE
$
$
$
$
$
)
target_compile_options(myproject PRIVATE
$
$
$
$
$
)
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
target_compile_definitions(myproject PRIVATE
$
$
$
$
$
)
target_compile_options(myproject PRIVATE
$
$
$
$
$
)
endif ()
target_link_libraries(myproject
PUBLIC
fmt::fmt Eigen3::Eigen unordered_dense::unordered_dense eve::eve
PRIVATE
xxhash fast_float std::mdspan cpp-sort::cpp-sort taskflow
INTERFACE
std::mdspan
)
##############################################
# Installation instructions
# TODO: fix libraries not being in any export set
option(TURINGFORGE_INSTALL "Enable install" OFF)
set(TURINGFORGE_INSTALL OFF)
if (TURINGFORGE_INSTALL)
include(GNUInstallDirs)
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/Myproject)
install(TARGETS myproject
EXPORT myproject-targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
# This is required so that the exported target has the name Myproject and not myproject
set_target_properties(myproject PROPERTIES EXPORT_NAME Myproject)
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
# Export the targets to a script
install(EXPORT myproject-targets
FILE
TuringforgeTargets.cmake
NAMESPACE
Myproject::
DESTINATION
${INSTALL_CONFIGDIR}
)
# Create a ConfigVersion.cmake file
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/TuringforgeConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/../cmake/TuringforgeConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/TuringforgeConfig.cmake
INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
)
# Install the config, configversion and custom find modules if any
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/TuringforgeConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/TuringforgeConfigVersion.cmake
DESTINATION ${INSTALL_CONFIGDIR}
)
##############################################
## Exporting from the build tree
#configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/SOMECUSTOM.cmake
# ${CMAKE_CURRENT_BINARY_DIR}/SOMECUSTOM.cmake
# COPYONLY)
export(EXPORT myproject-targets
FILE ${CMAKE_CURRENT_BINARY_DIR}/TuringforgeTargets.cmake
NAMESPACE Myproject::)
# Register package in the User Package Registry
export(PACKAGE Myproject)
# Make sure IDEs put the headers in a nice place
source_group(
TREE "${PROJECT_SOURCE_DIR}/include"
PREFIX "Header Files"
FILES ${HEADER_LIST}
)
endif()
Подробнее здесь: https://stackoverflow.com/questions/790 ... -libraries
Как я могу применять флаги компилятора только к своему коду и исключать импортированные библиотеки? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Есть ли способ определить флаги в Java и запустить код, только если эти флаги определены?
Anonymous » » в форуме JAVA - 0 Ответы
- 34 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как запретить компоновщику MSVC исключать файлы obj, объекты которых не используются?
Anonymous » » в форуме C++ - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-