第二十二课 打造专业的编译环境(下)

顶层目录如下:

顶层makefile:

1 include pro-cfg.mk
2 include cmd-cfg.mk
3 include pro-rule.mk

cmd-cfg.mk:

 1 AR := ar
 2 ARFLAGS := crs
 3
 4 CC := gcc
 5 LFLAGS :=
 6 CFLAGS := -I$(DIR_INC) -I$(DIR_COMMON_INC)
 7
 8 ifeq ($(DEBUG),true)
 9 CFLAGS += -g
10 endif
11
12 MKDIR := mkdir
13 RM := rm -fr

mod-cfg.mk:

1 DIR_SRC := src
2 DIR_INC := inc
3
4 TYPE_INC := .h
5 TYPE_SRC := .c
6 TYPE_OBJ := .o
7 TYPE_DEP := .dep

mode-rule.mk:

 1 .PHONY : all
 2
 3 MODULE := $(realpath .)
 4 MODULE := $(notdir $(MODULE))
 5 DIR_OUTPUT := $(addprefix $(DIR_BUILD)/, $(MODULE))
 6
 7 OUTPUT := $(MODULE).a
 8 OUTPUT := $(addprefix $(DIR_BUILD)/, $(OUTPUT))
 9
10 SRCS := $(wildcard $(DIR_SRC)/*$(TYPE_SRC))
11 OBJS := $(SRCS:$(TYPE_SRC)=$(TYPE_OBJ))
12 OBJS := $(patsubst $(DIR_SRC)/%, $(DIR_OUTPUT)/%, $(OBJS))
13 DEPS := $(SRCS:$(TYPE_SRC)=$(TYPE_DEP))
14 DEPS := $(patsubst $(DIR_SRC)/%, $(DIR_OUTPUT)/%, $(DEPS))
15
16 vpath %$(TYPE_INC) $(DIR_INC)
17 vpath %$(TYPE_INC) $(DIR_COMMON_INC)
18 vpath %$(TYPE_SRC) $(DIR_SRC)
19
20 -include $(DEPS)
21
22 all : $(OUTPUT)
23     @echo "Success! Target ==> $(OUTPUT)"
24
25 $(OUTPUT) : $(OBJS)
26     $(AR) $(ARFLAGS) [email protected] $^
27
28 $(DIR_OUTPUT)/%$(TYPE_OBJ) : %$(TYPE_SRC)
29     $(CC) $(CFLAGS) -o [email protected] -c $(filter %$(TYPE_SRC), $^)
30
31
32 $(DIR_OUTPUT)/%$(TYPE_DEP) : %$(TYPE_SRC)
33     @echo "Creating [email protected] ..."
34     @set -e; 35     $(CC) $(CFLAGS) -MM -E $(filter %$(TYPE_SRC), $^) | sed ‘s,\(.*\)\.o[ :]*,$(DIR_OUTPUT)/\1$(TYPE_OBJ) [email protected] : ,g‘ > [email protected]

pro-cfg.mk:

 1 MODULES := common  2            module  3            main
 4
 5 MOD_CFG := mod-cfg.mk
 6 MOD_RULE := mod-rule.mk
 7 CMD_CFG := cmd-cfg.mk
 8
 9 DIR_BUILD := build
10 DIR_COMMON_INC := common/inc
11
12 APP := app.out

pro-rule.mk:

 1 .PHONY : all compile link clean rebuild
 2
 3 DIR_PROJECT := $(realpath .)
 4 DIR_BUILD_SUB := $(addprefix $(DIR_BUILD)/, $(MODULES))
 5 MODULE_LIB := $(addsuffix .a, $(MODULES))
 6 MODULE_LIB := $(addprefix $(DIR_BUILD)/, $(MODULE_LIB))
 7
 8
 9 APP := $(addprefix $(DIR_BUILD)/, $(APP))
10
11 all : compile $(APP)
12     @echo "Success! Target ==> $(APP)"
13
14 compile : $(DIR_BUILD) $(DIR_BUILD_SUB)
15     @echo "Begin to compile ..."
16     @set -e; 17     for dir in $(MODULES); 18     do 19         cd $$dir && 20         $(MAKE) all 21                 DEBUG:=$(DEBUG) 22                 DIR_BUILD:=$(addprefix $(DIR_PROJECT)/, $(DIR_BUILD)) 23                 DIR_COMMON_INC:=$(addprefix $(DIR_PROJECT)/, $(DIR_COMMON_INC)) 24                 CMD_CFG:=$(addprefix $(DIR_PROJECT)/, $(CMD_CFG)) 25                 MOD_CFG:=$(addprefix $(DIR_PROJECT)/, $(MOD_CFG)) 26                 MOD_RULE:=$(addprefix $(DIR_PROJECT)/, $(MOD_RULE)) && 27         cd .. ; 28     done
29     @echo "Compile Success!"
30
31 link $(APP) : $(MODULE_LIB)
32     @echo "Begin to link ..."
33     $(CC) -o $(APP) -Xlinker "-(" $^ -Xlinker "-)" $(LFLAGS)
34     @echo "Link Success!"
35
36 $(DIR_BUILD) $(DIR_BUILD_SUB) :
37     $(MKDIR) [email protected]
38
39 clean :
40     @echo "Begin to clean ..."
41     $(RM) $(DIR_BUILD)
42     @echo "Clean Success!"
43
44 rebuild : clean all

module文件夹下的makefile:

 1 include $(MOD_CFG)
 2
 3 # Custmization Begin
 4 #
 5 # DIR_SRC := src
 6 # DIR_INC := inc
 7 #
 8 # TYPE_INC := .h
 9 # TYPE_SRC := .c
10 # TYPE_OBJ := .o
11 # TYPE_DEP := .dep
12 #
13 # Custmization End
14
15 include $(CMD_CFG)
16
17 include $(MOD_RULE)

main文件夹下的makefile:

 1 include $(MOD_CFG)
 2
 3 # Custmization Begin
 4 #
 5 # DIR_SRC := src
 6 # DIR_INC := inc
 7 #
 8 # TYPE_INC := .h
 9 # TYPE_SRC := .c
10 # TYPE_OBJ := .o
11 # TYPE_DEP := .dep
12 #
13 # Custmization End
14
15 include $(CMD_CFG)
16
17 include $(MOD_RULE)

common文件夹下的makefile:

 1 include $(MOD_CFG)
 2
 3 # Custmization Begin
 4 #
 5 # DIR_SRC := src
 6 # DIR_INC := inc
 7 #
 8 # TYPE_INC := .h
 9 # TYPE_SRC := .c
10 # TYPE_OBJ := .o
11 # TYPE_DEP := .dep
12 #
13 # Custmization End
14
15 include $(CMD_CFG)
16
17 include $(MOD_RULE)

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9735255.html

时间: 2024-10-10 20:23:47

第二十二课 打造专业的编译环境(下)的相关文章

第二十一课 打造专业的编译环境(中)

1 .PHONY : all compile link clean rebuild 2 3 MODULES := common 4 module 5 main 6 7 MKDIR := mkdir 8 RM := rm -fr 9 10 CC := gcc 11 LFLAGS := 12 13 DIR_PROJECT := $(realpath .) 14 DIR_BUILD := build 15 DIR_BUILD_SUB := $(addprefix $(DIR_BUILD)/, $(MO

NeHe OpenGL教程 第二十二课:凹凸映射

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第二十二课:凹凸映射 凹凸映射,多重纹理扩展: 这是一课高级教程,请确信你对基本知识已经非常了解了.这一课是基于第六课的代码的,它将建立一个非常酷的立体纹理效果. 这一课由Jens Schneider所写,它基本上是由第6课改写而来

makefile(08)_打造专业的编译环境

20.打造专业的编译环境(上)_模块Makefile设计 20.0. 实验材料 项目架构:其中各个文件的内容请自己填写. 20.1.大型项目的目录结构(无第三方库) 20.2.项目架构设计分析 项目被划分为不同的多个模块:每个模块用一个文件夹进行管理,文件由inc, src, makefile构成每个模块的对外函数统一放置于common/inc中,如common.h xxxfunc.h 20.3.项目目标 工程项目中不希望源文件夹在编译时被改动(只读文件夹)在编译时自动创建文件夹(build)用

打造专业的编译环境(十四)

在一些大型的项目中,它的结构是很复杂的.比如下面这个 我们来分析下这个项目的架构,项目被划分为多个不同模块.每个模块的代码用一个文件夹进行管理,文件夹由 inc,src,makefile 组成:每个模块的对外函数声明统一放置于 common/inc 中,如:common.h xxxfunc.h. 那么我们需要打造的编译环境是:1.源码文件夹在编译时不能被改动(只读文件夹):2.在编译时自动创建文件夹(build)用于存放编译结果:3.编译过程中自动生成依赖关系,自动搜索需要的文件:4.每个模块可

linux学习笔记-第二十二课-LNMP环境搭建(一)

一.LNMP环境搭建前的准备 LNMP就是Linux系统下Nginx+MySQL+PHP这种网站服务器架构,所以需要下载mysql,php,与nginx这三套软件. MySQL : 32位 :http://syslab.comsenz.com/downloads/linux/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz 64位 :http://syslab.comsenz.com/downloads/linux/mysql-5.1.40-linux-x86

JAVA学习第二十二课(多线程(二))- (多线程的创建方式一 :继承Thread类)

线程是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 创建新执行线程有两种方法. 一种方法是将类声明为 Thread 的子类.该子类应重写Thread 类的run 方法.另一种方法是声明实现 Runnable 接口的类.该类然后实现run 方法. 创建线程方式一:继承Thread类 一.创建线程的步骤: 1.定义一个类继承Thread类 2.覆盖Thread中的run()方法 3.直接创建Thread类子类的对象 4.调用start方法开启线程,并调用线程的任务run方法

第二十二课 Shell的基础知识

一.shell介绍1.shell是一个命令解释器,提供用户和机器进行交互,每个用户都可以有自己特定的shell ,2.CentOS7 默认shell为bash,还有zsh,ksh它们有细节上的差异而已,我们可以查下系统中是否存在zsh: yum list |grep zsh bash有哪些特性? 二.命令历史(history)1.它的存储的文件为:/root/.bash_history 2.当我们退出终端后,它才会储存到以上的文件中.它的配制文件为:/etc/profile ,如果你修改里面的文

第二十二课 单链表的具体实现

本节目标: 添加LinkList.h文件: 1 #ifndef LINKLIST_H 2 #define LINKLIST_H 3 4 #include "List.h" 5 #include "Exception.h" 6 7 namespace DTLib 8 { 9 10 template < typename T > 11 class LinkList : public List<T> 12 { 13 protected: 14 st

20.2015.8.12第二十二课ado.net1,2(增删改查代码)

//demo.aspx.cs登陆页面代码using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.SqlClient; namespace web20150811 { public par