【问题标题】:Wrong expansion of variable in Makefile.amMakefile.am 中的变量扩展错误
【发布时间】:2019-03-21 15:05:36
【问题描述】:

我被一个奇怪的变量扩展卡住了。让我解释一下。

我有一个使用 automake 的项目,由 configure.acMakefile.am 组成。 基本上,在Makefile.am 我正在做:

ARCH = $(shell ${CURDIR}/./arch.sh)
...
noinst_HEADERS = license/${ARCH}/lchecker.h
proj_SOURCES = main.c license/${ARCH}/lchecker.c
proj_LDFLAGS = -avoid-version -Llicense/${ARCH}

./arch 只是在做uname -m 来确定所需的架构,因为我必须输入正确的目录。

当我运行构建时,我有这个错误:

Makefile:622: license/x86_64/.deps/lchecker.Po: No such file or directory
make[1]: *** No rule to make target 'license/x86_64/.deps/lchecker.Po'.  Stop.

如果我进入license 目录,我注意到创建了一个名为${ARCH}/ 的新目录,我在其中从license/x86_64 中找到了丢失的.deps

我很确定这是一个不正确的扩展问题;我尝试了很多方法,但都失败了。

任何人都可以向我解释这样做的正确方法吗?在网上阅读我发现Makefile.am 的语法与Makefile 不同。

更新:

我尝试添加一些更改以查看变量是否正确定义:

AC_DEFINE([ARCH], ["$ARCH"], [arch check])

echo ARCH = "$ARCH" printf x86_64 所以configure.ac中定义的变量,但是Makefile.am中的扩展又不正确了。

【问题讨论】:

  • @Mike 你删除了你的答案吗?
  • 是的。如果它不起作用,我认为您需要minimal reproducible example。如果有帮助,我可以取消删除它。
  • 嗯,实际上我修改了我的代码并使用了你的代码,因为它当然比我的要好。无论如何,我会听从你的建议,希望我能解决:)

标签: makefile automake variable-expansion brace-expansion


【解决方案1】:

在您的configure.ac 中,使用宏AC_SUBST(varname,[value]) 在每个生成的 makefile 中创建一个 make-variable varname 具有在生成 makefile 时评估 value 的值。 value 可能是外壳扩展。所以例如

AC_SUBST(ARCH,[`./arch.sh`])

configure.ac 将在每个 makefile 中创建分配:

ARCH = x86_64

假设x86_64./arch.sh./configure-time 的标准输出 在构建目录中。然后你可以假设这个变量是这样分配的 在你的Makefile.am 中写下类似的:

noinst_HEADERS = license/${ARCH}/lchecker.h

【讨论】:

  • 我完全按照你的建议做了,但我得到了相同的结果:(
  • @Kyrol 之后您是否重新生成了构建系统? - make distclean; autoreconf; ./configure; make.
  • 是的。我有一个脚本./build.sh 这样做:autoreconf --force --installautomake --add-missingautoconf。即使我输入make distclean 结果是一样的。
  • @Kyrol 在那种情况下,我认为真正的问题在您的帖子中并不可见。最好提供minimal reproducible example
  • autoreconf 已经调用了automakeautoconf(这是autoreconf 的目的),所以你的build.sh 只需要调用autoreconf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2011-09-21
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多