命令行基础教程
可以先去runoob.com 上面来看一看哈
命令的基本格式是(中间是空格分割,参数数量可能有限制,请参考man)
[路径(可有可无)] 命令名称 参数1 参数2 参数3 ………
具体而言,这里的命令名称应该叫做可执行文件名称,这之中有些复杂的部分会在下文提及。
譬如
ls.. 这个命令之中 ls就是命令名称,参数1就是.. 同时我们注意到ls前面并没有路径标示,所以Shell会自动按照一定规则来搜索ls这个命令
敲黑板: 不熟悉的命令 可以在Shell中运行下面的语句来查看用法参考
man #### ####就是需要查找的命令
Shell 一般支持使用【Tab】按键来补全文件名或者可以用来补全某些命令的参数(--interactive)、命令的名称(比如gcc,g++)
两个特殊目录
.本级目录
..上一级目录
一些重要的命令(为了美观而大写,事实上全部小写)
PWD 查看我在哪个目录里
CD 进入某个目录
WHICH 查看某个命令对应哪个可执行文件(在哪个目录)
WHICH LS 就可以看到类似/usr/bin/ls的定位结果
LS 列出某个目录内的子目录和文件列表(请注意,LL = LS -L)
LS【参数】【文件夹路径】
参数–L : 用列表呈现
参数–A : 展示隐藏内容(文件名以小数点开头的文件是默认隐藏的)
MKDIR 创建目录
MKDIR[目录名]
MV 移动文件/更名 (也可以移动文件夹哦)
MV [可有可无的参数] 【源位置】【目标位置】
CP 拷贝文件
CP【可有可无的参数】 【源文件】 【目标文件】
如果需要拷贝目录, 则需要使用–R 参数,为了不出现繁琐的重复的拷贝确认提示,可以使用-F参数
CAT 查看某个文件 / 在Shell中展示
MORE 翻页来查看某个文件(CAT的翻页模式?)
EMACS/ VIM 编辑某个文件
FIND 列出所有文件和子目录中的文件(LS 的递归版)
FIND 【目录名称】
可以配合GREP 使用
FIND 某个目录| GREP “文件名包含的关键字”
GREP 在文件/Shell的结果进行文本查找
GREP 【参数】 【想查找的正则表达式/文本】
GREP –RN “某些内容” * 在当前目录(包含子目录)内查找所有文件中的某些内容
GIT
DU 查看文件大小
LN创建LINK 文件链接
LN【参数】 【源文件】【目标文件】
参数–S 创建符号链接(依靠路径来找源文件, 否则默认是通过文件实际的扇区号码来找源文件)
DF查看磁盘信息
CHMOD更改文件、文件夹的属性
CHOWN更改所有权
建立git仓库
(using github / gogs SERVER),
git 使用方法:
克隆(下载项目主目录)
git clone https://xxx.com/xxxxxxxx
查看项目历史
git log
查看当前文件状态
git status
提交某个文件,COMMIT
git add ##### ####是要添加的
git commit -m "Commit Message"
推送到远程
git push
从远程更新
git pull
Makefile
Makefile 是控制GCC等编译器进行批量编译、依赖解决的工具。
系统包括多个重要功能 :
a. 其中有编译目标Target(库、可执行文件等),
b. 控制编译参数 Compile Option,
c. 管理编译目标包含哪些文件Source File(文件C/CPP文件路径),
d. 程序包含目录(Include Dir),
e. 编译定义(Definition, 等效于 C/C++文件中的#define,只不过是在文件外部,编译器层面进行定义)
Makefile 语法
Makefile的执行逻辑 是 根据Makefile的内容来
核心语法有两种
.XXXX 小数点开头 | 特殊用法,请参考Make官方文档
MMMM 直接运行某个命令
AAA= BBB 变量赋值操作
Install: … 定义某个Target目标
ifeq/ else … 调用Makefile函数(比如IFeq判断相等,ENDIF 结束判断函数等)
MakeFile 调试
$(warning),$(info), $(error)
为了查看MakeFile之中的变量的值、或者MakeFile
$(warning ####) --> #### 就是要显示的内容
例如,在Makefile中添加 $(warning This is a makefile message)一行
就可以在运行 make 生成时 输出 类似
~/xc5/build/Makefile:203
: This is a makefile message
的内容,
$(###)
这个符号就是用来引用###这个变量的值
比如 Makefile中想要重复使用某个值,就会用变量来代替
CLUPS = osprey-my -klvm
PS = $(CLUPS)-qqk
执行上面两行之后,PS 的值就会变成osprey -my –klvm –qqk
可以在$(warning) 中使用$(###) 来输出某个###变量的内容
$(warning$(#####)) 来输出#####的内容
$(files)
这个TOKEN有特殊含义、用途请参考Google
3. CMake 的变量,分层
4.Open64 文件夹结构
核心目录
OPEN64
\configure (BUILD目录生成器,Makefile初始化器)
\OSPREY --核心的项目代码源文件目录(SOURCE)
\#### --某个单独的模块
\Makefile.gbase 模块的核心Makefile,配合全局Makefile使用
\*****.c 模块内部的c源文件
\*****.cxx 模块内部的c++源文件
\WGEN --WGEN模块
\IR_TOOLS -- IR-TOOLS模块
BUILD目录 (需要手动mkdir 新建的,用来分离编译结果,
用CONFIGURE 来初始化的)
\OSPREY 核心代码生成目录
\Makefile.gsetup -- 全局变量Makefile 的初始化
\TARGDIR 核心模块生成目录(20个左右 生成目录)
\TARGDIR_LIB 基础库生成目录
5. Makefile之间的关系
入口:
在BUILD/Osprey/targdir/某个模块/Makefile 是某个模块的核心Makefile,
这个Makefile 操作两件事情
[if !supportLists]A. [endif]去加载全局变量 (../../Makefile.gsetup)
[if !supportLists]a) [endif]gsetup 会去加载 host对应的
OPEN64/osprey/linux/make 下面的
[if !supportLists] i. [endif]gcommondef, (全局Definition)
[if !supportLists] ii. [endif]gcommonrules(全局生成RULE)
B.去实际调用模块的生成Makefile(OPEN64/Osprey/某个模块/Makefile.gbase),来实际运行编译(GCC/LD),生成最终的目标:可执行文件
CMAKE 编译
1.首先CD进入要生成文件的目录,
2. 运行 cmake 【有CMakeLists.txt的文件夹路径】
譬如,在 opencc-cmake /cmake-build-debug目录中运行
cmake .. (生成全部)
cmake ../irtools/ (只生成IR_TOOLS)
cmake ../libcomutils/ (只生成LIBCOMUTILS)
3. make 【可选(Target 名称)】
7. 编译并测试Wgen(whirl generator)
刚刚说到的结果测试在Ubuntu上使用readelf
可以用 opencc_cmake 我们生成的ir_size 来查看
在opencc_cmake/cmake-build-debug中操作:
./ir_size../wgen/t1.B
注意区分之前说过的几个事情
1. 在Ubuntu上编译,测试wgen (gdb调试)
2. 在macOS用我们的opencc_cmake 项目来生成irtools,wgen
这个可以用 lldb调试
3. 用wgen实际转换一个spin文件到whirl .B 的文件,
.B 的文件可以用
1.
opencc_cmake/cmake-build-debug/irtools 里面的 ir_size 来查看 .B 的分段情况
1. Ubuntu上系统自带的readelf来识别,查看
可以使用 readelf -a XXXX.B 来打开 XXXX.B 文件,并显示基本信息
readelf -p PART_NAME
XXX.B 可以查看XXX.B 内的 PART_NAME 这部分的string信息(请参考 readelf --help)
8. TODO
a. 关注系统API, LIBC / LIBC++(API和标准的差异/STDC++/C++的差异)
库之中包含的内容
b. MACOS / DARWIN /XNU
c. 区分Chipset ,
d. 区分HOST,TARGET
e. 熟悉单个模块的功能,实现内容
VCG.cxx
添加宏定义:BUILD_OS_MACOS不使用malloc.h
STRTAB.cxx
替换了HASH_TABLE -> STRTAB
修改了insert函数,返回 idx(基于buffer的偏移),中间使用unordered_map来替代hash_table
SYMTAB.cxx
修改: 使用unordered_map替代hash_map,
添加:#include