makefile_1(初识make)
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
LIBS = -lm
CFLAGS = -Wall
#CFLAGS += -g
#CXXFLAGS += -g
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}
makefile_1(初识make)的更多相关文章
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- UI篇(初识君面)
我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- 初识SpringMvc
初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...
- 初识redis数据类型
初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...
- Redis初识、设计思想与一些学习资源推荐
一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...
随机推荐
- CustomerConfigHelper
public static class CustomerConfigHelper { public static object _lockObject = new object(); private ...
- 转 vagrant package[打包命令]详解
转 vagrant package[打包命令]详解 vagrant的一个非常重要的功能就是在你的同事之间分享你的box从而使大家的开发环境保持同步,打包[package]正是实现这一功能的关键所在 ...
- Ubuntu14.04编译安装mysql5.6.26
Ubuntu14.04编译安装mysql5.6.26 (1)安装编译源码需要的包 sudo apt-get install make cmake gcc g++ bison libncurses5-d ...
- Why Deep Learning Works – Key Insights and Saddle Points
Why Deep Learning Works – Key Insights and Saddle Points A quality discussion on the theoretical mot ...
- Linux下SVN安装配置和使用中遇到的问题
两个命令: svn info :显示版本库信息,svn的下载url等. svn co https://xxxxx/xxx wodemulu (通过我的目录制定co的文件夹) svn st:显示 ...
- String与Date、Timestamp互转
一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr = "2010/05/04 12:34:23&quo ...
- linux 访问tomcat 管理页面时 You are not authorized to view this page 403(真实可用)
ava代码 收藏代码 You are not authorized to view this page. If you have not changed any configuration files ...
- 我的前端MVC之路
大约十几个月前,了解到时下前端MVC之火爆,同事推荐我了解一下angular.当时也不是特别在意,只是稍稍阅读了一遍官方文档,并尝试了文档上的例子.其实当时也颇有震惊之感的,原来代码还可以这么写!看完 ...
- 遇到个小问题,Java泛型真的是鸡肋吗?
今天遇到一个小问题,让我感觉Java的泛型(因为背负了历史的包袱导致的)有点鸡肋啊. 我们经常会遇到要一些自定义的key-value字符串,比如: "key1:1k;key2:2;key3: ...
- ASP.NET中树型DropDownList的绑定
首先设计好数据库,假设数据库有三个字段Id,ParentId,Name.ParentId是树性结构必须的,就是节点的父节点id,假设跟节点id都是0.下面就可以绑定了! 思路应该很简单,就是先绑定根节 ...