在make
中,是否可以爲每個目標定義預處理和後處理?GNU make - 如何爲每個目標運行預處理和後處理
我想(隱式地)在顯式配方的第一行上方插入預配方,然後(隱式地)在顯式配方中的最後一行之後插入後配方。
使用正則表達式來插入行會很容易,但隱式的會更清晰。
在make
中,是否可以爲每個目標定義預處理和後處理?GNU make - 如何爲每個目標運行預處理和後處理
我想(隱式地)在顯式配方的第一行上方插入預配方,然後(隱式地)在顯式配方中的最後一行之後插入後配方。
使用正則表達式來插入行會很容易,但隱式的會更清晰。
您可以創建一個特殊幫助程序外殼,在其輸入腳本之前和之後執行所需的預處理和後處理,並告訴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
你可以有你調用使用$(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
是的,它的工作原理,但問題要求「隱式規則」,這意味着我定義了前後規則,也許還有一些其他的標誌在make和make中在執行食譜時插入前後規則。正如我所說的,我知道我可以使用正則表達式有效地將'pre'和'post'的執行插入到現有的makefile目標中。如果這個選項不存在,那很好。把它寫成答案,我將其標記爲正確。 – Adrian
加一個給我想法在現有的makefile中調用特定的目標。如果沒有內置選項,我最終只需要在開始時調用'pre',就像您調用'post'一樣# – Adrian
@Adrian我相當確定這是將規則作爲必備條件的唯一方法另一個是後備條件。 – CoffeeandCode
你想要所有的目標相同的前配方?所有目標都採用相同的後期配方? – Beta
@貝塔是的。否則,如果每個目標的前後都是唯一的,那麼你最好先把它粘貼到配方中。 – Adrian
我的想法,我只是想確定這就是你的意思。我知道沒有辦法做你想做的事情,因爲makefile文件本身沒有編輯。 – Beta