Update INSTALL.md

This commit is contained in:
Zhi Guan
2026-06-21 10:16:50 +08:00
parent df66e689aa
commit 51370bd616
4 changed files with 113 additions and 64 deletions

View File

@@ -865,7 +865,7 @@ endif()
# #
set(CPACK_PACKAGE_NAME "GmSSL") set(CPACK_PACKAGE_NAME "GmSSL")
set(CPACK_PACKAGE_VENDOR "GmSSL develop team") set(CPACK_PACKAGE_VENDOR "GmSSL develop team")
set(CPACK_PACKAGE_VERSION "3.2.0-dev.1140") set(CPACK_PACKAGE_VERSION "3.2.0-dev.1141")
set(CPACK_PACKAGE_DESCRIPTION_FILE ${PROJECT_SOURCE_DIR}/README.md) set(CPACK_PACKAGE_DESCRIPTION_FILE ${PROJECT_SOURCE_DIR}/README.md)
set(CPACK_NSIS_MODIFY_PATH ON) set(CPACK_NSIS_MODIFY_PATH ON)
include(CPack) include(CPack)

View File

@@ -4,24 +4,52 @@
## 概述 ## 概述
GmSSL当前版本采用CMake构建系统。由于CMake是一个跨平台的编译、安装工具因此GmSSL可以在大多数主流操作系统上编译、安装和运行。GmSSL项目官方测试了Windows (包括Visual Stduio和Cygwin)、Linux、Mac、Android和iOS这几个主流操作系统上的编译并通过GitHub的CI工作流对提交的最新代码进行自动化的编译测试。 GmSSL当前版本采用CMake构建系统。由于CMake是一个跨平台的编译、安装工具因此GmSSL可以在大多数主流操作系统上编译、安装和运行。GmSSL项目官方测试了Windows (包括Visual Studio和Cygwin)、Linux、macOS、Android和iOS这几个主流操作系统上的编译并通过GitHub的CI工作流对提交的最新代码进行自动化的编译测试。
和其他基于CMake的开源项目类似GmSSL的构建过程主要包含配置、编译、测试、安装这几个步骤。以Linux操作系统环境为例在下载并解压GmSSL源代码后进入源代码目录执行如下命令 和其他基于CMake的开源项目类似GmSSL的构建过程主要包含配置、编译、测试、安装这几个步骤。默认配置会生成动态库;如果需要静态库,可以在配置阶段设置`-DBUILD_SHARED_LIBS=OFF`
### Linux/macOS源码安装
在Linux或macOS环境下下载并解压GmSSL源代码后进入源码目录执行如下命令
```bash ```bash
mkdir build mkdir build
cd build cd build
cmake .. cmake .. -DCMAKE_BUILD_TYPE=Release
make cmake --build .
make test ctest --output-on-failure
sudo make install sudo cmake --install .
``` ```
就可以完成配置、编译、测试和安装。 就可以完成配置、编译、测试和安装。
在执行`make`编译成功后,在`build/bin`目录下会生成项目的可执行文件和库文件。对于密码工具来说,在安装使用之前通过`make test`进行测试是重要的一步,如果测试失败,那么不应该使用这个软件。在发生某个测试错误后,可以执行`build/bin`下的具体某个测试命令行,如`sm4test`,这样可以看到具体的错误打印信息。 在执行`cmake --build .`编译成功后,在`build/bin`目录下会生成项目的可执行文件和库文件。对于密码工具来说,在安装使用之前通过`ctest --output-on-failure`进行测试是重要的一步,如果测试失败,那么不应该使用这个软件。在发生某个测试错误后,可以执行`build/bin`下的具体某个测试命令行,如`sm4test`,这样可以看到具体的错误打印信息。
执行`sudo make install`,安装完成后,可以命令行中调用`gmssl`命令行工具。在Linux和Mac环境下头文件通常被安装在`/usr/local/include/gmssl`目录下,库文件被安装在`/usr/local/lib`目录下。 执行`sudo cmake --install .`,安装完成后,可以命令行中调用`gmssl`命令行工具。在Linux和macOS环境下,头文件通常被安装在`/usr/local/include/gmssl`目录下,库文件被安装在`/usr/local/lib`目录下。Linux默认动态库名称为`libgmssl.so`macOS默认动态库名称为`libgmssl.dylib`
如果不希望安装到系统目录,可以指定安装前缀:
```bash
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME/local/gmssl
cmake --build .
ctest --output-on-failure
cmake --install .
```
### Windows源码安装
在Windows上建议使用Visual Studio 2022或更新版本。在"Developer Command Prompt for VS 2022"中执行:
```bat
mkdir build
cd build
cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release
nmake
ctest --output-on-failure
nmake install
```
默认安装目录通常为`C:\Program Files\GmSSL`,命令行工具、头文件和库文件分别安装到`bin``include``lib`目录。普通用户执行安装可能会因为权限不足失败,需要以管理员身份打开开发者命令提示符,或者通过`-DCMAKE_INSTALL_PREFIX=C:\path\to\gmssl`指定用户可写的目录。
## 项目源代码 ## 项目源代码
@@ -50,10 +78,10 @@ GmSSL项目的源代码在GitHub中发布和维护。
在执行`cmake`阶段可以对项目的默认编译配置进行修改修改是通过设置CMake变量来完成的可以查看项目源代码中的`CMakeLists.txt`中所有的`option`指令来查看可选的配置。例如: 在执行`cmake`阶段可以对项目的默认编译配置进行修改修改是通过设置CMake变量来完成的可以查看项目源代码中的`CMakeLists.txt`中所有的`option`指令来查看可选的配置。例如:
```cmake ```cmake
option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
``` ```
表明项目默认生成静态库,不生成动态库。 表明项目默认生成动态库。
###设置生成动态库或静态库 ###设置生成动态库或静态库
@@ -61,6 +89,7 @@ GmSSL的CMake默认生成动态库可以通过设定CMake变量`BUILD_SHARED_
``` ```
cmake .. -DBUILD_SHARED_LIBS=ON cmake .. -DBUILD_SHARED_LIBS=ON
cmake .. -DBUILD_SHARED_LIBS=OFF
``` ```
### 设置优化的密码算法实现 ### 设置优化的密码算法实现
@@ -195,9 +224,7 @@ make install
### 存在的问题 ### 存在的问题
似乎CMake选项`BUILD_SHARED_LIBS` 不起作用,总会同时生成静态库和动态库 Cygwin的动态库名称比较特殊是以`cyg`开头的。使用Cygwin生成的可执行程序和动态库通常依赖`cygwin1.dll`发布给非Cygwin环境使用时需要额外处理这个运行时依赖
Cygwin的动态库名称比较特殊是以`cyg`开头的。
## 面向iOS/iPhoneOS的交叉编译 ## 面向iOS/iPhoneOS的交叉编译
@@ -248,8 +275,7 @@ cpack -G RPM
``` ```
mkdir build; cd build mkdir build; cd build
cmake .. -DCMAKE_BUILD_TYPE=Release cmake .. -DCMAKE_BUILD_TYPE=Release
cpack -G DEB cpack -G STGZ
make package
``` ```
## 生成二进制包 ## 生成二进制包
@@ -258,23 +284,46 @@ make package
在正式发布之前,需要在测试平台上编译、测试、安装。验证`gmssl`命令行可以正确使用,验证`sm3_demo.c`可以正确和`-lgmssl`编译,并且可以正确输出哈希值。 在正式发布之前,需要在测试平台上编译、测试、安装。验证`gmssl`命令行可以正确使用,验证`sm3_demo.c`可以正确和`-lgmssl`编译,并且可以正确输出哈希值。
完成编译和测试后,在`build`目录下执行如下操作 完成编译和测试后,在源码目录下执行如下操作。二进制包需要同时提供动态库和静态库,因此使用两个构建目录:先安装动态库,再安装静态库到同一个打包目录。第二次安装会覆盖`bin/gmssl`,使发布包中的命令行工具链接静态`libgmssl`,同时`lib`目录中保留动态库和静态库。
``` bash ```bash
#!/bin/bash -x #!/bin/bash -x
VERSION=3.2.0 VERSION=3.2.0
OS=macos OS=macos
ARCH=arm64 ARCH=arm64
mkdir build; cd build; cmake ..; make
cmake .. -DBUILD_SHARED_LIBS=OFF; make PREFIX="$PWD/gmssl-$VERSION"
mkdir gmssl-$VERSION rm -rf "$PREFIX" build-shared build-static
cd gmssl-$VERSION
mkdir bin; mkdir lib; mkdir include cmake -S . -B build-shared -DCMAKE_BUILD_TYPE=Release \
cp ../bin/gmssl bin -DBUILD_SHARED_LIBS=ON \
cp -P ../bin/libgmssl* lib -DCMAKE_INSTALL_PREFIX="$PREFIX"
cp -r ../../include/gmssl include cmake --build build-shared
cd .. ctest --test-dir build-shared --output-on-failure
cmake --install build-shared
cmake -S . -B build-static -DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF \
-DCMAKE_INSTALL_PREFIX="$PREFIX"
cmake --build build-static
ctest --test-dir build-static --output-on-failure
cmake --install build-static
tar czvf gmssl-$VERSION-$OS-$ARCH.tar.gz gmssl-$VERSION tar czvf gmssl-$VERSION-$OS-$ARCH.tar.gz gmssl-$VERSION
``` ```
其中`cmake .. -DBUILD_SHARED_LIBS=OFF; make`重新生成了静态库,以及和静态库连接的`gmssl`二进制程序,因此最终打包的`gmssl`命令行不依赖系统库之外的动态库。 发布包目录结构如下:
```bash
gmssl-$VERSION/
bin/
gmssl
include/
gmssl/
lib/
libgmssl.a
libgmssl.so # Linux动态库
libgmssl.dylib # macOS动态库
```
其中静态库和动态库的具体文件名会随操作系统变化。例如Linux通常生成`libgmssl.so`及其版本符号链接macOS通常生成`libgmssl.dylib`及其版本符号链接Windows通常生成`.dll`和导入库。打包前需要在目标平台上确认`bin/gmssl version`可以运行并确认一个外部C程序可以通过`-I<package>/include``-L<package>/lib -lgmssl`完成编译和链接。

View File

@@ -33,7 +33,7 @@ make test
sudo make install sudo make install
``` ```
`make install`完成后GmSSL会在默认安装目录中安装`gmssl`命令行工具,在头文件目录中创建`gmssl`目录,并且在库目录中安装`libgmssl.a``libgmssl.so`等库文件。 `make install`完成后GmSSL会在默认安装目录中安装`gmssl`命令行工具,在头文件目录中创建`gmssl`目录,并且在库目录中安装`libgmssl.so``libgmssl.dylib`动态库文件。需要静态库时,可以在配置阶段指定`-DBUILD_SHARED_LIBS=OFF`生成`libgmssl.a`
### Visual Studio环境编译 ### Visual Studio环境编译

View File

@@ -18,7 +18,7 @@ extern "C" {
#define GMSSL_VERSION_NUM 30200 #define GMSSL_VERSION_NUM 30200
#define GMSSL_VERSION_STR "GmSSL 3.2.0-dev.1140" #define GMSSL_VERSION_STR "GmSSL 3.2.0-dev.1141"
int gmssl_version_num(void); int gmssl_version_num(void);
const char *gmssl_version_str(void); const char *gmssl_version_str(void);