conan.tools.layout¶
预定义的布局¶
有一些预定义的通用 布局,可以直接在 recipe 中使用。
cmake_layout():一个典型 CMake 项目的布局vs_layout():一个典型 Visual Studio 项目的布局basic_layout():一个非常基础的通用项目布局
预定义的布局使用典型的 .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"]