Tips for Makefile usages

  • 列出目录内所有文件
shell := /bin/bash
name=$(shell ls)
  • 使用多变量定义为命令名字
$(name):
@echo $@
  • 命令名字中不能出现函数

正确的:

nameN=$(addsuffix .N, $(name))

$(nameN):
@echo $@

错误的:

$(addsuffix .N, $(name)):
@echo $@
  • make在ubuntu中默认使用dash执行脚本命令,因此可能会出一些问题,可以自己制定使用的shell类型
shell := /bin/bash

$(shell paste *.file)
  • 自定义隐式命令
%.protein:%.gene; 
translate $< >$@
  • foreach的使用
 
$(foreach <var>;,<list>;,<text>;)
$(line).map:
echo $@
name=a b c
$(foreach var, $(nameL), make $(var).map line=$(var);) #将执行make a.map line=a; make b.map line=b; make c.map line=c
  • Make中增加判断语句,控制执行的命令
ifeq ($(gcc),cc )  
<>
else
<>
endif
ifdef $gcc
<>
endif
ifndef $gcc
<>  
endif
  • 在Makefile中使用重定向时要定义SHELL的类型
SHELL := /bin/bash -e -o pipefail

diff <(sort -u a) <(sort -u b)
  • 字符串操作函数
nameL=a b c
#计算单词个数
$(words $(nameL)) #返回值为3
$(words a b c) #返回值为3
#测试输出返回值
count=$(words a b c)
echo_count:
echo $(count)
#取出特定单词
$(word 2, $(nameL)) #取出第二个单词 b
#排序多个单词
$(sort $(nameL)) #排序
$(sort c b a) #输出为a b c
  • Substitute blank with comma in Makefile
#define a variable represent comma
comma:= ,
#define an empty variable
empty:=
#define a space by two empty variable and one blank
space:= $(empty) $(empty)
foo:= a b c
#no space after each comma especially the last one
bar:= $(subst $(space),$(comma),$(foo))
# bar is now `a,b,c'.
  • 获取文件路径
annovar_dir=$(dir $(shell which annotate_variation.pl))
  • Makefile处理多级目录

    • 方法1. 在每个目录下建立Makefile文件,在最外面的Makefile中cd到指定目录中执行$(MAKE),也是可以加参数的

    • 方法2:就是查找每个需要编译的文件,然后进行编译,下面是一个例子

MW_DIR=$(PWD)  
INCLUDE = -I$(MW_DIR)/include
INCLUDE+= -I.
#LIBPATH=-L $(MW_DIR)/lib     //如果有库文件,可以这样指定
#LIB= -lpthread                        //libpthread.a
CC=gcc
CFLAGS=-DHI_DEBUG -g -Wall

//加入内部的头文件
SAMDIR=$(MW_DIR)/src
SAMINCH=$(shell find $(SAMDIR) -name &#8216;*.h&#8217;)
SAMINCDIR=$(dir $(SAMINCH))
INCLUDE+= $(foreach temp,$(SAMINCDIR), -I$(temp))

//查找到需要编译的C文件
SRC=$(shell find $(SAMDIR) -name &#8216;*.c&#8217;)  //子目录的C文件
SRC+=$(wildcard *.c)  //当前目录中的C文件

APP=$(SRC:%.c=%)  //得到AP文件

all  :  $(APP)

$(APP): %: %.c
$(CC) $(CFLAGS) -o  $@ $< $(INCLUDE) $(LIBPATH) $(LIB)
clean:
rm -fr $(APP)
  • 参考资料

http://www.jfranken.de/homepages/johannes/vortraege/make.en.html

http://linux.chinaunix.net/bbs/thread-988337-1-1.html

CHENTONG
版权声明:本文为博主原创文章,转载请注明出处。
alipay.png WeChatPay.png

CHENTONG

CHENTONG
积微,月不胜日,时不胜月,岁不胜时。凡人好敖慢小事,大事至,然后兴之务之。如是,则常不胜夫敦比于小事者矣!何也?小事之至也数,其悬日也博,其为积也大。大事之至也希,其悬日也浅,其为积也小。故善日者王,善时者霸,补漏者危,大荒者亡!故,王者敬日,霸者敬时,仅存之国危而后戚之。亡国至亡而后知亡,至死而后知死,亡国之祸败,不可胜悔也。霸者之善著也,可以时托也。王者之功名,不可胜日志也。财物货宝以大为重,政教功名者反是,能积微者速成。诗曰:德如毛,民鲜能克举之。此之谓也。

生信宝典文章集锦

### 培训* [生物信息作图系列R、Cytoscape及图形排版和Python编程培训研讨班开课了](http://mp.weixin.qq.com/s/x-DInL34BbKUR-2UD2Ec3g)* [120分的转录组考题,你能得多少](http://mp.weixi...… Continue reading

基因共表达聚类分析及可视化

Published on November 30, 2017

易生信转录组培训第一期总结

Published on November 15, 2017