diff --git a/features/compatible_packages/app/CMakeLists.txt b/features/compatible_packages/app/CMakeLists.txt new file mode 100644 index 00000000..7399881c --- /dev/null +++ b/features/compatible_packages/app/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.15) +project(app) + +include(${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +add_executable(app src/main.cpp) +target_link_libraries(app ${CONAN_LIBS}) diff --git a/features/compatible_packages/app/conanfile.py b/features/compatible_packages/app/conanfile.py new file mode 100644 index 00000000..86bbd35b --- /dev/null +++ b/features/compatible_packages/app/conanfile.py @@ -0,0 +1,33 @@ +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" + + options = {'use_hidden': [True, False]} + default_options = {'use_hidden': False} + + def requirements(self): + if self.options.use_hidden: + self.requires("hidden/1.0") + else: + 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/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 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); +} 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); +}