Neutree / c_cpp_project_framework

CMake build system( framework) with kconfig support for C/CPP projects
https://neucrack.com/p/276
MIT License
159 stars 38 forks source link

怎样给 toolchain 文件传递参数 #9

Closed skb666 closed 9 months ago

skb666 commented 9 months ago

当使用 --toolchain 指定文件时,是否有方法给该 .cmake 文件传递参数

场景

Android 平台 termux 下该模板配合 vcpkg 进行使用,指定 --toolchain${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake

使用 cmake 编译时,我可以这样进行参数传递:

cmake -S. -Bbuild -DVCPKG_HOST_TRIPLET=arm64-linux -DVCPKG_TARGET_TRIPLET=arm64-linux 

但使用 project.py build 时,使用以下命令进行构建时会显示帮助信息,不能成功构建:

./project.py build -DVCPKG_HOST_TRIPLET=arm64-linux -DVCPKG_TARGET_TRIPLET=arm64-linux

尝试及想法

通过修改 tools/cmake/project.py 中参数的解析方式:

# project_args = project_parser.parse_args()
project_args, other_args = project_parser.parse_known_args()

然后在 build 的处理中,将 other_args 里的参数补充传递给 cmake 去执行,使得可以使用上面的命令构建成功。

但是在 ./project.py build 时传参感觉不是那么优雅,怎样才可以使参数传递这个步骤在 ./project.py config 时完成

skb666 commented 9 months ago

是否可以让 cmake -S. -Bbuild ... 这一步在 config 时就完成(即在 config 时 完成 Makefile 的生成)

menuconfig 这步配置的项 应该只作用于编译时程序中读取的吧

Neutree commented 9 months ago
  1. menuconfig 生成的配置在 globalconfig.cmake 中,会在找到所有组件后被 include 进 compile.cmake,而且变量全部都会被加上 CONFIG 前缀,不太确定 toolchain.cmake 能不能稳定读取到,可以用 message() 打印试试
  2. 直接给 project.py 加对参数 -D 的支持,然后在调用 cmake命令的时候传进去我觉得是可行的,只是和 cmake 命令一样每次都要填参数
  3. 我最初加 config 命令的初衷是配置工具链使得 distclean 命令也不会清理掉 config 命令配置的参数,实际上将参数暂存在 .config.cmake 中,最后也是合并生成到 global_config.cmake 里面,和 1 类似,只是 distclean 命令不会删除 .config.cmake 文件。 当然,也可以考虑改一下将 config 的参数都在执行 cmake 命令的时候传进去。
  4. 还有一种方法是设置环境变量,在 toolchain.cmake 中通过 $ENV{VAR_NAME} 获取,不过用起来也不算很舒服

所以综上,

skb666 commented 9 months ago
cmake -S. -Bbuild -DVCPKG_HOST_TRIPLET=arm64-linux -DVCPKG_TARGET_TRIPLET=arm64-linux 

用于生成 Makefile;使用 python 时生成 Makefile 发生在这一步

./project.py build -DVCPKG_HOST_TRIPLET=arm64-linux -DVCPKG_TARGET_TRIPLET=arm64-linux

且修改文件后第二次构建时可以直接 ./project.py build

这个传递的不是全局变量,是 cmake 变量,键、值都外部指定;这么一看,build 支持传入参数已经挺 ok 了!!! :)

Neutree commented 9 months ago

确实,有道理,只需要在 build 时传入就好了,一旦生成了makefile就不需要传参了。 但是这样在调用 rebuild 时还是需要传入参数,可能需要小心容易忘记传入而出错

skb666 commented 9 months ago

测试了一下,./project.py rebuild 不额外传入参数也可以成功构建,./project.py clean./project.py build 不带参数也可以成功构建! 对于 vcpkg.cmake,传入参数是为了自动 install 依赖的包;./project.py clean./project.py rebuild 没有删除整个 ./build 文件夹;之前通过 vcpkg 自动下载的包仍然保留在 ./build 目录下,包依然存在所以不需要重新根据平台进行下载编译,也就不用传入额外参数!