今天学习了一下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. oc/object-c/ios哪种遍历NSArray/NSDictionary方式快?测试报告

    做app的时候,总免不了要多次遍历数组或者字典.究竟哪种遍历方式比较快呢?我做了如下测试:首先定义测试用宏: ? 1 2 3 4 5 6 7 8 9 #define MULogTimeinterval ...

  2. text段,data段,bss段,堆和栈

    转载:http://blog.chinaunix.net/uid-29025972-id-3874376.html   程序编译后生成的目标文件至少含有三个段,分别为:.text..data和.bss ...

  3. 【提醒】使用 iptables 时,特别注意 规则的顺序

    在 centos 上安装 redis 服务器,很快就搞定了,服务器上使用 redis-cl 测试都没有问题了. 但到宿主机上测试,怎么测试都不通过,关键是:关闭了 centos 的 Iptables ...

  4. Ant简单工程的构建

    1.在Ant的官方网站http://ant.apache.org/bindownload.cgi下载Ant最新版本(我下载的是apache-ant-1.8.2-bin.zip),Ant无需安装,直接解 ...

  5. Unity3D如何减少安装包大小

    译官方文档:http://docs.unity3d.com/Manual/ReducingFilesize.html PDF文档:http://www.rukawa.cn/Uploads/Attach ...

  6. MySQL索引优化案例

    这里我们分成三种情况进行分析,分别是单表,两表,三表 1.单表 CREATE TABLE IF NOT EXISTS `article`( `id` ) NOT NULL PRIMARY KEY AU ...

  7. ECharts学习总结(五):echarts的Option概览

    注:下面内容摘自echarts官网,原文地址:http://echarts.baidu.com/doc/doc.html#%E9%80%89%E9%A1%B9 option 图表选项,包含图表实例任何 ...

  8. zend studio 13.6.1 安装+破解+汉化

    zend studio 13.6.1 X64 安装+破解+汉化+补丁 一.下载相关文件 1.官网原版下载 : http://downloads.zend.com/studio-eclipse/13.6 ...

  9. 理解GC

    首先看日志内容:  [Full GC 23.32: [ParNew: 2356K->2310K(3251K), 0.000288sec] [Full GC 是名称. [ParNew:是表示收集器 ...

  10. GIS中要素的捕捉以及C++实现

    这篇文章早在去年就写出来了,但是由于当时毕业论文有一段是直接引用了我的这篇文章,怕引起查重的麻烦就删掉了,在此,重新挂出来和大家一起分享. 要素的选择,也称为要素的捕捉,在CAD.计算机图形学和地理信 ...