
让我们从一个简单的项目设置开始:
project/ \-- configure.ac |-- Makefile.am \-- src/ \-- Makefile.am |-- foo.c |-- foo.h \-- main.c
在configure.ac中,我只需添加subdir-objects选项:
AM_INIT_AUTomake([subdir-objects])
在Makefile.am中,我从根Makefiles.am的SUBDirs变量中删除了src目录.然后我从`configure.ac中的AC_CONfig_fileS宏中删除了src / Makefile条目.
Karel Zak的博客建议命名包含Makefiles的子目录Makemodule.am但Makefile.am似乎也可以工作,如果SUBDirs变量删除了子文件夹,并且从AC_CONfig_fileS配置文件宏中删除了Makefile条目.
接下来,我为根Makefile.am中的程序定义了一个全局变量,并包含了src / Makefile.am
bin_PROGRAMS=include src/Makefile.am
在src / Makefile.am中我改变了:
bin_PROGRAMS=foo
至:
bin_PROGRAMS+=src/foo
我还将foo_XXX的所有出现都更改为src_foo_XXX.我在src_foo_SOURCES中为所有.c和.h文件名添加了前缀src /.
但是程序没有构建并且没有找到包含文件的错误,例如:
Fatal error: deBUG.h: No such file or directory #include <deBUG.h>
最初我的src目录Makefile.am只包含内容变量src_foo_SOURCES,src_foo_CFLAGS,src_foo_LDFLAGS和src_foo_LDADD.我解决这个问题的方法是添加src_foo_CPPFLAGS,如下所示:
src_foo_CPPFLAGS = \ $(AM_CPPFLAGS) \ -I$(top_builddir)/src \ -DDATADIR='"$(datadir)"' \ -DMODulEDIR='"$(moduledir)"' \ -DliBEXECDIR='"$(libexecdir)"'
但我真的不明白为什么这是必要的,为什么当我使用递归automake时它很好?
关于Brett Hale in this question的答案,我有另一个问题.他写道:
You Could use “$(srcdir)/sourceA.cpp”,but this directory is implicit anyway. All you need is:
libadapter_la_SOURCES = sourceA.cpp sourceB.cpp
但是如果没有前面的路径我就无法让它工作,所以这对我来说似乎不对,有人可以证实我的经历吗?
更新:我也遇到了po / subdir的问题,我怎样才能使这个非递归? po / Makevar文件中没有Makefile.am.有一个post on autotools-mythbuster,表示不支持gettext的非递归make,但该帖子是2011年的.我不确定是否有任何内容可能在同一时间发生了变化.
解决方法 我将从下往上开始:自2011年以来,gettext没有任何变化,不幸的是,po /目录仍应以递归方式处理. gtk-doc也是如此.原因是他们构建了一些与自动化兼容的Makefile.in文件,但它们并不是真正基于自动化的.至于未找到的头文件,它现在失败的原因是因为你使用了错误的#include语句格式:你应该使用#include“deBUG.h”然后它可以工作而不必添加-Isrc到命令行.预处理器将在与源文件相同的目录中查找“”封闭的标题,并且对于<>包含路径中的封闭标题;默认情况下,automake使用-I将当前目录添加到包含路径.这意味着在使用递归Makefile.am时它很满意,但现在“当前目录”不再匹配源文件的目录.
如果您正在使用Karel建议的方法(automake,或者至少它的某些版本,那么将生成一个无法正常工作的子目录的Makefile.in文件),我也建议不要重复使用名称Makefile.am.如果您的软件足够自包含,例如,如果它只有一个二进制目标,则考虑不使用Karel的方法. Karel的用例是linux-utils,这是一个相当稀疏的项目,有几十个目标,每个目标都有自己的源文件集.
我会尝试评论你注意到的Brett Hale的答案,因为我认为这完全是一种误解.
总结以上是内存溢出为你收集整理的c – 非递归(非递归)Automake全部内容,希望文章能够帮你解决c – 非递归(非递归)Automake所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)