| # Copyright (C) 2016 and later: Unicode, Inc. and others. |
| # License & terms of use: http://www.unicode.org/copyright.html |
| # |
| # GitHub Action configuration script for ICU continuous integration tasks. |
| |
| name: GHA ICU4C |
| |
| on: |
| push: |
| branches: |
| - main |
| - 'maint/maint*' |
| paths: |
| - 'icu4c/**' |
| - 'testdata/**' |
| - '.github/workflows/**' |
| pull_request: |
| branches: '**' |
| paths: |
| - 'icu4c/**' |
| - 'testdata/**' |
| - '.github/workflows/**' |
| workflow_dispatch: |
| # To trigger the Env Test workflow manually, follow the instructions in |
| # https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow |
| inputs: |
| gitReleaseTag: |
| description: 'Release tag to upload to. Must start with "release-" or "icu4x/"' |
| type: string |
| gitReleaseFilename: |
| description: 'Release tag with no slashes, to be used in file names' |
| type: string |
| |
| # For non-release branches (namely: PRs), only run CI on the most recent commit. Cancel |
| # runs on previous commits mid-flight when new commits are pushed. |
| # https://docs.github.com/en/actions/using-jobs/using-concurrency#example-only-cancel-in-progress-jobs-on-specific-branches |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.ref }} |
| cancel-in-progress: ${{ !contains(github.ref, 'maint/') && github.ref != 'main' }} |
| |
| permissions: |
| contents: read |
| |
| jobs: |
| |
| # ICU4C docs build using doxygen.. |
| icu4c-docs-build: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C doc |
| run: | |
| sudo apt-get -y install doxygen; |
| cd icu4c/source; |
| ./runConfigureICU Linux --disable-renaming; |
| # Fail if 'warning:' appears in doxygen's output, but ignore warnings from file Doxyfile. |
| # Regex note: (?! ... ) is a negative lookahead. Succeed if the pattern is not present. |
| set +o pipefail && make doc-searchengine 2>&1 | tee doxygen.log && ( ! grep -P 'warning:(?! .* file .?Doxyfile)' doxygen.log ) |
| |
| # gcc debug build. |
| # Includes dependency checker. |
| # Note - the dependency checker needs to be run on both a debug and an optimized build. |
| # This one (gcc) for debug, and linux clang (see job below) for optimized. |
| # |
| # Test both out-of-source and in-source builds. This one (gcc) for out-of-source, |
| # and linux clang (below) for in-source. |
| # |
| # Invokes test/hdrtst to check public headers compliance. |
| gcc-debug-build-and-test: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C with gcc |
| env: |
| CXXFLAGS: -Wextra -Werror -Wno-error=return-local-addr |
| CFLAGS: -Werror |
| PREFIX: /tmp/icu-prefix |
| run: | |
| mkdir build; |
| cd build; |
| ../icu4c/source/runConfigureICU --enable-debug --disable-release Linux/gcc --prefix=$PREFIX --enable-tracing; |
| make -j -l4.5 check; |
| ( cd ../icu4c/source/test/depstest && ./depstest.py ../../../../build/ ); |
| make install; |
| PATH=$PREFIX/bin:$PATH make -C test/hdrtst check |
| |
| #gcc 14 with c++ 20 and later |
| gcc14-cpp20-23: |
| # Ubuntu 24.04 Noble Numbat rather than 22.04 Jammy Jellyfish so we can get GCC 14. |
| runs-on: ubuntu-24.04 # Updated in BRS |
| strategy: |
| fail-fast: false |
| matrix: |
| flags: |
| - '-std=c++20' |
| - '-std=c++23' |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Install GCC-14 |
| run: | |
| sudo add-apt-repository ppa:ubuntu-toolchain-r/test |
| sudo apt update |
| sudo apt install gcc-14 g++-14 |
| - name: Build and Test |
| env: |
| CC: gcc-14 |
| CXX: g++-14 |
| CXXFLAGS: ${{ matrix.flags }} -fext-numeric-literals |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU Linux |
| make -j -l4.5 check; |
| |
| # clang release build with some options to enforce useful constraints. |
| # Includes dependency checker on an in-source, optimized build. |
| # Includes checking @draft etc. API tags vs. ifndef guards like |
| # U_HIDE_DRAFT_API and U_FORCE_HIDE_DRAFT_API. |
| # (FORCE guards make this tool pass but won't compile to working code. |
| # See the testtagsguards.sh script for details.) |
| clang-release-build-and-test: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: Install doxygen |
| run: | |
| sudo apt-get -y install doxygen; |
| - name: Build ICU4C with clang |
| env: |
| CPPFLAGS: -DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1 |
| CFLAGS: -Wimplicit-fallthrough |
| CXXFLAGS: -Wimplicit-fallthrough |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU Linux/clang; |
| make -j -l4.5 check; |
| - name: Test Dependency |
| run: | |
| cd icu4c/source/test/depstest; |
| python3 depstest.py ../../../source/; |
| - name: Test Tags Guards |
| run: | |
| cd icu4c; |
| source/test/hdrtst/testtagsguards.sh; |
| - name: Test C Default locale |
| run: | |
| cd icu4c/source/test/cintltst && LANG=C LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./cintltst /tsutil/cloctst/TestCDefaultLocale |
| - name: Test C.UTF-8 Default locale |
| run: | |
| cd icu4c/source/test/cintltst && LANG=C.UTF-8 LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./cintltst /tsutil/cloctst/TestCDefaultLocale |
| - name: Make Dist |
| env: |
| CPPFLAGS: -DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1 |
| CFLAGS: -Wimplicit-fallthrough |
| CXXFLAGS: -Wimplicit-fallthrough |
| run: | |
| cd icu4c/source; |
| make dist |
| |
| # clang build with some options |
| clang-options-build-and-test: |
| strategy: |
| # "fail-fast: false" lets other jobs keep running even if the test breaks in some other options. |
| fail-fast: false |
| matrix: |
| build_option: |
| [ --enable-static, --enable-static --disable-shared ] |
| # --disable-shared has a build problem. |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: Build ICU4C with clang |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU Linux/clang ${{ matrix.build_option }}; |
| make -j -l4.5 tests; |
| - name: Test |
| run: | |
| cd icu4c/source; |
| make check; |
| |
| # Out of source build with gcc 10, c++14, and extra warnings; executes icuinfo. |
| gcc-10-stdlib17: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C with gcc 10 and c++17 and extra warnings. |
| env: |
| PREFIX: /tmp/icu-prefix |
| CC: gcc-10 |
| CXX: g++-10 |
| CXXFLAGS: -std=c++17 -Wextra |
| run: | |
| mkdir build; |
| cd build; |
| ../icu4c/source/runConfigureICU Linux --disable-layout --disable-layoutex --prefix=$PREFIX; |
| make -j -l4.5 check; |
| make -j -l4.5 install; |
| cd $PREFIX/bin; |
| LD_LIBRARY_PATH=../lib ./icuinfo |
| |
| # Clang Linux with address sanitizer. |
| clang-asan: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C with clang and asan |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU --enable-debug --disable-release Linux/clang --disable-renaming --enable-tracing; |
| make -j -l4.5 check; |
| env: |
| CPPFLAGS: -fsanitize=address |
| LDFLAGS: -fsanitize=address |
| # Clang Linux with leak sanitizer. |
| clang-lsan: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C with clang and lsan |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU --enable-debug --disable-release Linux/clang --disable-renaming --enable-tracing; |
| make -j -l4.5 check; |
| env: |
| CPPFLAGS: -fsanitize=leak |
| LDFLAGS: -fsanitize=leak |
| ASAN_OPTIONS: detect_leaks=1 |
| # Clang Linux with undefined-behavior sanitizer. |
| clang-ubsan: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C with clang and ubsan +alignment |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU --enable-debug --disable-release Linux/clang --disable-renaming; |
| make -j -l4.5 check; |
| env: |
| CPPFLAGS: -fsanitize=undefined -fsanitize=alignment -fno-sanitize-recover=undefined,alignment |
| CFLAGS: -fsanitize=undefined -fsanitize=alignment -fno-sanitize-recover=undefined,alignment |
| LDFLAGS: -fsanitize=undefined -fsanitize=alignment -fno-sanitize-recover=undefined,alignment |
| # Control Flow Integrity. |
| clang-cfi: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C with clang using CFI |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU Linux --disable-renaming; |
| make -j -l4.5 check; |
| env: |
| CC: clang |
| CXX: clang++ |
| # add -fsanitize=cfi-vcall -fsanitize=cfi-icall later |
| CXXFLAGS: -flto -fvisibility=hidden -fsanitize=cfi-derived-cast -fno-sanitize-trap=cfi -fno-inline-functions -fno-inline -fno-omit-frame-pointer -O1 |
| # add -fsanitize=cfi-vcall -fsanitize=cfi-icall later |
| LDFLAGS: -flto -fvisibility=hidden -fuse-ld=gold -fsanitize=cfi-derived-cast -fsanitize=cfi-unrelated-cast -fno-sanitize-trap=cfi -fsanitize-cfi-icall-generalize-pointers |
| |
| # Clang Linux with thread sanitizer. |
| clang-tsan: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C with clang and tsan |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU --enable-debug --disable-release Linux/clang --disable-renaming |
| make -j -l4.5; |
| make -j -l4.5 -C test; |
| make -j -l4.5 -C test/intltest check |
| env: |
| INTLTEST_OPTS: utility/MultithreadTest |
| CPPFLAGS: -fsanitize=thread |
| LDFLAGS: -fsanitize=thread |
| |
| #------------------------------------------------------ |
| # Clang Linux with data filter |
| # Note: This job uses `make -j2` instead of `make -j -l4.5` because with more parallelism (PR #2456) |
| # this check became flaky. The build apparently was not done copying one or another .ucm file before |
| # calling makeconv for it, although the Makefile has appropriate dependencies. |
| clang-datafilter: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Extract ICU version |
| run: | |
| # Extract ICU version from icuver.txt |
| icuverContent=$(cat icu4c/source/data/misc/icuver.txt) |
| icuVersion=$(echo "$icuverContent" | grep -oP 'ICUVersion\{"\K\d+\.\d+\.\d+\.\d+') |
| majorVersion=$(echo "$icuVersion" | cut -d. -f1) |
| echo "majorVersion=$majorVersion" |
| echo "majorVersion=$majorVersion" >> $GITHUB_ENV |
| - name: Build ICU4C with clang |
| run: | |
| cd icu4c/source && \ |
| ICU_DATA_FILTER_FILE=../../.github/data-filter.json ./runConfigureICU Linux/clang && \ |
| make -j2 tests && \ |
| \[ ! -d data/out/build/icudt${majorVersion}l/translit \] && \ |
| (cd test/intltest && LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./intltest translit/TransliteratorTest/TestBasicTransliteratorEvenWithoutData) && \ |
| (cd test/cintltst && LANG=C LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./cintltst /tsutil/cloctst/TestEnglishExemplarCharacters /tsutil/cldrtest/TestCoverage) |
| |
| # Clang Linux with CPP 17 |
| clang-cpp17: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Build ICU4C with CPP 17 |
| env: |
| CXXFLAGS: -std=c++17 -Winvalid-constexpr |
| run: | |
| cd icu4c/source && ./runConfigureICU --enable-debug --disable-release Linux/clang && make -j -l4.5 check |
| |
| # Clang Linux with LANG: en_US@calendar=gregorian;hours=h12 |
| clang-lang-with-extn-tags: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Linux Clang - LANG has extension tags |
| env: |
| LANG: "en_US@calendar=gregorian;hours=h12" |
| run: | |
| cd icu4c/source && ./runConfigureICU --enable-debug --disable-release Linux/clang && make -j -l4.5 check |
| |
| # Modern Clang (18 and later) with C++20 and 23 and treat warnings as errors |
| clang-18-21-cpp-20-23-warning-as-errors: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| strategy: |
| fail-fast: false |
| matrix: |
| clang-version: |
| - '18' |
| - '21' |
| flags: |
| - '-std=c++20' |
| - '-std=c++20 -stdlib=libc++' |
| - '-std=c++23 -stdlib=libc++' |
| exclude: |
| # Most of C++20 was available in Clang 18, see https://clang.llvm.org/cxx_status.html#cxx20, |
| # so testing C++20 with Clang 18 is unlikely to find errors that are found by the |
| # C++20 build with the newer Clang version. |
| - clang-version: '18' |
| flags: '-std=c++20' |
| - clang-version: '18' |
| flags: '-std=c++20 -stdlib=libc++' |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Install Modern Clang |
| env: |
| CLANG_VERSION: ${{ matrix.clang-version }} |
| run: | |
| wget https://apt.llvm.org/llvm.sh |
| chmod u+x llvm.sh |
| sudo ./llvm.sh $CLANG_VERSION all |
| - name: Modern Clang build and Test |
| env: |
| CC: clang-${{ matrix.clang-version }} |
| CXX: clang++-${{ matrix.clang-version }} |
| CPPFLAGS: '-Wall -Wextra -Wctad-maybe-unsupported -Werror' |
| CXXFLAGS: ${{ matrix.flags }} |
| run: | |
| cd icu4c/source && ./runConfigureICU --enable-debug --disable-release Linux && make -j -l4.5 check |
| |
| # MacOS with clang |
| macos-clang: |
| runs-on: macos-15 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: ICU4C with clang on MacOS |
| env: |
| CPPFLAGS: '-Wall -Wextra -Wextra-semi -Wundef -Wnon-virtual-dtor -Wctad-maybe-unsupported -Wglobal-constructors -Wexit-time-destructors -Werror' |
| run: | |
| cd icu4c/source; |
| PYTHON=python3 ./runConfigureICU macOS; |
| make -j -l4.5 check |
| |
| # Windows MSVC builds |
| windows-msvc: |
| runs-on: windows-2022 # Updated in BRS |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - test_flags: 'x64 Debug' |
| build_flags: '/p:Configuration=Debug /p:Platform=x64' |
| - test_flags: 'x86 Debug' |
| build_flags: '/p:Configuration=Debug /p:Platform=Win32' |
| - test_flags: 'arm Release' |
| build_flags: '/p:Configuration=Release /p:Platform=ARM' |
| - test_flags: 'x64 Release cpplatest' |
| build_flags: '/p:OverrideLanguageStandard=stdcpplatest /p:Configuration=Release /p:Platform=x64' |
| - test_flags: 'x64 Release' |
| build_flags: '/p:Configuration=Release /p:Platform=x64' |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Set up MSBuild |
| uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2 |
| - name: Build Solution x64 |
| if: contains(matrix.test_flags, 'arm Release') |
| run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 |
| - name: Build Solution |
| run: | |
| msbuild icu4c/source/allinone/allinone.sln ${{ matrix.build_flags }} |
| - name: Run ${{ matrix.test_flags }} Tests (icucheck.bat) |
| if: contains(matrix.test_flags, 'arm Release') == false |
| run: | |
| icu4c\source\allinone\icucheck.bat ${{ matrix.test_flags }} |
| |
| # Windows data filter build |
| windows-msvc-datafilter: |
| runs-on: windows-2022 # Updated in BRS |
| timeout-minutes: 30 |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Set ICU_DATA_FILTER_FILE variable |
| run: | |
| $filterPath = "${{ github.workspace }}\.github\data-filter.json" |
| echo "ICU_DATA_FILTER_FILE=$filterPath" >> $GITHUB_ENV |
| shell: pwsh |
| - name: Set up MSBuild |
| uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2 |
| - name: Build Solution with Data Filter |
| run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 |
| |
| # Windows MSVC distribution release |
| windows-msvc-dist-release: |
| runs-on: windows-2022 # Updated in BRS |
| permissions: |
| contents: write # So that we can upload to release |
| timeout-minutes: 30 |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - arch: 'x64' |
| plat: 'x64' |
| win_ver: 'Win64' |
| - arch: 'x86' |
| plat: 'Win32' |
| win_ver: 'Win32' |
| - arch: 'arm64' |
| plat: 'ARM64' |
| win_ver: 'WinARM64' |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Set up MSBuild |
| uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2 |
| - name: Build Solution x64 |
| if: contains(matrix.win_ver, 'ARM64') |
| run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 |
| - name: Build Solution |
| run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=${{ matrix.plat }} |
| - name: Run Tests (icucheck.bat) |
| if: contains(matrix.win_ver, 'ARM64') == false |
| run: icu4c/source/allinone/icucheck.bat ${{ matrix.arch }} Release |
| - name: "Run PowerShell: Distrelease script (${{ matrix.arch }})" |
| run: | |
| cd ./icu4c/ |
| ./packaging/distrelease.ps1 -arch ${{ matrix.arch }} |
| shell: pwsh |
| - name: Extract ICU version and rename zip file |
| id: set-zip-name |
| run: | |
| # Extract ICU version from the release tag |
| $releaseTag = '${{ inputs.gitReleaseTag }}'.replace('release-','') |
| # Determine the new file name based on the version |
| $newZipName = "icu4c-${releaseTag}-${{ matrix.win_ver }}-MSVC2022" |
| # Debugging: Print the new zip name |
| Write-Host "New Zip Name: $newZipName" |
| # Rename the existing zip file |
| cd icu4c\source\dist\ && ls -l . |
| Rename-Item -Path icu-windows.zip -NewName "${newZipName}.zip" |
| echo $newZipName |
| ls -l . |
| echo "newZipName=$newZipName" | Out-File -FilePath $env:GITHUB_ENV -Append |
| - name: Upload artifact |
| uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 |
| with: |
| name: icu4c.${{ matrix.win_ver }}.run_#${{ github.run_number }} |
| path: icu4c/source/dist/${{ env.newZipName }}.zip |
| - name: Upload to release |
| if: ${{ inputs.gitReleaseTag && startsWith(inputs.gitReleaseTag, 'release-') }} |
| run: | |
| gh release upload ${{ inputs.gitReleaseTag }} icu4c/source/dist/${{ env.newZipName }}.zip --clobber |
| env: |
| GH_TOKEN: ${{ github.token }} |
| |
| # Window MSYS2 tests |
| windows-msys2-gcc-x86_64: |
| runs-on: windows-2022 # Updated in BRS |
| timeout-minutes: 45 |
| defaults: |
| run: |
| shell: msys2 {0} |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Set up MSYS2 |
| uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0 |
| id: msys2 |
| with: |
| update: true |
| msystem: mingw64 |
| install: > |
| base-devel |
| mingw-w64-x86_64-toolchain |
| make |
| - name: 'Verify MinGW Installation' |
| run: gcc --version |
| - name: Build and Test |
| run: | |
| cd '${{ github.workspace }}' && cd icu4c/source && ./runConfigureICU MinGW --prefix='/tmp/build-icu' && make -j -l4.5 check |
| - name: Make install |
| run: | |
| cd '${{ github.workspace }}' && cd icu4c/source && make install && cd /tmp/build-icu && echo 'Recursive ls' && ls -lR |
| - name: Run icuinfo |
| run: | |
| echo 'Run icuinfo from MSYS shell' && cd /tmp/build-icu/bin && ./icuinfo.exe |
| - name: Run icuinfo from CMD |
| shell: cmd |
| run: | |
| cd /d ${{ steps.msys2.outputs.msys2-location }}\tmp\build-icu\bin |
| set PATH=C:\tools\msys64\mingw64\bin;%PATH% |
| .\icuinfo.exe |
| |
| # WebAssembly build using the WASI SDK. |
| wasm-wasi-sdk: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 |
| |
| - name: Install WASI SDK |
| env: |
| WASI_SDK_DOWNLOAD_URL: https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-27/wasi-sdk-27.0-x86_64-linux.deb |
| WASI_SDK_DOWNLOAD_SHA256: 3ed68fc89e3299c0e2333360efac89ec60fbc01870732a486ab386267355cc80 |
| run: | |
| wget -O /tmp/wasi-sdk.deb "${WASI_SDK_DOWNLOAD_URL}" |
| echo "${WASI_SDK_DOWNLOAD_SHA256} /tmp/wasi-sdk.deb" | sha256sum -c - |
| sudo apt-get install /tmp/wasi-sdk.deb |
| echo "WASI_SDK_PATH=/opt/wasi-sdk" >> $GITHUB_ENV |
| |
| - name: Build tools for host system |
| run: | |
| TOOLS_BUILD_DIR="$PWD/build/tools"; |
| mkdir -p "$TOOLS_BUILD_DIR"; |
| pushd "$TOOLS_BUILD_DIR"; |
| ../../icu4c/source/configure |
| make -j$(nproc) |
| echo "TOOLS_BUILD_DIR=$TOOLS_BUILD_DIR" >> $GITHUB_ENV |
| |
| - name: Cross-build for WebAssembly with WASI SDK |
| run: | |
| CROSS_BUILD_DIR="$PWD/build/cross"; |
| mkdir -p "$CROSS_BUILD_DIR"; |
| pushd "$CROSS_BUILD_DIR"; |
| ../../icu4c/source/configure --host=wasm32-unknown-wasip1 \ |
| --with-cross-build="$TOOLS_BUILD_DIR" \ |
| --enable-static --disable-shared \ |
| --disable-tools --disable-tests \ |
| --disable-samples --disable-extras \ |
| --with-data-packaging=static \ |
| --prefix / \ |
| CC="$WASI_SDK_PATH/bin/clang" CXX="$WASI_SDK_PATH/bin/clang++" \ |
| AR="$WASI_SDK_PATH/bin/llvm-ar" RANLIB="$WASI_SDK_PATH/bin/llvm-ranlib" \ |
| CFLAGS="-D_WASI_EMULATED_SIGNAL" \ |
| CXXFLAGS="-fno-exceptions -D_WASI_EMULATED_SIGNAL" |
| make -j$(nproc) PKGDATA_OPTS="--without-assembly -O $CROSS_BUILD_DIR/data/icupkg.inc" |
| make install DESTDIR="$CROSS_BUILD_DIR/install" |
| |
| # Run ICU4C tests with stubdata. |
| run-with-stubdata: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C tests with stubdata |
| run: | |
| cd icu4c/source; |
| ./runConfigureICU Linux; |
| make -j -l4.5 check; |
| rm lib/libicudata.so*; |
| cp -P stubdata/libicudata.so* lib; |
| |
| cd test/cintltst; |
| echo 'Running ICU4C cintltst with stubdata.'; |
| # Note: 'Elapsed Time: ' is printed by makefile upon final success. |
| CINTLTST_OPTS=-w make -j -l4.5 check 2>&1 | tee stubdata_ctest.log; |
| if ! grep 'Elapsed Time: ' stubdata_ctest.log |
| then |
| echo |
| echo cintltst run with stubdata failed |
| echo |
| echo See |
| echo https://unicode-org.github.io/icu/processes/release/tasks/integration.html#run-tests-without-icu-data |
| echo for how to reproduce and debug the failure |
| exit 1 |
| fi |
| |
| cd ../intltest; |
| echo 'Running ICU4C intltest with stubdata.'; |
| INTLTEST_OPTS=-w make -j -l4.5 check 2>&1 | tee stubdata_intltest.log; |
| if ! grep 'Elapsed Time: ' stubdata_intltest.log |
| then |
| echo |
| echo intltest run with stubdata failed |
| echo |
| echo See |
| echo https://unicode-org.github.io/icu/processes/release/tasks/integration.html#run-tests-without-icu-data |
| echo for how to reproduce and debug the failure |
| exit 1 |
| fi |
| |
| # Test U_CHARSET_IS_UTF8 |
| u-charset-is-utf8-test: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - run: | |
| cd icu4c/source; |
| ./runConfigureICU Linux CPPFLAGS="-DU_CHARSET_IS_UTF8=1"; |
| make -j -l4.5 check |
| |
| # Test U_OVERRIDE_CXX_ALLOCATION-is-0-test |
| u-override-cxx-allocation-is-0-test: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - run: | |
| cd icu4c/source; |
| ./runConfigureICU Linux CPPFLAGS="-DU_OVERRIDE_CXX_ALLOCATION=0"; |
| make clean; |
| make -j -l4.5 check |
| |
| # Test LSTM |
| lstm-test: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - run: | |
| cd icu4c/source; |
| ICU_DATA_FILTER_FILE=../../.github/lstm_for_th_my.json ./runConfigureICU --enable-debug --disable-release Linux -disable-layoutex; |
| make clean; |
| make -j -l4.5 check |
| |
| # Test adaboost |
| adaboost-test: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - run: | |
| cd icu4c/source; |
| ICU_DATA_FILTER_FILE=../../.github/adaboost.json CPPFLAGS=-DUCONFIG_USE_ML_PHRASE_BREAKING=1 ./runConfigureICU --enable-debug --disable-release Linux -disable-layoutex; |
| make clean; |
| make -j -l4.5 check |
| |
| # Build and run testmap |
| testmap: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - run: | |
| cd icu4c/source; |
| ./runConfigureICU Linux; |
| make -j -l4.5 check; |
| CONFIG_FILES=test/testmap/Makefile ./config.status; |
| cd test/testmap; |
| make -j -l4.5 check | grep '*** PASS PASS PASS, test PASSED!!!!!!!!' |
| |
| # Copyright scan |
| copyright-scan: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - run: perl tools/scripts/cpysearch/cpyscan.pl |
| |
| # Check compilation of internal headers. |
| internal-header-compilation: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - run: cd icu4c/source; test/hdrtst/testinternalheaders.sh |
| |
| # Check source files for valid UTF-8 and for absence of BOM. |
| valid-UTF-8-and-no-BOM-check: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - run: tools/scripts/icu-file-utf8-check.py |
| |
| # Run unit tests with UCONFIG_NO_XXX variations. |
| uconfig-unit-tests: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| strategy: |
| # "fail-fast: false" lets other jobs keep running even if the test breaks in some other uconfig. |
| fail-fast: false |
| matrix: |
| uconfig_cppflags: |
| # Ignore the following two. |
| # - "-DUCONFIG_NO_FILE_IO=1" |
| # - "-DUCONFIG_NO_CONVERSION=1" |
| - "-DUCONFIG_NO_LEGACY_CONVERSION=1" |
| - "-DUCONFIG_NO_NORMALIZATION=1" |
| - "-DUCONFIG_NO_BREAK_ITERATION=1" |
| - "-DUCONFIG_NO_IDNA=1" |
| - "-DUCONFIG_NO_COLLATION=1" |
| - "-DUCONFIG_NO_FORMATTING=1" |
| - "-DUCONFIG_NO_MF2=1" |
| - "-DUCONFIG_NO_TRANSLITERATION=1" |
| - "-DUCONFIG_NO_REGULAR_EXPRESSIONS=1" |
| - "-DUCONFIG_NO_SERVICE=1" |
| - "-DUCONFIG_NO_FILTERED_BREAK_ITERATION=1" |
| # Turn on all the options in one test. |
| - "-DUCONFIG_NO_LEGACY_CONVERSION=1 -DUCONFIG_NO_NORMALIZATION=1 -DUCONFIG_NO_BREAK_ITERATION=1 -DUCONFIG_NO_IDNA=1 -DUCONFIG_NO_COLLATION=1 -DUCONFIG_NO_FORMATTING=1 -DUCONFIG_NO_MF2=1 -DUCONFIG_NO_TRANSLITERATION=1 -DUCONFIG_NO_REGULAR_EXPRESSIONS=1 -DUCONFIG_NO_SERVICE=1 -DUCONFIG_NO_FILTERED_BREAK_ITERATION=1" |
| steps: |
| - name: Checkout |
| uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Verify no additional new UCONFIG_NO_xxx added |
| run: | |
| # Test that we have exactly 13 "#ifndef UCONFIG_NO_" in uconfig.h. If the number changes, we need to also |
| # adjust the uconfig_cppflags above to include the new one and update the "13" below. |
| expected_count="13"; |
| count=`egrep "#ifndef UCONFIG_NO_" icu4c/source/common/unicode/uconfig.h| wc -l`; |
| if [ $expected_count != $count ]; then |
| echo "More than %s UCONFIG_NO_* defined in uconfig.h, please adjust uconfig_cppflags above to include any newly added flag" % $expected_count; |
| echo "Currently UCONFIG_NO_* defined in uconfig.h:"; |
| egrep "#ifndef UCONFIG_NO_" icu4c/source/common/unicode/uconfig.h; |
| exit -1 |
| fi |
| - name: Build and Test |
| env: |
| CPPFLAGS: ${{ matrix.uconfig_cppflags }} |
| run: | |
| cd icu4c/source/; |
| ./runConfigureICU Linux; |
| make -j -l4.5 tests; |
| |
| # Run header tests with UCONFIG_NO_XXX variations. |
| uconfig-header-tests: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| strategy: |
| # "fail-fast: false" lets other jobs keep running even if the test breaks in some other uconfig. |
| fail-fast: false |
| matrix: |
| uconfig_cppflags: |
| # Ignore the following two. |
| # - "-DUCONFIG_NO_FILE_IO=1" |
| # - "-DUCONFIG_NO_CONVERSION=1" |
| - "-DUCONFIG_NO_LEGACY_CONVERSION=1" |
| - "-DUCONFIG_NO_NORMALIZATION=1" |
| - "-DUCONFIG_NO_BREAK_ITERATION=1" |
| - "-DUCONFIG_NO_IDNA=1" |
| - "-DUCONFIG_NO_COLLATION=1" |
| - "-DUCONFIG_NO_FORMATTING=1" |
| - "-DUCONFIG_NO_MF2=1" |
| - "-DUCONFIG_NO_TRANSLITERATION=1" |
| - "-DUCONFIG_NO_REGULAR_EXPRESSIONS=1" |
| - "-DUCONFIG_NO_SERVICE=1" |
| - "-DUCONFIG_NO_FILTERED_BREAK_ITERATION=1" |
| # Turn on all the options in one test. |
| - "-DUCONFIG_NO_LEGACY_CONVERSION=1 -DUCONFIG_NO_NORMALIZATION=1 -DUCONFIG_NO_BREAK_ITERATION=1 -DUCONFIG_NO_IDNA=1 -DUCONFIG_NO_COLLATION=1 -DUCONFIG_NO_FORMATTING=1 -DUCONFIG_NO_MF2=1 -DUCONFIG_NO_TRANSLITERATION=1 -DUCONFIG_NO_REGULAR_EXPRESSIONS=1 -DUCONFIG_NO_SERVICE=1 -DUCONFIG_NO_FILTERED_BREAK_ITERATION=1" |
| steps: |
| - name: Checkout |
| uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Verify no additional new UCONFIG_NO_xxx added |
| run: | |
| # Test that we have exactly 13 "#ifndef UCONFIG_NO_" in uconfig.h. If the number changes, we need to also |
| # adjust the uconfig_cppflags above to include the new one and update the "13" below. |
| count=`egrep "#ifndef UCONFIG_NO_" icu4c/source/common/unicode/uconfig.h| wc -l`; |
| if [ "13" != $count ]; then |
| echo "More than %s UCONFIG_NO_* defined in uconfig.h, please adjust uconfig_cppflags above to include any newly added flag" % $count; |
| echo "Currently UCONFIG_NO_* defined in uconfig.h:"; |
| egrep "#ifndef UCONFIG_NO_" icu4c/source/common/unicode/uconfig.h; |
| exit -1 |
| fi |
| - name: Build and Install |
| run: | |
| cd icu4c/source/; |
| mkdir /tmp/icu_cnfg; |
| ./runConfigureICU Linux --prefix=/tmp/icu_cnfg; |
| make -j -l4.5 install; |
| - name: Test |
| env: |
| UCONFIG_NO: ${{ matrix.uconfig_cppflags }} |
| run: | |
| cd icu4c/source/; |
| PATH=/tmp/icu_cnfg/bin:$PATH make -C test/hdrtst check; |
| |
| # Build Unicode update tools |
| unicode-update-tools: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - uses: bazel-contrib/setup-bazel@43d7d5ceab59a307da44fc7585faa2a2fff4f88d # 0.16.0 |
| - name: Get CI Linux runner VM version |
| id: linux-version |
| run: | |
| echo "LINUX_VERSION=$(grep -F VERSION_ID /etc/os-release | cut -d'"' -f2)" >> $GITHUB_OUTPUT |
| - name: Mount bazel cache |
| uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 |
| with: |
| path: "~/.cache/bazel" |
| key: bazel-${{ runner.os }}-${{ steps.linux-version.outputs.LINUX_VERSION }} |
| |
| - name: Generate the data |
| run: | |
| export ICU_SRC=`pwd`; |
| icu4c/source/data/unidata/generate.sh; |
| if $? |
| then |
| echo |
| echo Build of Unicode update tools failed. |
| echo See |
| echo https://unicode-org.github.io/icu/processes/unicode-update#bazel-build-process |
| echo for how to reproduce and debug the failure |
| exit 1 |
| fi |
| |
| git diff --exit-code; |
| if $? |
| then |
| echo |
| echo ICU unicode data has changed! |
| echo Did you forget to include the changed data files in this PR? |
| exit 1 |
| fi |
| |
| # Build and run ICU4C samples |
| icu4c-test-samples: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| |
| - name: ICU4C configure and build |
| run: | |
| # Perform an out-of-source build of icu4c |
| mkdir /tmp/icu_samples |
| cd icu4c/source |
| ./runConfigureICU Linux -prefix=/tmp/icu_samples |
| make install |
| # Reference the paths in the new build |
| cd samples |
| # To clean all the test binaries |
| make clean-samples-recursive |
| # To rebuild them all |
| echo "Make all samples" |
| PATH=$PATH:/tmp/icu_samples/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/icu_samples/lib make all-samples-recursive |
| # To run all tests serially |
| echo "Run all samples" |
| pwd |
| PATH=$PATH:/tmp/icu_samples/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/icu_samples/lib make check-samples-recursive |
| |
| # https://unicode-org.github.io/icu/processes/release/tasks/integration.html#verify-that-icu4c-tests-pass-without-collation-rule-strings |
| icu4c-without-collation-rule-strings: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Install hjson dependency |
| run: | |
| sudo apt-get install python3-pip |
| pip3 install hjson |
| - name: Create data filter file to remove collation rule strings |
| run: | |
| cat > icu4c/coll-norules.hjson <<EOL |
| { |
| resourceFilters: [ |
| { |
| categories: [ |
| coll_tree |
| ] |
| rules: [ |
| -/UCARules |
| -/collations/*/Sequence |
| ] |
| } |
| ] |
| } |
| EOL |
| - name: Configure ICU4C with the data filter file |
| env: |
| ICU_DATA_FILTER_FILE: ../coll-norules.hjson |
| run: | |
| cd icu4c/source |
| ./runConfigureICU Linux |
| - name: Run tests with data-errors-as-warnings |
| env: |
| INTLTEST_OPTS: -w |
| CINTLTST_OPTS: -w |
| run: | |
| cd icu4c/source |
| make -j -l4.5 check |
| |
| # https://unicode-org.github.io/icu/processes/release/tasks/healthy-code.html#test-uconfig_no_conversion |
| icu4c-uconfig-no-conversion: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Set UCONFIG_NO_CONVERSION and configure ICU4C |
| env: |
| UCONFIG_NO_CONVERSION: 1 |
| run: | |
| cd icu4c/source |
| ./runConfigureICU Linux |
| - name: Run make for stubdata, common, i18n |
| run: | |
| cd icu4c/source |
| pushd stubdata && make -j -l4.5 && popd |
| # Ensure lib directory for output object file exists |
| mkdir -p lib |
| pushd common && make -j -l4.5 && popd |
| pushd i18n && make -j -l4.5 && popd |
| |
| # Workflow for ICU Export Data for ICU4X |
| icu4c-icuexportdata: |
| runs-on: ubuntu-22.04 # Updated in BRS |
| permissions: |
| contents: write # So that we can upload to release |
| timeout-minutes: 30 |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Build |
| run: | |
| cd icu4c/source && ./runConfigureICU Linux && make -j -l4.5 |
| env: |
| CC: clang |
| CXX: clang++ |
| - name: Build property data files |
| run: | |
| cd icu4c/source |
| mkdir -p icuexportdata/uprops/fast |
| ./bin/icuexportdata --mode uprops --index --copyright --verbose --destdir icuexportdata/uprops/fast --trie-type fast --all |
| mkdir -p icuexportdata/uprops/small |
| ./bin/icuexportdata --mode uprops --index --copyright --verbose --destdir icuexportdata/uprops/small --trie-type small --all |
| env: |
| LD_LIBRARY_PATH: lib |
| - name: Build normalization data files |
| run: | |
| cd icu4c/source |
| mkdir -p icuexportdata/norm/fast |
| ./bin/icuexportdata --mode norm --index --copyright --verbose --destdir icuexportdata/norm/fast --trie-type fast --all |
| mkdir -p icuexportdata/norm/small |
| ./bin/icuexportdata --mode norm --index --copyright --verbose --destdir icuexportdata/norm/small --trie-type small --all |
| env: |
| LD_LIBRARY_PATH: lib |
| - name: Build case data files |
| run: | |
| cd icu4c/source |
| mkdir -p icuexportdata/ucase/fast |
| ./bin/icuexportdata --mode ucase --index --copyright --verbose --destdir icuexportdata/ucase/fast --trie-type fast --all |
| mkdir -p icuexportdata/ucase/small |
| ./bin/icuexportdata --mode ucase --index --copyright --verbose --destdir icuexportdata/ucase/small --trie-type small --all |
| env: |
| LD_LIBRARY_PATH: lib |
| - name: Build collation data files |
| run: | |
| cd icu4c/source |
| cd data/coll |
| FILES=$(ls *.txt) |
| cd ../../ |
| mkdir -p icuexportdata/collation/unihan |
| ./bin/genrb -X -s data/coll --ucadata data/in/coll/ucadata-unihan-icu4x.icu -d icuexportdata/collation/unihan $FILES |
| rm icuexportdata/collation/unihan/*.res |
| mkdir -p icuexportdata/collation/implicithan |
| ./bin/genrb -X -s data/coll --ucadata data/in/coll/ucadata-implicithan-icu4x.icu -d icuexportdata/collation/implicithan $FILES |
| rm icuexportdata/collation/implicithan/*.res |
| env: |
| LD_LIBRARY_PATH: lib |
| - name: Build segmenter dictionary files |
| run: | |
| cd icu4c/source |
| mkdir -p icuexportdata/segmenter/dictionary |
| for FILE in $(ls data/brkitr/dictionaries | xargs -n 1 basename); do |
| ./bin/gendict --uchars --toml data/brkitr/dictionaries/$FILE icuexportdata/segmenter/dictionary/$(basename $FILE .txt).toml |
| done |
| env: |
| LD_LIBRARY_PATH: lib |
| - name: Zip |
| run: | |
| cd icu4c/source/icuexportdata |
| zip -r ../../../icu4x-icuexportdata_${{ inputs.gitReleaseFilename }}.zip . |
| - name: Publish Artifact |
| uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 |
| with: |
| name: icuexportdata_output |
| path: icu4x-icuexportdata_*.zip |
| - name: Upload to release tag |
| if: ${{ inputs.gitReleaseTag && startsWith(inputs.gitReleaseTag, 'release-') }} |
| run: | |
| zipVer=$(echo ${{ inputs.gitReleaseTag }} | sed 's/^release-//') |
| mv icu4x-icuexportdata_*.zip icu4x-icuexportdata-${zipVer}.zip |
| gh release upload ${{ inputs.gitReleaseTag }} icu4x-icuexportdata-*.zip --clobber |
| env: |
| GH_TOKEN: ${{ github.token }} |
| - name: Upload to icu4x tag |
| if: ${{ inputs.gitReleaseTag && startsWith(inputs.gitReleaseTag, 'icu4x/') }} |
| run: | |
| gh release upload ${{ inputs.gitReleaseTag }} icu4x-icuexportdata_*.zip --clobber |
| env: |
| GH_TOKEN: ${{ github.token }} |