【发布时间】:2023-03-09 05:15:02
【问题描述】:
我正在编写something,就像 C++ 的交互式教程一样。本教程将由两部分组成:一个被编译成一个库(我正在使用 Scons 来构建它),另一个(课程)随教程一起提供,由最终用户编译。我目前正在为人们寻找一种好的、简单的方法来构建这些课程。
基本上,第二部分是一个包含所有课程的目录,每个课程都在自己的目录中。每节课至少有一个lesson.cpp 和一个main.cpp 文件,可能还有其他文件,直到发布后我才知道它们的存在——最终用户将创建这些文件。它看起来像这样:
all_lessons/
helloworld/
lesson.cpp
main.cpp
even_or_odd/
lesson.cpp
main.cpp
calculator/
lesson.cpp
main.cpp
user_created_add.cpp
每一个都需要根据几乎相同的规则进行编译,并且编译命令应该可以从课程目录之一运行(helloworld/ 等)。
鉴于项目的其余部分是使用 Scons 构建的,因此在这部分中使用它也是有意义的。但是,Scons 在运行它的目录中搜索 SConstruct 文件:是否可以在每个课程目录中放置一个 SConstruct 文件,以及在给出一般规则的 all_lessons/ 目录中放置一个 SConscript ?这似乎与 Scons 期望项目组织的典型方式背道而驰:这种方法的潜在缺陷是什么?我可以放置一个 SConstruct 文件而不是 SConscript 文件,从而可以从任一目录构建(我猜是使用导出来避免无休止的递归)?
另外,我可能在某些时候想用生成必要文件的lesson.py 替换lesson.cpp; Scons 是否允许我与构建者一起轻松地完成此操作,或者是否有更方便的框架?
最后,我想得到以下结果(或等效于不同的构建系统):
all_lessons/
SConstruct
helloworld/
SConstruct
lesson.cpp
main.cpp
even_or_odd/
SConstruct
lesson.py
main.cpp
calculator/
SConstruct
lesson.cpp
main.cpp
user_created_add.cpp
在all_lessons 目录中运行scons all 需要:
- 运行
even_or_odd/lesson.py生成even_or_odd/lesson.cpp。 - 意识到
user_created_add.cpp也需要编译。 - 为每节课生成一个可执行文件。
在even_or_odd/ 中运行scons 或在all_lessons/ 中运行scons even_or_odd 应生成与上述相同的可执行文件(相同的编译标志)。
总结:
- Scons 是否适合/能够做到这一点?
- 当
SConscript文件高于SConstruct文件时,Scons 是否正常工作? - Scons 是否可以很好地处理一个项目的多个
SConstrcut文件,Sconscripting 彼此? - Scons 构建器系统是否适合使用 Python 脚本生成 C++ 文件?
- 使用不同的构建系统/编写我自己的构建框架有什么好处吗?
当然,欢迎任何进一步的 cmets。
谢谢。
【问题讨论】:
-
看起来你正在寻找的是一个makefile。你是在 *nix 系统上吗?
-
我可以使用 Makefile,是的;使用 Scons 有什么好处? (我在 *nix 上,以前使用过 Makefile,但没有理由在更现代的构建系统上使用它们。)
-
makefile 更好,因为它们体积小、易于制作且易于使用。
-
@Lockhead:makefile 很小,对于熟练使用 make 的人来说很容易制作。大多数构建系统可能也是如此。
标签: c++ build build-automation scons