Kiwi/CMakeLists.txt

376 lines
No EOL
11 KiB
CMake

cmake_minimum_required(VERSION 3.12)
project(kiwi VERSION 0.23.2 DESCRIPTION "Kiwi, Korean Intelligent Word Identifier")
set ( CMAKE_CXX_STANDARD 17 )
set ( CMAKE_VERBOSE_MAKEFILE true )
option(KIWI_USE_MIMALLOC "Use mimalloc for faster memory allocation" ON)
option(KIWI_USE_CPUINFO "Use cpuinfo for dynamic CPU dispatching" ON)
option(KIWI_STATIC_WITHOUT_MT "Use /MT Option in building kiwi_static" OFF)
option(KIWI_BUILD_DYNAMIC "Build dynamic library" ON)
option(KIWI_BUILD_CLI "Build CLI tool" ON)
option(KIWI_BUILD_EVALUATOR "Build Evaluator" ON)
option(KIWI_BUILD_MODEL_BUILDER "Build Model Builder" ON)
option(KIWI_BUILD_TEST "Build Test sets" ON)
option(KIWI_JAVA_BINDING "Build Java binding" OFF)
set(KIWI_CPU_ARCH "" CACHE STRING "Set architecture type for macOS")
if (NOT CMAKE_BUILD_TYPE)
if ("${CMAKE_BINARY_DIR}" MATCHES ".*(D|d)ebug$")
message(STATUS "No build type selected, default to: Debug")
set(CMAKE_BUILD_TYPE "Debug")
else()
message(STATUS "No build type selected, default to: Release")
set(CMAKE_BUILD_TYPE "Release")
endif()
endif()
if(NOT KIWI_CPU_ARCH)
if (EMSCRIPTEN)
set(KIWI_CPU_ARCH "wasm")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)"
OR "${ANDROID_ABI}" STREQUAL "x86_64")
set(KIWI_CPU_ARCH "x86_64")
elseif (HOST_ARCHITECTURE MATCHES "^arm64"
OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|aarch64)"
OR "${ANDROID_ABI}" STREQUAL "arm64-v8a")
set(KIWI_CPU_ARCH "arm64")
else()
set(KIWI_CPU_ARCH "other")
endif()
set(KIWI_CPU_ARCH "${KIWI_CPU_ARCH}" PARENT_SCOPE)
endif()
if (KIWI_USE_CPUINFO AND
(MSVC OR
((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 11)
)
)
set ( AVX_VNNI_SUPPORTED ON )
else()
set ( AVX_VNNI_SUPPORTED OFF )
endif()
if(APPLE AND NOT CMAKE_OSX_ARCHITECTURES)
set(CMAKE_OSX_ARCHITECTURES "${KIWI_CPU_ARCH}")
endif()
set ( CORE_SRCS
src/ArchUtils.cpp
src/Combiner.cpp
src/CoNgramModel.cpp
src/Dataset.cpp
src/Form.cpp
src/FeatureTestor.cpp
src/FileUtils.cpp
src/Joiner.cpp
src/Kiwi.cpp
src/KiwiBuilder.cpp
src/Knlm.cpp
src/KTrie.cpp
src/PatternMatcher.cpp
src/search.cpp
src/ScriptType.cpp
src/SkipBigramModel.cpp
src/SubstringExtractor.cpp
src/SwTokenizer.cpp
src/TagUtils.cpp
src/TypoTransformer.cpp
src/UnicodeCase.cpp
src/UnkFormScorer.cpp
src/Utils.cpp
src/WordDetector.cpp
src/archImpl/none.cpp
)
if(KIWI_USE_MIMALLOC)
message(STATUS "Use mimalloc allocators")
set ( ADDITIONAL_FLAGS "-DKIWI_USE_MIMALLOC" )
include_directories( third_party/mimalloc/include )
set ( CORE_SRCS "${CORE_SRCS}"
third_party/mimalloc/src/static.c
)
endif()
include_directories( include/ )
include_directories( third_party/tclap/include )
include_directories( third_party/cpp-btree )
include_directories( third_party/eigen )
include_directories( third_party/json/include )
include_directories( third_party/streamvbyte/include )
add_subdirectory( third_party/streamvbyte )
set ( STREAMVBYTE_OBJECTS
$<TARGET_OBJECTS:streamvbyte>
)
if(KIWI_USE_CPUINFO)
message(STATUS "Use cpuinfo")
include_directories( third_party/cpuinfo/include )
set(CPUINFO_LIBRARY_TYPE "shared" CACHE STRING "")
set(CPUINFO_BUILD_TOOLS OFF CACHE BOOL "")
set(CPUINFO_BUILD_UNIT_TESTS OFF CACHE BOOL "")
set(CPUINFO_BUILD_MOCK_TESTS OFF CACHE BOOL "")
set(CPUINFO_BUILD_BENCHMARKS OFF CACHE BOOL "")
add_subdirectory( third_party/cpuinfo )
set ( ADDITIONAL_FLAGS ${ADDITIONAL_FLAGS} "-DKIWI_USE_CPUINFO" )
if(MSVC)
target_compile_options("cpuinfo" PUBLIC
/MT
)
target_compile_options("cpuinfo_internals" PUBLIC
/MT
)
endif()
set ( CPUINFO_OBJECTS_STATIC
$<TARGET_OBJECTS:cpuinfo_internals>
)
set ( CPUINFO_OBJECTS_SHARED
$<TARGET_OBJECTS:cpuinfo>
)
endif()
if (AVX_VNNI_SUPPORTED)
message(STATUS "AVX-VNNI is supported")
set ( ADDITIONAL_FLAGS ${ADDITIONAL_FLAGS} "-DKIWI_AVX_VNNI_SUPPORTED" )
endif()
if(MSVC)
set ( CMAKE_C_FLAGS_DEBUG "-DDEBUG -DC_FLAGS -Zi -Od /utf-8 /bigobj" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" )
set ( CMAKE_C_FLAGS_RELEASE "-DNDEBUG -DRELEASE -DC_FLAGS -O2 -Oi -Gy /utf-8 /bigobj -DKIWI_USE_BTREE" )
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" )
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -Zi")
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
set ( CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" )
else()
if(NOT ANDROID)
link_libraries ( pthread )
endif()
set ( CMAKE_C_FLAGS_DEBUG "-DDEBUG -DC_FLAGS -g3 -O0" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" )
set ( CMAKE_EXE_LINKER_FLAGS_DEBUG "-DDEBUG -DLINKER_FLAGS" )
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
set ( CMAKE_C_FLAGS_RELEASE "-DNDEBUG -DRELEASE -DC_FLAGS -O3 -DKIWI_USE_BTREE" )
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" )
set ( CMAKE_EXE_LINKER_FLAGS_RELEASE "-DRELEASE -DLINKER_FLAGS" )
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
set ( CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" )
if (APPLE)
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wno-unqualified-std-cast-call" )
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-unqualified-std-cast-call" )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Wno-unqualified-std-cast-call" )
endif()
endif()
if (KIWI_CPU_ARCH MATCHES "x86_64")
message("Compiling for x86_64")
set( CORE_SRCS
${CORE_SRCS}
src/archImpl/sse2.cpp
src/archImpl/sse4_1.cpp
)
if (KIWI_USE_CPUINFO)
set( CORE_SRCS
${CORE_SRCS}
src/archImpl/avx2.cpp
src/archImpl/avx512bw.cpp
src/archImpl/avx512vnni.cpp
)
# If AVX-VNNI is supported (MSVC, GCC 11+ or Clang 11+)
if (AVX_VNNI_SUPPORTED)
set( CORE_SRCS
${CORE_SRCS}
src/archImpl/avx_vnni.cpp
)
endif()
endif()
if(MSVC)
set_source_files_properties(src/archImpl/sse2.cpp PROPERTIES COMPILE_FLAGS "/arch:SSE2")
set_source_files_properties(src/archImpl/sse4_1.cpp PROPERTIES COMPILE_FLAGS "/arch:SSE2")
if (KIWI_USE_CPUINFO)
set_source_files_properties(src/archImpl/avx2.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX2")
set_source_files_properties(src/archImpl/avx_vnni.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX2")
set_source_files_properties(src/archImpl/avx512bw.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX512")
set_source_files_properties(src/archImpl/avx512vnni.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX512")
endif()
else()
set_source_files_properties(src/archImpl/sse2.cpp PROPERTIES COMPILE_FLAGS "-msse2")
set_source_files_properties(src/archImpl/sse4_1.cpp PROPERTIES COMPILE_FLAGS "-msse2 -msse4.1")
if (KIWI_USE_CPUINFO)
set_source_files_properties(src/archImpl/avx2.cpp PROPERTIES COMPILE_FLAGS "-mavx -mavx2 -mfma")
set_source_files_properties(src/archImpl/avx512bw.cpp PROPERTIES COMPILE_FLAGS "-mavx -mavx2 -mfma -mavx512f -mavx512vl -mavx512dq -mavx512bw")
set_source_files_properties(src/archImpl/avx512vnni.cpp PROPERTIES COMPILE_FLAGS "-mavx -mavx2 -mfma -mavx512f -mavx512vl -mavx512dq -mavx512bw -mavx512vnni")
if (AVX_VNNI_SUPPORTED)
set_source_files_properties(src/archImpl/avx_vnni.cpp PROPERTIES COMPILE_FLAGS "-mavx -mavx2 -mfma -mavxvnni")
endif()
endif()
endif()
elseif (KIWI_CPU_ARCH MATCHES "arm64")
message("Compiling for arm64")
set( CORE_SRCS
${CORE_SRCS}
src/archImpl/neon.cpp
)
set_source_files_properties(src/archImpl/neon.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a -DKIWI_ARCH_ARM64=1")
elseif (KIWI_CPU_ARCH MATCHES "wasm")
message("Compiling for wasm")
else()
message("Compiling for other")
endif()
add_library( "${PROJECT_NAME}_static" STATIC
${CORE_SRCS}
src/capi/kiwi_c.cpp
${CPUINFO_OBJECTS_STATIC}
${STREAMVBYTE_OBJECTS}
)
install(TARGETS ${PROJECT_NAME}_static PUBLIC_HEADER DESTINATION include/kiwi)
# Install the kiwi library as well as header files to (`include/kiwi` directory)
# so that a user can use it in their own projects that are not cmake projects.
file(GLOB KIWI_INCLUDE_FILES "include/kiwi/*.h" "include/kiwi/*.hpp")
if(KIWI_BUILD_DYNAMIC)
add_library( "${PROJECT_NAME}" SHARED
${CORE_SRCS}
src/capi/kiwi_c.cpp
${CPUINFO_OBJECTS_SHARED}
${STREAMVBYTE_OBJECTS}
)
set_target_properties("${PROJECT_NAME}" PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
PUBLIC_HEADER "${KIWI_INCLUDE_FILES}"
)
install(TARGETS ${PROJECT_NAME} PUBLIC_HEADER DESTINATION include/kiwi)
target_compile_options("${PROJECT_NAME}" PRIVATE "${ADDITIONAL_FLAGS}")
endif()
target_compile_options("${PROJECT_NAME}_static" PRIVATE "${ADDITIONAL_FLAGS}")
#target_link_libraries("${PROJECT_NAME}_static" cpuinfo_internals)
#target_link_libraries("${PROJECT_NAME}" cpuinfo)
if (KIWI_BUILD_CLI)
add_executable( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
tools/runner.cpp
)
target_link_libraries( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
"${PROJECT_NAME}_static"
)
endif()
if (KIWI_BUILD_EVALUATOR)
add_executable( "${PROJECT_NAME}-evaluator"
tools/Evaluator.cpp
tools/evaluator_main.cpp
)
target_link_libraries( "${PROJECT_NAME}-evaluator"
"${PROJECT_NAME}_static"
)
endif()
if (KIWI_BUILD_MODEL_BUILDER)
add_executable( "${PROJECT_NAME}-model-builder"
tools/model_builder.cpp
)
target_link_libraries( "${PROJECT_NAME}-model-builder"
"${PROJECT_NAME}_static"
)
endif()
if(MSVC)
if(KIWI_STATIC_WITHOUT_MT)
message(STATUS "Use /MD at kiwi_static")
add_library( "${PROJECT_NAME}_mt_static" STATIC
${CORE_SRCS}
src/capi/kiwi_c.cpp
${CPUINFO_OBJECTS_STATIC}
)
target_compile_options("${PROJECT_NAME}_mt_static" PUBLIC
/MT
)
else()
message(STATUS "Use /MT at kiwi_static")
target_compile_options("${PROJECT_NAME}_static" PUBLIC
/MT
)
target_compile_options("streamvbyte" PUBLIC
/MT
)
endif()
if(KIWI_BUILD_DYNAMIC)
target_compile_options("${PROJECT_NAME}" PUBLIC
/MT
)
endif()
endif()
if(UNIX AND NOT APPLE AND NOT ANDROID)
target_link_libraries( "${PROJECT_NAME}_static"
rt
)
if (KIWI_BUILD_CLI)
target_link_libraries( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
rt
)
endif()
if (KIWI_BUILD_EVALUATOR)
target_link_libraries( "${PROJECT_NAME}-evaluator"
rt
)
endif()
endif()
if(KIWI_BUILD_DYNAMIC)
target_compile_definitions("${PROJECT_NAME}"
PUBLIC DLL_EXPORT=1
)
endif()
if(KIWI_BUILD_TEST)
add_subdirectory( third_party/googletest )
add_subdirectory( test )
if(MSVC)
target_compile_options("gtest_main" PUBLIC
/MT
)
target_compile_options("gtest" PUBLIC
/MT
)
endif()
endif()
if(KIWI_JAVA_BINDING)
add_subdirectory( bindings/java )
endif()
if(EMSCRIPTEN)
add_subdirectory( bindings/wasm )
endif()