make学习小结(二)

宏定义的使用,依赖关系

Posted by 婷 on March 17, 2020 本文总阅读量

宏定义的使用

Makefile中宏定义的方法就是别名=要代替的内容。要使用的时候则用$()这样的形式。类似shell中对变量的引用。

CC = gcc
INCLUDE = .
CFLAGS = -c
OFLAGS = -o

app:main.o a.o b.o
	$(CC) $(OFLAGS) app main.o a.o b.o
main.o:main.c a.h b.h
	$(CC) $(CFLAGS) main.c
a.o:a.c a.h 
	$(CC) -I$(INCLUDE) $(CFLAGS) a.c
b.o:b.c  b.h
	$(CC) -I$(INCLUDE) $(CFLAGS) b.c

依赖关系

make命令处理Makefile文件中定义的依赖关系,确定需要创建的文件以及创建顺序。

下面的Makefile文件定义了多个目标,其中install目标依赖于app。在执行make install命令的时候虽然创建app的命令是写在前面的,但是make命令能够自动判断出创建文件的正确顺序。

CC = gcc
INCLUDE = .
CFLAGS = -c
OFLAGS = -o
INSTDIR= /home/copyright/installdir

app:main.o a.o b.o
	$(CC) $(OFLAGS) app main.o a.o b.o
main.o:main.c a.h b.h
	$(CC) $(CFLAGS) main.c
a.o:a.c a.h 
	$(CC) -I$(INCLUDE) $(CFLAGS) a.c
b.o:b.c  b.h
	$(CC) -I$(INCLUDE) $(CFLAGS) b.c

clean:
	-rm *.o app 

install:app                           #目标install依赖于app,如果没有app,make则会先创建app
	if [ -d $(INSTDIR) ]; \
		then \
		cp app $(INSTDIR);\
		chmod a+x $(INSTDIR)/app;\
		chmod og-w $(INSTDIR)/app;\
		echo "Installed in $(INSTDIR)";\
	else \
		echo "Sorry, $(INSTDIR) does not exist";\
	fi

在命令行敲入make install命令,运行结果如下

1.png

目标install实现将可执行文件app安装到主目录下的一个文件夹,其中使用了shell脚本命令。

如果不想在终端上看到中间的if那部分命令,可以在这一行 if [ -d $(INSTDIR) ]; \开头添加@符号,这样在执行shell脚本命令的时候就不会在终端标准输出显示这些命令。(注意@符号后要留一个空格)

install:app
	@ if [ -d $(INSTDIR) ]; \
		then \
		cp app $(INSTDIR);\
		chmod a+x $(INSTDIR)/app;\
		chmod og-w $(INSTDIR)/app;\
		echo "Installed in $(INSTDIR)";\
	else \
		echo "Sorry, $(INSTDIR) does not exist";\
	fi

2.png