mORMot2 的 mormot.defines.inc

mORMot2 的 mormot.defines.inc

到底配置了啥,居然写了700多行!

{
  这个文件是开源Synopse mORMot框架2的一部分,
  遵循MPL/GPL/LGPL三重许可协议 - 详见LICENSE.md

  定义了一组集中的条件编译指令,包含在所有框架单元中,
  也可以用于您自己的私有单元。
}

(********************** 用户触发的条件编译指令 **********************)

{  以下条件编译指令可以在您的项目选项中启用,
   以根据您的设置或项目期望调整编译。 }

{.$define USEPACKAGES}
// 如果在Delphi包中编译单元,请定义此指令
// - 将避免类似"[DCC Error] E2201 Need imported data reference ($G) to access 'VarCopyProc'"的错误
// - 应在包选项级别设置,并默认保持不变
// - 注意:您可能还应在项目选项的“生成DCU文件”中设置“仅生成DCU文件”
// -> Delphi编译器 -> 输出C/C++ -> C/C++输出文件生成

{.$define PUREMORMOT2}
// 如果定义了此指令,则不会启用mORMot 1.18的兼容类型或函数
// - 默认情况下,现有项目应该(几乎)能够使用mORMot 2进行编译
// - 您最终应该定义此条件编译指令,以完美转换代码到新的类型和方法定义

{.$define NEWRTTINOTUSED}
// 如果定义了此指令,则不会将新的RTTI(自Delphi 2010起可用)链接到可执行文件:
// 结果文件大小将大大减小,且mORMot不会受到影响(除非您使用增强的RTTI进行记录/动态数组JSON序列化)
// - 默认未定义以确保最小影响

{.$define FPCUSEVERSIONINFO}
// 为mormot.core.os.pas中的TFileVersion/TExeVersion链接低级别fileinfo/machoreader/elfreader
// - 默认禁用,以保留代码大小

{.$define NOSETTHREADNAME}
// 如果定义了此指令,则SetThreadName()不会引发用于设置线程名称的异常:
// 如果在调试应用程序时遇到问题,请定义此指令

{.$define NODIRECTTHREADMANAGER}
// 在POSIX上,省略直接的GetThreadManager() API调用,仅使用RTL函数

{.$define NOEXCEPTIONINTERCEPT}
// 如果定义了此指令,则不会拦截或记录异常

{.$define NOPATCHVMT}
// 禁用vmtAutoTable槽的运行时补丁,改用Rtti.FindType
// - 可能与NOPATCHRTL条件编译指令一起定义
// - 当内存中的可执行文件无法被修补时(例如,在安全受限的系统上,或在没有mmap支持的操作系统上)可以使用

{.$define NOPATCHRTL}
// 如果定义了此指令,则不会在x86_64上为FPC RTL打补丁以优化汇编代码
// - 可能与NOPATCHVMT条件编译指令一起定义
// - 如果发现某些兼容性问题,可以启用它

{$ifdef CPUX86}
  {.$define HASNOSSE2} // 在非常旧的CPU上强制使用x87代码
{$endif CPUX86}

{.$define NOSYNDBZEOS}
// 使mormot.db.sql.zeos.pas成为一个“空”单元 - 仅对FPC/Lazarus包定义

{.$define NOSYNDBIBX}
// 使mormot.db.sql.ibx.pas成为一个“空”单元 - 仅对FPC/Lazarus包定义

{.$define MONGO_OLDPROTOCOL}
// 可与不支持OP_MSG线协议的旧MongoDB实例(<3.6)一起使用

{.$define DISABLEAPPSQL}
// mormot.db.sql外部数据库不会通过mormot.app链接到可执行文件

{.$define DISABLEAPPNOSQL}
// MongoDB客户端不会通过mormot.app链接到可执行文件

{.$define NOSSPIAUTH}
// 禁用Windows上的mormot.lib.sspi支持,在mormot.rest.client/server单元中

{.$define NOGSSAPIAUTH}
// 禁用Posix上的mormot.lib.gsssapi支持,在mormot.rest.client/server单元中

{.$define NOPOINTEROFFSET}
// 如果您的内存非常大或已碎片化,则在64位上禁用TOrmTable偏移量
// 注意:FPCMM_MEDIUM32BIT可能需要此指令来处理大于256KB的数据

{.$define NOTORMTABLELEN}
// 禁用TOrmTable内部fLen[]预计算表 - 速度较慢但占用内存较少

{.$define NOSQLITE3STATIC}
// 禁用静态SQLite3链接 - 强制使用外部dll/so库

{.$define NOSQLITE3FPUSAVE}
// 在SQLite3引擎期间禁用SetFpuFlags()调用 - 可能提高性能

{.$define DEBUGSTORAGELOCK}
// 定义此指令以强制记录StorageLock/StorageUnLock的详细日志

{.$define DEBUGSQLVIRTUALTABLE}
// 定义此指令以强制记录SQLite3虚拟表查询计划器成本的详细日志

{.$define ONLYUSEHTTPSOCKET}
// 在POSIX上定义,但如果socket+SChannel足够,也可以在Windows上启用

{.$define OLDLIBC}
// 仅使用最旧的libc API,例如accept()而不是accept4()

{.$define OLDLINUXKERNEL}
// 仅使用最旧的Linux系统调用 - 如FPC RTL中所示

{.$define USE_OPENSSL}
// 在POSIX上定义(具有延迟绑定),但也可以在Windows上启用

{.$define USELIBCURL}
// 为https定义跨平台的libcurl
// (当我们的原生socket+OpenSSL/SChannel似乎不够好时)

{.$define LIBCURLMULTI}
// 启用mormot.lib.curl中更高级的“多会话”API函数
// 请参阅https://curl.haxx.se/libcurl/c/libcurl-multi.html接口


{$ifdef FPC}

(********************** FPC条件编译指令 **********************)

  // -----------
  // -- 全局代码生成条件编译指令

  // 注意:您可以通过在项目选项中设置以下内容来移除所有意外的提示
  // -vm11047,6058,5092,5091,5060,5058,5057,5028,5024,5023,4081,4079,4055,3187,3124,3123

  // 禁用一些显而易见的警告 - 使FPC与Delphi在这方面保持一致
  {$WARN 5089 off} // 未初始化的托管变量1
  {$WARN 5091 off} // 未初始化的托管变量2
  {$WARN 5093 off} // 函数结果变量为未初始化的托管变量1
  {$WARN 5094 off} // 函数结果变量为未初始化的托管变量2
  {$WARN 6058 off} // 调用标记为内联的子程序未被内联

  {$ifndef FPC_DELPHI}
    {$MODE DELPHI} // 例如,用于asm语法 - 为FPC 2.6兼容性禁用
  {$endif FPC_DELPHI}

  {$INLINE ON}
  {$MINENUMSIZE 1}
  {$PACKRECORDS DEFAULT} // 强制正常对齐
  {$PACKSET 1}
  {$PACKENUM 1}
  {$CODEPAGE UTF8} // 否则在大多数情况下会出现意外行为
  {$OBJECTCHECKS OFF} // 如在挂钩类时预期

  {$define HASINLINE}
  {$define HASINLINEWINAPI} // Delphi在内联Windows API调用时遇到问题
  {$define HASSAFEINLINE}   // Delphi 2007-2009在内联时遇到问题
  {$define NODELPHIASM}     // 避免例如低级的System.@LStrFromPCharLen
  {$define HASDYNARRAYTYPE} // eltype2字段,例如用于T*ObjArray
  {$define HASITERATORS}
  {$define HASIMPLICITOPERATOR}
  {$define HASDBFTWIDE}
  {$define HASTTHREADSTART}
  {$define HASINTERFACEASTOBJECT}
  {$define EXTENDEDTOSHORT_USESTR} // FPC中FloatToText使用str()
  {$define DOUBLETOSHORT_USEGRISU} // 快速的DoubleToAscii()
  {$define USERECORDWITHMETHODS}   // 仅在Delphi 7中使用"object"
  {$define FPC_OR_UNICODE}
  {$define FPC_OR_DELPHIXE}        // 绕过Delphi内部错误
  {$define FPC_OR_DELPHIXE4}


  // -----------
  // -- 识别FPC版本

  // $if FPC_FULLVERSION>20700 breaks Delphi 6-7 and SynProject :(
{$ifdef VER2_7}
  {$define ISFPC27} // 定义FPC版本为2.7
{$endif VER2_7}

{$ifdef VER3_0}
  {$define ISFPC27} // FPC 3.0仍然兼容2.7的一些特性
  {$define ISFPC30} // 定义FPC版本为3.0
  {$define HASDIRECTTYPEINFO} // 在FPC 3.0中,PTypeInfo将直接存储,无需指针解引用
  // PTypeInfo would be stored with no pointer de-reference
  // => Delphi and newer FPC uses a pointer reference to ease exe linking
{$endif VER3_0}

{$ifdef VER3_1} // 3.2版本之前的trunk版本
  {$define ISFPC27}
  {$define ISFPC30}
  {.$define HASDIRECTTYPEINFO} // 对于2016年6月之前的trunk修订版本,定义此指令
  // define this for trunk revisions older than June 2016 - see
  // http://wiki.freepascal.org/User_Changes_Trunk#RTTI_Binary_format_change
{$endif VER3_1}

{$ifdef VER3_1_1}
  {$define ISFPC32} // 定义FPC版本为3.2(虽然版本号看起来是3.1.1,但按照FPC的命名习惯,这里可能是指3.2的预发布或测试版本)
{$endif VER3_1_1}

{$ifdef VER3_2}
  {$define ISFPC27}
  {$define ISFPC30}
  {$define ISFPC32} // 明确定义FPC版本为3.2
  {$define HASGETTYPEKIND} // FPC 3.2引入了获取类型种类的功能
  {$ifdef VER3_2_2}
    {$define HASTTHREADTERMINATESET} // 引入了TThread.TerminateSet
  {$endif VER3_2_2}
  {$ifdef VER3_2_3}
    {$define HASTTHREADTERMINATESET}
  {$endif VER3_2_3}
{$endif VER3_2}

{$ifdef VER3_3} // 3.2版本之前的trunk版本(又一个可能是指向3.2预览或测试版本的定义)
  {$define ISFPC27}
  {$define ISFPC30}
  {$define ISFPC32}
  {$define HASTTHREADTERMINATESET} // 引入了TThread.TerminateSet
{$endif VER3_3}

{$ifdef VER3_4}
  {$define ISFPC27}
  {$define ISFPC30}
  {$define ISFPC32}
  {$define ISFPC34} // 定义FPC版本为3.4
  {$define FPC_PROVIDE_ATTR_TABLE} // 引入了TTypeData.AttributeTable
  {$define STRCNT32} // 即使在64位CPU上,TAnsiRec.Ref也是32位
  // see https://gitlab.com/freepascal.org/fpc/source/-/issues/38018
  {$define HASTTHREADTERMINATESET} // 引入了TThread.TerminateSet
{$endif VER3_4}

{$if not defined(VER3_0) and not defined(VER3_2) and not defined(VER2)}
  {.$define FPC_PROVIDE_ATTR_TABLE} // 自SVN 42356-42411起应定义,但在mormot.core.Rtti编译错误时应取消定义
  // on compilation error in mormot.core.Rtti, undefine the above conditional
  // see https://lists.freepascal.org/pipermail/fpc-announce/2019-July/000612.html
  {$define STRCNT32} // 新trunk特性:即使在64位CPU上,TAnsiRec.Ref也是32位
{$ifend}

// -----------
// -- 识别操作系统

// 主要是OSWINDOWS或OSPOSIX(包括OSLINUX, OSBSD, OSDARWIN, OSANDROID)

{$ifdef MSWINDOWS}
  // Windows条件编译指令
  {$define OSWINDOWS}
  {$define FPCWINDOWS}
{$else}
  {$define OSPOSIX} // POSIX/BSD系统
  {$define FPCPOSIX}
  {$ifdef BSD}
    // Darwin和BSD家族(如OpenBSD/FreeBSD)的条件编译指令
    {$define OSBSDDARWIN} // OSBSDDARWIN = OSBSD + OSDARWIN
    {$ifdef DARWIN}
      {$define OSDARWIN}
      {$define FPCDARWIN}
      {$ifdef CPUINTEL}
        {$define FPC_PIC} // 可能未在编译器选项中定义
      {$endif CPUINTEL}
      {$define NOPATCHRTL} // 不要修改RTL的汇编代码
      {$define DISABLE_SSE42} // 绕过clang汇编错误
    {$else}
      {$define OSBSD} // OSX有一些非标准的API调用
      {$define FPCBSD}
      {$ifdef OPENBSD}
        {$define OSOPENBSD} // OSBDS = OSOPENBSD + OSFREEBSD
        {$ifdef CPUX86}
          {$define FPC_PIC}
        {$endif CPUX86}
      {$endif OPENBSD}
      {$ifdef FREEBSD}
        {$define OSFREEBSD}
      {$endif FREEBSD}
    {$endif DARWIN}
  {$else}
    {$ifdef LINUX}
      // Linux条件编译指令
      {$define OSLINUX} // 例如,用于禁用epoll API
      {$define FPCLINUX}
      {$define OSLINUXANDROID}
      {$ifdef CPUX64}
        {$define OSLINUXINTEL}
        {$define OSLINUXX64}
      {$endif CPUX64}
      {$ifdef CPUX86}
        {$define OSLINUXINTEL}
        {$define OSLINUXX86}
      {$endif CPUX86}
    {$else}
      {$ifdef ANDROID}
        // Android条件编译指令
        {$define OSANDROID}
        {$define FPCANDROID}
        {$define OSLINUXANDROID}
        {$define NOPATCHRTL} // 不要修改汇编代码
        {$ifdef CPUX86}
          {$define FPC_PIC}
        {$endif CPUX86}
        {$ifdef CPUAARCH64}
          {$define OSANDROIDARM64}
        {$endif CPUAARCH64}
      {$else}
        'Unsupported Operating System - yet'
      {$endif ANDROID}
    {$endif LINUX}
  {$endif BSD}
{$endif MSWINDOWS}

// -----------
// -- 识别CPU架构

{$define FPC_SINGLEABI} // 仅在i386默认ABI <> cdecl时定义
{$ifdef CPU64}
  // 64位架构
  {$define FPC_64}
  {$ifdef CPUX64}
    {$ASMMODE INTEL} // 如Delphi所期望
    {$define CPUINTEL}
    {$define FPC_CPUINTEL}
    {$define FPC_CPUX64}
    {$ifndef OSDARWIN} // MachOS在处理我们的汇编代码时有问题
      {$define FPC_ASMX64}
      {$define ASMX64} // 支持带有全局变量的汇编
      {$define ASMINTEL} // 要么是ASMX86,要么是ASMX64
      {$define ASMX64AVX} // 支持AVX/AVX2/AVX512
      {$define ASMX64AVXNOCONST} // 支持无align32常量加载的AVX
      {$define CPUX64ASM} // FPC没有问题(Delphi XE7之前的版本有问题)
      {$define HASAESNI} // mormot.crypt.core在Darwin汇编中被拒绝
    {$endif OSDARWIN}
  {$endif CPUX64}
  {$ifdef CPUAARCH64}
    {$define CPUARM3264}
  {$endif CPUAARCH64}
{$else}
  // 32位架构
  {$define FPC_32}
  {$ifdef CPUX86}
    {$ASMMODE INTEL} // 如Delphi所期望
    {$define CPUINTEL}
    {$define FPC_CPUINTEL}
    {$define FPC_X86}
    {$ifndef FPC_PIC} // MachOS/OpenBSD/Android在i386上需要PIC
      {$define ASMX86} // 支持带有全局变量的汇编
      {$define ASMINTEL} // 要么是ASMX86,要么是ASMX64
      {$define CPUX86NOTPIC} // 使用"absolute"而不是本地寄存器
      {$define HASAESNI}
    {$endif FPC_PIC}
    {$define TSYNEXTENDED80} // 仅在32位上有真正的x87扩展类型
    {$undef FPC_SINGLEABI} // 在i386上,cdecl <> 寄存器约定
  {$endif CPUX86}
  {$ifdef CPUARM}
    {$define CPUARM3264}
  {$endif CPUARM}
  {$define STRCNT32}         // 32位 TAnsiRec.Ref  
  {$define DACNT32}          // 32位 TDynArrayRec.refCnt  
  {$endif CPU64}  
  {$ifndef CPUX64}  
    {$undef FPC_X64MM}       // 取消定义,这个单元仅适用于x86_64  
  {$endif CPUX64}

{$ifdef ISFPC32}
    /// FPC 3.x 晚期版本起才有自己的 RTTI 布局
    {$define FPC_NEWRTTI}
    /// 当 http://bugs.freepascal.org/view.php?id=26774 被修复时
    {$define HASINTERFACERTTI}
    /// FPC 3.2+ 对泛型的支持看起来不错,但会引发链接问题
    {$define HASGENERICS}
    {$define ORMGENERICS}
    {$define FPCGENERICS}
  {$endif}
  // FPC 泛型(即参数化类型)自 2.6 版本起可用
  {$define HASGENERICSSYNTAX}

  {$ifdef FPC_NEWRTTI}
    {$define ISDELPHI2010_OR_FPC_NEWRTTI}
  {$else}
    {$define DELPHI_OR_FPC_OLDRTTI}
    {$define FPC_OLDRTTI}
  {$endif}

  {$ifdef FPC_HAS_CPSTRING}
    /// 参见 http://wiki.freepascal.org/FPC_Unicode_support
    {$define HASCODEPAGE} // UNICODE 意味着 {$mode delphiunicode}
  {$endif FPC_HAS_CPSTRING}

  {$ifdef ISFPC27}
    {$define ISFPC271}
    {$define HASVARUSTRING}
    {$define HASVARUSTRARG}
    /// 如果 http://mantis.freepascal.org/view.php?id=26773 的 bug 已被修复则定义
    /// 应使用 2.7.1/trunk 分支,修订版本为 2014-11-05T22:17:54
    /// => 这将改变 TInvokeableVariantType.SetProperty() 的签名
    {$define FPC_VARIANTSETVAR}
  {$endif ISFPC27}

  {$if defined(FPC_USE_WIN32_SEH) or defined(FPC_USE_WIN64_SEH)}
    {.$define HASFASTTRYFINALLY}
    /// FPC SEH 并非完全高效,并会生成一些额外的代码/调用
  {$ifend}

{$else FPC}

(********************** Delphi Conditionals **********************)

  {$ifndef MSWINDOWS}
  'Kylix 或 Delphi for MacOS/Linux/Mobile 不受支持'
  '-> 我们建议为 POSIX 平台使用 FPC'
  {$endif MSWINDOWS}

  {$define OSWINDOWS}

  {$ifndef CONDITIONALEXPRESSIONS}
  'Delphi 2-5 不受支持'
  {$endif CONDITIONALEXPRESSIONS}
  {$ifdef VER140}
  'Delphi 6 不受支持'
  {$endif VER140}

  {$A+} // 强制正常对齐,如我们的单元所期望

  {$ifdef UNICODE}
    {$define HASVARUSTRING}
    {$define HASCODEPAGE}
    {$define FPC_OR_UNICODE}
    {$define USERECORDWITHMETHODS}
    {$define HASGENERICSSYNTAX}     // Delphi 2009+ 编译器有 TArray<>
    { 由于 Delphi 2009+ 的一个 bug,我们需要伪造记录的继承,
      因为 TDynArrayHashed = object(TDynArray) 初始化失败
      http://blog.synopse.info/post/2011/01/29/record-and-object-issue-in-Delphi-2010 }
    {$define UNDIRECTDYNARRAY}
  {$else}
    {$define HASNOSTATICRTTI}        // Delphi 7/2007 没有 TypeInfo(TGuid)
  {$endif}

  {$define ISDELPHI}
  {$define CPUINTEL}          // Delphi 目前仅支持 Intel
  {$define ASMINTEL}          // 要么是 ASMX86,要么是 ASMX64
  {$undef FPC_X64MM}          // FPC 专用单元
  {$ifdef CPUX64}
    {$undef CPU32}
    {$define CPU64}           // Delphi 64 位 CPU 编译器
    {$define CPU64DELPHI}
    {$define ASMX64}          // 支持带有全局变量的汇编
    {$define EXTENDEDTOSHORT_USESTR} // Delphi Win64 上的 FloatToText() 较慢
    {$define DOUBLETOSHORT_USEGRISU} // 快速的 DoubleToAscii() - Delphi Win32 上不可用
  {$else CPUX64}
    {$define CPU32}           // Delphi 32 位 CPU 编译器
    {$undef CPU64}
    {$define CPU32DELPHI}
    {$define CPUX86}          // 与旧版本的 Delphi 兼容
    {$define ASMX86}          // 支持带有全局变量的汇编
    {$define CPUX86NOTPIC}    // 使用 "absolute" 而不是本地寄存器
    {$define TSYNEXTENDED80}  // 仅 32 位有真正的 x87 扩展类型
  {$endif CPUX64}

  {$define DELPHI_OR_FPC_OLDRTTI}
  {$define HASINTERFACERTTI}  // 接口 RTTI(非最旧 FPC)
  {$define HASFASTTRYFINALLY} // Delphi Win32/Win64 高效使用 SEH
  {$define STRCNT32}          // 即使在 64 位 CPU 上也是 32 位的 TStrRec.refCnt
  {$define DACNT32}           // 即使在 64 位 CPU 上也是 32 位的 TDynArrayRec.refCnt
  {$warn UNSAFE_CODE OFF}     // Delphi for .Net 已不存在!
  {$warn UNSAFE_TYPE OFF}
  {$warn UNSAFE_CAST OFF}
  {$warn DUPLICATE_CTOR_DTOR OFF} // 避免 W1029 不必要的提示
  {$warn SYMBOL_PLATFORM OFF}
  {$warn SYMBOL_DEPRECATED OFF}   // 对于 faVolumeID
  {$warn UNIT_PLATFORM OFF}

  {$if CompilerVersion >= 17}     // = Delphi 2005
    // ... (省略了与 Delphi 版本相关的条件编译指令,以保持简洁)
  {$ifend}

{$endif FPC}

```pascal
(********************** 共享条件编译指令 **********************)

// -----------
// -- 关于Pascal代码的预期

  {$H+} // 使用长字符串
  {$R-} // 禁用代码中的范围检查
  {$S-} // 禁用代码中的堆栈检查
  {$X+} // 预期扩展语法
  {$W-} // 禁用堆栈帧生成
  {$Q-} // 禁用代码中的溢出检查
  {$B-} // 预期短路布尔表达式
  {$V-} // 禁用Var-String检查
  {$T-} // 类型化的@运算符
  {$Z1} // 枚举类型默认以字节存储
  {$P+} // 开放字符串参数

  {$ifdef DEBUG}
    {$assertions on} // assert()可能被禁用,例如在FPC中
  {$endif DEBUG}

// -----------
// -- CPU特定条件编译指令

{$ifdef CPUINTEL}
  {$ifdef OSWINDOWS}
    {$ifdef CPUX64}
      {$define WIN64ABI}    // 用于x86_64的汇编
      {$define OSWINDOWS64} // Win64
    {$else}
      {$define OSWINDOWS32} // Win32
    {$endif CPUX64}
    {$define THREADID32}    // 在Win32和Win64上,TThreadID为32位DWORD
  {$endif OSWINDOWS}
  {$ifdef OSPOSIX}
    {$ifdef CPUX64}
      {$define SYSVABI}     // 用于x86_64的汇编
    {$else}
      {$define THREADID32}  // 在pthread上,TThreadID为PtrUInt/pointer
    {$endif CPUX64}
  {$endif OSPOSIX}
  {$define CPUINTELARM}
{$else}
  {$undef HASAESNI}         // AES-NI是Intel特有的功能
  {$ifdef CPUARM3264}
    {$define CPUINTELARM}
  {$endif CPUARM3264}
  {$ifdef CPU32}
    {$define THREADID32}    // 在pthread上,TThreadID为PtrUInt/pointer
  {$endif CPU32}
{$endif CPUINTEL}

{$ifdef CPU32}
  {$define NOPOINTEROFFSET} // 32位CPU将始终存储指针
{$endif CPU32}

// -----------
// -- 库链接

// 一些静态链接的文件需要从以下网址下载
// https://github.com/synopse/mORMot2/releases

{$ifdef FPC}
  // Delphi不接受GCC目标文件,而libdeflate需要GCC
  {$if defined(OSOPENBSD) and defined(FPC_CROSSCOMPILING)}
    {$define NOSQLITE3STATIC} // OpenBSD在fpcupdeluxe的libgcc.a上存在问题
  {$ifend}
  {$define LIZARD_EXTERNALONLY}     // Lizard被禁用,但在某些目标上可用
  {$ifdef OSLINUX}
    {$ifdef CPUINTEL}
      {$define LIBDEFLATESTATIC}    // libdeflate静态绑定
      {$define LIBQUICKJSSTATIC}    // quickjs静态绑定
      {$undef LIZARD_EXTERNALONLY}  // 静态liblizard.a
    {$endif CPUINTEL}
    {$ifdef CPUARM}
      {.$undef LIZARD_EXTERNALONLY} // 静态liblizard.a未测试
      {.$define LIBDEFLATESTATIC}   // 编译通过,但未测试
      {.$define LIBQUICKJSSTATIC}   // 编译通过,但未测试
    {$endif CPUARM}
    {$ifdef CPUAARCH64}
      {$define LIBDEFLATESTATIC}
      {$undef LIZARD_EXTERNALONLY}  // 静态liblizard.a看起来没问题
      {.$define LIBQUICKJSSTATIC}   // 编译通过,但存在访问违规
    {$endif CPUAARCH64}
  {$endif OSLINUX}
  {$ifdef OSWINDOWS}
    {$undef LIZARD_EXTERNALONLY}    // 静态liblizard.a
    {$ifdef CPUX86}
      {$define LIBDEFLATESTATIC}
      {$define LIBQUICKJSSTATIC}
    {$endif CPUX86}
    {$ifdef CPUX64}
      {.$define LIBDEFLATESTATIC}   // Win64 + FPC 3.2 = 内部错误200603061
      {$define LIBQUICKJSSTATIC}
    {$endif CPUX64}
  {$endif OSWINDOWS}
  {$ifdef CPUARM3264}
    {$ifdef OSDARWIN}               // 不支持的架构(例如Aarch64-Darwin)
      {$define OSDARWINARM}
      {$define LIZARD_EXTERNALONLY}
      {$define NOLIBCSTATIC}
    {$endif OSDARWIN}
  {$endif CPUARM3264}
{$else}
  {$define LIZARD_EXTERNALONLY}     // Delphi Win32/Win64尚无静态.obj
  {$ifdef CPUX86}
    {$define LIBQUICKJSSTATIC}      // 我们的quickjs.obj在Win32上看起来不错 :)
  {$endif CPUX86}
  // Delphi XE4在Win64上存在链接错误
  {$ifdef CPUX64}
    {$if (CompilerVersion = 25.0) or
         (CompilerVersion = 28.0) or 
         (CompilerVersion = 29.0)}  // 确切地说,XE4、XE7或XE8已知会导致GPF
      // 其他Win32/Win64 Delphi平台“应该”能按预期工作(tm)
      {$define NOSQLITE3STATIC}
    {$ifend}
    {$define LIBQUICKJSSTATIC}      // 看起来不错,但在Delphi 10.4+ Win64上
    {$if CompilerVersion >= 34.0}    // = Delphi 10.4及更高版本
      {$undef LIBQUICKJSSTATIC}
    {$ifend}
  {$endif}
{$endif FPC}

{$ifdef OSWINDOWS}
  // 在Windows上:启用Microsoft AES加密服务提供程序(XP SP3及以上)
  // - 即使这些AES引擎速度较慢且为闭源(因此最好避免使用),但我们仍将其用于TAesPrng.GetEntropy,因为无害
  {$define USE_PROV_RSA_AES}
  // 如果你有好的库,请自行承担风险进行定义
  {.$define USE_OPENSSL}
{$else}
  {$ifndef OSANDROID}
    // 在可能是唯一且维护良好的POSIX系统上尝试OpenSSL
    {$define USE_OPENSSL}
  {$endif OSANDROID}
{$endif OSWINDOWS}
{$ifdef FORCE_OPENSSL}
  {$define USE_OPENSSL} // 如果你认为自己足够幸运
{$endif FORCE_OPENSSL}

// -----------
// -- 按平台划分的客户端-服务器功能

{$ifdef OSWINDOWS}

  {$ifndef ONLYUSEHTTPSOCKET}
    {$define USEWININET}      // 发布TWinINet/TWinHttp/TWinHttpAPI类
    {$define USEHTTPSYS}      // 启用http.sys内核模式Web服务器
  {$endif ONLYUSEHTTPSOCKET}

  {$define USE_WINIOCP}     // Windows下的I/O完成端口API很好
  // (由mormot.core.threads和mormot.net.async使用)
  // (在Linux/POSIX下,我们回退到经典的事件驱动池)

  {$ifndef NOSSPIAUTH}        // 来自mormot.lib.sspi
    {$define DOMAINRESTAUTH}  // 在mormot.rest.client/server中启用SSPI
  {$endif NOSSPIAUTH}

{$endif OSWINDOWS}

{$ifdef OSPOSIX}

  {$define ONLYUSEHTTPSOCKET} // 高效的跨平台Socket + OpenSSL API
  {$undef USE_WINIOCP}        // 禁用任何Windows特定代码

  {$ifdef OSANDROID}

    // 对于Android,请考虑使用https://github.com/gcesarmza/curl-android-ios
    // 静态库,并在项目条件编译指令中强制使用USELIBCURL
    {$define LIBCURLSTATIC}

  {$else}

    {$ifndef USE_OPENSSL}       // 如果该平台上没有OpenSSL
      {$define USELIBCURL}      // 尝试跨平台的libcurl用于https
    {$endif USE_OPENSSL}

    {$ifndef NOGSSAPIAUTH}      // mormot.lib.gssapi与Android不兼容
      {$define DOMAINRESTAUTH}  // 在mormot.rest.client/server中启用libgss
    {$endif NOGSSAPIAUTH}

  {$endif OSANDROID}

{$endif OSPOSIX}
posted @ 2024-07-12 11:10  海利鸟  阅读(66)  评论(0编辑  收藏  举报