一点一点学写Makefile(6)-遍历当前目录源文件及其子目录下源文件

时间:2022-05-27 12:45:27

一点一点学写Makefile(6)-遍历当前目录源文件及其子目录下源文件


时候,我们在开发的时候需要将本次工程的代码分成多个子目录来编写,但是在Makefile的编写上却是个问题,下面我就教大家怎么构建带有子文件夹的源代码目录的自动扫描编译

下面这张图是我的文件树

一点一点学写Makefile(6)-遍历当前目录源文件及其子目录下源文件

这里面src目录下是我的源代码,我将功能代码分成了三个子模块,分别为test1, test2, test3, 调用这三个子模块的是main.cpp文件,下面我将这三个子模块的代码

[cpp]  view plain  copy
  1. //  src/test1/test1.h  
  2. #ifndef __TEST1_H__  
  3. #define __TEST1_H__  
  4. int test1();  
  5. #endif //__TEST1_H__  
  6.   
  7. // src/test1/test1.cpp  
  8. #include "test1.h"  
  9.   
  10. int test1() {  
  11.     return 1;     
  12. }  
  13.   
  14. <pre name="code" class="cpp">//  src/test2/test2.h  
  15. #ifndef __TEST2_H__  
  16. #define __TEST2_H__  
  17. int test2();  
  18. #endif //__TEST2_H__  
  19.   
  20. // src/test2/test2.cpp  
  21. #include "test2.h"  
  22.   
  23. int test2() {  
  24.     return 2;     
  25. }  

 

[cpp]  view plain  copy
  1. //  src/test3/test3.h  
  2. #ifndef __TEST3_H__  
  3. #define __TEST3_H__  
  4. int test3();  
  5. #endif //__TEST3_H__  
  6.   
  7. // src/test3/test3.cpp  
  8. #include "test3.h"  
  9.   
  10. int test3() {  
  11.     return 3;     
  12. }  


// src/main.cpp
#include <iostream>
#include "test1/test1.h"
#include "test2/test2.h"
#include "test3/test3.h"

using namespace std;

int main() {
    cout << "test1()" << test1() << endl;
    cout << "test2()" << test2() << endl;
    cout << "test3()" << test3() << endl;
}

Makefile遍历的核心代码如下:

[plain]  view plain  copy
  1. SRC_PATH = ./src  
  2. DIRS = $(shell find $(SRC_PATH) -maxdepth 3 -type d)  
  3.   
  4. # 为了更大幅度的支持项目的搭建,将三种文件格式的后缀都单独便利到变量中  
  5. SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))  
  6. SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))  
  7. SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))  
  8.   
  9. OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))  
  10. OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC))  
  11. OBJS_C = $(patsubst %.c, %.o, $(SRCS_C))  


下面是Makefile的全部文件

一点一点学写Makefile(6)-遍历当前目录源文件及其子目录下源文件
       
CROSS
=
CC
= $(CROSS)gcc
CXX
= $(CROSS)g++
DEBUG
=
CFLAGS
= $(DEBUG) -Wall -c
MV
= mv -f
RM
= rm -rf
LN
= ln -sf

TARGET
= classify

TOP_PATH
= $(shell pwd)
SRC_PATH
= $(TOP_PATH)/src
MOD_PATH
= $(TOP_PATH)/modules
MOD_LIB_PATH
= $(MOD_PATH)/lib
MOD_INC_PATH
= $(MOD_PATH)/include
DIRS
= $(shell find $(SRC_PATH) -maxdepth 3 -type d)
FILES
= $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))

##########################################################
# modules
##########################################################
modules =
MODULES_PATH = $(foreach m, $(modules), $(MOD_PATH)/$(m))

##########################################################
# srcs
##########################################################
SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))
SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))

##########################################################
# objs
##########################################################
OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))
OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC))
OBJS_C = $(patsubst %.c, %.o, $(SRCS_C))

##########################################################
# paths
##########################################################
INC_PATH += -I$(MOD_INC_PATH)
INC_PATH += -I$(MOD_PATH)
LIB_PATH += -L$(TOP_PATH)/lib
LIB_PATH += -L$(MOD_LIB_PATH)

##########################################################
# libs
##########################################################

##########################################################
# building
##########################################################
all:$(TARGET)

$(TARGET) : $(OBJS_CPP) $(OBJS_CC) $(OBJS_C)
@ for i in $(MODULES_PATH); \
do \
make -C $$i; \
done

@ $(CXX) $^ -o $@ $(LIB_PATH) $(LIBS)
@ echo Create $(TARGET) ok...

$(OBJS_CPP):%.o : %.cpp
$(CXX) $(CFLAGS) $< -o $@ $(INC_PATH)

$(OBJS_CC):%.o : %.cc
$(CXX) $(CFLAGS) $< -o $@ $(INC_PATH)

$(OBJS_C):%.o : %.c
$(CXX) $(CFLAGS) $< -o $@ $(INC_PATH)

.PHONY : clean
clean:
@ $(RM) $(TARGET) $(OBJS_CPP) $(OBJS_CC) $(OBJS_C)
@ for i in $(MODULES_PATH); \
do \
make clean -C $$i; \
done
@echo clean all...
原文链接:http://www.cnblogs.com/catgatp/p/6527243.html