基于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目录复制的,如下图所示: