> ## 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
* **Uma plataforma compatível** - Debian ou Ubuntu Linux, ou macOS com [Homebrew](https://brew.sh)

O repositório inclui um script que instala o compilador, o CMake e as
bibliotecas de desenvolvimento necessárias para a compilação. O Passo 2 executa
esse script, portanto você não precisa instalar esses pacotes por conta própria.

## 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: Instalar as dependências de compilação

Execute o script de configuração a partir do repositório que você acabou de
clonar. O script detecta o seu sistema operacional e instala os pacotes
necessários para a compilação:

```bash theme={null}
cd "$HOME/villagesql-server"
villagesql/bld_tools/setup_build_env.sh
```

No Linux, o script usa o `apt-get` e solicita `sudo`. No macOS, ele usa o
Homebrew. A CI do VillageSQL instala as suas dependências de compilação com o
mesmo script, portanto a lista de pacotes permanece atualizada em relação à
compilação.

<Note>
  O script é compatível com Debian ou Ubuntu Linux e com macOS. Em outra
  distribuição Linux, leia `villagesql/bld_tools/setup_linux_build_env.sh` e
  instale os pacotes equivalentes com o seu próprio gerenciador de pacotes.
</Note>

<h2 id="step-3-configure-with-cmake">
  Passo 3: Configurar com o CMake
</h2>

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

```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"
```

No macOS, adicione `-DWITH_SSL=system` para que o CMake encontre o OpenSSL do Homebrew:

```bash theme={null}
cmake "$HOME/villagesql-server" -DWITH_DEBUG=1 -DCMAKE_INSTALL_PREFIX="$HOME/mysql" -DWITH_SSL=system
```

<Note>
  Os caminhos usam `$HOME` em vez de `~` em todo o documento, nas duas
  plataformas. O shell só expande `~` no início de uma palavra, portanto
  `--datadir=~/mysql-data/data` chega ao `mysqld` como um diretório literalmente
  chamado `~` e o servidor é abortado. As aspas em `"$HOME/..."` também mantêm o
  caminho íntegro caso o nome do seu diretório pessoal contenha um espaço.
  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
* `-DWITH_DEBUG=1` - Habilita símbolos de depuração (recomendado para desenvolvimento)
* `-DCMAKE_INSTALL_PREFIX="$HOME/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:**

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

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

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

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

```bash theme={null}
cmake "$HOME/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 4: Compilar o código

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

**Compilar o servidor e o cliente (recomendado para desenvolvimento):**

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

O alvo `mysql` compila o cliente usado para conectar no
[Passo 7](#step-7-connect-with-mysql-client); `make -j10 mysqld` sozinho compila
somente o servidor, e o Passo 7 então não teria nenhum cliente para executar.

**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 os binários do servidor e do cliente foram compilados:

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

## Passo 5: Inicializar o banco de dados

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

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"
```

<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:

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

## Passo 6: Iniciar o servidor

Inicie o servidor VillageSQL:

```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"
```

<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>

<h2 id="step-7-connect-with-mysql-client">
  Passo 7: Conectar com o cliente MySQL
</h2>

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

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
```

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:

```
9.7.2-villagesql-0.0.6-dev-5a64e122090
```

## Passo 8: 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:

```bash theme={null}
# Ctrl-D to exit
"$HOME/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-9.7/stable/server-development).

## Solução de problemas

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

Execute o script de configuração novamente. O [Passo 3](#step-3-configure-with-cmake)
deixa você no diretório de compilação, portanto informe o caminho absoluto do script:

```bash theme={null}
"$HOME/villagesql-server/villagesql/bld_tools/setup_build_env.sh"
```

Verifique a mensagem de erro para identificar a biblioteca ausente específica.

### O servidor não inicia

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

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

* Certifique-se de que a biblioteca da extensão (`.so` no Linux, `.dylib` no macOS) 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-9.7/stable/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-9.7/stable/create">
    Crie suas próprias extensões personalizadas para o VillageSQL.
  </Card>

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