Unverified Commit 4a42027d authored by Hugo MacDermott-Opeskin's avatar Hugo MacDermott-Opeskin Committed by GitHub
Browse files

[Build] Add CMake changes from conda-forge build (#6189)


Co-authored-by: default avatarHongzhi (Steve), Chen <chenhongzhi.nkcs@gmail.com>
parent 6068dc31
...@@ -34,6 +34,16 @@ dgl_option( ...@@ -34,6 +34,16 @@ dgl_option(
python3 python3
) )
# Conda build related options.
dgl_option(EXTERNAL_DLPACK_PATH "Path to external dlpack" OFF)
dgl_option(EXTERNAL_DMLC_PATH "Path to external dmlc-core" OFF)
dgl_option(EXTERNAL_DMLC_LIB_PATH "Path to external dmlc-core library" OFF)
dgl_option(EXTERNAL_PHMAP_PATH "Path to external parallel-hashmap" OFF)
dgl_option(EXTERNAL_NANOFLANN_PATH "Path to use external nanoflann" OFF)
dgl_option(EXTERNAL_METIS_PATH "Path to external metis" OFF)
dgl_option(EXTERNAL_METIS_LIB_PATH "Path to external metis library" OFF)
dgl_option(EXTERNAL_GKLIB_PATH "Path to external gklib" OFF)
# Options for building DGL features: "none," "dev," "dogfood," "release," and # Options for building DGL features: "none," "dev," "dogfood," "release," and
# "all." # "all."
# "none" - The feature is OFF for all build types. This is used when # "none" - The feature is OFF for all build types. This is used when
...@@ -108,6 +118,17 @@ dgl_feature_option( ...@@ -108,6 +118,17 @@ dgl_feature_option(
"dev" "dev"
) )
if (EXTERNAL_DLPACK_PATH OR EXTERNAL_DMLC_PATH OR EXTERNAL_NANOFLANN_PATH OR EXTERNAL_NANOFLANN_PATH OR EXTERNAL_METIS_PATH OR EXTERNAL_GKLIB_PATH)
message(STATUS "Using at least one external library")
set(USE_EXTERNAL_LIBS ON)
if (BUILD_CPP_TEST)
message(FATAL_ERROR "Cannot build cpp unittests with external libraries")
endif(BUILD_CPP_TEST)
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
# Set optimization options for different build types. # Set optimization options for different build types.
if (${BUILD_TYPE} STREQUAL "dev") if (${BUILD_TYPE} STREQUAL "dev")
if (MSVC) if (MSVC)
...@@ -193,8 +214,8 @@ if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") ...@@ -193,8 +214,8 @@ if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
endif() endif()
if(USE_LIBXSMM) if(USE_LIBXSMM)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_LIBXSMM -DDGL_CPU_LLC_SIZE=40000000") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_LIBXSMM -DDGL_CPU_LLC_SIZE=40000000 -D__BLAS=0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_LIBXSMM -DDGL_CPU_LLC_SIZE=40000000") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_LIBXSMM -DDGL_CPU_LLC_SIZE=40000000 -D__BLAS=0")
message(STATUS "Build with LIBXSMM optimization.") message(STATUS "Build with LIBXSMM optimization.")
endif(USE_LIBXSMM) endif(USE_LIBXSMM)
...@@ -259,51 +280,109 @@ endif(USE_CUDA) ...@@ -259,51 +280,109 @@ endif(USE_CUDA)
# include directories # include directories
target_include_directories(dgl PRIVATE "include") target_include_directories(dgl PRIVATE "include")
target_include_directories(dgl PRIVATE "third_party/dlpack/include") # check for conda includes
target_include_directories(dgl PRIVATE "third_party/dmlc-core/include") if("$ENV{CONDA_BUILD}" STREQUAL "1")
target_include_directories(dgl PRIVATE "third_party/phmap/") set(in_conda_build TRUE)
target_include_directories(dgl PRIVATE "third_party/METIS/include/") message(STATUS "Conda build environment detected")
elseif(DEFINED ENV{CONDA_PREFIX})
set(in_conda_prefix TRUE)
message(STATUS "Conda environment detected: $ENV{CONDA_PREFIX}")
endif()
if (USE_CONDA_INCLUDES)
if(in_conda_build)
message(STATUS "Using Conda build environment includes: $ENV{PREFIX}")
target_include_directories(dgl PRIVATE "$ENV{PREFIX}/include" "$ENV{BUILD_PREFIX}/include")
elseif(in_conda_prefix)
message(STATUS "Using Conda environment includes: $ENV{CONDA_PREFIX}")
target_include_directories(dgl PRIVATE "$ENV{CONDA_PREFIX}/include")
else()
message(FATAL_ERROR "Conda environment not detected")
endif()
endif()
if(EXTERNAL_DLPACK_PATH)
message(STATUS "looking for dlpack headers in ${EXTERNAL_DLPACK_PATH}")
include_directories(SYSTEM ${EXTERNAL_DLPACK_PATH})
else(EXTERNAL_DLPACK_PATH)
target_include_directories(dgl PRIVATE "third_party/dlpack/include")
endif(EXTERNAL_DLPACK_PATH)
if(EXTERNAL_DMLC_PATH)
if (USE_HDFS)
message(FATAL_ERROR "Cannot use HDFS and external dmlc-core at the same time")
endif()
message(STATUS "looking for dmlc headers in ${EXTERNAL_DMLC_PATH}")
include_directories(SYSTEM ${EXTERNAL_DMLC_PATH})
if (NOT EXTERNAL_DMLC_LIB_PATH)
message(FATAL_ERROR "EXTERNAL_DMLC_LIB_PATH must be set if EXTERNAL_DMLC_PATH is set")
endif()
message(STATUS "looking for dmlc library in ${EXTERNAL_DMLC_LIB_PATH}")
find_package(dmlc
REQUIRED
HINTS ${EXTERNAL_DMLC_LIB_PATH}
)
if(NOT dmlc_FOUND)
message(FATAL_ERROR "Failed to find DMLC library")
endif()
list(APPEND DGL_LINKER_LIBS dmlc::dmlc)
else(EXTERNAL_DMLC_PATH)
target_include_directories(dgl PRIVATE "third_party/dmlc-core/include")
# For serialization
if (USE_HDFS)
option(DMLC_HDFS_SHARED "dgl has to build with dynamic hdfs library" ON)
endif()
add_subdirectory("third_party/dmlc-core")
list(APPEND DGL_LINKER_LIBS dmlc)
set(GOOGLE_TEST 0) # Turn off dmlc-core test
endif(EXTERNAL_DMLC_PATH)
if(EXTERNAL_PHMAP_PATH)
include_directories(SYSTEM ${EXTERNAL_PHMAP_PATH})
else(EXTERNAL_PHMAP_PATH)
target_include_directories(dgl PRIVATE "third_party/phmap")
endif(EXTERNAL_PHMAP_PATH)
target_include_directories(dgl PRIVATE "tensoradapter/include") target_include_directories(dgl PRIVATE "tensoradapter/include")
target_include_directories(dgl PRIVATE "third_party/nanoflann/include")
target_include_directories(dgl PRIVATE "third_party/libxsmm/include")
target_include_directories(dgl PRIVATE "third_party/pcg/include") target_include_directories(dgl PRIVATE "third_party/pcg/include")
# For serialization
if (USE_HDFS)
option(DMLC_HDFS_SHARED "dgl has to build with dynamic hdfs library" ON)
endif()
add_subdirectory("third_party/dmlc-core")
list(APPEND DGL_LINKER_LIBS dmlc)
set(GOOGLE_TEST 0) # Turn off dmlc-core test
# Compile METIS
if(NOT MSVC)
set(GKLIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/third_party/METIS/GKlib")
include(${GKLIB_PATH}/GKlibSystem.cmake)
include_directories(${GKLIB_PATH})
include_directories("third_party/METIS/include/")
add_subdirectory("third_party/METIS/libmetis/")
list(APPEND DGL_LINKER_LIBS metis)
endif(NOT MSVC)
# Compile LIBXSMM if(EXTERNAL_NANOFLANN_PATH)
if((NOT MSVC) AND USE_LIBXSMM) include_directories(SYSTEM ${EXTERNAL_NANOFLANN_PATH})
set(LIBXSMM_COMPILER "${CMAKE_C_COMPILER}") else(EXTERNAL_NANOFLANN_PATH)
if (APPLE) target_include_directories(dgl PRIVATE "third_party/nanoflann/include")
set(LIBXSMM_COMPILER "${CMAKE_C_COMPILER} -isysroot ${CMAKE_OSX_SYSROOT}") endif(EXTERNAL_NANOFLANN_PATH)
if (USE_LIBXSMM)
target_include_directories(dgl PRIVATE "third_party/libxsmm/include")
endif()
if (EXTERNAL_METIS_PATH)
find_package(METIS REQUIRED)
if (NOT METIS_FOUND)
message(FATAL_ERROR "Failed to find METIS library")
else()
message(STATUS "Found METIS library")
target_include_directories(dgl SYSTEM PUBLIC ${METIS_INCLUDE_DIR})
list(APPEND DGL_LINKER_LIBS ${METIS_LIBRARIES})
endif() endif()
if(REBUILD_LIBXSMM) else(EXTERNAL_METIS_PATH)
add_custom_target(libxsmm COMMAND make realclean COMMAND make -j ECFLAGS="-Wno-error=deprecated-declarations" BLAS=0 CC=${LIBXSMM_COMPILER} target_include_directories(dgl PRIVATE "third_party/METIS/include")
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/third_party/libxsmm # Compile METIS
) if(NOT MSVC)
else(REBUILD_LIBXSMM) set(GKLIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/third_party/METIS/GKlib")
add_custom_target(libxsmm COMMAND make -j ECFLAGS="-Wno-error=deprecated-declarations" BLAS=0 CC=${LIBXSMM_COMPILER} include(${GKLIB_PATH}/GKlibSystem.cmake)
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/third_party/libxsmm include_directories(${GKLIB_PATH})
) include_directories("third_party/METIS/include/")
endif(REBUILD_LIBXSMM) add_subdirectory("third_party/METIS/libmetis/")
add_dependencies(dgl libxsmm) list(APPEND DGL_LINKER_LIBS metis)
list(APPEND DGL_LINKER_LIBS -L${CMAKE_SOURCE_DIR}/third_party/libxsmm/lib/ xsmm.a) endif(NOT MSVC)
endif((NOT MSVC) AND USE_LIBXSMM) endif(EXTERNAL_METIS_PATH)
# Avoid exposing third-party symbols when using DGL as a library. # Avoid exposing third-party symbols when using DGL as a library.
if((NOT MSVC) AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")) if((NOT MSVC) AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin"))
...@@ -355,6 +434,7 @@ if(BUILD_TORCH) ...@@ -355,6 +434,7 @@ if(BUILD_TORCH)
CMAKE_COMMAND=${CMAKE_CMD} CMAKE_COMMAND=${CMAKE_CMD}
CUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR} CUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR}
USE_CUDA=${USE_CUDA} USE_CUDA=${USE_CUDA}
EXTERNAL_DMLC_LIB_PATH=${EXTERNAL_DMLC_LIB_PATH}
BINDIR=${BINDIR} BINDIR=${BINDIR}
cmd /e:on /c ${BUILD_SCRIPT} ${TORCH_PYTHON_INTERPS} cmd /e:on /c ${BUILD_SCRIPT} ${TORCH_PYTHON_INTERPS}
DEPENDS ${BUILD_SCRIPT} DEPENDS ${BUILD_SCRIPT}
...@@ -367,6 +447,7 @@ if(BUILD_TORCH) ...@@ -367,6 +447,7 @@ if(BUILD_TORCH)
CMAKE_COMMAND=${CMAKE_CMD} CMAKE_COMMAND=${CMAKE_CMD}
CUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR} CUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR}
USE_CUDA=${USE_CUDA} USE_CUDA=${USE_CUDA}
EXTERNAL_DMLC_LIB_PATH=${EXTERNAL_DMLC_LIB_PATH}
BINDIR=${CMAKE_CURRENT_BINARY_DIR} BINDIR=${CMAKE_CURRENT_BINARY_DIR}
bash ${BUILD_SCRIPT} ${TORCH_PYTHON_INTERPS} bash ${BUILD_SCRIPT} ${TORCH_PYTHON_INTERPS}
DEPENDS ${BUILD_SCRIPT} DEPENDS ${BUILD_SCRIPT}
......
# Find the METIS includes and library
#
# This module defines
# METIS_INCLUDE_DIR - where to find metis.h
# METIS_LIBRARIES - libraries to link against to use METIS.
# METIS_FOUND - METIS library was found
INCLUDE(FindPackageHandleStandardArgs)
FIND_PATH(METIS_INCLUDE_DIR
NAMES
"metis.h"
PATHS
${EXTERNAL_METIS_PATH}
)
FIND_LIBRARY(METIS_LIBRARIES
NAMES
libmetis metis
PATHS
${EXTERNAL_METIS_LIB_PATH}
)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(METIS DEFAULT_MSG METIS_INCLUDE_DIR METIS_LIBRARIES)
MARK_AS_ADVANCED(METIS_LIBRARIES METIS_INCLUDE_DIR)
...@@ -57,8 +57,19 @@ target_link_directories(${LIB_DGL_SPARSE_NAME} PRIVATE ${DGL_BUILD_DIR} "${DGL_B ...@@ -57,8 +57,19 @@ target_link_directories(${LIB_DGL_SPARSE_NAME} PRIVATE ${DGL_BUILD_DIR} "${DGL_B
if(DEFINED MKL_LIBRARIES) if(DEFINED MKL_LIBRARIES)
target_link_directories(${LIB_DGL_SPARSE_NAME} PRIVATE ${MKL_ROOT}/lib/${MKL_ARCH}) target_link_directories(${LIB_DGL_SPARSE_NAME} PRIVATE ${MKL_ROOT}/lib/${MKL_ARCH})
endif() endif()
if (EXTERNAL_DMLC_LIB_PATH)
target_link_libraries(${LIB_DGL_SPARSE_NAME} dmlc dgl) # external dmlc requires OpenMP link
include(FindOpenMP)
if(OPENMP_FOUND)
set(CMAKE_C_FLAGS "${OpenMP_C_FLAGS} ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${OpenMP_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
endif(OPENMP_FOUND)
message(STATUS "looking for dmlc library in ${EXTERNAL_DMLC_LIB_PATH}")
find_package(dmlc REQUIRED HINTS ${EXTERNAL_DMLC_LIB_PATH})
target_link_libraries(${LIB_DGL_SPARSE_NAME} dmlc::dmlc dgl)
else (EXTERNAL_DMLC_LIB_PATH)
target_link_libraries(${LIB_DGL_SPARSE_NAME} dmlc dgl)
endif()
set(GOOGLE_TEST 0) # Turn off dmlc-core test set(GOOGLE_TEST 0) # Turn off dmlc-core test
# Configure dgl_sparse library to use C++17 standard for compatibility with PyTorch # Configure dgl_sparse library to use C++17 standard for compatibility with PyTorch
......
...@@ -12,7 +12,7 @@ else ...@@ -12,7 +12,7 @@ else
CPSOURCE=*.so CPSOURCE=*.so
fi fi
CMAKE_FLAGS="-DCUDA_TOOLKIT_ROOT_DIR=$CUDA_TOOLKIT_ROOT_DIR -DTORCH_CUDA_ARCH_LIST=$TORCH_CUDA_ARCH_LIST -DUSE_CUDA=$USE_CUDA" CMAKE_FLAGS="-DCUDA_TOOLKIT_ROOT_DIR=$CUDA_TOOLKIT_ROOT_DIR -DTORCH_CUDA_ARCH_LIST=$TORCH_CUDA_ARCH_LIST -DUSE_CUDA=$USE_CUDA -DEXTERNAL_DMLC_LIB_PATH=$EXTERNAL_DMLC_LIB_PATH"
# CMake passes in the list of directories separated by spaces. Here we replace them with semicolons. # CMake passes in the list of directories separated by spaces. Here we replace them with semicolons.
CMAKE_FLAGS="$CMAKE_FLAGS -DDGL_INCLUDE_DIRS=${INCLUDEDIR// /;} -DDGL_BUILD_DIR=$BINDIR" CMAKE_FLAGS="$CMAKE_FLAGS -DDGL_INCLUDE_DIRS=${INCLUDEDIR// /;} -DDGL_BUILD_DIR=$BINDIR"
echo $CMAKE_FLAGS echo $CMAKE_FLAGS
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#if !defined(_WIN32) #if !defined(_WIN32)
#ifdef USE_LIBXSMM #ifdef USE_LIBXSMM
#include <libxsmm.h> #include <libxsmm_source.h>
#include <unistd.h> #include <unistd.h>
#ifdef DEBUG #ifdef DEBUG
#include <x86intrin.h> #include <x86intrin.h>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include <dgl/runtime/config.h> #include <dgl/runtime/config.h>
#include <dgl/runtime/registry.h> #include <dgl/runtime/registry.h>
#if !defined(_WIN32) && defined(USE_LIBXSMM) #if !defined(_WIN32) && defined(USE_LIBXSMM)
#include <libxsmm_cpuid.h> #include <libxsmm_source.h>
#endif #endif
using namespace dgl::runtime; using namespace dgl::runtime;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment