zoukankan      html  css  js  c++  java
  • Make recursive

    folder structure:

    Makefile
    t1/Makefile
    t1/t1.c
    t2/Makefile
    t2/t2.c

    Makefile

    SUBDIRS = t1 t2
    all:
    	for dir in $(SUBDIRS); do 
    		$(MAKE) -C $$dir; 
    	done
    

    t1/Makefile

    all: t1
    
    clean:
    	rm t1
    

    t1/t1.c

    #include <stdio.h>
    int main(void)
    {
            printf("t1 
    ");
            return 0;
    }
    

    t2/Makefile

    all: t2
    
    clean:
    	rm t2
    

    t2/t2.c

    #include <stdio.h>
    int main(void)
    {
            printf("t2 
    ");
            return 0;
    }
    

    ===========================================

    case 1:

    如果我們將 t1/t1.c 故意寫錯
    t1/t1.c

    #include <stdio.h>
    int main(void)
    {
            printf("t1 
    ");
            xxxxxxxxxxxxxxxxxxxxxxxx
            return 0;
    }
    

    接下 make

    $ make
    
    for dir in t1 t2; do 
    	make -C $dir; 
    done
    make[1]: Entering directory '/home/break-through/working_space/wasai/make_test/t1'
    cc     t1.c   -o t1
    t1.c: In function ‘main’:
    t1.c:5:9: error: ‘asdfasd’ undeclared (first use in this function)
             asdfasd
             ^
    t1.c:5:9: note: each undeclared identifier is reported only once for each function it appears in
    t1.c:6:9: error: expected ‘;’ before ‘return’
             return 0;
             ^
    <builtin>: recipe for target 't1' failed
    make[1]: *** [t1] Error 1
    make[1]: Leaving directory '/home/break-through/working_space/wasai/make_test/t1'
    make[1]: Entering directory '/home/break-through/working_space/wasai/make_test/t2'
    cc     t2.c   -o t2
    make[1]: Leaving directory '/home/break-through/working_space/wasai/make_test/t2'
    

    發生什麼事呢?
    當 build 到 t1 時,會有error,
    但是並沒有立即 停下來,而是繼續執行 build t2,
    這個會造成無法判斷是否 build success,
    且也不曉得 error 在那裡,
    怎麼說呢?
    假如要 build 的 code 很多,
    第一隻 code build error,
    沒有立即停下,
    繼續 build code,
    而 營幕 會被一直刷新而無法判斷是否 build successful,
    也不曉得 error 在哪裡?

    結論:

    不要使用 for loop build code

    =======================================

    case2:

    若我們將 Makefile 改成如下,

    SUBDIRS = t1 t2
    BUILDSUBDIRS = $(SUBDIRS:%=build-%)
    
    all: $(BUILDSUBDIRS)
    
    $(BUILDSUBDIRS):
    	make -C $(@:build-%=%)
    

    t1/t1.c 故意寫錯

    #include <stdio.h>
    int main(void)
    {
            printf("t1 
    ");
            xxxxxxxxxxxxxxxxxxxxxxxx
            return 0;
    }
    

    執行 make

    $ make
    
    make -C t1
    make[1]: Entering directory '/home/break-through/working_space/wasai/make_test/t1'
    cc     t1.c   -o t1
    t1.c: In function ‘main’:
    t1.c:5:9: error: ‘asdfasd’ undeclared (first use in this function)
             asdfasd
             ^
    t1.c:5:9: note: each undeclared identifier is reported only once for each function it appears in
    t1.c:6:9: error: expected ‘;’ before ‘return’
             return 0;
             ^
    <builtin>: recipe for target 't1' failed
    make[1]: *** [t1] Error 1
    make[1]: Leaving directory '/home/break-through/working_space/wasai/make_test/t1'
    Makefile:7: recipe for target 'build-t1' failed
    make: *** [build-t1] Error 2
    

    看到了嗎?
    一旦有 error,立即停止,
    不會 build t2

  • 相关阅读:
    【JZOJ3743】【BZOJ5158】Alice and Bob
    【JZOJ3719】K-D-Sequence
    【JZOJ1913】【BZOJ2124】等差子序列
    【JZOJ1914】【BZOJ2125】最短路
    【luoguP4768】【NOI2018】归程
    【JZOJ6435】【luoguP5666】【CSP-S2019】树的重心
    【JZOJ6434】【luoguP5665】【CSP-S2019】划分
    【JZOJ6433】【luoguP5664】【CSP-S2019】Emiya 家今天的饭
    【JZOJ6431】【luoguP5658】【CSP-S2019】括号树
    【JZOJ3673】【luoguP4040】【BZOJ3874】宅男计划
  • 原文地址:https://www.cnblogs.com/youchihwang/p/10580012.html
Copyright © 2011-2022 走看看