Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

InternetComponentSuite

Overbyte ICS V9.8A - CSL fork: FPC 3.2.2+ / Lazarus compatibility (additive IFDEF FPC guards; Delphi 13 / C++Builder branch untouched).

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

Internet Component Suite (ICS) — Fork CSL 9.8A (FPC 3.2.2+ / Lazarus)

Porte do Overbyte ICS V9.8 (Internet Component Suite, de François Piette / Overbyte — IcsVerLitNum 908, sincronizado com o upstream a 2026-07-28) para Free Pascal 3.2.2+ / Lazarus, mantendo o ramo Delphi 13 / C++Builder intacto.

Revisão do fork CSL: 9.8A — ICS V9.8 (upstream) + revisão CSL A (a 1ª): compatibilidade FPC 3.2.2 e 3.3.1 (win32/win64) com SSL/TLS, objectos zlib zobj1321 (1.3.2.1), matriz 100%.

Regra de ouro: todas as alterações de compatibilidade são aditivas e guardadas por {$IFDEF FPC}. O caminho Delphi/C++Builder fica verbatim — nenhum comportamento existente muda.


Estado (o que funciona)

Alvo Compila Liga Corre SSL/TLS
Delphi 13 win32 ✅ ✅ ✅ ✅ (intacto)
Delphi 13 win64 ✅ ✅ ✅ ✅ (intacto)
FPC 3.3.1 win32 ✅ ✅ ✅ ✅
FPC 3.3.1 win64 ✅ ✅ ✅ ✅
FPC 3.2.2 win32 ✅ ✅ ✅ ✅
FPC 3.2.2 win64 ✅ ✅ ✅ ✅²

² Resolvido a 2026-07-28 (antes constava como "ICE 200603061 — usar 3.3.1"). O diagnóstico final provou que o SSL nunca foi o culpado: o Internal error 200603061 era do linker interno COFF do FPC 3.2.2 win64 (ogcoff.pas) ao processar os objectos zlib do mingw-w64 — que só entravam no link porque TSslHttpRest → HttpProt → ZlibHigh → ZLibObj os puxa (um programa sem SSL nenhum que use zlib dava exactamente o mesmo ICE). Duas causas nos .o: as secções SEH .pdata/.xdata, e sobretudo os stubs COMDAT .rdata$.refptr.* duplicados entre TUs — no fold das duplicatas o linker 3.2.2 não redireciona as relocs para a cópia sobrevivente e aborta ("reloc pointing to unused section"). Fix nos objectos (zero mudanças de código): -fno-asynchronous-unwind-tables + objcopy --rename-section/--redefine-sym para tornar cada refptr única por unit — ver tools/Build-Zlib1321Objs.ps1. Validado por round-trip zlib e cadeia SSL completa (TSslWSocket+TSslHttpRest) nos 4 alvos FPC + dcc32/dcc64. Reprodução: o build directo por fpc no 3.2.2 exige -MDelphiUnicode (caso contrário o scanner de comentários aninhados aborta com "Unexpected end of file"); o .lpk/lazbuild já o garante via SyntaxMode=Delphi.

  • 107 units compilam no pacote runtime Lazarus (Packages/Lazarus/IcsCommonPkg.lpk), incluindo a cadeia SSL (TSslWSocket, binding OpenSSL).
  • Runtime validado por consumidor real (Packages/Lazarus/test/icstest) que instancia TSslWSocket e liga com SSL, via lazbuild + FPC 3.3.1.
  • Design-time (paleta Lazarus): pendente — porte de OverbyteIcsReg para LCL + IcsLcl.lpk.

Pré-requisitos

Dependência Uso
Delphi 13 (dcc32/dcc64, RAD Studio) build do ramo Delphi (opcional)
FPC 3.2.2 ou 3.3.1 (win32 e win64) build do ramo FPC (3.3.1 recomendado; 3.2.2 100% desde o fix do ICE)
Lazarus (lazbuild) build do pacote .lpk e consumidores
mingw-w64 gcc só se for preciso regenerar os objectos zlib .o (ver abaixo)
OpenSSL 3.x / 4.x DLLs carregadas em runtime (não em compile-time) para SSL/TLS
JEDI (winunits-jedi) · FPMasks (fpindexer) units de sistema/máscaras usadas por alguns módulos

Os toolchains (deps/), DLLs OpenSSL (dll/), objectos compilados (Lib/) e saídas de build (_fpcbuild/) não estão neste repositório (ver .gitignore) — são pré-requisitos externos.


A compatibilização FPC — como foi feita

1. Peça-chave: Source/Include/OverbyteIcsDefs.inc

Toda a base do porte assenta neste include (carregado por todas as units):

Directiva (sob {$IFDEF FPC}) Porquê
{$MODE DELPHIUNICODE} (guardado por ICS_FPC_MODE_SET) String = UnicodeString, Char = WideChar, PChar = PWideChar — alinha o modelo de strings com o Delphi moderno. Guard include-once porque o .inc é re-incluído várias vezes por unit e o {$MODE} é posicional no FPC.
{$DEFINE UNICODE} activa os caminhos de código Unicode do ICS (iguais ao Delphi ≥ 2009).
{$UNDEF RTL_NAMESPACES} o FPC não tem dotted unit scope names (Winapi.*, System.*) — sem isto: "Can't find unit Winapi.Windows".
SSL ON por omissão (escape ICS_FPC_NO_SSL) o ICS original desligava SSL no FPC; com a base DELPHIUNICODE a cadeia TSslWSocket/OpenSSL compila. Define ICS_FPC_NO_SSL para voltar a desligar.

2. Shims RTL (FPC-only) — Source/Helpers/

Preenchem lacunas da RTL do FPC face à do Delphi, sem tocar nas call sites:

Shim Substitui Fornece
OverbyteIcsFpcIOUtils.pas System.IOUtils TFile (Exists/ReadAllText/WriteAllText), TPath (GetDirectoryName/Combine/…)
AnsiStrings.pas System.AnsiStrings StrLen/StrCopy/StrLComp (PAnsiChar e PWideChar)/PosEx — mantém o nome de unit AnsiStrings para as chamadas qualificadas resolverem
OverbyteIcsFpcStrUtils.pas overloads de IfThen IfThen para tipos em falta
OverbyteIcsFpc.inc — defines de feature (FPC_USE_GENERICS_COLLECTIONS, FPC_RTTI_GETATTRIBUTES)

3. Objectos zlib — Source/zobj1321/ (zlib 1.3.2.1)

O OverbyteIcsZLibObj.pas linka a zlib como objectos (sem DLL externa). Desde 28/07 os {$L} apontam para zobj1321/ (zlib 1.3.2.1-motley recompilada de sdk/zlib) em ambos os ramos, gerada por tools/Build-Zlib1321Objs.ps1:

  • win32 .obj (Delphi): bcc32c -c -O2 → OMF.
  • win32 .o (FPC): mingw-w64 gcc -m32 → COFF-i386.
  • win64 .o/.obj (FPC e Delphi): mingw-w64 gcc -m64 -fno-asynchronous-unwind-tables → COFF x64, com pós-processamento objcopy que torna os stubs COMDAT .refptr.* únicos por unit — o fix do ICE 200603061 do linker interno FPC 3.2.2 win64 (ver nota ² acima).
  • Ligados sob {$IFDEF FPC} com {$L …o} + {$LINKLIB gcc}{$LINKLIB msvcrt}; no FPC win64 o record z_stream ganhou um pad aditivo (o C alinha a 88 bytes; sem ele deflateInit_ devolvia Z_VERSION_ERROR).
  • A pasta Source/zobj1212/ mantém os objectos originais do ICS (zlib 1.2.12; .obj zlibpas de Gabriel Corneanu) — intactos, como referência/fallback.

4. Catálogo de padrões aplicados (47 ficheiros modificados)

Todas as edições são {$IFDEF FPC} aditivas. Os padrões recorrentes:

Padrão Problema → solução
P-NS namespaces dotted / units só-Delphi → Masks→FPMasks, PsApi→JwaPsApi, WinSvc→JwaWinSvc, IOUtils/AnsiStrings→shims
P-APIW APIs Win32 “planas” (ANSI) resolvem mal na base Unicode → variantes …W explícitas (CreateFileW, LoadLibraryW, RegOpenKeyExW…)
P-CV {$IF CompilerVersion …} inexistente no FPC → {$IFDEF FPC} equivalente
P-RTLSTR overrides de RTL que exigem AnsiString (ex.: GetDisplayName, TCustomIniFile)
P-322RTL lacunas da RTL 3.2.2 (UnicodeFromLocaleChars→MultiByteToWideChar, TInterlocked→InterlockedCompareExchange, AtomicIncrement)
P-ZLIB .obj Delphi não linka no FPC → .o mingw + {$LINKLIB}
P-DUPDECL Extended = Double no win64 colide em redeclarações → guard {$IF … FPC_HAS_TYPE_EXTENDED}

Detalhe completo (ficheiro a ficheiro, com o diff literal) em:

  • .workspace/reports/ics-fpc-customizacoes-relatorio_v1.0.md — manual de reprodução (10 secções)
  • .workspace/reports/ics-fpc-diff-por-ficheiro.md — os 47 ficheiros, um a um, com finalidade + hunks
  • .workspace/reports/ics-fpc-customizacoes.patch — diff literal cru (svn diff)

Como compilar (FPC / Lazarus)

Pacote runtime (recomendado — resolve os paths de source, include e objectos):

powershell
lazbuild Packages\Lazarus\IcsCommonPkg.lpk

Consumidor de exemplo (instancia TSslWSocket, liga com SSL):

powershell
lazbuild Packages\Lazarus\test\icstest.lpi
.\Packages\Lazarus\test\icstest.exe

Caveat 3.3.1: com o internal linker + DWARF ligados houve "Compilation raised exception internally"; compilar com debug OFF (-g-) — já configurado no .lpi do teste.

Regenerar os objectos zlib .o (só se sdk/zlib mudar de versão):

powershell
powershell -ExecutionPolicy Bypass -File tools\Build-Zlib1321Objs.ps1

Estrutura relevante

text
Source/                     units ICS (.pas) — com guards {$IFDEF FPC} aditivos
├── Include/OverbyteIcsDefs.inc   ← peça-chave do porte
├── Helpers/                      ← shims RTL FPC-only (NOVOS)
└── zobj1321/                     ← objectos zlib 1.3.2.1 (.obj Delphi + .o FPC; zobj1212 = originais ICS)
Packages/Lazarus/           IcsCommonPkg.lpk (runtime) + test/ (consumidor)
tools/Build-Zlib1321Objs.ps1  gera os objectos zlib 1.3.2.1 (.o FPC + .obj Delphi)
.workspace/reports/         relatórios detalhados do porte

Créditos e licença

  • Overbyte ICS © 1996–2026 François Piette / Overbyte — licença original do ICS (ver ReadMe9.txt e cabeçalhos das units). Componentes mantidos por Angus Robertson.
  • zlib © Jean-loup Gailly & Mark Adler; objectos .obj de zlibpas (Gabriel Corneanu).
  • Porte FPC 3.3.1 / Lazarus: CSL Softwares (ProvidersORM v3) — alterações aditivas {$IFDEF FPC}.

Este fork preserva a licença original do ICS. As alterações de compatibilidade FPC são contribuições aditivas e não alteram os termos de uso do ICS a montante.