如何将autotools用于深层项目?

时间:2012-03-11 22:46:03

标签: c autotools

我有一个具有以下结构的 C 项目

Main/
  Makefile.am
  bin/
  src/
     Makefile.am
     main.c
     SomeLibrarySource/
         SomeFuncs.c
         SomeFuncs.h

main.c 包含使用 SomeFuncs。{h / c} 文件中定义的函数的main函数。

我想在这个项目中使用autotools。我在autotools上阅读了几个资源。但是,我只能使用autotools来管理单个级别的项目,其中所有源,对象和其他文件都位于同一目录中。

然后我得到了一些关于使用autotools进行像这样的深度项目的链接,然后我感到困惑。

现在我有两个Makefile.am如下

Makefile.am

SUBDIRS=src

的src / Makefile.am

mainprgdir=../
mainprg_PROGRAMS=main
main_SOURCES=main.c

我很确定这些文件不应该像我现在拥有的那样:P

如何将 autotools 用于上述项目结构? (至少在那些 Makefile.am (s)应该存在什么,以及我应该在哪里放置它们。

编辑: 还有一件事!最后,我想在 bin 目录中创建目标文件。

由于

2 个答案:

答案 0 :(得分:2)

mainprogdir=../没有多大意义(你不知道它与安装有什么关系)。可能是有意的:

# Main/Makefile.am
# .━━ target for `make install`
# |
# ↓              ↓━━ target for compilation
bin_PROGRAMS = bin/main

# ↓━━ based upon compilation target name
bin_main_SOURCES = src/main.c

答案 1 :(得分:1)

主要有两种方法。如果SomeLibrarySource中的函数仅由main使用,则不需要构建单独的库,只需在src / Makefile.am中指定源文件

main_SOURCES = main.c SomeLibrarySource/SomeFuncs.c

但是,如果你真的想在树中的其他代码中使用这些函数,你不想多次编译SomeFuncs.c但是应该使用一个便利库。

# Assigning main_SOURCES is redundant
main_SOURCES = main.c
main_LDADD = SomeLibrarySource/libSomeFuncs.a
noinst_LIBRARIES = SomeLibrarySource/libSomeFuncs.a
AM_CPPFLAGS = -I$(srcdir)/SomeLibrarySource

(您需要在configure.ac中使用AC_PROG_RANLIB才能使用便捷库。) 如果源文件名为SomeFuncs.c,则automake不需要Makefile.am指定SomeLibrarySource_libSomeFuncs_a_SOURCES,但如果源代码文件的名称与noinst_LIBRARIES中指定的名称不匹配,{{1应该设置为用于构建库的文件列表。请注意,您不需要指定main_SOURCES,因为如果不指定main.c是默认值(但是显式并不是一个坏主意。)(在所有这些中,我不习惯使用CamlCase名称,但系统我正在使用一个不区分大小写的文件系统(苹果有史以来最大的错误),我在这里给出的例子正在为我工​​作.YMMV)

您当然可以进行递归制作,或者将库构建为单独的项目并进行安装。 (我喜欢最终选项。具有有用功能的库本身应该存在。)