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

# Compilar a Partir do Código-Fonte

> Compile o VillageSQL Server para MySQL a partir do código-fonte e comece a usar extensões.

## Visão geral

Compilar o VillageSQL a partir do código-fonte oferece a você os recursos mais recentes e permite personalizar a compilação para o seu ambiente específico.

## Pré-requisitos

Antes de começar, certifique-se de ter os seguintes itens instalados:

* **Git** - Para clonar o repositório
* **CMake** 3.16 ou superior - Gerador de sistema de compilação
* **Compilador C++** - GCC 8+, Clang 8+ ou MSVC 2019+
* **Ferramentas de compilação** - make, ninja ou equivalente
* **Bibliotecas de desenvolvimento** - OpenSSL, ncurses, pkg-config, bison e outras dependências do MySQL

### Instalar dependências

**Ubuntu/Debian:**

```bash theme={null}
sudo apt install cmake libssl-dev libncurses5-dev pkg-config bison \
                 libtirpc-dev rpcsvc-proto build-essential zlib1g-dev
```

**macOS (usando Homebrew):**

Primeiro, instale o Homebrew caso ainda não o tenha:

```bash theme={null}
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

Em seguida, instale as dependências:

```bash theme={null}
brew install cmake openssl pkgconf bison libtirpc rpcsvc-proto
```

## Passo 1: Clonar o repositório

Clone o repositório do VillageSQL Server a partir do GitHub. Clone para o seu diretório pessoal (home) para que os passos do CMake abaixo funcionem sem modificações:

```bash theme={null}
cd $HOME
git clone --depth 1 https://github.com/villagesql/villagesql-server.git
cd villagesql-server
```

<Note>
  O repositório ocupa vários GB por conta da base de código do MySQL.
</Note>

## Passo 2: Configurar com o CMake

Crie um diretório de compilação fora do repositório e configure o projeto:

**Linux:**

```bash theme={null}
# Create build directory (outside the repo)
mkdir -p $HOME/build/villagesql
cd $HOME/build/villagesql

# Configure with CMake
cmake $HOME/villagesql-server -DWITH_DEBUG=1 -DCMAKE_INSTALL_PREFIX=$HOME/mysql
```

**macOS:**

```bash theme={null}
# Create build directory (outside the repo)
mkdir -p ~/build/villagesql
cd ~/build/villagesql

# Configure with CMake
cmake ~/villagesql-server -DWITH_DEBUG=1 -DCMAKE_INSTALL_PREFIX=~/mysql -DWITH_SSL=system
```

<Note>
  **Usuários de Linux:** Use `$HOME` para caminhos absolutos. **Usuários de macOS:** Use `~` (til). Substitua o caminho do repositório pela localização real do seu clone, se for diferente.
</Note>

### Opções do CMake explicadas

* `<path-to-repo>` - Caminho para o repositório clonado do VillageSQL (use `$HOME` no Linux, `~` no macOS)
* `-DWITH_DEBUG=1` - Habilita símbolos de depuração (recomendado para desenvolvimento)
* `-DCMAKE_INSTALL_PREFIX=~/mysql` - Define o diretório de instalação
* `-DWITH_SSL=system` - Usa a biblioteca OpenSSL do sistema (obrigatório no macOS)

### Opções adicionais do CMake

**Compilação de produção sem símbolos de depuração:**

Linux:

```bash theme={null}
cmake $HOME/villagesql-server -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
```

macOS:

```bash theme={null}
cmake ~/villagesql-server -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
```

**Com comentário de compilação personalizado:**

Linux:

```bash theme={null}
cmake $HOME/villagesql-server -DWITH_DEBUG=1 \
      -DCMAKE_INSTALL_PREFIX=$HOME/mysql \
      -DCOMPILATION_COMMENT="VillageSQL Version of MySQL"
```

macOS:

```bash theme={null}
cmake ~/villagesql-server -DWITH_DEBUG=1 \
      -DCMAKE_INSTALL_PREFIX=~/mysql \
      -DCOMPILATION_COMMENT="VillageSQL Version of MySQL"
```

**Modo de desenvolvedor com avisos mais rigorosos:**

Linux:

```bash theme={null}
cmake $HOME/villagesql-server -DMYSQL_MAINTAINER_MODE=ON -DWITH_DEBUG=1
```

macOS:

```bash theme={null}
cmake ~/villagesql-server -DMYSQL_MAINTAINER_MODE=ON -DWITH_DEBUG=1
```

<Note>
  Se precisar reconfigurar, limpe primeiro o cache do CMake (execute a partir do diretório de compilação):

  ```bash theme={null}
  rm CMakeCache.txt
  ```
</Note>

## Passo 3: Compilar o código

Compile o VillageSQL usando make com compilação paralela. A partir do diretório de compilação:

**Compilar somente o servidor (recomendado para desenvolvimento):**

```bash theme={null}
make -j10 mysqld
```

**Compilar tudo:**

```bash theme={null}
make -j10
```

<Tip>
  Ajuste o paralelismo (`-j10`) de acordo com os núcleos da sua CPU. Subtraia de 2 a 4 do total de núcleos para manter o sistema responsivo. Por exemplo, em uma máquina de 12 núcleos, use `-j10`.
</Tip>

Quando concluir, verifique se o binário do servidor foi compilado:

**Linux:**

```bash theme={null}
ls $HOME/build/villagesql/bin/mysqld
```

**macOS:**

```bash theme={null}
ls ~/build/villagesql/bin/mysqld
```

## Passo 4: Inicializar o banco de dados

Antes de iniciar o servidor pela primeira vez, inicialize o diretório de dados:

**Linux:**

Produção (com senha gerada - recomendado):

```bash theme={null}
mkdir -p $HOME/mysql-data/data
$HOME/build/villagesql/bin/mysqld --initialize --datadir=$HOME/mysql-data/data --basedir=$HOME/build/villagesql
```

Desenvolvimento (sem senha - opcional):

```bash theme={null}
mkdir -p $HOME/mysql-data/data
$HOME/build/villagesql/bin/mysqld --initialize-insecure --datadir=$HOME/mysql-data/data --basedir=$HOME/build/villagesql
```

**Executando como root (Docker ou sudo):**

Se estiver executando como root (por exemplo, no Docker), o MySQL exige a flag `--user=root`:

```bash theme={null}
# Initialize as root
$HOME/build/villagesql/bin/mysqld --user=root --initialize-insecure --datadir=$HOME/mysql-data/data --basedir=$HOME/build/villagesql
```

**macOS:**

Produção (com senha gerada - recomendado):

```bash theme={null}
mkdir -p ~/mysql-data/data
~/build/villagesql/bin/mysqld --initialize --datadir=~/mysql-data/data --basedir=~/build/villagesql
```

Desenvolvimento (sem senha - opcional):

```bash theme={null}
mkdir -p ~/mysql-data/data
~/build/villagesql/bin/mysqld --initialize-insecure --datadir=~/mysql-data/data --basedir=~/build/villagesql
```

<Note>
  Use `--initialize` (com senha) para configurações semelhantes às de produção. Use `--initialize-insecure` (sem senha) apenas para desenvolvimento e testes locais. Ao usar `--initialize`, uma senha temporária será gerada e exibida no console: `A temporary password is generated for root@localhost: <password>`
</Note>

Verifique se a inicialização foi bem-sucedida conferindo se os bancos de dados de sistema foram criados:

**Linux:**

```bash theme={null}
ls $HOME/mysql-data/data/mysql
```

**macOS:**

```bash theme={null}
ls ~/mysql-data/data/mysql
```

## Passo 5: Iniciar o servidor

Inicie o servidor VillageSQL:

**Linux:**

```bash theme={null}
$HOME/build/villagesql/bin/mysqld --gdb --datadir=$HOME/mysql-data/data --basedir=$HOME/build/villagesql
```

**Executando como root (Docker ou sudo):**

```bash theme={null}
$HOME/build/villagesql/bin/mysqld --user=root --gdb --datadir=$HOME/mysql-data/data --basedir=$HOME/build/villagesql
```

**macOS:**

```bash theme={null}
~/build/villagesql/bin/mysqld --gdb --datadir=~/mysql-data/data --basedir=~/build/villagesql
```

<Tip>
  A flag `--gdb` instala um manipulador de `SIGINT` para que Ctrl-C interrompa o servidor de forma limpa, o que é útil ao executá-lo interativamente a partir de um terminal. Para executar em segundo plano, adicione `--daemonize` ao comando `mysqld`.
</Tip>

## Passo 6: Conectar com o cliente MySQL

Abra um novo terminal e conecte-se ao servidor usando o cliente MySQL:

**Linux:**

Se estiver usando --initialize-insecure (sem senha):

```bash theme={null}
$HOME/build/villagesql/bin/mysql -u root
```

Se estiver usando --initialize (com senha gerada):

```bash theme={null}
$HOME/build/villagesql/bin/mysql -u root -p
# Enter the temporary password printed during initialization
```

**macOS:**

Se estiver usando --initialize-insecure (sem senha):

```bash theme={null}
~/build/villagesql/bin/mysql -u root
```

Se estiver usando --initialize (com senha gerada):

```bash theme={null}
~/build/villagesql/bin/mysql -u root -p
# Enter the temporary password printed during initialization
```

Você deverá ver o prompt do MySQL:

```
Welcome to the VillageSQL Server for MySQL monitor.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

### Verificar a instalação

Verifique se você está executando o VillageSQL:

```sql theme={null}
SELECT VERSION();
```

As compilações de desenvolvimento incluem o hash do commit do git na string de versão:

```
8.4.10-villagesql-0.0.5
```

## Passo 7: Configurar usuários e banco de dados

### Alterar a senha do root

Se você usou `--initialize`, altere a senha temporária:

```sql theme={null}
SET PASSWORD = 'your-secure-password';
```

### Criar um usuário de desenvolvimento

Para o desenvolvimento diário, crie um usuário que não seja root:

```sql theme={null}
-- Create user
CREATE USER developer IDENTIFIED BY 'dev-password';

-- Grant all privileges
GRANT ALL PRIVILEGES ON *.* TO developer;
```

Saia e reconecte-se como o seu novo usuário:

**Linux:**

```bash theme={null}
# Ctrl-D to exit
$HOME/build/villagesql/bin/mysql -u developer -p
```

**macOS:**

```bash theme={null}
# Ctrl-D to exit
~/build/villagesql/bin/mysql -u developer -p
```

### Criar um banco de dados

```sql theme={null}
CREATE DATABASE my_database;
USE my_database;
```

<Tip>
  Conecte-se a um banco de dados específico: `mysql -u developer -p -D my_database`
</Tip>

Para depuração com GDB, execução de testes e contribuição para a base de código do servidor, consulte o [Guia de Desenvolvimento do Servidor](/docs/pt-BR/mysql-8.4/0.0.5/server-development).

## Solução de problemas

### A compilação falha por dependências ausentes

Instale os pacotes de desenvolvimento necessários para a sua plataforma. Verifique a mensagem de erro para identificar bibliotecas ausentes específicas.

### O servidor não inicia

* Verifique se o diretório de dados foi inicializado: `ls ~/mysql-data/data/`
* Verifique se outra instância do MySQL/VillageSQL está usando a porta 3306
* Consulte os logs de erro em `~/mysql-data/data/*.err`

### A instalação da extensão falha

* Certifique-se de que a biblioteca da extensão (`.so` ou `.dll`) existe na saída da compilação
* Verifique se o VillageSQL tem as permissões necessárias para carregar extensões
* Verifique se o nome da extensão e o nome do arquivo .veb estão corretos

## Próximos passos

<CardGroup cols={3}>
  <Card title="Instalando Extensões" icon="puzzle-piece" href="/docs/pt-BR/mysql-8.4/0.0.5/install">
    Aprenda a instalar, atualizar e gerenciar extensões do VillageSQL.
  </Card>

  <Card title="Criando Extensões em C++" icon="code" href="/docs/pt-BR/mysql-8.4/0.0.5/create">
    Crie suas próprias extensões personalizadas para o VillageSQL.
  </Card>

  <Card title="Introdução" icon="rocket" href="/docs/pt-BR/mysql-8.4/0.0.5/index">
    Guia de início rápido para o VillageSQL.
  </Card>
</CardGroup>
