Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

aws-cdi-sdk: migrate to Conan v2 #21164

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 45 additions & 7 deletions recipes/aws-cdi-sdk/all/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,48 @@
cmake_minimum_required(VERSION 3.5)
project(cmake_wrapper)
cmake_minimum_required(VERSION 3.15)
project(cdisdk LANGUAGES C CXX)

include(conanbuildinfo.cmake)
conan_basic_setup(TARGETS)
find_package(AWSSDK REQUIRED CONFIG)
add_subdirectory(aws-cpp-sdk-cdi)

find_package(AWSSDK REQUIRED)
add_library(aws-cpp-sdk-core ALIAS AWS::aws-sdk-cpp-core)
find_package(aws-libfabric REQUIRED CONFIG)
find_package(Threads REQUIRED)

add_subdirectory(source_subfolder/aws-cpp-sdk-cdi)
file(GLOB_RECURSE CDI_SOURCES "src/cdi/*.c*" "src/common/src/*.c" )
if(NOT WIN32)
list(FILTER CDI_SOURCES EXCLUDE REGEX "src/common/src/os_windows.c")
endif()
add_library(cdisdk ${CDI_SOURCES})
target_include_directories(cdisdk PRIVATE include src/common/include src/cdi)
target_link_libraries(cdisdk PRIVATE
AWS::aws-cpp-sdk-cdi
AWS::aws-sdk-cpp-monitoring
aws-libfabric::aws-libfabric
Threads::Threads
)
set_target_properties(cdisdk PROPERTIES
SOVERSION ${PRODUCT_VERSION}
VERSION ${MAJOR_MINOR_VERSION}
C_STANDARD 99
CXX_STANDARD 11
)
# https://github.com/aws/aws-cdi-sdk/blob/v2.4.1/Makefile#L214-L232
target_compile_definitions(cdisdk PRIVATE _LINUX _POSIX_C_SOURCE=200112L)
if (NOT MSVC)
target_compile_options(cdisdk PRIVATE
-Wall -Wextra
"$<$<CONFIG:DEBUG>:-O0;-g;-DDEBUG>"
"$<$<CONFIG:RELEASE>:-O3;-DNDEBUG>"
)
# https://github.com/aws/aws-cdi-sdk/blob/v2.4.1/Makefile#L376-L379
target_link_options(cdisdk PRIVATE -z defs -Wl,--version-script ${CMAKE_SOURCE_DIR}/libcdisdk.vers)
endif()
if (UNIX)
target_link_libraries(cdisdk PRIVATE dl rt m)
endif()

install(TARGETS cdisdk
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
install(DIRECTORY include/ DESTINATION include)
11 changes: 5 additions & 6 deletions recipes/aws-cdi-sdk/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
sources:
"2.4.1":
url: "https://github.com/aws/aws-cdi-sdk/archive/refs/tags/v2.4.1.tar.gz"
sha256: "360a8eeaf741a1e6b7c9d3971d0d0b4098e4c76092330684816b62d5e8400045"
"2.2.0":
url: https://github.com/aws/aws-cdi-sdk/archive/refs/tags/v2.2.0.tar.gz
sha256: 4ee109b7fa2f683b4b0cd03028d0946857f09f34da4e89fe69a5c297cdaeb689
patches:
"2.2.0":
- base_path: source_subfolder
patch_file: patches/001-Makefile.patch
url: "https://github.com/aws/aws-cdi-sdk/archive/refs/tags/v2.2.0.tar.gz"
sha256: "4ee109b7fa2f683b4b0cd03028d0946857f09f34da4e89fe69a5c297cdaeb689"
197 changes: 87 additions & 110 deletions recipes/aws-cdi-sdk/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -1,144 +1,121 @@
import os
import re

from conans import AutoToolsBuildEnvironment, CMake, ConanFile, tools
from conans.errors import ConanInvalidConfiguration
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.build import check_min_cppstd, stdcpp_library
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
from conan.tools.files import copy, get, rmdir

required_conan_version = ">=1.53.0"

required_conan_version = ">=1.35.0"

class AwsCdiSdkConan(ConanFile):
name = "aws-cdi-sdk"
description = "AWS Cloud Digital Interface (CDI) SDK"
topics = ("aws", "communication", "framework", "service")
license = "BSD-2-Clause"
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://github.com/aws/aws-cdi-sdk"
license = "BSD-2-Clause"
topics = ("aws", "communication", "framework", "service")

package_type = "library"
settings = "os", "arch", "compiler", "build_type"
exports_sources = ["CMakeLists.txt", "patches/**"]
generators = "cmake", "cmake_find_package"
options = {
"shared": [True, False],
"fPIC": [True, False],
}
default_options = {
"shared": False,
"fPIC": True,
}

def export_sources(self):
copy(self, "CMakeLists.txt", self.recipe_folder, os.path.join(self.export_sources_folder, "src"))

def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC

@property
def _source_subfolder(self):
return "source_subfolder"
def configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")
self.options["aws-libfabric"].shared = True
self.options["aws-sdk-cpp"].shared = True
self.options["s2n"].shared = True

_autotools = None
_cmake = None
def layout(self):
cmake_layout(self, src_folder="src")

def requirements(self):
self.requires("aws-libfabric/1.9.1amzncdi1.0")
self.requires("aws-sdk-cpp/1.8.130")

def configure(self):
self.options["aws-libfabric"].shared = True
self.options["aws-sdk-cpp"].shared = True
self.requires("aws-sdk-cpp/1.9.234")

def validate(self):
if self.settings.os != "Linux":
raise ConanInvalidConfiguration("This recipe currently only supports Linux. Feel free to contribute other platforms!")
if not self.options["aws-libfabric"].shared or not self.options["aws-sdk-cpp"].shared:
if self.settings.os not in ["Linux", "FreeBSD", "Windows"]:
# The code compiles either `os_linux.c` or `os_windows.c` depending on the OS, but `os_linux.c` is not compatible with macOS.
# https://github.com/aws/aws-cdi-sdk/tree/mainline/src/common/src
raise ConanInvalidConfiguration(f"{self.settings.os} is not supported")
if not self.dependencies["aws-libfabric"].options.shared or not self.dependencies["aws-sdk-cpp"].options.shared:
raise ConanInvalidConfiguration("Cannot build with static dependencies")
if not getattr(self.options["aws-sdk-cpp"], "monitoring"):
if not self.dependencies["aws-sdk-cpp"].options.get_safe("monitoring"):
raise ConanInvalidConfiguration("This package requires the monitoring AWS SDK")
if self.settings.compiler.get_safe("cppstd"):
tools.check_min_cppstd(self, 11)
check_min_cppstd(self, 11)

def source(self):
tools.get(**self.conan_data["sources"][self.version],
destination=self._source_subfolder, strip_root=True)

def _configure_autotools(self):
if self._autotools:
return self._autotools
self._autotools = AutoToolsBuildEnvironment(self)
return self._autotools

def _configure_cmake(self):
if self._cmake:
return self._cmake
self._cmake = CMake(self)
self._cmake.configure()
return self._cmake

def _detect_compilers(self):
cmake_cache = tools.load(os.path.join(self.build_folder, "CMakeCache.txt"))
cc = re.search("CMAKE_C_COMPILER:FILEPATH=(.*)", cmake_cache)[1]
cxx = re.search("CMAKE_CXX_COMPILER:FILEPATH=(.*)", cmake_cache)[1]
return cc, cxx

def build(self):
for patch in self.conan_data.get("patches", {}).get(self.version, []):
tools.patch(**patch)

# build aws-cpp-sdk-cdi
cmake = self._configure_cmake()
get(self, **self.conan_data["sources"][self.version], strip_root=True)

def generate(self):
tc = CMakeToolchain(self)
# https://github.com/aws/aws-cdi-sdk/blob/v2.4.1/Makefile#L23-L34
# https://github.com/aws/aws-cdi-sdk/blob/v2.4.1/include/cdi_core_api.h#L67-L74
product, major, minor = self.version.split(".")[:3]
tc.variables["PRODUCT_VERSION"] = product
tc.variables["MAJOR_MINOR_VERSION"] = f"{major}.{minor}"
tc.generate()
deps = CMakeDeps(self)
deps.set_property("aws-sdk-cpp", "cmake_target_name", "aws-cpp-sdk-core")
deps.generate()

def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()

autotools = self._configure_autotools()
with tools.chdir(self._source_subfolder):
# configure autotools to find aws-cpp-sdk-cdi
autotools.include_paths.append(os.path.join(self.build_folder, self._source_subfolder, "aws-cpp-sdk-cdi", "include"))
autotools.library_paths.append(os.path.join(self.build_folder, "lib"))
autotools.libs.append("aws-cpp-sdk-cdi")

vars = autotools.vars
cc, cxx = self._detect_compilers()
vars["CC"] = cc
vars["CXX"] = cxx
if self.settings.build_type == "Debug":
vars["DEBUG"] = "y"

args = ["require_aws_sdk=no"]

autotools.make(target="libsdk", vars=vars, args=args)

def package(self):
cmake = self._configure_cmake()
copy(self, "LICENSE", self.source_folder, os.path.join(self.package_folder, "licenses"))
cmake = CMake(self)
cmake.install()
rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))

self.copy(pattern="LICENSE", dst="licenses", src=self._source_subfolder)
self.copy(pattern="*", dst="include", src=os.path.join(self._source_subfolder, "include"))
config = "debug" if self.settings.build_type == "Debug" else "release"
self.copy(pattern="*", dst="lib", src=os.path.join(self._source_subfolder, "build", config, "lib"))

tools.rmdir(os.path.join(self.package_folder, "lib", "cmake"))
tools.rmdir(os.path.join(self.package_folder, "lib", "pkgconfig"))

def package_info(self):
def package_info(self):
self.cpp_info.set_property("cmake_file_name", "aws-cdi-sdk")

self.cpp_info.set_property("cmake_target_aliases", ["aws-cdi-sdk"])

cpp_sdk = self.cpp_info.components["aws-cpp-sdk-cdi"]
cpp_sdk.set_property("cmake_target_name", "AWS::aws-cpp-sdk-cdi")
cpp_sdk.set_property("pkg_config_name", "aws-cpp-sdk-cdi")
cpp_sdk.libs = ["aws-cpp-sdk-cdi"]
cpp_sdk.requires = ["aws-sdk-cpp::monitoring", "aws-libfabric::aws-libfabric"]

c_sdk = self.cpp_info.components["cdisdk"]
c_sdk.set_property("cmake_target_name", "AWS::aws-cdi-sdk")
c_sdk.set_property("pkg_config_name", "aws-cdi-sdk")
c_sdk.libs = ["cdisdk"]
c_sdk.requires = ["aws-cpp-sdk-cdi"]
if self.settings.os in ["Linux", "FreeBSD"]:
c_sdk.defines = ["_LINUX"]
libcxx = stdcpp_library(self)
if libcxx:
c_sdk.system_libs.append(libcxx)

# TODO: to remove in conan v2 once cmake_find_package_* generators removed
# TODO: Remove the namespace on CMake targets
self.cpp_info.names["cmake_find_package"] = "AWS"
self.cpp_info.names["cmake_find_package_multi"] = "AWS"
self.cpp_info.filenames["cmake_find_package"] = "aws-cdi-sdk"
self.cpp_info.filenames["cmake_find_package_multi"] = "aws-cdi-sdk"

cppSdk = self.cpp_info.components["aws-cpp-sdk-cdi"]
cppSdk.libs = ["aws-cpp-sdk-cdi"]

cppSdk.requires = ["aws-sdk-cpp::monitoring", "aws-libfabric::aws-libfabric"]

cppSdk.set_property("cmake_target_name", "AWS::aws-cpp-sdk-cdi")
cppSdk.set_property("pkg_config_name", "aws-cpp-sdk-cdi")

# TODO: to remove in conan v2 once cmake_find_package_* generators removed
# TODO: Remove the namespace on CMake targets
cppSdk.names["cmake_find_package"] = "aws-cpp-sdk-cdi"
cppSdk.names["cmake_find_package_multi"] = "aws-cpp-sdk-cdi"
cppSdk.names["pkg_config"] = "aws-cpp-sdk-cdi"

cSdk = self.cpp_info.components["cdisdk"]
cSdk.libs = ["cdisdk"]
cSdk.requires = ["aws-cpp-sdk-cdi"]
if self.settings.os == "Linux":
cSdk.defines = ["_LINUX"]

cSdk.set_property("cmake_target_name", "AWS::aws-cdi-sdk")
cSdk.set_property("pkg_config_name", "aws-cdi-sdk")

# TODO: to remove in conan v2 once cmake_find_package_* generators removed
# TODO: Remove the namespace on CMake targets
cSdk.names["cmake_find_package"] = "aws-cdi-sdk"
cSdk.names["cmake_find_package_multi"] = "aws-cdi-sdk"
cSdk.names["pkg_config"] = "aws-cdi-sdk"

cpp_sdk.names["cmake_find_package"] = "aws-cpp-sdk-cdi"
cpp_sdk.names["cmake_find_package_multi"] = "aws-cpp-sdk-cdi"
c_sdk.names["cmake_find_package"] = "aws-cdi-sdk"
c_sdk.names["cmake_find_package_multi"] = "aws-cdi-sdk"
Loading
Loading