代码之家  ›  专栏  ›  技术社区  ›  Josh Kelley

延迟或重复GNU make中的先决条件

  •  2
  • Josh Kelley  · 技术社区  · 15 年前

    check-svnversion:
      ../shared/update-svnversion-h.pl
    
    ../shared/svnversion.h: check-svnversion
    
    shared/svnversion.o: ../shared/svnversion.h
    
    .PHONY: check-svnversion
    

    svnversion.o svnversion.cpp svnversion.h (明确列出,因为依赖项检查出于某种原因没有拾取它)。 svreversion.h 由创建和维护 update-svnversion-h.pl svnversion 并将输出映射到C++文件中。

    make update-svversion-h.pl update-svversion-h.pl .

    有没有办法告诉GNU make对一个先决条件进行两次评估,或者延迟检查先决条件上的时间戳,直到该先决条件的命令完成之后?

    或者,有没有更好的方法在源代码中嵌入修订号?(为了提高速度,我试图避免在每次构建时都需要重新编译的解决方案。)

    4 回复  |  直到 15 年前
        1
  •  2
  •   CesarB    15 年前

    autotools

    remake-hdr.am

    %CONFIG_H%: %STAMP%
    ## Recover from removal of CONFIG_HEADER
        @if test ! -f $@; then \
          rm -f %STAMP%; \
          $(MAKE) $(AM_MAKEFLAGS) %STAMP%; \
        else :; fi
    
    
    %STAMP%: %CONFIG_H_DEPS% $(top_builddir)/config.status
        @rm -f %STAMP%
        cd $(top_builddir) && $(SHELL) ./config.status %CONFIG_H_PATH%
    

    config.status 创建戳记文件。

    这个automake示例和您的示例之间的主要区别似乎是automake接触了戳记文件,而在您的示例中,它甚至不是一个真实的文件。

        2
  •  2
  •   Jamie    15 年前

    这是我放在make文件中的一个目标。它创建了两个函数,这些函数以字符串形式返回各种构建遥测信息。好在遥测数据代表了最后一次链接的时间,而不是构建对象的时间。

    ##
    ## on every build, record the working copy revision string
    ##
    svn_version.c: $(C_SRC:.c=.o) Makefile
        @echo -n 'const char* build_date(void);\n'  > $@
        @echo -n 'const char* build_date(void)\n{ static const char* build_date = __DATE__ ; '  >> $@
        @echo 'return build_date; }\n'                                                          >> $@
        @echo -n 'const char* build_time(void);\n'                                              >> $@
        @echo -n 'const char* build_time(void)\n{ static const char* build_time = __TIME__ ; '  >> $@
        @echo 'return build_time; }\n'                                                          >> $@
        @echo -n 'const char* svnid_build(void);\n'                                             >> $@
        @echo -n 'const char* svnid_build(void)\n{ static const char* SVN_Version = "\\n<SVN_PID>'    >> $@
        @svnversion -cn .                                                                       >> $@
        @echo '</svn_pid>\\n"; return SVN_Version; }\n'                                         >> $@
        @echo -n 'const char* svnid_build_str_only(void);\n'                                    >> $@
        @echo -n 'const char* svnid_build_str_only(void)\n{ static const char* SVN_Version = "' >> $@
        @svnversion -cn .                                                                       >> $@
        @echo '"; return SVN_Version; }\n'                                                      >> $@
        @$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $(@:.c=.o) $@
    

    确保用简单的“svn_version.c”替换最终目标中对对象文件的依赖性。前任。

    final-target: svn_version.c
        $(CC) $(C_SRC:.c=.o) $(<:.c=.o) -o $@
    
        3
  •  1
  •   coppro    15 年前

    (书中)有详细说明,但简而言之,您必须设置 svn:keywords 要包含的文件的属性 Rev $Rev$ 在代码的某个地方。SVN将自动将其替换为 $Rev: #$ #

        4
  •  1
  •   Community Egal    7 年前

    CesarB's answer .

    ../shared/svnversion.h: check-svnversion
    
    check-svnversion:
        ../shared/update-svnversion-h.pl
        @#Force recreation of svnversion.o.  Otherwise, make won't notice that
        @#svnversion.h has changed until the next time it's invoked.
        @if [ ../shared/svnversion.h -nt shared/svnversion.o ] ; then rm shared/svnversion.o ; fi
    
    shared/svnversion.o: ../shared/svnversion.h
    
    .PHONY: check-svnversion