15.4 复制编译标志

现在,让我们尝试调整编译器标志来进行引用构建。

定义编译器标志

目前为止,我们还没有定义任何自定义编译器标志,参考Autotools构建中,代码是使用的编译标志有-g -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2,这些标示都是GNU C编译器可以识别的。

我们的第一个定义如下:

  1. if(CMAKE_C_COMPILER_ID MATCHES GNU)
  2. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2")
  3. endif()

并且,在生成源文件之前,我们将把这段代码放在src/CMakeLists.txt的顶部(因为pathdef.c有使用到${CMAKE_C_FLAGS}):

  1. # <- we will define flags right here
  2. include(autogenerate.cmake)
  3. generate_config_h()
  4. generate_pathdef_c()
  5. generate_osdef_h()

编译器标志定义的一个小修改是将-O2定义为Release配置标志,并关闭Debug的配置:

  1. if(CMAKE_C_COMPILER_ID MATCHES GNU)
  2. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -U_FORTIFY_SOURCE
  3. -D_FORTIFY_SOURCE=1")
  4. set(CMAKE_C_FLAGS_RELEASE "-O2")
  5. set(CMAKE_C_FLAGS_DEBUG "-O0")
  6. endif()

请使用make VERBOSE=1验证,构建是否使用了预期的标志。

编译器标志的作用域

在这个特殊的示例项目中,所有源文件都使用相同的编译标志。对于其他项目,我们可能不希望像上面那样全局定义编译标志,而是使用target_compile_options为每个目标分别定义编译标志。这样做的好处是更灵活、范围更小。在我们的例子中,这能减少不必要的代码复制。