我想知道我如何制作一个可移植的构建系统(一步一步),我目前使用cmake,因为它很容易设置,只有一个拱目标,但现在我有包装我正在开发的库我想知道如何使它成为我正在测试的可移植的最佳方法。
我知道我需要一个config.h来定义取决于arch的东西,但我不知道它是多么自动化。
热烈欢迎任何其他建立系统的方式!
答案 0 :(得分:10)
你可以使用CMake,这非常简单。
你需要这些东西:
首先,找出配置细节。例如,如果您知道某些功能在某些平台上的命名方式不同,您可以使用TRY_COMPILE
来发现:
TRY_COMPILE(HAVE_ALTERNATIVE_FUNC
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}/alternative_function_test.cpp
CMAKE_FLAGS -DINCLUDE_DIRECTORIES=xxx
)
其中alternative_function_test.cpp
是源目录中的文件,仅使用备用定义进行编译。
如果编译成功,这将定义变量HAVE_ALTERNATIVE_FUNC
。
其次,您需要使此定义影响您的来源。您可以将其添加到编译标志
IF(HAVE_TR1_RANDOM)
ADD_DEFINITIONS(-DHAVE_TR1_RANDOM)
ENDIF(HAVE_TR1_RANDOM)
或者您可以制作config.h
文件。使用以下行
config.h.in
#cmakedefine HAVE_ALTERNATIVE_FUNCS
并在config.h
中的此行创建CMakeLists.txt
文件(参见CONFIGURE_FILE
)
CONFIGURE_FILE(config.h.in config.h @ONLY)
#cmakedefine
将被转换为#define
或#undef
,具体取决于CMake变量。
BTW,有关测试edianness的信息,请参阅this mail
答案 1 :(得分:2)
我一直在使用GNU autoconf / automake工具链,这对我来说效果很好。我只关注Linux / x86(和64位)和Mac,如果你在PowerPC上构建,由于端点问题,这很重要。
使用autoconf,您可以使用宏检查主机平台:
AC_CANONICAL_HOST
使用以下方法检查字节序:
AC_C_BIGENDIAN
然后,Autoconf将为config.h添加定义,您可以在代码中使用这些定义。
我不确定(从未尝试过)GNU自动工具在Windows上的工作情况,因此如果Windows是您的目标之一,那么您可能最好在现有的cmake构建系统中找到类似的功能。
要获得关于autotools的好的入门知识,请看一下:
http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool