16
Linux -makefile by Kevin Wu 2014/11/21 1 0

makefile20141121

Embed Size (px)

Citation preview

Page 1: makefile20141121

Linux -makefile

by Kevin Wu 2014/11/21

1

0

Page 2: makefile20141121

Agenda

2

用途

基本語法

Athena應用

練習

Page 3: makefile20141121

Makefile

3

自動化編譯

寫自動化的指令 (安裝、壓縮...)

適用不同的編譯器make工具

Delphi的make,Visual C++的nmake,Linux下GNU的make

Page 4: makefile20141121

Makefile

4

Machine-readable

Workflow

any dependent files are regenerated with minimal effort.

Testable

Syntax:

targetfile: sourcefile

command

Page 5: makefile20141121

Example - makefile

5

# comments

#一些變數宣告

target1: dependencies of target1

<TAB>command;

target2: dependencies of target2

<TAB>command;

...

...

clean:

<TAB>rm -rf *.o

Page 6: makefile20141121

Example - make

6

make

make [-f makefile|Makefile]

make clean

make foo=bar target

make ARGS="asdf" run

recall how we install tmux :

wget http://downloads.sourceforge.net/tmux/tmux-1.9a.tar.gz

tar -xvzf tmux-1.9a.tar.gz

cd tmux-1.9a

./configure

make

make install

Page 7: makefile20141121

Scenario

7

Download a zip archive from the Census Bureau.

Extract the shapefile from the archive.

Convert the shapefile to TopoJSON.

Page 8: makefile20141121

Scenario

8

counties.zip:

curl -o counties.zip ‘http:url/file.zip‘

counties.shp: counties.zip

unzip counties.zip

touch counties.shp

counties.json: counties.shp

topojson -o counties.json -- counties=counties.shp

Page 9: makefile20141121

makefile vs shell

9

變數與變數內容以『=』隔開,同時兩邊可以具有空格;

為了Makefile的可移植性,建議使用具有空格的表示方法

變數左邊不可以有 <tab>

變數與變數內容在『=』兩邊不能具有『:』;

運用變數時,以 ${變數} 或 $(變數) 使用;

parentheses seems better than curly brackets

在指令列模式也可以給予變數。

變數值決定

1st make 指令列後面加上的環境變數為優先;

2nd makefile 裡面指定的環境變數;

3rd shell 原本具有的環境變數。

makefile only:

$?:代表需要重建(被修改)的相依性項目。

$@:目前的目標項目名稱。

$<:代表目前的相依性項目。

$* :代表目前的相依性項目,不過不含副檔名。

- :make 會忽略命令的錯誤

@ :make 不會在標準輸出上,顯示要執行的命令。

Page 10: makefile20141121

Athena應用

10

系統安裝

Install Python2.7.8

Build Symbolic Link

Yum Setting

Install pip

Install the third-party lib for Python2.7.8

Install the necessary library for tmux

Install the tmux

Copy the SSH key from remote athena and pandora

Create migo folder under /data

Luigi Job檢核

執行前檢查

檢查requires檔案是否存在

刪除中繼檔案

刪除output檔案

執行後檢查

中繼檔案是否存在

output檔案是否存在

刪除中繼檔案

Page 11: makefile20141121

Case (See Problem?)

11

test: gen-a gen-p

@echo "$@ done“

rm *.o

rm *.pip

gen-a:

rm [email protected]

touch [email protected]

gen-p: a.pip b.pip

@echo "$@ done"

%.pip: gen-a.o

touch $@

echo "$@ done“

[hint] : rm -> -rm, rm -> rm –f, gen-a -> install

Page 12: makefile20141121

Solved

12

rm *.o

• -rm *.o

• -rm –f *.o

• don’t let it parallel go

Page 13: makefile20141121

*Example - Advanced

13

#usage: make main OR make

SHELL = /usr/bin/bash #宣告command所使用的shell環境為bash

CC = gcc #欲使用的C compiler

CFLAGS = -O3 -ansi #欲使用的參數

INC = -I /usr/foo/include

LIB = -L /usr/foo/lib

.SUFFIXS: .c .cpp .f77 .f #加入所列副檔名到隱含規則裡

main: main.o foo1.o foo2.o

${CC} main.o foo1.o ${CFLAGS} ${INC} ${LIB} -o $@

%.o: %.c target.h

${CC} $< ${CFLAGS} ${INC} ${LIB} -lpthread -c

.PHONY: clean

clean:

@rm -rf *.o

Page 14: makefile20141121

Practice

14

建立一個makefile, 至少包含

build : 可touch 出a.out b.out c.out, 若檔案都存在則echo出”build done”

clean : 刪除所有.out檔

rebuild : 會clean再build, 若檔案都存在則echo出”rebuild done”

相依性條件:

a.out為主要任務(檔案),需要 b.out存在才能產出

b.out 需要 c.out存在才能產出

c.out不須任何相依檔案,

測試結果是否正常

make rebuild

rm any .out file (you choose)

make build, 自動讓缺少的檔案產生出來

提示

將a/b/c分開寫各自的dependency與command

使用$@變數

Page 15: makefile20141121

Answer

15

clean:

-rm -f *.out

a.out: | b.out

touch a.out

b.out: | c.out

touch b.out

c.out:

touch c.out

build: a.out

@echo $@ done

rebuild: clean build

@echo $@ done

Page 16: makefile20141121

Thank you

16