用C ++编写构建脚本是否有意义?


15

我正在使用CMake生成我的项目IDE / makefile,但是我仍然需要调用自定义“脚本”来操纵我的编译文件甚至生成代码。

在以前的项目中,我一直在使用Python,而且还可以,但是现在在我正在处理的两个非常大的项目中管理很多依赖项时遇到了严重的麻烦,因此我想尽可能减少所有地方的依赖项。

有人建议我使用C ++编写我的构建脚本,而不是为此添加语言依赖。项目主题本身已经使用C ++,所以我可以看到几个优点:

  • 要构建整个项目,只需要一个C ++编译器和CMake,就没有其他必要了(所有其他依赖项都是C或C ++);
  • C ++类型的安全性(使用现代C ++时)使一切变得更容易“正确”;
  • 它也是我所熟悉的语言,因此即使我能够编写一些不错的Python代码,也可以更轻松地使用它。
  • 潜在的执行速度提升(但我认为这不会真正被察觉);

但是,我认为可能会有一些缺点,并且由于我尚未尝试,所以不确定真正的影响:

  • 编写代码的时间可能会更长(也就是说,我不确定,因为我在C ++中足够高效,可以编写可以快速工作的东西,因此对于该系统来说,编写它不会太长)(编译时间不应在这种情况下是一个问题);
  • 我必须假定我将作为输入阅读的所有文本文件都在UTF-8中,我不确定可以在运行时使用C ++轻松地对其进行检查,并且该语言不会为您进行检查。
  • C ++库比脚本语言更难管理。

我缺乏经验和前瞻性,所以也许我没有优势和劣势。所以问题是:为此使用C ++是否有意义?您有报告的经验吗,您是否看到了可能重要的优点和缺点?


1
依靠单一语言解释器进行构建似乎并不算太​​糟糕,尤其是因为它是Python -非常可移植,在Linux上广泛使用并且在Windows上易于使用。如果您需要其他Python库,则可以使用virtualenv,它只会添加一个Python文件(您可以将其提供)与Internet连接,并需要一些设置来建立virtualenv,将其安装在并运行您的实际环境在该环境中构建脚本。您可以根据需要使用额外的脚本和Internet连接。

您可以以相当不错的可靠性猜测文本的编码。
DeadMG 2012年

@DeadMG是的,但是如果工作量太大(如果您想作一个很好的猜测而不是将自己限制在“这是ascii还是unicode,如果是unicode,则是多少位和什么字节顺序?”),请手动执行此操作添加另一个依赖项(如果有一个完全免费的独立库),则无法使用C ++停止依赖Python的地步。

@delnan是的,但是仍然需要更多语言来安装。从您的描述来看,任何其他依赖关系似乎都不太“糟糕”,但我正在考虑它,因为已经有很多需要管理的东西,因此也许它也可以帮助限制所使用的语言。我还使用了嵌入式脚本语言(直接在项目中以C ++实现),javascript / HTML / CSS,XML和其他格式,但要记住很多。
Klaim

2
您将使用什么来构建c ++构建脚本?
jk。

Answers:


24

只需使用Python。

我使用C ++开发,并使用Python进行构建脚本,而使用C ++进行构建脚本会很痛苦:

  • Python使操作字典,列表,列表字典的嵌套字典等变得不那么容易。(例如,我的一个脚本使用了我所有工具,工具版本和工具版本路径的多级层次结构。 )C ++可以对模板和自定义类执行相同的操作,但是它更加冗长(这意味着更多的代码行,通常意味着生产力降低)。
  • Python提供了高级库和例程,例如其XML和JSON处理,进程os.walk。同样,C ++可以做到这一点,但是要找到库,学习它们的API,正确地组装调用(通常是较低级别的)等等,还有很多工作要做。
  • 构建脚本是一项非增值活动(借用精益项目)。最好使用尽可能高级的语言,以使其尽快完成,然后重新开始工作,这对您的用户有利。
  • 以我的经验,构建脚本倾向于以无法预料的方式增长。即使对于C ++来说一开始看起来很简单的任务,也可能会很快变得复杂。提出新要求时,在Python脚本中进行处理通常比在C ++中处理要容易得多(这可能需要查找或读取新的库API等)。

关于为C ++列出的优点:

  • 添加单个依赖关系(Python)不会显着使您的构建复杂化。例如,在大多数Linux安装中,它已经是标准配置。得益于Python的“包含电池”库,它甚至比构建脚本所依赖的C ++库更易于管理。
  • C ++提供的类型安全性对于大型项目而不是小型脚本最有用。
  • Python很好地补充了C ++(高级还是低级,动态类型还是静态类型,等等),并且如果以后想要这样做的话,甚至可以很好地与C ++集成(感谢SWIG和Boost.Python),所以值得C ++程序员学习。
  • 如您所说,执行速度应该不是问题。

经过一年的跨平台项目cmake努力后,我们进行了此操作(python构建)。最后,我们甚至没有费心尝试进行依赖检查(构建中最复杂的部分)。由于对于自动构建,您无论如何都想重新构建所有内容,因此在C ++中,存在许多复杂的依赖关系
Martin Beckett

1

我认为这是针对具体情况的问题。我认为使用C ++生成脚本是否有意义没有正确答案,找出它的唯一方法是在实践中进行尝试。

我个人认为Python优于C ++,因为它具有更好的语言表达能力和更容易(当然,个人观点)的标准库工具来管理操作二进制文件和生成代码的任务。当然,可能会为该任务开发复杂的库,但是如果没有,那么我个人肯定会认为Python是“更经常正确”的答案-通常情况下。


1

不要自己编写脚本,而是要付出很多努力并重新发明轮子。

使用诸如SCONS或什至支持C ++构建系统的 Maven 3之类的东西。

一个好的构建系统,无论使用哪种语言,都不需要脚本形式的自定义逻辑来构建可运行的可执行工件。

如果您必须为构建系统编写脚本以对其进行自定义,那么它不是一个好的构建系统。为构建系统编写插件是另外一回事,但这仍然主要是针对环境/硬件的,并且应该很少采用。


1
正如我所解释的,我已经在使用cmake了,但是我仍然需要完成自定义脚本。我说的是这些自定义脚本,而不是构建过程本身。
Klaim '04年

1
我喜欢Maven-构建“地狱世界” C程序所需的脚本比该程序更长!
quant_dev

@quant_dev,我记得我第一次在他们自己的网页上使用Maven时,他们建议您与已经熟悉maven的人开始,因为这很难设置。那是我完全不想要它的第一个迹象!
布雷迪

我喜欢SCons,它有点慢但是很容易使用。
quant_dev

1
@JarrodRoberson我过于宽松地使用了“脚本”。我的意思是它的配置文件。我不确定声明式功能是否会使Maven自动更具便携性和易于维护性。但是,它确实使灵活性降低了,这在大型项目中可能会很痛苦。
quant_dev

0

要关注这个问题:

用C ++编写构建脚本是否有意义?

答案是一个简单的没有

当前接受的答案放大到python,并列出了很多有效的关注点,但是我想添加一个与语言无关的原因:

你真的希望在任何脚本任何编译语言,如果你能帮助它:

  • 您将需要一个脚本来引导脚本!
  • 或者,您需要将已编译的脚本检入源代码控制中(并使它与检入的源代码保持同步!)
  • 该脚本突然还具有附加的脚本的构建配置。(需要维护!)

此外,还有其他答案:

可能您不想使用“原始”脚本语言来编写您的构建脚本(我知道C ++复杂性将由CMake处理)。

可能应该做的就是选择Build之一系统出来在那里。看看是否符合您的要求。脚本编写性/可扩展性/ CMake玩法/跨平台性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.