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

9
PROJECT(lightgbm)
Guolin Ke's avatar
Guolin Ke committed
10
11

OPTION(USE_MPI "MPI based parallel learning" OFF)
12
OPTION(USE_OPENMP "Enable OpenMP" ON)
13
OPTION(USE_GPU "Enable GPU-acclerated training (EXPERIMENTAL)" OFF)
14
OPTION(USE_SWIG "Enable SWIG to generate Java API" OFF)
15
OPTION(USE_HDFS "Enable HDFS support (EXPERIMENTAL)" OFF)
16

Qiwei Ye's avatar
Qiwei Ye committed
17
18
19
20
21
22
23
24
25
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()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
26
    message(FATAL_ERROR "AppleClang wasn't supported. Please see https://github.com/Microsoft/LightGBM/blob/master/docs/Installation-Guide.rst#macos")
Qiwei Ye's avatar
Qiwei Ye committed
27
28
endif()

29
30
31
if(APPLE)
    OPTION(APPLE_OUTPUT_DYLIB "Output dylib shared library" OFF)
endif()
Guolin Ke's avatar
Guolin Ke committed
32

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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")
  FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/linux/x86_64")
  include_directories(Java_INCLUDE_DIRS)
  include_directories(JNI_INCLUDE_DIRS)
  include_directories($ENV{JAVA_HOME}/include)
  include_directories($ENV{JAVA_HOME}/include/linux)
endif(USE_SWIG)

Guolin Ke's avatar
Guolin Ke committed
52
if(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
53
54
55
56
    find_package(MPI REQUIRED)
    ADD_DEFINITIONS(-DUSE_MPI)
    MESSAGE(${MPI_LIBRARIES})
    MESSAGE(${MPI_CXX_LIBRARIES})
Guolin Ke's avatar
Guolin Ke committed
57
else()
Guolin Ke's avatar
Guolin Ke committed
58
    ADD_DEFINITIONS(-DUSE_SOCKET)
Guolin Ke's avatar
Guolin Ke committed
59
endif(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
60

61
62
63
64
65
66
67
68
69
70
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
71

72
if(USE_GPU)
73
74
    SET(BOOST_COMPUTE_HEADER_DIR ${PROJECT_SOURCE_DIR}/compute/include)
    include_directories (${BOOST_COMPUTE_HEADER_DIR})
75
76
77
    find_package(OpenCL REQUIRED)
    include_directories(${OpenCL_INCLUDE_DIRS})
    MESSAGE(STATUS "OpenCL include directory:" ${OpenCL_INCLUDE_DIRS})
Guolin Ke's avatar
Guolin Ke committed
78
79
80
    if (WIN32)
        set(Boost_USE_STATIC_LIBS ON)
    endif()
81
    find_package(Boost 1.56.0 COMPONENTS filesystem system REQUIRED)
82
83
    if (WIN32)
        # disable autolinking in boost
Guolin Ke's avatar
Guolin Ke committed
84
        add_definitions( -DBOOST_ALL_NO_LIB )
85
    endif()
Guolin Ke's avatar
Guolin Ke committed
86
    include_directories(${Boost_INCLUDE_DIRS})
87
88
89
    ADD_DEFINITIONS(-DUSE_GPU)
endif(USE_GPU)

90
91
92
93
94
95
96
97
98
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
99
if(UNIX OR MINGW OR CYGWIN)
100
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -O3 -Wextra -Wall -Wno-ignored-attributes -Wno-unknown-pragmas")
Guolin Ke's avatar
Guolin Ke committed
101
102
endif()

Nikita Titov's avatar
Nikita Titov committed
103
104
105
106
if(WIN32 AND MINGW)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++")
endif()

Guolin Ke's avatar
Guolin Ke committed
107
if(MSVC)
108
109
    if(MSVC_VERSION LESS 1900)
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a newer MSVC.")
Guolin Ke's avatar
Guolin Ke committed
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
    endif()

    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
    )
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /O2 /Ob2 /Oi /Ot /Oy /GL")
else()
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
Guolin Ke's avatar
Guolin Ke committed
125
126
127
128
endif()


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

Guolin Ke's avatar
Guolin Ke committed
130
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
Guolin Ke's avatar
Guolin Ke committed
131
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
Guolin Ke's avatar
Guolin Ke committed
132

Guolin Ke's avatar
Guolin Ke committed
133
134
135
include_directories (${LightGBM_HEADER_DIR})

if(APPLE)
136
137
138
139
140
  if (APPLE_OUTPUT_DYLIB)
    SET(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
  else()
    SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
  endif()
Guolin Ke's avatar
Guolin Ke committed
141
142
143
144
endif(APPLE)

if(USE_MPI)
  include_directories(${MPI_CXX_INCLUDE_PATH})
Guolin Ke's avatar
Guolin Ke committed
145
endif(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
146
147
148
149
150
151
152
153
154
155
156

file(GLOB SOURCES 
    src/application/*.cpp
    src/boosting/*.cpp
    src/io/*.cpp
    src/metric/*.cpp
    src/objective/*.cpp
    src/network/*.cpp
    src/treelearner/*.cpp
)

157
add_executable(lightgbm src/main.cpp ${SOURCES})
158
159
160
161
162
163
164
165
166
167
168
169
170
add_library(_lightgbm SHARED src/c_api.cpp src/lightgbm_R.cpp  ${SOURCES})

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)
  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(USE_SWIG)
Guolin Ke's avatar
Guolin Ke committed
171

Guolin Ke's avatar
Guolin Ke committed
172
if(MSVC)
Guolin Ke's avatar
Guolin Ke committed
173
    set_target_properties(_lightgbm PROPERTIES OUTPUT_NAME "lib_lightgbm")
Guolin Ke's avatar
Guolin Ke committed
174
endif(MSVC)
Guolin Ke's avatar
Guolin Ke committed
175

Guolin Ke's avatar
Guolin Ke committed
176
if(USE_MPI)
Guolin Ke's avatar
Guolin Ke committed
177
178
  TARGET_LINK_LIBRARIES(lightgbm ${MPI_CXX_LIBRARIES})
  TARGET_LINK_LIBRARIES(_lightgbm ${MPI_CXX_LIBRARIES})
Guolin Ke's avatar
Guolin Ke committed
179
180
endif(USE_MPI)

181
if(USE_GPU)
Guolin Ke's avatar
Guolin Ke committed
182
183
  TARGET_LINK_LIBRARIES(lightgbm ${OpenCL_LIBRARY} ${Boost_LIBRARIES})
  TARGET_LINK_LIBRARIES(_lightgbm ${OpenCL_LIBRARY} ${Boost_LIBRARIES})
184
185
endif(USE_GPU)

186
187
188
189
190
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
191
if(WIN32 AND (MINGW OR CYGWIN))
Guolin Ke's avatar
Guolin Ke committed
192
193
194
195
    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
196
endif()
Guolin Ke's avatar
Guolin Ke committed
197

Guolin Ke's avatar
Guolin Ke committed
198
199
200
201
install(TARGETS lightgbm _lightgbm
        RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
        LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
        ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
202

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