自动制作和外部条件源

时间:2018-09-19 14:11:27

标签: makefile autotools configure automake

如何在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

1 个答案:

答案 0 :(得分:0)

我不认为将外部资源整合到您的构建中是受支持的用例。这对我当然没有多大意义。不过,可能的替代方法包括

  • 将minigmp源与您的项目捆绑在一起(它们的使用仍然可以是可选的)。这样做的另一个好处是,您可以确保提供兼容的版本。
  • 添加标准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不应对此类规则进行与对其有意义的变量相同的分析级别。

  • 将责任放在项目构建器上,以构建和安装minigmp的兼容版本。对此进行链接。