2014
Mar
28
Makefile 在 Linux 環境下,通常是用來撰寫編譯 c 語言的指令,例如我們會使用 「make」的指令來編譯各種軟體。
Makefile 用途
我通常會用 Makefile 來寫一些自動化的指令,例如說壓縮 CSS/JS 檔案,我平常就直接使用 gmake compress 來將 JS 合併成一支檔案,並且自動透過 yuicompressor 壓縮。
compress js
- compress:
- if [ -f "all.js" ]; then rm all.js ; fi
- touch all.js
- cat xx1.js >> all.js
- cat xx2.js >> all.js
- cat all.js | java -jar /usr/local/lib/yuicompressor-2.4.6.jar --charset utf8 --type js -o all.js
另外一種用途是用來備份
backup
- Y=`date +%Y`
- M=`date +%m`
- D=`date +%d`
- H=`date +%H`
- date=$Y"-"$M"-"$D"-"$H
- backup:
- tar -zcf ~/$date-data1.tar.gz /xxx/xx1
- tar -zcf ~/$date-data2.tar.gz /xxx/xx2
- scp ~/*.gz 192.168.x.x:~/backup
- rm ~/*.gz
if 判斷式
判斷檔案是否存在
file is exist.
- ifneq ("$(wildcard /usr/local/xxx/xx.Makefile)","")
- FILE_EXISTS = 1
- include /usr/local/xxx/xx.Makefile
- else
- FILE_EXISTS = 0
- endif
變數預設值設定
如果設定預設值,例如我想要預設值 M_name = Marry ,但是當指令有帶參數時, M_name 又可以等於傳入的參數。
變數設定
- ifneq (, $(name))
- M_name=$(name)
- else
- M_name=Marry
- endif
- test:
- echo $(M_name)
- //gmake test name=John // output John
- //gmake test // output Marry
字串取代
replace
- input=abc
- str=$(shell echo $(input) | sed 's/c/_/')
- test:
- echo $(str)
for 迴圈
forloop
- test_for:
- length=$${#files[@]}; \
- for(( j=0; j<$$length; j++ )); \
- do \
- parse=`echo "$${files[$$j]}" | sed -e 's/.less/.css/g'` ; \
- sudo ls \
- done
string to array
array
- run:
- str="$(dir)"; \
- files=($${str// / }); \
- length=$${#files[@]}; \
- echo $$length; \
取得當前目錄
Example
- SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
- include $(SELF_DIR)Makefile.os
區分作業系統 os
Example
- UNAME_S := $(shell uname -s)
- ifeq ($(UNAME_S),Linux)
- os=Linux
- endif
- ifeq ($(UNAME_S),Mac)
- os=Mac
- endif