美文网首页
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