Zi 字媒體
2017-07-25T20:27:27+00:00
在操作UNIX系統時,常常會用到make指令來自動build服務,make會去執行該目錄裡的Makefile,按照裡面的設定完成許多事情
例如FreeBSD利用port-tree安裝軟體時就是用make
不過Linux和FreeBSD的Makefile又有些不同
FreeBSD的make版本是Berkeley make
Linux則是GNU make
所以在寫Makefile時需要注意一下OS
FreeBSD版本Makefile
1.Makefile Layout
在command line中,輸入make指令預設是執行該目錄的Makefile,但也可以透過 -f 參數指向其他檔案
make -f
2.Target 語法
在使用make時,通常都會加上例如install、config、clean等的target語法
all:
@echo 123;
deploy:
@echo 456;
help: all
當直接下make時,會執行all以下的語法,輸出123
若是make deploy則會輸出456
因為echo那段是Shell語法,如果要把那段語法當成Shell執行,都需要在前面加上Tab縮排,不然會錯誤
另外輸入make help時,會執行all區塊的語法
3.特別字元
@:不要顯示執行的指令。
-:表示即使該行指令出錯,也不會中斷執行。
all:
-rm test;echo 123;
4.變數
在慣例上,Makefile內部使用的變數名稱使用小寫;而使用者從命令列自行指定數值的變數,則是使用大寫
在Makefile中,可利用 (name) 或 {name} 來存取已定義的變數
#command Line:make KERNEL=FreeBSD
kernel = Linux
all:
@echo {KERNEL} @echo {kernel}
5.=語法
?=:若變數未定義,則替它指定新的值。否則,採用原有的值
x = 123
x ?= foo
all:
@echo $(x)
#輸出 123
+=:字串串接(會自動以空白隔開)
!=:將shell語法結果傳回變數裡
#顯示OS資訊
x != uname -a;
all:
@echo $(x)
6.條件判斷式(.if,.elif,.else)及相關函式
x = 123
all:
.if (x) > 123 echo "big" .elif (x) == 123
echo "equal"
.else
echo "small"
.endif
注意:條件判斷式為Makefile裡的語法,並不是shell語法,所以不需要用Tab鍵縮排
empty:判斷Makefile變數是否為空值
#empty裡面傳入變數名稱VAR而不是$(VAR)
all:
.if empty(x)
echo "yes"
.endif
defined:判斷Makefile變數是否被定義
#defined裡面傳入變數名稱VAR而不是$(VAR)
all:
.if defined(x)
echo "yes"
.endif
也可以寫成
#.ifdef 等同 .if defined()
#.ifndef 等同 .if !defined()
#.elifdef 等同 .elif defined()
#.elifndef 等同 .elif !defined()
all:
.ifdef x
echo "yes"
.else
echo "no"
.endif
exists:判斷是否有該檔案或目錄
path = /home/johnson4932/code/test
all:
.if exists($(path))
echo "yes"
.else
echo "no"
.endif
7.include
Otherfile:
all:
@echo 123;
Makefile
.include "Otherfile"
Categories: FreeBSDUnix
分類
Android
AngularJS
Chrome
Database
MySQL
DataStructure
Editor
Vim
Firefox
Git
Hadoop
Language
Go
Java
JavaScript
jQuery
jQueryChart
Node.js
Vue
PHP
Laravel
ZendFramework
Python
Mac
Network
Cisco
DLink
Juniper
Oauth
Server
Apache
Share
Unix
FreeBSD
Linux
WebDesign
Bootstrap
CSS
HTML
Wordpress
Search
搜尋:
寫了
5860316篇文章,獲得
23313次喜歡