检查新类层次结构中是否没有“穷人的RTTI”方法。
在ICU 50之后:新的类层次结构根本不应该声明getDynamicClassID()。UObject有一个虚拟实现。
ICU 4.6.50:新的类层次结构使用了UOBJECT_DEFINE_NO_RTTI_IMPLEMENTATION。请参阅Normalizer2,以获取满足虚函数覆盖而不添加新ClassID支持的示例声明和实现。
我们确实需要在旧类和扩展现有类层次结构的新类中保留并添加“穷人的RTTI”(父类具有@stable RTTI函数)。(例如,一个新的Format子类。)
检查这一点的一个简单方法是搜索API更改报告并查找“UClassID”或类似内容。
检查ICU4C源文件中的非ascii字符[已过时]
注:ICU4C和ICU4J源文件为UTF-8。ASCII检查不再适用于他们。
cd icu4c/源
找到\(-name“*.[ch]”-或-name“*.cpp”\)-exec grep-PHn[^[:ascii:]]{}\;
验证存储库中的所有源文件和文本文件都具有纯LF行尾。
要在Linux上执行此操作,请在最新的git工作区中,
cd icu/icu4c/来源
tools/icu-file-utf8-check.py#报告问题
来自icu4c工具的相同python脚本也将检查icu4j
cd icu/icu4j
../icu4c/source/tools/icu-file-utf8-check.py
要仔细检查行尾,以下grep将查找包含\r字符的所有文本文件。不要从需要行尾的Windows运行。
cd icu
grep-rPIl“\r”*
即使在Mac或Linux上运行,也会通过此检查找到一些特定于WIndows的文件(.bat等)。这没关系。
注:截至ICU 63,项目从svn转移到GitHub。SVN文件属性不再相关。
注意:从ICU 59开始,ICU4C源文件是UTF-8编码的,并且具有svn mime-type属性“text/plain;charset=UTF-8”。它们不能有BOM。
这由上述任务检查,检查svn属性、有效的UTF-8和文本文件行结尾。
以前用于此任务的bomfix.py脚本必须不在ICU4C源上运行
注:本任务仅适用于ICU4C。java源文件使用UTF-8编码,但必须没有UTF-8 BOM。
检查以下匹配项:标记为UTF-8的文件与以UTF-8签名字节序列(“BOM”)开头的文件。
运行时间:
cd{icu}/icu4c
蟒蛇/工具/版本/c/bomfix.py
Eclipse IDE提供了一个功能,允许您组织多个文件的导入语句。右键单击项目/源文件夹/文件,您可以选择[source]-[Organize Imports]来解析所有通配符导入,并按一致的顺序对导入语句进行排序。(注意:当您对包含许多文件的项目/文件夹运行此命令时,可能会遇到OOM问题。在这种情况下,您可能需要缩小每次迭代的选择范围。)
ICU 64+(2019+):由构建机器人自动完成,至少在两种模式(调试/发布)中的一种模式下完成,可以作为BRS任务跳过。
我们希望使.c/.cpp/.o文件之间的依赖关系保持合理,包括ICU库之间和内部的依赖关系。
在Linux上,运行 源/测试/depstest/depstest.py,例如:
~/icu/mine/src/icu4c/source/test/depstest$/depstest.py~/icu/mine/dbg/icu4c
这样做两次:一次用于发布版本(优化),一次用于调试版本(未优化)。它们引入了稍微不同的标准库符号集(参见dependencies.txt中的注释)。
如果一切正常,测试将打印“确定:指定的依赖项和实际的依赖项匹配。”如果不匹配。。。
让其他人审查变更,包括Markus;包括dependencies.txt、.py脚本或ICU4C代码中的更改。
起初,测试可能会抱怨dependencies.txt中没有列出.o文件,或者,如果文件被删除,则会反过来抱怨。尝试将其添加到组中,或根据需要创建新组。
通常,具有较少依赖性的较小组更可取。如果ICU内部不需要公共API(例如,通过转换构建UnicodeString)(例如,unistr_cnv),则使其库依赖于其新组。
如果测试打印“Info:group icuplug does not need to depending on platform”,那么插件代码将被禁用,这是ICU 56以来的默认代码。考虑启用它进行依赖项检查,但请确保在提交更改之前还原它!
通常还有其他“信息”消息,工具认为不需要依赖于系统符号。它们是无害的,也就是说,不要试图删除它们:根据使用的编译器标志,它们是需要的还是不需要的。如果删除它们,则可能会导致具有不同标志的用户出错。此外,在未优化的构建中,您只能获得一半的信息消息。您可以在优化的构建中获得更多,因为会有更多的系统内容被内联。
测试可能会抱怨“这是一个新的系统符号吗?”我们应该小心添加这些符号。例如,我们不能从库代码调用printf(),也不能调用全局运算符new。
测试可能会抱怨某些.o文件“导入icu_48::UnicodeString::Unicode字符串(const char*),但不依赖于unistr_cnv.o”。这可能意味着有人将简单的“string literal”或char*传递到接受UnicodeString的函数中,该函数调用默认转换构造函数。我们不希望那样!在大多数情况下,应修复此类代码,如 变更集30186。只有需要转换的API实现才能依赖于它;例如,group formattable_cnv依赖于group unistr_cnv,但ICU内部没有任何依赖性。
验证以下库代码(common、i18n、layout、ustdio)。要求通过更改cmemory.h和公共基类来定制ICU的内存管理。
注:这一要求仍然存在。解决问题的技术是有效的。用于测试,请参阅上面的“检查库依赖项”一节。
没有原始的malloc/free/realloc,只有它们的uprv_版本。
所有C++类都必须继承公共基类UObject或UMemory
但不适用于mixin/interface类(纯虚拟、无数据成员、无构造函数),因为这会破坏单继承模型。
也不适用于纯静态类(用于名称范围)声明,但不实现私有默认构造函数以防止实例化。
没有构造函数、析构函数和虚方法的简单类结构C++类(和结构)不需要继承基类,但必须使用uprv_malloc进行分配。
所有简单类型(UChar、int32_t、指针(!)、…)必须使用uprv_malloc进行分配,并使用uprv_free进行释放。
对于在Linux上测试这种情况
要测试这种情况,请在Windows上执行以下操作:
(净化、边界检查器、valgrind…)
确保我们修复了运行这些工具时发现的所有内存泄漏问题。
使用调试信息构建ICU。在Linux上,
runConfigureICU--启用调试--禁用释放Linux
在valgrind下运行所有标准测试,
cd<where ever>/source/test/intltest
LD_LIBRARY_PATH=..//库:..//存根数据:..//tools/ctestfw:$LD_LIBRARY_PATH valgrind/最内部的
您可以从“makecheck”的输出中获取用于运行测试的命令行,然后在可执行文件之前插入“valgrind”。
我们的目标是,所有发行版都要向公众发布100%的API测试和至少85%的代码覆盖率。
测试头文件中的外部依赖项:
(在Unix上)前提条件:使用--prefix(../icu4c/source/runConfigureICU Linux--prefix=/some/temp/folder)进行配置,并执行“make install”。然后设置PATH,以便可以找到安装的icu-config脚本。(导出路径=/some/temp/文件夹/箱子:$PATH)
然后转到“icu4c/test/hdrtst”目录(注意:不是“source/test/hdrtst”)并进行“make check”。这将尝试分别对每个头文件进行编译,以确保没有任何问题。输出如下所示,如果没有出现错误,则一切正常。
如果C++文件无法编译为C文件,请将其添加到hdrtst目录中的“cxxfiles.txt”中。
从ICU 65开始,hdrtst现在作为常规CI构建的一部分运行,C++标头现在由宏“U_SHOW_CPLUSPLUS_API”保护。
不再有任何“cxxfiles.txt”文件。相反,公共C++标头都由宏“U_SHOW_CPLUSPLUS_API”保护,如果定义了__CPLUSPLUS,该宏默认设置为1。如果ICU用户希望只使用C API,则可以在包含任何ICU头之前显式设置宏。任何新的公共C++标头都需要用宏进行类似的保护,尽管在合并之前,应该在CI构建中为拉请求捕获这一点。
使用所有uconfig.h变体运行此测试(见下文)。
ctest unicode/docmain。小时
ctest unicode/icudataver。小时
ctest unicode/icuplug。小时
直接从源代码树运行以下脚本(从“source”文件夹内部,而不是顶层),无需构建或安装。
对于新版本,还要查找新的工具和测试,并将其文件夹添加到脚本中。您可以忽略在特定目录中未找到“*.h”文件的消息。
命令行很简单
~/git.icu/icu4c/source$test/hdrtst/testinternalheaders.sh
请参见http://bugs.icu-project.org/trac/tickt/12141“如果每个头文件依赖于它们的定义,那么它应该包含所有其他头文件”
截至ICU 68,内部头部测试现已作为Travis CI的一部分实现自动化。
完全测试ICU,并使用以下命令运行标题测试(如上):
没有人打开的“UCONFIG_NO_XXX”开关的数量(即正常情况)
全部的打开的“UCONFIG_NO_XXX”开关(设置为1)
对于每个开关,用只是那一个开关打开了。但请注意关于 UCONFIG_NO_CONVERSION测试下面。
(请参见 通用/unicode/uconfig。小时有关更多文档。)
有一个脚本可用于在UNIXe上以这种方式自动测试ICU,它位于: 工具/版本/c/uconfigtest.sh。有关信息,请参阅脚本顶部的文档。
当保护条件(例如#ifndef U_HIDE_INTERNAL_API)因导致标头测试失败而被删除时,请在标头文件中注意保护条件不能在该位置使用的原因,否则它们很可能会在将来被重新添加。
验证是否在不启用默认使用ICU命名空间的情况下生成ICU。要在Linux上测试,
./runConfigureICU Linux CXXFLAGS=“-DU_USING_ICU_NAMESPACE=0”
进行检查
任何问题都会显示为编译错误。
当ICU C++命名空间之外的定义引用ICU C++类时,需要使用“icu::“,如”icu::Unicode字符串“。在极少数情况下,C++类型在C代码中也是可见的(例如,ucol_imp.h具有cintltst可见的定义),然后我们使用U_NAMESPACE_限定符为C编译时定义为空。
自动构建系统应该有一台同时设置-DU_USING_ICU_NAMESPACE=0和-DU_CHARSET_IS_UTF8=1.
确保构建ICU4C公共和i18n库时UCONFIG_NO_CONVERSION设置为1。我们不能将此作为“Test-uconfig.h变体”的一部分,因为测试套件不能这样构建,但库代码必须支持它。
最简单的方法是使用ICU4C工作区,修改uconfig。小时暂时通过将UCONFIG_NO_CONVERSION的值更改为1,并执行“make-j 6”(而不是“make check”或“make tests”)。验证stubdata、common&i18n库构建良好;布局也应该构建,但toolutil将失败,这是意料之中的。
修复所有stubdata/common/i18n问题,恢复UCONFIG_NO_CONVERSION值,并验证它是否仍能正常工作。
如果出现这种情况,可能有人无意中使用了UnicodeString(constchar*)构造函数。请参阅中的“检查库依赖项”部分和修复示例变更集30186.
验证ICU构建时默认字符集硬编码为UTF-8。要在Linux上测试,
./runConfigureICU Linux CPPFLAGS=“-DU_CHARSET_IS_UTF8=1”
make-j6检查
任何问题都会显示为编译或测试错误。
除了设置CPPFLAGS,您还可以临时添加#定义U_CHARSET_IS_UTF8 1在unicode/platform.h中获取默认定义之前,或在那里修改默认定义。(在ICU 4.8及更早版本中,此标志为unicode/utypes.h。)
这在设置为使用UTF-8作为系统字符集的机器上效果最好,这在Windows上是不可能的。
自动构建系统应该有一台同时设置-DU_USING_ICU_NAMESPACE=0和-DU_CHARSET_IS_UTF8=1.
测试U_OVERRIDE_CXX_ALLOCATION=0
在Linux上验证ICU构建时U_OVERRIDE_CXX_ALLOCATION=0。问题将显示为构建失败。
CPPFLAGS=“-DU_OVERRIDE_CXX_ALLOCATION=0”/运行配置ICU Linux
使干净
make-j12检查
ICU 50m1从运行时代码(票证)中删除ICU_USE_THREADS #9010).
在ICU_USE_THREADS=0的情况下,仍然可以构建和测试intltest,但这几乎没有那么重要。
在50m1重症监护室--禁用线程configure选项不存在。如果要使用ICU_USE_THREADS=0进行测试,请在intltest.h或intltest-Makefile中临时更改此标志。
验证ICU在禁用线程的情况下进行构建和测试。要在Linux上测试,
./runConfigureICU Linux--禁用线程
进行检查
要使用Visual Studio在Windows上构建ICU4C示例,请使用以下步骤:
打开位于“source\allione\allione.sln”下的“allione”解决方案文件。
构建调试/发布+x86/x64配置(全部4种配置)。
打开位于“source\samples\all\all.sln”下的“all”解决方案文件。
使用“批量构建”选项构建x86和x64。它位于菜单“Build”>“Batch Build”下。
所有样本都应该干净地构建,没有错误。
要测试示例程序,请为每个配置运行“source\samples\all\samplecheck.bat”脚本,并确保它们成功。
请参见https://github.com/unicode-org/icu-demos/blob/master/icu-kube/README.md
请参见:https://github.com/unicode-org/icu-demos/blob/master/icu4jweb/README.md
这些是演示小程序,请参阅上面的icu4jweb演示。
要测试ICU4J演示应用程序,请cd到ICU4J目录并构建和运行演示。
$cd icu4j
$ant jarDemos
$java-jar icu4jdemos.jar
上述命令调用GUI演示应用程序。因此,它必须连接到X-Server。最简单的方法是在执行远程桌面的机器上运行,而不是在ssh shell中运行。
演示包括日历、字符集检测、假日、RBNF和音译。检查每个应用程序是否工作正常。
要检查ICU4J示例,请打开Eclipse工作区并从目录<ICU4J_root>/samples导入ICU4J示例项目。确保这些示例代码没有生成问题。还可以使用main运行示例代码,并查看每个示例代码是否运行。
对于ICU4J,
$ant exhaustive检查
对于ICU4C,使用优化构建进行测试将有助于减少测试完成所需的时间。
$make-j6检查彻底
构建机器人在最有趣的多线程测试上运行线程消毒剂。这些说明在整个测试套件上运行消毒剂。需要clang编译器。
$CPPFLAGS=-fsanitize=thread LDFLAGS=-fsonitize=线程/runConfigureICU--enable-debug--disable-release Linux--disable-renaming
$清理
$make-j6支票