64位《操作系统真象还原》makefile文件一键修改
我在学习《操作系统真象还原》的时候到了需要makefile那里,因为是64位系统所以需要改的地方还是蛮多的,大概要改个三、四处,很是麻烦啊,后来makefile多了起来,实在是不能再手动改了,太麻烦,就写了一个程序。
首先在bochs/bin下创建cm.cpp
这个程序的功能是这样:
- 用户输入文件夹路径
- 程序将文件夹中的makefile改成我们想要的样子(可直接在64位ubuntu上运行了)
为了让cm能在任何路径下都运行,所以我将它移到了/usr/bin中。
你可能想到了,哈哈这很麻烦还要手动输入路径,还不如直接copy到那个文件夹呢,可这样每一个文件夹都会有一个拷贝,也很麻烦。
所以我就又写了一个别名:ma
这个别名每次都直接把当前路径(pwd的结果) 当成cm的输入,这样子我们在任意路径下输入mado都可以修改ma啦。具体操作如下图
以后在任何路径下输入ma,就会将makefile改成我们想要的形式啦
cm.cpp代码
#include <fstream>
#include<iostream>
#include<vector>
#include<string>
using namespace std;
const string mypath = "/home/linxi/bochs/bin/"; // 改成你自己的路径
const string file("makefile");
const string CFLAGS ("CFLAGS = -Wall $(LIB) -c -fno-builtin -W -Wstrict-prototypes \\");
const string change_CFLAGS ("-m32 -fno-stack-protector");
const string LDFLAGS("LDFLAGS = -Ttext $(ENTRY_POINT) -e main -Map $(BUILD_DIR)/kernel.map");
const string change_LDFLAGS("-m elf_i386 ");
const string mk_dir(" if [[ ! -d $(BUILD_DIR) ]];then mkdir $(BUILD_DIR);fi");
const string change_mk_dir(" if [ ! -d $(BUILD_DIR) ];then mkdir $(BUILD_DIR);fi");
int main(int argc ,char ** argv)
{
ios::sync_with_stdio(false);
string path;
cin >> path;
system((string("cd ") + path).c_str());
ifstream fin(file);
fin.tie(0);
string s;
vector<string> vc;
while(getline(fin,s)) vc.push_back(s) ;
ofstream fut(file) ;
for(auto & s : vc)
{
if(s == CFLAGS)
s.replace(s.find("-fno-builtin") , string("-fno-builtin").size(),change_CFLAGS);
else if(s == LDFLAGS)
s.insert(s.find("= ") + 2 ,change_LDFLAGS);
else if(s.find("hd60M.img") != -1)
s = " of=" + mypath + s.substr(s.find("hd60M"));
else if(s == mk_dir)
s = change_mk_dir;
fut << s << '\n';
}
return 0;
}