2014-12-06 80 views
0

我想編譯使用make的OpenCobol程序。我總是得到「make:test1.cob沒有任何事情要做」。這是我的makefile。我已經在cobc之前放了一張TAB。但我仍然得到這個信息。請幫忙。 謝謝。OpenCobol Makefile

COBCWARN = -W 
%: %.cob 
    cobc $(COBCWARN) -free -x $^ -o [email protected] 

這是我的cobol程序。

IDENTIFICATION DIVISION. 
PROGRAM-ID. TEST1. 
PROCEDURE DIVISION. 
    DISPLAY 'Hello world!'. 
    STOP RUN. 
+0

你運行什麼命令來調用make?上面的makefile不完整:它本身不會執行任何操作。 – MadScientist 2014-12-06 14:12:44

+0

@MadScientist:我正在使用Vim。我正在使用':make%'來編譯。我應該將哪些內容放入makefile才能使其工作? – Joydeep 2014-12-06 15:30:30

回答

1

您的makefile不包含實際目標。您只定義了一個模式規則,告訴如何構建匹配模式的目標。但是make並不會在文件系統上尋找可以匹配模式的目標,它只會針對特定請求的目標檢查模式。

您的makefile中沒有列出任何特定目標(文件),因此唯一可以瞭解目標的方法是如果您在目標線上構建目標。

您正在使用%特殊令牌從vim內運行此命令,該令牌展開爲當前正在編輯的文件的名稱。這意味着您正在運行命令:

make test1.cob 

因爲您正在編輯文件test1.cob。所以,你告訴make「請嘗試創建目標(文件)test1.cob」。但是,該文件已經存在(這是您正在編寫的文件)。所以說,「無事可做」。

如果你運行make,並要求它來創建你真的想要創建的目標,它會工作:

​​

現在文件test1不存在,並可以找到一個知道如何圖案規則建立它,所以使得將運行該規則。

或者,你可以編輯你的Makefile添加的特定目標,如:

COBCWARN = -W 

test1: test1.cob 

%: %.cob 
     cobc $(COBCWARN) -free -x $^ -o [email protected] 

然後你就可以運行在所有make不帶參數。沒有任何命令行參數,make會在makefile中查找顯式目標,並將test1作爲第一個。它看到有一個與該目標相匹配的規則(模式規則),所以它會構建該目標。

UPDATE

如果你想允許一個簡單的命令make建立多個程序,寫你的makefile是這樣的:

COBCWARN = -W 

all: test1 test2 test3 
.PHONY: all 

%: %.cob 
     cobc $(COBCWARN) -free -x $^ -o [email protected] 

現在從VIM,你就可以說:!make,就是這樣。

如果您運行make沒有參數,那麼它會在makefile中找到第一個顯式目標並構建它。在這個例子中,第一個目標是all,它的先決條件是可能的程序。構建每一個make都會看到它可以應用模式規則,所以它會這樣做(如果.cob文件自上次構建該程序以來已被修改)。

+0

在這種情況下,我如何將文件名傳遞給makefile?現在,我所做的工作 - 「:make%:r」在Vim中編譯。 – Joydeep 2014-12-07 08:25:08

+0

這是一個針對vim用戶的問題,它與make無關。我不使用vim(我使用Emacs),但是從我讀的文檔中,我認爲你需要':!使%<'通過使文件名不帶擴展名。 – MadScientist 2014-12-07 15:14:50

+0

@Joydeep規則'%:%.cob'告訴make它可以創建一個可執行文件(更具體地說,是一個沒有擴展名的名字),如果它與.cob擴展名相匹配的話。 'make myprogram'會嘗試make myprogram,如果它找到一個'myprogram.cob',它將使用'cobc -free -x ...'使用'myprogram.cob'作爲輸入並生成'myprogram'。使用任何你喜歡的名字,並通過名稱。 – 2014-12-07 21:09:49