009-Solidity 编译器 CMake 配置选项完全指南

Solidity 编译器 CMake 配置选项完全指南

本指南详细介绍 Solidity 编译器构建系统中所有可用的 CMake 配置选项。了解这些选项将使您能够根据特定需求自定义 Solidity 编译器的构建过程,优化性能,启用特定功能,或满足特殊环境要求。

目录

  1. CMake 基础概念
  2. 基本构建选项
  3. 编译器和工具链选项
  4. 依赖项配置选项
  5. 功能开关和模块选项
  6. 优化和性能选项
  7. 调试和测试选项
  8. 平台特定选项
  9. 安装和路径选项
  10. 高级和实验性选项
  11. 组合配置实例
  12. 故障排除

1. CMake 基础概念

CMake 简介

CMake 是 Solidity 项目使用的跨平台构建系统生成器。它使用 CMakeLists.txt 文件定义构建过程,并可以为各种平台和构建工具生成原生构建文件(如 Makefiles、Visual Studio 项目等)。

设置 CMake 选项的基本语法

CMake 选项可以通过命令行或 CMake GUI 设置:

bash

# 命令行语法
cmake -D选项名=值 [其他选项] ..

# 示例
cmake -DCMAKE_BUILD_TYPE=Release -DUSE_Z3=OFF ..

检查可用选项

要查看 Solidity 项目支持的 CMake 选项:

bash

# 列出缓存的变量(在已配置的构建目录中)
cmake -L ..

# 列出缓存的变量及其帮助字符串
cmake -LH ..

# 列出高级缓存变量
cmake -LA ..

2. 基本构建选项

CMAKE_BUILD_TYPE

控制生成的构建类型,这影响编译器优化级别和调试信息。

bash

# 语法
-DCMAKE_BUILD_TYPE=<类型>

# 可能的值
- Debug: 包含调试信息,无优化,适合开发和调试
- Release: 优化代码性能,无调试信息,适合生产使用
- RelWithDebInfo: 包含调试信息并进行一些优化,性能和调试的平衡
- MinSizeRel: 优化代码大小,适合空间受限的环境

# 示例
cmake -DCMAKE_BUILD_TYPE=Release ..

默认值:RelWithDebInfo

BUILD_SHARED_LIBS

确定是构建动态库(.so/.dll/.dylib)还是静态库(.a/.lib)。

bash

# 语法
-DBUILD_SHARED_LIBS=<ON|OFF>

# 示例
cmake -DBUILD_SHARED_LIBS=OFF ..  # 构建静态库

默认值:OFF(构建静态库)

CMAKE_VERBOSE_MAKEFILE

启用详细的构建输出,显示完整的编译命令。

bash

# 语法
-DCMAKE_VERBOSE_MAKEFILE=<ON|OFF>

# 示例
cmake -DCMAKE_VERBOSE_MAKEFILE=ON ..

默认值:OFF

CMAKE_EXPORT_COMPILE_COMMANDS

生成 compile_commands.json 文件,包含完整的编译命令,对集成开发环境和代码分析工具有用。

bash

# 语法
-DCMAKE_EXPORT_COMPILE_COMMANDS=<ON|OFF>

# 示例
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..

默认值:OFF

3. 编译器和工具链选项

CMAKE_C_COMPILER / CMAKE_CXX_COMPILER

指定要使用的 C 和 C++ 编译器。

bash

# 语法
-DCMAKE_C_COMPILER=<路径>
-DCMAKE_CXX_COMPILER=<路径>

# 示例
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
cmake -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 ..

默认值:系统默认编译器

CMAKE_C_FLAGS / CMAKE_CXX_FLAGS

提供额外的编译器标志。

bash

# 语法
-DCMAKE_C_FLAGS="<标志>"
-DCMAKE_CXX_FLAGS="<标志>"

# 示例 - 启用更严格的警告检查
cmake -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror" ..

# 示例 - 启用特定 CPU 优化
cmake -DCMAKE_CXX_FLAGS="-march=native" ..

可以使用特定构建类型的标志:

  • CMAKE_C_FLAGS_DEBUG / CMAKE_CXX_FLAGS_DEBUG
  • CMAKE_C_FLAGS_RELEASE / CMAKE_CXX_FLAGS_RELEASE
  • CMAKE_C_FLAGS_RELWITHDEBINFO / CMAKE_CXX_FLAGS_RELWITHDEBINFO
  • CMAKE_C_FLAGS_MINSIZEREL / CMAKE_CXX_FLAGS_MINSIZEREL

CMAKE_TOOLCHAIN_FILE

使用特定的工具链文件,对交叉编译或使用自定义工具集特别有用。

bash

# 语法
-DCMAKE_TOOLCHAIN_FILE=<文件路径>

# 示例 - 使用 vcpkg
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake ..

# 示例 - 交叉编译
cmake -DCMAKE_TOOLCHAIN_FILE=./cmake/toolchains/arm-linux-gnueabihf.cmake ..

CMAKE_CXX_STANDARD

指定使用的 C++ 标准。

bash

# 语法
-DCMAKE_CXX_STANDARD=<11|14|17|20>

# 示例
cmake -DCMAKE_CXX_STANDARD=17 ..

默认值:Solidity 项目通常使用 17(C++17)

CMAKE_<LANG>_COMPILER_LAUNCHER

指定编译器启动器,如 ccache 或 sccache,可以显著加速重复构建。

bash

# 语法
-DCMAKE_C_COMPILER_LAUNCHER=<启动器>
-DCMAKE_CXX_COMPILER_LAUNCHER=<启动器>

# 示例
cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ..

4. 依赖项配置选项

Boost 设置

配置 Boost 库的位置和使用方式。

bash

# 语法
-DBOOST_ROOT=<路径>            # Boost 安装路径
-DBoost_USE_STATIC_LIBS=<ON|OFF>  # 使用静态 Boost 库

# 示例
cmake -DBOOST_ROOT=/opt/boost-1.74.0 -DBoost_USE_STATIC_LIBS=ON ..

Z3 和 CVC4 求解器设置

启用/禁用或配置 SMT 求解器。

bash

# 启用/禁用 Z3 SMT 求解器
-DUSE_Z3=<ON|OFF>

# 启用/禁用 CVC4 SMT 求解器
-DUSE_CVC4=<ON|OFF>

# 指定 Z3 安装路径
-DZ3_ROOT=<路径>

# 指定 CVC4 安装路径
-DCVC4_ROOT=<路径>

# 示例
cmake -DUSE_Z3=ON -DZ3_ROOT=/usr/local/z3-4.8.12 ..
cmake -DUSE_CVC4=ON -DUSE_Z3=OFF -DCVC4_ROOT=/opt/cvc4 ..

默认值:

  • USE_Z3: ON
  • USE_CVC4: OFF

EVMONE

启用/禁用使用 evmone EVM 实现。

bash

# 语法
-DUSE_EVMONE=<ON|OFF>

# 示例
cmake -DUSE_EVMONE=OFF ..

默认值: ON

5. 功能开关和模块选项

SOLC_LINK_STATIC

控制 solc 可执行文件的链接方式,静态链接可提高可移植性。

bash

# 语法
-DSOLC_LINK_STATIC=<ON|OFF>

# 示例
cmake -DSOLC_LINK_STATIC=ON ..

默认值:OFF(默认动态链接)

SOLC_DISABLE_JUMBOHASH_SUPPORT

控制是否禁用对大型哈希(jumbo hash)的支持。

bash

# 语法
-DSOLC_DISABLE_JUMBOHASH_SUPPORT=<ON|OFF>

# 示例
cmake -DSOLC_DISABLE_JUMBOHASH_SUPPORT=ON ..

默认值:OFF

SOLC_INSTALL

控制是否安装 solc 可执行文件。

bash

# 语法
-DSOLC_INSTALL=<ON|OFF>

# 示例
cmake -DSOLC_INSTALL=OFF ..

默认值:ON

BUILD_SOLC

控制是否构建 solc 命令行可执行文件。

bash

# 语法
-DBUILD_SOLC=<ON|OFF>

# 示例
cmake -DBUILD_SOLC=OFF ..  # 仅构建库,不构建可执行文件

默认值:ON

LLL

控制是否启用 LLL(低级类 Lisp 语言)支持,现在基本已弃用。

bash

# 语法
-DLLL=<ON|OFF>

# 示例
cmake -DLLL=ON ..

默认值:OFF

6. 优化和性能选项

CMAKE_INTERPROCEDURAL_OPTIMIZATION

启用链接时优化(LTO),可以提高运行时性能但增加构建时间。

bash

# 语法
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=<ON|OFF>

# 示例
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON ..

默认值:OFF

USE_CCACHE

启用 ccache 缓存编译结果,加速增量构建。

bash

# 语法
-DUSE_CCACHE=<ON|OFF>

# 示例
cmake -DUSE_CCACHE=ON ..

默认值:取决于是否找到 ccache

OPTIMIZE

控制是否为 Solidity 编译器本身启用优化。

bash

# 语法
-DOPTIMIZE=<ON|OFF>

# 示例
cmake -DOPTIMIZE=OFF ..  # 禁用优化,可能用于调试

默认值:对于 Release 构建为 ON

7. 调试和测试选项

TESTS

控制是否构建测试。

bash

# 语法
-DTESTS=<ON|OFF>

# 示例
cmake -DTESTS=OFF ..  # 跳过构建测试,加快构建速度

默认值:ON

TOOLS

控制是否构建工具。

bash

# 语法
-DTOOLS=<ON|OFF>

# 示例
cmake -DTOOLS=OFF ..  # 不构建附加工具

默认值:ON

COVERAGE

启用代码覆盖率分析,适用于测试。

bash

# 语法
-DCOVERAGE=<ON|OFF>

# 示例
cmake -DCOVERAGE=ON ..

默认值:OFF

PROFILE

启用性能分析工具集成。

bash

# 语法
-DPROFILE=<ON|OFF>

# 示例
cmake -DPROFILE=ON ..

默认值:OFF

ASAN

启用地址消毒工具 (Address Sanitizer) 进行内存错误检测。

bash

# 语法
-DASAN=<ON|OFF>

# 示例
cmake -DASAN=ON -DCMAKE_BUILD_TYPE=Debug ..

默认值:OFF

UBSAN

启用未定义行为消毒工具 (Undefined Behavior Sanitizer) 进行错误检测。

bash

# 语法
-DUBSAN=<ON|OFF>

# 示例
cmake -DUBSAN=ON -DCMAKE_BUILD_TYPE=Debug ..

默认值:OFF

TSAN

启用线程消毒工具 (Thread Sanitizer) 进行线程安全性检测。

bash

# 语法
-DTSAN=<ON|OFF>

# 示例
cmake -DTSAN=ON -DCMAKE_BUILD_TYPE=Debug ..

默认值:OFF

OSSFUZZ

构建模糊测试目标。

bash

# 语法
-DOSSFUZZ=<ON|OFF>

# 示例
cmake -DOSSFUZZ=ON ..

默认值:OFF

8. 平台特定选项

EMSCRIPTEN

启用 Emscripten 支持,用于编译到 WebAssembly/JavaScript。

bash

# 语法
-DEMSCRIPTEN=<ON|OFF>

# 示例
emcmake cmake -DEMSCRIPTEN=ON ..

默认值:自动根据环境检测

CMAKE_OSX_ARCHITECTURES

指定 macOS 构建的目标架构。

bash

# 语法
-DCMAKE_OSX_ARCHITECTURES=<架构>

# 示例 - 为 Apple Silicon 构建
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 ..

# 示例 - 构建通用二进制(Intel 和 Apple Silicon)
cmake -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" ..

SOLC_PEDANTIC

在支持的平台上启用额外的编译器警告。

bash

# 语法
-DSOLC_PEDANTIC=<ON|OFF>

# 示例
cmake -DSOLC_PEDANTIC=ON ..

默认值: ON

9. 安装和路径选项

CMAKE_INSTALL_PREFIX

设置安装位置前缀。

bash

# 语法
-DCMAKE_INSTALL_PREFIX=<路径>

# 示例
cmake -DCMAKE_INSTALL_PREFIX=/opt/solidity ..

默认值:Linux/macOS 上为 /usr/local,Windows 上为 C:\Program Files\solidity

CMAKE_INSTALL_LIBDIR

指定库安装目录名称,相对于 CMAKE_INSTALL_PREFIX

bash

# 语法
-DCMAKE_INSTALL_LIBDIR=<目录>

# 示例
cmake -DCMAKE_INSTALL_LIBDIR=lib64 ..

默认值:通常为 liblib64(取决于平台)

CMAKE_INSTALL_BINDIR

指定可执行文件安装目录名称,相对于 CMAKE_INSTALL_PREFIX

bash

# 语法
-DCMAKE_INSTALL_BINDIR=<目录>

# 示例
cmake -DCMAKE_INSTALL_BINDIR=bin ..

默认值:通常为 bin

CMAKE_PREFIX_PATH

添加额外的路径用于查找包。

bash

# 语法
-DCMAKE_PREFIX_PATH=<路径>

# 示例
cmake -DCMAKE_PREFIX_PATH="/opt/boost;/opt/z3" ..

10. 高级和实验性选项

VIA_IR

启用通过 IR 优化的编译(实验性)。

bash

# 语法
-DVIA_IR=<ON|OFF>

# 示例
cmake -DVIA_IR=ON ..

默认值:OFF

USE_Z3_DLOPEN

使用动态加载 Z3 库而不是静态链接。

bash

# 语法
-DUSE_Z3_DLOPEN=<ON|OFF>

# 示例
cmake -DUSE_Z3_DLOPEN=ON ..

默认值:OFF

STRICT_Z3_VERSION

在构建时对 Z3 版本进行严格检查。

bash

# 语法
-DSTRICT_Z3_VERSION=<ON|OFF>

# 示例
cmake -DSTRICT_Z3_VERSION=OFF ..  # 允许使用不同版本的 Z3

默认值:ON

OLD_Z3_LIBRARIES

使用旧版 Z3 库名称。

bash

# 语法
-DOLD_Z3_LIBRARIES=<ON|OFF>

# 示例
cmake -DOLD_Z3_LIBRARIES=ON ..

默认值:OFF

Z3_INCLUDE_DIR / Z3_LIBRARIES

手动指定 Z3 包含目录和库路径。

bash

# 语法
-DZ3_INCLUDE_DIR=<路径>
-DZ3_LIBRARIES=<路径>

# 示例
cmake -DZ3_INCLUDE_DIR=/opt/z3/include -DZ3_LIBRARIES=/opt/z3/lib/libz3.so ..

11. 组合配置实例

以下是一些常见使用场景的组合配置示例。

标准发布构建

bash

cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_CXX_FLAGS="-O3" \
      ..

创建便携静态二进制文件

bash

cmake -DCMAKE_BUILD_TYPE=Release \
      -DSOLC_LINK_STATIC=ON \
      -DBoost_USE_STATIC_LIBS=ON \
      -DUSE_Z3_DLOPEN=OFF \
      ..

开发者调试构建

bash

cmake -DCMAKE_BUILD_TYPE=Debug \
      -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
      -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror" \
      -DTESTS=ON \
      ..

优化性能的构建

bash

cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
      -DCMAKE_CXX_FLAGS="-O3 -march=native" \
      -DUSE_Z3=OFF \  # 如果不需要 SMT 功能
      ..

快速构建(跳过测试和工具)

bash

cmake -DCMAKE_BUILD_TYPE=Release \
      -DTESTS=OFF \
      -DTOOLS=OFF \
      -DUSE_CCACHE=ON \
      -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
      ..

内存安全分析构建

bash

cmake -DCMAKE_BUILD_TYPE=Debug \
      -DASAN=ON \
      -DUBSAN=ON \
      ..

交叉编译 ARM64 构建

bash

cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_SYSTEM_NAME=Linux \
      -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
      -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
      -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
      -DSOLC_LINK_STATIC=ON \
      ..

自定义安装路径

bash

cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=/opt/solidity \
      -DCMAKE_INSTALL_LIBDIR=lib \
      ..

模糊测试构建

bash

cmake -DCMAKE_BUILD_TYPE=Release \
      -DOSSFUZZ=ON \
      ..

12. 故障排除

找不到依赖项

问题:CMake 无法找到所需的依赖项,如 Boost 或 Z3。

解决方案

bash

# 指定 Boost 位置
cmake -DBOOST_ROOT=/path/to/boost ..

# 指定 Z3 位置
cmake -DZ3_ROOT=/path/to/z3 ..

# 或使用 CMAKE_PREFIX_PATH
cmake -DCMAKE_PREFIX_PATH="/path/to/boost;/path/to/z3" ..

编译错误

问题:编译期间遇到错误。

解决方案

bash

# 获取详细编译输出
cmake -DCMAKE_VERBOSE_MAKEFILE=ON ..
make

# 尝试使用不同的编译器版本
cmake -DCMAKE_CXX_COMPILER=g++-11 ..

# 禁用严格模式
cmake -DCMAKE_CXX_FLAGS="-Wno-error" ..

构建资源不足

问题:构建时内存不足或 CPU 使用率过高。

解决方案

bash

# 减少并行构建任务数量
make -j2

# 使用较低的优化级别
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CXX_FLAGS="-O1" ..

# 分阶段构建
cmake -DTESTS=OFF ..
make
cmake -DTESTS=ON ..
make test

Z3 求解器问题

问题:与 Z3 相关的构建或链接问题。

解决方案

bash

# 禁用 Z3
cmake -DUSE_Z3=OFF ..

# 尝试动态加载 Z3
cmake -DUSE_Z3_DLOPEN=ON ..

# 禁用严格版本检查
cmake -DSTRICT_Z3_VERSION=OFF ..

# 如果存在旧版 Z3
cmake -DOLD_Z3_LIBRARIES=ON ..

可执行文件过大

问题:生成的 solc 可执行文件太大。

解决方案

bash

# 构建时启用最小尺寸选项
cmake -DCMAKE_BUILD_TYPE=MinSizeRel ..

# 移除调试信息
strip solc/solc

# 禁用一些可选功能
cmake -DUSE_Z3=OFF -DLLL=OFF ..

跨平台构建问题

问题:在某个平台上构建但在另一个平台上使用时出现问题。

解决方案

bash

# 创建静态链接的二进制文件
cmake -DSOLC_LINK_STATIC=ON -DBoost_USE_STATIC_LIBS=ON ..

# 指定最小目标平台(macOS)
cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 ..

# 禁用特定于平台的功能
cmake -DUSE_Z3=OFF ..

完整示例:CMake 构建配置文件

以下是一个自定义 CMake 配置文件示例,可用于创建针对特定情况优化的构建:

cmake

# solidity_build_config.cmake
# 使用方法: cmake -C /path/to/solidity_build_config.cmake ..

# 基本构建设置
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "")
set(CMAKE_VERBOSE_MAKEFILE OFF CACHE BOOL "")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE BOOL "")

# 编译器和优化设置
set(CMAKE_CXX_FLAGS "-O3 -march=native -pipe" CACHE STRING "")
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON CACHE BOOL "")
set(CMAKE_CXX_COMPILER_LAUNCHER "ccache" CACHE STRING "")

# Solidity 特定选项
set(SOLC_LINK_STATIC ON CACHE BOOL "")
set(USE_Z3 ON CACHE BOOL "")
set(USE_CVC4 OFF CACHE BOOL "")
set(TESTS ON CACHE BOOL "")
set(TOOLS ON CACHE BOOL "")
set(LLL OFF CACHE BOOL "")

# 依赖设置
set(Boost_USE_STATIC_LIBS ON CACHE BOOL "")
set(USE_CCACHE ON CACHE BOOL "")

# 安装设置
set(CMAKE_INSTALL_PREFIX "/opt/solidity" CACHE PATH "")

使用此配置文件:

bash

cmake -C /path/to/solidity_build_config.cmake ..

自动化构建脚本

以下是一个完整的脚本,用于自动化 Solidity 编译器的构建,并支持多种构建配置:

bash

#!/bin/bash
# build_solidity.sh - 自动化 Solidity 构建脚本

# 默认值
BUILD_TYPE="Release"
CORES=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2)
STATIC_LINK=true
TESTS=true
USE_Z3=true
INSTALL=false
PREFIX="/usr/local"
SOURCE_DIR=$(pwd)
BUILD_DIR="${SOURCE_DIR}/build"
VERBOSE=false

# 显示帮助
show_help() {
    echo "Solidity 编译器构建脚本"
    echo "用法: $0 [选项]"
    echo
    echo "选项:"
    echo "  -h, --help            显示帮助信息"
    echo "  -t, --type TYPE       构建类型: Debug, Release, RelWithDebInfo, MinSizeRel"
    echo "                        默认: $BUILD_TYPE"
    echo "  -j, --jobs N          并行构建任务数量"
    echo "                        默认: $CORES"
    echo "  -d, --dynamic         构建动态链接的二进制文件"
    echo "  -s, --static          构建静态链接的二进制文件(默认)"
    echo "  --no-tests            不构建测试"
    echo "  --no-z3               禁用 Z3 SMT 求解器"
    echo "  --install             构建后安装"
    echo "  --prefix PATH         安装前缀"
    echo "                        默认: $PREFIX"
    echo "  -b, --build-dir DIR   构建目录"
    echo "                        默认: $BUILD_DIR"
    echo "  -v, --verbose         显示详细输出"
    echo
    echo "示例:"
    echo "  $0 --type Debug --no-tests"
    echo "  $0 --static --jobs 4 --install --prefix ~/solidity"
}

# 解析参数
while [[ $# -gt 0 ]]; do
    case "$1" in
        -h|--help)
            show_help
            exit 0
            ;;
        -t|--type)
            BUILD_TYPE="$2"
            shift 2
            ;;
        -j|--jobs)
            CORES="$2"
            shift 2
            ;;
        -d|--dynamic)
            STATIC_LINK=false
            shift
            ;;
        -s|--static)
            STATIC_LINK=true
            shift
            ;;
        --no-tests)
            TESTS=false
            shift
            ;;
        --no-z3)
            USE_Z3=false
            shift
            ;;
        --install)
            INSTALL=true
            shift
            ;;
        --prefix)
            PREFIX="$2"
            shift 2
            ;;
        -b|--build-dir)
            BUILD_DIR="$2"
            shift 2
            ;;
        -v|--verbose)
            VERBOSE=true
            shift
            ;;
        *)
            echo "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
done

# 验证构建类型
if [[ ! "$BUILD_TYPE" =~ ^(Debug|Release|RelWithDebInfo|MinSizeRel)$ ]]; then
    echo "错误: 无效的构建类型: $BUILD_TYPE"
    echo "有效的构建类型: Debug, Release, RelWithDebInfo, MinSizeRel"
    exit 1
fi

# 创建构建目录
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR"

# 构建 CMake 命令
CMAKE_ARGS=()
CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE="$BUILD_TYPE")
CMAKE_ARGS+=(-DSOLC_LINK_STATIC=$([ "$STATIC_LINK" = true ] && echo "ON" || echo "OFF"))
CMAKE_ARGS+=(-DTESTS=$([ "$TESTS" = true ] && echo "ON" || echo "OFF"))
CMAKE_ARGS+=(-DUSE_Z3=$([ "$USE_Z3" = true ] && echo "ON" || echo "OFF"))
CMAKE_ARGS+=(-DCMAKE_INSTALL_PREFIX="$PREFIX")
CMAKE_ARGS+=(-DCMAKE_VERBOSE_MAKEFILE=$([ "$VERBOSE" = true ] && echo "ON" || echo "OFF"))

# 打印构建信息
echo "====== Solidity 构建配置 ======"
echo "构建类型: $BUILD_TYPE"
echo "静态链接: $STATIC_LINK"
echo "构建测试: $TESTS"
echo "使用 Z3: $USE_Z3"
echo "安装: $INSTALL"
echo "安装前缀: $PREFIX"
echo "构建目录: $BUILD_DIR"
echo "并行任务数: $CORES"
echo "================================"

# 运行 CMake 配置
echo "配置 CMake..."
cmake "${CMAKE_ARGS[@]}" "$SOURCE_DIR"

# 构建
echo "开始构建 Solidity..."
cmake --build . -- -j"$CORES"

# 运行测试
if [ "$TESTS" = true ]; then
    echo "运行测试..."
    ctest -j"$CORES"
fi

# 安装
if [ "$INSTALL" = true ]; then
    echo "安装 Solidity 到 $PREFIX..."
    cmake --install .
    echo "安装完成。"
    echo "solc 路径: $PREFIX/bin/solc"
fi

echo "构建完成!"
if [ "$INSTALL" = false ]; then
    echo "编译器位于: $BUILD_DIR/solc/solc"
fi

使用示例:

bash

chmod +x build_solidity.sh

# 基本构建
./build_solidity.sh

# 调试构建,不含测试
./build_solidity.sh --type Debug --no-tests

# 静态链接构建并安装
./build_solidity.sh --static --install --prefix ~/solidity-custom

# 禁用 Z3,优化构建大小
./build_solidity.sh --no-z3 --type MinSizeRel

结论

CMake 为 Solidity 编译器的构建提供了强大而灵活的配置选项,使您能够根据特定需求定制构建过程。通过了解这些选项,您可以:

  1. 优化构建性能和结果质量
  2. 启用或禁用特定功能
  3. 定制编译器以满足特定环境要求
  4. 配置测试和分析工具
  5. 解决构建过程中可能遇到的问题

合理使用这些 CMake 选项可以简化开发工作流程,提高构建质量,并确保 Solidity 编译器适合您的特定用例。无论您是需要优化性能的开发者,还是需要调试功能的贡献者,了解这些 CMake 选项都是使用和开发 Solidity 的重要部分。

猜你喜欢

转载自blog.csdn.net/chenby186119/article/details/147137045
今日推荐