2016-06-21 55 views
2

make中,是否可以爲每個目標定義預處理和後處理?GNU make - 如何爲每個目標運行預處理和後處理

我想(隱式地)在顯式配方的第一行上方插入預配方,然後(隱式地)在顯式配方中的最後一行之後插入後配方。

使用正則表達式來插入行會很容易,但隱式的會更清晰。

+0

你想要所有的目標相同的前配方?所有目標都採用相同的後期配方? – Beta

+0

@貝塔是的。否則,如果每個目標的前後都是唯一的,那麼你最好先把它粘貼到配方中。 – Adrian

+0

我的想法,我只是想確定這就是你的意思。我知道沒有辦法做你想做的事情,因爲makefile文件本身沒有編輯。 – Beta

回答

2

您可以創建一個特殊幫助程序外殼,在其輸入腳本之前和之後執行所需的預處理和後處理,並告訴make使用該外殼來執行配方(爲此使用SHELL變量)。

此外,如果您正在使用多線食譜,則必須啓用.ONESHELL模式。

買者:在此模式下失敗的命令(除了最後一個)並沒有失敗 的規則,讓你無論是有&&加入命令,或追加 || exit 1到每年年底命令,或使用-e 選項運行真實shell。

實施例:

預後殼

#!/bin/bash 

preaction() 
{ 
    echo "Pre-action" 
} 

postaction() 
{ 
    echo "Post-action" 
} 

preaction && /bin/bash "[email protected]" && postaction 

生成文件

SHELL=./pre-post-shell 

all: Hello Bye 

.ONESHELL: 

Hello: 
    @echo Hello 
    echo Hello again 

Bye: 
    @echo Bye 

輸出:

$ make 
Pre-action 
Hello 
Hello again 
Post-action 
Pre-action 
Bye 
Post-action 
+0

所以幫手外殼只是一個bash腳本是嗎? – Adrian

+0

@Adrian是的,是的,是的(不允許使用簡短的評論) – Leon

+0

使用同樣的策略,是否可以在配方中的每個LINE之前和/或之後執行靜態配方? – Adrian

1

你可以有你調用使用$(MAKE)命令對同一文件進行調用一個目標:

THIS_FILE:=$(lastword $(MAKEFILE_LIST)) 

SOURCES:=main.cpp other.cpp 
OBJECTS:=$(SOURCES:.cpp=.o) 

OUT:=main 

.PHONY: all pre post 

all: $(OUT) 

$(OUT): $(OBJECTS) 
    $(CXX) $(LDFLAGS) -o $(OUT) $(OBJECTS) $(LIBS) 

pre: 
    @echo "PRE TARGET" 

post: 
    @echo "POST TARGET" 

%.o: pre %.cpp 
    $(CXX) $(CXXFLAGS) -c $(lastword $^) -o [email protected] 
    @$(MAKE) -f $(THIS_FILE) post 

這個例子的Makefile將輸出類似:

PRE TARGET 
g++ -std=c++11 -O2 -g -c main.cpp -o main.o 
POST TARGET 
PRE TARGET 
g++ -std=c++11 -O2 -g -c other.cpp -o other.o 
POST TARGET 
g++ -o main main.o other.o 
+0

是的,它的工作原理,但問題要求「隱式規則」,這意味着我定義了前後規則,也許還有一些其他的標誌在make和make中在執行食譜時插入前後規則。正如我所說的,我知道我可以使用正則表達式有效地將'pre'和'post'的執行插入到現有的makefile目標中。如果這個選項不存在,那很好。把它寫成答案,我將其標記爲正確。 – Adrian

+0

加一個給我想法在現有的makefile中調用特定的目標。如果沒有內置選項,我最終只需要在開始時調用'pre',就像您調用'post'一樣# – Adrian

+0

@Adrian我相當確定這是將規則作爲必備條件的唯一方法另一個是後備條件。 – CoffeeandCode