今天学习了一下Boost的文件遍历功能,同一时候发现GNU编译器有-MM选项。能够自己主动生成依赖关系,于是利用以上两点写了一个Makefile生成器。

能够生成一般的单个可运行文件的Makefile。使用的是Windows+Mingw+boost环境。假设使用Linux,仅仅需在程序中的两个System系统调用处和clean标签生成处将del 改成rm相关操作就好了。

如今更改成了Linux版本号。下载的版本号是Windows的。

以下是源码:

makemake.cpp:

#include <iostream>  
#include <fstream>  
#include <cstdlib>  
#include <vector>  
#include <string>  
#include <exception>  
#include <boost/filesystem/operations.hpp>  
#include <boost/filesystem/path.hpp>  
#include <boost/algorithm/string.hpp>  
#include <boost/program_options.hpp>   using namespace std;  
namespace po = boost::program_options;  
using namespace boost::filesystem;  
using namespace boost;   void getFiles(vector<string>& src);   const string head = string(  
"######################################################################\n")+  
"# This makefile is generated by makemake.                            #\n"+  
"# By Eric Brown.                                                     #\n"+  
"# 2014/10/27                                                         #\n"+  
"######################################################################\n";   int main(int argc, char* argv[])  
{  
    vector<string> src;  
    string compiler = "g++";  
    string target = "a";  
    vector<string> objs;  
    bool debug = false;       try  
    {  
        po::options_description desc("---Help---");  
        desc.add_options()  
            ("help,h", "print this message.")  
            ("gcc,c", "use gcc compiler. Program uses g++ default.")  
            ("debug,g", "use debug option(-g) in makefile.")  
            ("out,o", po::value<string>(), "the target file name.");  
        po::positional_options_description p;  
        p.add("out", -1);  
        po::variables_map vm;  
        po::store(po::command_line_parser(argc, argv).options(desc).  
                positional(p).run(), vm);  
        po::notify(vm);           if (vm.count("help"))  
        {  
            cout << desc << endl;  
            return 0;  
        }  
        if (vm.count("gcc"))  
            compiler = "gcc";  
        if (vm.count("out"))  
            target = vm["out"].as<string>();  
        if (vm.count("debug"))  
            debug = true;  
    } catch(std::exception& e) {  
        cout << e.what() << endl;  
        return 1;  
    }       getFiles(src);       ofstream make;  
    make.open("Makefile", ios_base::out);       make << head << endl;  
    make << "CC = " << compiler << endl;  
    make << "Flags = " << endl;  
    make << "LIBS = ";
    if (debug)  
        make << "-g";       make << endl;       make << "src = ";  
    for (int i = 0; i < src.size(); ++i)  
    {  
        make << src[i] << ' ';  
        std::system(string(compiler + " -MM \"" + src[i] + "\" >> .temp~").c_str());  
    }       make << "\nObjs = ";  
    for (int i = 0; i < src.size(); ++i)  
    {  
        if (ends_with(src[i], ".cpp"))  
            objs.push_back(replace_last_copy(src[i], ".cpp", ".o"));  
        if (ends_with(src[i], ".c"))  
            objs.push_back(replace_last_copy(src[i], ".c", ".o"));  
        make << objs[i] << ' ';  
    }  
    make << endl;       make << '\n' << target << ": $(Objs)" << endl;  
    make << "\t$(CC) $(Flags) $(Objs) -o " << target << " ${LIBS}" << endl;  
    make << "$(Objs): $<" << endl;
    make << "\t$(CC) $(Flags) $< -c\n" << endl;       ifstream in(".temp~");  
    string line;  
    while(getline(in, line))  
        make << line << endl;  
    make << endl;       make << "clean:" << endl;  
    make << "\trm -f ${Objs}" << endl;  
    make << "cleanbak:" << endl;  
    make << "\trm -f *~" << endl;  
    in.close();       std::system("rm -f .temp~");       make.close();       return 0;  
}   void getFiles(vector<string>& src)  
{  
    path p = current_path();  
    directory_iterator beg(p);  
    directory_iterator end;  
    for (; beg != end; beg++)  
    {  
        string name = beg->path().filename().string();  
        if (ends_with(name, ".cpp") ||  
                ends_with(name, ".c"))  
            src.push_back(name);  
    }  
}  

可运行程序能够在这里下载:http://download.csdn.net/detail/pdcxs007/8090981。

Makefile生成器,使用C++和Boost实现的更多相关文章

  1. boost 随机数发生器

    Random     随机数 在很多应用中都需要使用随机数.本库力求提供一个高效的,通用的随机数库.boost库有多种随机数生成方式.先熟悉一下各种随机数生成器的概念. 数字生成器(Number Ge ...

  2. Android学习——windows下搭建NDK_r9环境

    1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...

  3. NDK开发

    1 CDT 是 Eclipse 插件,它将把 Eclipse 转换为功能强大的 C/C++ IDE. C/C++在Eclipse平台下的开发工具.它提供的功能包括:C/C++编辑器(一些基本的功能:语 ...

  4. Java开源项目(备查)

    转自:http://www.blogjava.net/Carter0618/archive/2008/08/11/221222.html Spring Framework  [Java开源 J2EE框 ...

  5. qmake和moc的功能(★firecat推荐★)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/355100 前面我们 ...

  6. Qt核心剖析: moc

    前面我们说过,Qt 不是使用的“标准的” C++ 语言,而是对其进行了一定程度的“扩展”.这里我们从Qt新增加的关键字就可以看出来:signals.slots 或者 emit.所以有人会觉得 Qt 的 ...

  7. Android下NDK开发环境搭建

    Android下NDK开发环境搭建 1.     AndroidNDK安装与配置 1.1  NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...

  8. Caffe源码中common文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中的一些重要头文件如caffe.hpp.blob.hpp等或者外部调用Caffe库使用时,一般都会in ...

  9. QObject 源代码阅读

    我们进入 qt/src 文件夹.你可能对这里的目录名时曾相识,因为几乎这里的所有文件夹名都对应着 Qt 的模块的名字:gui,network,multimedia等等.我们从最核心的 QtCore 开 ...

随机推荐

  1. Appium+python自动化18-brew、carthage和appium-doctor

    前言 本篇安装brew.carthage,解决启动appium时的报错问题,另外安装appium-doctor检查appium的环境 1.brew 2.carthage 3.appium-doctor ...

  2. 美国保健品品牌介绍之Now Foods

    Now Foods是美国著名的美国保健品品牌,定位于大众品牌. 美国Now Foods公司位于美国伊利诺州,台湾中文名叫健而婷,成立于1968年,是美国保健品市场上名列三甲的国际知名的天然保健品牌,其 ...

  3. 代码规范审查 – Sonar分析项目

    Sonar搭建成功之后,就可以通过简单的CMD指令进行项目分析,此篇主要介绍使用Sonar来分析.net项目. 扫描步骤: a.    打开CMD,切换到指定的项目根目录,和.sln同级目录即可(此处 ...

  4. Table里td中的文本过长,设置不换行,随内容同行显示(转载)

    当td中内容过长时,内容会溢出,换行显示,美观超级差,在td里设置这个属性 "white-space:nowrap   就可以解决排版问题啦 <td style="white ...

  5. [Android Studio] Android Studio底边栏选项不见了,如何调出来

    转载:http://blog.csdn.net/hyr83960944/article/details/38067785 Android Studio底边有一个选项栏,包含了Run,Android等等 ...

  6. 深度学习Deep learning

    In the last chapter we learned that deep neural networks are often much harder to train than shallow ...

  7. [Todo] Redis里面队列的两种模式,以及抢红包在Redis中的实现

    两种队列模式: 一种是利用list的lpush/rpop等 另一种是redis自带的发布者/订阅者模式 http://www.cnblogs.com/alazalazalaz/p/5512258.ht ...

  8. [Compose] 17. List comprehensions with Applicative Functors

    We annihilate the need for the ol' nested for loop using Applicatives. For example we have this kind ...

  9. GIL线程全局锁 协程

    GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务 ...

  10. 【转】IT新人如何快速成长

    主动积极 主动积极包括很多方面了,主动学习.主动思考.主动承担责任等等.我觉得主动性很重要,如果你能做到这一点,那么肯定会把工作做的很好的. 学会学习 公司不是学校,需要改变由老师灌输知识的学习方式. ...