0

我开始学习自动工具,以便首先了解并随后扩展现有项目的构建系统。目前,该项目构建了一个程序作为其输出。构建系统非常复杂,由几个子目录和Makefile.am以维护者模式生成的文件组成,等等。我希望能够选择使用大部分相同的源代码创建一个库,重用大部分现有的构建系统。

我想象的是一个新的 make 目标,这样在运行 configure 之后,我就可以运行make来制作程序,或者说,make library构建库。执行此操作或具有类似效果的正确方法是什么?

我不想在普通运行时构建库和程序make(只是像以前一样的程序),并且我不想在运行时构建程序make library(我只想要库)。

如果有人可以提供一个简单的示例,例如由 组成的程序main.cfoo.c以及bar.c由 and 组成的库foo.cbar.c那也将非常有帮助。

编辑

为了澄清,我最初认为程序和库可以完全分开构建。该库仅包含主程序代码的子集,我相信这两者是独立的实体。然而,事情要复杂得多。程序本身被构建并用于输出一些代码,然后在第二步中将其编译到程序中(我认为)。通过执行以下步骤,我有效地得到了我想要的东西。

首先在configure.ac中添加一个条件

dnl Adds LIBRARY conditional for --enable-foolib mode to
dnl build foo as a library
AC_ARG_ENABLE(foolib,
AS_HELP_STRING([--enable-foolib],
               [enable qucslib build, default: no]),
[case "${enableval}" in
             yes) foolib=true ;;
             no)  foolib=false ;;
             *)   AC_MSG_ERROR([bad value ${enableval} for --enable-foolib]) ;;
esac],
[foolib=false])

AM_CONDITIONAL(FOOLIB, test x"$foolib" = x"true")

然后在适当的 Makefile.am 中,我做了类似以下的事情:

if FOOLIB
noinst_LIBRARIES = libbar.a libfoo.a
else
noinst_LIBRARIES = libbar.a
endif

bin_PROGRAMS = barprog

barprog_SOURCES = main.cpp src1.cpp src2.cpp etc.cpp

barprog_LDADD = libbar.a              \
    subdir1/libsubdir1.a                  \
    subdir2/libsubdir2.a          \
    etcdir/libetc.a 

... other stuff

if FOOLIB
libfoo_a_LIBADD = libbar.a            \
    subdir1/libsubdir1.a                  \
    subdir2/libsubdir2.a          \
    etcdir/libetc.a 

libfoo_a_SOURCES = src1.cpp src2.cpp etc.cpp
endif

然后当我想做图书馆时

configure --enable-foolib
make

这暂时有效,但似乎很笨拙。我不确定如何在构建系统中实现提供的答案。

4

1 回答 1

0

如果程序依赖于库,那么不构建库就无法构建程序。您已经有能力构建单独的库:configure && make libfoo.a应该可以正常工作(或make libfoo.la)。如果你想要一个名为 的目标library,你可以简单地将以下内容添加到任何 Makefile.am 中:

library:
        libfoo.a

(或者您可能需要libfoo.la。基本上,如果库在主目录下指定Makefile.amLIBRARIES那么您将使用libfoo.a,但如果在主目录下指定LTLIBRARIES,您将使用libfoo.la。)这只会library在包含 Makefile.am 的每个目录中创建一个目标. 如果您有一个复杂的递归构建(您应该真正简化它,但这是另一个问题),您可以在顶层放置类似以下的内容Makefile.am来构建整个树中的库:

library:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) library

这假设您已将library目标添加到 subdir/Makefile.am,如上所述。

为了迂腐,您可能想要使用$(am__cd)而不是cd,但这并不是绝对必要的。

于 2013-02-14T01:47:08.007 回答