5

我有一个 C++ autoconf 托管项目,我正在调整它以在 FreeBSD 主机上编译。最初的系统是 Linux,所以我做了一个 AM_CONDITIONAL 来区分我正在构建的主机并将代码分成系统特定的文件。

配置.ac

AC_CANONICAL_HOST
AM_CONDITIONAL([IS_FREEBSD],假)
案例$主机在
        *自由*)    
            AC_DEFINE([IS_FREEBSD],[1],[FreeBSD 主机])
            AM_CONDITIONAL([IS_FREEBSD],真)
            BP_ADD_LDFLAG([-L/usr/local/lib])
                ;;
经社理事会

生成文件.am

lib_LTLIBRARIES=mylib.la
mylib_la_SOURCES=a.cpp \
                 b.cpp

如果 IS_FREEBSD
    mylib_la_SOURCES+=freebsd/c.cpp
别的
    mylib_la_SOURCES+=linux/c.cpp
万一

当我运行 automake 时,它​​会失败并显示以下消息:

Makefile.am:由 `linux/c.cpp' 和 `freebsd/c.cpp' 创建的对象 `c.lo'

即使在 Makefile.in 构建过程中,关于如何配置 automake 以尊重此条件的任何想法?

如果文件有不同的名称,我可以这样做,但它是 c++ 代码,我试图保持文件名与类名相同。

提前致谢!

4

2 回答 2

11

您可以请求在其各自的子目录中构建对象

AUTOMAKE_OPTIONS = subdir-objects
于 2009-05-28T07:37:38.570 回答
7

除了subdir-objects之外,另一种选择是为每个子项目提供一些自定义的每个项目构建标志。执行此操作时,automake 会更改其 *.o 命名规则,以将目标名称添加到模块名称之前。例如,这个:

mylib_la_CXXFLAGS=$(AM_CXXFLAGS)
mylib_la_SOURCES=a.cpp b.cpp

将导致输出文件 mylib_la-ao 和 mylib_la-bo,而不是 ao 和 bo 因此,您可以有两个不同的项目,它们具有相同的输出目录,每个项目都有一个 b.cpp 文件,并且它们的输出不会冲突。

请注意,我通过将项目特定的 CXXFLAGS 设置为 automake 已经使用的值 AM_CXXFLAGS 来做到这一点。Automake 不够聪明,无法检测到这个技巧并使用较短的 *.o 名称。如果碰巧你确实需要每个项目的构建选项,你当然可以这样做而不是这个 hack。

有一个完整的 automake 变量列表,当在每个可执行文件的基础上设置时,它们会产生相同的效果。例如,也许一个子项目已经需要特殊的链接标志,所以你给它一些类似的东西:

mylib_la_LDFLAGS=-lfoo

这将为您提供前缀 *.o 文件,就像 AM_CXXFLAGS 技巧一样,只是现在您“合法地”使用此功能,而不是欺骗 automake 这样做。

顺便说一句,仅仅基于它所构建的操作系统来改变程序的构建方式是不好的 autoconf 风格。好的 autoconf 风格是只检查特定的平台功能,而不是整个平台,因为平台会发生变化。FreeBSD 在今天可能是某种方式,但也许在下一个版本中,它将从 Linux 复制一个特性,从而消除您以两种不同方式构建程序的需要。或者,您今天使用的功能可能已被弃用,并将在下一个版本中删除。

在 autotools、grasshopper 中有 40 年的可移植 Unix 编程智慧。我上面给出的“也许”过去已经发生过,而且肯定会再次发生。测试单个功能是应对不断变化的平台的最灵活的方法。

您也可以从这种方法中获得意想不到的好处。例如,也许你的程序需要两个不可移植的特性来完成它的工作。假设在 FreeBSD 上,这些是 A 和 B 特性,而在 Linux 上,它们是 X 和 Y 特性;A 和 X 是相似的机制,但具有不同的接口,B 和 Y 相同。可能是特性 A 来自原始 BSD,并且在 Solaris 中,因为它具有来自 80 年代 SunOS 的 BSD 根源,而 Solaris 也具有90 年代初基于 System V 的重新设计中的 Y 功能。通过测试这些特性,您的程序也可以在 Solaris 上运行,因为它具有您的程序需要的特性,只是与 FreeBSD 和 Linux 上的组合不同。

于 2009-08-10T14:16:06.460 回答