完成通用功能需要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("选项: "); printf(" -c, --create create Makefile "); printf(" -n, --name [=<target name>] target name, need -c "); printf(" -g, --gcc [=<cross compile>] cross compile, need -c "); printf(" -s, --scan scan ./src dir *.c and *.h "); 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("#生成可执行文件名字 TARGET := #指定交叉工具链 CROSS_COMPILE = ") + strlen(Makefile) + strlen(cross_compile)); sprintf(str, "#生成可执行文件名字 TARGET := %s #指定交叉工具链 CROSS_COMPILE = %s %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 ", 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 ", &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! "); 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└── 33[40;33m%s 33[0m ", t, &name_c[j][0]); } else { printf("%s├── 33[40;33m%s 33[0m ", 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] = '