[Groonga-commit] groonga/groonga at 1c0177e [master] cmake: support building TokenMecab with bundled MeCab

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index