如何在Makefile.am
文件中正确定义外部条件源?
例如,在GNU MPFR中,我们目前在src/Makefile.am
中:
if MINI_GMP
nodist_include_HEADERS += $(mini_gmp_path)/mini-gmp.h
noinst_LTLIBRARIES = libminigmp.la
nodist_libminigmp_la_SOURCES = $(mini_gmp_path)/mini-gmp.h $(mini_gmp_path)/mini-gmp.c
libmpfr_la_LIBADD += libminigmp.la
endif
其中,MINI_GMP
定义为mini_gmp_path
时为true。目标是有选择地针对libminigmp库(mini-gmp)构建MPFR,该库本身是通过自动工具机制(与MPFR相同的编译器,相同的选项等)构建的。
一切似乎都可以正常工作,除非您不想针对mini-gmp构建。在这种情况下,生成的configure
脚本将失败,并显示以下内容:
configure: creating ./config.status
config.status: creating Makefile
config.status: creating mpfr.pc
config.status: creating doc/Makefile
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating tune/Makefile
config.status: creating src/mparam.h
config.status: creating tools/bench/Makefile
config.status: executing depfiles commands
config.status: error: in `/home/vlefevre/software/mpfr':
config.status: error: Something went wrong bootstrapping makefile fragments
for automatic dependency tracking. Try re-running configure with the
'--disable-dependency-tracking' option to at least be able to build
the package (albeit without support for automatic dependency tracking).
See `config.log' for more details
并在config.log
文件中:
config.status:19572: executing depfiles commands
config.status:19647: cd src && sed -e '/# am--include-marker/d' Makefile | make -f - am--depfiles
/bin/mkdir: cannot create directory '/.deps': Permission denied
make: *** [/tmp/GmlvxQJQ:720: /.deps/mini-gmp.Plo] Error 1
原因是生成的src/Makefile
文件包含诸如$(mini_gmp_path)/$(DEPDIR)/mini-gmp.Plo
之类的内容,而mini_gmp_path
未定义。但是由于不希望针对mini-gmp进行构建,因此有关mini-gmp.Plo
的信息是不正确的,即当MINI_GMP
为false时,应该完全忽略mini-gmp文件以进行自动依赖项跟踪。
作为一种解决方法,我们当前在mini_gmp_path
中将.
定义为configure.ac
,而不针对mini-gmp进行构建,因此存在$(mini_gmp_path)/$(DEPDIR)
目录,避免了configure
个失败。但这不是一个干净的解决方案,它可能会干扰可能添加到MPFR源树中的mini-gmp.{c,h}
文件。该解决方案应该完全摆脱mini-gmp.Plo
。
答案 0 :(得分:0)
我不认为将外部资源整合到您的构建中是受支持的用例。这对我当然没有多大意义。不过,可能的替代方法包括
添加标准make
规则,通过从$(mini_gmp_path)
复制迷你gmp源,从而在项目中的某些现有目录中创建它们。您可能还想在BUILT_SOURCES
中列出minigmp源(在内部目录中)。
if MINI_GMP
noinst_LTLIBRARIES = libminigmp.la
libmpfr_la_LIBADD += libminigmp.la
nodist_libminigmp_la_SOURCES = minigmp/mini-gmp.h minigmp/mini-gmp.c
BUILT_SOURCES = $(nodist_libminigmp_la_SOURCES)
# Are you want the mini-gmp header to be installed?
nodist_include_HEADERS += minigmp/mini-gmp.h
else
noinst_LTLIBRARIES =
BUILT_SOURCES =
endif
minigmp/mini-gmp.c: $(mini_gmp_path)/mini-gmp.c
cp $< $@
minigmp/mini-gmp.h: $(mini_gmp_path)/mini-gmp.h
cp $< $@
Automake不应对此类规则进行与对其有意义的变量相同的分析级别。