Suporte de Compilador
July 1, 2026 · View on GitHub
Leia em English ou Português (BR).
O Horse abrange uma ampla gama de versões do Delphi e do Free Pascal. Esta página lista o que é suportado, o que é testado e as considerações por Provider / por Tipo de aplicação.
Para o modelo de dois eixos (Provider — Indy / fphttpserver / CrossSocket / mORMot2 / ICS / HttpSys — × Tipo de aplicação — Console / VCL / Daemon / Apache / ISAPI / CGI / FCGI / LCL / HTTPApplication), veja Providers e Tipos de aplicação.
Delphi
| Versão | Versão do compilador | Status |
|---|---|---|
| Delphi 13 Florence | 38.0 | Suportado |
| Delphi 12 Athens | 36.0 | Recomendado |
| Delphi 11 Alexandria | 35.0 | Suportado |
| Delphi 10.4 Sydney | 34.0 | Suportado |
| Delphi 10.3 Rio | 33.0 | Suportado |
| Delphi 10.2 Tokyo | 32.0 | Suportado |
| Delphi 10.1 Berlin | 31.0 | Suportado |
| Delphi 10 Seattle | 30.0 | Suportado |
| Delphi XE8 | 29.0 | Suportado |
| Delphi XE7 | 28.0 | Mínimo |
O CI roda no Delphi 11 e 12 contra a suíte tests/ oficial. Qualquer coisa abaixo de 10.4 recebe consideração de compatibilidade de código-fonte mas não é exercitada ativamente.
Free Pascal / Lazarus
| Versão | Status |
|---|---|
| FPC 3.2.2 + Lazarus 2.2 | Recomendado |
| FPC 3.2.0 + Lazarus 2.0 | Suportado |
| FPC 3.3.1 (trunk) | Suportado com {$MODE DELPHI}{$H+} |
Plataformas-alvo
O conjunto de plataformas depende de qual Provider é selecionado e qual Tipo de aplicação está sendo construído. As duas tabelas abaixo correspondem ao modelo de dois eixos.
Providers self-hosted × Plataforma
O Provider que é dono do socket. Indy é só-Delphi; fphttpserver é só-FPC; CrossSocket e mORMot2 atendem ambos; ICS é só-Delphi (Windows + POSIX/Linux64); HttpSys é só Windows (Delphi + FPC), nativo do Horse.
| Plataforma | Indy (padrão Delphi) | fphttpserver (padrão FPC) | CrossSocket (HORSE_PROVIDER_CROSSSOCKET) | mORMot2 (HORSE_PROVIDER_MORMOT) | ICS (HORSE_PROVIDER_ICS) | HttpSys (HORSE_PROVIDER_HTTPSYS) |
|---|---|---|---|---|---|---|
| Windows x86 / x64 | ✔ | ✔ | ✔ (IOCP) | ✔ (IOCP; também http.sys via THttpApiServer) | ✔ (OpenSSL 3.x/4.x; TLS 1.3, mTLS) | ✔ (http.sys, modo kernel; nativo) |
| Linux x64 | ✔ | ✔ | ✔ (epoll, alvo primário) | ✔ (epoll) | ✔ (POSIX do Delphi; pump Ics.Posix.*) | — |
| macOS Intel / ARM64 | ✔ | ✔ | ✔ (kqueue) | ✔ | ✔ (POSIX do Delphi) | — |
| FreeBSD | — | ✔ | ✔ (kqueue) | ✔ (kqueue) | — | — |
| Android / iOS | — | — | — | — | — | — |
Tipos de aplicação host-managed × Plataforma
Estes não usam um Provider self-hosted — o processo host é dono do socket. Cobertura depende de onde o host roda.
| Plataforma | Módulo Apache | ISAPI (IIS) | CGI | FastCGI |
|---|---|---|---|---|
| Windows x86 / x64 | ✔ | ✔ | ✔ | ✔ |
| Linux x64 | ✔ | — | ✔ | ✔ |
| macOS Intel / ARM64 | — | — | ✔ | — |
| FreeBSD | — | — | ✔ | — |
| Android / iOS | — | — | — | — |
(Apenas alvos server-side — para código HTTP cliente, as bibliotecas HTTP do Delphi suportam plataformas móveis mais amplas.)
Notas por Provider (self-hosted)
Indy — padrão Delphi
- Funciona em todas as versões Delphi listadas acima. Não disponível no FPC — builds FPC usam
fphttpserver. - Provider unit:
Horse.Provider.Console/Horse.Provider.VCL/Horse.Provider.Daemon. Cada umauses IdHTTPWebBrokerBridge, IdContext, IdSSLOpenSSL, …. - DLLs do OpenSSL (
libeay32.dll/ssleay32.dlloulibssl-1_1-x64.dll/libcrypto-1_1-x64.dll) precisam acompanhar o binário para HTTPS.
fphttpserver — padrão FPC
- Funciona em todas as versões FPC listadas acima. Não disponível no Delphi — builds Delphi usam Indy.
- Provider unit:
Horse.Provider.FPC.Daemon/Horse.Provider.FPC.HTTPApplication/Horse.Provider.FPC.LCL. Cada umauses fphttpserver, fpHTTP, httpdefs. - SSL via OpenSSL através dos handlers HTTP padrão do FPC — sem dependência do Indy.
CrossSocket — opcional, entre compiladores
- Exige Delphi 10.2 Tokyo ou mais recente (a biblioteca
Delphi-Cross-Socketusavarinline e tiposSystem.Netnão presentes em versões anteriores). - Exige FPC 3.2.0 ou mais recente para builds FPC.
- Plataformas testadas: Windows x64, Linux x64, macOS ARM64.
- Substitui Indy (Delphi) e
fphttpserver(FPC) por um único transporte assíncrono para os dois compiladores. - Instalação é manual (espelha o padrão de instalação do mORMot2, não Boss): clone
winddriver/Delphi-Cross-Socket(upstream) e adicione seus search paths. O upstream não embute o CnPack — clone tambémcnpack/cnvcle adicioneSource/Common+Source/Cryptoao search path (oUtils.Hash.pasdo Delphi-Cross-Socket usaCnMD5,CnSHA1,CnSHA2,CnSM3eCnPemUtilsmais suas dependências transitivas). Três bug fixes que antes eram exclusivos do fork (PATCH-IOCP-1, hang do parser para respostas sem body, e o nil-guard em_OnBodyEnd) já foram ibtegradas no upstream a partir de 2026-Q2 — não é necessário aplicar patches no upstream para HTTP e HTTPS unidirecional. - TLS mútuo no servidor ainda é exclusivo do fork no nível de fonte. O
Net.CrossSslSocket.Base.paseNet.CrossSslSocket.OpenSSL.pasdo upstream ainda não expõem a cadeia de overloadsSetCACertificate(File)nem oSetVerifyPeer(Boolean)virtual abstract que o Provider chama quandoTHorseCrossSocketConfig.SSLVerifyPeer = True. Um PR upstream está em preparação; até ele entrar, usuários de mTLS precisam ou aplicar os dois patchesNet.CrossSslSocket.*manualmente sobre o upstream ou usar o release pré-empacotado do fork (próximo item). - Alternativa suportada — release do fork
freitasjca/Delphi-Cross-Socket v1.0.3: clone único, inclui o CnPack e já entrega os dois patches mTLS deNet.CrossSslSocket.*aplicados —SetCACertificate(File)+SetVerifyPeer(Boolean)ficam imediatamente disponíveis. Use quandoSSLVerifyPeer = Trueou quando preferir a conveniência de uma única dependência em vez de acompanhar o upstream diretamente. Trade-off: o fork fica para trás do histórico de commits do upstream entre os syncs (tipicamente <24h via o workflow automatizado de sync). - Veja
horse-provider-crosssocketpara o runbook completo das três opções de instalação e a matriz atual de teste por versão.
mORMot2 — opcional, entre compiladores
- Compatível com Delphi 7 até 12.3 Athens — a faixa de compilador mais ampla entre todos os Providers, graças ao suporte legado de longa data do próprio mORMot. As unidades adapter do lado Horse carregam guards
{$IF CompilerVersion >= 32.0}(Delphi 10.2+) em um número pequeno de fronteirasInt64/Integer; XE7+ no restante. - Requer FPC 3.2.0 ou superior em builds FPC.
- Plataformas testadas: Windows x86 / x64, Linux x64, macOS ARM64.
- Substitui Indy (Delphi) e
fphttpserver(FPC) peloTHttpServerdo mORMot2 (IOCP / epoll) — Pascal puro, sem dependências de bibliotecas C compiladas para HTTP padrão. No Windows, troqueTHttpServerporTHttpApiServerpara obter HTTP em modo kernel via http.sys sem nenhuma mudança de código. - O mORMot2 não está disponível via
boss install— clone synopse/mORMot2 diretamente e adicione as entradas de search-path documentadas emhorse-provider-mormot. - No Delphi o build também exige os blobs
.objpré-compilados domormot2static.7z(último release do mORMot2) extraídos emmORMot2\static\delphi\. Sem eles o linker falha comE1026 File not found: '..\..\static\delphi\zlibdeflate.obj'. As variantes FPC usam arquivos.oemmORMot2\static\<target>configurados via os paths-Fldo projeto. - Veja
horse-provider-mormotpara a matriz atual de teste por versão e o record de configuração (THorseMormotConfig).
ICS — opcional, Delphi (Windows + POSIX/Linux)
- Requer Delphi 2009 ou posterior (mínimo do OverbyteICS) — recomenda-se 10.4 Sydney+ para acompanhar o resto da stack. Somente Delphi: Windows mais POSIX (Linux64 / macOS) via o pump de mensagens próprio do ICS (
Ics.Posix.*). Um port para Lazarus/FPC não é viável — a camada POSIX do ICS usa a RTL POSIX do Delphi, e o ICS desativa o OpenSSL no FPC. - Substitui o Indy pelo
THttpServer/TSslHttpServerdo OverbyteICS. Diferencial: OpenSSL 3.x / 4.x moderno (TLS 1.3, SNI, mTLS); as bibliotecas OpenSSL acompanham o ICS (DLLs no Windows,.sono Linux). No Linux, useHORSE_APPTYPE_DAEMON+THorseICSLinuxDaemonApp.Runpara um daemon com tratamento de sinais. - Instalação manual (não via Boss): instale o OverbyteICS seguindo as instruções oficiais do ICS — baixe/clone o ICS (v9.x) e adicione a pasta
Source/ao search path; depois adicionehorse-provider-ics/src. - Limitações da v1: uploads precisam enviar
Content-Length(corpos de requisição chunked são rejeitados pelo ICS); keep-alive está desativado. Veja Limitações conhecidas no README do provider. - Veja
horse-provider-icspara configuração, a suíte de testes A–K e as notas específicas do ICS.
HttpSys — opcional, somente Windows, nativo
- Nativo do Horse — a unit
Horse.Provider.HttpSysacompanha o framework; sem biblioteca externa, sem dependência de Boss. Basta adicionarHORSE_PROVIDER_HTTPSYSaos Conditional Defines do projeto. - Somente Windows, em Delphi e FPC/Lazarus — liga-se ao
httpapi.dll, a pilha HTTP em modo kernel http.sys do Windows (a mesma que o IIS usa). Selecioná-lo em um alvo não-Windows é erro de compilação. - Sem DLLs a distribuir — o http.sys faz parte do SO. Dois pré-requisitos no nível da máquina se aplicam por o http.sys ser global: uma reserva de URL (
netsh http add urlacl …) para hosts diferentes delocalhostou portas privilegiadas, e um bindingnetsh http add sslcert …para HTTPS (o certificado fica no repositório do Windows, não em um.pem). - Mesma pilha subjacente do
THttpApiServer(mskHttpApi) do mORMot2 — o HttpSys é a forma autônoma e sem dependências de usá-la. Mutuamente exclusivo com CrossSocket / mORMot2 / ICS.
Tipos de aplicação host-managed
Apache / ISAPI / CGI / FastCGI não usam um Provider self-hosted — nenhum entre Indy, fphttpserver, CrossSocket, mORMot2, ICS ou HttpSys está envolvido. O processo host (Apache httpd, IIS, o webserver) é dono do socket e entrega a requisição ao Horse via subclasses de Web.HTTPApp (Delphi) ou fpFCGI / fpHTTP (FPC).
- Módulo Apache — Delphi (
Web.HTTPD24Impl,Web.ApacheApp). Construa o.so/.dllcom a arquitetura correspondente à do Apache. - Extensão ISAPI — só Delphi (
Web.Win.ISAPIApp). Windows + IIS. Combine a arquitetura com o pool de aplicações do IIS (pool 32-bit → build Win32). - CGI — Delphi (
Web.CGIApp) e FPC. Multiplataforma; um processo por requisição. - FastCGI — FPC (
fpFCGI). Processo persistente; conversa com o webserver via Unix socket ou TCP. FCGI no Delphi requer biblioteca de terceiros e não faz parte dos providers do Horse.
Guards de versão de compilador no código-fonte
O Horse usa alguns guards defensivos. Se você contribui patches:
{$IF DEFINED(FPC)}— código somente-FPC (RTL diferente, sintaxe de generics diferente).{$IF CompilerVersion >= 32.0}— Delphi 10.2 Tokyo introduziu retornoInt64emTWebRequest.GetIntegerVariable/TWebResponse.SetIntegerVariable. Qualquer override desses precisa do guard.{$IF CompilerVersion >= 33.0}— Delphi 10.3 Rio introduziuvarinline. O core do Horse evitavarinline para continuar compilando no XE7.
Para cada alteração, faça a compilação de teste tanto no Delphi (ex.: dcc32, dcc64) quanto no FPC (fpc). Procedimentos anônimos, generics e tipos Web/HTTPApp são as diferenças que mais causam problemas na compilação cruzada entre Delphi e FPC..
Reportando um bug específico de versão
Ao abrir uma issue:
- Inclua a versão exata de Delphi / FPC e a plataforma-alvo (Win64, Linux64, …).
- Inclua o(s) define(s) do provider ativo(s) no projeto.
- Diga se o bug é reproduzível no sample do provider correspondente em
samples/.
A triagem é normalmente rápida quando plataforma e provider estão definidos.
Veja também
- Primeiros passos — caminhos de instalação por IDE.
- Providers e Tipos de aplicação — o modelo de dois eixos: quais combinações Provider × Tipo-de-aplicação existem, e quais units cada uma usa.