conan.tools.layout

预定义布局

有一些预定义的通用 布局,可以直接在 recipe 中使用。

预定义布局使用典型的 C​​on​​an​​file .folders.cpp 属性进行设置。要检查这些预定义布局设置了哪些值,请查阅 layout() 方法的参考。例如,在 cmake_layout() 中,源代码文件夹设置为 ".",这意味着 Conan 将在 conanfile 所在的目录(最可能是项目根目录,通常会找到 CMakeLists.txt 文件)中查找源代码。如果您有一个不同的目录存放 CMakeLists.txt,您可以使用 src_folder 参数。

from conan.tools.cmake import cmake_layout

def layout(self):
    cmake_layout(self, src_folder="mysrcfolder")

即使这些预定义布局不适合您的特定项目布局,检查它们如何实现其逻辑也能展示如何实现您自己的逻辑(如果要在多个包中使用,最好将其放在公共的 python_require 中)。

要了解有关布局以及如何在开发包时使用它们的更多信息,请查看 Conan 包布局 教程

basic_layout

用法

from conan.tools.layout import basic_layout

def layout(self):
    basic_layout(self)

当前的布局实现非常简单,基本上为不同的 build_types 设置了不同的构建文件夹,并将生成器输出文件夹设置在构建文件夹内部。这样可以避免在本地工作时弄乱项目。如果您愿意,可以定义 build_folder 来控制目标文件夹,这样临时构建文件就不会污染源树。

def basic_layout(conanfile, src_folder=".", build_folder=None):
    subproject = conanfile.folders.subproject

    conanfile.folders.source = src_folder if not subproject else os.path.join(subproject, src_folder)
    if build_folder:
        conanfile.folders.build = build_folder if not subproject else os.path.join(subproject, build_folder)
    else:
        conanfile.folders.build = "build" if not subproject else os.path.join(subproject, "build")
        if conanfile.settings.get_safe("build_type"):
            conanfile.folders.build += "-{}".format(str(conanfile.settings.build_type).lower())
    conanfile.folders.generators = os.path.join(conanfile.folders.build, "conan")
    conanfile.cpp.build.bindirs = ["."]
    conanfile.cpp.build.libdirs = ["."]

    if not conanfile.cpp.source.includedirs:
        conanfile.cpp.source.includedirs = ["include"]