【发布时间】:2014-11-07 13:05:47
【问题描述】:
让我们假设一个简单的项目由两个静态源和三个动态源组成,它们是生成的。 生成文件如下所示:
SRC_DIR = src
OUTPUT = output
TARGET = $(OUTPUT)/lib.so
GEN_SRCS = dynamic_1.c dynamic_2.c dynamic_3.c
SRCS = static_1.c static_2.c $(GEN_SRCS)
OBJS = $(SRCS:%.c=$(OUTPUT)/%.o)
all: $(TARGET)
$(TARGET): $(OBJS)
gcc -shared -o $@ $^
$(OUTPUT)/%.o: $(SRC_DIR)/$*%.c | $(OUTPUT)
@echo "Creating object $@ from $^"
gcc -c -o $@ $<
$(SRC_DIR)/dynamic_%.c: definition_for_generator.xml
@echo "---------------------------------------"
@echo "Generating dynamic Cs"
@echo "---------------------------------------"
./generate.sh $<
$(OUTPUT):
mkdir -p $(OUTPUT)
.PHONY: clean
clean:
rm -rf $(OUTPUT) $(SRC_DIR)/dynamic_1.c $(SRC_DIR)/dynamic_2.c $(SRC_DIR)/dynamic_3.c
虽然只使用一个核心构建,但它构建得很好:
mkdir -p output
Creating object output/static_1.o from src/static_1.c
gcc -c -o output/static_1.o src/static_1.c
Creating object output/static_2.o from src/static_2.c
gcc -c -o output/static_2.o src/static_2.c
---------------------------------------
Generating dynamic Cs
---------------------------------------
./generate.sh definition_for_generator.xml
Creating object output/dynamic_1.o from src/dynamic_1.c
gcc -c -o output/dynamic_1.o src/dynamic_1.c
Creating object output/dynamic_2.o from src/dynamic_2.c
gcc -c -o output/dynamic_2.o src/dynamic_2.c
Creating object output/dynamic_3.o from src/dynamic_3.c
gcc -c -o output/dynamic_3.o src/dynamic_3.c
gcc -shared -o output/lib.so output/static_1.o output/static_2.o output/dynamic_1.o output/dynamic_2.o output/dynamic_3.o
rm src/dynamic_1.c src/dynamic_2.c src/dynamic_3.c
但是,使用并行构建 (-j 2),dynamic_* 文件会生成两次:
mkdir -p output
---------------------------------------
Generating dynamic Cs
---------------------------------------
./generate.sh definition_for_generator.xml
---------------------------------------
Generating dynamic Cs
---------------------------------------
./generate.sh definition_for_generator.xml
---------------------------------------
Generating dynamic Cs
---------------------------------------
./generate.sh definition_for_generator.xml
Creating object output/static_1.o from src/static_1.c
gcc -c -o output/static_1.o src/static_1.c
Creating object output/static_2.o from src/static_2.c
gcc -c -o output/static_2.o src/static_2.c
Creating object output/dynamic_1.o from src/dynamic_1.c
gcc -c -o output/dynamic_1.o src/dynamic_1.c
Creating object output/dynamic_2.o from src/dynamic_2.c
gcc -c -o output/dynamic_2.o src/dynamic_2.c
Creating object output/dynamic_3.o from src/dynamic_3.c
gcc -c -o output/dynamic_3.o src/dynamic_3.c
gcc -shared -o output/lib.so output/static_1.o output/static_2.o output/dynamic_1.o output/dynamic_2.o output/dynamic_3.o
rm src/dynamic_1.c src/dynamic_2.c src/dynamic_3.c
我应该如何更改makefile以仅生成一个文件? 线索可以在这里,但我还没有找到使用它的方法: multiple targets from one recipe and parallel execution
要下载的项目在这里:http://stuff.pitris.info/make.tar.gz
谢谢!
【问题讨论】:
标签: makefile