Navigation Menu

Skip to content

Commit

Permalink
cmake: support building TokenMecab with bundled MeCab
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Oct 17, 2015
1 parent ec931d9 commit 1c0177e
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 38 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -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
Expand Down
61 changes: 37 additions & 24 deletions CMakeLists.txt
Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion Makefile.am
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions mecab_version
@@ -0,0 +1 @@
0.996
11 changes: 11 additions & 0 deletions plugins/tokenizers/CMakeLists.txt
Expand Up @@ -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}")
Expand Down
37 changes: 35 additions & 2 deletions plugins/tokenizers/mecab.c
Expand Up @@ -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);
Expand Down
26 changes: 15 additions & 11 deletions vendor/mecab/CMakeLists.txt
Expand Up @@ -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}
Expand Down Expand Up @@ -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()

0 comments on commit 1c0177e

Please sign in to comment.