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ãoVersão do compiladorStatus
Delphi 13 Florence38.0Suportado
Delphi 12 Athens36.0Recomendado
Delphi 11 Alexandria35.0Suportado
Delphi 10.4 Sydney34.0Suportado
Delphi 10.3 Rio33.0Suportado
Delphi 10.2 Tokyo32.0Suportado
Delphi 10.1 Berlin31.0Suportado
Delphi 10 Seattle30.0Suportado
Delphi XE829.0Suportado
Delphi XE728.0Mí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ãoStatus
FPC 3.2.2 + Lazarus 2.2Recomendado
FPC 3.2.0 + Lazarus 2.0Suportado
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.

PlataformaIndy (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.

PlataformaMódulo ApacheISAPI (IIS)CGIFastCGI
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 uma uses IdHTTPWebBrokerBridge, IdContext, IdSSLOpenSSL, ….
  • DLLs do OpenSSL (libeay32.dll / ssleay32.dll ou libssl-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 uma uses 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-Socket usa var inline e tipos System.Net nã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ém cnpack/cnvcl e adicione Source/Common + Source/Crypto ao search path (o Utils.Hash.pas do Delphi-Cross-Socket usa CnMD5, CnSHA1, CnSHA2, CnSM3 e CnPemUtils mais 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.pas e Net.CrossSslSocket.OpenSSL.pas do upstream ainda não expõem a cadeia de overloads SetCACertificate(File) nem o SetVerifyPeer(Boolean) virtual abstract que o Provider chama quando THorseCrossSocketConfig.SSLVerifyPeer = True. Um PR upstream está em preparação; até ele entrar, usuários de mTLS precisam ou aplicar os dois patches Net.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 de Net.CrossSslSocket.* aplicadosSetCACertificate(File) + SetVerifyPeer(Boolean) ficam imediatamente disponíveis. Use quando SSLVerifyPeer = True ou 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-crosssocket para 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 fronteiras Int64/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) pelo THttpServer do mORMot2 (IOCP / epoll) — Pascal puro, sem dependências de bibliotecas C compiladas para HTTP padrão. No Windows, troque THttpServer por THttpApiServer para 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 em horse-provider-mormot.
  • No Delphi o build também exige os blobs .obj pré-compilados do mormot2static.7z (último release do mORMot2) extraídos em mORMot2\static\delphi\. Sem eles o linker falha com E1026 File not found: '..\..\static\delphi\zlibdeflate.obj'. As variantes FPC usam arquivos .o em mORMot2\static\<target> configurados via os paths -Fl do projeto.
  • Veja horse-provider-mormot para 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 / TSslHttpServer do OverbyteICS. Diferencial: OpenSSL 3.x / 4.x moderno (TLS 1.3, SNI, mTLS); as bibliotecas OpenSSL acompanham o ICS (DLLs no Windows, .so no Linux). No Linux, use HORSE_APPTYPE_DAEMON + THorseICSLinuxDaemonApp.Run para 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 adicione horse-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-ics para 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.HttpSys acompanha o framework; sem biblioteca externa, sem dependência de Boss. Basta adicionar HORSE_PROVIDER_HTTPSYS aos 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 de localhost ou portas privilegiadas, e um binding netsh 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 / .dll com 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 retorno Int64 em TWebRequest.GetIntegerVariable / TWebResponse.SetIntegerVariable. Qualquer override desses precisa do guard.
  • {$IF CompilerVersion >= 33.0} — Delphi 10.3 Rio introduziu var inline. O core do Horse evita var inline 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:

  1. Inclua a versão exata de Delphi / FPC e a plataforma-alvo (Win64, Linux64, …).
  2. Inclua o(s) define(s) do provider ativo(s) no projeto.
  3. 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