Kouhei Sutou
null+****@clear*****
Sat Oct 17 20:58:00 JST 2015
Kouhei Sutou 2015-10-17 20:58:00 +0900 (Sat, 17 Oct 2015) New Revision: 1c0177ea2594e2e62f989ae306fc647a69cc520c https://github.com/groonga/groonga/commit/1c0177ea2594e2e62f989ae306fc647a69cc520c Message: cmake: support building TokenMecab with bundled MeCab Added files: mecab_version Modified files: .gitignore CMakeLists.txt Makefile.am plugins/tokenizers/CMakeLists.txt plugins/tokenizers/mecab.c vendor/mecab/CMakeLists.txt Modified: .gitignore (+2 -0) =================================================================== --- .gitignore 2015-10-17 17:49:39 +0900 (993c3c0) +++ .gitignore 2015-10-17 20:58:00 +0900 (877f053) @@ -47,6 +47,8 @@ /vendor/mruby/mruby-io/ /vendor/mruby/mruby_build.timestamp /vendor/mruby-build/ +/vendor/mecab-* +/vendor/mecab/mecabrc /vendor/plugins/*/ /groonga.spec /stamp-h1 Modified: CMakeLists.txt (+37 -24) =================================================================== --- CMakeLists.txt 2015-10-17 17:49:39 +0900 (e362ba1) +++ CMakeLists.txt 2015-10-17 20:58:00 +0900 (e8668a1) @@ -380,38 +380,51 @@ if(NOT ${GRN_WITH_LZ4} STREQUAL "no") endif() endif() +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/mecab_version" GRN_BUNDLED_MECAB_VERSION) +string(REGEX REPLACE "\n" "" + GRN_BUNDLED_MECAB_VERSION + "${GRN_BUNDLED_MECAB_VERSION}") +option(GRN_WITH_BUNDLED_MECAB "use bundled MeCab" OFF) set(GRN_WITH_MECAB "auto" CACHE STRING "use MeCab for morphological analysis") if(NOT ${GRN_WITH_MECAB} STREQUAL "no") - set(GRN_MECAB_CONFIG "mecab-config" CACHE FILEPATH "mecab-config path") - if(NOT CMAKE_CROSSCOMPILING) - find_program(GRN_MECAB_CONFIG_ABSOLUTE_PATH "${GRN_MECAB_CONFIG}") - endif() - if(EXISTS "${GRN_MECAB_CONFIG_ABSOLUTE_PATH}") - execute_process(COMMAND "${GRN_MECAB_CONFIG_ABSOLUTE_PATH}" --inc-dir - OUTPUT_VARIABLE MECAB_INCLUDE_DIRS - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND "${GRN_MECAB_CONFIG_ABSOLUTE_PATH}" --libs-only-L - OUTPUT_VARIABLE MECAB_LIBRARY_DIRS - OUTPUT_STRIP_TRAILING_WHITESPACE) - set(MECAB_LIBRARIES "mecab") - ac_check_lib(${MECAB_LIBRARIES} mecab_new) - if(HAVE_LIBMECAB) - set(GRN_WITH_MECAB TRUE) + if(GRN_WITH_BUNDLED_MECAB) + set(MECAB_INCLUDE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}/vendor/mecab-${GRN_BUNDLED_MECAB_VERSION}/src") + set(MECAB_LIBRARY_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}/vendor/mecab") + set(MECAB_LIBRARIES mecab) + else() + set(GRN_MECAB_CONFIG "mecab-config" CACHE FILEPATH "mecab-config path") + if(NOT CMAKE_CROSSCOMPILING) + find_program(GRN_MECAB_CONFIG_ABSOLUTE_PATH "${GRN_MECAB_CONFIG}") + endif() + if(EXISTS "${GRN_MECAB_CONFIG_ABSOLUTE_PATH}") + execute_process(COMMAND "${GRN_MECAB_CONFIG_ABSOLUTE_PATH}" --inc-dir + OUTPUT_VARIABLE MECAB_INCLUDE_DIRS + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND "${GRN_MECAB_CONFIG_ABSOLUTE_PATH}" --libs-only-L + OUTPUT_VARIABLE MECAB_LIBRARY_DIRS + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(MECAB_LIBRARIES "mecab") + ac_check_lib(${MECAB_LIBRARIES} mecab_new) + if(HAVE_LIBMECAB) + set(GRN_WITH_MECAB TRUE) + else() + if(${GRN_WITH_MECAB} STREQUAL "yes") + message(FATAL_ERROR + "No MeCab library found: " + "include directories: <${MECAB_INCLUDE_DIRS}>, " + "library directories: <${MECAB_LIBRARY_DIRS}>") + endif() + set(GRN_WITH_MECAB FALSE) + endif() else() if(${GRN_WITH_MECAB} STREQUAL "yes") - message(FATAL_ERROR - "No MeCab library found: " - "include directories: <${MECAB_INCLUDE_DIRS}>, " - "library directories: <${MECAB_LIBRARY_DIRS}>") + message(FATAL_ERROR "No mecab-config found: <${GRN_MECAB_CONFIG}>") endif() set(GRN_WITH_MECAB FALSE) endif() - else() - if(${GRN_WITH_MECAB} STREQUAL "yes") - message(FATAL_ERROR "No mecab-config found: <${GRN_MECAB_CONFIG}>") - endif() - set(GRN_WITH_MECAB FALSE) endif() else() set(GRN_WITH_MECAB FALSE) Modified: Makefile.am (+2 -1) =================================================================== --- Makefile.am 2015-10-17 17:49:39 +0900 (332ee89) +++ Makefile.am 2015-10-17 20:58:00 +0900 (8f38840) @@ -26,7 +26,8 @@ EXTRA_DIST = \ base_version \ gpg_uid \ CMakeLists.txt \ - config.h.cmake + config.h.cmake \ + mecab_version pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = groonga.pc Added: mecab_version (+1 -0) 100644 =================================================================== --- /dev/null +++ mecab_version 2015-10-17 20:58:00 +0900 (00445f8) @@ -0,0 +1 @@ +0.996 Modified: plugins/tokenizers/CMakeLists.txt (+11 -0) =================================================================== --- plugins/tokenizers/CMakeLists.txt 2015-10-17 17:49:39 +0900 (9209b44) +++ plugins/tokenizers/CMakeLists.txt 2015-10-17 20:58:00 +0900 (8eec25d) @@ -22,6 +22,17 @@ if(GRN_WITH_MECAB) read_file_list(${CMAKE_CURRENT_SOURCE_DIR}/mecab_sources.am MECAB_SOURCES) include_directories(${MECAB_INCLUDE_DIRS}) link_directories(${MECAB_LIBRARY_DIRS}) + if(GRN_WITH_BUNDLED_MECAB) + set(GRN_BUNDLED_MECAB_RELATIVE_RC_PATH "${CONFIG_DIR}/mecabrc") + set(MECAB_COMPILE_DEFINITIONS + "GRN_WITH_BUNDLED_MECAB" + "GRN_BUNDLED_MECAB_RELATIVE_RC_PATH=\"${GRN_BUNDLED_MECAB_RELATIVE_RC_PATH}\"" + "GRN_BUNDLED_MECAB_RC_PATH=\"${CMAKE_INSTALL_PREFIX}/${GRN_BUNDLED_MECAB_RELATIVE_RC_PATH}\"") + set_source_files_properties(${MECAB_SOURCES} + PROPERTIES + COMPILE_DEFINITIONS + "${MECAB_COMPILE_DEFINITIONS}") + endif() set_source_files_properties(${MECAB_SOURCES} PROPERTIES COMPILE_FLAGS "${GRN_C_COMPILE_FLAGS}") Modified: plugins/tokenizers/mecab.c (+35 -2) =================================================================== --- plugins/tokenizers/mecab.c 2015-10-17 17:49:39 +0900 (94a4983) +++ plugins/tokenizers/mecab.c 2015-10-17 20:58:00 +0900 (b5e0356) @@ -294,11 +294,44 @@ mecab_init(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) if (!sole_mecab) { grn_plugin_mutex_lock(ctx, sole_mecab_mutex); if (!sole_mecab) { - sole_mecab = mecab_new2("-Owakati"); + int argc = 0; + const char *argv[3]; + argv[argc++] = "-Owakati"; +#ifdef GRN_WITH_BUNDLED_MECAB + argv[argc++] = "--rcfile"; +# ifdef WIN32 + { + static char windows_mecab_rc_file[PATH_MAX]; + + grn_strcpy(windows_mecab_rc_file, + PATH_MAX, + grn_plugin_windows_base_dir()); + grn_strcat(windows_mecab_rc_file, + PATH_MAX, + "/"); + grn_strcat(windows_mecab_rc_file, + PATH_MAX, + GRN_BUNDLED_MECAB_RELATIVE_RC_PATH); + argv[argc++] = windows_mecab_rc_file; + } +# else /* WIN32 */ + argv[argc++] = GRN_BUNDLED_MECAB_RC_PATH; +# endif /* WIN32 */ +#endif /* GRN_WITH_BUNDLED_MECAB */ + sole_mecab = mecab_new(argc, (char **)argv); if (!sole_mecab) { GRN_PLUGIN_ERROR(ctx, GRN_TOKENIZER_ERROR, "[tokenizer][mecab] " - "mecab_new2() failed on mecab_init(): %s", + "mecab_new(" + "\"%s\"" +#ifdef GRN_WITH_BUNDLED_MECAB + ", \"%s\", \"%s\"" +#endif /* GRN_WITH_BUNDLED_MECAB */ + ") failed on mecab_init(): %s", + argv[0], +#ifdef GRN_WITH_BUNDLED_MECAB + argv[1], argv[2], +#endif /* GRN_WITH_BUNDLED_MECAB */ mecab_global_error_message()); } else { sole_mecab_encoding = get_mecab_encoding(sole_mecab); Modified: vendor/mecab/CMakeLists.txt (+15 -11) =================================================================== --- vendor/mecab/CMakeLists.txt 2015-10-17 17:49:39 +0900 (272df3d) +++ vendor/mecab/CMakeLists.txt 2015-10-17 20:58:00 +0900 (032f8ce) @@ -13,12 +13,12 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -set(MECAB_VERSION "0.996") +set(MECAB_VERSION ${GRN_BUNDLED_MECAB_VERSION}) set(MECAB_DICT_VERSION "102") set(MECAB_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../mecab-${MECAB_VERSION}") set(MECAB_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/../mecab-${MECAB_VERSION}") -if(EXISTS ${MECAB_SOURCE_DIR}) +if(GRN_WITH_BUNDLED_MECAB) include_directories( BEFORE ${MECAB_BINARY_DIR} @@ -124,15 +124,19 @@ if(EXISTS ${MECAB_SOURCE_DIR}) PROPERTIES COMPILE_FLAGS "${MECAB_CXX_COMPILE_FLAGS}") - if(GRN_BUNDLED) - add_library(mecab STATIC ${MECAB_SOURCES}) - set_target_properties( - mecab - PROPERTIES - POSITION_INDEPENDENT_CODE ON) - else() - add_library(mecab SHARED ${MECAB_SOURCES}) - endif() + add_library(mecab SHARED ${MECAB_SOURCES}) + install(TARGETS mecab + ARCHIVE DESTINATION "${LIB_DIR}" + LIBRARY DESTINATION "${LIB_DIR}" + RUNTIME DESTINATION "${BIN_DIR}") + install(FILES "${MECAB_SOURCE_DIR}/src/mecab.h" + DESTINATION "${INCLUDE_DIR}") + + set(prefix "${CMAKE_INSTALL_PREFIX}") + configure_file("${MECAB_SOURCE_DIR}/mecabrc.in" + "mecabrc") + install(FILES "mecabrc" + DESTINATION "${CONFIG_DIR}") configure_file(config.h.cmake "${MECAB_BINARY_DIR}/config.h") endif() -------------- next part -------------- HTML����������������������������... Download