使用CMake来编写平台相关的检查 -- use google translate

CMake的:如何编写平台检查
如果你想编写软件编制,在不同操作系统上运行,你必须对不同平台的特殊性质的照顾。在不同的操作系统有细微的差别,例如在FreeBSD你不应该使用malloc.h,而这是完全可以在Linux上使用它。处理这些差异通常是通过提供一个头文件,它包含了定义,根据平台性能报表,通常命名为config.h中一堆:

1#定义HAVE_MALLOC_H
/ *#民主 基金HAVE_SYS_MNTTAB_H 1 * /
/ *#民主基金HAVE_SYS_MNTENT_H 1 * /
1#定义HAVE_SYS_MOUNT_H
然后,这个头文件包含在源文件和妥善处理:

foo.c的:

#include “config.h”

#ifdef HAVE_MALLOC_H
#include <malloc.h>
#else
#include <stdlib.h>
#endif

无效do_something()

   *缓冲区=无效的malloc(1024);
...

对config.h中的内容取决于所在的来源是编译平台,因此需要有一种方法来生成这个头文件在实际编制过程开始。如果您使用的自动工具为基础的软件,你可能知道。/ configure这一步,已经开始做之前必须执行。在。/ configure脚本做一些系统的反思,并从收集信息的config.h头文件生成。 CMake是能够做到的一样,我会告诉你如何去做。

此外以内建的命令,通过提供的CMake CMake的脚本文件,称为模块实现更多的命令。这些文件位于CMake的模块目录,在UNIX系统默认是这个/ USR的/地方/股/的CMake /单元。

若要使用这些模块的命令,他们必须在的CMakeLists.txt中。 CMake的来了,他们都遵循一个例子CHECK_INCLUDE_FILES同一风格,以检查系统的几个模块:

包括(CheckIncludeFiles)
#用法:CHECK_INCLUDE_FILES(<header> <RESULT_VARIABLE>)

CHECK_INCLUDE_FILES(malloc.h HAVE_MALLOC_H)
CHECK_INCLUDE_FILES(“系统/ param.h;系统/ mount.h”HAVE_SYS_MOUNT_H)
CONFIGURE_FILE($(CMAKE_CURRENT_SOURCE_DIR)/ $(CMAKE_CURRENT_BINARY_DIR config.h.in)/ config.h中)
CMake的模块CheckIncludeFiles提供了命令CHECK_INCLUDE_FILES()。的第一个参数此命令是头部,你要检查。第二个参数是变量将包含结果。如果给定的头被发现,它被设置为1,否则是空的。如果另一头是需要使用的头,你所寻找的,你要列出头文件用分号隔开,你可以在上面看到。要查看CHECK_INCLUDE_FILES()到底,有一个在执行看看吧:/ usr /本地/共享/ CMake的/模块/ CheckIncludeFiles.cmake。在那里你会看到它试图编译一个简单的源文件,其中包括指定的头文件。该测试的结果存储在文件CMakeCache.txt,所以如果你想检查后测试是否成功或不看在CMakeCache.txt文件:

/ /有包括HAVE_MALLOC_H
HAVE_MALLOC_H:内部= 1
只要长期的结果缓存,测试将不会被再次执行。如果你想让它再一次被执行,或者删除该文件CMakeCache.txt,那么所有的测试将再次执行,或者仅仅删除的变量,你希望有再次测试的项目。这样可以节省一些时间。如果测试失败,你要找出原因,打开CMakeFiles / CMakeError.log和标题名称(或功能等)搜索你测试。在那里你会看到代码无法编译或链接时,编译命令和错误信息。连同在CheckIncludeFiles.cmake测试实现你应该能够找出什么地方出了错。

好了,现在我们已经测试是否如malloc.h存在,并在cmake的变量HAVE_MALLOC_H因此,我们仍然要创建一个头的config.h。要做到这一点,我们使用cmake的命令CONFIGURE_FILE(),正如你上面看到的。这将复制源文件到目标文件并编辑它,而这样做,详见手册页。因此,我们写了一个源文件名为config.h.in,但你可以给它的任何您想要的名称(它也通常命名为config.h.in autotools的):

1#cmakedefine HAVE_MALLOC_H
#cmakedefine HAVE_SYS_MOUNT_H
现在,当CMake的运行,它将取代#cmakedefine。如果HAVE_MALLOC_H和HAVE_SYS_MOUNT_H是真的,它会产生的config.h:

1#定义HAVE_MALLOC_H
#定义HAVE_SYS_MOUNT_H
如果两个都是假的,这将产生:

/ *#民主基金HAVE_MALLOC_H 1 * /
/ *#定义HAVE_SYS_MOUNT_H * /
通过包括这头到您的源文件,您可以检查这些属性使用#ifdef。这种检查可以插入在任何项目中的CMakeLists.txt不仅在顶层的CMakeLists.txt。如果您有多个配置的头,你不应该把它们命名为所有的config.h,这可能导致与包含路径的问题。最好给他们喜欢的config.h名称,配置为在配置子目录富头foo.h /和配置,在酒吧/子目录,等等bar.h

用cmake的未来进行系统检查其他命令按照这种风格,所以我们可以处理它们更短了。

模块
包括(CheckIncludeFiles)
用法
CHECK_INCLUDE_FILES(标头变量)
范例
CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
正如刚才冗长的讨论,这可以用来检查一个头的存在。

模块
包括(CheckFunctionExists)
用法
CHECK_FUNCTION_EXISTS(函数变量)
范例
CHECK_FUNCTION_EXISTS(madvise HAVE_MADVISE)
检查是否存在给定的函数。这是通过将一个小程序,它可能不会导致未定义的引用。

模块
包括(CheckSymbolExists)
用法
CHECK_SYMBOL_EXISTS(符号标题变量)
范例
CHECK_SYMBOL_EXISTS((LC_MESSAGES“locale.h中”HAVE_LC_MESSAGES)
检查是否存在给定的符号,如果指定的标头也包括在内。

模块
包括(CheckLibraryExists)
用法
CHECK_LIBRARY_EXISTS(库函数的位置变量)
范例
CHECK_LIBRARY_EXISTS(volmgt volmgt_running“”HAVE_VOLMGT)
检查是否存在给定的库和包含给定的函数。这是通过将一个小程序,它使用功能和图书馆的链接。在一个额外的链接位置参数目录(- Ldir)如果需要的话可以考虑。

模块
包括(CheckTypeSize)
用法
套装(CMAKE_EXTRA_INCLUDE_FILES头)
CHECK_TYPE_SIZE(类型变量)
套装(CMAKE_EXTRA_INCLUDE_FILES)
范例
设定(CMAKE_EXTRA_INCLUDE_FILES sys / socket.h中)
CHECK_TYPE_SIZE(“结构ucred”STRUCT_UCRED)
套装(CMAKE_EXTRA_INCLUDE_FILES)
检查是否存在指定的类型和返回类型的大小。在变量的类型的大小将被退回,另外一个变量HAVE_STRUCT_UCRED将被设置为true,如果存在的类型。请不要认为你必须设置CMAKE_EXTRA_INCLUDE_FILES为这种类型所需的头文件,你应该调用CHECK_TYPE_SIZE后重置它。如果你是不是真的有兴趣在该类型的大小,但只有它是否存在与否,你也可以使用STRUCT_UCRED直接,如果类型不存在,这将是空的,所以也计算为假(如将HAVE_STRUCT_UCRED )。

模块
包括(CheckPrototypeExists)
用法
CHECK_PROTOTYPE_EXISTS(函数头变量)
范例
CHECK_PROTOTYPE_EXISTS(mkstemps“stdlib.h中; unistd.h”HAVE_MKSTEMPS_PROTO)
头检查是否为给定函数的声明,即不检查是否使用功能将导致未定义的引用。

模块
包括(CheckCXXSourceCompiles)
包括(CheckCSourceCompiles)
用法
CHECK_CXX_SOURCE_COMPILES(源变量)
CHECK_C_SOURCE_COMPILES(源变量)
检查是否在给定的源代码将编译和链接。您可以设置CMAKE_REQUIRED_LIBRARIES,CMAKE_REQUIRED_FLAGS和CMAKE_REQUIRED_INCLUDES因此,如果额外的库或编译器标志是必需的。

 

-----------------

 

原文地址 :http://www.itk.org/Wiki/CMake:How_To_Write_Platform_Checks

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值