检测 cmake 文件中的编译器配置

Detecting compiler configuration in cmake file

要么这真的很简单,但我只是找不到正确的方法,要么我完全误解了某些东西。我正在尝试向 CMakeLists.txt 文件添加条件以包含正确的 .lib 文件,具体取决于正在使用的构建配置类型(目前在 visual studio 内)。因此,例如,如果 visual studio 中的配置设置为 Debug,则使用文件 zlibstaticd.libzlibstatic.lib。以下是我所拥有的不起作用的东西:

add_library(ZLIB_LIBRARY OBJECT IMPORTED)
# zlib added via assimp, and I can't get CMAKE_DEBUG_POSTFIX value to overwrite (because it's set within zlibs cmake file when using MSVC)
# so we have to do this check

if($<CONFIG:Debug>)
    set_target_properties(ZLIB_LIBRARY PROPERTIES IMPORTED_OBJECTS ${ASSIMP_INSTALL_DIR}/lib/zlibstaticd.lib)
else()
    set_target_properties(ZLIB_LIBRARY PROPERTIES IMPORTED_OBJECTS ${ASSIMP_INSTALL_DIR}/lib/zlibstatic.lib)
endif()

我也试过 CMAKE_BUILD_TYPE 但它始终是一个空字符串。下面是我的整个 CMakeLists.txt 文件,因此您可以看到我在做什么(构建一个包含许多其他静态库的单一静态库):

cmake_minimum_required(VERSION 3.20.0)


# Define our project name
set(PROJECT_NAME myProjectName)
project(${PROJECT_NAME})


# Make sure binary directory is not the same as source directory
if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
  message(
    FATAL_ERROR
      "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there."
  )
endif()


# This Project Depends on External Project(s) 
include(ExternalProject)


set(libGLFW glfw)
ExternalProject_Add(${libGLFW}
PREFIX          ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLFW}
GIT_REPOSITORY  https://github.com/glfw/glfw.git
GIT_TAG         3.3.4
GIT_SHALLOW     ON
CMAKE_ARGS      -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLFW}/install
                -DGLFW_BUILD_DOCS:BOOL=OFF
                -DGLFW_BUILD_EXAMPLES:BOOL=OFF
                -DGLFW_BUILD_TESTS:BOOL=OFF
)

set(libGLAD glad)
ExternalProject_Add(${libGLAD}
PREFIX          ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLAD}
GIT_REPOSITORY  https://github.com/Dav1dde/glad.git
GIT_TAG         origin/master
GIT_SHALLOW     ON
CMAKE_ARGS      -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLAD}/install
                -DGLAD_INSTALL:BOOL=ON
                -DGLAD_PROFILE:STRING="core"
                -DGLAD_ALL_EXTENSIONS:BOOL=ON
                -DUSE_MSVC_RUNTIME_LIBRARY_DLL:BOOL=OFF
)

set(libGLM glm)
ExternalProject_Add(${libGLM}
PREFIX          ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLM}
GIT_REPOSITORY  https://github.com/g-truc/glm.git
GIT_TAG         origin/master
GIT_SHALLOW     ON
CMAKE_ARGS      -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLM}/install
                -DBUILD_SHARED_LIBS:BOOL=OFF
                -DBUILD_STATIC_LIBS:BOOL=OFF
                -DGLM_TEST_ENABLE:BOOL=OFF
)



set(libAssimp assimp)
ExternalProject_Add(${libAssimp}
PREFIX          ${CMAKE_CURRENT_BINARY_DIR}/dep/${libAssimp}
GIT_REPOSITORY  https://github.com/assimp/assimp.git
GIT_TAG         v5.0.1
GIT_SHALLOW     ON
CMAKE_ARGS      -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/dep/${libAssimp}/install
                -DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT:BOOL=OFF
                -DASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT:BOOL=OFF
                -DBUILD_SHARED_LIBS:BOOL=OFF
                -DASSIMP_BUILD_ASSIMP_TOOLS:BOOL=OFF
                -DASSIMP_BUILD_TESTS:BOOL=OFF
                -DASSIMP_BUILD_FBX_IMPORTER:BOOL=ON
                -DASSIMP_BUILD_OBJ_IMPORTER:BOOL=ON
                -DASSIMP_BUILD_OBJ_EXPORTER:BOOL=ON
                -DASSIMP_LIBRARY_SUFFIX:STRING=
                -DLIBRARY_SUFFIX:STRING=
                -DCMAKE_DEBUG_POSTFIX:STRING=
                -DASSIMP_INJECT_DEBUG_POSTFIX:BOOL=OFF
)

# Note set_target_properties will need conditionals for windows/linux since extensions differ

# Create the oject files we will join together to create our singular static library, using the projects
# that were previously added above via ExternalProject_Add
# INSTALL_DIR not being set to value of CMAKE_INSTALL_PREFIX, so manuallysetting
#ExternalProject_Get_Property(${libGLFW} INSTALL_DIR)

# SETUP GLFW
set(GLFW_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLFW}/install)
add_library(GLFW_LIBRARY OBJECT IMPORTED)
set_target_properties(GLFW_LIBRARY PROPERTIES IMPORTED_OBJECTS ${GLFW_INSTALL_DIR}/lib/glfw3.lib)

# SETUP GLAD
set(GLAD_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLAD}/install)
add_library(GLAD_LIBRARY OBJECT IMPORTED)
set_target_properties(GLAD_LIBRARY PROPERTIES IMPORTED_OBJECTS ${GLAD_INSTALL_DIR}/lib/glad.lib)

# SETUP GLM
# GLM is header only library, so we simply include it's include directory in target_include_directories below
set(GLM_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLM}/install)

# SETUP ASSIMP and it's dependencies
set(ASSIMP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep/${libAssimp}/install)
add_library(ASSIMP_LIBRARY OBJECT IMPORTED)
set_target_properties(ASSIMP_LIBRARY PROPERTIES IMPORTED_OBJECTS ${ASSIMP_INSTALL_DIR}/lib/assimp.lib)

add_library(IRRXML_LIBRARY OBJECT IMPORTED)
set_target_properties(IRRXML_LIBRARY PROPERTIES IMPORTED_OBJECTS ${ASSIMP_INSTALL_DIR}/lib/IrrXML.lib)

add_library(ZLIB_LIBRARY OBJECT IMPORTED)
# zlib added via assimp, and I can't get CMAKE_DEBUG_POSTFIX value to overwrite (because it's set within zlibs cmake file when using MSVC)
# so we have to do this check

if($<CONFIG:Debug>)
    set_target_properties(ZLIB_LIBRARY PROPERTIES IMPORTED_OBJECTS ${ASSIMP_INSTALL_DIR}/lib/zlibstaticd.lib)
else()
    set_target_properties(ZLIB_LIBRARY PROPERTIES IMPORTED_OBJECTS ${ASSIMP_INSTALL_DIR}/lib/zlibstatic.lib)
endif()




# Documentation states not to do this, but do it anyway for the time being since it prevents us from having
# to manually list all project files
file(GLOB_RECURSE headers CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/inc/*.h")
file(GLOB_RECURSE sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")


# Create a single .lib file containing our compiled objects, and the compiled objects of all other dependencies
add_library(${PROJECT_NAME} STATIC ${headers} ${sources} 
    $<TARGET_OBJECTS:GLFW_LIBRARY> 
    $<TARGET_OBJECTS:GLAD_LIBRARY>
    $<TARGET_OBJECTS:ASSIMP_LIBRARY>
    $<TARGET_OBJECTS:IRRXML_LIBRARY>
    $<TARGET_OBJECTS:ZLIB_LIBRARY>
)


# Add all include file paths
target_include_directories(${PROJECT_NAME}
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc
    PUBLIC ${GLFW_INSTALL_DIR}/include
    PUBLIC ${GLAD_INSTALL_DIR}/include
    PUBLIC ${GLM_INSTALL_DIR}/include
    PUBLIC ${ASSIMP_INSTALL_DIR}/include
)


# Specify the order in which libs depend on each other, use the name of the ExternalProject, not the name of the
# library object you create and use with add_library
add_dependencies(${PROJECT_NAME} ${libGLFW} ${libGLAD} ${libGLM} ${libAssimp})
add_library(ZLIB_LIBRARY OBJECT IMPORTED)
# zlib added via assimp, and I can't get CMAKE_DEBUG_POSTFIX value to overwrite (because it's set within zlibs cmake file when using MSVC)
# so we have to do this check

if($<CONFIG:Debug>)
    set_target_properties(ZLIB_LIBRARY PROPERTIES IMPORTED_OBJECTS ${ASSIMP_INSTALL_DIR}/lib/zlibstaticd.lib)
else()
    set_target_properties(ZLIB_LIBRARY PROPERTIES IMPORTED_OBJECTS ${ASSIMP_INSTALL_DIR}/lib/zlibstatic.lib)
endif()

生成器表达式在 配置步骤 运行 之后计算,因此当 if() 语句看到它们时,它们只是文字字符串。基本上,CMake 配置步骤是 元编程 一种目标和生成器表达式的声明性语言,通过发电机。

您可以按如下方式设置库:

add_library(zlib OBJECT IMPORTED)
set_target_properties(
  zlib
  PROPERTIES
    IMPORTED_OBJECTS_RELEASE "${ASSIMP_INSTALL_DIR}/lib/zlibstatic.lib"
    IMPORTED_OBJECTS_DEBUG "${ASSIMP_INSTALL_DIR}/lib/zlibstaticd.lib"
)

CMake 在解析库路径时首先尝试 IMPORTED_OBJECTS_$<CONFIG>,然后再尝试 IMPORTED_OBJECTS


综上所述,我想知道您为什么不只使用 find_package、vcpkg、Conan 或 add_subdirectory / FetchContent 来管理您的依赖项。 这似乎很痛苦,因为所有这些库(我认为)要么提供自己的 find_package 配置包,要么 CMake 为它们提供一个查找模块。