Makefile生成器,使用C++和Boost实现
今天学习了一下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实现的更多相关文章
- boost 随机数发生器
Random 随机数 在很多应用中都需要使用随机数.本库力求提供一个高效的,通用的随机数库.boost库有多种随机数生成方式.先熟悉一下各种随机数生成器的概念. 数字生成器(Number Ge ...
- Android学习——windows下搭建NDK_r9环境
1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...
- NDK开发
1 CDT 是 Eclipse 插件,它将把 Eclipse 转换为功能强大的 C/C++ IDE. C/C++在Eclipse平台下的开发工具.它提供的功能包括:C/C++编辑器(一些基本的功能:语 ...
- Java开源项目(备查)
转自:http://www.blogjava.net/Carter0618/archive/2008/08/11/221222.html Spring Framework [Java开源 J2EE框 ...
- qmake和moc的功能(★firecat推荐★)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/355100 前面我们 ...
- Qt核心剖析: moc
前面我们说过,Qt 不是使用的“标准的” C++ 语言,而是对其进行了一定程度的“扩展”.这里我们从Qt新增加的关键字就可以看出来:signals.slots 或者 emit.所以有人会觉得 Qt 的 ...
- Android下NDK开发环境搭建
Android下NDK开发环境搭建 1. AndroidNDK安装与配置 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...
- Caffe源码中common文件分析
Caffe源码(caffe version:09868ac , date: 2015.08.15)中的一些重要头文件如caffe.hpp.blob.hpp等或者外部调用Caffe库使用时,一般都会in ...
- QObject 源代码阅读
我们进入 qt/src 文件夹.你可能对这里的目录名时曾相识,因为几乎这里的所有文件夹名都对应着 Qt 的模块的名字:gui,network,multimedia等等.我们从最核心的 QtCore 开 ...
随机推荐
- Java Http连接中(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)
使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任何其他类库.所有有时候大家就直接使用它来完成一些简单(或复杂)的功能.但是你活在伟大的{print ...
- HDU 4681 String(2013多校8 1006题 DP)
String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Subm ...
- [js]uploadify结合jqueryUI弹出框上传,js中的冒出的bug,又被ie坑了
引言 最近在一个项目中,在用户列表中需要对给没有签名样本的个别用户上传签名的样本,就想到博客园中上传图片使用弹出框方式,博客园具体怎么实现的不知道,只是如果自己来弄,想到两个插件的结合使用,在弹出框中 ...
- 字符串转base64,base64转字符串
[JavaScript原生提供两个Base64相关方法] btoa():字符串或二进制值转为Base64编码 atob():Base64编码转为原来的编码 备注:利用这两个原生方法,我们来封装一下,标 ...
- MySql_SQLyog+SQL Assistant实现智能提示
相信用过sqlserver+SQL Assistant的同学都知道其智能提示多么方便,但是转到mysql后,无论是使用navicat还是webbench都无法实现较好的智能提示效果, 最终在网上找到使 ...
- Jacob的使用出错总结
转自:http://blog.163.com/wm_at163/blog/static/13217349020114166447941/ Jacob的使用方法: 1.在工程中导入 jacob.jar ...
- drupal7整合Discuz康盛UC用户中心ucenter,ucuser模块
drupal7整合Discuz康盛UC用户中心ucenter,ucuser模块Drupal7整合UC用户心的模块,ucenter,康盛这个用户中心我就不多说了哈.参考了以前不知在哪里下载的一个drup ...
- iFrame的妙用
(作者: Glen,返利网资深工程师,曾在EA等公司任职) 最近工作有个在项目-布兜收藏夹.简言之就是将喜欢的图片收藏到布兜页面上来,这其中用到了很多关于iframe的方面,总结如下: 1. 作为弹出 ...
- 用CSS hack技术解决浏览器兼容性问题
什么是CSS Hack? 不同的浏览器对CSS的解析结果是不同的,因此会导致相同的CSS输出的页面效果不同,这就需要CSS Hack来解决浏览器局部的兼容性问题.而这个针对不同的浏览器写不同的CSS ...
- C#中载入界面的几种做法
1. 采用事件委托的方法 对象:主窗体:FrmMain 加载窗体:FrmLoading 思路: 在主窗体加载前显示窗体FrmLoading,当主窗体加载完毕后(第一次显示的时候),关闭FrmLo ...