编译与安装

在Linux和Mac下的编译和安装

./config
make
make test
sudo make install

在Window下的编译和安装

安装ActivePerl和Visual Studio,以管理员身份打开Visual Studio Tools下的Developer Command Prompt控制台并运行:

perl Configure VC-WIN32
nmake
nmake install

下面是一些常见的编译错误及原因:

  1. 安装最新的Visual Studio版本,不要使用Visual C++ 6、Visual Studio 2008。
  2. 确保从一份干净的(没有已经编译出来的对象文件或汇编文件)最新Master分支源代码开始编译。
  3. 编译系统没有找到nmake。实际上nmake是Visual Studio自带的工具,不需要单独安装。编译系统无法找到nmake的原因是没有在Visual Studio的命令行环境下执行编译指定。
  4. 无法执行nmake install。这个命令需要以管理员的身份执行。
  5. 对象文件(.obj)和目标平台不一致,通常是由于在Visual Studio的32位控制台下执行perl Configure VC-WIN64A;或者在Visual Studio的64位控制台下执行perl Configure VC-WIN32导致的。

编译Android目标文件

针对Android/ARM目标平台,需要先安装Android SDK/NDK。设置交叉编译环境后,可以直接用GmSSL内置的编译系统进行编译。下面的脚本给出了交叉编译的示例,需要根据安装的SDK位置及预计的平台编号修改ANDROID_PATHPLATFORM_VERSION的值。

#!/bin/bash

ANDROID_PATH=/path/to/android/sdf/
PLATFORM_VERSION=22

MAKE_TOOLCHAIN=$ANDROID_PATH/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh
export TOOLCHAIN_PATH=$ANDROID_PATH/android-toolchain-arm
$MAKE_TOOLCHAIN --arch=arm --platform=android-$PLATFORM_VERSION --install-dir=$TOOLCHAIN_PATH

export MACHINE=armv7
export SYSTEM=android
export ARCH=arm
export CROSS_SYSROOT=$TOOLCHAIN_PATH/sysroot
export TOOL_BASENAME=$TOOLCHAIN_PATH/bin/arm-linux-androideabi
export CC=$TOOL_BASENAME-gcc
export CXX=$TOOL_BASENAME-g++
export LD=$TOOL_BASENAME-ld
export LINK=$CXX
export AR=$TOOL_BASENAME-ar
export RANLIB=$TOOL_BASENAME-ranlib
export STRIP=$TOOL_BASENAME-strip

./config
make

编译完成后,可以生成面向Android目标平台的二进制库和gmssl可执行程序。

如需调用GmSSL的Java API,可以参考Android NDK的示例。

编译iPhone OS目标文件

export CC=clang
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
export CROSS_SDK=iPhoneOS.sdk
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
./Configure ios64-cross no-shared --prefix=/usr/local/openssl-ios64
make

编译Java接口

由于GmSSL编译脚本还不能实现在所有操作系统上自动编译Java接口代码,因此编译脚本中默认没有启用Java接口的编译。 开启方式如下: 在源代码根目录下找到Configure文件,找到

$config{dirs} = [ "crypto", "ssl", "engines", "apps", "util", "tools", "fuzz", "test" ];

这一行,并将其修改为

$config{dirs} = [ "crypto", "ssl", "engines", "apps", "util", "tools", "fuzz", "test", "java" ];

重新编译,则可以自动编译java目录下的C代码和Java代码,并生成libgmssljni动态库和GmSSL.class。 这个模块的编译目前在Mac下可以测试通过。