如何在 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);
}
我有两种不同的 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);
}