Перейти к основному содержимому
Перейти к основному содержимому

Сборка на Linux для s390x (zLinux)

ClickHouse имеет экспериментальную поддержку s390x.

Сборка ClickHouse для s390x

s390x имеет две опции сборки, связанные с OpenSSL:

  • По умолчанию, OpenSSL собирается на s390x как общий объект. Это отличается от всех других платформ, где OpenSSL собирается как статическая библиотека.
  • Чтобы собрать OpenSSL как статическую библиотеку, передайте -DENABLE_OPENSSL_DYNAMIC=0 в CMake.

Данные инструкции предполагают, что хост-машина является x86_64 и имеет все необходимые инструменты для сборки на основе инструкций по сборке. Также предполагается, что хост - Ubuntu 22.04, но следующие инструкции также должны работать на Ubuntu 20.04.

В дополнение к установке инструментов, используемых для нативной сборки, необходимо установить следующие дополнительные пакеты:

apt-get install binutils-s390x-linux-gnu libc6-dev-s390x-cross gcc-s390x-linux-gnu binfmt-support qemu-user-static

Если вы хотите перекомпилировать код rust, установите целевую платформу перекомпиляции для s390x:

rustup target add s390x-unknown-linux-gnu

Сборка для s390x использует линковщик mold, скачайте его с https://github.com/rui314/mold/releases/download/v2.0.0/mold-2.0.0-x86_64-linux.tar.gz и поместите в ваш $PATH.

Чтобы собрать для s390x:

cmake -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-s390x.cmake ..
ninja

Запуск

После сборки бинарный файл можно запустить с, например:

qemu-s390x-static -L /usr/s390x-linux-gnu ./clickhouse

Отладка

Установите LLDB:

apt-get install lldb-15

Чтобы отладить исполняемый файл s390x, запустите clickhouse, используя QEMU в режиме отладки:

qemu-s390x-static -g 31338 -L /usr/s390x-linux-gnu ./clickhouse

В другой консоли запустите LLDB и присоединитесь, заменив <Clickhouse Parent Directory> и <build directory> на значения, соответствующие вашей среде.

lldb-15
(lldb) target create ./clickhouse
Текущий исполняемый файл установлен на '/<Clickhouse Parent Directory>/ClickHouse/<build directory>/programs/clickhouse' (s390x).
(lldb) settings set target.source-map <build directory> /<Clickhouse Parent Directory>/ClickHouse
(lldb) gdb-remote 31338
Процесс 1 остановлен
* поток #1, причина остановки = сигнал SIGTRAP
    фрейм #0: 0x0000004020e74cd0
->  0x4020e74cd0: lgr    %r2, %r15
    0x4020e74cd4: aghi   %r15, -160
    0x4020e74cd8: xc     0(8,%r15), 0(%r15)
    0x4020e74cde: brasl  %r14, 275429939040
(lldb) b main
Точка останова 1: 9 местоположений.
(lldb) c
Процесс 1 продолжается
Процесс 1 остановлен
* поток #1, причина остановки = точка останова 1.1
    фрейм #0: 0x0000004005cd9fc0 clickhouse`main(argc_=1, argv_=0x0000004020e594a8) в main.cpp:450:17
   447  #если !определено(FUZZING_MODE)
   448  int main(int argc_, char ** argv_)
   449  {
-> 450      inside_main = true;
   451      SCOPE_EXIT({ inside_main = false; });
   452
   453      /// Кэш PHDR требуется для корректной работы профайлера запросов

Интеграция с Visual Studio Code

  • Для визуальной отладки требуется расширение CodeLLDB.
  • Расширение Command Variable может помочь с динамическими запусками при использовании CMake Variants.
  • Убедитесь, что вы установили бэкэнд для вашей установки LLVM, например. "lldb.library": "/usr/lib/x86_64-linux-gnu/liblldb-15.so"
  • Убедитесь, что запустили исполняемый файл clickhouse в режиме отладки перед запуском. (Также возможно создать preLaunchTask, который автоматизирует это)

Примеры конфигураций

cmake-variants.yaml

buildType:
  default: relwithdebinfo
  choices:
    debug:
      short: Debug
      long: Генерация отладочной информации
      buildType: Debug
    release:
      short: Release
      long: Оптимизация сгенерированного кода
      buildType: Release
    relwithdebinfo:
      short: RelWithDebInfo
      long: Релиз с отладочной информацией
      buildType: RelWithDebInfo
    tsan:
      short: MinSizeRel
      long: Минимальное соотношение размер-выход
      buildType: MinSizeRel

toolchain:
  default: default
  description: Выберите инструментальную цепочку
  choices:
    default:
      short: x86_64
      long: x86_64
    s390x:
      short: s390x
      long: s390x
      settings:
        CMAKE_TOOLCHAIN_FILE: cmake/linux/toolchain-s390x.cmake

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "custom",
            "name": "(lldb) Запуск s390x с qemu",
            "targetCreateCommands": ["target create ${command:cmake.launchTargetPath}"],
            "processCreateCommands": ["gdb-remote 2159"],
            "preLaunchTask": "Запуск ClickHouse"
        }
    ]
}

settings.json

Это также поместит разные сборки в разные подпапки папки build.

{
    "cmake.buildDirectory": "${workspaceFolder}/build/${buildKitVendor}-${buildKitVersion}-${variant:toolchain}-${variant:buildType}",
    "lldb.library": "/usr/lib/x86_64-linux-gnu/liblldb-15.so"
}

run-debug.sh

#! /bin/sh
echo 'Запуск сессии отладки'
cd $1
qemu-s390x-static -g 2159 -L /usr/s390x-linux-gnu $2 $3 $4

tasks.json

Определяет задачу для запуска скомпилированного исполняемого файла в режиме server в папке tmp рядом с бинарными файлами, с конфигурацией из файла programs/server/config.xml.

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Запуск ClickHouse",
            "type": "shell",
            "isBackground": true,
            "command": "${workspaceFolder}/.vscode/run-debug.sh",
            "args": [
                "${command:cmake.launchTargetDirectory}/tmp",
                "${command:cmake.launchTargetPath}",
                "server",
                "--config-file=${workspaceFolder}/programs/server/config.xml"
            ],
            "problemMatcher": [
                {
                    "pattern": [
                        {
                            "regexp": ".",
                            "file": 1,
                            "location": 2,
                            "message": 3
                        }
                    ],
                    "background": {
                        "activeOnStart": true,
                        "beginsPattern": "^Запуск сессии отладки",
                        "endsPattern": ".*"
                    }
                }
            ]
        }
    ]
}