尝试 运行 特定于平台的构建时 Automake 失败
Automake fails when trying to run platform-specific build
我正在使用 autotools 构建一个项目,我想为 Linus 和 Mac OSX 交叉编译。我正在构建两个库,libevent.la
和 libaffinity.la
。 libevent
当 automake 在两个平台上都是 运行 时应该构建。但是,只有当平台是 MACOSX 时,才应该构建 libaffinity.la
。为此,我的 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: No such file or directory
make: *** [all] Error 2
然而,如您所见,extlib_LTLIBRARIES定义在if语句之上。
我该如何解决这个问题?或者是否有更好的方法来执行此操作,以便我可以根据平台有选择地构建 libaffinity.la
?
主要问题原来是条件部分中的行用制表符缩进了。这些对 Automake 来说并不是特别重要,但它们将一直传递到其生成的 Makefile.in
,并从那里传递到 configure
生成的 Makefile
。制表符 对 make
很重要:前导制表符是 make
识别规则配方行的方式。 (只有制表符可以;空格的意义不同。)
结果是 make
将 extlib_LTLIBRARIES += libaffinity.la
解释为某些规则的配方中的命令之一,因此当它尝试应用该规则时,它想要执行一个名为 extlib_LTLIBRARIES
的系统命令。在路径中找不到这样的可执行命令,shell 失败并报告“没有这样的文件或目录”,该消息 make
转发到它自己的输出。
解决方法是避免在 Makefile.am
中使用制表符缩进(空格可以),除非您实际打算为 make
规则编写配方(初始制表符是强制性的)。
我正在使用 autotools 构建一个项目,我想为 Linus 和 Mac OSX 交叉编译。我正在构建两个库,libevent.la
和 libaffinity.la
。 libevent
当 automake 在两个平台上都是 运行 时应该构建。但是,只有当平台是 MACOSX 时,才应该构建 libaffinity.la
。为此,我的 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: No such file or directory
make: *** [all] Error 2
然而,如您所见,extlib_LTLIBRARIES定义在if语句之上。
我该如何解决这个问题?或者是否有更好的方法来执行此操作,以便我可以根据平台有选择地构建 libaffinity.la
?
主要问题原来是条件部分中的行用制表符缩进了。这些对 Automake 来说并不是特别重要,但它们将一直传递到其生成的 Makefile.in
,并从那里传递到 configure
生成的 Makefile
。制表符 对 make
很重要:前导制表符是 make
识别规则配方行的方式。 (只有制表符可以;空格的意义不同。)
结果是 make
将 extlib_LTLIBRARIES += libaffinity.la
解释为某些规则的配方中的命令之一,因此当它尝试应用该规则时,它想要执行一个名为 extlib_LTLIBRARIES
的系统命令。在路径中找不到这样的可执行命令,shell 失败并报告“没有这样的文件或目录”,该消息 make
转发到它自己的输出。
解决方法是避免在 Makefile.am
中使用制表符缩进(空格可以),除非您实际打算为 make
规则编写配方(初始制表符是强制性的)。