添加生成的文件和生成器
在这一节当中,我们会告诉你如何将一个生成的源文件加入到应用程序的构建过程中。在此例中,我们会创建一个预先计算好的平方根的表,并将这个表编译到应用程序中去。为了达到这个目的,我们首先需要一个程序来生成这样的表。在MathFunctions这个子目录下一个新的叫做MakeTable.cxx的源文件就是用来干这个的。
// 一个构建 sqrt 表的简单程序
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (int argc, char *argv[])
{
int i;
双重结果;
// 确保我们有足够的参数
if (argc < 2)
{
return 1;
}
// 打开输出文件
FILE *fout = fopen(argv[1],"w");
if (!fout)
{
返回 1;
}
// 创建一个包含平方根表的源文件
fprintf(fout,"double sqrtTable[] = {\n");
for (i = 0; i < 10; ++i)
{
结果 = sqrt(static_cast<double>(i));
fprintf(fout,"%g,\n",结果);
}
// 以零关闭表
fprintf(fout,"0};\n");
fclose(fout);
返回0;
}
注意到这张表是由一个有效的C++代码产生的,并且输出文件的名字是由参数代入的。下一步就是添加合适的命令到MathFunctions的CMakeLists文件中来构建MakeTable这个可执行程序,并且作为构建过程中的一部分。完成它需要一些命令,如下:
# 首先我们添加生成表的可执行文件 add_executable
(MakeTable MakeTable.cxx)
# 添加生成源代码的命令
add_custom_command (
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDS MakeTable
)
# 将二叉树目录添加到
# 包含文件的搜索路径
include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
# 添加主库
add_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h )
首先,就像其它可执行程序一样,MakeTable被添加为可执行程序。然后我们添加了一个自定义命令来详细描述如何通过运行MakeTable来产生Table.h。接下来,我们需要让CMake知道mysqrt.cxx依赖于生成的文件Table.h。这是通过往MathFunctions这个库里面添加生成的Table.h来实现的。我们也需要添加当前的生成目录到搜索路径中,从而Table.h可以被mysqrt.cxx找到。
当这个工程被构建时,它首先会构建MakeTable这个可执行程序。然后运行MakeTable从而生成Table.h。最后,它会编译mysqrt.cxx来生成MathFunctions library。
在这一刻,我们添加了所有的特征到最顶层的CMakeLists文件,它现在看起来是这样的:
cmake_minimum_required (VERSION 2.6)
项目 (教程)
# 版本号。
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
# 这个系统提供log和exp功能吗?
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (log HAVE_LOG)
check_function_exists (exp HAVE_EXP)
# 我们应该使用我们自己的数学函数
选项(USE_MYMATH
"使用教程提供的数学实现" ON)
# 配置一个头文件来传递一些 CMake 设置
# 到源代码
configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)
# 将二叉树添加到包含文件的搜索路径中
# 这样我们就可以找到TutorialConfig.h
include_directories ("${PROJECT_BINARY_DIR}")
# 添加MathFunctions 库?
if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# 添加可执行
文件 add_executable (教程tutorial.cxx)
target_link_libraries (教程${EXTRA_LIBS} )
# 添加安装目标
install (TARGETS Tutorial DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include)
# 应用程序是否运行
add_test (TutorialRuns 教程 25)
# 使用消息有效吗?
add_test (TutorialUsage Tutorial)
set_tests_properties (TutorialUsage
PROPERTIES
PASS_REGULAR_EXPRESSION "Usage:.*number"
)
#定义一个宏来简化添加测试
宏 (do_test arg result)
add_test (TutorialComp${arg} Tutorial ${arg})
set_tests_properties (TutorialComp${ arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result}
)
endmacro (do_test)
# 进行一堆基于结果的测试
do_test (4 "4 is 2")
do_test (9 "9 is 3")
do_test (5 "5 is 2.236")
do_test ( 7 "7 是 2.645")
do_test(25 "25 是 5")
do_test(-25“-25为0”)
do_test (0.0001 "0.0001 是 0.01")
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!