From 0277839cfbef94b09c980a1d7eefa91fe060b355 Mon Sep 17 00:00:00 2001 From: jgsogo Date: Sat, 12 Dec 2020 17:16:02 +0100 Subject: [PATCH 1/3] initial --- .../compatible_packages/app/CMakeLists.txt | 9 ++++ features/compatible_packages/app/conanfile.py | 27 ++++++++++++ features/compatible_packages/app/src/main.cpp | 7 ++++ .../library/CMakeLists.txt | 8 ++++ .../compatible_packages/library/conanfile.py | 42 +++++++++++++++++++ .../library/include/mylib.h | 2 + .../compatible_packages/library/src/mylib.cpp | 8 ++++ 7 files changed, 103 insertions(+) create mode 100644 features/compatible_packages/app/CMakeLists.txt create mode 100644 features/compatible_packages/app/conanfile.py create mode 100644 features/compatible_packages/app/src/main.cpp create mode 100644 features/compatible_packages/library/CMakeLists.txt create mode 100644 features/compatible_packages/library/conanfile.py create mode 100644 features/compatible_packages/library/include/mylib.h create mode 100644 features/compatible_packages/library/src/mylib.cpp diff --git a/features/compatible_packages/app/CMakeLists.txt b/features/compatible_packages/app/CMakeLists.txt new file mode 100644 index 00000000..880ed067 --- /dev/null +++ b/features/compatible_packages/app/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.15) +project(app) + +include(${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +find_package(library) +add_executable(app src/main.cpp) +target_link_libraries(app library::library) diff --git a/features/compatible_packages/app/conanfile.py b/features/compatible_packages/app/conanfile.py new file mode 100644 index 00000000..b6cbb669 --- /dev/null +++ b/features/compatible_packages/app/conanfile.py @@ -0,0 +1,27 @@ +from conans import ConanFile, tools, CMake +from conans.errors import ConanInvalidConfiguration + + +class Recipe(ConanFile): + name = "app" + version = "1.0" + + settings = "os", "compiler", "build_type", "arch" + license = "MIT" + author = "Conan Team" + description = "App, requires nothing special" + + generators = "cmake", "cmake_find_package" + exports_sources = "CMakeLists.txt", "src/main.cpp" + + def requirements(self): + self.requires("library/1.0") + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def package(self): + self.copy("app*", dst="bin", src="bin", keep_path=False) + self.copy("LICENSE", dst="licenses", src=".", keep_path=False) diff --git a/features/compatible_packages/app/src/main.cpp b/features/compatible_packages/app/src/main.cpp new file mode 100644 index 00000000..351e0b37 --- /dev/null +++ b/features/compatible_packages/app/src/main.cpp @@ -0,0 +1,7 @@ + +#include +#include + +int main() { + std::cout << "compute(10, 2) = " << compute(10, 2) << std::endl; +} diff --git a/features/compatible_packages/library/CMakeLists.txt b/features/compatible_packages/library/CMakeLists.txt new file mode 100644 index 00000000..7c309fe9 --- /dev/null +++ b/features/compatible_packages/library/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.15) +project(mylib) + +include(${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +add_library(mylib src/mylib.cpp) diff --git a/features/compatible_packages/library/conanfile.py b/features/compatible_packages/library/conanfile.py new file mode 100644 index 00000000..10abb7ab --- /dev/null +++ b/features/compatible_packages/library/conanfile.py @@ -0,0 +1,42 @@ +from conans import ConanFile, tools, CMake +from conans.errors import ConanInvalidConfiguration + + +class Recipe(ConanFile): + name = "library" + version = "1.0" + + settings = "os", "compiler", "build_type", "arch" + license = "MIT" + author = "Conan Team" + description = "Library requires C++14 to build, but API is C++11 compatible" + + generators = "cmake" + exports_sources = "CMakeLists.txt", "src/mylib.cpp", "include/mylib.h" + + def configure(self): + tools.check_min_cppstd(self, "11") + + def validate(self): + tools.check_min_cppstd(self, "14") + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def package(self): + self.copy("*.h", dst="include", src="include", keep_path=False) + self.copy("*.lib", dst="lib", src="lib", keep_path=False) + self.copy("*.a", dst="lib", src="lib", keep_path=False) + self.copy("LICENSE", dst="licenses", src=".", keep_path=False) + + def package_info(self): + self.cpp_info.libs = ["mylib"] + + def package_id(self): + for cppstd in ("11", "14", "17", "20"): + for gnu in ("", "gnu"): + compatible_pkg = self.info.clone() + compatible_pkg.settings.compiler.cppstd = "{}{}".format(gnu, cppstd) + self.compatible_packages.append(compatible_pkg) diff --git a/features/compatible_packages/library/include/mylib.h b/features/compatible_packages/library/include/mylib.h new file mode 100644 index 00000000..dfd58b07 --- /dev/null +++ b/features/compatible_packages/library/include/mylib.h @@ -0,0 +1,2 @@ + +auto compute(int a, float b) -> float; diff --git a/features/compatible_packages/library/src/mylib.cpp b/features/compatible_packages/library/src/mylib.cpp new file mode 100644 index 00000000..db26b3f4 --- /dev/null +++ b/features/compatible_packages/library/src/mylib.cpp @@ -0,0 +1,8 @@ + +#include +#include "../include/mylib.h" + +auto compute(int a, float b) -> float { + auto p = std::make_pair(a, b); + return std::get(p)/std::get(p); +} From 8d8c26fa7b11aa132f5ce6c4ad538156e432e786 Mon Sep 17 00:00:00 2001 From: jgsogo Date: Sat, 12 Dec 2020 17:19:27 +0100 Subject: [PATCH 2/3] wait to handle return errors --- features/compatible_packages/build.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100755 features/compatible_packages/build.sh diff --git a/features/compatible_packages/build.sh b/features/compatible_packages/build.sh new file mode 100755 index 00000000..89d9a5ee --- /dev/null +++ b/features/compatible_packages/build.sh @@ -0,0 +1,7 @@ +set -x +set -e + +conan export library/conanfile.py library/1.0@ +conan export app/conanfile.py app/1.0@ + +conan install app/1.0@ --build=missing From ac10d09c5a7d76ed3054e34df45a68cedbd2a182 Mon Sep 17 00:00:00 2001 From: jgsogo Date: Sat, 12 Dec 2020 18:23:30 +0100 Subject: [PATCH 3/3] a hidden library --- .../compatible_packages/app/CMakeLists.txt | 3 +- features/compatible_packages/app/conanfile.py | 8 +++- .../compatible_packages/hidden/CMakeLists.txt | 10 +++++ .../compatible_packages/hidden/conanfile.py | 44 +++++++++++++++++++ .../hidden/include/mylib.h | 2 + .../compatible_packages/hidden/src/mylib.cpp | 8 ++++ 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 features/compatible_packages/hidden/CMakeLists.txt create mode 100644 features/compatible_packages/hidden/conanfile.py create mode 100644 features/compatible_packages/hidden/include/mylib.h create mode 100644 features/compatible_packages/hidden/src/mylib.cpp diff --git a/features/compatible_packages/app/CMakeLists.txt b/features/compatible_packages/app/CMakeLists.txt index 880ed067..7399881c 100644 --- a/features/compatible_packages/app/CMakeLists.txt +++ b/features/compatible_packages/app/CMakeLists.txt @@ -4,6 +4,5 @@ project(app) include(${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() -find_package(library) add_executable(app src/main.cpp) -target_link_libraries(app library::library) +target_link_libraries(app ${CONAN_LIBS}) diff --git a/features/compatible_packages/app/conanfile.py b/features/compatible_packages/app/conanfile.py index b6cbb669..86bbd35b 100644 --- a/features/compatible_packages/app/conanfile.py +++ b/features/compatible_packages/app/conanfile.py @@ -14,8 +14,14 @@ class Recipe(ConanFile): generators = "cmake", "cmake_find_package" exports_sources = "CMakeLists.txt", "src/main.cpp" + options = {'use_hidden': [True, False]} + default_options = {'use_hidden': False} + def requirements(self): - self.requires("library/1.0") + if self.options.use_hidden: + self.requires("hidden/1.0") + else: + self.requires("library/1.0") def build(self): cmake = CMake(self) diff --git a/features/compatible_packages/hidden/CMakeLists.txt b/features/compatible_packages/hidden/CMakeLists.txt new file mode 100644 index 00000000..30008d85 --- /dev/null +++ b/features/compatible_packages/hidden/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.15) +project(mylib) + +include(${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +add_library(mylib src/mylib.cpp) diff --git a/features/compatible_packages/hidden/conanfile.py b/features/compatible_packages/hidden/conanfile.py new file mode 100644 index 00000000..24e30b33 --- /dev/null +++ b/features/compatible_packages/hidden/conanfile.py @@ -0,0 +1,44 @@ +from conans import ConanFile, tools, CMake +from conans.errors import ConanInvalidConfiguration + + +class Recipe(ConanFile): + name = "hidden" + version = "1.0" + + settings = "os", "compiler", "build_type", "arch" + license = "MIT" + author = "Conan Team" + description = "Library requires C++14 to build, but API is C++11 compatible" + + generators = "cmake" + exports_sources = "CMakeLists.txt", "src/mylib.cpp", "include/mylib.h" + + def configure(self): + if self.settings.compiler.get_safe('cppstd'): + tools.check_min_cppstd(self, "11") + + def validate(self): + if self.settings.compiler.get_safe('cppstd'): + tools.check_min_cppstd(self, "14") + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def package(self): + self.copy("*.h", dst="include", src="include", keep_path=False) + self.copy("*.lib", dst="lib", src="lib", keep_path=False) + self.copy("*.a", dst="lib", src="lib", keep_path=False) + self.copy("LICENSE", dst="licenses", src=".", keep_path=False) + + def package_info(self): + self.cpp_info.libs = ["mylib"] + + def package_id(self): + for cppstd in ("11", "14", "17", "20"): + for gnu in ("", "gnu"): + compatible_pkg = self.info.clone() + compatible_pkg.settings.compiler.cppstd = "{}{}".format(gnu, cppstd) + self.compatible_packages.append(compatible_pkg) diff --git a/features/compatible_packages/hidden/include/mylib.h b/features/compatible_packages/hidden/include/mylib.h new file mode 100644 index 00000000..dfd58b07 --- /dev/null +++ b/features/compatible_packages/hidden/include/mylib.h @@ -0,0 +1,2 @@ + +auto compute(int a, float b) -> float; diff --git a/features/compatible_packages/hidden/src/mylib.cpp b/features/compatible_packages/hidden/src/mylib.cpp new file mode 100644 index 00000000..db26b3f4 --- /dev/null +++ b/features/compatible_packages/hidden/src/mylib.cpp @@ -0,0 +1,8 @@ + +#include +#include "../include/mylib.h" + +auto compute(int a, float b) -> float { + auto p = std::make_pair(a, b); + return std::get(p)/std::get(p); +}