cmake 04 使用 python 管理 cmake 工程
创始人
2024-05-16 02:37:52
0

本文目标

  1. 使用 python 写一个管理 cmake 工程的 cli 程序

参考

Python CLI

python Click 官网

Click 中文文档

python多文件打包.exe执行文件

argparse 文档

使用说明

  • 详细说明

思路

使用 click 制作单独的命令, 比如 mcmake_inti,mcmake_built , 每一个命令都打包为单独的可执行文件
然后用argparse制作一个调度的可执行文件

一个 Hello World

文件列表

mcmake.py: 命令入口
mcmake_init.py: 初始化项目
mcmake_build.py: 构建

源码

mcmake_init.py

# -*- coding: utf-8 -*-import click@click.command()
@click.option('--init', help='初始化项目', nargs=0)
@click.option('--language', type=click.Choice(['c', 'c++']), prompt='选择语言', help='选择语言')
def init(init, language):click.echo('初始化项目')click.echo('language: %s' % language)if __name__ == '__main__':init()

mcmake_build.py

# -*- coding: utf-8 -*-import click@click.command()
@click.option('--build', help='初始化项目', nargs=0)
@click.option('--config', type=click.Choice(['debug', 'release']), default='debug', prompt='构建类型', help='构建类型')
def build(build, config):click.echo('初始化项目')click.echo('config: %s' % config)if __name__ == '__main__':build()

mcmake.py

# -*- coding: utf-8 -*-import argparse
import osparser = argparse.ArgumentParser()
parser.add_argument('init', help='初始化项目', nargs='?', const='1')
parser.add_argument('build', help='构建项目', nargs='?', const='2')
parser.add_argument('help', help='显示帮助', nargs='?', const='3')args = parser.parse_args()
if __name__ == '__main__':if 'init' == args.init:os.system('mcmake_init')elif 'build' == args.init:os.system('mcmake_build')elif 'help' == args.init:os.system('mcmake_init --help')os.system('mcmake_build --help')

打包

分别打包三个文件

# 打包 mcmake 调度命令
pyinstaller -F mcmake.py
pyinstaller mcmake.spec# 打包 mcmake 初始化命令
pyinstaller -F mcmake_init.py
pyinstaller mcmake_init.spec# 打包 mcmake_build 构建命令
pyinstaller -F mcmake_build.py
pyinstaller mcmake_build.spec

此时打包在了 ./dist 目录中

window验证

(venv) F:\2023\code\cmake\cm-cli\dist>dir驱动器 F 中的卷是 dox卷的序列号是 34D2-6BE8F:\2023\code\cmake\cm-cli\dist 的目录2023/01/23  02:55              .
2023/01/23  02:55              ..
2023/01/23  02:55         6,622,500 mcmake.exe
2023/01/23  02:46         6,903,074 mcmake_build.exe
2023/01/23  02:45         6,903,056 mcmake_init.exe3 个文件     20,428,630 字节2 个目录 92,017,352,704 可用字节(venv) F:\2023\code\cmake\cm-cli\dist>mcmake --help
usage: mcmake [-h] [init] [build] [help]positional arguments:init        初始化项目build       构建项目help        显示帮助options:-h, --help  show this help message and exit(venv) F:\2023\code\cmake\cm-cli\dist>mcmake help
Usage: mcmake_init [OPTIONS]Options:--init TEXT...      初始化项目--language [c|c++]  选择语言--help              Show this message and exit.
Usage: mcmake_build [OPTIONS]Options:--build TEXT...           初始化项目--config [debug|release]  构建类型--help                    Show this message and exit.(venv) F:\2023\code\cmake\cm-cli\dist>mcmake init
选择语言 (c, c++): c++
初始化项目
language: c++(venv) F:\2023\code\cmake\cm-cli\dist>mcmake build
构建类型 (debug, release) [debug]:
初始化项目
config: debug(venv) F:\2023\code\cmake\cm-cli\dist>mcmake_init
选择语言 (c, c++): c++
初始化项目
language: c++(venv) F:\2023\code\cmake\cm-cli\dist>mcmake_init --language=java
Usage: mcmake_init [OPTIONS]
Try 'mcmake_init --help' for help.Error: Invalid value for '--language': 'java' is not one of 'c', 'c++'.(venv) F:\2023\code\cmake\cm-cli\dist>mcmake_init --language=c++
初始化项目
language: c++(venv) F:\2023\code\cmake\cm-cli\dist>

然后把 dist 目录添加到环境变量再次验证

C:\Users\laolang>where mcmake
F:\2023\code\cmake\cm-cli\dist\mcmake.exeC:\Users\laolang>mcmake --help
usage: mcmake [-h] [init] [build] [help]positional arguments:init        初始化项目build       构建项目help        显示帮助options:-h, --help  show this help message and exitC:\Users\laolang>mcmake init
选择语言 (c, c++): c++
初始化项目
language: c++C:\Users\laolang>

linux 验证

注意: linux 需要把可执行文件所在目录添加到 .bashrc 才可以

ubuntu@ubuntu-cpp:~$ mcmake --help
usage: mcmake [-h] [init] [build] [help]positional arguments:init        初始化项目build       构建项目help        显示帮助options:-h, --help  show this help message and exit
ubuntu@ubuntu-cpp:~$ mcmake init
选择语言 (c, c++): c++
初始化项目
language: c++
ubuntu@ubuntu-cpp:~$ mcmake debug
ubuntu@ubuntu-cpp:~$ mcmake build
构建类型 (debug, release) [debug]: 
初始化项目
config: debug
ubuntu@ubuntu-cpp:~$ 

正式开发前的准备

检查环境变量

上面的 Hello World 中调度命令为 mcmake, 本来想设置成cm的, 但是我的电脑上已经有了这个命令了

C:\Users\laolang>where cm
C:\Program Files\PlasticSCM5\client\cm.exeC:\Users\laolang>

解决办法就是把环境变量的顺序调整一下

功能点描述

要求

无侵入. 即便脱离 cm-cli , 也不能影响cmake工程的构建流程

命令是怎样用的

调度命令

选项含义
init初始化项目
build构建项目
run运行
test运行测试
doxygen生成 doxygen 文档

init 子命令

选项含义
--name项目名称
--language语言. 可选项: c, c++
--standard语言标准, 目前的标准: c(89,90,99,11,18) , c++(98,11,14,17,20,23). c语言默认为11, c++默认为14
--type项目类型. simple(单目录) , simple_app(多目录, 一个include, 一个src) , module_app(多目录, src和include下添加子目录. src 下每个子目录编译为静态库或动态库. 默认为动态库, 可单独配置) 默认为 simple_app
--build-dir构建目录. 默认为 build
--output-dir二进制或库文件输出目录. 默认为 bin

build 子命令

选项含义
--type构建类型. debug 或 release . 默认为 debug

目录结构

ubuntu@ubuntu-cpp:~/code/cmake/cm_test$ tree -a.
cm目录, 类似 .git 目录		├── .cm
钩子脚本所在目录			│   ├── hooks
构建后运行的脚本			│   │   ├── post-build-sample.py
运行后运行的脚本			│   │   ├── post-run-sample.py
测试后运行的脚本			│   │   ├── post-test-sample.py
构建前运行的脚本			│   │   ├── pre-build-sampel.py
运行前运行的脚本			│   │   ├── pre-run-sample.py
测试前运行的脚本			│   │   └── pre-test-sample.py
日志						│   └── logs
顶层 CMakeLists.txt			├── CMakeLists.txt
doxygen 配置文件			├── Doxyfile
二进制或库文件所在目录		├── bin
构建目录					├── build
cm 配置文件					├── cm.json
doxygen 生成文档所在目录	├── doc├── include
第三方库目录				├── libs├── readme.md├── src
第三方库源码				└── third10 directories, 10 files
ubuntu@ubuntu-cpp:~/code/cmake/cm_test$ 

帮助文档

使用 VuePress 写出完整帮助文档

cmake 项目的准备

不考虑 32位

要求

  1. 要在windows上测试 mingw , tdm-gcc , msvc
  2. 要在 vscode 和 vs 分别测试
  3. linux也要测试
  4. cmake 脚本尽量简洁

simple

simple_app

module_app

上述操作有什么问题

  1. 调度命令有一个巨大的缺陷, 比如cm init --language=c++ 无法识别. 解决思路: 使用 sys.argv 获取, 自己手动解析然后调用子命令
  2. 帮助文档的输出也是个问题, 理想的帮助文档应当是下面这样的.
    F:\code>cm --help
    init		初始化--language	 	语言: java,c,c++--name			项目名称
    build		构建--type			投建类型: debug, release--hlep		帮助
    F:\code>
    
    解决思路很简单: 提前把帮助文档写在一个文本文件中, 然后读取这个本文文件再输出. 其实更高端点的做法是定制各个子命令的帮助文档
  3. 命令别名功能未实现, 目前好像也没啥实现的必要. 这个功能主要是将一些长命令缩短, 比如:
    # 设置别名
    cm config alias.msvc='cm build -g=Ninja type=Debug install_prefix=/install cxx_complier=/cl.exe make_program=ninja'
    # 使用
    cm msvc
    
  4. 类似 git 一样, 区分全局配置与当前项目配置
  5. 需要添加语言标准检测. 简单来说, 就是提前准备好几个特定的程序, 针对不同的标准进行验证.
  6. 应当考虑第三方库

下一篇:
cmake 05 使用库

相关内容

热门资讯

国产伺服第二,雷赛智能连续5季... 据MIR睿工业最新数据报告显示,2025年一季度通用伺服市场整体增幅达4.5%。值得注意的是,雷赛智...
昆仑润滑:以自主研发造就硬核科...   2月20日,中国石油宣布,我国首口超万米科探井——深地塔科1井在新疆塔里木盆地地下 10910 ...
娃娃 电钻 洗衣机 产业没能回... 据美国媒体当地时间10日报道,美国泰尔西咨询集团近日发布的行业报告显示,自美国政府4月2日宣布对全球...
昆仑润滑:用“黄金血液”守护大...   在第9个中国品牌日到来之际,央视网《源动中国》栏目组走进昆仑润滑兰州润滑油研发中心,探访新中国第...
白云山:以317.9亿元品牌价... 5月9日至11日,2025世界品牌莫干山大会在浙江省湖州市德清县举行,该大会由新华社品牌工作办公室携...
5年6倍!紫金矿业还值得期待吗... 来源:格隆汇今年以来,国际金价开始不断放飞自我越涨越疯,期间于4月22日一度突破3500美元/盎司大...
文化特派员邀请冠军导师 浙江打... 中新网浙江新闻5月11日电(林波)5月9日至10日,在浙江省文化特派员的助推下,“龙腾柯桥·非遗传承...
省级示范!贵阳高新区拟入选两个...   近日,贵州省推进开发区高质量发展领导小组办公室发布的《开发区高质量发展拟确定单项示范名单》已完成...
迈为股份携手启威星及SunDr... 人民财讯5月11日电,据迈为股份消息,近日,迈为股份(300751)、江苏启威星装备科技有限公司(迈...
青海共青团服务青年就业专场招聘... 中新网青海新闻5月11日电 (毛顺龙 孙睿)5月10日,由共青团海南州委、海南州人力资源和社会保障局...
印度现恐慌性抢购部分商店食品售... 转自:北京时间 【#印度现恐慌性抢购部分商店食品售罄#】...
一气呵成!运油-20的跨昼夜“... 近日 东部战区空军航空兵某旅开展跨昼夜空中加油训练多架歼-16战机与运油-20组成战术编队连续完成对...
刚刚!特朗普发声:将大幅增加! 转自:宁波晚报特朗普,传来多则消息!据外媒最新消息,美国总统特朗普5月11日在社交媒体上发文称,他将...
亚信安全获政府补助270余万元... 上证报中国证券网讯 5月10日,亚信安全发布公告称,公司于近期收到政府补助270.9万元,该补助属于...
贵州轮胎:控股股东拟斥资0.5... 贵州轮胎晚间公告,公司控股股东贵阳市工业投资有限公司(以下简称“贵阳工投”)计划自2025年5月12...
成都锦江区一在建工地起火 致2... 5月11日11时16分,成都市119指挥中心接到火灾报警称锦江区锦鹏三街一在建工地发生火灾。接警后锦...
中达集团控股(0139.HK)... 继单日大涨50%之后,中达集团控股(0139.HK)再度迎来股价异动。2025年5月9日,公司股价单...
凝心聚力 实干笃行丨重大工程有... 本文转自【央视新闻客户端】;预期是市场信心的关键,而在复杂严峻的国内外形势下,稳预期的关键,就是要结...
8个中央指导组,分别进驻了这里 转自:北京日报客户端据新华社5月11日消息,根据党中央在全党开展深入贯彻中央八项规定精神学习教育统一...
抖音元老陈林离职创业?知情人士... 有消息称,字节原高级副总裁、前教育业务负责人陈林已离职创业,与科大讯飞前高管王卓共同创立"银河智学"...