2016-02-12 58 views
0

注意,我是新來「的Makefile」試圖爲lex程序創建的makefile

我有程序叫「ba.lex」我需要創建make文件吧。

沒有makefile文件,我先打電話:

flex ba.lex 

然後,我創建可執行:

gcc -o ba lex.yy.c -lfl 

我還需要清潔中間文件:的lex.yy.c

我怎麼可能把這些放在一個makefile。

更新: 我嘗試這樣做:

flex ba.lex 
gcc -o ba lex.yy.c -lfl 

,但我發現:makefile:1: *** commands commence before first target. Stop.

+0

比如lex產生'你可以使用它作爲生成文件的目標lex.yy.c' 。如果你需要不同的詞法分析器,這將不起作用。 – fsasm

+0

謝謝! ...我不是如何製作makefile文件的。你能舉一個makefile的例子嗎? – user836026

+1

[從生成文件調用撓曲]的可能的複製(http://stackoverflow.com/questions/9770170/calling-flex-from-a-makefile) – fsasm

回答

3

Makefile你不只是寫命令,那就是shell腳本對於。一個Makefile主要有3個實體:

  • 目標
  • 依賴
  • 命令運行

一個非常簡單的Makefile例如可以是這樣:

build: a.out 

a.out: a.c 
<TAB> gcc -Wall a.c 

這裏,build是一個目標取決於a.out(哪個是一個文件,但我們也創建了一個具有該名稱的目標)。目標a.out取決於a.c文件。什麼,當你運行make發生的情況是:

if (! file_exists(a.out) || last_change(a.out) < last_change(a.c)) then 
    execute gcc command 

在你的情況,可能Makefile可以是:

build: ba 

ba: lex.yy.c 
<TAB> gcc -o ba lex.yy.c -lfl 

lex.yy.c: ba.lex 
<TAB> flex ba.lex 

clean: 
<TAB> rm lex.yy.c ba *.o 
+2

大部分正確。一般來說,你可能會避免明確依賴中間文件,所以你會有一個單獨的規則'ba:ba。lex'作爲它後面的動作(可能是'rm -f lex.yy.c'作爲額外的動作)的兩個命令('flex'和'gcc')。另外,您應該對所有命令和大多數命令選項使用宏:'$(LEX)$(LFLAGS)ba.lex'和'$(CC)$(CFLAGS)-o $ @ lex.yy.c $(LDFLAGS)例如$(LDLIBS)'。你可以使用'$ <'作爲'ba.lex';雖然沒有'lex.yy.c'的標準宏。 –

+0

哦,你也可能想使用像'$ <'或'$ @'這樣的變量並將'clean'目標聲明爲'.PHONY'。我同意,但我認爲這很可能會混淆OP。 – fanton

+1

使用象形文字宏('$ <'和'$ @')會有混淆的可能性。我可能會提交兩個makefile - 一個使用硬編碼命令,另一個使用宏。爲'rm'命令使用宏的一個優點是,當你想保留'lex.yy.c'文件時,你可以避免爲你清理makefile。我仍然可能只會提出直接的規則。另外,Make天生知道如何將Lex(Flex)文件轉換爲目標文件或可執行文件。 (在Mac OS X上試試:'mkdir junk; cd junk;> makefile;> junk.l; make -n junk; make -n junk.o' - WFM) –