Makefile.am:如何列出 `foo_HEADERS` 中的所有文件(特定扩展名)?

问题描述 投票:0回答:1

Makefile.am
中,有以下规则提及该特定文件夹中的所有
*.h
文件(数百个):

foo_HEADERS = file1.h file2.h ...

随着项目的发展,新的头文件被添加到该文件夹中,我正在寻找一种自动拾取所有 .h 文件的方法。行不通的是使用 Makefile 之类的东西,比如

$(wildcard)

相应的

Makefile.am
AC_CONFIG_FILES
中的
configure.ac
之一,所以我想出了以下内容:

Makefile.am

foo_HEADERS = @FOO_INCLUDE_HFILES@

EXTRA_HEADERS =

configure.ac

AC_SUBST
添加
FOO_INCLUDE_HFILES

# Build a list of all .h files in  $(srcdir)/include/foo  as using
# make variables like $(wildcard) won't pan out as desired.
ac_include_foo_h_files=`ls $srcdir/include/foo/*.h`
ac_include_foo_h_files=`basename -a $ac_include_foo_h_files`
AC_SUBST(FOO_INCLUDE_HFILES, "`echo $ac_include_foo_h_files`")

问题:

我的解决方案按预期工作,但我不确定。它足够通用,可以在自动工具支持的所有操作系统中工作。

  1. 是否有更好、更通用的方法,特别是对于显式的

    ls .../*.h
    basename -a ...
    echo
    A)

  2. 如果我的方法是可行的方法,为什么必须在

    EXTRA_HEADERS
    中设置Makefile.am
    B)


A) 需要

echo
才能删除
ac_include_foo_h_files
中的换行符。

B) 否则我会收到错误。

autotools autoconf automake
1个回答
0
投票

在 Makefile.am 中,有以下规则提到了所有 *.h 该特定文件夹中的文件(数百个):

foo_HEADERS = file1.h file2.h ...

随着项目的发展,新的头文件被添加到其中 文件夹,我正在寻找一种获取所有 .h 文件的方法 自动。

执行此操作的规范且最合适的方法是显式列出所有文件。有数百个这样的人是不寻常的,并且说了一些关于该项目的事情(我不知道是什么),但并没有改变事实。它应该是对构建和(在本例中)安装的内容具有权威性的构建系统。 Automake 没有定义任何其他支持的方式。而且这并不难。

相应的

Makefile.am
AC_CONFIG_FILES
中的
configure.ac

之一

你确定吗?相应的

Makefile
应该在
AC_CONFIG_FILES
中,但不是
Makefile.am
(也不是
Makefile.in
)。假设您的意思是
Makefile
中列出的
AC_CONFIG_FILES
,这在
Makefile.am
...

foo_HEADERS = @FOO_INCLUDE_HFILES@

EXTRA_HEADERS =

... 依赖 Automake 将

@FOO_INCLUDE_HFILES@
传递给它生成的
Makefile.in
,这对于
configure
来说是有意义的。这还假设 Automake 不依赖于它自己对变量值的任何分析,我认为这是正确的,但无法证实。

AC_SUBST
添加
FOO_INCLUDE_HFILES

# Build a list of all .h files in  $(srcdir)/include/foo  as using
# make variables like $(wildcard) won't pan out as desired.
ac_include_foo_h_files=`ls $srcdir/include/foo/*.h`
ac_include_foo_h_files=`basename -a $ac_include_foo_h_files`
AC_SUBST(FOO_INCLUDE_HFILES, "`echo $ac_include_foo_h_files`")

如果你想破解

configure.ac
那么你真的应该更好地掌握 shell 编程。使用现代的
$()
而不是 `` 进行命令替换。不要在您的 glob 本身已经提供您想要的文件列表的地方插入
ls
。并将变量扩展为
echo
的参数,只是为了(重新)捕获它?变量值中有换行符只是因为您首先不明智地捕获了
ls
的输出,但即使这样做了,
echo
技巧也是解决问题的一种奇怪的方法。

另外

$(srcdir)
是命令替换,这可能会失败。您似乎想要参数扩展。 Aand POSIX
basename
不记录任何选项参数,仅记录文件名。

并且不要创建或使用您自己的带有

ac_
名称前缀的变量。 Autoconf 保留该前缀供其内部使用。

是否有更好、更通用的方法,特别是对于显式 ls .../*.h 和 basename -a ... 和 echo?

如果我写这个(尽管我不会;见上文),它可能看起来更像这样:

FOO_INCLUDE_HFILES=
for header in "${srcdir}"/include/foo/*.h; do
  FOO_INCLUDE_HFILES="${FOO_INCLUDE_HFILES} $(basename "$header")"
done

# Mark FOO_INCLUDE_HFILES as an output variable
AC_SUBST([FOO_INCLUDE_HFILES])

顺便说一句,这仅假设 POSIX shell 的功能;如果我为 Bash 编写代码,那么我可能会使用数组而不是循环,并且我可能会使用

pushd
/
popd
来避免需要基本名称。

如果我的方法是可行的方法,为什么必须将

EXTRA_HEADERS
设置为
Makefile.am

你的方法不是要走的路。正如已经讨论过的,它不符合 Automake 的记录要求。我无法准确解释为什么在这种情况下定义一个空的

EXTRA_HEADERS
变量会产生影响,但我认为这是您滥用 Automake 的结果。

© www.soinside.com 2019 - 2024. All rights reserved.