Makefile

example-1
PATH=$(shell pwd)
all:
	echo ${PATH}
	echo $$PATH

echo /Users/mm/Documents/vad_test/rtc/
/Users/mm/Documents/vad_test/rtc/
echo $PATH /
/Users/mm/Documents/vad_test/rtc/

example-2:在test下,建立a.c和b.c两个文件,在sub目录下,建立sa.c和sb.c两个 个文件
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(src))
abc=$(filter-out .%a.c, $(src))
all:
	echo $(src)
	echo $(dir)
	echo $(obj)
	echo "end"
	echo $(abc)

echo a.c b.c ./sub/sa.c ./sub/sb.c
a.c b.c ./sub/sa.c ./sub/sb.c
echo a.c b.c sa.c sb.c
a.c b.c sa.c sb.c
echo a.o b.o ./sub/sa.o ./sub/sb.o
a.o b.o ./sub/sa.o ./sub/sb.o
echo “end”
end
echo a.c b.c ./sub/sb.c
a.c b.c ./sub/sb.c

example-3:在test下,建立Makefile.config和Makefile.1两个文件

Makefile.1:

CPU_ONLY := 1

Makefile.config

CONFIG_FILE := Makefile.config
# Explicitly check for the config file, otherwise make -k will proceed anyway.
ifeq ($(wildcard $(CONFIG_FILE)),)
$(info $(wildcard $(CONFIG_FILE)) not found. See $(CONFIG_FILE).example.)
endif
include $(CONFIG_FILE)
$(info $(CPU_ONLY))
CPU_ONLY := 8
all:
	@echo $(CPU_ONLY)

执行:make -f Makefile.1

1
8

example-4:文件名为abc
PROTO_SRCS := src/caffe/proto/caffe.proto
RESULT := ${PROTO_SRCS:.proto=.pb.h}
all:
	@echo $(RESULT)

执行:make -f abc

src/caffe/proto/caffe.pb.h

example-5:|
OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o : %.c
	$(COMPILE.c) $(OUTPUT_OPTION) $<
$(info COMPILE.c=$(COMPILE.c))
$(info OUTPUT_OPTION=$(OUTPUT_OPTION))
all: $(OBJS)
$(OBJS): | $(OBJDIR)
$(OBJDIR):
	@echo "mkdir"
	mkdir $(OBJDIR)

objdir目录下新建foo.c,bar.c,baz.c三个文件
执行: make

COMPILE.c=cc -c
OUTPUT_OPTION=-o
cc -c -o objdir/foo.o objdir/foo.c
cc -c -o objdir/bar.o objdir/bar.c
cc -c -o objdir/baz.o objdir/baz.c

说明:
  • 从第一个 target(排除以 . 开头的 target,比如 .PHONY)开始,这个就是默认目标,本次任务的终极目标(或者可以显式设定 .DEFAULT_GOAL)。 比如在下面的 基本例子 中,edit 就是终极目标。
  • 判断目标是否存在, 依赖的对象是否有更新
  • 根据依赖关系一步一步追溯查找,建立依赖关系链,执行需要执行的命令,最终输出终极目标。
  • 没有在依赖链上的目标是不会被直接执行到的,比如 clean。
objects = main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o
        
# make读取到的第一个target, 默认设置为 终极目标
edit: $(objects)
    cc -o edit $(objects)
    
# 隐含规则, make 根据 xx.o 推导出依赖 xx.c, 以及相应的编译命令
# 如 -> main.o: defs.h
# 等同 :
#   -> main.o: main.c defs.h
#   ->		 cc -o main.o main.c defs.h
main.o: defs.h
kbd.o: defs.h command.h
command.o: defs.h command.h
display.o: defs.h buffer.h
insert.o: defs.h buffer.h
search.o: defs.h buffer.h
files.o: defs.h buffer.h command.h
utils.o: defs.h

# .PHONY 定义为目标 clean 
# 和 edit 没有依赖关系 直接执行 make 是不会运行到的
# 通过 make clean 执行
.PHONY: clean
clean:
    -rm edit $(objects)**
.PHONY:mefirst mefirst2

mefirst:
	@echo "I'm first"
mefirst2:
	@echo "I'm first too!"
normaltarget:normaltarget2 | mefirst2
	@echo "normaltarget done"
normaltarget2:a b c
	@echo "normaltarget2 done"
helloworld:normaltarget | mefirst
	@echo "helloworld done"
.DEFAULT_GOAL := go
go:helloworld
	@echo "go done"
a:
	@echo a
b:
	@echo b
c:
	@echo c

a
b
c
normaltarget2 done
I’m first too!
normaltarget done
I’m first
helloworld done
go done

a:
	@echo "a"
b:
	@echo "b"

a

make a

a: b
	touch a

b: c
	touch b

c:
	touch c

x: | y
	touch x

y: | z
	touch y

z:
	touch z

touch c
touch b
touch a

make x

touch z
touch y
touch x

:~$ touch c
:~$ make a
touch b
touch a
:~$ touch z
:~$ make x
make: `x' is up to date.

:~$ rm c
:~$ make a
touch c
touch b
touch a
:~$ rm z
:~$ make x
touch z
example-6:Makefile
all: draw f1 f2
draw: gg
	@echo "****"
f2:
	@echo "----"
f1:
	@echo "+++++"

gg:
	@echo "000000"

000000
****
+++++
----

example-6:执行流程

.PHONY: all

all: m n $(info pre_all)
    $(info recipe_all)

m: m1 m2 $(info pre_m)
    $(info recipe_m)

n: n1 n2 m2 $(info pre_n)
    $(info recipe_n)

m1: $(info pre_m1)
    $(info recipe_m1)

m2: $(info pre_m2)
    $(info recipe_m2)

n1: $(info pre_n1)
    $(info recipe_n1)

n2: $(info pre_n2)
    $(info recipe_n2)

pre_all
recipe_all
pre_m
recipe_m
pre_n
recipe_n
pre_m1
recipe_m1
pre_m2
recipe_m2
pre_n1
recipe_n1
pre_n2
recipe_n2

example-7:.SUFFIXES

https://www.cnblogs.com/gaojian/archive/2012/09/21/2696482.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值