From 77c7a8b91d0648775ee463533b11348cceaba513 Mon Sep 17 00:00:00 2001 From: HolyLow Date: Tue, 26 Nov 2024 13:38:16 +0800 Subject: [PATCH] [CELEBORN-1741][CIP-14] Add processBase utils to cppClient ### What changes were proposed in this pull request? This PR adds CMakeList structure and ProcessBase utils code to CppClient. ### Why are the changes needed? To organize the compiling structure and to provide ProcessBase utils. ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? Compilation. Closes #2940 from HolyLow/issue/celeborn-1741-add-processbase-utils-to-cppClient. Authored-by: HolyLow Signed-off-by: mingji --- .rat-excludes | 1 + LICENSE | 15 ++ cpp/.clang-format | 87 +++++++++ cpp/CMakeLists.txt | 143 ++++++++++++++ cpp/README.md | 11 ++ cpp/celeborn/CMakeLists.txt | 15 ++ cpp/celeborn/utils/CMakeLists.txt | 25 +++ cpp/celeborn/utils/ProcessBase.cpp | 129 +++++++++++++ cpp/celeborn/utils/ProcessBase.h | 68 +++++++ cpp/cmake/FindSodium.cmake | 297 +++++++++++++++++++++++++++++ cpp/cmake/celeborn-config.cmake.in | 28 +++ 11 files changed, 819 insertions(+) create mode 100644 cpp/.clang-format create mode 100644 cpp/CMakeLists.txt create mode 100644 cpp/celeborn/CMakeLists.txt create mode 100644 cpp/celeborn/utils/CMakeLists.txt create mode 100644 cpp/celeborn/utils/ProcessBase.cpp create mode 100644 cpp/celeborn/utils/ProcessBase.h create mode 100644 cpp/cmake/FindSodium.cmake create mode 100644 cpp/cmake/celeborn-config.cmake.in diff --git a/.rat-excludes b/.rat-excludes index c4f31a9ff..22c97119e 100644 --- a/.rat-excludes +++ b/.rat-excludes @@ -37,3 +37,4 @@ build/scala-*/** build/sbt-config/** **/benchmarks/** **/node_modules/** +cpp/cmake/FindSodium.cmake diff --git a/LICENSE b/LICENSE index 3c8858ec9..5ca50b6f3 100644 --- a/LICENSE +++ b/LICENSE @@ -256,3 +256,18 @@ Remote Shuffle Service for Flink ./client-flink/common/src/main/java/org/apache/celeborn/plugin/flink/buffer/DataBuffer.java ./client-flink/common/src/main/java/org/apache/celeborn/plugin/flink/buffer/SortBasedDataBuffer.java ./client-flink/common/src/main/java/org/apache/celeborn/plugin/flink/buffer/TransferBufferPool.java + +Meta Velox +./cpp/scripts/setup-ubuntu.sh +./cpp/scripts/setup-helper-functions.sh +./cpp/celeborn/utils/ProcessBase.h +./cpp/celeborn/utils/ProcessBase.cpp + + +------------------------------------------------------------------------------------ +This product bundles various third-party components under the CC0 license. +This section summarizes those components. + + +-------------------------------------- +./cpp/cmake/FindSodium.cmake diff --git a/cpp/.clang-format b/cpp/.clang-format new file mode 100644 index 000000000..684390a01 --- /dev/null +++ b/cpp/.clang-format @@ -0,0 +1,87 @@ +--- +AccessModifierOffset: -1 +AlignAfterOpenBracket: AlwaysBreak +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: true +AlignOperands: false +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: true +BinPackArguments: false +BinPackParameters: false +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: false +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ForEachMacros: [ FOR_EACH, FOR_EACH_R, FOR_EACH_RANGE, ] +IncludeCategories: + - Regex: '^<.*\.h(pp)?>' + Priority: 1 + - Regex: '^<.*' + Priority: 2 + - Regex: '.*' + Priority: 3 +IndentCaseLabels: true +IndentWidth: 2 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: false +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Left +ReflowComments: true +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 8 +UseTab: Never +... diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt new file mode 100644 index 000000000..1ad45f867 --- /dev/null +++ b/cpp/CMakeLists.txt @@ -0,0 +1,143 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +cmake_minimum_required(VERSION 3.24) + +if (NOT DEFINED PACKAGE_VERSION) + set(PACKAGE_VERSION "0.0.1") +endif () + +project("celeborn" VERSION ${PACKAGE_VERSION} LANGUAGES CXX C) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) +message("Appending CMAKE_CXX_FLAGS with ${SCRIPT_CXX_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SCRIPT_CXX_FLAGS}") +if ("${TREAT_WARNINGS_AS_ERRORS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") +endif () + +# Avoid folly::f14::detail::F14LinkCheck problem on x86-64 platform. +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2") + +# Set CMAKE_BUILD_TYPE to 'Release' if it is not specified. +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif () +message(STATUS "CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") + +# Known warnings that are benign can be disabled. +set(DISABLED_WARNINGS + "-Wno-nullability-completeness -Wno-deprecated-declarations") + +# Important warnings that must be explicitly enabled. +set(ENABLE_WARNINGS "-Wreorder") + +# The CMAKE_PREFIX_PATH should be set to the thirdparty's install path +# (thirdparty/installed by default), to find all the dependencies. +message(STATUS "Using CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}") +# Currently, we use the "-lgtest" to link the gtest library, and gtest library +# is in the "thirdparty/installed/lib64" directory in the linux environment, so +# the lib search path needs to be specified here. +if (EXISTS ${CMAKE_PREFIX_PATH}/lib64) + link_directories(${CMAKE_PREFIX_PATH}/lib64) + # thrift.a is installed in the directory thirdparty/installed/lib by + # default in the Linux environment. + link_directories(${CMAKE_PREFIX_PATH}/lib) +elseif (CMAKE_SYSTEM_NAME MATCHES "Linux") + message( + WARNING + "You did not use the recommended way " + "(using 'thirdparty/build-thirdparty.sh') to build & install " + "thirdparty libraries.") +endif () + +#if (NOT APPLE) +# set(Boost_USE_STATIC_RUNTIME ON) +# set(Boost_USE_STATIC_LIBS ON) +#endif () +set(Boost_USE_MULTITHREADED TRUE) +find_package( + Boost + #1.75.0 + 1.84.0 + REQUIRED + program_options + context + filesystem + regex + thread + system + date_time + atomic) +include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) + +# GFlags +# +# NOTE: The name here must be exactly "gflags", that is, use all lowercase. +# Otherwise, e.g. "GFLAGS" or "GFlags", the generated `GFLAGS_LIBRARIES` will +# point to the shared library instead of the static library, even if we +# explicitly specify to link against the static library (via "COMPONENTS +# static"). This may be a problem that the cmake script of GFlags does not +# consider comprehensively (for the case of words). +# +# See [1] for the recommended `find_package` commands to use to find GFlags, in +# which the "@PACKAGE_NAME@" will be replaced with "gflags" when installed. +# +# [1] https://github.com/gflags/gflags/blob/v2.2.2/cmake/config.cmake.in#L50-L56 +if (APPLE) + # Use the shared library of gflags on MacOS because it is installed via + # Homebrew and only shared library is installed. + find_package(gflags REQUIRED COMPONENTS shared) +else () + find_package(gflags REQUIRED COMPONENTS static) +endif () + +find_package(glog REQUIRED) +find_library(FMT fmt) + +find_package(folly CONFIG REQUIRED) +set(FOLLY_WITH_DEPENDENCIES + ${FOLLY_LIBRARIES} + Boost::context + dl +) + +# Include third party header files +find_path(OPT_OPENSSL_DIR NAMES opt/openssl@1.1) +set(OPENSSL_ROOT_DIR "${OPT_OPENSSL_DIR}/opt/openssl@1.1") +find_package(OpenSSL REQUIRED) + +find_package(Protobuf REQUIRED) + +set(CMAKE_MODULE_PATH + "${CMAKE_CURRENT_SOURCE_DIR}/cmake" + ${CMAKE_MODULE_PATH}) +find_package(Sodium REQUIRED) +find_library(FIZZ fizz REQUIRED) +find_library(WANGLE wangle REQUIRED) + +find_library(RE2 re2) + +find_package(fizz CONFIG REQUIRED) +find_package(wangle CONFIG REQUIRED) + +set(WANGLE_LIBRARIES ${WANGLE} ${FIZZ}) + +include_directories(SYSTEM ${OPENSSL_INCLUDE_DIR}) + +include_directories(SYSTEM celeborn) +include_directories(.) + +add_subdirectory(celeborn) diff --git a/cpp/README.md b/cpp/README.md index 3c25b5cc3..aefb67c25 100644 --- a/cpp/README.md +++ b/cpp/README.md @@ -37,3 +37,14 @@ cd scripts bash setup-ubuntu.sh ``` Other platforms are not supported yet, and you could use the container above as your dev environment. + +## Compile +Currently, the modules are under development. +You could compile the code within the dev container by +``` +cd celeborn/cpp +mkdir -p build && cd build +cmake .. +make +``` + diff --git a/cpp/celeborn/CMakeLists.txt b/cpp/celeborn/CMakeLists.txt new file mode 100644 index 000000000..97591cb0c --- /dev/null +++ b/cpp/celeborn/CMakeLists.txt @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +add_subdirectory(utils) diff --git a/cpp/celeborn/utils/CMakeLists.txt b/cpp/celeborn/utils/CMakeLists.txt new file mode 100644 index 000000000..9a98d6748 --- /dev/null +++ b/cpp/celeborn/utils/CMakeLists.txt @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +add_library(utils ProcessBase.cpp) + +target_link_libraries( + utils + ${WANGLE} + ${FIZZ} + ${LIBSODIUM_LIBRARY} + ${FOLLY_WITH_DEPENDENCIES} + ${GLOG} + ${GFLAGS_LIBRARIES} +) diff --git a/cpp/celeborn/utils/ProcessBase.cpp b/cpp/celeborn/utils/ProcessBase.cpp new file mode 100644 index 000000000..385dcc578 --- /dev/null +++ b/cpp/celeborn/utils/ProcessBase.cpp @@ -0,0 +1,129 @@ +/* + * Based on ProcessBase.cpp from Facebook Velox + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "celeborn/utils/ProcessBase.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +constexpr const char* kProcSelfCmdline = "/proc/self/cmdline"; + +namespace celeborn { +namespace utils { + +DECLARE_bool(celeborn_avx2); // Enables use of AVX2 when available NOLINT + +DECLARE_bool(celeborn_bmi2); // Enables use of BMI2 when available NOLINT + +/** + * Current executable's name. + */ +std::string getAppName() { + const char* result = getenv("_"); + if (result) { + return result; + } + + // if we're running under gtest, getenv will return null + std::string appName; + if (folly::readFile(kProcSelfCmdline, appName)) { + auto pos = appName.find('\0'); + if (pos != std::string::npos) { + appName = appName.substr(0, pos); + } + + return appName; + } + + return ""; +} + +/** + * This machine's name. + */ +std::string getHostName() { + char hostbuf[_POSIX_HOST_NAME_MAX + 1]; + if (gethostname(hostbuf, _POSIX_HOST_NAME_MAX + 1) < 0) { + return ""; + } else { + // When the host name is precisely HOST_NAME_MAX bytes long, gethostname + // returns 0 even though the result is not NUL-terminated. Manually NUL- + // terminate to handle that case. + hostbuf[_POSIX_HOST_NAME_MAX] = '\0'; + return hostbuf; + } +} + +/** + * Process identifier. + */ +pid_t getProcessId() { + return getpid(); +} + +/** + * Current thread's identifier. + */ +pthread_t getThreadId() { + return pthread_self(); +} + +/** + * Get current working directory. + */ +std::string getCurrentDirectory() { + char buf[PATH_MAX]; + return getcwd(buf, PATH_MAX); +} + +uint64_t threadCpuNanos() { + timespec ts; + clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts); + return ts.tv_sec * 1'000'000'000 + ts.tv_nsec; +} + +namespace { +bool bmi2CpuFlag = folly::CpuId().bmi2(); +bool avx2CpuFlag = folly::CpuId().avx2(); +} // namespace + +bool hasAvx2() { +#ifdef __AVX2__ + return avx2CpuFlag && FLAGS_celeborn_avx2; +#else + return false; +#endif +} + +bool hasBmi2() { +#ifdef __BMI2__ + return bmi2CpuFlag && FLAGS_celeborn_bmi2; +#else + return false; +#endif +} + +} // namespace utils +} // namespace celeborn diff --git a/cpp/celeborn/utils/ProcessBase.h b/cpp/celeborn/utils/ProcessBase.h new file mode 100644 index 000000000..749541faa --- /dev/null +++ b/cpp/celeborn/utils/ProcessBase.h @@ -0,0 +1,68 @@ +/* + * Based on ProcessBase.h from Facebook Velox + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include +#include + +namespace celeborn { +namespace utils { + +/** + * Current executable's name. + */ +std::string getAppName(); + +/** + * This machine'a name. + */ +std::string getHostName(); + +/** + * Process identifier. + */ +pid_t getProcessId(); + +/** + * Current thread's identifier. + */ +pthread_t getThreadId(); + +/** + * Get current working directory. + */ +std::string getCurrentDirectory(); + +/** + * Returns elapsed CPU nanoseconds on the calling thread + */ +uint64_t threadCpuNanos(); + +// True if the machine has Intel AVX2 instructions and these are not disabled by +// flag. +bool hasAvx2(); + +// True if the machine has Intel BMI2 instructions and these are not disabled by +// flag. +bool hasBmi2(); + +} // namespace utils +} // namespace celeborn diff --git a/cpp/cmake/FindSodium.cmake b/cpp/cmake/FindSodium.cmake new file mode 100644 index 000000000..fbfa59292 --- /dev/null +++ b/cpp/cmake/FindSodium.cmake @@ -0,0 +1,297 @@ +# Written in 2016 by Henrik Steffen Gaßmann +# +# To the extent possible under law, the author(s) have dedicated all +# copyright and related and neighboring rights to this software to the +# public domain worldwide. This software is distributed without any warranty. +# +# You should have received a copy of the CC0 Public Domain Dedication +# along with this software. If not, see +# +# http://creativecommons.org/publicdomain/zero/1.0/ +# +######################################################################## +# Tries to find the local libsodium installation. +# +# On Windows the sodium_DIR environment variable is used as a default +# hint which can be overridden by setting the corresponding cmake variable. +# +# Once done the following variables will be defined: +# +# sodium_FOUND +# sodium_INCLUDE_DIR +# sodium_LIBRARY_DEBUG +# sodium_LIBRARY_RELEASE +# +# +# Furthermore an imported "sodium" target is created. +# + +if (CMAKE_C_COMPILER_ID STREQUAL "GNU" + OR CMAKE_C_COMPILER_ID STREQUAL "Clang") + set(_GCC_COMPATIBLE 1) +endif () + +# static library option +if (NOT DEFINED sodium_USE_STATIC_LIBS) + option(sodium_USE_STATIC_LIBS "enable to statically link against sodium" OFF) +endif () +if (NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST)) + unset(sodium_LIBRARY CACHE) + unset(sodium_LIBRARY_DEBUG CACHE) + unset(sodium_LIBRARY_RELEASE CACHE) + unset(sodium_DLL_DEBUG CACHE) + unset(sodium_DLL_RELEASE CACHE) + set(sodium_USE_STATIC_LIBS_LAST ${sodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable") +endif () + + +######################################################################## +# UNIX +if (UNIX) + # import pkg-config + find_package(PkgConfig QUIET) + if (PKG_CONFIG_FOUND) + pkg_check_modules(sodium_PKG QUIET libsodium) + endif () + + if (sodium_USE_STATIC_LIBS) + foreach (_libname ${sodium_PKG_STATIC_LIBRARIES}) + if (NOT _libname MATCHES "^lib.*\\.a$") # ignore strings already ending with .a + list(INSERT sodium_PKG_STATIC_LIBRARIES 0 "lib${_libname}.a") + endif () + endforeach () + list(REMOVE_DUPLICATES sodium_PKG_STATIC_LIBRARIES) + + # if pkgconfig for libsodium doesn't provide + # static lib info, then override PKG_STATIC here.. + if (NOT sodium_PKG_STATIC_FOUND) + set(sodium_PKG_STATIC_LIBRARIES libsodium.a) + endif () + + set(XPREFIX sodium_PKG_STATIC) + else () + if (NOT sodium_PKG_FOUND) + set(sodium_PKG_LIBRARIES sodium) + endif () + + set(XPREFIX sodium_PKG) + endif () + + find_path(sodium_INCLUDE_DIR sodium.h + HINTS ${${XPREFIX}_INCLUDE_DIRS} + ) + find_library(sodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES} + HINTS ${${XPREFIX}_LIBRARY_DIRS} + ) + find_library(sodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES} + HINTS ${${XPREFIX}_LIBRARY_DIRS} + ) + + + ######################################################################## + # Windows +elseif (WIN32) + set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory") + mark_as_advanced(sodium_DIR) + + find_path(sodium_INCLUDE_DIR sodium.h + HINTS ${sodium_DIR} + PATH_SUFFIXES include + ) + + if (MSVC) + # detect target architecture + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.cpp" [=[ + #if defined _M_IX86 + #error ARCH_VALUE x86_32 + #elif defined _M_X64 + #error ARCH_VALUE x86_64 + #endif + #error ARCH_VALUE unknown + ]=]) + try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/arch.cpp" + OUTPUT_VARIABLE _COMPILATION_LOG + ) + string(REGEX REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*" "\\1" _TARGET_ARCH "${_COMPILATION_LOG}") + + # construct library path + if (_TARGET_ARCH STREQUAL "x86_32") + string(APPEND _PLATFORM_PATH "Win32") + elseif (_TARGET_ARCH STREQUAL "x86_64") + string(APPEND _PLATFORM_PATH "x64") + else () + message(FATAL_ERROR "the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake.") + endif () + string(APPEND _PLATFORM_PATH "/$$CONFIG$$") + + if (MSVC_VERSION LESS 1900) + math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60") + else () + math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50") + endif () + string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}") + + if (sodium_USE_STATIC_LIBS) + string(APPEND _PLATFORM_PATH "/static") + else () + string(APPEND _PLATFORM_PATH "/dynamic") + endif () + + string(REPLACE "$$CONFIG$$" "Debug" _DEBUG_PATH_SUFFIX "${_PLATFORM_PATH}") + string(REPLACE "$$CONFIG$$" "Release" _RELEASE_PATH_SUFFIX "${_PLATFORM_PATH}") + + find_library(sodium_LIBRARY_DEBUG libsodium.lib + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX} + ) + find_library(sodium_LIBRARY_RELEASE libsodium.lib + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX} + ) + if (NOT sodium_USE_STATIC_LIBS) + set(CMAKE_FIND_LIBRARY_SUFFIXES_BCK ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll") + find_library(sodium_DLL_DEBUG libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX} + ) + find_library(sodium_DLL_RELEASE libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX} + ) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BCK}) + endif () + + elseif (_GCC_COMPATIBLE) + if (sodium_USE_STATIC_LIBS) + find_library(sodium_LIBRARY_DEBUG libsodium.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib + ) + find_library(sodium_LIBRARY_RELEASE libsodium.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib + ) + else () + find_library(sodium_LIBRARY_DEBUG libsodium.dll.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib + ) + find_library(sodium_LIBRARY_RELEASE libsodium.dll.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib + ) + + file(GLOB _DLL + LIST_DIRECTORIES false + RELATIVE "${sodium_DIR}/bin" + "${sodium_DIR}/bin/libsodium*.dll" + ) + find_library(sodium_DLL_DEBUG ${_DLL} libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES bin + ) + find_library(sodium_DLL_RELEASE ${_DLL} libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES bin + ) + endif () + else () + message(FATAL_ERROR "this platform is not supported by FindSodium.cmake") + endif () + + + ######################################################################## + # unsupported +else () + message(FATAL_ERROR "this platform is not supported by FindSodium.cmake") +endif () + + +######################################################################## +# conf stuff + +# extract sodium version +if (sodium_INCLUDE_DIR) + set(_VERSION_HEADER "${_INCLUDE_DIR}/sodium/version.h") + if (EXISTS _VERSION_HEADER) + file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT) + string(REGEX REPLACE ".*#[ \t]*define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" "\\1" + sodium_VERSION "${_VERSION_HEADER_CONTENT}") + set(sodium_VERSION "${sodium_VERSION}" PARENT_SCOPE) + endif () +endif () + +# communicate results +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + Sodium # The name must be either uppercase or match the filename case. + REQUIRED_VARS + sodium_LIBRARY_RELEASE + sodium_LIBRARY_DEBUG + sodium_INCLUDE_DIR + VERSION_VAR + sodium_VERSION +) + +if (Sodium_FOUND) + set(sodium_LIBRARIES + optimized ${sodium_LIBRARY_RELEASE} debug ${sodium_LIBRARY_DEBUG}) +endif () + +# mark file paths as advanced +mark_as_advanced(sodium_INCLUDE_DIR) +mark_as_advanced(sodium_LIBRARY_DEBUG) +mark_as_advanced(sodium_LIBRARY_RELEASE) +if (WIN32) + mark_as_advanced(sodium_DLL_DEBUG) + mark_as_advanced(sodium_DLL_RELEASE) +endif () + +# create imported target +if (sodium_USE_STATIC_LIBS) + set(_LIB_TYPE STATIC) +else () + set(_LIB_TYPE SHARED) +endif () + +if (NOT TARGET sodium) + add_library(sodium ${_LIB_TYPE} IMPORTED) +endif () + +set_target_properties(sodium PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${sodium_INCLUDE_DIR}" + IMPORTED_LINK_INTERFACE_LANGUAGES "C" +) + +if (sodium_USE_STATIC_LIBS) + set_target_properties(sodium PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC" + IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}" + ) +else () + if (UNIX) + set_target_properties(sodium PROPERTIES + IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}" + ) + elseif (WIN32) + set_target_properties(sodium PROPERTIES + IMPORTED_IMPLIB "${sodium_LIBRARY_RELEASE}" + IMPORTED_IMPLIB_DEBUG "${sodium_LIBRARY_DEBUG}" + ) + if (NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND")) + set_target_properties(sodium PROPERTIES + IMPORTED_LOCATION_DEBUG "${sodium_DLL_DEBUG}" + ) + endif () + if (NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND")) + set_target_properties(sodium PROPERTIES + IMPORTED_LOCATION_RELWITHDEBINFO "${sodium_DLL_RELEASE}" + IMPORTED_LOCATION_MINSIZEREL "${sodium_DLL_RELEASE}" + IMPORTED_LOCATION_RELEASE "${sodium_DLL_RELEASE}" + ) + endif () + endif () +endif () diff --git a/cpp/cmake/celeborn-config.cmake.in b/cpp/cmake/celeborn-config.cmake.in new file mode 100644 index 000000000..792e14e1a --- /dev/null +++ b/cpp/cmake/celeborn-config.cmake.in @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +@PACKAGE_INIT@ + +set_and_check(CELEBORN_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") +set_and_check(CELEBORN_CMAKE_DIR "@PACKAGE_CMAKE_INSTALL_DIR@") + +if (NOT TARGET celeborn::celeborn) + include("${CELEBORN_CMAKE_DIR}/celeborn-targets.cmake") +endif() + +set(CELEBORN_LIBRARIES celeborn::celeborn) + +if (NOT celeborn_FIND_QUIETLY) + message(STATUS "Found celeborn: ${PACKAGE_PREFIX_DIR}") +endif()