Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
 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
Example #5
0
 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
Example #6
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
    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
Example #8
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 #9
0
 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
Example #10
0
    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
Example #12
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
Example #13
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 #14
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 #16
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