使用 Gradle 来构建 C/C++

前面的闲话

这篇文章是对 Build C++ project with Gradle 的学习和理解。

Gradle 是使用 Groovy 语言的构建系统,是在 Ant、Maven 的基础上发展起来的。相于对 Ant、Maven 使用 XML 来描述任务和构建过程,Gradle 使用 Groovy 来描述。对于一个非常熟悉 Maven 的开发者来说,感觉使用 Gradle 简洁和方便很多,XML 用来描述构建过程实在是一件冗长和笨拙。Groovy 的表现力无疑比 XML 更强,更简练。

对于构建工具来说,从 make、CMake、Rake、Ant、Maven、Gradle、Grunt、Gulp 的了解来看,一些核心概念得到 不断的加强和扩展,如依赖、坐标、存储库、构建周期等。可以看到一些大趋势:

  • 单一平台和多平台支持,导致构建工具从使用具体的系统命令来完成任务,发展到提供自己实现的通用的跨平台任务。 比如 make 基本不上提供通用任务,只做依赖管理和任务执行过程。而到 Ant,就已经提供通用的构建任务了。

  • 描述构建任务和过程的编程语言,从专有的语言,发展到使用通用的、功能更加强大的动态通用编程语言。make 有自己专用的 语法规则,这些规则不直观且不好理解;而到 Ant、Maven,已经使用 XML 来描述,以今天的观点来看, XML 是比较适合表示数据的,但表示处理过程的时候,非常冗长和啰嗦; 而到 Gradle、Rake、Gulp,已经使用通用的动态编程语言了,它们分别使用 Groovy、 Ruby、JavaScript。很明显,通用的动态编程语言在构建这方面有非常强的优势, 语法灵活、表现力强、功能强大。

对上文提到的几个构建工具都有一定的了解,当然最熟悉的是 Ant 和 Maven。综合来看,个人观点,Maven 无疑是功能完备、 抽象程度更高的构建工具,从它诞生的时间来看,很多概念都是开创性的。比如构件坐标、构建周期、依赖库等等,现在也被其他构建 工具所借鉴。其他类似的构建工具在对软件构建这种活动的抽象程度上,即便是现在的 Rake、Gradle、Gulp 等,也远不及它。 Maven 制定的流程比较严谨,对一般的构建过程进行了抽象,并提供这些阶段的具体任务实现(插件其及Goal),不同的 项目类型和不同构建阶段可以使用不同的插件,但流程和构建周期是相同的概念和做法,对开发者和组织来说,这些工具和过程都是标准化 的。现今,Maven 依然是 Java 世界最主流的构建工具,有丰富的插件生态,稳定可靠。

但 Maven 的主要缺点是比较重量级、采用 XML 来描述任务和过程,冗长笨拙。当你需要一些不太常用的功能时,自己实现起来 比较麻烦,不够直接和简便。比如,对多模块的代码构建,其 pom.xml 会变得庞大、不直观且不好理解。 但 Maven 也在不断改进中,其中一个做法,就是使用动态编程语言来描述其 pom.xml,以提高表现力和灵活性。 一个项目是 polyglot-maven

Gradle 学习了 Maven 的大多数做法。使用 Task 来执行各个构建同期具体的工作。兼具了标准化过程和灵活性。 但目前 Gradle 的生态圈不及 Maven 丰富。Groovy 表现力也比较强,但灵活也是一把双刃剑。得到简洁和强大的同时, 团队协议也需要在标准化和风格统一上花费更多的成本。

开始