Skip to content

Commit

Permalink
update chapter 7
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaoweiChen committed Oct 19, 2019
1 parent 52f8f10 commit 7152d92
Show file tree
Hide file tree
Showing 11 changed files with 119 additions and 125 deletions.
2 changes: 1 addition & 1 deletion SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
* [7.3 编写函数来测试和设置编译器标志](content/chapter7/7.3-chinese.md)
* [7.4 用指定参数定义函数或宏](content/chapter7/7.4-chinese.md)
* [7.5 重新定义函数和宏](content/chapter7/7.5-chinese.md)
* [7.6 废弃使用函数、宏和变量](content/chapter7/7.6-chinese.md)
* [7.6 使用废弃函数、宏和变量](content/chapter7/7.6-chinese.md)
* [7.7 add_subdirectory的限定范围](content/chapter7/7.7-chinese.md)
* [7.8 使用target_sources避免全局变量](content/chapter7/7.8-chinese.md)
* [7.9 组织Fortran项目](content/chapter7/7.9-chinese.md)
Expand Down
2 changes: 1 addition & 1 deletion content/chapter7/7.0-chinese.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* 编写函数来测试和设置编译器标志
* 用指定参数定义函数或宏
* 重新定义函数和宏
* 废弃使用函数、宏和变量
* 使用废弃函数、宏和变量
* add_subdirectory的限定范围
* 使用target_sources避免全局变量
* 组织Fortran项目
Expand Down
22 changes: 11 additions & 11 deletions content/chapter7/7.1-chinese.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
.
├── CMakeLists.txt
├── src
├── CMakeLists.txt
├── main.cpp
├── sum_integers.cpp
└── sum_integers.hpp
├── CMakeLists.txt
├── main.cpp
├── sum_integers.cpp
└── sum_integers.hpp
└── tests
├── catch.hpp
├── CMakeLists.txt
Expand All @@ -24,7 +24,7 @@

## 具体实施

1. 定义了最低CMake版本、项目名称和支持的语言,并要求支持C++11标准:
1. 定义了CMake最低版本、项目名称和支持的语言,并要求支持C++11标准:

```cmake
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
Expand All @@ -34,7 +34,7 @@
set(CMAKE_CXX_STANDARD_REQUIRED ON)
```

2. 根据GNU标准定义binary和library路径:
2. 根据GNU标准定义`binary``library`路径:

```cmake
include(GNUInstallDirs)
Expand Down Expand Up @@ -71,7 +71,7 @@
target_link_libraries(cpp_test sum_integers)
```

6. 然后,定义一个新宏`add_catch_test`,我们将在稍后讨论:
6. 定义一个新宏`add_catch_test`:

```cmake
macro(add_catch_test _name _cost)
Expand Down Expand Up @@ -102,7 +102,7 @@
endmacro()
```

7. 最后,我们使用`add_catch_test`定义了两个测试。此外,还设置和打印了一个变量的值:
7. 最后,使用`add_catch_test`定义了两个测试。此外,还设置和打印了变量的值:

```cmake
set(num_macro_calls 0)
Expand All @@ -111,7 +111,7 @@
message(STATUS "in total there were ${num_macro_calls} calls to add_catch_test")
```

8. 现在,进行测试。我们首先配置项目(输出行如下所示):
8. 现在,进行测试。配置项目(输出行如下所示):

```cmake
$ mkdir -p build
Expand All @@ -126,7 +126,7 @@
-- ...
```

9. 最后,我们构建并运行测试:
9. 最后,构建并运行测试:

```shell
$ cmake --build .
Expand Down Expand Up @@ -217,4 +217,4 @@ math(EXPR num_macro_calls "${num_macro_calls} + 1")
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
```

这个命令会将当前目录,添加到CMakeLists.txt中定义的所有目标的`interface_include_directory`属性中。换句话说,我们不需要使用`target_include_directory`来添加`cpp_test`所需头文件的位置。
这个命令会将当前目录,添加到`CMakeLists.txt`中定义的所有目标的`interface_include_directory`属性中。换句话说,我们不需要使用`target_include_directory`来添加`cpp_test`所需头文件的位置。
14 changes: 7 additions & 7 deletions content/chapter7/7.2-chinese.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@

**NOTE**:*此示例代码可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-7/recipe-02 中找到。该示例在CMake 3.5版(或更高版本)中是有效的,并且已经在GNU/Linux、macOS和Windows上进行过测试。*

项目通常从单个CMakeLists.txt文件开始,随着时间的推移,这个文件会逐渐增长。在本示例中,我们将演示一种将CMakeLists.txt分割成更小单元的机制。将CMakeLists.txt拆分为模块有几个动机,这些模块可以包含在主CMakeLists.txt或其他模块中:
项目通常从单个`CMakeLists.txt`文件开始,随着时间的推移,这个文件会逐渐增长。本示例中,我们将演示一种将`CMakeLists.txt`分割成更小单元的机制。将`CMakeLists.txt`拆分为模块有几个动机,这些模块可以包含在主`CMakeLists.txt`或其他模块中:

* 主CMakeLists.txt更易于阅读
* `CMakeLists.txt`更易于阅读
* CMake模块可以在其他项目中重用。
* 与函数相结合,模块可以帮助我们限制变量的作用范围。

本示例中,我们将演示如何定义和包含一个宏,该宏允许我们获得CMake的彩色输出(用于重要的状态消息或警告)。

## 准备工作

本例中,我们将使用两个文件,主CMakeLists.txt和`cmake/colors.cmake`:
本例中,我们将使用两个文件,`CMakeLists.txt``cmake/colors.cmake`:

```shell
.
├── cmake
└── colors.cmake
└── colors.cmake
└── CMakeLists.txt
```

Expand Down Expand Up @@ -102,7 +102,7 @@ endmacro()
message(STATUS "${BoldMagenta}This is bold${ColourReset}")
```

5. 测试一下(如果使用macOS或Linux,以下的输出应该出现屏幕上):<img src="../../images/chapter7/7-2-1.png" style="zoom:38%;" />
5. 测试一下(如果使用macOS或Linux,以下的输出应该出现屏幕上):<img src="../../images/chapter7/7-2-1.png" />

## 工作原理

Expand All @@ -127,7 +127,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

`include(colors)`命令指示CMake搜索`${CMAKE_MODULE_PATH}`,查找名称为`colors.cmake`的模块。

例子中,我们没有以下的方式进行
例子中,我们没有按以下的方式进行

```cmake
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
Expand All @@ -142,4 +142,4 @@ include(cmake/colors.cmake)

## 更多信息

推荐的做法是在模块中定义宏或函数,然后调用宏或函数。将包含模块用作函数调用不是很好的方式。除了定义函数和宏以及查找程序、库和路径之外,包含模块不应该做更多的事情。实际的`include`命令不应该定义或修改变量,其原因是重复的`include`(可能是偶然的)不应该引入任何不想要的副作用。在第5节中,我们将创建一个防止意外包含的保护机制
推荐的做法是在模块中定义宏或函数,然后调用宏或函数。将包含模块用作函数调用不是很好的方式。除了定义函数和宏以及查找程序、库和路径之外,包含模块不应该做更多的事情。实际的`include`命令不应该定义或修改变量,其原因是重复的`include`(可能是偶然的)不应该引入任何不想要的副作用。在第5节中,我们将创建一个防止多次包含的保护机制
6 changes: 3 additions & 3 deletions content/chapter7/7.3-chinese.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ endfunction()
project(recipe-03 LANGUAGES C CXX)
```

2. 然后,显示包含`set_compiler_flag.cmake`:
2. 显示包含`set_compiler_flag.cmake`:

```cmake
include(set_compiler_flag.cmake)
```

3. 然后,测试C标志列表:
3. 测试C标志列表:

```cmake
set_compiler_flag(
Expand Down Expand Up @@ -137,7 +137,7 @@ endfunction()
2. 包含模块
3. 调用函数或宏

从输出中,可以看到代码检查列表中的每个标志一旦检查成功,它就打印成功的编译标志。看看`set_compiler_flag.cmake`模块的内部,这个模块又包含三个模块:
从输出中,可以看到代码检查列表中的每个标志一旦检查成功,它就打印成功的编译标志。看看`set_compiler_flag.cmake`模块的内部,这个模块又包含三个模块:

```cmake
include(CheckCCompilerFlag)
Expand Down
28 changes: 14 additions & 14 deletions content/chapter7/7.4-chinese.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**NOTE**:*此示例代码可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-7/recipe-04 中找到,其中包含一个C++示例。该示例在CMake 3.5版(或更高版本)中是有效的,并且已经在GNU/Linux、macOS和Windows上进行过测试。*

前面的示例中,我们研究了函数和宏,并使用了位置参数。这个示例中,我们将定义一个带有命名参数的函数。我们将复用第1节中的示例,使用函数和宏重用代码,而不是使用以下代码定义测试:`add_catch_test`(short 1.5)。
前面的示例中,我们研究了函数和宏,并使用了位置参数。这个示例中,我们将定义一个带有命名参数的函数。我们将复用第1节中的示例,使用函数和宏重用代码,而不是使用以下代码定义测试:`add_catch_test(short 1.5)`

我们将这样调用函数:

Expand All @@ -25,32 +25,32 @@ add_catch_test(
```shell
.
├── cmake
└── testing.cmake
└── testing.cmake
├── CMakeLists.txt
├── src
├── CMakeLists.txt
├── main.cpp
├── sum_integers.cpp
└── sum_integers.hpp
├── CMakeLists.txt
├── main.cpp
├── sum_integers.cpp
└── sum_integers.hpp
└── tests
├── catch.hpp
├── CMakeLists.txt
└── test.cpp
├── catch.hpp
├── CMakeLists.txt
└── test.cpp
```

## 具体实施

我们对CMake代码进行一些修改,如下所示:

1. CMakeLists.txt顶部中只增加了一行,因为我们将包括位于`cmake`下面的模块:
1. `CMakeLists.txt`顶部中只增加了一行,因为我们将包括位于`cmake`下面的模块:

```cmake
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
```

2. 保持`src/CMakeLists.txt`

3. `tests/CMakeLists.txt`中,我们将`add_catch_test`函数定义移动到`cmake/testing.cmake`,并且定义两个测试:
3. `tests/CMakeLists.txt`中,`add_catch_test`函数定义移动到`cmake/testing.cmake`,并且定义两个测试:

```cmake
add_executable(cpp_test test.cpp)
Expand Down Expand Up @@ -79,7 +79,7 @@ add_catch_test(
)
```

4. `add_catch_test`函数在`cmake/testing.cmake`中定义:
4. `add_catch_test``cmake/testing.cmake`中定义:

```cmake
function(add_catch_test)
Expand Down Expand Up @@ -169,7 +169,7 @@ add_catch_test(

## 工作原理

示例的特点是其命名参数,因此我们可以将重点放在`cmake/testing.cmake`模块上。CMake提供`cmake_parse_arguments`命令,我们使用函数名(`add_catch_test`)选项(我们的例子中是none)、单值参数(`NAME``COST`)和多值参数(`LABELS``DEPENDS``REFERENCE_FILES`)调用该命令:
示例的特点是其命名参数,因此我们可以将重点放在`cmake/testing.cmake`模块上。CMake提供`cmake_parse_arguments`命令,我们使用函数名(`add_catch_test`)选项(我们的例子中是`none`)、单值参数(`NAME``COST`)和多值参数(`LABELS``DEPENDS``REFERENCE_FILES`)调用该命令:

```cmake
function(add_catch_test)
Expand All @@ -194,7 +194,7 @@ endfunction()
* add_catch_test_DEPENDS
* add_catch_test_REFERENCE_FILES

我们可以查询,并在函数中使用这些变量。这种方法使我们有机会用更健壮的接口和更具有可读的函数/宏调用,来实现函数和宏。
可以查询,并在函数中使用这些变量。这种方法使我们有机会用更健壮的接口和更具有可读的函数/宏调用,来实现函数和宏。

## 更多信息

Expand Down
10 changes: 5 additions & 5 deletions content/chapter7/7.5-chinese.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
```shell
.
├── cmake
├── custom.cmake
└── include_guard.cmake
├── custom.cmake
└── include_guard.cmake
└── CMakeLists.txt
```

Expand All @@ -29,14 +29,14 @@ message(STATUS "custom.cmake is included and processed")

我们对三个CMake文件的逐步分解:

1. 在这个示例中,我们不会编译任何代码,因此我们的语言要求是`NONE`:
1. 示例中,我们不会编译任何代码,因此我们的语言要求是`NONE`:

```cmake
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-05 LANGUAGES NONE)
```

2. 然后,我们定义一个`include_guard`宏,将其放在一个单独的模块中:
2. 定义一个`include_guard`宏,将其放在一个单独的模块中:

```cmake
# (re)defines include_guard
Expand Down Expand Up @@ -143,7 +143,7 @@ endif()
list(APPEND included_modules ${CMAKE_CURRENT_LIST_FILE})
```

如果第一次调用宏,则`included_modules`变量没有定义,因此我们将其设置为空列表。然后检查`${CMAKE_CURRENT_LIST_FILE}`是否是`included_modules`列表中的元素。如果是,则会发出警告如果没有,我们将`${CMAKE_CURRENT_LIST_FILE}`追加到这个列表。CMake输出中,我们可以验证自定义模块的第二个包含确实会导致警告。
如果第一次调用宏,则`included_modules`变量没有定义,因此我们将其设置为空列表。然后检查`${CMAKE_CURRENT_LIST_FILE}`是否是`included_modules`列表中的元素。如果是,则会发出警告如果没有,我们将`${CMAKE_CURRENT_LIST_FILE}`追加到这个列表。CMake输出中,我们可以验证自定义模块的第二个包含确实会导致警告。

CMake 3.10及更高版本的情况有所不同;在这种情况下,存在一个内置的`include_guard`,我们用自己的宏接收到参数并调用它:

Expand Down
12 changes: 6 additions & 6 deletions content/chapter7/7.6-chinese.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# 7.6 废弃使用函数、宏和变量
# 7.6 使用废弃函数、宏和变量

**NOTE**:*此示例代码可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-7/recipe-06 中找到。该示例在CMake 3.5版(或更高版本)中是有效的,并且已经在GNU/Linux、macOS和Windows上进行过测试。*

弃用是在不断发展的项目开发过程中一种重要机制,它向开发人员发出信号,表明将来某个函数、宏或变量将被删除或替换。在一段时间内,函数、宏或变量将继续可访问,但会发出警告,最终可能会上升为错误。
“废弃”是在不断发展的项目开发过程中一种重要机制,它向开发人员发出信号,表明将来某个函数、宏或变量将被删除或替换。在一段时间内,函数、宏或变量将继续可访问,但会发出警告,最终可能会上升为错误。

## 准备工作

Expand Down Expand Up @@ -30,11 +30,11 @@ include(cmake/custom.cmake)
message(STATUS "list of all included modules: ${included_modules}")
```

这段代码定义了一个自定义的"包含保护"机制,包括一个自定义模块(与前一个示例中的模块相同),并打印所有包含模块的列表。对于CMake 3.10或更高版本有内置的`include_guard`。但是,我们不能简单地删除`custom_include_guard``${included_modules}`而是使用一个弃用警告来弃用宏和变量。某个时候,我们可以将该警告转换为`FATAL_ERROR`,使代码停止配置,并迫使开发人员对代码进行修改,切换到内置命令。
这段代码定义了一个自定义的"包含保护"机制,包括一个自定义模块(与前一个示例中的模块相同),并打印所有包含模块的列表。对于CMake 3.10或更高版本有内置的`include_guard`。但是,不能简单地删除`custom_include_guard``${included_modules}`而是使用一个“废弃”警告来弃用宏和变量。某个时候,可以将该警告转换为`FATAL_ERROR`,使代码停止配置,并迫使开发人员对代码进行修改,切换到内置命令。

## 具体实施

弃用函数、宏和变量的方法如下:
“废弃”函数、宏和变量的方法如下:

1. 首先,定义一个函数,我们将使用它来弃用一个变量:

Expand Down Expand Up @@ -72,7 +72,7 @@ message(STATUS "list of all included modules: ${included_modules}")
-- list of all included modules: /home/user/example/cmake/custom.cmake
```

4. CMake 3.10及以上将产生预期的弃用警告:
4. CMake 3.10及以上将产生预期的“废弃”警告:

```cmake
CMake Deprecation Warning at CMakeLists.txt:26 (message):
Expand Down Expand Up @@ -110,7 +110,7 @@ function(deprecate_variable _variable _access)
endfunction()
```

然后,这个函数被添加到将要废弃的变量上:
然后,这个函数被添加到将要“废弃”的变量上:

```cmake
variable_watch(somevariable deprecate_variable)
Expand Down
Loading

0 comments on commit 7152d92

Please sign in to comment.