我有两种不同的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可以设置编译器选项,特别是宏定义。这种宏可以被前处理器访问。在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);
}