代码之家  ›  专栏  ›  技术社区  ›  246tNt

Makefile用于归档/链接自动生成的源文件

  •  1
  • 246tNt  · 技术社区  · 15 年前

    基本上,我有一个文件“blah.txt”。这些文件由“编译器”解析,并从中生成N个output.c文件。我想要一个makefile,它将从该.txt文件生成c文件,然后编译所有这些文件并将它们归档到libmystuff.a中

    我想到这样的事情:

    all: dogen libmystuff.a
    
    dogen: source.txt
        mycompiler $^
    
    libmystuff.a: $(addsuffix .o, $(shell ls *.c))
        $(AR) rcs $@ $^
    
    .PHONY: dogen
    

    但是很明显,这是行不通的,因为依赖项在一开始就被评估了,*.c还没有产生任何结果,因为它们不存在。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Beta    15 年前

    Pavel Shved是对的(*),您必须重新运行Make。这是一个我引以为傲的技巧。它将处理对可能还不存在的对象的依赖,并且不会不必要地运行。

    SOURCES = $(wildcard *.c)
    OBJECTS = $(SOURCES:.c=.o)
    
    all: libmystuff.a
    
    ifeq ($(MAKELEVEL),0) 
    libmystuff.a: source.txt
        mycompiler $^ 
        @$(MAKE) -s $@
    else
    libmystuff.a: $(OBJECTS)
        $(AR) rcs $@ $^ 
    endif
    

    (*)我的宿敌,我们又见面了。


    如果有的话 其他 制作我没想到。但我认为这会解决问题:

    SOURCES = $(wildcard *.c)
    OBJECTS = $(SOURCES:.c=.o)
    
    all: libmystuff.a
    
    libmystuff.a: source.txt
        mycompiler $^ 
        @$(MAKE) -s phonyLib
    
    .PHONY: phonyLib
    phonyLib: $(OBJECTS)
        $(AR) rcs libmystuff.a $^ 
    

        2
  •  3
  •   P Shved    15 年前

    使用sentry“makefile”强制make重新读取makefile并替换正确的列表 *.c :

    include sources-sentry
    
    sources-sentry: source.txt
        mycompiler $^
        touch $@
    
    libmystuff.a: $(addsuffix .o, $(shell ls *.c))
        $(AR) rcs $@ $^
    

    include 指令用于包括其他makefile(就像C一样) #include ). 它有一个很好的特殊性,如果它包含的makefile本身就是一个目标, make 程序首先将其视为目标并尝试更新。如果它不是最新的,make将调用更新它所需的命令,然后 重新读取makefile,再次替换所有变量

    因此,如果source.txt在您上次处理它之后发生了更改(时间被记录为sources sentry的时间戳 文件 ),将更新源并重新调用make *c 被替换为c文件的更新集。

        3
  •  2
  •   ankon    15 年前