CMakeLists.txt 9.94 KB
Newer Older
1
if(USE_GPU OR APPLE)
2
3
4
5
  cmake_minimum_required(VERSION 3.2)
else()
  cmake_minimum_required(VERSION 2.8)
endif()
Guolin Ke's avatar
Guolin Ke committed
6

7
PROJECT(lightgbm)
Guolin Ke's avatar
Guolin Ke committed
8

9
OPTION(USE_MPI "Enable MPI-based parallel learning" OFF)
10
OPTION(USE_OPENMP "Enable OpenMP" ON)
11
OPTION(USE_GPU "Enable GPU-accelerated training" OFF)
12
OPTION(USE_SWIG "Enable SWIG to generate Java API" OFF)
13
OPTION(USE_HDFS "Enable HDFS support (EXPERIMENTAL)" OFF)
14
OPTION(USE_R35 "Set to ON if your R version is not earlier than 3.5" OFF)
Guolin Ke's avatar
Guolin Ke committed
15
16
OPTION(USE_TIMETAG "Set to ON to output time costs" OFF)
OPTION(USE_DEBUG "Set to ON for Debug mode" OFF)
17

18
19
if(APPLE)
    OPTION(APPLE_OUTPUT_DYLIB "Output dylib shared library" OFF)
20
endif(APPLE)
21

Qiwei Ye's avatar
Qiwei Ye committed
22
23
24
25
26
27
28
29
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.2")
    message(FATAL_ERROR "Insufficient gcc version")
  endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.8")
    message(FATAL_ERROR "Insufficient Clang version")
  endif()
30
31
32
33
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.1.0")
    message(FATAL_ERROR "Insufficient AppleClang version")
  endif()
34
  cmake_minimum_required(VERSION 3.16)
35
36
37
38
39
elseif(MSVC)
  if(MSVC_VERSION LESS 1900)
    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} doesn't support required C++11 features. Please use a newer MSVC.")
  endif()
  cmake_minimum_required(VERSION 3.8)
40
endif()
Guolin Ke's avatar
Guolin Ke committed
41

42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
if(USE_SWIG)
  find_package(SWIG REQUIRED)
  find_package(Java REQUIRED)
  find_package(JNI REQUIRED)
  include(UseJava)
  include(UseSWIG)
  set(SWIG_CXX_EXTENSION "cxx")
  set(SWIG_EXTRA_LIBRARIES "")
  set(SWIG_JAVA_EXTRA_FILE_EXTENSIONS ".java" "JNI.java")
  set(SWIG_MODULE_JAVA_LANGUAGE "JAVA")
  set(SWIG_MODULE_JAVA_SWIG_LANGUAGE_FLAG "java")
  set(CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/java")
  include_directories(Java_INCLUDE_DIRS)
  include_directories(JNI_INCLUDE_DIRS)
  include_directories($ENV{JAVA_HOME}/include)
57
58
59
  if(WIN32)
      FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/windows/x86_64")
      include_directories($ENV{JAVA_HOME}/include/win32)
60
61
62
  elseif(APPLE)
      FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/osx/x86_64")
      include_directories($ENV{JAVA_HOME}/include/darwin)
63
64
65
66
  else()
      FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/linux/x86_64")
      include_directories($ENV{JAVA_HOME}/include/linux)
  endif()
67
68
endif(USE_SWIG)

69
70
if(USE_R35)
    ADD_DEFINITIONS(-DR_VER_ABOVE_35)
71
endif(USE_R35)
72

73
74
75
76
if(USE_TIMETAG)
    ADD_DEFINITIONS(-DTIMETAG)
endif(USE_TIMETAG)

Guolin Ke's avatar
Guolin Ke committed
77
78
79
80
if(USE_DEBUG)
    ADD_DEFINITIONS(-DDEBUG)
endif(USE_DEBUG)

Guolin Ke's avatar
Guolin Ke committed
81
if(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
82
83
    find_package(MPI REQUIRED)
    ADD_DEFINITIONS(-DUSE_MPI)
84
85
    MESSAGE(STATUS "MPI libraries: " ${MPI_LIBRARIES})
    MESSAGE(STATUS "MPI C++ libraries: " ${MPI_CXX_LIBRARIES})
Guolin Ke's avatar
Guolin Ke committed
86
else()
Guolin Ke's avatar
Guolin Ke committed
87
    ADD_DEFINITIONS(-DUSE_SOCKET)
Guolin Ke's avatar
Guolin Ke committed
88
endif(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
89

90
91
92
93
94
if(USE_OPENMP)
    find_package(OpenMP REQUIRED)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
else()
    # Ignore unknown #pragma warning
95
96
    if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
      OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))
97
98
99
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas")
    endif()
endif(USE_OPENMP)
Guolin Ke's avatar
Guolin Ke committed
100

101
if(USE_GPU)
102
    SET(BOOST_COMPUTE_HEADER_DIR ${PROJECT_SOURCE_DIR}/compute/include)
103
    include_directories(${BOOST_COMPUTE_HEADER_DIR})
104
105
    find_package(OpenCL REQUIRED)
    include_directories(${OpenCL_INCLUDE_DIRS})
106
    MESSAGE(STATUS "OpenCL include directory: " ${OpenCL_INCLUDE_DIRS})
Guolin Ke's avatar
Guolin Ke committed
107
108
109
    if (WIN32)
        set(Boost_USE_STATIC_LIBS ON)
    endif()
110
    find_package(Boost 1.56.0 COMPONENTS filesystem system REQUIRED)
111
112
    if (WIN32)
        # disable autolinking in boost
113
        add_definitions(-DBOOST_ALL_NO_LIB)
114
    endif()
Guolin Ke's avatar
Guolin Ke committed
115
    include_directories(${Boost_INCLUDE_DIRS})
116
117
118
    ADD_DEFINITIONS(-DUSE_GPU)
endif(USE_GPU)

119
120
121
122
123
124
125
126
127
if(USE_HDFS)
    find_package(JNI REQUIRED)
    find_path(HDFS_INCLUDE_DIR hdfs.h REQUIRED)
    find_library(HDFS_LIB NAMES hdfs REQUIRED)
    include_directories(${HDFS_INCLUDE_DIR})
    ADD_DEFINITIONS(-DUSE_HDFS)
    SET(HDFS_CXX_LIBRARIES ${HDFS_LIB} ${JAVA_JVM_LIBRARY})
endif(USE_HDFS)

128
129
130
131
132
133
134
135
136
137
138
include(CheckCXXSourceCompiles)
check_cxx_source_compiles("
#include <xmmintrin.h>
int main() {
  int a = 0;
  _mm_prefetch(&a, _MM_HINT_NTA);
  return 0;
}
" MM_PREFETCH)

if(${MM_PREFETCH})
139
  message(STATUS "Using _mm_prefetch")
140
141
142
  ADD_DEFINITIONS(-DMM_PREFETCH)
endif()

143
144
145
146
147
148
149
150
151
152
153
include(CheckCXXSourceCompiles)
check_cxx_source_compiles("
#include <mm_malloc.h>
int main() {
  char *a = (char*)_mm_malloc(8, 16);
  _mm_free(a);
  return 0;
}
" MM_MALLOC)

if(${MM_MALLOC})
154
  message(STATUS "Using _mm_malloc")
155
156
157
  ADD_DEFINITIONS(-DMM_MALLOC)
endif()

Guolin Ke's avatar
Guolin Ke committed
158
if(UNIX OR MINGW OR CYGWIN)
Guolin Ke's avatar
Guolin Ke committed
159
160
161
162
163
164
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -Wextra -Wall -Wno-ignored-attributes -Wno-unknown-pragmas -Wno-return-type")
    if(USE_DEBUG)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
    else()
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
    endif()
165
166
167
    if(USE_SWIG)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
    endif()
Guolin Ke's avatar
Guolin Ke committed
168
169
endif()

Nikita Titov's avatar
Nikita Titov committed
170
171
172
173
if(WIN32 AND MINGW)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++")
endif()

Guolin Ke's avatar
Guolin Ke committed
174
175
176
177
178
179
180
181
182
183
184
if(MSVC)
    SET(variables
        CMAKE_C_FLAGS_DEBUG
        CMAKE_C_FLAGS_MINSIZEREL
        CMAKE_C_FLAGS_RELEASE
        CMAKE_C_FLAGS_RELWITHDEBINFO
        CMAKE_CXX_FLAGS_DEBUG
        CMAKE_CXX_FLAGS_MINSIZEREL
        CMAKE_CXX_FLAGS_RELEASE
        CMAKE_CXX_FLAGS_RELWITHDEBINFO
    )
Guolin Ke's avatar
Guolin Ke committed
185
186
187
188
189
190
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /MP")
    if(USE_DEBUG)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Od")
    else()
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Ob2 /Oi /Ot /Oy")
    endif()
Guolin Ke's avatar
Guolin Ke committed
191
else()
Guolin Ke's avatar
Guolin Ke committed
192
193
194
    if(NOT USE_DEBUG)
      SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops")
    endif()
195
endif(MSVC)
Guolin Ke's avatar
Guolin Ke committed
196
197

SET(LightGBM_HEADER_DIR ${PROJECT_SOURCE_DIR}/include)
Guolin Ke's avatar
Guolin Ke committed
198

Guolin Ke's avatar
Guolin Ke committed
199
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
Guolin Ke's avatar
Guolin Ke committed
200
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
Guolin Ke's avatar
Guolin Ke committed
201

202
include_directories(${LightGBM_HEADER_DIR})
Guolin Ke's avatar
Guolin Ke committed
203
204

if(APPLE)
205
  if(APPLE_OUTPUT_DYLIB)
206
207
208
209
    SET(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
  else()
    SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
  endif()
Guolin Ke's avatar
Guolin Ke committed
210
211
212
213
endif(APPLE)

if(USE_MPI)
  include_directories(${MPI_CXX_INCLUDE_PATH})
Guolin Ke's avatar
Guolin Ke committed
214
endif(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
215

216
file(GLOB SOURCES
Guolin Ke's avatar
Guolin Ke committed
217
218
219
220
221
222
223
224
225
    src/application/*.cpp
    src/boosting/*.cpp
    src/io/*.cpp
    src/metric/*.cpp
    src/objective/*.cpp
    src/network/*.cpp
    src/treelearner/*.cpp
)

226
add_executable(lightgbm src/main.cpp ${SOURCES})
227
add_library(_lightgbm SHARED src/c_api.cpp src/lightgbm_R.cpp ${SOURCES})
228

229
230
231
232
if(MSVC)
    set_target_properties(_lightgbm PROPERTIES OUTPUT_NAME "lib_lightgbm")
endif(MSVC)

233
234
235
236
237
238
if(USE_SWIG)
  set_property(SOURCE swig/lightgbmlib.i PROPERTY CPLUSPLUS ON)
  LIST(APPEND swig_options -package com.microsoft.ml.lightgbm)
  set_property(SOURCE swig/lightgbmlib.i PROPERTY SWIG_FLAGS "${swig_options}")
  swig_add_module(_lightgbm_swig java swig/lightgbmlib.i)
  swig_link_libraries(_lightgbm_swig _lightgbm)
239
  # needed to ensure Linux build does not have lib prefix specified twice, e.g. liblib_lightgbm_swig
240
  set_target_properties(_lightgbm_swig PROPERTIES PREFIX "")
241
  # needed in some versions of CMake for VS and MinGW builds to ensure output dll has lib prefix
242
243
244
245
246
247
248
249
250
251
252
253
254
255
  set_target_properties(_lightgbm_swig PROPERTIES OUTPUT_NAME "lib_lightgbm_swig")
  if(WIN32)
    if(MINGW OR CYGWIN)
        add_custom_command(TARGET _lightgbm_swig POST_BUILD
            COMMAND "${Java_JAVAC_EXECUTABLE}" -d . java/*.java
            COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${PROJECT_SOURCE_DIR}/lib_lightgbm.dll" com/microsoft/ml/lightgbm/windows/x86_64
            COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${PROJECT_SOURCE_DIR}/lib_lightgbm_swig.dll" com/microsoft/ml/lightgbm/windows/x86_64
            COMMAND "${Java_JAR_EXECUTABLE}" -cf lightgbmlib.jar com)
    else()
        add_custom_command(TARGET _lightgbm_swig POST_BUILD
            COMMAND "${Java_JAVAC_EXECUTABLE}" -d . java/*.java
            COMMAND cp "${PROJECT_SOURCE_DIR}/Release/*.dll" com/microsoft/ml/lightgbm/windows/x86_64
            COMMAND "${Java_JAR_EXECUTABLE}" -cf lightgbmlib.jar com)
    endif()
256
257
258
259
260
261
  elseif(APPLE)
    add_custom_command(TARGET _lightgbm_swig POST_BUILD
            COMMAND "${Java_JAVAC_EXECUTABLE}" -d . java/*.java
            COMMAND cp "${PROJECT_SOURCE_DIR}/*.dylib" com/microsoft/ml/lightgbm/osx/x86_64
            COMMAND cp "${PROJECT_SOURCE_DIR}/lib_lightgbm_swig.jnilib" com/microsoft/ml/lightgbm/osx/x86_64/lib_lightgbm_swig.dylib
            COMMAND "${Java_JAR_EXECUTABLE}" -cf lightgbmlib.jar com)
262
263
264
265
266
267
  else()
    add_custom_command(TARGET _lightgbm_swig POST_BUILD
	    COMMAND "${Java_JAVAC_EXECUTABLE}" -d . java/*.java
	    COMMAND cp "${PROJECT_SOURCE_DIR}/*.so" com/microsoft/ml/lightgbm/linux/x86_64
	    COMMAND "${Java_JAR_EXECUTABLE}" -cf lightgbmlib.jar com)
  endif()
268
endif(USE_SWIG)
Guolin Ke's avatar
Guolin Ke committed
269
270

if(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
271
272
  TARGET_LINK_LIBRARIES(lightgbm ${MPI_CXX_LIBRARIES})
  TARGET_LINK_LIBRARIES(_lightgbm ${MPI_CXX_LIBRARIES})
Guolin Ke's avatar
Guolin Ke committed
273
274
endif(USE_MPI)

fanliwen's avatar
fanliwen committed
275
276
if(USE_OPENMP)
    if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
277
278
        TARGET_LINK_LIBRARIES(lightgbm OpenMP::OpenMP_CXX)
        TARGET_LINK_LIBRARIES(_lightgbm OpenMP::OpenMP_CXX)
fanliwen's avatar
fanliwen committed
279
280
281
    endif()
endif(USE_OPENMP)

282
if(USE_GPU)
Guolin Ke's avatar
Guolin Ke committed
283
284
  TARGET_LINK_LIBRARIES(lightgbm ${OpenCL_LIBRARY} ${Boost_LIBRARIES})
  TARGET_LINK_LIBRARIES(_lightgbm ${OpenCL_LIBRARY} ${Boost_LIBRARIES})
285
286
endif(USE_GPU)

287
288
289
290
291
if(USE_HDFS)
  TARGET_LINK_LIBRARIES(lightgbm ${HDFS_CXX_LIBRARIES})
  TARGET_LINK_LIBRARIES(_lightgbm ${HDFS_CXX_LIBRARIES})
endif(USE_HDFS)

Guolin Ke's avatar
Guolin Ke committed
292
if(WIN32 AND (MINGW OR CYGWIN))
Guolin Ke's avatar
Guolin Ke committed
293
294
295
296
    TARGET_LINK_LIBRARIES(lightgbm Ws2_32)
    TARGET_LINK_LIBRARIES(_lightgbm Ws2_32)
    TARGET_LINK_LIBRARIES(lightgbm IPHLPAPI)
    TARGET_LINK_LIBRARIES(_lightgbm IPHLPAPI)
Guolin Ke's avatar
Guolin Ke committed
297
endif()
Guolin Ke's avatar
Guolin Ke committed
298

Guolin Ke's avatar
Guolin Ke committed
299
300
301
302
install(TARGETS lightgbm _lightgbm
        RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
        LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
        ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
303

304
install(DIRECTORY ${LightGBM_HEADER_DIR}/LightGBM DESTINATION ${CMAKE_INSTALL_PREFIX}/include)