2018-08-13 12:03:49 +03:00
|
|
|
if(USE_GPU OR APPLE)
|
2017-07-24 05:44:08 +03:00
|
|
|
cmake_minimum_required(VERSION 3.2)
|
|
|
|
else()
|
|
|
|
cmake_minimum_required(VERSION 2.8)
|
|
|
|
endif()
|
2016-08-05 09:06:01 +03:00
|
|
|
|
2016-10-08 11:13:56 +03:00
|
|
|
PROJECT(lightgbm)
|
2016-08-05 09:06:01 +03:00
|
|
|
|
2019-04-17 15:03:32 +03:00
|
|
|
OPTION(USE_MPI "Enable MPI-based parallel learning" OFF)
|
2017-01-12 17:46:09 +03:00
|
|
|
OPTION(USE_OPENMP "Enable OpenMP" ON)
|
2018-09-24 21:47:55 +03:00
|
|
|
OPTION(USE_GPU "Enable GPU-accelerated training" OFF)
|
2018-01-31 09:20:41 +03:00
|
|
|
OPTION(USE_SWIG "Enable SWIG to generate Java API" OFF)
|
2018-02-27 07:53:21 +03:00
|
|
|
OPTION(USE_HDFS "Enable HDFS support (EXPERIMENTAL)" OFF)
|
2019-05-12 11:36:27 +03:00
|
|
|
OPTION(USE_R35 "Set to ON if your R version is not earlier than 3.5" OFF)
|
2017-01-12 17:46:09 +03:00
|
|
|
|
2018-08-13 12:03:49 +03:00
|
|
|
if(APPLE)
|
|
|
|
OPTION(APPLE_OUTPUT_DYLIB "Output dylib shared library" OFF)
|
2019-04-17 15:03:32 +03:00
|
|
|
endif(APPLE)
|
2018-08-13 12:03:49 +03:00
|
|
|
|
2017-07-22 12:47:01 +03:00
|
|
|
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()
|
2018-08-13 12:03:49 +03:00
|
|
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
|
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.1.0")
|
|
|
|
message(FATAL_ERROR "Insufficient AppleClang version")
|
|
|
|
endif()
|
2020-01-12 16:51:27 +03:00
|
|
|
cmake_minimum_required(VERSION 3.16)
|
2018-08-13 12:03:49 +03:00
|
|
|
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)
|
2017-01-12 17:46:09 +03:00
|
|
|
endif()
|
2016-08-05 09:06:01 +03:00
|
|
|
|
2018-01-31 09:20:41 +03:00
|
|
|
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)
|
2018-08-28 04:56:31 +03:00
|
|
|
if(WIN32)
|
|
|
|
FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/windows/x86_64")
|
|
|
|
include_directories($ENV{JAVA_HOME}/include/win32)
|
2019-02-20 09:21:02 +03:00
|
|
|
elseif(APPLE)
|
|
|
|
FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/osx/x86_64")
|
|
|
|
include_directories($ENV{JAVA_HOME}/include/darwin)
|
2018-08-28 04:56:31 +03:00
|
|
|
else()
|
|
|
|
FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/com/microsoft/ml/lightgbm/linux/x86_64")
|
|
|
|
include_directories($ENV{JAVA_HOME}/include/linux)
|
|
|
|
endif()
|
2018-01-31 09:20:41 +03:00
|
|
|
endif(USE_SWIG)
|
|
|
|
|
2018-04-28 03:22:29 +03:00
|
|
|
if(USE_R35)
|
|
|
|
ADD_DEFINITIONS(-DR_VER_ABOVE_35)
|
2019-04-17 15:03:32 +03:00
|
|
|
endif(USE_R35)
|
2018-04-28 03:22:29 +03:00
|
|
|
|
2016-08-05 09:06:01 +03:00
|
|
|
if(USE_MPI)
|
2016-12-07 06:31:31 +03:00
|
|
|
find_package(MPI REQUIRED)
|
|
|
|
ADD_DEFINITIONS(-DUSE_MPI)
|
2019-04-17 15:03:32 +03:00
|
|
|
MESSAGE(STATUS "MPI libraries: " ${MPI_LIBRARIES})
|
|
|
|
MESSAGE(STATUS "MPI C++ libraries: " ${MPI_CXX_LIBRARIES})
|
2016-08-05 09:06:01 +03:00
|
|
|
else()
|
2016-12-07 06:31:31 +03:00
|
|
|
ADD_DEFINITIONS(-DUSE_SOCKET)
|
2016-12-07 06:45:55 +03:00
|
|
|
endif(USE_MPI)
|
2016-08-05 09:06:01 +03:00
|
|
|
|
2017-01-12 17:46:09 +03:00
|
|
|
if(USE_OPENMP)
|
|
|
|
find_package(OpenMP REQUIRED)
|
|
|
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
|
|
|
else()
|
|
|
|
# Ignore unknown #pragma warning
|
2019-04-17 15:03:32 +03:00
|
|
|
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
|
|
OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))
|
2017-01-12 17:46:09 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas")
|
|
|
|
endif()
|
|
|
|
endif(USE_OPENMP)
|
2016-12-07 06:31:31 +03:00
|
|
|
|
2017-04-09 16:53:14 +03:00
|
|
|
if(USE_GPU)
|
2017-04-13 05:38:55 +03:00
|
|
|
SET(BOOST_COMPUTE_HEADER_DIR ${PROJECT_SOURCE_DIR}/compute/include)
|
2019-04-17 15:03:32 +03:00
|
|
|
include_directories(${BOOST_COMPUTE_HEADER_DIR})
|
2017-04-09 16:53:14 +03:00
|
|
|
find_package(OpenCL REQUIRED)
|
|
|
|
include_directories(${OpenCL_INCLUDE_DIRS})
|
2019-04-30 20:53:49 +03:00
|
|
|
MESSAGE(STATUS "OpenCL include directory: " ${OpenCL_INCLUDE_DIRS})
|
2017-05-07 10:31:37 +03:00
|
|
|
if (WIN32)
|
|
|
|
set(Boost_USE_STATIC_LIBS ON)
|
|
|
|
endif()
|
2017-04-09 16:53:14 +03:00
|
|
|
find_package(Boost 1.56.0 COMPONENTS filesystem system REQUIRED)
|
2017-04-23 14:28:52 +03:00
|
|
|
if (WIN32)
|
|
|
|
# disable autolinking in boost
|
2018-08-13 12:03:49 +03:00
|
|
|
add_definitions(-DBOOST_ALL_NO_LIB)
|
2017-04-23 14:28:52 +03:00
|
|
|
endif()
|
2017-04-25 07:17:26 +03:00
|
|
|
include_directories(${Boost_INCLUDE_DIRS})
|
2017-04-09 16:53:14 +03:00
|
|
|
ADD_DEFINITIONS(-DUSE_GPU)
|
|
|
|
endif(USE_GPU)
|
|
|
|
|
2018-02-27 07:53:21 +03:00
|
|
|
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)
|
|
|
|
|
2016-12-07 06:45:55 +03:00
|
|
|
if(UNIX OR MINGW OR CYGWIN)
|
2018-04-18 06:12:36 +03:00
|
|
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -O3 -Wextra -Wall -Wno-ignored-attributes -Wno-unknown-pragmas -Wno-return-type")
|
2019-05-04 23:42:18 +03:00
|
|
|
if(USE_SWIG)
|
|
|
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
|
|
|
|
endif()
|
2016-12-07 06:31:31 +03:00
|
|
|
endif()
|
|
|
|
|
2017-09-10 04:33:46 +03:00
|
|
|
if(WIN32 AND MINGW)
|
|
|
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++")
|
|
|
|
endif()
|
|
|
|
|
2016-12-07 06:31:31 +03:00
|
|
|
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
|
|
|
|
)
|
2018-07-12 18:43:59 +03:00
|
|
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /O2 /Ob2 /Oi /Ot /Oy /GL /MP")
|
2016-12-07 06:31:31 +03:00
|
|
|
else()
|
|
|
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
2018-07-12 18:43:59 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops")
|
2019-04-17 15:03:32 +03:00
|
|
|
endif(MSVC)
|
2016-08-05 09:06:01 +03:00
|
|
|
|
|
|
|
SET(LightGBM_HEADER_DIR ${PROJECT_SOURCE_DIR}/include)
|
2016-12-07 06:31:31 +03:00
|
|
|
|
2016-08-05 09:06:01 +03:00
|
|
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
|
2016-11-08 16:24:05 +03:00
|
|
|
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
|
2016-08-05 09:06:01 +03:00
|
|
|
|
2018-08-13 12:03:49 +03:00
|
|
|
include_directories(${LightGBM_HEADER_DIR})
|
2016-12-07 06:31:31 +03:00
|
|
|
|
|
|
|
if(APPLE)
|
2018-08-13 12:03:49 +03:00
|
|
|
if(APPLE_OUTPUT_DYLIB)
|
2017-01-12 17:46:09 +03:00
|
|
|
SET(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
|
|
|
|
else()
|
|
|
|
SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
|
|
|
|
endif()
|
2016-12-07 06:31:31 +03:00
|
|
|
endif(APPLE)
|
|
|
|
|
|
|
|
if(USE_MPI)
|
|
|
|
include_directories(${MPI_CXX_INCLUDE_PATH})
|
2016-12-07 06:45:55 +03:00
|
|
|
endif(USE_MPI)
|
2016-12-07 06:31:31 +03:00
|
|
|
|
2018-04-24 11:19:54 +03:00
|
|
|
file(GLOB SOURCES
|
2016-12-07 06:31:31 +03:00
|
|
|
src/application/*.cpp
|
|
|
|
src/boosting/*.cpp
|
|
|
|
src/io/*.cpp
|
|
|
|
src/metric/*.cpp
|
|
|
|
src/objective/*.cpp
|
|
|
|
src/network/*.cpp
|
|
|
|
src/treelearner/*.cpp
|
|
|
|
)
|
|
|
|
|
2017-11-26 11:07:06 +03:00
|
|
|
add_executable(lightgbm src/main.cpp ${SOURCES})
|
2019-04-17 15:03:32 +03:00
|
|
|
add_library(_lightgbm SHARED src/c_api.cpp src/lightgbm_R.cpp ${SOURCES})
|
2018-01-31 09:20:41 +03:00
|
|
|
|
2018-08-28 04:56:31 +03:00
|
|
|
if(MSVC)
|
|
|
|
set_target_properties(_lightgbm PROPERTIES OUTPUT_NAME "lib_lightgbm")
|
|
|
|
endif(MSVC)
|
|
|
|
|
2018-01-31 09:20:41 +03:00
|
|
|
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)
|
2019-04-17 15:03:32 +03:00
|
|
|
# needed to ensure Linux build does not have lib prefix specified twice, e.g. liblib_lightgbm_swig
|
2018-08-28 04:56:31 +03:00
|
|
|
set_target_properties(_lightgbm_swig PROPERTIES PREFIX "")
|
2019-04-17 15:03:32 +03:00
|
|
|
# needed in some versions of CMake for VS and MinGW builds to ensure output dll has lib prefix
|
2018-08-28 04:56:31 +03:00
|
|
|
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()
|
2019-02-20 09:21:02 +03:00
|
|
|
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)
|
2018-08-28 04:56:31 +03:00
|
|
|
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()
|
2018-01-31 09:20:41 +03:00
|
|
|
endif(USE_SWIG)
|
2016-12-07 06:31:31 +03:00
|
|
|
|
|
|
|
if(USE_MPI)
|
2017-06-20 09:18:37 +03:00
|
|
|
TARGET_LINK_LIBRARIES(lightgbm ${MPI_CXX_LIBRARIES})
|
|
|
|
TARGET_LINK_LIBRARIES(_lightgbm ${MPI_CXX_LIBRARIES})
|
2016-12-07 06:31:31 +03:00
|
|
|
endif(USE_MPI)
|
|
|
|
|
2018-07-10 11:42:30 +03:00
|
|
|
if(USE_OPENMP)
|
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
2019-01-26 07:40:59 +03:00
|
|
|
TARGET_LINK_LIBRARIES(lightgbm OpenMP::OpenMP_CXX)
|
|
|
|
TARGET_LINK_LIBRARIES(_lightgbm OpenMP::OpenMP_CXX)
|
2018-07-10 11:42:30 +03:00
|
|
|
endif()
|
|
|
|
endif(USE_OPENMP)
|
|
|
|
|
2017-04-09 16:53:14 +03:00
|
|
|
if(USE_GPU)
|
2017-06-20 09:18:37 +03:00
|
|
|
TARGET_LINK_LIBRARIES(lightgbm ${OpenCL_LIBRARY} ${Boost_LIBRARIES})
|
|
|
|
TARGET_LINK_LIBRARIES(_lightgbm ${OpenCL_LIBRARY} ${Boost_LIBRARIES})
|
2017-04-09 16:53:14 +03:00
|
|
|
endif(USE_GPU)
|
|
|
|
|
2018-02-27 07:53:21 +03:00
|
|
|
if(USE_HDFS)
|
|
|
|
TARGET_LINK_LIBRARIES(lightgbm ${HDFS_CXX_LIBRARIES})
|
|
|
|
TARGET_LINK_LIBRARIES(_lightgbm ${HDFS_CXX_LIBRARIES})
|
|
|
|
endif(USE_HDFS)
|
|
|
|
|
2016-12-07 06:45:55 +03:00
|
|
|
if(WIN32 AND (MINGW OR CYGWIN))
|
2017-06-20 09:18:37 +03:00
|
|
|
TARGET_LINK_LIBRARIES(lightgbm Ws2_32)
|
|
|
|
TARGET_LINK_LIBRARIES(_lightgbm Ws2_32)
|
|
|
|
TARGET_LINK_LIBRARIES(lightgbm IPHLPAPI)
|
|
|
|
TARGET_LINK_LIBRARIES(_lightgbm IPHLPAPI)
|
2016-12-07 06:45:55 +03:00
|
|
|
endif()
|
2016-08-05 09:06:01 +03:00
|
|
|
|
2017-06-20 09:18:37 +03:00
|
|
|
install(TARGETS lightgbm _lightgbm
|
|
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
|
|
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
|
|
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
|
2017-01-24 11:53:58 +03:00
|
|
|
|
2017-07-22 12:25:04 +03:00
|
|
|
install(DIRECTORY ${LightGBM_HEADER_DIR}/LightGBM DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
|