引言:
在去年(2018年)的这几个月开始接触ZYNQ,主要是做PS端的驱动开发。直到今年6月份的时候突然接手了一个应用层的工程,用的是Vivado提供的SDK来做的编辑和编译器。然而我还是习惯了使用source insight(下面简称SI)来编写代码,这个倒是可以直接创建一个SI工程就行了,但是可怕的事情发生了,就是我的SI是为了兼容以前的单片机代码从而设置的字符集是GB2312的,但是SDK却是UTF-8的。最后搞的我整个工程80%的文件注释全是乱码,真是心塞塞。然后第二个可怕的事情又发生了,就是我的application出现了分支,变成了两个不同的设备程序。接下来就是直接copy SDK工程、SDK工程另存为,复制出来的第二个工程就是无法编译成功。然后只能重新创建一个工程,然后就找之前创建工程的同事来远程协助,也是搞了半天才弄好。不过这些都是浮云,最可怕的就是这个SDK简直就是个内存杀手,由于我是在虚拟机里面运行的,并且又是笔记本。。。这里我就不再描述了,我相信不止我一个人深受其害。。。这就使得我萌发出了要编写一个通用Makefile的想法。。。
-------------------------------------------------------------------我是传说中的分割线------------------------------------------------------------------------
正文:
切入正题,通用Makefile的编写。。。。
本来是想大致介绍一下Makefile的,然而今天心情不是太好,所以这里就不介绍Makefile了,我这里主要是参考 韦东山第三期视频里面的通用Makefile编写 然后加上了一些自己的想法,最后写了一个linux的app来实现自动创建Makefile和自动添加C文件和H文件路径。这里简单描述一下怎么使用好了。
这里有一个测试用的工程,源文件统一放在src目录下。然后我这里是为了测试能否添加大小写后缀的文件(dfa.C)和能否过滤掉包涵.c但并不是.c后缀的文件(main.c.bak)。所以添加了一些没用的东西进去。
实际上真正用到的文件只有
./src/app/main.c
./src/display/display.c
./src/display/display.h
接下来介绍一下如果使用我写的那个应用了
应用名字叫做 CreatMakefile(叫什么无关紧要,如果你喜欢把它改成“番茄炒蛋”也行)
执行一下会有提示:
不是很想解释这些都是什么意思,自己领悟吧。。。
执行 CreatMakefile -c -n display
出现了Makefile 和 Makefile.build 这两个文件
打开Makfile看一下
现在直接执行make还不行,因为还需要添加源文件
接下来执行 CreatMakefile -s 进行扫描
执行tree看一下发现每一个有c文件的目录下都出现了一个Makefile(这个里面就保存有需要编译的c文件),并且在src同级目录下出现了Makfile.inc文件(这个就是h文件的目录)
执行make
执行 ./display
好了,就这样吧
https://download.csdn.net/download/h244259402/11487750
如果有问BUG就联系我吧,反正我也不会改。呵呵呵。。。
======================================传说中的分割线=============================================
应群里老哥们的需求,在这里开源:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h> //包含了Linux C 中的函数getcwd()
#define FILEPATH_MAX (80)
const char Makefile[] = {
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]; //
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";
char cross_compile[256] = "";
for (int i = 1; i < argc; i++)
{
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++)
{
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;
}