CMake教程10-添加生成器表达式

CMake教程10-添加生成器表达式

生成器表达式这个名词目前我们是第一次提到,表面理解为根据不同条件规则生成不同的信息内容(可以用于链接库信息、引入目录或编译选项等等很多地方)

生成器表达式可用于条件链接、条件定义,编译时可以根据条件选择引入目录等。

生成器表达式的可是类似于$<...>,例如:$<STREQUAL:$<UPPER_CASE:${foo}>,"BAR">(判断变量${foo}转换大写后是否为"BAR")。

还有,生成器表达式可以嵌套使用。

生成器表达式可以分为:逻辑表达式、信息表达式和输出表达式三种。

逻辑表达式用于生成条件输出,基本的条件表达式格式为:

$<condition:true_string>

condition1时会生成输出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-添加生成器表达式

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注