我有一个生成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)
答案 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 $^