尝试运行特定于平台的构建时 Automake 失败

Posted

技术标签:

【中文标题】尝试运行特定于平台的构建时 Automake 失败【英文标题】:Automake fails when trying to run platform-specific build 【发布时间】:2020-07-23 17:56:44 【问题描述】:

我正在使用 autotools 构建一个我想为 Linus 和 Mac OSX 交叉编译的项目。我正在构建两个库,libevent.lalibaffinity.lalibevent 应该在两个平台上运行 automake 时构建。但是,libaffinity.la 只有在平台是 MACOSX 时才应该构建。为此,我的configure.ac 文件中有以下内容:

#Detect the target system
case "$host_os" in
    darwin*)
        build_darwin=yes
        ;;
esac

AM_CONDITIONAL([DARWIN], [test "$build_darwin" = "yes"])

如果项目是在 Mac OS 上构建的,将设置变量DARWIN。在Makefile.am 我有以下内容:

extlibdir = $(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/extensions
extlib_LTLIBRARIES = libevent.la
AM_CFLAGS = -I$(srcdir) $(WARN_CFLAGS) $(DEBUG_CFLAGS) 
libevent_la_SOURCES = libevent.c
libevent_la_CFLAGS = $(AM_CFLAGS) $(GUILE_CFLAGS) -Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined
libevent_la_LIBADD = $(GUILE_LIBS)
libevent_la_LDFLAGS = -export-dynamic -module
$(GOBJECTS): libevent.la

if DARWIN
    extlib_LTLIBRARIES += libaffinity.la
    affinity_la_SOURCES = affinity.c
    affinity_la_CFLAGS = $(AM_CFLAGS) $(GUILE_CFLAGS) -Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined
    affinity_la_LIBADD = $(GUILE_LIBS)
    affinity_la_LDFLAGS = -export-dynamic -module
    $(GOBJECTS) += libaffinity.la
endif

当我运行make 时,它失败并出现以下错误:

extlib_LTLIBRARIES += affinity.la

make[1]: extlib_LTLIBRARIES: 没有这样的文件或目录

make: *** [all] 错误 2

但是,如您所见,extlib_LTLIBRARIES 定义在 if 语句之上。

我该如何解决这个问题?或者有没有更好的方法可以让我有选择地基于平台构建libaffinity.la

【问题讨论】:

我认为这不是您描述的问题的原因,但首先将工件的名称更改为有条件构建为libaffinity.la,而不是affinity.la Makefile.am 中的条件内的行是缩进的。您不可能为此使用制表符,是吗?即使您不是有意这样做,也值得确保您的编辑器没有使用选项卡代替空格。经过反思,我认为这是错误性质的一个很好的候选者。该错误消息与 make 将缩进的行解释为规则配方的(部分)一致。 @JohnBollinger。删除标签解决了这个问题!那么这是否意味着标签在 automake 中引入了某种新的范围? Makefile.am 中的几乎所有内容最终都会结转到由make 处理的Makefile。对于make——毕竟这是报告错误的原因——标签很重要。 【参考方案1】:

事实证明,主要问题是条件部分中的行用制表符缩进。这些对 Automake 来说并不是特别重要,但它们将被传递到其生成的Makefile.in,并从那里传递到由configure 生成的Makefile。制表符make 很重要:前导制表符是make 识别规则配方行的方式。 (只有制表符可以;空格的意义不同。)

因此,makeextlib_LTLIBRARIES += libaffinity.la 解释为某个规则的配方中的命令之一,因此当它尝试应用该规则时,它想要执行一个名为 extlib_LTLIBRARIES 的系统命令.在路径中找不到这样的可执行命令,shell 失败并报告“没有这样的文件或目录”,该消息 make 转发到它自己的输出。

解决方法是避免在 Makefile.am 中使用制表符缩进(空格可以),除非您实际上打算为 make 规则编写配方(对于该规则,初始制表符是强制性的)。

【讨论】:

感谢您的解释和回答!

以上是关于尝试运行特定于平台的构建时 Automake 失败的主要内容,如果未能解决你的问题,请参考以下文章

在跨平台 xamarin 项目中编写特定于平台的代码

如何阻止CMake将特定于平台的标志传递给编译器?

您可以在 PhoneGap 中添加特定于平台的代码吗?

是否可以在 Java 中使用特定于平台的跨平台 sdk 方法?

Xcode:构建特定于每个文件编译器构建设置的体系结构

如何让 Cargo 执行构建脚本并同时使用特定于目标的链接器?