当前位置: 首页 > news >正文

Jam创建项目工程源码分析(1) 解析命令行参数

环境变量检测

打开JamToWorkspace.lua,首先我们可以看到lua代码尝试获取几个之前我们提到的环境变量。如果没有的话,它会直接退出程序。

OS = os.getenv("OS")
OSPLAT = os.getenv("OSPLAT")
JAM_EXECUTABLE = os.getenv("JAM_EXECUTABLE")
if not OS  or  not OSPLAT  or  not JAM_EXECUTABLE thenprint('*** JamToWorkspace must be called directly from Jam.')print('\nUsage: jam --workspace ...')os.exit(-1)
end

require对应模块

然后在执行对应的代码之前,需要加载对应的模块,这里会先将当前lua文件所处的scripts目录添加到require会搜索的集合中。

scriptPath = os.path.simplify(os.path.make_absolute(((debug.getinfo(1, "S").source:match("@(.+)[\\/]") or '.') .. '\\'):gsub('\\', '/'):lower()))
--- scriptPath is where current lua lies
package.path = scriptPath .. "?.lua;" .. package.path

package.path is a string containing search patterns separated by semicolons (;).

package.path控制require语句到哪里去找lua文件。它是以;分割的搜索pattern字符串

接着就会require一系列的lua文件。

jamPath = os.path.simplify(os.path.make_absolute(scriptPath .. '../'))
然后会设置jamPath的值为..\Jamplus\builds\bin,这个变量主要用于找到该目录下面的Jambase.jam文件。

解析命令行参数

JamToWorkspace.lua主要是通过ProcessCommandLine这个函数, 试图将命令行参数转化为Option这个类。
首先 我们可以通过打印arg这个变量来查看commandline的内容。

print("arg "..table.concat (arg, " "));
[[arg --ide=vs2012 --jamfile=Jamfile2.jam  --outputpath=Projects/JamGenerated ]]

Option相关的类和函数位于getopt.lua文件。local options =...定义了如何解析commandline,这里需要解析的Option的name有gen,gui,compiler,postfix,config等等。

getopt.getOpt函数会返回未能解析的命令行nonOpts,以及解析后的命令行opts,还有错误信息errors

getOpt这个函数会按照传入的options变量去解析commandline,它会将=符号左右两边分别转化为table的key和value,存储到返回值opts这个table变量里面。

	local options = Options {Option {{"config"}, "Filename of additional configuration file", "Req", 'CONFIG'},Option {{"gen"}, "Set the name of IDE we want to export projects", "Req", 'GENERATOR'},Option {{"ide"}, "Set the name of IDE we want to export projects", "Req", 'GENERATOR'},Option {{"compiler"}, "Set the default compiler used to build with", "Req", 'COMPILER'},Option {{"jamfile"}, "jamfile containing workspace info", "Req", "JAMFILE"},Option {{"outputpath"}, "where to output the workspace", "Req", "OUTPUTPATH"},}-- arg is a global table where commandline is storednonOpts, opts, errors = getopt.getOpt (arg, options)

根据传入的commandline,这里会设置opts.genvs2012opts.configProjects/Jam/WorkSpaceGenerationConfigWin.jam
如果我们往调用JamToWorkspace.lua的参数中添加--gui,那么这里opts.gui也会被设置为1,在lua运行结束后会在资源管理器中打开生成的目录。

应用命令行参数

ProcessCommandLine解析完命令行后, AfterProcessCommandline就会被调用,它会基于解析的参数,来设置一些变量。
opts.gen里面存储的是希望导出的项目对应的IDE类型,比如我们这里传入的命令行包含--gen=vs2012,说明我们想导出的是vs2012这个IDE的项目。
AfterProcessCommandline函数会根据opts.gen设置当前的ideExporter。 targetIDExporter = IDExporters[opts.gen]

targetIDExporter 对象是用于生成解决方案和项目工程的核心类,字段有:

  • Initialize, 初始化exporter
  • Shutdown, 销毁对象时的操作
  • GetProjectExporter, 获取Project导出类(vcxproj文件)
  • GetWorkspaceExporter, 获取解决方案导出类(sln文件)

除了找到idExporter, AfterProcessCommandline 还会将命令行参数中的 源文件sourceJamfile 和 输出路径outputPath 变为绝对路径。

	-- Turn the source code root into an absolute path based on the current working directory.absoluteSourceJamfilePath = os.path.simplify(os.path.make_absolute(opts.jamfile))absoluteSourceRootPath, sourceJamfile = absoluteSourceJamfilePath:match('(.+/)(.*)')-- Do the same with the destination.absoluteOutputPath = os.path.simplify(os.path.add_slash(os.path.make_absolute(opts.outputpath)))

最后如果命令传入的参数里有指定Config文件,那么会尝试读取对应的Config lua文件,然后将里面的Config对象合并。

这个Config对象 可以配置 ValidPlatforms 或者是 ValidConfigs。

http://www.jsqmd.com/news/412199/

相关文章:

  • 《计算机视觉:从入门到精通》技术手册 第23章 自动驾驶视觉系统
  • 不聊房子、不卷票子,「全民健康热」带火了阿福
  • 《计算机视觉:从入门到精通》技术手册 第24章 医学图像计算
  • 最新优质女性益生菌品牌推荐TOP5,适配现代女性私密健康 - 速递信息
  • 《计算机视觉:从入门到精通》技术手册 第22章 事件相机与神经形态视觉
  • 2026最新女性益生菌十大品牌测评,让女性由内而外焕健康 - 速递信息
  • 【SLAM】GenRobot / IO-AI / Scale / Appen 能力对比表(机器人数据与闭环视角)
  • 《计算机视觉:从入门到精通》技术手册 第20章 基础模型(Foundation Models)与视觉大模型
  • 《计算机视觉:从入门到精通》技术手册 第21章 具身智能与机器人视觉
  • 【SLAM】为什么像orb slam,vins等视觉SLAM开源算法里,精度上双目常常低于单目?
  • 《计算机视觉:从入门到精通》技术手册 第19章 视觉-语言模型与多模态学习
  • 《计算机视觉:从入门到精通》技术手册 第18章 人体姿态估计与动作捕捉
  • 鲁棒控制:质量块-阻尼器-弹簧系统的设计与分析——案例与实践中的学习手册
  • AI模型训练必看:自监督学习、半监督学习与强化学习全解析!收藏这波干货!
  • 【C++】野指针与内存践踏
  • 收藏!用LangChain+LangGraph打造深度智能体,Python实战代码全解析,轻松应对复杂任务
  • AI产品落地难?3个实战策略教你用业务语言打动决策者,收藏这波干货!
  • DS 做题记录
  • 题解:qoj8800 Triinformathlon
  • 外包干了9天,技术退步明显。。。。。
  • AI进化史诗:从逻辑机器到硅基大脑,爆了!速收藏揭秘通用智能体诞生秘诀!
  • 震惊!单Agent+Skills竟可取代多Agent系统?深度解析论文,附实验结果,建议收藏!
  • P12801/CF1173L [NERC 2022] Lisas Sequences
  • 14:00面试,15:00就出来了,问的问题过于变态了。。。
  • LangGraph实战:让AI按部就班,老板放心收藏!告别AI乱批款,实现严谨SOP自动审批!
  • 2026年AI Agent必看!技能(Skills)与MCP协同+多智能体系统工程实践(收藏版)
  • 2026.2.25
  • HZTG348 [Violet 6]蒲公英
  • P15445 「IXOI R1」永远在一起!
  • 初学Vim中如何输入指数