首页 > 技术文章 > Makefile学习2——通用模板的生成

Rainingday 2020-05-11 19:25 原文

完成通用功能需要Makfile和Makefile.build。自动生成通用模板的应用为CreatMakfile。
测试用目录如下:

因为CreatMakefile.c中的扫描部分和顶层Makfile的obj-y中的定义全部与src有关。所以项目结构为CreatMakfile和src文件夹并列,且源文件和H文件放到src目录及其子目录中。

应用CreatMakefile的用法:

-c 生成顶层Makefile和Makefile.build   -n 指定Traget名字 -g 指定编译器 -s扫描目录 添加Makfile.inc和各子目录下的Makefile文件。
例如输入

查看顶层Makfile

 

执行./CreatMakfile -c 后

顶层生成了Makfile和Makefile.build。
执行./CreatMakfile -s 后

生成了Makfile.inc和各子目录下Makfile文件,Makfile.inc里输入了所有.h文件的路径,各子目录下的Makefie输入了添加obj-y生成对应.c文件的.o文件
比如test1/Makefile

Makfile.inc 因为只有test1下包含.h文件,所以只输入了此路径

然后make 就好。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>  //包含了Linux C 中的函数getcwd()
 
 
 
#define FILEPATH_MAX (80)
 
const char Makefile[] = {//顶层Makefile的2进制 可以用winHex打开 保存进此数组
    0x23, 0xE7, 0xBC, 0x96, 0xE8, 0xAF, 0x91, 0xE5, 0xB7, 0xA5, 0xE5, 0x85, 0xB7, 0xE9, 0x93, 0xBE, 
    0x0A, 0x43, 0x52, 0x4F, 0x53, 0x53, 0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x49, 0x4C, 0x45, 0x09, 0x3F, 
    0x3D, 0x0A, 0x41, 0x53, 0x09, 0x09, 0x09, 0x09, 0x3D, 0x20, 0x24, 0x28, 0x43, 0x52, 0x4F, 0x53, 
    0x53, 0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x49, 0x4C, 0x45, 0x29, 0x61, 0x73, 0x0A, 0x4C, 0x44, 0x09, 
    0x09, 0x09, 0x09, 0x3D, 0x20, 0x24, 0x28, 0x43, 0x52, 0x4F, 0x53, 0x53, 0x5F, 0x43, 0x4F, 0x4D, 
    0x50, 0x49, 0x4C, 0x45, 0x29, 0x6C, 0x64, 0x0A, 0x43, 0x43, 0x09, 0x09, 0x09, 0x09, 0x3D, 0x20, 
    0x24, 0x28, 0x43, 0x52, 0x4F, 0x53, 0x53, 0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x49, 0x4C, 0x45, 0x29, 
    0x67, 0x63, 0x63, 0x0A, 0x43, 0x50, 0x50, 0x09, 0x09, 0x09, 0x09, 0x3D, 0x20, 0x24, 0x28, 0x43, 
    0x43, 0x29, 0x20, 0x2D, 0x45, 0x0A, 0x41, 0x52, 0x09, 0x09, 0x09, 0x09, 0x3D, 0x20, 0x24, 0x28, 
    0x43, 0x52, 0x4F, 0x53, 0x53, 0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x49, 0x4C, 0x45, 0x29, 0x61, 0x72, 
    0x0A, 0x4E, 0x4D, 0x09, 0x09, 0x09, 0x09, 0x3D, 0x20, 0x24, 0x28, 0x43, 0x52, 0x4F, 0x53, 0x53, 
    0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x49, 0x4C, 0x45, 0x29, 0x6E, 0x6D, 0x0A, 0x53, 0x54, 0x52, 0x49, 
    0x50, 0x09, 0x09, 0x09, 0x3D, 0x20, 0x24, 0x28, 0x43, 0x52, 0x4F, 0x53, 0x53, 0x5F, 0x43, 0x4F, 
    0x4D, 0x50, 0x49, 0x4C, 0x45, 0x29, 0x73, 0x74, 0x72, 0x69, 0x70, 0x0A, 0x4F, 0x42, 0x4A, 0x43, 
    0x4F, 0x50, 0x59, 0x09, 0x09, 0x09, 0x3D, 0x20, 0x24, 0x28, 0x43, 0x52, 0x4F, 0x53, 0x53, 0x5F, 
    0x43, 0x4F, 0x4D, 0x50, 0x49, 0x4C, 0x45, 0x29, 0x6F, 0x62, 0x6A, 0x63, 0x6F, 0x70, 0x79, 0x0A, 
    0x4F, 0x42, 0x4A, 0x44, 0x55, 0x4D, 0x50, 0x09, 0x09, 0x09, 0x3D, 0x20, 0x24, 0x28, 0x43, 0x52, 
    0x4F, 0x53, 0x53, 0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x49, 0x4C, 0x45, 0x29, 0x6F, 0x62, 0x6A, 0x64, 
    0x75, 0x6D, 0x70, 0x0A, 0x0A, 0x23, 0xE7, 0xBC, 0x96, 0xE8, 0xAF, 0x91, 0xE9, 0x80, 0x89, 0xE9, 
    0xA1, 0xB9, 0x0A, 0x43, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x20, 0x3A, 0x3D, 0x20, 0x2D, 0x57, 0x61, 
    0x6C, 0x6C, 0x20, 0x2D, 0x4F, 0x32, 0x20, 0x2D, 0x67, 0x20, 0x2D, 0x73, 0x74, 0x64, 0x3D, 0x67, 
    0x6E, 0x75, 0x39, 0x39, 0x20, 0x2D, 0x66, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x2D, 0x63, 0x68, 0x61, 
    0x72, 0x73, 0x65, 0x74, 0x3D, 0x47, 0x42, 0x32, 0x33, 0x31, 0x32, 0x20, 0x2D, 0x66, 0x65, 0x78, 
    0x65, 0x63, 0x2D, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3D, 0x55, 0x54, 0x46, 0x2D, 0x38, 
    0x0A, 0x0A, 0x23, 0xE9, 0x93, 0xBE, 0xE6, 0x8E, 0xA5, 0xE9, 0x80, 0x89, 0xE9, 0xA1, 0xB9, 0x0A, 
    0x4C, 0x44, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x20, 0x3A, 0x3D, 0x20, 0x2D, 0x6C, 0x6D, 0x20, 0x2D, 
    0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x0A, 0x0A, 0x54, 0x4F, 0x50, 0x44, 0x49, 0x52, 0x20, 
    0x3A, 0x3D, 0x20, 0x24, 0x28, 0x73, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x70, 0x77, 0x64, 0x29, 0x0A, 
    0x0A, 0x44, 0x5F, 0x49, 0x4E, 0x43, 0x09, 0x3F, 0x3D, 0x0A, 0x0A, 0x23, 0xE5, 0x8F, 0x98, 0xE9, 
    0x87, 0x8F, 0xE5, 0xAF, 0xBC, 0xE5, 0x87, 0xBA, 0x0A, 0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x20, 
    0x41, 0x53, 0x20, 0x4C, 0x44, 0x20, 0x43, 0x43, 0x20, 0x43, 0x50, 0x50, 0x20, 0x41, 0x52, 0x20, 
    0x4E, 0x4D, 0x0A, 0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x53, 0x54, 0x52, 0x49, 0x50, 0x20, 
    0x4F, 0x42, 0x4A, 0x43, 0x4F, 0x50, 0x59, 0x20, 0x4F, 0x42, 0x4A, 0x44, 0x55, 0x4D, 0x50, 0x0A, 
    0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x43, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x20, 0x4C, 0x44, 
    0x46, 0x4C, 0x41, 0x47, 0x53, 0x20, 0x44, 0x5F, 0x49, 0x4E, 0x43, 0x0A, 0x65, 0x78, 0x70, 0x6F, 
    0x72, 0x74, 0x20, 0x54, 0x4F, 0x50, 0x44, 0x49, 0x52, 0x0A, 0x0A, 0x0A, 0x6F, 0x62, 0x6A, 0x2D, 
    0x79, 0x20, 0x2B, 0x3D, 0x20, 0x73, 0x72, 0x63, 0x2F, 0x0A, 0x0A, 0x0A, 0x61, 0x6C, 0x6C, 0x20, 
    0x3A, 0x20, 0x0A, 0x09, 0x6D, 0x61, 0x6B, 0x65, 0x20, 0x2D, 0x43, 0x20, 0x2E, 0x2F, 0x20, 0x2D, 
    0x66, 0x20, 0x24, 0x28, 0x54, 0x4F, 0x50, 0x44, 0x49, 0x52, 0x29, 0x2F, 0x4D, 0x61, 0x6B, 0x65, 
    0x66, 0x69, 0x6C, 0x65, 0x2E, 0x62, 0x75, 0x69, 0x6C, 0x64, 0x0A, 0x09, 0x24, 0x28, 0x43, 0x43, 
    0x29, 0x20, 0x24, 0x28, 0x4C, 0x44, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x29, 0x20, 0x2D, 0x6F, 0x20, 
    0x24, 0x28, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x29, 0x20, 0x62, 0x75, 0x69, 0x6C, 0x74, 0x2D, 
    0x69, 0x6E, 0x2E, 0x6F, 0x0A, 0x0A, 0x0A, 0x63, 0x6C, 0x65, 0x61, 0x6E, 0x3A, 0x0A, 0x09, 0x72, 
    0x6D, 0x20, 0x2D, 0x66, 0x20, 0x24, 0x28, 0x73, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x66, 0x69, 0x6E, 
    0x64, 0x20, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x20, 0x22, 0x2A, 0x2E, 0x6F, 0x22, 0x29, 0x0A, 0x09, 
    0x72, 0x6D, 0x20, 0x2D, 0x66, 0x20, 0x24, 0x28, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x29, 0x0A, 
    0x0A, 0x64, 0x69, 0x73, 0x74, 0x63, 0x6C, 0x65, 0x61, 0x6E, 0x3A, 0x0A, 0x09, 0x72, 0x6D, 0x20, 
    0x2D, 0x66, 0x20, 0x24, 0x28, 0x73, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x20, 
    0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x20, 0x22, 0x2A, 0x2E, 0x6F, 0x22, 0x29, 0x0A, 0x09, 0x72, 0x6D, 
    0x20, 0x2D, 0x66, 0x20, 0x24, 0x28, 0x73, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x66, 0x69, 0x6E, 0x64, 
    0x20, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x20, 0x22, 0x2A, 0x2E, 0x64, 0x22, 0x29, 0x0A, 0x09, 0x72, 
    0x6D, 0x20, 0x2D, 0x66, 0x20, 0x24, 0x28, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x29, 0x0A, 0x0A,
    0x00
};
 
const char Makefile_build[] = {
    0x50, 0x48, 0x4F, 0x4E, 0x59, 0x20, 0x3A, 0x3D, 0x20, 0x5F, 0x5F, 0x62, 0x75, 0x69, 0x6C, 0x64, 
    0x0D, 0x0A, 0x5F, 0x5F, 0x62, 0x75, 0x69, 0x6C, 0x64, 0x3A, 0x0D, 0x0A, 0x0D, 0x0A, 0x0D, 0x0A, 
    0x6F, 0x62, 0x6A, 0x2D, 0x79, 0x20, 0x3A, 0x3D, 0x0D, 0x0A, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 
    0x2D, 0x79, 0x20, 0x3A, 0x3D, 0x0D, 0x0A, 0x0D, 0x0A, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 
    0x20, 0x4D, 0x61, 0x6B, 0x65, 0x66, 0x69, 0x6C, 0x65, 0x0D, 0x0A, 0x2D, 0x69, 0x6E, 0x63, 0x6C, 
    0x75, 0x64, 0x65, 0x20, 0x4D, 0x61, 0x6B, 0x65, 0x66, 0x69, 0x6C, 0x65, 0x2E, 0x69, 0x6E, 0x63, 
    0x0D, 0x0A, 0x0D, 0x0A, 0x23, 0x20, 0x6F, 0x62, 0x6A, 0x2D, 0x79, 0x20, 0x3A, 0x3D, 0x20, 0x61, 
    0x2E, 0x6F, 0x20, 0x62, 0x2E, 0x6F, 0x20, 0x63, 0x2F, 0x20, 0x64, 0x2F, 0x0D, 0x0A, 0x23, 0x20, 
    0x24, 0x28, 0x66, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x20, 0x25, 0x2F, 0x2C, 0x20, 0x24, 0x28, 0x6F, 
    0x62, 0x6A, 0x2D, 0x79, 0x29, 0x29, 0x20, 0x20, 0x20, 0x3A, 0x20, 0x63, 0x2F, 0x20, 0x64, 0x2F, 
    0x0D, 0x0A, 0x23, 0x20, 0x5F, 0x5F, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 0x2D, 0x79, 0x20, 0x20, 
    0x3A, 0x20, 0x63, 0x20, 0x64, 0x0D, 0x0A, 0x23, 0x20, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 0x2D, 
    0x79, 0x20, 0x20, 0x20, 0x20, 0x3A, 0x20, 0x63, 0x20, 0x64, 0x0D, 0x0A, 0x5F, 0x5F, 0x73, 0x75, 
    0x62, 0x64, 0x69, 0x72, 0x2D, 0x79, 0x09, 0x3A, 0x3D, 0x20, 0x24, 0x28, 0x70, 0x61, 0x74, 0x73, 
    0x75, 0x62, 0x73, 0x74, 0x20, 0x25, 0x2F, 0x2C, 0x25, 0x2C, 0x24, 0x28, 0x66, 0x69, 0x6C, 0x74, 
    0x65, 0x72, 0x20, 0x25, 0x2F, 0x2C, 0x20, 0x24, 0x28, 0x6F, 0x62, 0x6A, 0x2D, 0x79, 0x29, 0x29, 
    0x29, 0x0D, 0x0A, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 0x2D, 0x79, 0x09, 0x2B, 0x3D, 0x20, 0x24, 
    0x28, 0x5F, 0x5F, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 0x2D, 0x79, 0x29, 0x0D, 0x0A, 0x0D, 0x0A, 
    0x23, 0x20, 0x63, 0x2F, 0x62, 0x75, 0x69, 0x6C, 0x74, 0x2D, 0x69, 0x6E, 0x2E, 0x6F, 0x20, 0x64, 
    0x2F, 0x62, 0x75, 0x69, 0x6C, 0x74, 0x2D, 0x69, 0x6E, 0x2E, 0x6F, 0x0D, 0x0A, 0x73, 0x75, 0x62, 
    0x64, 0x69, 0x72, 0x5F, 0x6F, 0x62, 0x6A, 0x73, 0x20, 0x3A, 0x3D, 0x20, 0x24, 0x28, 0x66, 0x6F, 
    0x72, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x2C, 0x24, 0x28, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 
    0x2D, 0x79, 0x29, 0x2C, 0x24, 0x28, 0x66, 0x29, 0x2F, 0x62, 0x75, 0x69, 0x6C, 0x74, 0x2D, 0x69, 
    0x6E, 0x2E, 0x6F, 0x29, 0x0D, 0x0A, 0x0D, 0x0A, 0x23, 0x20, 0x61, 0x2E, 0x6F, 0x20, 0x62, 0x2E, 
    0x6F, 0x0D, 0x0A, 0x63, 0x75, 0x72, 0x5F, 0x6F, 0x62, 0x6A, 0x73, 0x20, 0x3A, 0x3D, 0x20, 0x24, 
    0x28, 0x66, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x2D, 0x6F, 0x75, 0x74, 0x20, 0x25, 0x2F, 0x2C, 0x20, 
    0x24, 0x28, 0x6F, 0x62, 0x6A, 0x2D, 0x79, 0x29, 0x29, 0x0D, 0x0A, 0x64, 0x65, 0x70, 0x5F, 0x66, 
    0x69, 0x6C, 0x65, 0x73, 0x20, 0x3A, 0x3D, 0x20, 0x24, 0x28, 0x66, 0x6F, 0x72, 0x65, 0x61, 0x63, 
    0x68, 0x20, 0x66, 0x2C, 0x24, 0x28, 0x63, 0x75, 0x72, 0x5F, 0x6F, 0x62, 0x6A, 0x73, 0x29, 0x2C, 
    0x2E, 0x24, 0x28, 0x66, 0x29, 0x2E, 0x64, 0x29, 0x0D, 0x0A, 0x64, 0x65, 0x70, 0x5F, 0x66, 0x69, 
    0x6C, 0x65, 0x73, 0x20, 0x3A, 0x3D, 0x20, 0x24, 0x28, 0x77, 0x69, 0x6C, 0x64, 0x63, 0x61, 0x72, 
    0x64, 0x20, 0x24, 0x28, 0x64, 0x65, 0x70, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x29, 0x29, 0x0D, 
    0x0A, 0x0D, 0x0A, 0x69, 0x66, 0x6E, 0x65, 0x71, 0x20, 0x28, 0x24, 0x28, 0x64, 0x65, 0x70, 0x5F, 
    0x66, 0x69, 0x6C, 0x65, 0x73, 0x29, 0x2C, 0x29, 0x0D, 0x0A, 0x20, 0x20, 0x69, 0x6E, 0x63, 0x6C, 
    0x75, 0x64, 0x65, 0x20, 0x24, 0x28, 0x64, 0x65, 0x70, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x29, 
    0x0D, 0x0A, 0x65, 0x6E, 0x64, 0x69, 0x66, 0x0D, 0x0A, 0x0D, 0x0A, 0x0D, 0x0A, 0x50, 0x48, 0x4F, 
    0x4E, 0x59, 0x20, 0x2B, 0x3D, 0x20, 0x24, 0x28, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 0x2D, 0x79, 
    0x29, 0x0D, 0x0A, 0x0D, 0x0A, 0x0D, 0x0A, 0x5F, 0x5F, 0x62, 0x75, 0x69, 0x6C, 0x64, 0x20, 0x3A, 
    0x20, 0x24, 0x28, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 0x2D, 0x79, 0x29, 0x20, 0x62, 0x75, 0x69, 
    0x6C, 0x74, 0x2D, 0x69, 0x6E, 0x2E, 0x6F, 0x0D, 0x0A, 0x0D, 0x0A, 0x24, 0x28, 0x73, 0x75, 0x62, 
    0x64, 0x69, 0x72, 0x2D, 0x79, 0x29, 0x3A, 0x0D, 0x0A, 0x09, 0x6D, 0x61, 0x6B, 0x65, 0x20, 0x2D, 
    0x43, 0x20, 0x24, 0x40, 0x20, 0x2D, 0x66, 0x20, 0x24, 0x28, 0x54, 0x4F, 0x50, 0x44, 0x49, 0x52, 
    0x29, 0x2F, 0x4D, 0x61, 0x6B, 0x65, 0x66, 0x69, 0x6C, 0x65, 0x2E, 0x62, 0x75, 0x69, 0x6C, 0x64, 
    0x0D, 0x0A, 0x0D, 0x0A, 0x62, 0x75, 0x69, 0x6C, 0x74, 0x2D, 0x69, 0x6E, 0x2E, 0x6F, 0x20, 0x3A, 
    0x20, 0x24, 0x28, 0x63, 0x75, 0x72, 0x5F, 0x6F, 0x62, 0x6A, 0x73, 0x29, 0x20, 0x24, 0x28, 0x73, 
    0x75, 0x62, 0x64, 0x69, 0x72, 0x5F, 0x6F, 0x62, 0x6A, 0x73, 0x29, 0x0D, 0x0A, 0x09, 0x24, 0x28, 
    0x4C, 0x44, 0x29, 0x20, 0x2D, 0x72, 0x20, 0x2D, 0x6F, 0x20, 0x24, 0x40, 0x20, 0x24, 0x5E, 0x0D, 
    0x0A, 0x0D, 0x0A, 0x64, 0x65, 0x70, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x3D, 0x20, 0x2E, 0x24, 
    0x40, 0x2E, 0x64, 0x0D, 0x0A, 0x0D, 0x0A, 0x25, 0x2E, 0x6F, 0x20, 0x3A, 0x20, 0x25, 0x2E, 0x63, 
    0x0D, 0x0A, 0x09, 0x24, 0x28, 0x43, 0x43, 0x29, 0x20, 0x24, 0x28, 0x43, 0x46, 0x4C, 0x41, 0x47, 
    0x53, 0x29, 0x20, 0x24, 0x28, 0x44, 0x5F, 0x49, 0x4E, 0x43, 0x29, 0x20, 0x2D, 0x57, 0x70, 0x2C, 
    0x2D, 0x4D, 0x44, 0x2C, 0x24, 0x28, 0x64, 0x65, 0x70, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x29, 0x20, 
    0x2D, 0x63, 0x20, 0x2D, 0x6F, 0x20, 0x24, 0x40, 0x20, 0x24, 0x3C, 0x0D, 0x0A, 0x09, 0x0D, 0x0A, 
    0x2E, 0x50, 0x48, 0x4F, 0x4E, 0x59, 0x20, 0x3A, 0x20, 0x24, 0x28, 0x50, 0x48, 0x4F, 0x4E, 0x59, 
    0x29, 0x0D, 0x0A, 0x00
};
 
char g_name_h[256][256];
int g_cnt_h = 0;
 
int scan_dir(char* now_path, char* t);
 
 
int main(int argc, char** argv)
{ 
    char file_path_getcwd[FILEPATH_MAX];    //获取路径变量
    char path[256];                            //src 路径变量
    char file_name[256];                    //用来保存添加了路径的Makefile ‘sprintf(file_name, "%s/Makefile", file_path_getcwd); ’
    FILE *fp_Makefile = NULL;
    FILE *fp_Makefile_build = NULL;
    FILE *fp_Makefile_inc = NULL;
    
    /* 获取当前路径 */
    getcwd(file_path_getcwd, FILEPATH_MAX);
    
    if (argc < 2)
    {
        printf("选项:\n");
        printf("  -c,    --create                         create Makefile\n");
        printf("  -n,    --name   [=<target name>]        target name, need -c\n");
        printf("  -g,    --gcc    [=<cross compile>]      cross compile, need -c\n");
        printf("  -s,    --scan                           scan ./src dir *.c and *.h\n");
        return -1;
    }
    else
    {
        int creat_flag = 0;
        for (int i = 1; i < argc; i++)
        {
            if(strstr(&argv[i][0], "-c"))
            {
                creat_flag = 1;
                break;
            }
        }
        
        if (creat_flag)
        {
            char target_name[256] = "app";            //target_name默认为app
            char cross_compile[256] = "";
            
            
            for (int i = 1; i < argc; i++)            //指定target_name                
            {
                if (strstr(&argv[i][0], "-n"))
                {
                    if (i <= (argc - 2) && (argv[i + 1][0] != '-'))
                    {
                        strcpy(target_name, &argv[i + 1][0]);
                    }
                    break;
                }
            }
            
            
            for (int i = 1; i < argc; i++)           //指定cross_compile
            {
                if (strstr(&argv[i][0], "-g"))
                {
                    if (i <= (argc - 2) && (argv[i + 1][0] != '-'))
                    {
                        strcpy(cross_compile, &argv[i + 1][0]);
                    }
                    break;
                }
            }
            
                        
            char* str;
            str = malloc(strlen(target_name) + strlen("#生成可执行文件名字\nTARGET := \n\n#指定交叉工具链\nCROSS_COMPILE    = \n\n") + strlen(Makefile) + strlen(cross_compile));
            sprintf(str, "#生成可执行文件名字\nTARGET := %s\n\n#指定交叉工具链\nCROSS_COMPILE    = %s\n\n%s", target_name, cross_compile, Makefile);
            /* Makefile 路径文件 */
            sprintf(file_name, "%s/Makefile", file_path_getcwd);
            fp_Makefile = fopen(file_name, "wb+");
            fwrite(str, sizeof(char), strlen(str), fp_Makefile);
            fclose(fp_Makefile);
            
            
            /* Makefile.build 路径文件 */
            sprintf(file_name, "%s/Makefile.build", file_path_getcwd);
            fp_Makefile_build = fopen(file_name, "wb+");
            fwrite(Makefile_build, sizeof(char), strlen(Makefile_build), fp_Makefile_build);
            fclose(fp_Makefile_build);
        }
        
        
        for (int i = 1; i < argc; i++)
        {
            if(strstr(&argv[i][0], "-s"))
            {
                /* Makefile include 路径文件 */
                sprintf(file_name, "%s/Makefile.inc", file_path_getcwd);
                fp_Makefile_inc = fopen(file_name, "wb+");
                
                
                /* 扫描 */
                sprintf(path, "%s/src", file_path_getcwd);
                printf("%s\r\n", path);
                scan_dir(path, "");
                
                /* 写入路径文件 */
                if(g_cnt_h)
                {
                    char str[256];
                    for(int i = 0; i < g_cnt_h; i++)
                    {
                        sprintf(str, "D_INC += -I %s\r\n", &g_name_h[i][0]);
                        fwrite(str, sizeof(char), strlen(str), fp_Makefile_inc);
                    }
                }
                
                fclose(fp_Makefile_inc);
                break;
            }
        }
    }
    
    
    
    return 0;
}
 
 
int scan_dir(char* now_path, char* t)
{
    int ret;
    DIR *d;
    struct dirent *file;
    char next_dir[256];
    FILE *fp = NULL;
    char file_name[256];
    char str[256];
    char next_t[256];
    char next_t_is_end[256];
    
    char name_c[256][256];
    char name_d[256][256];
    int cnt_c = 0, cnt_d = 0;
    int have_h = 0;
    
    sprintf(next_t, "%s│   ", t);
    sprintf(next_t_is_end, "%s    ", t);
 
    /* 打开文件夹 */
    d = opendir(now_path);
    if(d == NULL)
    {
        printf("open dir error!\r\n");
        return -1;
    }
    
    /* 进入循环遍历 */
    while(1)
    {
        /* 遍历文件 */
        file = readdir(d);
        if(file  == NULL)
            break;
        
        //把当前目录.,上一级目录..及隐藏文件都去掉,避免死循环遍历目录
        if(strncmp(file->d_name, ".", 1) == 0)
            continue;
        
        /* 处理文件夹 */
        if(file->d_type == DT_DIR)
        {
            strcpy(&name_d[cnt_d++][0], file->d_name);
        }
        
        /* 处理文件 */
        if(file->d_type == DT_REG)
        {
            /* 过滤出C文件 */
            if(strstr(file->d_name, ".c") || strstr(file->d_name, ".C"))
            {
                int len;
                len = strlen(file->d_name);
                if(file->d_name[len - 1] != 'C' && file->d_name[len - 1] != 'c' && file->d_name[len - 1] != 'P' && file->d_name[len - 1] != 'p')
                    continue;
                
                strcpy(&name_c[cnt_c++][0], file->d_name);
                
            }
            
            /* 记录当前目录下是否有h文件 */
            if(strstr(file->d_name, ".h") || strstr(file->d_name, ".H"))
            {
                if(have_h == 0)
                {
                    strcpy(&g_name_h[g_cnt_h++][0], now_path);
                    have_h = 1;
                }
            }
        }
    }
    
    
    /* 处理C文件 */
    if(cnt_c)
    {
        /* 第一次打开, 创建Makefile文件 */
        sprintf(file_name, "%s/Makefile", now_path);
        fp = fopen(file_name, "wb+");
        
        for(int j = 0; j < cnt_c; j++)
        {
            /* 打印文件信息 */
            if((j + 1) == cnt_c && cnt_d == 0)
            {
                printf("%s└── \033[40;33m%s\033[0m\r\n", t, &name_c[j][0]);
            }
            else
            {
                printf("%s├── \033[40;33m%s\033[0m\r\n", t, &name_c[j][0]);
            }
            
        
            /* .c 替换成 .o */
            char temp_str[256];
            
            for(int i = 0; ; i++)
            {
                if(name_c[j][i] != '.')
                {
                    temp_str[i] = name_c[j][i];
                }
                else
                {
                    temp_str[i] = name_c[j][i];
                    temp_str[i + 1] = 'o';
                    temp_str[i + 2] = '\0';
                    break;
                }
            }
            
            /* 添加编译文件 */
            sprintf(str, "obj-y += %s\r\n", temp_str);
            fwrite(str, sizeof(char), strlen(str), fp);
        }
        
    }
    
    /* 处理文件夹 */
    if(cnt_d)
    {
        for(int j = 0; j < cnt_d; j++)
        {
            /* 打印文件信息 */
            if(cnt_d == (j + 1))    //最后一个文件夹
            {
                printf("%s└── \033[40;31m%s\033[0m\r\n", t, &name_d[j][0]);
                sprintf(next_dir, "%s/%s", now_path, &name_d[j][0]);
                ret = scan_dir(next_dir, next_t_is_end);        //递归调用
            }
            else
            {
                printf("%s├── \033[40;31m%s\033[0m\r\n", t, &name_d[j][0]);
                sprintf(next_dir, "%s/%s", now_path, &name_d[j][0]);
                ret = scan_dir(next_dir, next_t);        //递归调用
            }
            
            if(ret)
                continue;
            
            /* 第一次打开, 创建Makefile文件 */
            if(fp == NULL)
            {
                sprintf(file_name, "%s/Makefile", now_path);
                fp = fopen(file_name, "wb+");
            }
            
            /* 添加文件夹 */
            if(fp)
            {
                sprintf(str, "obj-y += %s/\r\n", &name_d[j][0]);
                fwrite(str, sizeof(char), strlen(str), fp);
            }
        }
    }
        
        
    
    /* 关闭文件 */
    if(fp)
    {
        ret = 0;
        fclose(fp);
    }
    else
    {
        ret = -1;
    }
    
    closedir(d);
    
    
    return ret;
}

搬运自:https://blog.csdn.net/h244259402/article/details/98685891

 

推荐阅读