本模板来源于这段时间几次修改Makefile的经验,仅供参考。
适用对象:
- 不同策略测试
- 不同参数组合
- 生成多个程序
以graph500为例:
CFLAGS = -Drestrict=__restrict__ -pipe -std=c99 -D_POSIX_C_SOURCE=200809L -march=native -O3 -DGRAPH_GENERATOR_MPI -DREUSE_CSR_FOR_VALIDATION -I../aml
LDFLAGS = -lm -lpthread
MPICC = mpicc
GENERATOR_SOURCES = ../generator/graph_generator.c ../generator/make_graph.c ../generator/splittable_mrg.c ../generator/utils.c
SOURCES = main.c csr_reference.c utils.c validate.c ../aml/aml.c
HEADERS = common.h csr_reference.h bitmap_reference.h
reference_objects = graph500_reference_bfs
graph500_reference_bfs_sssp graph500_reference_bfs_sssp_debug
dummy
custom_objects = graph500_custom_bfs
graph500_custom_bfs_sssp graph500_custom_bfs_sssp_debug
dummy
PWD := $(shell pwd)
BIN_DIR := $(PWD)/../bin
TARGET_WITH_DIR = $(addprefix $(BIN_DIR)/, $(reference_objects)) $(addprefix $(BIN_DIR)/, $(custom_objects))
.PHONY: all
all: dir $(TARGET_WITH_DIR)
.PHONY: dir
dir:
mkdir -p $(BIN_DIR)
REFERENCE_SOURCES := bfs_reference.c sssp_reference.c $(SOURCES) $(GENERATOR_SOURCES)
REFERENCE_HEADERS := $(HEADERS)
$(BIN_DIR)/graph500_reference_bfs: $(REFERENCE_SOURCES) $(REFERENCE_HEADERS)
$(MPICC) $(CFLAGS) $(REFERENCE_SOURCES) $(LDFLAGS) -o $@
$(BIN_DIR)/graph500_reference_bfs_sssp: $(REFERENCE_SOURCES) $(REFERENCE_HEADERS)
$(MPICC) $(CFLAGS) $(REFERENCE_SOURCES) $(LDFLAGS) -o $@ -DSSSP
$(BIN_DIR)/graph500_reference_bfs_sssp_debug: $(REFERENCE_SOURCES) $(REFERENCE_HEADERS)
$(MPICC) $(CFLAGS) $(REFERENCE_SOURCES) $(LDFLAGS) -o $@ -DSSSP -DDEBUGSTATS
CUSTOM_SOURCES := bfs_custom.c sssp_custom.c $(SOURCES) $(GENERATOR_SOURCES)
CUSTOM_HEADERS := sssp_custom.h $(HEADERS)
$(BIN_DIR)/graph500_custom_bfs: $(CUSTOM_SOURCES) $(CUSTOM_HEADERS)
$(MPICC) $(CFLAGS) $(CUSTOM_SOURCES) $(LDFLAGS) -o $@
$(BIN_DIR)/graph500_custom_bfs_sssp: $(CUSTOM_SOURCES) $(CUSTOM_HEADERS)
$(MPICC) $(CFLAGS) $(CUSTOM_SOURCES) $(LDFLAGS) -o $@ -DSSSP -DSSSP_CUSTOM
$(BIN_DIR)/graph500_custom_bfs_sssp_debug: $(CUSTOM_SOURCES) $(CUSTOM_HEADERS)
$(MPICC) $(CFLAGS) $(CUSTOM_SOURCES) $(LDFLAGS) -o $@ -DSSSP -DSSSP_CUSTOM -DDEBUGSTATS
.PHONY: $(BIN_DIR)/dummy
$(BIN_DIR)/dummy:
.PHONY: clean
clean:
-rm -rf $(BIN_DOR)
这里省略了一些未公开的方案。
说明:
-pipe
使用管道代替临时文件,加快编译速度_POSIX_C_SOURCE
宏用于解决posix_memalign
warning问题,参见Stackoverflow的解释 Warning Implicit Declaration of posix_memalign-march=native
生成针对本地架构优化的代码- 使用变量来存储target,可以把
all
和clean
统一起来,添加一个新方案的时候不用重复写多次 .PHONY
伪目标,避免和同名文件冲突dummy
仅作为占位符来用,避免每次添加一个新的方案,git会显示修改了两行:=
将重复多次使用的变量立即展开,减少开销- 依赖项源文件和头文件分开写,编译时只需要指定源文件
$(LDFLAGS)
放在最后,避免链接出错(注意,链接库排列顺序不对也会导致编译出错)-o $@
直接使用target名称来确定程序名,避免重复写一遍打错- 共用的flags写在前面,不同组合的flags写在末尾
- 指定生成路径到
bin
文件夹,简化clean和.gitignore
当前效果:新增一份实验方案之后,只需将target加入custom_objects即可,不再需要手动指定-o
参数和clean,也不需要每次修改.gitignore。