+ All Categories

Make

Date post: 15-Jan-2015
Category:
Upload: pierre-lindenbaum
View: 434 times
Download: 1 times
Share this document with a friend
Description:
My short course about "Make"/"Makefile" and bioinformatics. January 2013
Popular Tags:
37
Make Pierre Lindenbaum http://plindenbaum.blogspot.com @yokofakun(http://twitter.com/yokofakun) INSERM-UMR1087 Nantes January 2013 https://github.com/lindenb/courses/tree/master/about.make
Transcript
Page 1: Make

MakePierre Lindenbaum

http://plindenbaum.blogspot.com@yokofakun(http://twitter.com/yokofakun)

INSERM-UMR1087 NantesJanuary 2013

https://github.com/lindenb/courses/tree/master/about.make

Page 2: Make

Problem

Page 3: Make

Build a C program

Page 4: Make

Make a protein

#!/bin/bashTRANSCRIPT=catTRANSLATE=catrm -f merge.proteinfor DNA in file1.dna file2.dna file3.dnado echo "ATGCTAGTAGATGC" > ${DNA} ${TRANSCRIPT} ${DNA} > ${DNA/%.dna/.rna} ${TRANSLATE} ${DNA/%.dna/.rna} > ${DNA/%.dna/.pep} cat ${DNA/%.dna/.pep} >> merge.proteindone

Page 5: Make

What if file1.pep already exists ?

Page 6: Make

Solution: Test if file exists

#!/bin/bashTRANSCRIPT=catTRANSLATE=catrm -f merge.proteinfor DNA in file1.dna file2.dna file3.dnado echo "ATGCTAGTAGATGC" > ${DNA} ${TRANSCRIPT} ${DNA} > ${DNA/%.dna/.rna} if [ ! -f ${DNA/%.dna/.pep} ] then ${TRANSLATE} ${DNA/%.dna/.rna} > ${DNA/%.dna/.pep} fi cat ${DNA/%.dna/.pep} >> merge.proteindone

Page 7: Make

What if file1.pep is outdated ?

Page 8: Make

Parallelization ?

Page 9: Make

GNU make

Page 10: Make

"a utility that automaticallybuilds executable programs and

libraries from source code byreading files called makefiles"

Page 11: Make

1977

Page 12: Make

TARGET1: DEPENDENCIES COMMAND-LINES1 COMMAND-LINES2 COMMAND-LINES3

Page 13: Make

Makefile

TRANSCRIPT=catTRANSLATE=cat

merged.protein: file1.pep file2.pep file3.pep cat file1.pep file2.pep \ file3.pep > merged.protein

file1.pep: file1.rna ${TRANSLATE} file1.rna > file1.pep

file1.rna : file1.dna ${TRANSCRIPT} file1.dna > file1.rna

file1.dna: echo "ATGCTAGTAGATGC" > file1.dna

file2.pep: file2.rna ${TRANSLATE} file2.rna > file2.pep

file2.rna : file2.dna ${TRANSCRIPT} file2.dna > file2.rna

file2.dna: echo "ATGCTAGTAGATGC" > file2.dna

file3.pep: file3.rna ${TRANSLATE} file3.rna > file3.pep

file3.rna : file3.dna ${TRANSCRIPT} file3.dna > file3.rna

file3.dna: echo "ATGCTAGTAGATGC" > file3.dna

Page 14: Make

Output

echo "ATGCTAGTAGATGC" > file1.dnacat file1.dna > file1.rnacat file1.rna > file1.pepecho "ATGCTAGTAGATGC" > file2.dnacat file2.dna > file2.rnacat file2.rna > file2.pepecho "ATGCTAGTAGATGC" > file3.dnacat file3.dna > file3.rnacat file3.rna > file3.pepcat file1.pep file2.pep \ file3.pep > merged.protein

Page 15: Make

If one file is removed

$ rm file2.rna$ make

cat file2.dna > file2.rnacat file2.rna > file2.pepcat file1.pep file2.pep \ file3.pep > merged.protein

Page 16: Make

If one file is changed

$ touch file1.dna file3.pep$ make

cat file1.dna > file1.rnacat file1.rna > file1.pepcat file1.pep file2.pep \ file3.pep > merged.protein

Page 17: Make

Special variables

Page 18: Make

"name of the target" : $@

TRANSCRIPT=catTRANSLATE=cat

merged.protein: file1.pep file2.pep file3.pep cat file1.pep file2.pep \ file3.pep > $@

file1.pep: file1.rna ${TRANSLATE} file1.rna > $@

file1.rna : file1.dna ${TRANSCRIPT} file1.dna > $@

file1.dna: echo "ATGCTAGTAGATGC" > $@

file2.pep: file2.rna ${TRANSLATE} file2.rna > $@

file2.rna : file2.dna ${TRANSCRIPT} file2.dna > $@

file2.dna: echo "ATGCTAGTAGATGC" > $@

file3.pep: file3.rna ${TRANSLATE} file3.rna > $@

file3.rna : file3.dna ${TRANSCRIPT} file3.dna > $@

file3.dna: echo "ATGCTAGTAGATGC" > $@

Page 19: Make

"name of the first dependency" : $<

TRANSCRIPT=catTRANSLATE=cat

merged.protein: file1.pep file2.pep file3.pep cat file1.pep file2.pep \ file3.pep > $@

file1.pep: file1.rna ${TRANSLATE} $< > $@

file1.rna : file1.dna ${TRANSCRIPT} $< > $@

file1.dna: echo "ATGCTAGTAGATGC" > $@

file2.pep: file2.rna ${TRANSLATE} $< > $@

file2.rna : file2.dna ${TRANSCRIPT} $< > $@

file2.dna: echo "ATGCTAGTAGATGC" > $@

file3.pep: file3.rna ${TRANSLATE} $< > $@

file3.rna : file3.dna ${TRANSCRIPT} $< > $@

file3.dna: echo "ATGCTAGTAGATGC" > $@

Page 20: Make

"all the dependencies" : $^

TRANSCRIPT=catTRANSLATE=cat

merged.protein: file1.pep file2.pep file3.pep cat $^ > $@

file1.pep: file1.rna ${TRANSLATE} $< > $@

file1.rna : file1.dna ${TRANSCRIPT} $< > $@

file1.dna: echo "ATGCTAGTAGATGC" > $@

file2.pep: file2.rna ${TRANSLATE} $< > $@

file2.rna : file2.dna ${TRANSCRIPT} $< > $@

file2.dna: echo "ATGCTAGTAGATGC" > $@

file3.pep: file3.rna ${TRANSLATE} $< > $@

file3.rna : file3.dna ${TRANSCRIPT} $< > $@

file3.dna: echo "ATGCTAGTAGATGC" > $@

Page 21: Make

Rules

Page 22: Make

How to create a *.pep or a *.rna ?

TRANSCRIPT=catTRANSLATE=cat

%.pep:%.rna ${TRANSLATE} $< > $@%.rna:%.dna ${TRANSCRIPT} $< > $@

merged.protein: file1.pep file2.pep file3.pep cat $^ > $@

file1.dna: echo "ATGCTAGTAGATGC" > [email protected]: echo "ATGCTAGTAGATGC" > [email protected]: echo "ATGCTAGTAGATGC" > $@

Page 23: Make

Output

echo "ATGCTAGTAGATGC" > file1.dnacat file1.dna > file1.rnacat file1.rna > file1.pepecho "ATGCTAGTAGATGC" > file2.dnacat file2.dna > file2.rnacat file2.rna > file2.pepecho "ATGCTAGTAGATGC" > file3.dnacat file3.dna > file3.rnacat file3.rna > file3.pepcat file1.pep file2.pep file3.pep > merged.protein

Page 24: Make

Useful options

Page 25: Make

-B "Unconditionally make all targets"

Page 26: Make

-f FILE "Read FILE as a makefile"

Page 27: Make

-j [N] "Allow N jobs at once"

Page 28: Make

-n "Don't actually run any commands; just print them"

Page 29: Make

.PHONY targets

.PHONY: all clean

all: file1.dna

file1.dna: echo "ATGCTAGTAGATGC" > $@clean: rm -f file1.dna

Page 30: Make

Function Call Syntax

$(function arg1,arg2,arg3...)

Page 31: Make

Loops: $(foreach var,list,...)

merged.protein: \ $(foreach INDEX,1 2 3,file${INDEX}.pep ) cat $^ > $@

Page 32: Make

$(eval )

TRANSCRIPT=catTRANSLATE=catINDEXES=1 2 3%.pep:%.rna ${TRANSLATE} $< > $@%.rna:%.dna ${TRANSCRIPT} $< > $@

merged.protein: $(foreach INDEX,${INDEXES},file${INDEX}.pep ) cat $^ > $@

$(foreach INDEX,${INDEXES},$(eval \file${INDEX}:\ echo "ATGCTAGTAGATGC" > $$@ \))

Page 33: Make

$(subst ee,EE,feet on the street) ‘fEEt on the strEEt’.

$(patsubst %.c,%.o,x.c.c bar.c) ‘x.c.o bar.o’.

$(strip a b c )‘a b c’

Page 34: Make

$(filter %.c,src1.c src2.c src3.c file.txt) $(filter-out %.c,src1.c src2.c src3.c file.txt) $(sort foo bar lose)

$(word 2, foo bar baz) 'bar' $(wordlist 2, 3, foo bar baz)‘bar baz’.

$(firstword foo bar)‘foo’.

$(lastword foo bar)‘bar’.

Page 35: Make

$(dir src/foo.c hacks)‘src/ ./’

$(notdir src/foo.c hacks)‘foo.c hacks’

$(suffix src/foo.c src-1.0/bar.c hacks)‘.c .c’

$(basename src/foo.c src-1.0/bar hacks)‘src/foo src-1.0/bar hacks’

$(addsuffix .c,foo bar)‘foo.c bar.c’.

$(addprefix src/,foo bar)‘src/foo src/bar’

Page 36: Make

(join a b,.c .o)‘a.c b.o’

$(shell cat file1.txt)

Page 37: Make

END


Recommended