paddle构建过程阅读记录

261 阅读1分钟

基于paddle 2023.4左右的版本 使用python setup.py可以直接安装PaddlePaddle,首先其内部会先调用最外层的CMakeLists.txt(setup.py的build_steps()函数中调用)。 其最外层的CMake文件基本都是设置各种环境变量,最关键的代码就只有如下几行:

add_subdirectory(paddle)
add_subdirectory(python)
add_subdirectory(test)

paddle的cmake主要使用了cmake/generic.cmake目录下定义的cc_library、cc_binary和cc_test这三个函数,这三个函数分别用于生成库、二进制可执行文件以及用于UT的二进制可执行文件。

1. paddle目录下的cmake

该文件的内容也十分简单粗暴,如下所示:

set(PYTHON_TESTS_DIR
    ${PADDLE_BINARY_DIR}/python/paddle/fluid/tests
    CACHE INTERNAL "python tests directory")

add_subdirectory(utils)
add_subdirectory(ir)
add_subdirectory(scripts)
add_subdirectory(testing)
add_subdirectory(phi)
add_subdirectory(fluid)

1.1 paddle/utils目录下的cmake

该cmake同样简单粗暴,内容如下:

# 该库主要为了炫酷的log信息,不是重点,省略之。
add_subdirectory(string)
# 省略:各种添加UT的代码。。。。。。。
# 依赖./build/paddle/phi/libphi.a,
# 通过paddle/utils/pybind.cc编译./build/paddle/utils/libpybind_util.a
if(NOT ((NOT WITH_PYTHON) AND ON_INFER))
  cc_library(
    pybind_util
    SRCS pybind.cc
    DEPS phi)
endif()

pybind.cc里面定义了四个函数:PyCheckTensor、CastPyArg2Tensor、ToPyObject和EnableTensorOperantsToPhiMode。

1.2 paddle/ir目录下的cmake

ir相关,平台无关,暂不细究。

1.3 paddle/scripts目录下的cmake

内容如下:

#该sh脚本主要根据系统信息做一些类似export变量的操作,无需细究
configure_file(submit_local.sh.in paddle @ONLY)

install(
  FILES ${CMAKE_CURRENT_BINARY_DIR}/paddle
  DESTINATION bin
  PERMISSIONS
    OWNER_EXECUTE
    OWNER_WRITE
    OWNER_READ
    GROUP_EXECUTE
    GROUP_READ
    WORLD_EXECUTE
    WORLD_READ)

1.4 paddle/testing目录下的cmake

UT相关,不细究

1.5 paddle/phi目录下的cmake

主要作用是将该目录下的cpp源文件编译为相应的库libphi.a/libphi.so

1.6 paddle/fluid目录下的cmake

编译该目录下的各个库

2.python目录下的cmake

该cmake主要是处理和python相关的部分,比方说把一些py文件复制到build目录下,从而为后续的安装作准备、通过yaml文件生成算子相关的文件等、在特定的设置下生成whl包等。

3.test目录下的cmake

ut相关。不细究

cmake跑完之后,paddle相关的代码(包括py代码)就都位于build目录下了,可见setup的log,复制py文件都是从build目录复制的,如下图所示:

image.png