1from conans import ConanFile, CMake, tools 2from conans.errors import ConanException 3import os 4 5 6class FruitConan(ConanFile): 7 name = "fruit" 8 version = "3.7.1" 9 license = "Apache" 10 url = "https://github.com/google/fruit" 11 homepage = "https://github.com/google/fruit" 12 description = "C++ dependency injection framework" 13 settings = "os", "compiler", "build_type", "arch" 14 options = {"shared": [True, False], "use_boost": [True, False]} 15 default_options = {"shared": False, "use_boost": True} 16 generators = "cmake" 17 exports = "COPYING" 18 _source_subfolder = "source_subfolder" 19 _cmake = None 20 21 def configure(self): 22 min_version = { 23 "gcc": 5, 24 "clang": 3.5, 25 "apple-clang": 7.3, 26 "Visual Studio": 14, # MSVC 2015 27 }.get(str(self.settings.compiler)) 28 if not min_version: 29 # Unknown minimum version, let's try going ahead with the build to see if it works. 30 return 31 if float(str(self.settings.compiler.version)) < min_version: 32 raise ConanException("%s %s is not supported, must be at least %s" % (self.settings.compiler, 33 self.settings.compiler.version, 34 min_version)) 35 36 def build_requirements(self): 37 if self.options.use_boost: 38 self.build_requires("boost/1.68.0@conan/stable") 39 40 def source(self): 41 tools.get("{0}/archive/v{1}.tar.gz".format(self.homepage, self.version)) 42 extracted_dir = self.name + "-" + self.version 43 os.rename(extracted_dir, self._source_subfolder) 44 45 def _configure_cmake(self): 46 if not self._cmake: 47 self._cmake = CMake(self) 48 self._cmake.definitions["FRUIT_IS_BEING_BUILT_BY_CONAN"] = "YES" 49 self._cmake.definitions["BUILD_SHARED_LIBS"] = "YES" if self.options.shared else "NO" 50 self._cmake.definitions["FRUIT_USES_BOOST"] = self.options.use_boost 51 if self.options.use_boost: 52 self._cmake.definitions["Boost_INCLUDE_DIR"] = os.path.join( 53 self.deps_cpp_info["boost"].rootpath, "include") 54 if self.settings.os == "Windows": 55 self._cmake.definitions["FRUIT_TESTS_USE_PRECOMPILED_HEADERS"] = "NO" 56 self._cmake.definitions["CMAKE_BUILD_TYPE"] = self.settings.build_type 57 self._cmake.configure(source_folder=self._source_subfolder) 58 59 return self._cmake 60 61 def build(self): 62 cmake = self._configure_cmake() 63 cmake.build() 64 65 def package(self): 66 cmake = self._configure_cmake() 67 cmake.install() 68 69 self.copy("COPYING", dst="licenses", ignore_case=True, keep_path=False, 70 src=self._source_subfolder) 71 72 def package_info(self): 73 self.cpp_info.libs = tools.collect_libs(self) 74