c – 非递归(非递归)Automake
我试图将项目转换为使用非递归automake.基于搜索SO,我可以看到该主题已被覆盖到一定程度.但是对于如何将递归的automake项目转换为非递归项目并没有任何问题.我已经阅读了
Karel Zak’s blog,当然还有
autotools-mythbuster.
experiences regarding non-recursive automake有一个问题,但它没有解释如何转换项目.唯一解释一下的问题似乎是关于
subdir-objects option.但我无法用这些资源转换我的项目.因此这个问题.
让我们从一个简单的项目设置开始: 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的答案,我有另一个问题.他写道:
但是如果没有前面的路径我就无法让它工作,所以这对我来说似乎不对,有人可以证实我的经历吗? 更新:我也遇到了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的答案,因为我认为这完全是一种误解. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |