博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Makefile生成器,使用C++和Boost实现
阅读量:6761 次
发布时间:2019-06-26

本文共 3139 字,大约阅读时间需要 10 分钟。

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

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

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

以下是源码:

makemake.cpp:

#include 
 #include
 #include
 #include
 #include
 #include
 #include
 #include
 #include
 #include
 using namespace std;  namespace po = boost::program_options;  using namespace boost::filesystem;  using namespace boost;  void getFiles(vector
& 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
src;      string compiler = "g++";      string target = "a";      vector
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
(), "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
();          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
& 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。

转载地址:http://jrfeo.baihongyu.com/

你可能感兴趣的文章
区间查询[2009国家集训队]小Z的袜子(hose)
查看>>
Android之使用微信开放api (三)---注册与反注册应用到微信
查看>>
我是怎样看待微博的
查看>>
论《我是如何安慰女友的》
查看>>
nullnull用宏定义swap(x,y)
查看>>
菜鸟学Java(一)——Ajax异步检查用户名是否存在
查看>>
【Javascript】类,封装性 -- 1
查看>>
Mono for Android安装配置破解
查看>>
uploadfy 常见问题收集
查看>>
WPF----数据绑定
查看>>
子类化GetOpenFileName/GetSaveFileName, 以及钩子函数OFNHookProc的使用的简要说明
查看>>
C语言中判断int,long型等变量是否赋值的方法
查看>>
leetcode -- Longest Valid Parentheses
查看>>
中位数与第K小元素
查看>>
详解JAVA输出Hello World
查看>>
概率问题随笔
查看>>
关于在堆中创建字符串对象的疑惑
查看>>
poj1077(康托展开+bfs+记忆路径)
查看>>
hibernate 树状映射
查看>>
值得 Web 开发人员收藏的20个 HTML5 实例教程
查看>>