【问题标题】:Makefile execute echo only one time inside a ruleMakefile 在规则内只执行一次回显
【发布时间】:2018-06-30 00:01:07
【问题描述】:

我有这个 Makefile

$(MAIN) : $(OBJECTS)

$(OBJECTS) : %.c
     compile file

而且我想在文件需要编译时使用printf 打印类似“正在编译”的内容,如果在每次编译结束时已经编译了文件,则使用“完成”打印,例如:

Compiling
file1.c
file2.c
file3.c
Done

我尝试使用 shell 中的 if 或 makefile 中的 ifeq 之类的句子 但是我需要一个变量,如果我不知道为什么,makefile 不允许我更改 a 内变量的值。我该如何存档?

【问题讨论】:

    标签: if-statement makefile rules


    【解决方案1】:

    我想这就是你想要的:

     OBJECTS := file1.o file2.o file3.o
    
    .PHONY: all compiling
    
    all : $(OBJECTS)
        @echo Done
    
    compiling:
        @echo Compiling
    
    $(OBJECTS): file%.o : file%.c compiling
        @echo $<
        @compile $<
    

    【讨论】:

    • mmmm 它或多或少地起作用,因为为了解释我的问题,我说了很多很少的信息。我的真实情况是,我没有编译对象,而是创建了一个库,然后我使用.PHONY 的规则来创建我的库,以便每次我做检查时检查库中的任何源是否已被修改,那么我想要的是消息“编译”和“完成”仅在库正在编译(或更新)时出现,而不是在库已经更新时出现
    【解决方案2】:

    我解决了将变量 MODE 初始化为 0 并将我的 makefile 分为两部分的问题,其中一部分检查是否已修改某些内容,在这种情况下,更新失败我打印我的消息,然后执行 $(MAKE) MODE=1我在那里执行一个普通的 makefile 来更新所有需要的东西

    感谢 Renauld Pacalet 在问题https://stackoverflow.com/a/51100086/10010027

    【讨论】:

      【解决方案3】:

      我同样需要在开始构建一堆 PDF 文件时打印一条消息,然后跳转生成另一堆 PNG 文件。我使用了两个 .INTERMEDIATE 目标来防止 make 对 .PHONY 目标文件“饿”(期待更新)。

      消息只会打印一次。

       CC=gcc
       OBJECTS := file1.o file2.o file3.o
      
      .PHONY: all 
       all:  $(OBJECTS) msg_compiling
      
      $(OBJECTS): file%.o : file%.c msg_compiling
          $(CC) -c -o $@ $< 
      
      .INTERMEDIATE: msg_compiling
       msg_compiling:
          @printf "\n Compiling \n"
      

      这在 GNU make 手册https://www.gnu.org/software/make/manual/html_node/Special-Targets.html中有解释

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2016-06-30
        • 1970-01-01
        • 2020-09-11
        • 2018-07-22
        • 1970-01-01
        相关资源
        最近更新 更多