美文网首页
Poritng opencc to macOS & linux

Poritng opencc to macOS & linux

作者: Neuroway | 来源:发表于2018-06-02 14:12 被阅读0次

命令行基础教程

可以先去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

相关文章

网友评论

      本文标题:Poritng opencc to macOS & linux

      本文链接:https://www.haomeiwen.com/subject/lqdrsftx.html