美文网首页
DiskSim 4源码 - D1 - Makefile

DiskSim 4源码 - D1 - Makefile

作者: Quasars | 来源:发表于2015-06-29 16:32 被阅读186次
    • 如果本文有任何错误之处,或您有任何建议或意见,万望不吝赐教,大家一起进步! :)

    刚才忘了写一下需求了,目前的需求有:
    1. 使用ssd扩展
    2. 使用自定义的输入trace格式(其中一个字段包括IO内容的4k-md5值)
    3. 重删/非重删模式下对性能的Impact:
    i. 读写次数统计
    ii. 擦除次数统计
    iii. 响应时间
    4. 读写流程。

    D1:理解一下工程的Makefile

    D1的任务就是理解下面这个Makefile,首先是一些琐碎的Makefile语法:
    实际上,Makefile由一系列类似下面的组成

    <target> : <prerequisites> 
    [tab]  <command1>
    [tab]  <command2>
    ...
    
    • include <filename>

    make 程序在处理指示符 include 时,将暂停对当前makefile 文件
    的读取,而去读<filename>指示的文件(列表)。
    <filename>将通过某种方式搜索得到。

    • $(shell xxx)

    $(shell ...)将包含一条shell 命令,如下面所示的pwd
    Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递。
    Makefile中的变量以$开头, 所以,为了避免和shell的变量冲突,shell的变量以$$开头

    • export var_name

    这是用于在不同的makefile中共享变量的。

    • $(MAKE) -C <dir_name>

    区别于gcc -c xxx.c,gcc的-c选项用于“把代码文件编译成中间代码.o文件”;
    而make的-C选项是“切换到dir所在目录,然后执行make,之后再切换回原目录”

    • $@

    其中一个自动变量,代表目前正在构建的目标。
    其他的自动变量(如$<等)在阮一峰的教程中详细说明。

    • .PHONY: xxx(伪目标)

    特殊声明,每次make xxx时都执行(而不去检查是否该目标为更新的)

    //这是<disksim_dir>/makefile文件
    TOP_BUILDDIR=$(shell pwd)
    include .paths
    SUBDIRS=libddbg libparam diskmodel memsmodel ssdmodel src
    
    all:    
        $(MAKE) -C libddbg
        $(MAKE) -C libparam
        $(MAKE) -C diskmodel
        $(MAKE) -C memsmodel
        $(MAKE) -C ssdmodel
        $(MAKE) -C src
        $(MAKE) -C diskmodel/layout_g4_tools
            # If dixtrac is included, build it with the distribution
        if [ -d dixtrac ]; then $(MAKE) -C dixtrac ; fi
    
    clean:
        for d in $(SUBDIRS); do \
            $(MAKE) -C $$d $@; \
        done
    
    distclean: clean
        rm -f *~
        for d in $(SUBDIRS); do \
            $(MAKE) -C $$d $@; \
        done
    
    .PHONY: doc
    doc:
        $(MAKE) -C libddbg
        $(MAKE) -C libparam
        $(MAKE) -C src/modules
        $(MAKE) -C diskmodel/modules
        $(MAKE) -C memsmodel/modules
        $(MAKE) -C ssdmodel/modules
    
    doc-clean:
        $(MAKE) -C memsmodel/modules distclean
        $(MAKE) -C diskmodel/modules distclean
        $(MAKE) -C ssdmodel/modules distclean
        $(MAKE) -C src/modules distclean
        $(MAKE) -C libparam distclean
        $(MAKE) -C libddbg distclean
    
    //这是\<disksim dir>\.paths文件
    # libdisksim
    export LIBDISKSIM_PREFIX=
    export LIBDISKSIM_INCL=$(LIBDISKSIM_PREFIX)/include
    export LIBDISKSIM_CFLAGS=-I$(LIBDISKSIM_INCL)
    export LIBDISKSIM_LDPATH=$(LIBDISKSIM_PREFIX)/lib
    export LIBDISKSIM_LDFLAGS=-L$(LIBDISKSIM_LDPATH) -ldisksim
    
    # disksim internals (for memsmodel, etc)
    export DISKSIM_PREFIX=src/
    export DISKSIM_INCL=$(DISKSIM_PREFIX)/
    export DISKSIM_CFLAGS=-I$(DISKSIM_INCL)
    export DISKSIM_LDPATH=$(DISKSIM_PREFIX)/
    export DISKSIM_LDFLAGS=-L$(DISKSIM_LDPATH) -ldisksim
    
    # path to diskmodel
    export DISKMODEL_PREFIX=diskmodel
    export DISKMODEL_INCL=$(DISKMODEL_PREFIX)/include
    export DISKMODEL_CFLAGS=-I$(DISKMODEL_INCL)
    export DISKMODEL_LDPATH=$(DISKMODEL_PREFIX)/lib
    export DISKMODEL_LDFLAGS=-L$(DISKMODEL_LDPATH) -ldiskmodel
    
    # path to libparam
    export LIBPARAM_PREFIX=libparam
    export LIBPARAM_INCL=$(LIBPARAM_PREFIX)/include
    export LIBPARAM_CFLAGS=-I$(LIBPARAM_INCL)
    export LIBPARAM_LDPATH=$(LIBPARAM_PREFIX)/lib
    export LIBPARAM_LDFLAGS=-L$(LIBPARAM_LDPATH) -lparam
    
    # libtrace
    export LIBDDBG_PREFIX=libddbg
    export LIBDDBG_INCL=$(LIBDDBG_PREFIX)/include
    export LIBDDBG_CFLAGS=-I$(LIBDDBG_INCL)
    export LIBDDBG_LDPATH=$(LIBDDBG_PREFIX)/lib
    export LIBDDBG_LDFLAGS=-L$(LIBDDBG_LDPATH) -lddbg
    
    # path to memsmodel
    export MEMSMODEL_PREFIX=memsmodel
    export MEMSMODEL_INCL=$(MEMSMODEL_PREFIX)/include
    export MEMSMODEL_CFLAGS=-I$(MEMSMODEL_INCL)
    export MEMSMODEL_LDPATH=$(MEMSMODEL_PREFIX)/lib
    export MEMSMODEL_LDFLAGS=-L$(MEMSMODEL_LDPATH) -lmemsmodel
    
    # path to ssdmodel
    export SSDMODEL_PREFIX=ssdmodel
    export SSDMODEL_INCL=$(SSDMODEL_PREFIX)/include
    export SSDMODEL_CFLAGS=-I$(SSDMODEL_INCL)
    export SSDMODEL_LDPATH=$(SSDMODEL_PREFIX)/lib
    export SSDMODEL_LDFLAGS=-L$(SSDMODEL_LDPATH) -lssdmodel
    
    

    有了上面的知识,该Makefile简直简单,就是一个“总控Makefile”,它做了:

    1. include了一个文件.paths,export了一堆变量以供下一级的Makefile使用;
    2. 定义了几个目标,他们需要分别进入每个子目录进行make。

    显然disksim整个工程中的所有东西不需要每个都去看,比较相关的有:<u>trace文件读入,请求的生成,ssd模块(MS版)的处理</u>等。

    参考文献:
    <a href=http://www.blogjava.net/jasmine214--love/archive/2012/01/10/368191.html>makefile中的shell语法</a>
    <a href=http://blog.sina.com.cn/s/blog_6cc850810100r8fr.html>Makefile Include</a>
    <a href=http://blog.csdn.net/shallnet/article/details/37358169>从头开始写makefile系列</a>
    <a href=http://bbs.chinaunix.net/forum-viewthread-tid-1630480.html>ChinaUNiXmake的C选项问题讨论<a>
    <a href=http://www.ruanyifeng.com/blog/2015/02/make.html>阮一峰的make教程</a>
    <a href=https://gist.github.com/isaacs/62a2d1825d04437c6f08>issacs的make basic教程</a>
    <a href=http://www.gnu.org/software/make/manual/make.html>GNU make官方文档<a>
    <a href=http://www.cnblogs.com/hnrainll/archive/2011/04/12/2013377.html>Disksim的特殊规则.PHONY</a>

    相关文章

      网友评论

          本文标题:DiskSim 4源码 - D1 - Makefile

          本文链接:https://www.haomeiwen.com/subject/zcieqttx.html