makefile_1(初识make)
2015-12-19 21:47
405 查看
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
LIBS = -lm
CFLAGS = -Wall
OBJS = server_socket.o
main:${OBJS}
gcc -lstdc++ -std=c++11 -o server_main ${OBJS} ${LIBS}
clean:
rm -f server_main ${OBJS}
install:
cp -a server_main /usr/local/bin
uninstall:
rm -f /usr/local/bin/server_main
# This make file is a test rule file
# Version 0.2 2009/06/11
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
install:
cp -a main /usr/local/bin
uninstall:
rm -f /usr/local/bin/main
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
LIBS = -lm
CFLAGS = -Wall
OBJS = server_socket.o
main:${OBJS}
gcc -lstdc++ -std=c++11 -o server_main ${OBJS} ${LIBS}
clean:
rm -f server_main ${OBJS}
install:
cp -a server_main /usr/local/bin
uninstall:
rm -f /usr/local/bin/server_main
# This make file is a test rule file
# Version 0.2 2009/06/11
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
install:
cp -a main /usr/local/bin
uninstall:
rm -f /usr/local/bin/main
# 全局Makefile文件 # * --------------------使用说明-------------------- # 此Makefile执行时有两种模式 # 一、非递归make模式 # 自动编译当前目录下的所有.c文件以并分别链接生成对应的.o文件和可执行文件。 # 给simple_mode赋任意值,然后包含此Makefile文件即可开启此模式。 # 二、递归make模式 # 会在当前目录的所有子目录下分别执行make命令 # 给recursive_mode赋任意值,然后包含此Makefile文件即可开启此模式。 # 其它变量说明见各自的注释 # * --------------------整体目标-------------------- # 三个虚拟目标 # all 编译链接所有文件 # debug 用来辅助测试Makefile,比如打印一些变量等等 # clean 清理所有文件 .PHONY : all clean debug all :: debug :: clean :: # * --------------------CFLAGS和LDFLAGS-------------------- # ** 标准变量CFLAGS和LDFLAGS设置 # 打开警告和调试信息选项 CFLAGS += -Wall -g # ** 添加对gtk程序的编译链接支持 # 自定义变量: # gtk 相当于gtk2 # gtk2 按照gtk2的环境来设置CFLAGS # gtk3 按照gtk3的环境来设置CFLAGS # 生成gtk程序,默认为gtk2 ifdef gtk CFLAGS += $(shell pkg-config --cflags --libs gtk+-2.0) endif ifdef gtk2 CFLAGS += $(shell pkg-config --cflags --libs gtk+-2.0) endif ifdef gtk3 CFLAGS += $(shell pkg-config --cflags --libs gtk+-3.0) endif # * --------------------简单make模式(不递归)-------------------- # 自定义变量: # simple_mode 开启简单make模式 # sources_exclude 忽略的源文件列表 # objects_exclude 忽略的目标文件列表 # programs_exclude 忽略的程序文件列表(即最终的可执行文件) # rmobj 删除的文件列表 # rmobj_exclude 忽略的删除文件列表 # 说明: # # 1、如果一个源文件添加到了$(sources_exclude)变量中,那么它对应的目标文 # 件和最终的可执行文件会被自动添加到$(objects_exclude)和 # $(programs_exclude)中 # # 2、$(rmobj_exclude)是指这样一个文件列表,原本应该被删除的文件(例如某 # 个可执行文件),但不想让它在执行make clean时被自动删除 # --------------------对当前目录下的普通文件执行make-------------------- sources_all = $(wildcard *.c) sources = $(filter-out $(sources_exclude), $(sources_all)) objects_all = $(patsubst %.c,%.o,$(sources)) objects += $(filter-out $(objects_exclude), $(objects_all)) programs_all = $(patsubst %.o,%,$(objects)) programs += $(filter-out $(programs_exclude), $(programs_all)) rmobj += $(wildcard *~) ifdef simple_mode all :: $(programs) debug :: echo sources_all: $(sources_all) echo sources_exclude: $(sources_exclude) echo sources: $(sources) echo objects_all: $(objects_all) echo objects_exclude: $(objects_exclude) echo objects: $(objects) echo programs_all: $(programs_all) echo programs_exclude: $(programs_exclude) echo programs: $(programs) echo rmobj: $(rmobj) clean :: -rm -f $(programs_all) $(objects_all) $(rmobj) endif # * --------------------递归make模式-------------------- # 自定义变量: # recursive_mode 是否开启递归make模式 # subdirs_exclude 被忽略的文件夹列表,即不会进入这个文件夹执行递归make # 判断是否存在子目录以及在子文件夹里执行make ifdef recursive_mode subdirs_all := $(sort $(subst /,,$(dir $(wildcard */*)))) subdirs = $(filter-out $(subdirs_exclude), $(subdirs_all)) all :: $(subdirs) @for subdir in $(subdirs); do \ $(MAKE) -C $$subdir; \ done debug :: echo subdirs_all: $(subdirs_all) echo subdirs_exclude: $(subdirs_exclude) echo subdirs: $(subdirs) clean :: @for subdir in $(subdirs); do \ $(MAKE) -C $$subdir clean; \ done endif # * --------------------添加对flymake的支持-------------------- check-syntax: gcc $(CFLAGS) -o /tmp/flymake-nul -S ${CHK_SOURCES}
相关文章推荐
- React表单组件自定义-可控及不可控组件
- http 和 URL
- 【See you】
- Mysql数据库的基本操作
- mobile jquery onload函数问题
- OSGI系列一---环境搭建
- 关于++前,后++
- 用字母显示图片 Mtalab
- JFileChooser 文件选择对话框API
- IT公司100题-17-第一个只出现一次的字符
- JDBC事物处理——保持数据一致性案例
- openjudge 最小新整数
- 【SQLSERVER学习笔记】分页存储过程+调用
- archlinux在命令行模式下开机自动登陆
- 美团Android资源混淆保护实践
- Fragment理解
- 模式识别之knn---KNN(k-nearest neighbor algorithm)--从原理到实现
- 布局主要代码
- VS2012配置#系列快捷方式自动生成代码
- 几种经典的网络服务器架构模型的分析与比较