如何使用-j选项在makefile中维护多个目标的序列

时间:2016-01-07 15:51:52

标签: makefile

我有一个生成C ++文件的脚本。首先,我想生成这些文件。 然后在库中编译它们。 我想在一个Makefile中执行此操作。

TARGETS = GEN_FILE LIBNAME

GEN_FILE: input
  BINARYTOGEN input

OBJ =(GENERATED_FILES:.cpp-.o)

LIBNAME: $(OBJ)
    cc $(OBJ)

当使用-j选项时,如何确保目标GEN_FILE始终在并行环境中的LIBNAME之前运行。

一种方法是.NOTPARALLEL。

 .generated_marker: a.gen b.gen
   touch a.cpp
   touch b.cpp
   touch $@

 SRCS = a.cpp b.cpp

$(SRCS): .generated_marker

OBJ = $(SRCS:.cpp=.o)

OUT = ./libutils.a

.PHONY: all
all: $(OUT)

 .SUFFIXES: .cpp

 LIBS = -L…

  INCLUDES = -I…..

 .cpp.o:
         gcc $(INCLUDES) -g -c $< -o $@

  $(OUT): $(OBJ)
         ar rcs $(OUT) $(OBJ)

1 个答案:

答案 0 :(得分:0)

如果您的生成器处理单个源文件并生成单个输出文件,则很简单 - 只需添加模式规则,例如:

all: a.out

%.c: %.gen
    cp $< $@

SRCS:=a.c b.c

a.out: $(SRCS)
    gcc $^

(为简单起见,我使用cp,它应该是你的实际生成器,例如flex,bison,lemon,.....)

您的生成器可能会同时生成大量文件(甚至所有文件),然后您可能需要创建一个标记文件,其中时间戳将指示最新的重新生成,例如:

all: a.out

.generated_marker: a.gen b.gen
    touch a.c
    touch b.c
    touch $@

SRCS:=a.c b.c

$(OBJS):=$(SRCS:.c=.o)

$(OBJS): .generated_marker

a.out: $(OBJS)
    gcc $^