• 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。

  • 相关阅读:
    2016某天闲谈
    APP测试入门篇之APP基础知识(001)
    windows服务器下frp实现内网穿透
    nginx使用与配置
    spring boot 实现优雅的关闭
    spring boot 自定义sql分页查询
    java获取类加载路径和项目根路径的5种方法
    linux下 启动node 和关闭node
    docker 安装 fastdfs
    docker 常用命令和常用容器启动
  • 原文地址:https://www.cnblogs.com/zhcpku/p/13883126.html
Copyright © 2020-2023  润新知