2014
Mar
28

Makefile 在 Linux 環境下,通常是用來撰寫編譯 c 語言的指令,例如我們會使用 「make」的指令來編譯各種軟體。

Makefile 用途

我通常會用 Makefile 來寫一些自動化的指令,例如說壓縮 CSS/JS 檔案,我平常就直接使用 gmake compress 來將 JS 合併成一支檔案,並且自動透過 yuicompressor 壓縮。

compress js
  1. compress:
  2. if [ -f "all.js" ]; then rm all.js ; fi
  3. touch all.js
  4. cat xx1.js >> all.js
  5. cat xx2.js >> all.js
  6. cat all.js | java -jar /usr/local/lib/yuicompressor-2.4.6.jar --charset utf8 --type js -o all.js

另外一種用途是用來備份

backup
  1. Y=`date +%Y`
  2. M=`date +%m`
  3. D=`date +%d`
  4. H=`date +%H`
  5. date=$Y"-"$M"-"$D"-"$H
  6. backup:
  7. tar -zcf ~/$date-data1.tar.gz /xxx/xx1
  8. tar -zcf ~/$date-data2.tar.gz /xxx/xx2
  9. scp ~/*.gz 192.168.x.x:~/backup
  10. rm ~/*.gz

if 判斷式

判斷檔案是否存在

file is exist.
  1. ifneq ("$(wildcard /usr/local/xxx/xx.Makefile)","")
  2. FILE_EXISTS = 1
  3. include /usr/local/xxx/xx.Makefile
  4. else
  5. FILE_EXISTS = 0
  6. endif

變數預設值設定

如果設定預設值,例如我想要預設值 M_name = Marry ,但是當指令有帶參數時, M_name 又可以等於傳入的參數。

變數設定
  1. ifneq (, $(name))
  2. M_name=$(name)
  3. else
  4. M_name=Marry
  5. endif
  6. test:
  7. echo $(M_name)
  8. //gmake test name=John // output John
  9. //gmake test // output Marry

字串取代

replace
  1. input=abc
  2. str=$(shell echo $(input) | sed 's/c/_/')
  3. test:
  4. echo $(str)

for 迴圈

forloop
  1. test_for:
  2. length=$${#files[@]}; \
  3. for(( j=0; j<$$length; j++ )); \
  4. do \
  5. parse=`echo "$${files[$$j]}" | sed -e 's/.less/.css/g'` ; \
  6. sudo ls \
  7. done

string to array

array
  1. run:
  2. str="$(dir)"; \
  3. files=($${str// / }); \
  4. length=$${#files[@]}; \
  5. echo $$length; \

取得當前目錄

Example
  1. SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
  2. include $(SELF_DIR)Makefile.os

區分作業系統 os

Example
  1. UNAME_S := $(shell uname -s)
  2. ifeq ($(UNAME_S),Linux)
  3. os=Linux
  4. endif
  5. ifeq ($(UNAME_S),Mac)
  6. os=Mac
  7. endif

回應 (Leave a comment)