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