2014年12月9日 星期二

簡單的 Makefile 說明

 GCC 下 makefile 的用法為在 command line 下執行

make -f <file> <rule>

如果不設定指定檔案, 默認執行 Makefile 這個檔案, 與 all 這個 rule.
* 在 windows MinGW 下記得將  MinGW 路徑加入環境變數, 不然會不認識 make
* 在 linux MinGW 使用 cross compiler 則用 mingw32-make -f <file> <rule>

Visual studio 下 必須先開啟 Visual studio Tools 底下的命令列模式( EX: Visual studio 2005 命令提示字元), 然後執行

NMAKE /f <file> <rule>

makefile 其他常見的 rule
make clean     清除編譯過程中所產生的文件
make distclean 清除編譯過程中所產生的文件,還有 configure 所產生的 Makefile
make install   安裝至系統
make dist      將原始碼壓縮成 *.tar.gz
make distcheck 將原始碼壓縮成 *.tar.gz 檔,並測試。 

簡易 Makefile 語法解釋如下
---------------------------------------------------------------------------------------------------------------------

# 以 # 開頭的即為註解。
 !include <ntwin32.mak>

 # 變數宣告不分大小寫
Target=Gilgamesh.exe
# 慣例上, 給外部使用的變數名稱使用大寫
OBJECTS = Gilgamesh.obj Gilgamesh.rbj
 # 利用 $(cflags)${cflags} 來存取已定義的變數
cflags = $(cflags) /openmp
# 慣例上,內部使用的變數名稱使用小寫
extdflags = -DVisualStudio -DNDEBUG -DWINDOWS
# Makefile會在展開後,再決定變數的值。
# := 表示變數的值決定於它在 Makefile 中的位置, 而不是展開後
dflags :=  $(extdflags) $(dflags)
# 取消該變數
LIB_DIR=
# ?= 若變數未定義,則替它指定新的值。否則,採用原有的值。
FOO ?= wtf
# 與C語法相同, 自身再加上數值
cflags += -O2
# rule 功用為指示如何進行編譯
all: $(Target)
# <target>:<dependencies>
# target要建立的檔案
# dependencies:相依項目。決定是否要重新編譯。
Gilgamesh.obj: Gilgamesh.c
# 建立檔案的指令, 前面必須是 Tab, 不能為空白, 所有 Tab 開頭會被視為 shell script / batch 指令
    $(cc) $(cflags) $(cvars) $(dflags) $(hflags) Gilgamesh.c

Gilgamesh.res: Gilgamesh.rc
    $(rc) -DWIN32 -DNDEBUG $(hflags) -r Gilgamesh.rc

Gilgamesh.rbj: Gilgamesh.res
    cvtres $(cvflags) -machine:ix86 -o Gilgamesh.rbj Gilgamesh.res

$(Target): $(OBJECTS)
    $(link) /libpath:$(LIB_DIR) /out:$(Target) $(OBJECTS)

clean:
# @:不要顯示執行的指令。
# \換行用
    @for %%x in (obj exp pdb ilk res rbj) do \
    if exist *.%%x del *.%%x
# -:指令出錯也不中斷執行。
    -for %%x in (exe dll lib) do if exist Gilgamesh.%%x del Gilgamesh.%%x

---------------------------------------------------------------------------------------------------------------------

因為我很懶, 通常我會將命令先寫成 *.bat 或 *.sh

Windows MinGW32 範例 gcc.bat
 ---------------------------------------------------------------------------------------------------------------------
@ECHO off

SET GCCBIN=c:\MinGW\bin
SET GCCMAKE=C:\MinGW\msys\1.0\bin
SET path=%GCCBIN%;%GCCMAKE%;%path%

IF EXIST %GCCBIN%\gcc.exe (
GOTO HELL
)

ECHO can not find MinGW
PAUSE

GOTO :EOF

:HELL
make -f WindowsGCC.mak clean

make -f WindowsGCC.mak ALL
---------------------------------------------------------------------------------------------------------------------

Windows visual studio 範例 vc2005.bat
---------------------------------------------------------------------------------------------------------------------
@echo off

IF EXIST "%VS80COMNTOOLS%vsvars32.bat" (
call "%VS80COMNTOOLS%vsvars32.bat"
GOTO HELL
)


ECHO can not find visual studio
PAUSE

GOTO :EOF

:HELL
NMAKE /f "WindowsVC.mak" clean

NMAKE /f "WindowsVC.mak" ALL
---------------------------------------------------------------------------------------------------------------------

Linux gcc 範例 gcc.sh
---------------------------------------------------------------------------------------------------------------------
make -f ./Makefile clean
make -f ./Makefile all
--------------------------------------------------------------------------------------------------------------------- 

沒有留言:

張貼留言