> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Guía para compilar ClickHouse desde el código fuente para la arquitectura s390x

# Compilar en Linux para s390x (zLinux)

ClickHouse tiene soporte experimental para s390x.

<div id="building-clickhouse-for-s390x">
  ## Compilar ClickHouse para s390x
</div>

s390x, al igual que otras plataformas, compila OpenSSL como una biblioteca estática. Si desea compilar con OpenSSL dinámico, debe pasar `-DENABLE_OPENSSL_DYNAMIC=1` a CMake.

Estas instrucciones asumen que la máquina host ejecuta Linux x86\_64/ARM y cuenta con todas las herramientas necesarias para compilar de forma nativa, según las [instrucciones de compilación](/docs/es/resources/develop-contribute/build/build). También se asume que el host es Ubuntu 22.04, aunque las siguientes instrucciones también deberían funcionar en Ubuntu 20.04.

Además de instalar las herramientas que se usan para compilar de forma nativa, también es necesario instalar los siguientes paquetes adicionales:

```bash theme={null}
apt-get mold
rustup target add s390x-unknown-linux-gnu
```

Para compilar para s390x:

```bash theme={null}
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-s390x.cmake ..
ninja
```

<div id="running">
  ## Ejecución
</div>

Para emular, necesitarás el binario estático de usuario de QEMU para s390x. En Ubuntu se puede instalar con:

```bash theme={null}
apt-get install binfmt-support binutils-s390x-linux-gnu qemu-user-static
```

Una vez compilado, el binario se puede ejecutar con, por ejemplo:

```bash theme={null}
qemu-s390x-static -L /usr/s390x-linux-gnu ./programs/clickhouse local --query "Select 2"
2
```

<div id="debugging">
  ## Depuración
</div>

Instala LLDB:

```bash theme={null}
apt-get install lldb-21
```

Para depurar un ejecutable s390x, ejecute clickhouse con QEMU en modo de depuración:

```bash theme={null}
qemu-s390x-static -g 31338 -L /usr/s390x-linux-gnu ./clickhouse
```

En otra terminal, ejecute LLDB y haga attach; reemplace `<Clickhouse Parent Directory>` y `<build directory>` por los valores correspondientes a su entorno.

```bash theme={null}
lldb-15
(lldb) target create ./clickhouse
Current executable set to '/<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
Process 1 stopped
* thread #1, stop reason = signal SIGTRAP
    frame #0: 0x0000004020e74cd0
->  0x4020e74cd0: lgr    %r2, %r15
    0x4020e74cd4: aghi   %r15, -160
    0x4020e74cd8: xc     0(8,%r15), 0(%r15)
    0x4020e74cde: brasl  %r14, 275429939040
(lldb) b main
Breakpoint 1: 9 locations.
(lldb) c
Process 1 resuming
Process 1 stopped
* thread #1, stop reason = breakpoint 1.1
    frame #0: 0x0000004005cd9fc0 clickhouse`main(argc_=1, argv_=0x0000004020e594a8) at main.cpp:450:17
   447  #if !defined(FUZZING_MODE)
   448  int main(int argc_, char ** argv_)
   449  {
-> 450      inside_main = true;
   451      SCOPE_EXIT({ inside_main = false; });
   452
   453      /// La caché PHDR es necesaria para que el query profiler funcione de forma fiable
```

<div id="visual-studio-code-integration">
  ## Integración con Visual Studio Code
</div>

* La extensión [CodeLLDB](https://github.com/vadimcn/vscode-lldb) es necesaria para la depuración visual.
* La extensión [Command Variable](https://github.com/rioj7/command-variable) puede facilitar los lanzamientos dinámicos si usa [CMake Variants](https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/variants.md).
* Asegúrese de configurar el backend para que apunte a su instalación de LLVM; por ejemplo, `"lldb.library": "/usr/lib/x86_64-linux-gnu/liblldb-21.so"`
* Asegúrese de ejecutar el ejecutable de ClickHouse en modo de depuración antes de iniciarlo. (También es posible crear una `preLaunchTask` que lo automatice)

<div id="example-configurations">
  ### Configuraciones de ejemplo
</div>

<div id="cmake-variantsyaml">
  #### cmake-variants.yaml
</div>

```yaml theme={null}
buildType:
  default: relwithdebinfo
  choices:
    debug:
      short: Debug
      long: Emit debug information
      buildType: Debug
    release:
      short: Release
      long: Optimize generated code
      buildType: Release
    relwithdebinfo:
      short: RelWithDebInfo
      long: Release with Debug Info
      buildType: RelWithDebInfo
    tsan:
      short: MinSizeRel
      long: Minimum Size Release
      buildType: MinSizeRel

toolchain:
  default: default
  description: Select toolchain
  choices:
    default:
      short: x86_64
      long: x86_64
    s390x:
      short: s390x
      long: s390x
      settings:
        CMAKE_TOOLCHAIN_FILE: cmake/linux/toolchain-s390x.cmake
```

<div id="launchjson">
  #### launch.json
</div>

```json theme={null}
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "custom",
            "name": "(lldb) Launch s390x with qemu",
            "targetCreateCommands": ["target create ${command:cmake.launchTargetPath}"],
            "processCreateCommands": ["gdb-remote 2159"],
            "preLaunchTask": "Run ClickHouse"
        }
    ]
}
```

<div id="settingsjson">
  #### settings.json
</div>

Esto también colocaría las distintas compilaciones en subcarpetas diferentes dentro de la carpeta `build`.

```json theme={null}
{
    "cmake.buildDirectory": "${workspaceFolder}/build/${buildKitVendor}-${buildKitVersion}-${variant:toolchain}-${variant:buildType}",
    "lldb.library": "/usr/lib/x86_64-linux-gnu/liblldb-21.so"
}
```

<div id="run-debugsh">
  #### run-debug.sh
</div>

```sh theme={null}
#! /bin/sh
echo 'Starting debugger session'
cd $1
qemu-s390x-static -g 2159 -L /usr/s390x-linux-gnu $2 $3 $4
```

<div id="tasksjson">
  #### tasks.json
</div>

Define una tarea para ejecutar el ejecutable compilado en modo `server` dentro de una carpeta `tmp` junto a los binarios, usando la configuración de `programs/server/config.xml`.

```json theme={null}
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Run 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": "^Starting debugger session",
                        "endsPattern": ".*"
                    }
                }
            ]
        }
    ]
}
```
