c – 非递归(非递归)Automake

c – 非递归(非递归)Automake,第1张

概述我试图将项目转换为使用非递归automake.基于搜索SO,我可以看到该主题已被覆盖到一定程度.但是对于如何将递归的automake项目转换为非递归项目并没有任何问题.我已经阅读了 Karel Zak’s blog,当然还有 autotools-mythbuster. experiences regarding non-recursive 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的答案,我有另一个问题.他写道:

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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1227338.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存