通用Makefile

引言:

    在去年(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;
}

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值