KyleL
KyleL

Reputation: 1455

How do I deploy the ICU libraries using CMake?

I am trying to build a linux application that uses the ICU. While the ICU library is generally available on most linux distros, I have recently learned it is generally not binary compatible between versions. I think the easiest path forward will be to deploy the ICU with my application so all dependencies are satisfied upon installation.

My question is how can I do this with CMake? I tried the following:

find_library(ICUIL18N_LIB icui18n )
find_library(ICUUC_LIB icuuc)
find_library(ICUDATA_LIB icudata)

#link pthread and ICU against the library
target_link_libraries(MyApp pthread rt ${ICUIL18N_LIB} ${ICUUC_LIB})

install(FILES ${ICUIL18N_LIB} ${ICUUC_LIB} ${ICUDATA_LIB}
        DESTINATION lib)

This appears to work, however when I examine my generated package I end up with my application expecting these libraries:

libicui18n.so.50 => /lib/libicui18n.so.50 (0xf74ee000)
libicuuc.so.50 => /lib/libicuuc.so.50 (0xf737b000)

But the files included in my packages are just symlinks with names that don't even match:

/lib/libicui18n.so -> libicui18n.so.50.1.2
/lib/libicuuc.so -> libicuuc.so.50.1.2
/lib/libicudata.so -> libicudata.so.50.1.2

Is there a way for me to get the actual fully-linked paths from my target via cmake so I can install the right files?

Is there a different mechanism I should use for this? I did see the 'BundleUtilities' plugin, but instructions are not clear and I'm not sure it is applicable to this situation.

Upvotes: 0

Views: 1898

Answers (1)

KyleL
KyleL

Reputation: 1455

I ended up directly 'finding' the ICU symlinks and actual library files, then installing them. Not very elegant, but worked for my purposes. Unfortunately this will require a modification anytime I change ICU versions.

set(ICU_MAJOR_VER "57")
set(ICU_FULL_VERSION "${ICU_MAJOR_VER}.1")


find_library(ICUIL18N_LIB libicui18n.so.${ICU_FULL_VERSION} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH)
find_library(ICUUC_LIB libicuuc.so.${ICU_FULL_VERSION} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH)
find_library(ICUDATA_LIB libicudata.so.${ICU_FULL_VERSION} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH)

find_library(ICUIL18N_MAJOR_LIB libicui18n.so.${ICU_MAJOR_VER} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH)
find_library(ICUUC_MAJOR_LIB libicuuc.so.${ICU_MAJOR_VER} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH)
find_library(ICUDATA_MAJOR_LIB libicudata.so.${ICU_MAJOR_VER} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH)

install(FILES ${ICUIL18N_LIB} ${ICUUC_LIB} ${ICUDATA_LIB}
              ${ICUIL18N_MAJOR_LIB} ${ICUUC_MAJOR_LIB} ${ICUDATA_MAJOR_LIB}
        DESTINATION lib)

Upvotes: 1

Related Questions