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}