编译和安装

操作步骤

  1. 使用PuTTY工具,以root用户登录服务器。
  2. 执行以下命令进入源码安装目录。

    cd /path/to/MEGAHIT

  3. 执行以下命令解压源码包。

    tar -xvf v1.2.9.tar.gz

  4. 执行以下命令进入解压后的文件夹。

    cd megahit-1.2.9

  5. 执行以下命令修改“CMakeLists.txt”文件。

    1. 打开“CMakeLists.txt”文件。
      vi CMakeLists.txt
    2. 按“i”进入编辑模式,修改如下内容。
      修改前:
      6     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
      …
      76 set_target_properties(megahit_core PROPERTIES COMPILE_FLAGS "-mbmi2 -DUSE_BMI2 -mpopcnt")
      77 set_target_properties(megahit_core_popcnt PROPERTIES COMPILE_FLAGS "-mpopcnt")
      修改后:
      6     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -march=armv8.2-a")
      …
      76 set_target_properties(megahit_core PROPERTIES COMPILE_FLAGS "")
      77 set_target_properties(megahit_core_popcnt PROPERTIES COMPILE_FLAGS "")
    3. 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。

  6. 执行以下命令切换目录。

    cd ./src/utils/

  7. 执行以下命令拷贝鲲鹏代码迁移工具中的头文件到当前目录。

    cp /path/to/PORT_ADVISOR/portadv/tools/inline_asm/config/KunpengTrans.h ./

  8. 执行以下命令修改代码“cpu_dispatch.h”。

    vi cpu_dispatch.h

    新增代码已标记:

    #if defined(__aarch64__)       //新增代码
      #include "KunpengTrans.h"     //新增代码
    #endif      //新增代码
     
    #ifndef MEGAHIT_CPU_DISPATCH_H
    #define MEGAHIT_CPU_DISPATCH_H
     
    inline bool HasPopcnt() {
      unsigned eax, ebx, ecx, edx;
    #ifdef _MSC_VER
      int cpuid[4];
      __cpuid(cpuid, 1);
      eax = cpuid[0], ebx = cpuid[1], ecx = cpuid[2], edx = cpuid[3];
    #else
    #if defined(__x86_64__)    //新增代码
      asm volatile("cpuid\n\t"
                   : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
                   : "0"(1));
    #elif defined(__aarch64__)    //新增代码
      {
        eax = 1;      //新增代码
        GetSupportedCPUID(&eax,&ebx,&ecx,&edx);     //新增代码
      }
    #endif  //新增代码
    #endif
      return ecx >> 23U & 1U;
    }
     
    inline bool HasBmi2() {
      unsigned eax, ebx, ecx, edx;
    #ifdef _MSC_VER
      int cpuid[4];
      __cpuidex(cpuid, 7, 0);
      eax = cpuid[0], ebx = cpuid[1], ecx = cpuid[2], edx = cpuid[3];
    #else
    #if defined(__x86_64__)    //新增代码
      asm volatile("cpuid\n\t"
                   : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
                   : "0"(7), "2"(0));
    #elif defined(__aarch64__)        //新增代码
      {
        eax = 7;    //新增代码
        ecx = 0;    //新增代码
        GetSupportedCPUID(&eax,&ebx,&ecx,&edx);    //新增代码
      }
    #endif    //新增代码
    #endif
      return ebx >> 8U & 1U;
    }
     
    #endif  // MEGAHIT_CPU_DISPATCH_H

  9. 执行以下命令切换目录。

    cd ../kmlib/

  10. 执行以下命令修改代码kmrns.h,替换头文件。

    vi kmrns.h
    修改前:
    #include <x86intrin.h>
    修改后:
    #include <sse2neon.h>

  11. 执行以下命令拷贝sse2neon.h头文件到src目录。

    cp /path/to/SSE2NEON/sse2neon-1.5.0/sse2neon.h /path/to/MEGAHIT/megahit-1.2.9/src

  12. 执行以下命令创建并进入构建文件夹。

    mkdir /path/to/MEGAHIT/build && cd /path/to/MEGAHIT/build

  13. 执行以下命令进行编译安装。

    CC=`which gcc` CXX=`which g++` cmake -DCMAKE_INSTALL_PREFIX=/path/to/MEGAHIT -DCMAKE_BUILD_TYPE=Release ../
    make -j 16
    make install

  14. 执行以下命令加载环境变量。

    export PATH=/path/to/MEGAHIT/bin:$PATH