2017-07-03 58 views
0

我試圖將所有.txt與腳本轉換爲不同的格式。
我被允許使用shell命令僅僅用於目標,但我不允許使用循環...
順便說一句我必須使用破折號解釋器。
該腳本被稱爲txtConverter。它從stdin中讀取txt,並將轉換後的文本(可能是markdown或其他格式)放到stdout中。所以我必須讀取當前目錄中的所有.txt文件,並通過使用腳本將每個文件轉換爲具有不同文件名的顯式格式。
例如,如果有在當前目錄中僅有1個.txt文件,應該有2個文件使用Makefile後:Makefile將當前目錄中的文件轉換爲

1. Directory: Hallo.txt 
2. using make 
3. Directory: Hallo.txt 
       Hallo.sh 

,我發現這樣的事情:

OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt)) 

這看起來爲.txt文件並將其轉換爲.sh文件吧?

convertToSh : $(OBJ) 
    What kind of Code? 

但我需要一個規則來正確轉換?

%.txt : %.sh 

的問題是我不知道如何使用shell代碼來填補像sh文件:

cat $< | ./txtConverter > [email protected] 

如果我使用$()執行shell代碼它好好嘗試工作,以及像:

@echo $(ls -1) 

我是新來的Makefiles和我在看紀錄片,但我真的不明白它是如何工作的。 我不確定它是如何將所有這些放在一個Makefile中。 Thx求助!

發現的解決方案:

THX到@MadScientist和THX到A Makefile to Convert All Markdown Files to PDFs Using Pandoc

.RECIPEPREFIX = ~ 
OBJS=$(patsubst %.txt, %.sh, $(wildcard *.txt)) 
convertToSh : $(OBJS) 
%.sh : %.txt 
~ ./convertTxtToSh > [email protected] < $< 

工作正常!在@MadScientist的GNU手冊中發現.RECIPEPREFIX = ~

+0

注意GNU make 4.0中增加了'.RECIPEPREFIX',所以一些發行版可能會有不支持它的舊版本的GNU make。如果您對答案滿意,不要忘記將其標記爲已接受(單擊對號),以便人們看到問題已得到解答。 – MadScientist

回答

1

要了解有關make(IMO)的最佳位置是GNU Make Manual。當然,製作有不同的版本,本手冊討論GNU版本,但這可能是最常用的版本。

規則的配方是用shell腳本語法編寫的,所以你可以直接把shell代碼作爲配方。

然而,圖案規則定義是目標前提。所以你的情況,你想從一個.txt(在前提)你想寫創建.sh(該目標):

%.sh : %.txt 
     cat $< | ./txtConverter > [email protected] 

或者避免你可以寫的UUOC:

%.sh : %.txt 
     ./txtConverter > [email protected] < $< 

請記住,您必須在配方行之前使用實際的製表符。確保你的編輯器不會用空格或其他東西代替它。

但是,這只是一個告訴make的模板,「如果你想創建foo.sh,並且你有(或者可以想出如何構建)foo.txt,那麼你可以使用這個配方來做到這一點」。

所以接下來你需要告訴make你想創建哪個.sh文件。你已經知道如下:

OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt)) 

然後,你需要告訴make來建立這些。你可以做到這一點:

convertToSh : $(OBJ) 

但這一規則並不需要一個偏方:沒有什麼,因爲所有的工作都在模式規則做,在這裏做。這只是將所有先決條件集中到一個地方的一種簡單方法。

+0

Thx很多。如果我想從bash調用它,如何使用配方? convertToSh很容易在bash中用「make convertToSh」調用。但是,如果我這樣做,bash會拋出一個錯誤(必須將錯誤轉換爲英文)「沒有規則來構建目標」example.sh「,從convertToSh需要」。 – homior

+0

要運行,只需鍵入'make'。它會默認構建makefile中的第一個顯式目標(這裏是'convertToSh')。或者如果你願意的話,你可以顯式運行'make convertToSh'。 (如果您運行'LANG = C make',則爲FYI信息,然後以英文打印。) – MadScientist

相關問題