Skip to content

Fix build with ICU 76 #936

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Fix build with ICU 76 #936

wants to merge 1 commit into from

Conversation

cho-m
Copy link

@cho-m cho-m commented Oct 31, 2024

Due to unicode-org/icu@199bc82, ICU 76 no longer adds icu-uc by default. This causes linker errors for undefined symbols like icu_76::UnicodeString::doReplace(...), referenced from: zim::removeAccents(...) in tools.cpp.o.

Meson will automatically flatten the dependencies list as documented at https://mesonbuild.com/Reference-manual_functions.html#build_target


There didn't seem to be any usage of icu_dep methods and only passing it to dependencies: [..., icu_dep, ...]. If this changes, then may need to use multiple variables.

@kelson42 kelson42 added this to the 9.3.0 milestone Oct 31, 2024
@cho-m
Copy link
Author

cho-m commented Oct 31, 2024

Linux CI has an unrelated failure trying to find software-properties-common which isn't available in Debian Trixie.


Windows CI has a related failure as it looks like icu-i18n.pc is manually created.

Maybe a workaround like:

dependency('icu-uc', required: host_machine.system() != 'windows', static:static_linkage)

or

icu_dep = [dependency('icu-i18n', required:xapian_dep.found(), static:static_linkage)]
if build_machine.system() != 'windows'
    icu_dep += [dependency('icu-uc', required:xapian_dep.found(), static:static_linkage)]
endif

@kelson42
Copy link
Contributor

@cho-m Thank you for your PR. CI was OK a month ago, I will have a look and try to fix them so we can test your PR properly.

@kelson42
Copy link
Contributor

@cho-m I have fixed a few things but we have a serious problem with the Windows CI. The CI for Windows does not pass for the moment on main either... although it does not block at the line you have added. My that be that your code is not compatible with older version of libicu? https://github.com/kiwix/kiwix-build/blob/main/kiwixbuild/dependencies/icu4c.py

@cho-m
Copy link
Author

cho-m commented Dec 20, 2024

code is not compatible with older version of libicu? https://github.com/kiwix/kiwix-build/blob/main/kiwixbuild/dependencies/icu4c.py

The official (Unix) pkgconfig files are compatible (icu-uc.pc has been around as long as icu-i18n.pc, i.e. ICU 59 - unicode-org/icu@d390758)

However, Windows build is using custom/3rd-party pkgconfig files. Ideally would have provided other pkgconfig files like Cygwin (https://cygwin.com/packages/x86_64/libicu-devel/libicu-devel-73.2-1)

    2023-08-03 01:02        1232 usr/lib/pkgconfig/icu-i18n.pc
    2023-08-03 01:02        1224 usr/lib/pkgconfig/icu-io.pc
    2023-08-03 01:02        1256 usr/lib/pkgconfig/icu-uc.pc

Anyways, PR most likely needs a build_machine.system() != 'windows' conditional to work around Windows.

@kelson42
Copy link
Contributor

kelson42 commented Dec 22, 2024

@veloman-yunkan @cho-m I can not merge this PR right now because it brakes the CI on Windows. From what I understand, I see only one way to solve this (and just ignoring Windows seems a dirty fix). Open an issue in kiwix/kiwix-build and fix how we deal with libicu on Windows there. Seems anyway pretty much linked to kiwix/kiwix-build#750 which seems to be a blocker for that PR then. Do I'm correct?

@veloman-yunkan
Copy link
Collaborator

@kelson42 I am fine with that.

@cho-m
Copy link
Author

cho-m commented Dec 22, 2024

From what I understand, I see only one way to solve this (and just ignoring Windows seems a dirty fix).

Could do a version check - https://mesonbuild.com/Reference-manual_returned_dep.html#depversion

Maybe something like:

icu_dep = dependency('icu-i18n', static:static_linkage)
if icu_dep.version().version_compare('>= 76')
  icu_dep = [icu_dep, dependency('icu-uc', static:static_linkage)]
endif

@hashworks
Copy link
Contributor

I've included a 9.1.0 variant of this patch in the Arch Linux icu76 rebuild.

@kelson42 kelson42 modified the milestones: 9.3.0, 10.0.0 Feb 14, 2025
@shenlebantongying
Copy link

Also included in Nix btw

NixOS/nixpkgs#385849

@kelson42 kelson42 modified the milestones: 10.0.0, 9.2.4 Apr 10, 2025
@kelson42 kelson42 force-pushed the icu76-support branch 2 times, most recently from 57eafef to c59fda2 Compare April 16, 2025 15:27
Copy link

codecov bot commented Apr 16, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 57.53%. Comparing base (ba2600f) to head (2c4789b).

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #936   +/-   ##
=======================================
  Coverage   57.53%   57.53%           
=======================================
  Files          99       99           
  Lines        4724     4724           
  Branches     1976     1976           
=======================================
  Hits         2718     2718           
  Misses        704      704           
  Partials     1302     1302           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@kelson42
Copy link
Contributor

@cho-m Please

From what I understand, I see only one way to solve this (and just ignoring Windows seems a dirty fix).

Could do a version check - https://mesonbuild.com/Reference-manual_returned_dep.html#depversion

Maybe something like:

icu_dep = dependency('icu-i18n', static:static_linkage)
if icu_dep.version().version_compare('>= 76')
  icu_dep = [icu_dep, dependency('icu-uc', static:static_linkage)]
endif

@cho-m Please do and rerequest review

@kelson42 kelson42 modified the milestones: 9.3.0, 10.0.0 Apr 16, 2025
Due to unicode-org/icu@199bc82, ICU 76 no longer adds `icu-uc` by
default. This causes linker errors for undefined symbols like
`icu_76::UnicodeString::doReplace(...)`, referenced from:
`zim::removeAccents(...)` in tools.cpp.o.

Meson will automatically flatten the dependencies list as documented
at https://mesonbuild.com/Reference-manual_functions.html#build_target
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants