我有说我适应编译在FreeBSD主机上C ++的autoconf管理项目。 原系统是Linux的所以我提出一个AM_CONDITIONAL区分我建立所述主机与所述代码分离成系统的特定文件。

configure.ac

AC_CANONICAL_HOST
AM_CONDITIONAL([IS_FREEBSD],false)
case $host in
        *free*)    
            AC_DEFINE([IS_FREEBSD],[1],[FreeBSD Host])
            AM_CONDITIONAL([IS_FREEBSD],true)
            BP_ADD_LDFLAG([-L/usr/local/lib])
                ;;
esac

Makefile.am

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

if IS_FREEBSD
    mylib_la_SOURCES+=freebsd/c.cpp
else
    mylib_la_SOURCES+=linux/c.cpp
endif

当我运行的automake它失败,此类型的消息:

Makefile.am: object `c.lo' created by `linux/c.cpp' and `freebsd/c.cpp'

如何automake的配置尊重这个条件,即使在Makefile.in建立proccess任何想法?

我这个工作,如果文件有diferent的名字,但它的C ++代码,我试图保持文件名相同的类名。

提前感谢!

有帮助吗?

解决方案

您可以请求为对象要建在它们各自的子目录与

AUTOMAKE_OPTIONS = subdir-objects

其他提示

另一种选择,除了子目录对象的,就是给每个子项目的一些自定义每个项目建立的标志。当你做到这一点,automake的改变其*的.o命名规则为目标名称预先考虑到模块的名称。例如,这样的:

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

将导致输出文件mylib_la-a.o和mylib_la-B.O,而不是a.o和b.o.因此,你可以有相同的输出目录,每个都有,比如说,一个b.cpp文件两个不同的项目,而不是它们的输出冲突。

请注意,我通过设置特定项目CXXFLAGS的价值观的automake这样做已经会使用,AM_CXXFLAGS。 Automake的是没有足够的智慧来检测这一招,用较短的*的.o名。如果碰巧你需要每个项目的编译选项,当然你可以做到这一点,而不是这个技巧。

有一个的automake变量的整个列表设置时,每个可执行文件的基础上,给这个相同的效果。因此,举例来说,也许一个子项目需要特别的链接标志了,所以你给它这样的:

mylib_la_LDFLAGS=-lfoo

这会给你的前缀* .o文件就像AM_CXXFLAGS把戏做,只是现在你是“合法”使用的,而不是欺骗的automake为做这个功能。

顺便说一句,这是不好的Autoconf风格的方式来改变你的程序如何构建完全基于它被建为OS。良好的Autoconf风格的方式是检查只针对特定平台的功能,而不是整个平台,因为平台的改变。 FreeBSD的可能是今天一定的方式,但也许在未来的版本将复制从Linux的一个功能,它会清除为您打造您的程序两种不同的方式的需要。或者,也许你今天正在使用的功能已被弃用,并将在下一版本中被删除。

有40年的自动工具便携的Unix编程智慧,蚂蚱。该“maybes”我上面的的过去发生的事情给定的,并肯定会再次这样做。测试单独的特征是,以应付不断变化的平台上的nimblest方式。

您可以从这种做法出乎意料的奖金了。比如,也许你的程序需要两个不可移植的功能来完成工作。说,在FreeBSD,这些都是A和B的功能,并在Linux上,他们是X和Y的特点; A和X类似机制,但有不同的接口,与同为B和Y.这可能是因为有一个来自于原来的BSD系统,并且是Solaris,因为它有BSD从根部的SunOS在80年代,和Solaris也有特征量y从它是一个基于System V的重新设计,在90年代初。通过测试这些功能,您的程序可以运行在Solaris,也因为它有程序需要,只是不在同一个组合在FreeBSD和Linux的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top