CMakeLists.txt 8.75 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 "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 smaller than 3.5" OFF)
15

16
17
18
19
if(APPLE)
    OPTION(APPLE_OUTPUT_DYLIB "Output dylib shared library" OFF)
endif()

Qiwei Ye's avatar
Qiwei Ye committed
20
21
22
23
24
25
26
27
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()
28
29
30
31
32
33
34
35
36
37
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.1.0")
    message(FATAL_ERROR "Insufficient AppleClang version")
  endif()
  cmake_minimum_required(VERSION 3.12)
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)
38
endif()
Guolin Ke's avatar
Guolin Ke committed
39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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)
55
56
57
  if(WIN32)
      FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/windows/x86_64")
      include_directories($ENV{JAVA_HOME}/include/win32)
58
59
60
  elseif(APPLE)
      FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/osx/x86_64")
      include_directories($ENV{JAVA_HOME}/include/darwin)
61
62
63
64
  else()
      FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/linux/x86_64")
      include_directories($ENV{JAVA_HOME}/include/linux)
  endif()
65
66
endif(USE_SWIG)

67
68
69
70
if(USE_R35)
    ADD_DEFINITIONS(-DR_VER_ABOVE_35)
endif()

Guolin Ke's avatar
Guolin Ke committed
71
if(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
72
73
74
75
    find_package(MPI REQUIRED)
    ADD_DEFINITIONS(-DUSE_MPI)
    MESSAGE(${MPI_LIBRARIES})
    MESSAGE(${MPI_CXX_LIBRARIES})
Guolin Ke's avatar
Guolin Ke committed
76
else()
Guolin Ke's avatar
Guolin Ke committed
77
    ADD_DEFINITIONS(-DUSE_SOCKET)
Guolin Ke's avatar
Guolin Ke committed
78
endif(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
79

80
81
82
83
84
85
86
87
88
89
if(USE_OPENMP)
    find_package(OpenMP REQUIRED)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
else()
    # Ignore unknown #pragma warning
    if( (CMAKE_CXX_COMPILER_ID MATCHES "[cC][lL][aA][nN][gG]")
      OR (CMAKE_CXX_COMPILER_ID MATCHES "[gG][nN][uU]"))
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas")
    endif()
endif(USE_OPENMP)
Guolin Ke's avatar
Guolin Ke committed
90

91
if(USE_GPU)
92
93
    SET(BOOST_COMPUTE_HEADER_DIR ${PROJECT_SOURCE_DIR}/compute/include)
    include_directories (${BOOST_COMPUTE_HEADER_DIR})
94
95
96
    find_package(OpenCL REQUIRED)
    include_directories(${OpenCL_INCLUDE_DIRS})
    MESSAGE(STATUS "OpenCL include directory:" ${OpenCL_INCLUDE_DIRS})
Guolin Ke's avatar
Guolin Ke committed
97
98
99
    if (WIN32)
        set(Boost_USE_STATIC_LIBS ON)
    endif()
100
    find_package(Boost 1.56.0 COMPONENTS filesystem system REQUIRED)
101
102
    if (WIN32)
        # disable autolinking in boost
103
        add_definitions(-DBOOST_ALL_NO_LIB)
104
    endif()
Guolin Ke's avatar
Guolin Ke committed
105
    include_directories(${Boost_INCLUDE_DIRS})
106
107
108
    ADD_DEFINITIONS(-DUSE_GPU)
endif(USE_GPU)

109
110
111
112
113
114
115
116
117
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)

Guolin Ke's avatar
Guolin Ke committed
118
if(UNIX OR MINGW OR CYGWIN)
Guolin Ke's avatar
Guolin Ke committed
119
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -O3 -Wextra -Wall -Wno-ignored-attributes -Wno-unknown-pragmas -Wno-return-type")
Guolin Ke's avatar
Guolin Ke committed
120
121
endif()

Nikita Titov's avatar
Nikita Titov committed
122
123
124
125
if(WIN32 AND MINGW)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++")
endif()

Guolin Ke's avatar
Guolin Ke committed
126
127
128
129
130
131
132
133
134
135
136
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
137
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /O2 /Ob2 /Oi /Ot /Oy /GL /MP")
Guolin Ke's avatar
Guolin Ke committed
138
139
else()
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
Guolin Ke's avatar
Guolin Ke committed
140
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops")
Guolin Ke's avatar
Guolin Ke committed
141
142
143
endif()

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

Guolin Ke's avatar
Guolin Ke committed
145
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
Guolin Ke's avatar
Guolin Ke committed
146
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
Guolin Ke's avatar
Guolin Ke committed
147

148
include_directories(${LightGBM_HEADER_DIR})
Guolin Ke's avatar
Guolin Ke committed
149
150

if(APPLE)
151
  if(APPLE_OUTPUT_DYLIB)
152
153
154
155
    SET(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
  else()
    SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
  endif()
Guolin Ke's avatar
Guolin Ke committed
156
157
158
159
endif(APPLE)

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

162
file(GLOB SOURCES
Guolin Ke's avatar
Guolin Ke committed
163
164
165
166
167
168
169
170
171
    src/application/*.cpp
    src/boosting/*.cpp
    src/io/*.cpp
    src/metric/*.cpp
    src/objective/*.cpp
    src/network/*.cpp
    src/treelearner/*.cpp
)

172
add_executable(lightgbm src/main.cpp ${SOURCES})
173
174
add_library(_lightgbm SHARED src/c_api.cpp src/lightgbm_R.cpp  ${SOURCES})

175
176
177
178
if(MSVC)
    set_target_properties(_lightgbm PROPERTIES OUTPUT_NAME "lib_lightgbm")
endif(MSVC)

179
180
181
182
183
184
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)
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
  # needed to ensure linux build does not have lib specified twice, eg liblib_lightgbm_swig
  set_target_properties(_lightgbm_swig PROPERTIES PREFIX "")
  # needed in latest version of cmake for VS and MINGW builds to ensure output dll has lib prefix
  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()
202
203
204
205
206
207
  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)
208
209
210
211
212
213
  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()
214
endif(USE_SWIG)
Guolin Ke's avatar
Guolin Ke committed
215
216

if(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
217
218
  TARGET_LINK_LIBRARIES(lightgbm ${MPI_CXX_LIBRARIES})
  TARGET_LINK_LIBRARIES(_lightgbm ${MPI_CXX_LIBRARIES})
Guolin Ke's avatar
Guolin Ke committed
219
220
endif(USE_MPI)

fanliwen's avatar
fanliwen committed
221
222
if(USE_OPENMP)
    if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
223
224
        TARGET_LINK_LIBRARIES(lightgbm OpenMP::OpenMP_CXX)
        TARGET_LINK_LIBRARIES(_lightgbm OpenMP::OpenMP_CXX)
fanliwen's avatar
fanliwen committed
225
226
227
    endif()
endif(USE_OPENMP)

228
if(USE_GPU)
Guolin Ke's avatar
Guolin Ke committed
229
230
  TARGET_LINK_LIBRARIES(lightgbm ${OpenCL_LIBRARY} ${Boost_LIBRARIES})
  TARGET_LINK_LIBRARIES(_lightgbm ${OpenCL_LIBRARY} ${Boost_LIBRARIES})
231
232
endif(USE_GPU)

233
234
235
236
237
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
238
if(WIN32 AND (MINGW OR CYGWIN))
Guolin Ke's avatar
Guolin Ke committed
239
240
241
242
    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
243
endif()
Guolin Ke's avatar
Guolin Ke committed
244

Guolin Ke's avatar
Guolin Ke committed
245
246
247
248
install(TARGETS lightgbm _lightgbm
        RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
        LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
        ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
249

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