Skip to content

Commit 0d411b0

Browse files
authored
[CI] Simplify CMake build with modern CMake techniques (dmlc#5871)
* [CI] Simplify CMake build * Make sure that plugins can be built * [CI] Install lz4 on Mac
1 parent 22a31b1 commit 0d411b0

File tree

10 files changed

+42
-56
lines changed

10 files changed

+42
-56
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ addons:
4343
- graphviz
4444
- openssl
4545
- libgit2
46+
- lz4
4647
- wget
4748
- r
4849
update: true

CMakeLists.txt

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,16 @@ if (USE_OPENMP)
112112
find_package(OpenMP REQUIRED)
113113
endif (USE_OPENMP)
114114

115+
# core xgboost
116+
add_subdirectory(${xgboost_SOURCE_DIR}/src)
117+
115118
# dmlc-core
116119
msvc_use_static_runtime()
117120
add_subdirectory(${xgboost_SOURCE_DIR}/dmlc-core)
118121
set_target_properties(dmlc PROPERTIES
119122
CXX_STANDARD 14
120123
CXX_STANDARD_REQUIRED ON
121124
POSITION_INDEPENDENT_CODE ON)
122-
list(APPEND LINKED_LIBRARIES_PRIVATE dmlc)
123125
if (MSVC)
124126
target_compile_options(dmlc PRIVATE
125127
-D_CRT_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE)
@@ -128,6 +130,7 @@ if (MSVC)
128130
-D_CRT_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE)
129131
endif (TARGET dmlc_unit_tests)
130132
endif (MSVC)
133+
target_link_libraries(objxgboost PUBLIC dmlc)
131134

132135
# rabit
133136
set(RABIT_BUILD_DMLC OFF)
@@ -136,13 +139,13 @@ set(RABIT_WITH_R_LIB ${R_LIB})
136139
add_subdirectory(rabit)
137140

138141
if (RABIT_MOCK)
139-
list(APPEND LINKED_LIBRARIES_PRIVATE rabit_mock_static)
142+
target_link_libraries(objxgboost PUBLIC rabit_mock_static)
140143
if (MSVC)
141144
target_compile_options(rabit_mock_static PRIVATE
142145
-D_CRT_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE)
143146
endif (MSVC)
144147
else()
145-
list(APPEND LINKED_LIBRARIES_PRIVATE rabit)
148+
target_link_libraries(objxgboost PUBLIC rabit)
146149
if (MSVC)
147150
target_compile_options(rabit PRIVATE
148151
-D_CRT_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE)
@@ -164,19 +167,16 @@ if (R_LIB)
164167
add_subdirectory(${xgboost_SOURCE_DIR}/R-package)
165168
endif (R_LIB)
166169

167-
# core xgboost
168-
list(APPEND LINKED_LIBRARIES_PRIVATE Threads::Threads ${CMAKE_THREAD_LIBS_INIT})
170+
# Plugin
169171
add_subdirectory(${xgboost_SOURCE_DIR}/plugin)
170-
add_subdirectory(${xgboost_SOURCE_DIR}/src)
171-
target_link_libraries(objxgboost PUBLIC dmlc)
172-
set(XGBOOST_OBJ_SOURCES "${XGBOOST_OBJ_SOURCES};$<TARGET_OBJECTS:objxgboost>")
173172

174173
#-- library
175174
if (BUILD_STATIC_LIB)
176-
add_library(xgboost STATIC ${XGBOOST_OBJ_SOURCES})
175+
add_library(xgboost STATIC)
177176
else (BUILD_STATIC_LIB)
178-
add_library(xgboost SHARED ${XGBOOST_OBJ_SOURCES})
177+
add_library(xgboost SHARED)
179178
endif (BUILD_STATIC_LIB)
179+
target_link_libraries(xgboost PRIVATE objxgboost)
180180

181181
if (USE_NVTX)
182182
enable_nvtx(xgboost)
@@ -192,7 +192,6 @@ target_include_directories(xgboost
192192
INTERFACE
193193
$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>
194194
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>)
195-
target_link_libraries(xgboost PRIVATE ${LINKED_LIBRARIES_PRIVATE})
196195

197196
# This creates its own shared library `xgboost4j'.
198197
if (JVM_BINDINGS)
@@ -201,7 +200,8 @@ endif (JVM_BINDINGS)
201200
#-- End shared library
202201

203202
#-- CLI for xgboost
204-
add_executable(runxgboost ${xgboost_SOURCE_DIR}/src/cli_main.cc ${XGBOOST_OBJ_SOURCES})
203+
add_executable(runxgboost ${xgboost_SOURCE_DIR}/src/cli_main.cc)
204+
target_link_libraries(runxgboost PRIVATE objxgboost)
205205
if (USE_NVTX)
206206
enable_nvtx(runxgboost)
207207
endif (USE_NVTX)
@@ -211,7 +211,6 @@ target_include_directories(runxgboost
211211
${xgboost_SOURCE_DIR}/include
212212
${xgboost_SOURCE_DIR}/dmlc-core/include
213213
${xgboost_SOURCE_DIR}/rabit/include)
214-
target_link_libraries(runxgboost PRIVATE ${LINKED_LIBRARIES_PRIVATE})
215214
set_target_properties(
216215
runxgboost PROPERTIES
217216
OUTPUT_NAME xgboost

Jenkinsfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def BuildCPU() {
189189
# This step is not necessary, but here we include it, to ensure that DMLC_CORE_USE_CMAKE flag is correctly propagated
190190
# We want to make sure that we use the configured header build/dmlc/build_config.h instead of include/dmlc/build_config_default.h.
191191
# See discussion at https://github.com/dmlc/xgboost/issues/5510
192-
${dockerRun} ${container_type} ${docker_binary} tests/ci_build/build_via_cmake.sh
192+
${dockerRun} ${container_type} ${docker_binary} tests/ci_build/build_via_cmake.sh -DPLUGIN_LZ4=ON -DPLUGIN_DENSE_PARSER=ON
193193
${dockerRun} ${container_type} ${docker_binary} build/testxgboost
194194
"""
195195
// Sanitizer test

R-package/CMakeLists.txt

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,32 @@ file(GLOB_RECURSE R_SOURCES
66
${CMAKE_CURRENT_LIST_DIR}/src/*.c)
77
# Use object library to expose symbols
88
add_library(xgboost-r OBJECT ${R_SOURCES})
9-
10-
set(R_DEFINITIONS
9+
target_compile_definitions(xgboost-r
10+
PUBLIC
1111
-DXGBOOST_STRICT_R_MODE=1
1212
-DXGBOOST_CUSTOMIZE_GLOBAL_PRNG=1
1313
-DDMLC_LOG_BEFORE_THROW=0
1414
-DDMLC_DISABLE_STDIN=1
1515
-DDMLC_LOG_CUSTOMIZE=1
1616
-DRABIT_CUSTOMIZE_MSG_
1717
-DRABIT_STRICT_CXX98_)
18-
target_compile_definitions(xgboost-r
19-
PRIVATE ${R_DEFINITIONS})
2018
target_include_directories(xgboost-r
2119
PRIVATE
2220
${LIBR_INCLUDE_DIRS}
2321
${PROJECT_SOURCE_DIR}/include
2422
${PROJECT_SOURCE_DIR}/dmlc-core/include
2523
${PROJECT_SOURCE_DIR}/rabit/include)
24+
target_link_libraries(xgboost-r PRIVATE ${LIBR_CORE_LIBRARY})
2625
set_target_properties(
2726
xgboost-r PROPERTIES
2827
CXX_STANDARD 14
2928
CXX_STANDARD_REQUIRED ON
3029
POSITION_INDEPENDENT_CODE ON)
3130

32-
set(XGBOOST_DEFINITIONS "${XGBOOST_DEFINITIONS};${R_DEFINITIONS}" PARENT_SCOPE)
33-
set(XGBOOST_OBJ_SOURCES $<TARGET_OBJECTS:xgboost-r> PARENT_SCOPE)
34-
set(LINKED_LIBRARIES_PRIVATE ${LINKED_LIBRARIES_PRIVATE} ${LIBR_CORE_LIBRARY} PARENT_SCOPE)
35-
36-
if (USE_OPENMP)
37-
target_link_libraries(xgboost-r PRIVATE OpenMP::OpenMP_CXX)
38-
endif ()
31+
# Get compilation and link flags of xgboost-r and propagate to objxgboost
32+
target_link_libraries(objxgboost PUBLIC xgboost-r)
33+
# Add all objects of xgboost-r to objxgboost
34+
target_sources(objxgboost INTERFACE $<TARGET_OBJECTS:xgboost-r>)
3935

4036
set(LIBR_HOME "${LIBR_HOME}" PARENT_SCOPE)
41-
set(LIBR_EXECUTABLE "${LIBR_EXECUTABLE}" PARENT_SCOPE)
37+
set(LIBR_EXECUTABLE "${LIBR_EXECUTABLE}" PARENT_SCOPE)

jvm-packages/CMakeLists.txt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
find_package(JNI REQUIRED)
22

33
add_library(xgboost4j SHARED
4-
${PROJECT_SOURCE_DIR}/jvm-packages/xgboost4j/src/native/xgboost4j.cpp
5-
${XGBOOST_OBJ_SOURCES})
4+
${PROJECT_SOURCE_DIR}/jvm-packages/xgboost4j/src/native/xgboost4j.cpp)
5+
target_link_libraries(xgboost4j PRIVATE objxgboost)
66
target_include_directories(xgboost4j
77
PRIVATE
88
${JNI_INCLUDE_DIRS}
@@ -16,7 +16,4 @@ set_target_properties(
1616
xgboost4j PROPERTIES
1717
CXX_STANDARD 14
1818
CXX_STANDARD_REQUIRED ON)
19-
target_link_libraries(xgboost4j
20-
PRIVATE
21-
${LINKED_LIBRARIES_PRIVATE}
22-
${JAVA_JVM_LIBRARY})
19+
target_link_libraries(xgboost4j PRIVATE ${JAVA_JVM_LIBRARY})

plugin/CMakeLists.txt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
if (PLUGIN_LZ4)
2-
set(PLUGIN_SOURCES ${PLUGIN_SOURCES}
3-
${xgboost_SOURCE_DIR}/plugin/lz4/sparse_page_lz4_format.cc PARENT_SCOPE)
2+
target_sources(objxgboost PRIVATE ${xgboost_SOURCE_DIR}/plugin/lz4/sparse_page_lz4_format.cc)
3+
target_link_libraries(objxgboost PUBLIC lz4)
44
endif (PLUGIN_LZ4)
55

66
if (PLUGIN_DENSE_PARSER)
7-
set(PLUGINS_SOURCES ${PLUGINS_SOURCES}
8-
${xgboost_SOURCE_DIR}/plugin/dense_parser/dense_libsvm.cc PARENT_SCOPE)
7+
target_sources(objxgboost PRIVATE ${xgboost_SOURCE_DIR}/plugin/dense_parser/dense_libsvm.cc)
98
endif (PLUGIN_DENSE_PARSER)

plugin/lz4/sparse_page_lz4_format.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ inline void CompressArray<DType>::Write(dmlc::Stream* fo) {
156156
}
157157

158158
template<typename StorageIndex>
159-
class SparsePageLZ4Format : public SparsePageFormat {
159+
class SparsePageLZ4Format : public SparsePageFormat<SparsePage> {
160160
public:
161161
explicit SparsePageLZ4Format(bool use_lz4_hc)
162162
: use_lz4_hc_(use_lz4_hc) {

src/CMakeLists.txt

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ file(GLOB_RECURSE CPU_SOURCES *.cc *.h)
22
list(REMOVE_ITEM CPU_SOURCES ${xgboost_SOURCE_DIR}/src/cli_main.cc)
33

44
#-- Object library
5-
# Object library is necessary for jvm-package, which creates its own shared
6-
# library.
5+
# Object library is necessary for jvm-package, which creates its own shared library.
6+
add_library(objxgboost OBJECT)
7+
target_sources(objxgboost PRIVATE ${CPU_SOURCES})
78
if (USE_CUDA)
89
file(GLOB_RECURSE CUDA_SOURCES *.cu *.cuh)
9-
add_library(objxgboost OBJECT ${CPU_SOURCES} ${CUDA_SOURCES} ${PLUGINS_SOURCES})
10-
target_compile_definitions(objxgboost
11-
PRIVATE -DXGBOOST_USE_CUDA=1)
10+
target_sources(objxgboost PRIVATE ${CUDA_SOURCES})
11+
target_compile_definitions(objxgboost PRIVATE -DXGBOOST_USE_CUDA=1)
1212
target_include_directories(objxgboost PRIVATE ${xgboost_SOURCE_DIR}/cub/)
1313
target_compile_options(objxgboost PRIVATE
1414
$<$<COMPILE_LANGUAGE:CUDA>:--expt-extended-lambda>
@@ -20,7 +20,7 @@ if (USE_CUDA)
2020
find_package(Nccl REQUIRED)
2121
target_include_directories(objxgboost PRIVATE ${NCCL_INCLUDE_DIR})
2222
target_compile_definitions(objxgboost PRIVATE -DXGBOOST_USE_NCCL=1)
23-
list(APPEND SRC_LIBS ${NCCL_LIBRARY})
23+
target_link_libraries(objxgboost PUBLIC ${NCCL_LIBRARY})
2424
endif (USE_NCCL)
2525

2626
if (USE_NVTX)
@@ -47,8 +47,6 @@ if (USE_CUDA)
4747
CUDA_STANDARD 14
4848
CUDA_STANDARD_REQUIRED ON
4949
CUDA_SEPARABLE_COMPILATION OFF)
50-
else (USE_CUDA)
51-
add_library(objxgboost OBJECT ${CPU_SOURCES} ${PLUGINS_SOURCES})
5250
endif (USE_CUDA)
5351

5452
target_include_directories(objxgboost
@@ -79,8 +77,7 @@ set_target_properties(objxgboost PROPERTIES
7977
target_compile_definitions(objxgboost
8078
PRIVATE
8179
-DDMLC_LOG_CUSTOMIZE=1 # enable custom logging
82-
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:_MWAITXINTRIN_H_INCLUDED>
83-
${XGBOOST_DEFINITIONS})
80+
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:_MWAITXINTRIN_H_INCLUDED>)
8481
if (USE_DEBUG_OUTPUT)
8582
target_compile_definitions(objxgboost PRIVATE -DXGBOOST_USE_DEBUG_OUTPUT=1)
8683
endif (USE_DEBUG_OUTPUT)
@@ -97,14 +94,12 @@ if (XGBOOST_BUILTIN_PREFETCH_PRESENT)
9794
endif (XGBOOST_BUILTIN_PREFETCH_PRESENT)
9895

9996
find_package(Threads REQUIRED)
100-
list(APPEND SRC_LIBS Threads::Threads ${CMAKE_THREAD_LIBS_INIT})
97+
target_link_libraries(objxgboost PUBLIC Threads::Threads ${CMAKE_THREAD_LIBS_INIT})
10198

10299
if (USE_OPENMP OR USE_CUDA) # CUDA requires OpenMP
103100
find_package(OpenMP REQUIRED)
104-
list(APPEND SRC_LIBS OpenMP::OpenMP_CXX)
105-
target_link_libraries(objxgboost PRIVATE OpenMP::OpenMP_CXX)
101+
target_link_libraries(objxgboost PUBLIC OpenMP::OpenMP_CXX)
106102
endif (USE_OPENMP OR USE_CUDA)
107-
set(LINKED_LIBRARIES_PRIVATE "${LINKED_LIBRARIES_PRIVATE};${SRC_LIBS}" PARENT_SCOPE)
108103

109104
# For MSVC: Call msvc_use_static_runtime() once again to completely
110105
# replace /MD with /MT. See https://github.com/dmlc/xgboost/issues/4462

tests/ci_build/Dockerfile.cpu

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ SHELL ["/bin/bash", "-c"] # Use Bash as shell
77
# Install all basic requirements
88
RUN \
99
apt-get update && \
10-
apt-get install -y tar unzip wget git build-essential doxygen graphviz llvm libasan2 libidn11 && \
10+
apt-get install -y tar unzip wget git build-essential doxygen graphviz llvm libasan2 libidn11 liblz4-dev && \
1111
# CMake
1212
wget -nv -nc https://cmake.org/files/v3.13/cmake-3.13.0-Linux-x86_64.sh --no-check-certificate && \
1313
bash cmake-3.13.0-Linux-x86_64.sh --skip-license --prefix=/usr && \

tests/cpp/CMakeLists.txt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ if (USE_CUDA)
1212
file(GLOB_RECURSE CUDA_TEST_SOURCES "*.cu")
1313
list(APPEND TEST_SOURCES ${CUDA_TEST_SOURCES})
1414
endif (USE_CUDA)
15-
add_executable(testxgboost ${TEST_SOURCES} ${XGBOOST_OBJ_SOURCES}
15+
add_executable(testxgboost ${TEST_SOURCES}
1616
${xgboost_SOURCE_DIR}/plugin/example/custom_obj.cc)
17+
target_link_libraries(testxgboost PRIVATE objxgboost)
1718

1819
if (USE_CUDA)
1920
# OpenMP is mandatory for CUDA
@@ -73,10 +74,8 @@ set_target_properties(
7374
CXX_STANDARD_REQUIRED ON)
7475
target_link_libraries(testxgboost
7576
PRIVATE
76-
${GTEST_LIBRARIES}
77-
${LINKED_LIBRARIES_PRIVATE})
77+
${GTEST_LIBRARIES})
7878

79-
target_compile_definitions(testxgboost PRIVATE ${XGBOOST_DEFINITIONS})
8079
set_output_directory(testxgboost ${xgboost_BINARY_DIR})
8180

8281
# This grouping organises source files nicely in visual studio

0 commit comments

Comments
 (0)