def _content_type(self, build_type): sections = [] # Per requirement variables for dep_name, dep_cpp_info in self.deps_build_info.dependencies: # Only the specific of the build_type dep_cpp_info = extend(dep_cpp_info, build_type) deps = DepsCppCmake(dep_cpp_info) dep_flags = cmake_dependency_vars(dep_name, deps=deps, build_type=build_type) sections.append(dep_flags) # GENERAL VARIABLES sections.append( "\n### Definition of global aggregated variables ###\n") all_flags = cmake_dependencies(dependencies=self.deps_build_info.deps, build_type=build_type) sections.append(all_flags) dep_cpp_info = extend(self.deps_build_info, build_type) deps = DepsCppCmake(dep_cpp_info) all_flags = cmake_global_vars(deps=deps, build_type=build_type) sections.append(all_flags) return "\n".join(sections)
def content_type(self): sections = [] # Per requirement variables for dep_name, dep_cpp_info in self.deps_build_info.dependencies: deps = DepsCppCmake(dep_cpp_info) dep_flags = cmake_single_dep_vars(dep_name, deps=deps, build_type=self.build_type) sections.append(dep_flags) # GENERAL VARIABLES deps = DepsCppCmake(self.deps_build_info) rootpaths = [ DepsCppCmake(dep_cpp_info).rootpath for _, dep_cpp_info in self.deps_build_info.dependencies ] all_flags = cmake_multi_dep_vars( deps=deps, root_paths=rootpaths, dependencies=self.deps_build_info.deps, name=self.conanfile.name, version=self.conanfile.version, build_type=self.build_type) sections.append( "\n### Definition of global aggregated variables ###\n") sections.append(all_flags) return "\n".join(sections)
def content(self): lines = [] # The CONAN_XXX_ROOT variables are needed because the FindXXX.cmake or XXXConfig.cmake # in a package could have been "patched" with the `cmake.patch_config_paths()` # replacing absolute paths with CONAN_XXX_ROOT variables. for name, dep_cpp_info in self.deps_build_info.dependencies: var_name = "CONAN_{}_ROOT".format( dep_cpp_info.get_name("cmake_paths", name).upper()) lines.append('set({} {})'.format( var_name, DepsCppCmake(dep_cpp_info).rootpath)) # We want to prioritize the FindXXX.cmake files: # 1. First the files found in the packages # 2. The previously set (by default CMAKE_MODULE_PATH is empty) # 3. The "install_folder" ones, in case there is no FindXXX.cmake, try with the install dir # if the user used the "cmake_find_package" will find the auto-generated # 4. The CMake installation dir/Modules ones. deps = DepsCppCmake(self.deps_build_info) lines.append( "set(CMAKE_MODULE_PATH {deps.build_paths} ${{CMAKE_MODULE_PATH}} " "${{CMAKE_CURRENT_LIST_DIR}})".format(deps=deps)) lines.append( "set(CMAKE_PREFIX_PATH {deps.build_paths} ${{CMAKE_PREFIX_PATH}} " "${{CMAKE_CURRENT_LIST_DIR}})".format(deps=deps)) return "\n".join(lines)
def _get_components(self, pkg_name, cpp_info): components = super(CMakeFindPackageGenerator, self)._get_components(pkg_name, cpp_info) ret = [] for comp_genname, comp, comp_requires_gennames in components: deps_cpp_cmake = DepsCppCmake(comp) deps_cpp_cmake.public_deps = " ".join( ["{}::{}".format(*it) for it in comp_requires_gennames]) ret.append((comp_genname, deps_cpp_cmake)) return ret
def _get_components(self, pkg_name, pkg_findname, cpp_info): find_package_components = [] for comp_name, comp in self.sorted_components(cpp_info).items(): comp_findname = self._get_name(cpp_info.components[comp_name]) deps_cpp_cmake = DepsCppCmake(comp) deps_cpp_cmake.public_deps = self._get_component_requires( pkg_name, pkg_findname, comp) find_package_components.append((comp_findname, deps_cpp_cmake)) find_package_components.reverse( ) # From the less dependent to most one return find_package_components
def _find_for_dep(self, name, cpp_info): deps = DepsCppCmake(cpp_info) lines = [] if cpp_info.public_deps: # Here we are generating FindXXX, so find_modules=True public_deps_names = [ self.deps_build_info[dep].get_name("cmake_find_package") for dep in cpp_info.public_deps ] lines = find_dependency_lines(name, public_deps_names, find_modules=True) find_package_header_block = find_package_header.format( name=name, version=cpp_info.version) find_libraries_block = target_template.format(name=name, deps=deps, build_type_suffix="") target_props = assign_target_properties.format(name=name, deps=deps) tmp = self.template.format( name=name, deps=deps, version=cpp_info.version, find_dependencies_block="\n".join(lines), find_libraries_block=find_libraries_block, find_package_header_block=find_package_header_block, assign_target_properties_block=target_props) return tmp
def _get_cmake_definitions(self): """ Detect all definitions conan sends to cmake by command line and convert them to cmake commands. Removes the CONAN_EXPORTED definition, so that users may check if conan has been invoked or not. :return: List of lines to print into a cmake file """ with get_env_context_manager(self.conanfile): ret = ["\t\t\"cmakeSettings\": {"] generator = get_generator(self.conanfile.settings) self.conanfile.install_folder = "" def_builder = CMakeDefinitionsBuilder(self.conanfile, generator=generator) definitions = def_builder.get_definitions(None) for name, value in definitions.items(): ret.append("\t\t\t\"{name}\": \"{value}\",".format( name=name, value=value)) deps = [] for _, dep_cpp_info in self.deps_build_info.dependencies: deps.append("\t\t\t\t\t" + DepsCppCmake(dep_cpp_info).rootpath) deps[:-1] = [line + "," for line in deps[:-1]] ret.append("\t\t\t\"CMAKE_PREFIX_PATH\": [") ret.extend(deps) ret.append("\t\t\t],") ret.append("\t\t\t\"CMAKE_MODULE_PATH\": [") ret.extend(deps) ret.append("\t\t\t]") return ret
def content(self): ret = {} build_type = str(self.conanfile.settings.build_type) build_type_suffix = "_{}".format( build_type.upper()) if build_type else "" for _, cpp_info in self.deps_build_info.dependencies: # If any config matches the build_type one, add it to the cpp_info dep_cpp_info = extend(cpp_info, build_type.lower()) depname = cpp_info.get_name("cmake_find_package_multi") ret["{}Config.cmake".format(depname)] = self._find_for_dep( depname, dep_cpp_info) ret["{}Targets.cmake".format(depname)] = self.targets_file.format( name=depname) deps = DepsCppCmake(dep_cpp_info) public_deps_names = [ self.deps_build_info[dep].get_name("cmake_find_package_multi") for dep in cpp_info.public_deps ] find_lib = target_template.format( name=depname, deps=deps, build_type_suffix=build_type_suffix, deps_names=";".join( ["{n}::{n}".format(n=n) for n in public_deps_names])) ret["{}Target-{}.cmake".format(depname, build_type.lower())] = find_lib ret["{}ConfigVersion.cmake".format(depname)] = self.version_template.\ format(version=dep_cpp_info.version) return ret
def _single_find_package(name, cpp_info): deps = DepsCppCmake(cpp_info) lines = [] if cpp_info.public_deps: lines = CMakeFindPackageGenerator._transitive_lines(name, cpp_info) tmp = generic_find_package_template.format( name=name, deps=deps, find_dependencies="\n".join(lines)) return tmp
def content(self): deps = DepsCppCmake(self.deps_build_info) # We want to prioritize the FindXXX.cmake files: # 1. First the files found in the packages # 2. The previously set (by default CMAKE_MODULE_PATH is empty) # 3. The "install_folder" ones, in case there is no FindXXX.cmake, try with the install dir # if the user used the "cmake_find_package" will find the auto-generated # 4. The CMake installation dir/Modules ones. return """set(CMAKE_MODULE_PATH {deps.build_paths} ${{CMAKE_MODULE_PATH}} ${{CMAKE_CURRENT_LIST_DIR}}) set(CMAKE_PREFIX_PATH {deps.build_paths} ${{CMAKE_PREFIX_PATH}} ${{CMAKE_CURRENT_LIST_DIR}}) """.format(deps=deps)
def content(self): ret = {} build_type = self.conanfile.settings.get_safe("build_type") build_type_suffix = "_{}".format( build_type.upper()) if build_type else "" for depname, cpp_info in self.deps_build_info.dependencies: deps = DepsCppCmake(cpp_info) ret["{}Config.cmake".format(depname)] = self._find_for_dep( depname, cpp_info) find_lib = target_template.format( name=depname, deps=deps, build_type_suffix=build_type_suffix) ret["{}Targets.cmake".format(depname)] = self.targets_file.format( name=depname) ret["{}Target-{}.cmake".format(depname, build_type.lower())] = find_lib return ret
def _find_for_dep(self, name, cpp_info): # The common macros macros_and_functions = "\n".join([ CMakeFindPackageCommonMacros.conan_message, CMakeFindPackageCommonMacros.apple_frameworks_macro, CMakeFindPackageCommonMacros.conan_package_library_targets, ]) # compose the cpp_info with its "debug" or "release" specific config dep_cpp_info = cpp_info build_type = self.conanfile.settings.get_safe("build_type") if build_type: dep_cpp_info = extend(dep_cpp_info, build_type.lower()) # The find_libraries_block, all variables for the package, and creation of targets public_deps_names = [ self.deps_build_info[dep].get_name("cmake_find_package") for dep in dep_cpp_info.public_deps ] deps_names = ";".join( ["{n}::{n}".format(n=n) for n in public_deps_names]) deps = DepsCppCmake(dep_cpp_info) find_libraries_block = target_template.format(name=name, deps=deps, build_type_suffix="", deps_names=deps_names) # The find_transitive_dependencies block find_dependencies_block = "" if dep_cpp_info.public_deps: # Here we are generating FindXXX, so find_modules=True f = find_transitive_dependencies(public_deps_names, find_modules=True) # proper indentation find_dependencies_block = ''.join(" " + line if line.strip() else line for line in f.splitlines(True)) tmp = self.find_template.format( name=name, version=dep_cpp_info.version, find_libraries_block=find_libraries_block, find_dependencies_block=find_dependencies_block, macros_and_functions=macros_and_functions) return tmp
def _find_for_dep(self, name, cpp_info): deps = DepsCppCmake(cpp_info) lines = [] if cpp_info.public_deps: lines = find_dependency_lines(name, cpp_info) find_package_header_block = find_package_header.format( name=name, version=cpp_info.version) find_libraries_block = target_template.format(name=name, deps=deps, build_type_suffix="") target_props = assign_target_properties.format(name=name, deps=deps) tmp = self.template.format( name=name, deps=deps, version=cpp_info.version, find_dependencies_block="\n".join(lines), find_libraries_block=find_libraries_block, find_package_header_block=find_package_header_block, assign_target_properties_block=target_props) return tmp
def _find_for_dep(self, name, cpp_info): dep_cpp_info = cpp_info build_type = self.conanfile.settings.get_safe("build_type") if build_type: dep_cpp_info = extend(dep_cpp_info, build_type.lower()) deps = DepsCppCmake(dep_cpp_info) lines = [] public_deps_names = [ self.deps_build_info[dep].get_name("cmake_find_package") for dep in dep_cpp_info.public_deps ] if dep_cpp_info.public_deps: # Here we are generating FindXXX, so find_modules=True lines = find_dependency_lines(public_deps_names, find_modules=True) find_package_header_block = find_package_header.format( name=name, version=dep_cpp_info.version) deps_names = ";".join( ["{n}::{n}".format(n=n) for n in public_deps_names]) find_libraries_block = target_template.format(name=name, deps=deps, build_type_suffix="", deps_names=deps_names) target_props = assign_target_properties.format(name=name, deps=deps, deps_names=deps_names) tmp = self.template.format( name=name, deps=deps, version=dep_cpp_info.version, find_dependencies_block="\n ".join(lines), find_libraries_block=find_libraries_block, find_package_header_block=find_package_header_block, assign_target_properties_block=target_props, macros_and_functions="\n".join([ CMakeFindPackageCommonMacros.conan_message, CMakeFindPackageCommonMacros.apple_frameworks_macro, CMakeFindPackageCommonMacros.conan_package_library_targets, ])) return tmp
def content(self): ret = {} build_type = str(self.conanfile.settings.build_type).upper() build_type_suffix = "_{}".format( self.configuration.upper()) if self.configuration else "" for pkg_name, cpp_info in self.deps_build_info.dependencies: self._validate_components(cpp_info) pkg_filename = self._get_filename(cpp_info) pkg_findname = self._get_name(cpp_info) pkg_namespace = pkg_findname pkg_version = cpp_info.version public_deps = self.get_public_deps(cpp_info) deps_names = [] for it in public_deps: name = "{}::{}".format(*self._get_require_name(*it)) if name not in deps_names: deps_names.append(name) deps_names = ';'.join(deps_names) pkg_public_deps_filenames = [ self._get_filename(self.deps_build_info[it[0]]) for it in public_deps ] config_version = self.config_version_template.format( version=pkg_version) ret[self._config_version_filename(pkg_filename)] = config_version if not cpp_info.components: ret[self._config_filename(pkg_filename)] = self._config( filename=pkg_filename, name=pkg_findname, namespace=pkg_namespace, version=cpp_info.version, public_deps_names=pkg_public_deps_filenames) ret["{}Targets.cmake".format( pkg_filename)] = self.targets_template.format( filename=pkg_filename, name=pkg_findname, namespace=pkg_namespace) # If any config matches the build_type one, add it to the cpp_info dep_cpp_info = extend(cpp_info, build_type.lower()) deps = DepsCppCmake(dep_cpp_info, self.name) find_lib = target_template.format( name=pkg_findname, deps=deps, build_type_suffix=build_type_suffix, deps_names=deps_names) ret["{}Target-{}.cmake".format( pkg_filename, self.configuration.lower())] = find_lib else: cpp_info = extend(cpp_info, build_type.lower()) pkg_info = DepsCppCmake(cpp_info, self.name) components = self._get_components(pkg_name, cpp_info) # Note these are in reversed order, from more dependent to less dependent pkg_components = " ".join([ "{p}::{c}".format(p=pkg_namespace, c=comp_findname) for comp_findname, _ in reversed(components) ]) global_target_variables = target_template.format( name=pkg_findname, deps=pkg_info, build_type_suffix=build_type_suffix, deps_names=deps_names) variables = self.components_target_build_type_tpl.render( pkg_name=pkg_findname, global_target_variables=global_target_variables, pkg_components=pkg_components, build_type=build_type, components=components, conan_find_apple_frameworks=CMakeFindPackageCommonMacros. apple_frameworks_macro, conan_package_library_targets=CMakeFindPackageCommonMacros. conan_package_library_targets) ret["{}Target-{}.cmake".format(pkg_filename, build_type.lower())] = variables targets = self.components_targets_tpl.render( pkg_name=pkg_findname, namespace=pkg_namespace, pkg_filename=pkg_filename, components=components, build_type=build_type) ret["{}Targets.cmake".format(pkg_filename)] = targets target_config = self.components_config_tpl.render( pkg_name=pkg_findname, namespace=pkg_namespace, pkg_filename=pkg_filename, components=components, pkg_public_deps=pkg_public_deps_filenames, conan_message=CMakeFindPackageCommonMacros.conan_message, configs=self.configurations) ret[self._config_filename(pkg_filename)] = target_config return ret
def _find_for_dep(self, pkg_name, pkg_findname, pkg_filename, cpp_info): # return the content of the FindXXX.cmake file for the package "pkg_name" self._validate_components(cpp_info) public_deps = self.get_public_deps(cpp_info) deps_names = ';'.join(["{}::{}".format(*self._get_require_name(*it)) for it in public_deps]) pkg_public_deps_filenames = [self._get_filename(self.deps_build_info[it[0]]) for it in public_deps] pkg_version = cpp_info.version if cpp_info.components: components = self._get_components(pkg_name, cpp_info) # Note these are in reversed order, from more dependent to less dependent pkg_components = " ".join(["{p}::{c}".format(p=pkg_findname, c=comp_findname) for comp_findname, _ in reversed(components)]) pkg_info = DepsCppCmake(cpp_info) global_target_variables = target_template.format(name=pkg_findname, deps=pkg_info, build_type_suffix="", deps_names=deps_names) return self.find_components_tpl.render( pkg_name=pkg_findname, pkg_filename=pkg_filename, pkg_version=pkg_version, pkg_components=pkg_components, global_target_variables=global_target_variables, pkg_public_deps_filenames=pkg_public_deps_filenames, components=components, conan_message=CMakeFindPackageCommonMacros.conan_message, conan_find_apple_frameworks=CMakeFindPackageCommonMacros.apple_frameworks_macro, conan_package_library_targets=CMakeFindPackageCommonMacros.conan_package_library_targets) else: # The common macros macros_and_functions = "\n".join([ CMakeFindPackageCommonMacros.conan_message, CMakeFindPackageCommonMacros.apple_frameworks_macro, CMakeFindPackageCommonMacros.conan_package_library_targets, ]) # compose the cpp_info with its "debug" or "release" specific config dep_cpp_info = cpp_info build_type = self.conanfile.settings.get_safe("build_type") if build_type: dep_cpp_info = extend(dep_cpp_info, build_type.lower()) # The find_libraries_block, all variables for the package, and creation of targets deps = DepsCppCmake(dep_cpp_info) find_libraries_block = target_template.format(name=pkg_findname, deps=deps, build_type_suffix="", deps_names=deps_names) # The find_transitive_dependencies block find_dependencies_block = "" if pkg_public_deps_filenames: # Here we are generating FindXXX, so find_modules=True f = find_transitive_dependencies(pkg_public_deps_filenames, find_modules=True) # proper indentation find_dependencies_block = ''.join(" " + line if line.strip() else line for line in f.splitlines(True)) return self.find_template.format(name=pkg_findname, version=pkg_version, filename=pkg_filename, find_libraries_block=find_libraries_block, find_dependencies_block=find_dependencies_block, macros_and_functions=macros_and_functions)
def content(self): ret = {} build_type = str(self.conanfile.settings.build_type).upper() build_type_suffix = "_{}".format(build_type) if build_type else "" for pkg_name, cpp_info in self.deps_build_info.dependencies: pkg_filename = self._get_filename(cpp_info) pkg_findname = self._get_name(cpp_info) pkg_version = cpp_info.version pkg_public_deps_names = [ self._get_name(self.deps_build_info[public_dep]) for public_dep in cpp_info.public_deps ] pkg_public_deps_filenames = [ self._get_filename(self.deps_build_info[public_dep]) for public_dep in cpp_info.public_deps ] ret["{}ConfigVersion.cmake".format(pkg_filename)] = self.config_version_template. \ format(version=pkg_version) if not cpp_info.components: public_deps_names = [{ "name": self.deps_build_info[dep].get_name( "cmake_find_package_multi"), "filename": self.deps_build_info[dep].get_filename( "cmake_find_package_multi") } for dep in cpp_info.public_deps] ret["{}Config.cmake".format(pkg_filename)] = self._config( filename=pkg_filename, name=pkg_findname, version=cpp_info.version, public_deps_names=pkg_public_deps_filenames) ret["{}Targets.cmake".format( pkg_filename)] = self.targets_template.format( filename=pkg_filename, name=pkg_findname) # If any config matches the build_type one, add it to the cpp_info dep_cpp_info = extend(cpp_info, build_type.lower()) deps = DepsCppCmake(dep_cpp_info) deps_names = ";".join([ "{n}::{n}".format(n=n['name']) for n in public_deps_names ]) find_lib = target_template.format( name=pkg_findname, deps=deps, build_type_suffix=build_type_suffix, deps_names=deps_names) ret["{}Target-{}.cmake".format(pkg_filename, build_type.lower())] = find_lib else: cpp_info = extend(cpp_info, build_type.lower()) pkg_info = DepsCppCmake(cpp_info) deps_names = ";".join( ["{n}::{n}".format(n=n) for n in pkg_public_deps_names]) components = self._get_components(pkg_name, pkg_findname, cpp_info) # Note these are in reversed order, from more dependent to less dependent pkg_components = " ".join([ "{p}::{c}".format(p=pkg_findname, c=comp_findname) for comp_findname, _ in reversed(components) ]) global_target_variables = target_template.format( name=pkg_findname, deps=pkg_info, build_type_suffix=build_type_suffix, deps_names=deps_names) variables = self.components_target_build_type_tpl.render( pkg_name=pkg_findname, global_target_variables=global_target_variables, pkg_components=pkg_components, build_type=build_type, components=components, conan_find_apple_frameworks=CMakeFindPackageCommonMacros. apple_frameworks_macro, conan_package_library_targets=CMakeFindPackageCommonMacros. conan_package_library_targets) ret["{}Target-{}.cmake".format(pkg_filename, build_type.lower())] = variables targets = self.components_targets_tpl.render( pkg_name=pkg_findname, pkg_filename=pkg_filename, components=components, build_type=build_type) ret["{}Targets.cmake".format(pkg_filename)] = targets target_config = self.components_config_tpl.render( pkg_name=pkg_findname, pkg_filename=pkg_filename, components=components, pkg_public_deps=pkg_public_deps_filenames, conan_message=CMakeFindPackageCommonMacros.conan_message) ret["{}Config.cmake".format(pkg_filename)] = target_config return ret