
CMake教程10-添加生成器表达式
生成器表达式
这个名词目前我们是第一次提到,表面理解为根据不同条件规则生成不同的信息内容(可以用于链接库信息、引入目录或编译选项等等很多地方)
生成器表达式可用于条件链接、条件定义,编译时可以根据条件选择引入目录等。
生成器表达式的可是类似于$<...>
,例如:$<STREQUAL:$<UPPER_CASE:${foo}>,"BAR">
(判断变量${foo}转换大写后是否为"BAR")。
还有,生成器表达式可以嵌套使用。
生成器表达式可以分为:逻辑表达式、信息表达式和输出表达式三种。
逻辑表达式用于生成条件输出,基本的条件表达式格式为:
$<condition:true_string>
当condition
为1
时会生成输出true_string
内容,否则输出空字符串。
我们来看看这样简单的条件表达式的作用:
比如,我们之前是这样设置编译选项支持C++11
标准的:
# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
现在修改为:
add_library(compiler_flags INTERFACE)
target_compile_features(compiler_flags INTERFACE cxx_std_11)
接下来根据不同编译器的信息来设置正确的警告选项:
set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU>")
set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")
target_compile_options(compiler_flags INTERFACE
"$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>"
"$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>"
)
这里使用的生成器表达式有:
- $<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU>
表示C++编译器厂商为ARMClang,AppleClang,Clang,GNU
其中的一个则此表达式为1
。编译器厂商所有取值及含义
- $<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>
标识如果${gcc_like_cxx}
为1
时,生成编译选项信息为后面字符串。这里还有一个$<BUILD_INTERFACE:...>
表达式,作用是让后面...
选项信息仅适用当前target
目标或者在同一个构建系统的引用此target
的其他target
目标。
$<BUILD_INTERFACE:...>
可以理解为限制了选项影响范围,仅影响使用此target
目标的编译命令。
比如,我们打算在myfunc
库的编译时使用compiler_flags
目标,怎么做呢?
在func/CMakeLists.txt
中追加如下:
target_link_libraries(myfunc PUBLIC compiler_flags)
这样就可以了。
还有个问题,我们怎么检查编译选项受到影响了呢?
当然是编译时跟踪输出编译命令信息了,例如make
命令可以执行如下:
$ make --trace
执行后,我们就可以看到类似如下的信息:
[ 57%] Building CXX object func/CMakeFiles/myfunc.dir/myfunc.cpp.o
cd /apps/code/github/my/cmake/tutorial/build_ch10/func && /usr/bin/c++ -Dmyfunc_EXPORTS -I/apps/code/github/my/cmake/tutorial/build_ch10/func -fPIC -Wall -Wextra -Wshadow -Wformat=2 -Wunused -o CMakeFiles/myfunc.dir/myfunc.cpp.o -c /apps/code/github/my/cmake/tutorial/ch10/func/myfunc.cpp
func/CMakeFiles/myfunc.dir/build.make:104:更新“libmyfunc.so”,因为:func/CMakeFiles/myfunc.dir/link.txt func/CMakeFiles/myfunc.dir/myfunc.cpp.o func/CMakeFiles/myfunc.dir/build.make
/usr/bin/cmake -E cmake_echo_color --switch= --green --bold --progress-dir=/apps/code/github/my/cmake/tutorial/build_ch10/CMakeFiles --progress-num=7 "Linking CXX shared library ../libmyfunc.so"
我们找到了-Wall -Wextra -Wshadow -Wformat=2 -Wunused
编译选项使用在了myfunc.cpp
文件的编译过程中。
到这里,我们就基本了解了如何使用生成器表达式
,如何使用它给我们的编译添加更多选项。
编译器厂商所有取值及含义:
Absoft = Absoft Fortran (absoft.com)
ADSP = Analog VisualDSP++ (analog.com)
AppleClang = Apple Clang (apple.com)
ARMCC = ARM Compiler (arm.com)
ARMClang = ARM Compiler based on Clang (arm.com)
Bruce = Bruce C Compiler
CCur = Concurrent Fortran (ccur.com)
Clang = LLVM Clang (clang.llvm.org)
Cray = Cray Compiler (cray.com)
Embarcadero, Borland = Embarcadero (embarcadero.com)
Flang = Flang LLVM Fortran Compiler
Fujitsu = Fujitsu HPC compiler (Trad mode)
FujitsuClang = Fujitsu HPC compiler (Clang mode)
G95 = G95 Fortran (g95.org)
GNU = GNU Compiler Collection (gcc.gnu.org)
GHS = Green Hills Software (www.ghs.com)
HP = Hewlett-Packard Compiler (hp.com)
IAR = IAR Systems (iar.com)
Intel = Intel Compiler (intel.com)
IntelLLVM = Intel LLVM-Based Compiler (intel.com)
MSVC = Microsoft Visual Studio (microsoft.com)
NVHPC = NVIDIA HPC SDK Compiler (nvidia.com)
NVIDIA = NVIDIA CUDA Compiler (nvidia.com)
OpenWatcom = Open Watcom (openwatcom.org)
PGI = The Portland Group (pgroup.com)
PathScale = PathScale (pathscale.com)
ROCMClang = ROCm Toolkit Clang-based Compiler (rocmdocs.amd.com)
SDCC = Small Device C Compiler (sdcc.sourceforge.net)
SunPro = Oracle Solaris Studio (oracle.com)
TI = Texas Instruments (ti.com)
TinyCC = Tiny C Compiler (tinycc.org)
XL, VisualAge, zOS = IBM XL (ibm.com)
XLClang = IBM Clang-based XL (ibm.com)
转载本文时请注明出处及本文链接地址CMake教程10-添加生成器表达式。