加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 非递归(非递归)Automake

发布时间:2020-12-16 07:08:54 所属栏目:百科 来源:网络整理
导读:我试图将项目转换为使用非递归automake.基于搜索SO,我可以看到该主题已被覆盖到一定程度.但是对于如何将递归的automake项目转换为非递归项目并没有任何问题.我已经阅读了 Karel Zak’s blog,当然还有 autotools-mythbuster. experiences regarding non-recur
我试图将项目转换为使用非递归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的答案,因为我认为这完全是一种误解.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读