Example #1
0
 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
Example #2
0
    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
Example #3
0
    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 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
Example #5
0
 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
Example #6
0
    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
Example #8
0
    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