Skip to content

feat(cmake): make BUILD_SEPARATE_LIBS work with BUILD_MERGED_PLUGINS #260

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

Closed
wants to merge 8 commits into from
28 changes: 15 additions & 13 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ option(BUILD_MERGED_PLUGINS "Merge plugins into one Rime library" ON)
option(BUILD_STATIC "Build with dependencies as static libraries" OFF)
option(BUILD_DATA "Build data for Rime" OFF)
option(BUILD_TEST "Build and run tests" ON)
option(BUILD_SEPARATE_LIBS "Build a separate rime-gears library" OFF)
option(BUILD_SEPARATE_LIBS "Build separate rime-* libraries" OFF)
option(ENABLE_LOGGING "Enable logging with google-glog library" ON)
option(BOOST_USE_CXX11 "Boost has been built with C++11 support" OFF)
option(BOOST_USE_SIGNALS2 "Boost use signals2 instead of signals" ON)
Expand Down Expand Up @@ -188,26 +188,28 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|DragonFly")
endif()
endif()

add_subdirectory(plugins)
message(STATUS "rime_plugins_libs: ${rime_plugins_deps}")
message(STATUS "rime_plugins_modules: ${rime_plugins_modules}")
set(list "")
foreach(mod ${rime_plugins_modules})
set(list "${list},Q(${mod})")
endforeach()
add_definitions(-DRIME_EXTRA_MODULES=${list})

if(BUILD_SHARED_LIBS)
add_definitions(-DRIME_BUILD_SHARED_LIBS)
set(rime_library rime)
if(BUILD_SEPARATE_LIBS)
set(rime_dict_library rime-dict)
set(rime_gears_library rime-gears)
set(rime_levers_library rime-levers)
endif()
else()
set(rime_library rime-static)
if(BUILD_SEPARATE_LIBS)
set(rime_gears_library rime-gears-static)
endif()
endif()

add_subdirectory(plugins)
message(STATUS "rime_plugins_libs: ${rime_plugins_deps}")
message(STATUS "rime_plugins_modules: ${rime_plugins_modules}")
set(list "")
foreach(mod ${rime_plugins_modules})
set(list "${list},Q(${mod})")
endforeach()
add_definitions(-DRIME_EXTRA_MODULES=${list})
if(BUILD_SHARED_LIBS AND BUILD_SEPARATE_LIBS AND rime_plugins_objs)
set(rime_plugins_library rime-plugins)
endif()

add_subdirectory(src)
Expand Down
7 changes: 5 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ librime-static:
cmake --build build-static

release:
cmake . -Bbuild -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release
cmake . -Bbuild -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_MERGED_PLUGINS=OFF
cmake --build build

merged-plugins:
cmake . -Bbuild -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_MERGED_PLUGINS=ON
cmake --build build

debug:
Expand All @@ -49,4 +53,3 @@ test: release

test-debug: debug
(cd debug-build/test; ./rime_test)

2 changes: 1 addition & 1 deletion Makefile.xcode
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ release:
cmake --build xbuild --config Release

debug:
cmake . -Bxdebug -GXcode -DBUILD_STATIC=ON
cmake . -Bxdebug -GXcode -DBUILD_STATIC=ON -DBUILD_SEPARATE_LIBS=ON
cmake --build xdebug --config Debug

clean:
Expand Down
5 changes: 4 additions & 1 deletion plugins/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
set(RIME_SOURCE_DIR ${PROJECT_SOURCE_DIR})
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

# work around CMake build issues on macOS
aux_source_directory(. rime_plugins_src)

unset(plugins_objs)
unset(plugins_deps)
unset(plugins_modules)
Expand All @@ -19,7 +22,7 @@ foreach(file ${plugin_files})
set(plugins_modules ${plugins_modules} ${plugin_modules})
else()
message(STATUS "Plugin ${plugin_name} provides modules: ${plugin_modules}")
add_library(${plugin_name} ${plugin_objs})
add_library(${plugin_name} ${rime_plugins_src} ${plugin_objs})
target_link_libraries(${plugin_name} ${plugin_deps})
if(XCODE_VERSION)
set_target_properties(${plugin_name} PROPERTIES INSTALL_NAME_DIR "@rpath")
Expand Down
3 changes: 3 additions & 0 deletions plugins/plugin.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Empty file to work around a CMake issue.
// Somehow a C++ source file (in addition to rime_plugins_objs) is required
// by CMake (3.13.3) to create shared rime-plugins library on macOS.
142 changes: 96 additions & 46 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,32 +1,34 @@
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

aux_source_directory(. rime_src_api)
aux_source_directory(rime rime_src_base)
aux_source_directory(rime/algo rime_src_algo)
aux_source_directory(rime/config rime_src_config)
aux_source_directory(rime/dict rime_src_dict)
aux_source_directory(rime/gear rime_src_gear)
aux_source_directory(rime/lever rime_src_lever)
aux_source_directory(. rime_api_src)
aux_source_directory(rime rime_base_src)
aux_source_directory(rime/algo rime_algo_src)
aux_source_directory(rime/config rime_config_src)
aux_source_directory(rime/dict rime_dict_src)
aux_source_directory(rime/gear rime_gears_src)
aux_source_directory(rime/lever rime_levers_src)
if(rime_plugins_library)
aux_source_directory(../plugins rime_plugins_src)
endif()

if(BUILD_SEPARATE_LIBS)
set(rime_src
${rime_src_api}
${rime_src_base}
${rime_src_config})
set(librime_gears_src
${rime_src_algo}
${rime_src_dict}
${rime_src_gear}
${rime_src_lever})
set(rime_core_module_src
${rime_api_src}
${rime_base_src}
${rime_config_src})
set(rime_dict_module_src
${rime_algo_src}
${rime_dict_src})

if(BUILD_SHARED_LIBS AND BUILD_SEPARATE_LIBS)
set(rime_src ${rime_core_module_src})
else()
set(rime_src
${rime_src_api}
${rime_src_base}
${rime_src_algo}
${rime_src_config}
${rime_src_dict}
${rime_src_gear}
${rime_src_lever})
${rime_core_module_src}
${rime_dict_module_src}
${rime_gears_src}
${rime_levers_src}
${rime_plugins_src}
${rime_plugins_objs})
endif()

set(rime_optional_deps "")
Expand All @@ -39,54 +41,102 @@ set(rime_core_deps
${Glog_LIBRARY}
${YamlCpp_LIBRARY}
${CMAKE_THREAD_LIBS_INIT}
${rime_optional_deps}
${rime_plugins_deps})
set(rime_extra_deps
${ICONV_LIBRARIES}
${rime_optional_deps})
set(rime_dict_deps
${LevelDb_LIBRARY}
${Marisa_LIBRARY}
${Marisa_LIBRARY})
set(rime_gears_deps
${ICONV_LIBRARIES}
${Opencc_LIBRARY})
set(rime_levers_deps "")

if(MINGW)
set(rime_core_deps ${rime_core_deps} wsock32 ws2_32)
endif()

if(BUILD_SEPARATE_LIBS)
set(rime_deps ${rime_core_deps})
set(rime_gears_deps ${rime_library} ${rime_extra_deps})
else()
set(rime_deps ${rime_core_deps} ${rime_extra_deps})
set(rime_deps
${rime_core_deps}
${rime_dict_deps}
${rime_gears_deps}
${rime_levers_deps}
${rime_plugins_deps})
endif()

if(BUILD_SHARED_LIBS)
add_library(rime ${rime_plugins_objs} ${rime_src})
add_library(rime ${rime_src})
target_link_libraries(rime ${rime_deps})
set_target_properties(rime PROPERTIES DEFINE_SYMBOL "RIME_EXPORTS")
set_target_properties(rime PROPERTIES VERSION ${rime_version} SOVERSION ${rime_soversion})
set_target_properties(rime PROPERTIES
DEFINE_SYMBOL "RIME_EXPORTS"
VERSION ${rime_version}
SOVERSION ${rime_soversion})
if(XCODE_VERSION)
set_target_properties(rime PROPERTIES INSTALL_NAME_DIR "@rpath")
endif()
install(TARGETS rime DESTINATION ${LIB_INSTALL_DIR})

if(BUILD_SEPARATE_LIBS)
add_library(rime-gears ${librime_gears_src})
target_link_libraries(rime-gears ${rime_gears_deps})
add_dependencies(rime-gears ${rime_library})
set_target_properties(rime-gears PROPERTIES VERSION ${rime_version} SOVERSION ${rime_soversion})
add_library(rime-dict ${rime_dict_module_src})
target_link_libraries(rime-dict
${rime_dict_deps}
${rime_library})
set_target_properties(rime-dict PROPERTIES
VERSION ${rime_version}
SOVERSION ${rime_soversion})
if(XCODE_VERSION)
set_target_properties(rime-dict PROPERTIES INSTALL_NAME_DIR "@rpath")
endif()
install(TARGETS rime-dict DESTINATION ${LIB_INSTALL_DIR})

add_library(rime-gears ${rime_gears_src})
target_link_libraries(rime-gears
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
target_link_libraries(rime-gears
target_link_libraries(rime-gears ${rime_gears_deps})

There is no need to link ${rime_library}, ${rime_gears_deps}, ${rime_dict_library}.

I have tested it in Linux, and it should work in macOS.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No this doesn't work for the macOS build.
Errors were cannot find symbol in rime libraries it depends on.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the solution is

target_link_libraries(rime-gears ${rime_gears_deps})
IF(APPLE)
  SET_TARGET_PROPERTIES(rime-gears PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
ENDIF(APPLE)

References:
[1] https://stackoverflow.com/questions/42722759/portable-plugins-with-cmake
[2] https://stackoverflow.com/questions/36662920/xcode-clang-link-build-dynamic-framework-or-dylib-not-embed-dependencies

${rime_gears_deps}
${rime_library}
${rime_dict_library})
set_target_properties(rime-gears PROPERTIES
VERSION ${rime_version}
SOVERSION ${rime_soversion})
if(XCODE_VERSION)
set_target_properties(rime-gears PROPERTIES INSTALL_NAME_DIR "@rpath")
endif()
install(TARGETS rime-gears DESTINATION ${LIB_INSTALL_DIR})

add_library(rime-levers ${rime_levers_src})
target_link_libraries(rime-levers
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above.

${rime_levers_deps}
${rime_library}
${rime_dict_library})
set_target_properties(rime-levers PROPERTIES
VERSION ${rime_version}
SOVERSION ${rime_soversion})
if(XCODE_VERSION)
set_target_properties(rime-levers PROPERTIES INSTALL_NAME_DIR "@rpath")
endif()
install(TARGETS rime-levers DESTINATION ${LIB_INSTALL_DIR})

if(rime_plugins_library)
add_library(rime-plugins
${rime_plugins_src}
${rime_plugins_objs})
target_link_libraries(rime-plugins
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same. Just link ${rime_plugins_deps}

${rime_plugins_deps}
${rime_library}
${rime_dict_library}
${rime_gears_library})
set_target_properties(rime-plugins PROPERTIES
VERSION ${rime_version}
SOVERSION ${rime_soversion})
if(XCODE_VERSION)
set_target_properties(rime-plugins PROPERTIES INSTALL_NAME_DIR "@rpath")
endif()
install(TARGETS rime-plugins DESTINATION ${LIB_INSTALL_DIR})
endif()
endif()
else()
add_library(rime-static STATIC ${rime_plugins_objs} ${rime_src})
add_library(rime-static STATIC ${rime_src})
target_link_libraries(rime-static ${rime_deps})
set_target_properties(rime-static PROPERTIES OUTPUT_NAME "rime" PREFIX "lib")
install(TARGETS rime-static DESTINATION ${LIB_INSTALL_DIR})
if(BUILD_SEPARATE_LIBS)
add_library(rime-gears-static STATIC ${librime_gears_src})
target_link_libraries(rime-gears-static ${rime_gears_deps})
add_dependencies(rime-gears-static ${rime_library})
set_target_properties(rime-gears-static PROPERTIES OUTPUT_NAME "rime-gears" PREFIX "lib")
install(TARGETS rime-gears-static DESTINATION ${LIB_INSTALL_DIR})
endif()
endif()
7 changes: 4 additions & 3 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ aux_source_directory(. rime_test_src)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/test)
add_executable(rime_test ${rime_test_src})
target_link_libraries(rime_test
${rime_library} ${rime_gears_library}
${GTEST_LIBRARIES})
${rime_library}
${rime_dict_library}
${rime_gears_library}
${GTEST_LIBRARIES})
if(BUILD_SHARED_LIBS)
target_compile_definitions(rime_test PRIVATE RIME_IMPORTS)
endif(BUILD_SHARED_LIBS)
add_dependencies(rime_test ${rime_library} ${rime_gears_library})

file(GLOB test_data_files ${PROJECT_SOURCE_DIR}/data/test/*.yaml)
file(COPY ${test_data_files} DESTINATION ${EXECUTABLE_OUTPUT_PATH})
Expand Down
33 changes: 23 additions & 10 deletions tools/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,44 @@ set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

set(rime_api_console_src "rime_api_console.cc")
add_executable(rime_api_console ${rime_api_console_src})
target_link_libraries(rime_api_console ${rime_library} ${rime_gears_library})
add_dependencies(rime_api_console ${rime_library} ${rime_gears_library})
target_link_libraries(rime_api_console
${rime_library}
${rime_dict_library}
${rime_gears_library}
${rime_levers_library}
${rime_plugins_library})

set(rime_patch_src "rime_patch.cc")
add_executable(rime_patch ${rime_patch_src})
target_link_libraries(rime_patch ${rime_library} ${rime_gears_library})
add_dependencies(rime_patch ${rime_library} ${rime_gears_library})
target_link_libraries(rime_patch
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My test shows rime_patch depends on ${rime_dict_library}

${rime_library}
${rime_levers_library})

# msvc doesn't export all symbols
if(NOT (WIN32 AND BUILD_SHARED_LIBS))

set(rime_console_src "rime_console.cc")
add_executable(rime_console ${rime_console_src})
target_link_libraries(rime_console ${rime_library} ${rime_gears_library})
add_dependencies(rime_console ${rime_library} ${rime_gears_library})
target_link_libraries(rime_console
${rime_library}
${rime_dict_library}
${rime_gears_library}
${rime_levers_library}
${rime_plugins_library})

set(rime_dict_manager_src "rime_dict_manager.cc")
add_executable(rime_dict_manager ${rime_dict_manager_src})
target_link_libraries(rime_dict_manager ${rime_library} ${rime_gears_library})
add_dependencies(rime_dict_manager ${rime_library} ${rime_gears_library})
target_link_libraries(rime_dict_manager
${rime_library}
${rime_dict_library}
${rime_levers_library})

set(rime_deployer_src "rime_deployer.cc")
add_executable(rime_deployer ${rime_deployer_src})
target_link_libraries(rime_deployer ${rime_library} ${rime_gears_library})
add_dependencies(rime_deployer ${rime_library} ${rime_gears_library})
target_link_libraries(rime_deployer
${rime_library}
${rime_dict_library}
${rime_levers_library})

install(TARGETS rime_dict_manager DESTINATION ${BIN_INSTALL_DIR})
install(TARGETS rime_deployer DESTINATION ${BIN_INSTALL_DIR})
Expand Down