如何在 C++ 中检查 CMake 变量

How to check CMake variable in C++

我有两种不同的 CMake 构建:一种使用 emscripten,另一种使用常规 g++。基于构建类型,我想执行某些 C++ 代码块。我不确定该怎么做。

CMAKE 文件:

cmake_minimum_required(VERSION 3.15)
project(project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

if( ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
    # build with emscripten
else()
    # build regularly
    find_package(SDL2 REQUIRED)
    find_package(Freetype REQUIRED)
endif()
include_directories(${CMAKE_SOURCE_DIR}/include ${SDL2_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS})

add_executable(project src/main.cpp src/glad.c src/Game.cpp)
target_link_libraries(project ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES})

在 C++ 中,我想执行以下操作:

if( not_emscripten_build ) {
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
}

无法在 C++ 中访问 CMake 变量。但是,CMake 可以设置编译器选项,特别是宏定义。这样的宏可以被预处理器访问。使用 target_compile_definitions 命令。

经过一些尝试,我使用编译定义提出了以下解决方案:


    cmake_minimum_required(VERSION 3.15)
    project(project)

    set(CMAKE_CXX_STANDARD 20)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

    if( ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
        add_compile_definitions(BUILD_TYPE="emcc")
    else()
        find_package(SDL2 REQUIRED)
        find_package(Freetype REQUIRED)
        add_compile_definitions(BUILD_TYPE="gcc")
    endif()
    include_directories(${CMAKE_SOURCE_DIR}/include ${SDL2_INCLUDE_DIRS} 
    ${FREETYPE_INCLUDE_DIRS})

    add_executable(project src/main.cpp src/glad.c src/Game.cpp)
    target_link_libraries(project ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES})

在我的 C++ 项目中,我包含了以下头文件:



    #ifndef JUMPYBLOCK_BUILDTYPE_H
    #define JUMPYBLOCK_BUILDTYPE_H
    const bool EM_BUILD = strcmp(BUILD_TYPE, "emcc") == 0;
    #endif //JUMPYBLOCK_BUILDTYPE_H

然后我可以在 C++ 中执行以下操作:



    if( !EM_BUILD) {
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 
        SDL_GL_CONTEXT_PROFILE_CORE);
    }