Makefile模板

本模板来源于这段时间几次修改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)

这里省略了一些未公开的方案。

说明:

  1. -pipe 使用管道代替临时文件,加快编译速度
  2. _POSIX_C_SOURCE宏用于解决posix_memalignwarning问题,参见Stackoverflow的解释 Warning Implicit Declaration of posix_memalign
  3. -march=native生成针对本地架构优化的代码
  4. 使用变量来存储target,可以把allclean统一起来,添加一个新方案的时候不用重复写多次
  5. .PHONY伪目标,避免和同名文件冲突
  6. dummy仅作为占位符来用,避免每次添加一个新的方案,git会显示修改了两行
  7. :=将重复多次使用的变量立即展开,减少开销
  8. 依赖项源文件和头文件分开写,编译时只需要指定源文件
  9. $(LDFLAGS)放在最后,避免链接出错(注意,链接库排列顺序不对也会导致编译出错)
  10. -o $@直接使用target名称来确定程序名,避免重复写一遍打错
  11. 共用的flags写在前面,不同组合的flags写在末尾
  12. 指定生成路径到bin文件夹,简化clean和.gitignore

当前效果:新增一份实验方案之后,只需将target加入custom_objects即可,不再需要手动指定-o参数和clean,也不需要每次修改.gitignore。

原文地址:https://www.cnblogs.com/zhcpku/p/13883126.html