这似乎是一个微不足道的问题,因为CMake是一种脚本语言,一般的答案是:严格顺序.但是我遇到了几个案例,其中重要的是CMake在何时或以何种顺序解析某些文件.所以我想知道:
到目前为止我遇到的案例,上述信息很重要:
CMakeLists.txt文件外部的作用域调用变量监视:在"配置"步骤完成之前,在CMake中执行命令或宏作为最后一步也许你知道更多.
为了找到答案,我尝试了以下内容:我已经设置了一个简单的主CMakeLists.txt,如下所示,并运行cmake --trace …以分析解析顺序.
cmake_minimum_required(VERSION 2.8)
include(BeforeProjectCmd.cmake)
project(ParserTest CXX)
add_subdirectory(LibTarget1)
add_subdirectory(LibTarget2)
add_executable(ExeTarget Test.cpp)
variable_watch(CMAKE_BACKWARDS_COMPATIBILITY)
Run Code Online (Sandbox Code Playgroud)
然后,当我运行时,cmake --debug-output --trace -G"Visual Studio 12 2013" -DCMAKE_TOOLCHAIN_FILE:FILE_PATH=Toolchain.txt我得到了一个很长的痕迹,我试图总结:
# Begin try to read
CMakeCache.txt
${CMAKE_BINARY_DIR}/CMakeCache.txt
PreLoad.cmake
${CMAKE_BINARY_DIR}/PreLoad.cmake
# End try to read
? CMakeLists.txt(1): cmake_minimum_required(VERSION 2.8 )
? CMakeLists.txt(3): include(BeforeProjectCmd.cmake )
?
?? BeforeProjectCmd.cmake
?
? CMakeLists.txt(5): project(ParserTest CXX )
?? share/cmake-3.2/Modules/CMakeDetermineSystem.cmake
??
??? Toolchain.txt
?
?? ${CMAKE_PLATFORM_INFO_DIR}/CMakeSystem.cmake
??
??? …Run Code Online (Sandbox Code Playgroud) 我正在将一个项目从简单的Makefiles迁移到CMake,以添加对多个编译器(gfortran + ifort)和操作系统(Windows + Linux)的支持.当我完成整个过程时,我正在尝试简化CMake行为并为用户提供一些额外的功能.
在对可能的操作系统和使用的编译器组合进行规范化和调整编译器选项之后,添加用户定义的构建类型"DEBUGVERBOSE"并启用所有检查和警告似乎是合理的.因为我们正在处理非常古老的Fortran 77代码,所以这些设置会生成> 3000个警告,这就是为什么我不想在标准的Debug构建类型中包含所有警告的原因.对于将来的代码清理和调试,它似乎是合适的.
我想将这个用户定义的构建类型"DEBUGVERBOSE"添加到Visual Studio 2012中的可用配置列表中.同时我想摆脱cmake生成的构建类型"MinSizeRel"和"RelWithDebInfo"来简化用户界面(因为我们从不使用这些配置).
根据CMake-Wiki - 如何使用定制的扩展构建模式?我按如下方式设置我的构建类型:
# Set Project Name and supported Languages(optional)
project (s4 Fortran C)
# Set Version Number
set (S4_VERSION_MAJOR 1)
set (s4_VERSION_MINOR 0)
# Set Source Language
enable_language (Fortran)
...
if(WIN32)
# Release flags
set(CMAKE_Fortran_FLAGS_RELEASE " ${CMAKE_Fortran_FLAGS_RELEASE} /D__WIN_intel__ /assume:byterecl")
# Debug Flags
set(CMAKE_Fortran_FLAGS_DEBUG " ${CMAKE_Fortran_FLAGS_DEBUG} /D__WIN_intel__ /assume:byterecl /Od /warn:all /check:all
/warn:notruncated_source /warn:nodeclarations /warn:nounused")
# verbose Debug flags (user-defined build type)
set(CMAKE_Fortran_FLAGS_DEBUGVERBOSE " /debug:full /dbglibs …Run Code Online (Sandbox Code Playgroud) 在我们的项目中,我们使用CMake和两个不同的构建目标:Debug和Release.
Clion确实提供了两个额外的构建目标:RelWithDebInfo和MinSizeRel.现在,当Clion创建CMake缓存(对于所有4,我们只使用2)时,它会失败,因为除了调试或发布之外我们不允许其他构建目标.
您的第一个解决方法是在主CMakeList.txt上使用它:
if(NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug|Release")
return()
endif()
Run Code Online (Sandbox Code Playgroud)
但默认情况下是否可以从Clion禁用这两个配置?
我认为默认配置类型可以像这样描述:
Debug : w/ debug symbols, w/o optimization
Release : w/o debug symbols, w/ optimization
RelWithDebInfo : w/ debug symbols, w/ optimization
MinSizeRel : w/o debug symbols, w/ optimization, stripped binaries
Run Code Online (Sandbox Code Playgroud)
但我需要新的:
MyConf : w/o debug symbols, w/o optimization
Run Code Online (Sandbox Code Playgroud)
那么,如何创建呢?