-
Notifications
You must be signed in to change notification settings - Fork 98
/
CMakeLists.txt
136 lines (117 loc) · 4.63 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
cmake_minimum_required (VERSION 3.1)
project(treelite)
include(cmake/Utils.cmake)
find_package(OpenMP)
find_package(Protobuf)
# enable custom logging facility in dmlc-core
add_definitions(-DDMLC_LOG_CUSTOMIZE)
# check MSVC version
if(MSVC)
if(MSVC_VERSION LESS 1900)
message(FATAL_ERROR "Need Visual Studio 2015 or newer to compile treelite")
endif()
endif()
set_default_configuration_release()
msvc_use_static_runtime()
# OpenMP check
if(OPENMP_FOUND)
message("Got OpenMP")
add_definitions(-DTREELITE_OPENMP_SUPPORT)
else()
message("Don't have OpenMP")
include(dmlc-core/cmake/Utils.cmake)
dmlccore_option(USE_OPENMP "Build with OpenMP" OFF)
endif()
# Compiler flags
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
if(MSVC)
# Multithreaded compilation
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
else()
# Performance
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops")
endif()
include_directories (
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/dmlc-core/include
)
# Copy files for runtime deployment
read_filelist(runtime/FILELIST RUNTIME_FILES)
deploy_file(runtime/CMakeLists.txt ".")
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/runtime/build)
foreach(f ${RUNTIME_FILES})
deploy_file(${f} runtime)
endforeach()
file(GLOB_RECURSE SOURCES
src/*.cc
src/*.h
include/*.h
)
# SOURCES: sources included only in the main package
# RUNTIME_SOURCES: sources included only in the runtime
# COMMON_SOURCES: sources included both in the main package and in the runtime
set(COMMON_SOURCES include/treelite/c_api_common.h include/treelite/logging.h include/treelite/omp.h src/c_api/c_api_common.cc src/c_api/c_api_error.cc src/c_api/c_api_error.h src/common/math.h src/logging.cc)
set(RUNTIME_SOURCES include/treelite/c_api_runtime.h include/treelite/predictor.h src/c_api/c_api_runtime.cc src/predictor.cc)
# Only add main function for executable target
# Only add runtime functions for runtime library
set(COMMON_SOURCES_WITH_PREFIX "")
set(RUNTIME_SOURCES_WITH_PREFIX "")
foreach(f ${COMMON_SOURCES})
list(APPEND COMMON_SOURCES_WITH_PREFIX ${PROJECT_SOURCE_DIR}/${f})
endforeach(f)
foreach(g ${RUNTIME_SOURCES})
list(APPEND RUNTIME_SOURCES_WITH_PREFIX ${PROJECT_SOURCE_DIR}/${g})
endforeach(g)
list(REMOVE_ITEM SOURCES ${PROJECT_SOURCE_DIR}/src/cli_main.cc ${COMMON_SOURCES_WITH_PREFIX} ${RUNTIME_SOURCES_WITH_PREFIX})
# Protobuf library
if (Protobuf_FOUND OR PROTOBUF_FOUND)
set_source_files_properties(src/frontend/protobuf.cc PROPERTIES COMPILE_DEFINITIONS PROTOBUF_SUPPORT)
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/tree.proto)
list(INSERT SOURCES 0 ${PROTO_SRCS} ${PROTO_HDRS})
endif()
# dmlc-core
add_subdirectory(dmlc-core)
# separate sets of dependencies for main package and runtime
set(LINK_LIBRARIES dmlc)
set(RUNTIME_LINK_LIBRARIES "")
# -ldl for UNIX-like systems
if (UNIX)
list(APPEND RUNTIME_LINK_LIBRARIES dl)
endif (UNIX)
# Protobuf library
if (Protobuf_FOUND OR PROTOBUF_FOUND)
list(APPEND LINK_LIBRARIES ${PROTOBUF_LIBRARIES})
endif()
add_library(objtreelite OBJECT ${SOURCES})
add_library(objtreelite_runtime OBJECT ${RUNTIME_SOURCES})
add_library(objtreelite_common OBJECT ${COMMON_SOURCES})
# Executable
add_executable(runtreelite $<TARGET_OBJECTS:objtreelite> $<TARGET_OBJECTS:objtreelite_runtime> $<TARGET_OBJECTS:objtreelite_common> src/cli_main.cc)
set_target_properties(runtreelite PROPERTIES
OUTPUT_NAME treelite
)
set_output_directory(runtreelite ${PROJECT_SOURCE_DIR})
target_link_libraries(runtreelite ${LINK_LIBRARIES} ${RUNTIME_LINK_LIBRARIES})
# Shared library
add_library(treelite SHARED $<TARGET_OBJECTS:objtreelite> $<TARGET_OBJECTS:objtreelite_common>)
add_library(treelite_runtime SHARED $<TARGET_OBJECTS:objtreelite_runtime> $<TARGET_OBJECTS:objtreelite_common>)
target_link_libraries(treelite ${LINK_LIBRARIES})
target_link_libraries(treelite_runtime ${RUNTIME_LINK_LIBRARIES})
set_output_directory(treelite ${PROJECT_SOURCE_DIR}/lib)
set_output_directory(treelite_runtime ${PROJECT_SOURCE_DIR}/lib)
if(MINGW)
# remove the 'lib' prefix to conform to windows convention for shared library names
set_target_properties(treelite PROPERTIES PREFIX "")
set_target_properties(treelite_runtime PROPERTIES PREFIX "")
endif()
# Ensure these two targets do not build simultaneously, as they produce outputs with conflicting names
add_dependencies(treelite runtreelite)
# Group sources
auto_source_group("${SOURCES}")
auto_source_group("${RUNTIME_SOURCES}")
auto_source_group("${COMMON_SOURCES}")