zoukankan      html  css  js  c++  java
  • Makefile学习2——通用模板的生成

    完成通用功能需要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%s33[0m
    ", t, &name_c[j][0]);
                }
                else
                {
                    printf("%s├── 33[40;33m%s33[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] = '';
                        break;
                    }
                }
                
                /* 添加编译文件 */
                sprintf(str, "obj-y += %s
    ", 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└── 33[40;31m%s33[0m
    ", 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├── 33[40;31m%s33[0m
    ", 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/
    ", &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

    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    网上搜的逆元知识
    关于树的一点学习【清北学堂】
    矩阵乘法和斐波那契数列【清北学堂】
    Luogu【P1130】红牌(DP)
    Luogu【P1901】发射站(单调栈)
    Oracle_PL/SQL(1) 匿名块
    Oracle_SQL(7) 复杂查询
    Oracle_SQL(6) 单行函数
    Oracle_SQL(5) 连接和子查询
    Oracle_SQL(4) DDL 表和约束
  • 原文地址:https://www.cnblogs.com/Rainingday/p/12871256.html
Copyright © 2011-2022 走看看