【发布时间】:2023-03-05 18:59:01
【问题描述】:
我正在尝试将项目转换为使用非递归 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 的博客建议将子目录中包含的 Makefile 命名为 Makemodule.am,但 Makefile.am 似乎也可以工作,如果删除了 SUBDIRS 变量的子文件夹并且从AC_CONFIG_FILES 配置文件宏。
接下来我为根目录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的回答我还有一个问题。他写道:
你可以使用“$(srcdir)/sourceA.cpp”,但是这个目录是隐含的。您只需要:
libadapter_la_SOURCES = sourceA.cpp sourceB.cpp
但是如果没有前缀路径我无法让它工作,所以这对我来说似乎是错误的,有人可以确认我的经验吗?
更新:我也遇到了 po/ 子目录的问题,我怎样才能使它成为非递归的? po/ 中没有 Makefile.am,只是一个 Makevars 文件。有一个 post on autotools-mythbuster,表示不支持使用 gettext 进行非递归生成,但该帖子是 2011 年发布的。我不确定在此期间是否有任何变化。
【问题讨论】:
标签: c++ c makefile autoconf automake