美文网首页
Makefile 的一些使用

Makefile 的一些使用

作者: printf_K | 来源:发表于2017-05-20 09:50 被阅读0次

    今天为了写编译原理的词法分析器,特地写了一下Makefile来简化编译过程,本来打算在子目录放置 Makefile 完成单独的编译,但是根目录里的Makefile不管怎么写都陷入死循环,所以现在我参照网上博客和一些大项目的Makefile 来编写这篇文章。可能不会一次写完,一点一点更新吧。

    错误的写法

    cd ./type
    make
    cd ..
    

    一些多目录Makefile的写法

    1.make -C

    make -C 可以切换到指定目录执行make操作
    比如:

    make -C ./src
    

    执行结果如下:

    make -C ./src
    make[1]: Entering directory '/home/k/temp/compiler_d/src'
    ......
    ....
    ....
    make[1]: Leaving directory '/home/k/temp/compiler_d/src'
    

    2.cd ${SUBDIR} && make

    原文链接:[CSDN makefile进入子文件夹执行make][http://blog.csdn.net/taolinke/article/details/6626298]

    SUBDIRS=directory1 directory2 directory3  
    RECURSIVE_MAKE= @for subdir in $(SUBDIRS); \  
          do \  
          echo "making in $subdir"; \  
          ( cd $subdir && $(MAKE) all -f Makefile -e CC='${CC}' CFLAG='${CFLAG}') || exit 1; \  
           done  
    RECURSIVE_CLEAN= @for subdir in $(SUBDIRS); \  
           do \  
           echo "cleaning in $subdir"; \  
           ( cd $subdir && $(MAKE) clean -f Makefile) || exit 1; \  
           done       
    subdirs:  
            $(RECURSIVE_MAKE)       
    all: subdirs    
    dclean:  
                $(RECURSIVE_CLEAN)  
    

    该思路是将cd 操作 与 make 操作 用&& 连接,在子shell中进行操作
    通过几次实验后我才明白,在Makefile里的cd 命令 只是暂时更改了目录,用子shell的概念比较好理解这点
    还有,Makefile里面${..}会在执行前提前替换,比如:

    all:
            cd ./src && make && echo ${SUBSHELL}
            echo ${PWD}
    

    输出为(home/k/temp/temp 为当前目录):

    (cd ./src && make && echo "pwd" > temp && echo )
    make[1]: Entering directory '/home/k/temp/temp/src'
    gcc -o test main.c
    make[1]: Leaving directory '/home/k/temp/temp/src'
    
    echo /home/k/temp/temp
    /home/k/temp/temp
    

    其中 ${PWD} 被替换为当前路径,而 ${SUBSHELL} 由于没有定义,也不是环境变量,所以为空

    相关文章

      网友评论

          本文标题:Makefile 的一些使用

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