2016-03-08 63 views
0

我知道,如果我把這個在我Makefile強制命令並行運行,即使沒有-j?

a: b c 

然後運行make -j2 a然後它會並行運行bc,但如果我總是bc什麼並行運行,即使用戶不包括-j> = 2?

在我的場景中,bc實際上是從未完成的守護進程,所以我需要它們並行運行。我不希望他們在後臺運行。

+0

如果您不能運行'B'或'自己C',那麼他們不應該在單獨的規則。 –

+0

@ColonelThirtyTwo呃..誰說你不能自己跑他們?您可以獨立運行它們,但我希望另一個命令/目標可以同時運行它們。 – mpen

+0

因此,目標'b'和'c'實際上沒有*構建*?它們只是 '.PHONY' -ies用於運行命令? –

回答

0

這是一個奇怪的使用make,但如果你想用make做到這一點, 因爲bc.PHONY,你可以這樣做,如:

.PHONY: a b c 

a: 
    $(MAKE) -j2 b c 

b c: 
    while [ "1" ]; do echo "[email protected]: $$(date)"; sleep 1; done 

規則:

a: b c 

不符合目的。它說,a取決於b(正在完成)和 a取決於c(正在完成),但你根本不需要。你 只是想a表示 bc的配方併發執行。

你得到:

$ make b 
while [ "1" ]; do echo "b: $(date)"; sleep 1; done 
b: Wed Mar 9 18:29:55 GMT 2016 
b: Wed Mar 9 18:29:56 GMT 2016 
b: Wed Mar 9 18:29:57 GMT 2016 
b: Wed Mar 9 18:29:58 GMT 2016 
b: Wed Mar 9 18:29:59 GMT 2016 
^CMakefile:7: recipe for target 'b' failed 
make: *** [b] Interrupt 

$ make c 
while [ "1" ]; do echo "c: $(date)"; sleep 1; done 
c: Wed Mar 9 18:30:38 GMT 2016 
c: Wed Mar 9 18:30:39 GMT 2016 
c: Wed Mar 9 18:30:40 GMT 2016 
c: Wed Mar 9 18:30:41 GMT 2016 
c: Wed Mar 9 18:30:42 GMT 2016 
^CMakefile:7: recipe for target 'c' failed 
make: *** [c] Interrupt 

$ make a 
make -j2 b c 
make[1]: Entering directory '/home/imk/develop/so/parallel_make' 
while [ "1" ]; do echo "b: $(date)"; sleep 1; done 
while [ "1" ]; do echo "c: $(date)"; sleep 1; done 
b: Wed Mar 9 18:31:13 GMT 2016 
c: Wed Mar 9 18:31:13 GMT 2016 
b: Wed Mar 9 18:31:14 GMT 2016 
c: Wed Mar 9 18:31:14 GMT 2016 
b: Wed Mar 9 18:31:15 GMT 2016 
c: Wed Mar 9 18:31:15 GMT 2016 
b: Wed Mar 9 18:31:16 GMT 2016 
c: Wed Mar 9 18:31:16 GMT 2016 
b: Wed Mar 9 18:31:17 GMT 2016 
c: Wed Mar 9 18:31:17 GMT 2016 
^CMakefile:7: recipe for target 'b' failed 
make[1]: *** [b] Interrupt 
Makefile:7: recipe for target 'c' failed 
make[1]: *** [c] Interrupt 
Makefile:4: recipe for target 'a' failed 
make: *** [a] Interrupt