【问题标题】:Is there a way to tell automake not to interpret part of the automakefile?有没有办法告诉 automake 不要解释 automakefile 的一部分?
【发布时间】:2011-11-18 05:21:39
【问题描述】:

有没有办法告诉 automake 不要解释 Makefile.am 的一部分?

具体来说,我正在尝试在 Makefile.am 中对 Makefile 进行条件编码。正如other people 所注意到的,这不起作用,因为 automake 会解释 endif 构造。

是否有任何方法可以在 Makefile.am 文件中转义或引用字符串,以便 automake 将它们逐字复制到目标 Makefile 中?具体来说,我不希望它将 endif 解释为:

ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif

【问题讨论】:

    标签: makefile gnu-make automake


    【解决方案1】:

    在 automake (GNU automake) 1.16.5 中,当我用换行符和空格分隔关键字时,ifeq ... endif 会通过 automake 进入 Makefile,如下所示:

    if %?INSTALL%
    # 1 preceding newline
      ifeq (true,$(call direction,uninstall %DIR% PROGRAMS %BASE%))  # 2 preceding spaces
    ## -------------- ##
    ## Uninstalling.  ##
    ## -------------- ##
    
    .PHONY uninstall-am: uninstall-%DIR%PROGRAMS-$(%NDIR%_STATUS)
    uninstall-%DIR%PROGRAMS: uninstall-%DIR%PROGRAMS-$(%NDIR%_STATUS)
    uninstall-%DIR%PROGRAMS-supported: uninstall-%DIR%PROGRAMS
    uninstall-%DIR%PROGRAMS-unsupported:
        @echo "%NDIR% (PROGRAMS) not installed" >&2
    
    uninstall-%DIR%PROGRAMS: $(install_%DIR%_PROGRAMS)
        @test $< \
        && $(NORMAL_UNINSTALL) \
        && $(autotoolsdir)/uninstall -P PROGRAMS -LT ?LIBTOOL? -I $? >&2 
    
      endif # 2 preceding spaces
    # 1 subsequent newline
    endif %?INSTALL%
      
    

    如果我将 automake 条件与 make 条件混合使用时尤其如此,如上所示。

    【讨论】:

      【解决方案2】:

      最简单的方法是在ifdefifeqifneqelseendif 之前插入一个空格。这样,automake 解析器就无法识别这些关键字。一定要插入一个空格,它不适用于制表符。

      来源:https://patchwork.kernel.org/patch/6709921/

      【讨论】:

        【解决方案3】:

        我设法找到了不同的解决方案。您可以将要转义的位放在单独的文件中,然后执行:

        $(eval include $(srcdir)/Include.Makefile)
        

        由于 automake 不理解 $(eval 它只是保持整行完好无损。因此,您可以将任何您想要的内容放入另一个文件中,GNU make 会愉快地读取它。请注意,您不能直接使用include,因为 Automake 确实理解这一点并将进入另一个文件。

        【讨论】:

        • 我非常喜欢这个解决方案,而且它也适用于更多。谢谢!
        【解决方案4】:

        automake 做条件句的原因是因为有些恐龙不做。也就是说,如果您真的必须这样做,您可以将您的 sn-p 定义为 configure.acAC_SUBST 中的变量,并将其定义为您的 Makefile。这样,automake 就没有机会看到它。请记住使用AM_SUBST_NOTMAKE 以避免创建像FOO = @FOO@ 这样的行。)

        dnl In configure.ac:
        snippet='
        ifeq ($(somevar),Y)
        foo
        endif
        '
        AC_SUBST([snippet])
        AM_SUBST_NOTMAKE([snippet])
        

        和:

        ## In Makefile.am:
        @snippet@
        

        我真诚地希望有比这更好的方法。

        【讨论】:

        • 这是迄今为止我见过的最好的解决方案。
        【解决方案5】:

        怎么样:

        SOMEVAR=$(if $(SOMEVAR),$(SOMEVAR),"default_value")
        

        【讨论】:

        • 这似乎解决了我的具体问题,但导致 automake 发出警告:if $(SOMEVAR: non-POSIX variable name。所以,知道如何在 automakefile 中转义/引用仍然会很好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        相关资源
        最近更新 更多