非C项目的跨平台自动构建

Posted

技术标签:

【中文标题】非C项目的跨平台自动构建【英文标题】:cross-platform automatic build of non-C projects 【发布时间】:2011-12-19 11:11:02 【问题描述】:

实际上,我需要在 Windows / Linux 平台下为不同语言构建二进制文件 - Java、Pascal (Delphi/FPC)、C++、C# 等。

如何做到这一点?我现在正在为 C 项目使用 CMake,如下所示:

cmake --build .CMakeLists.txt 提供。

【问题讨论】:

编写跨平台构建和应用程序是一个复杂的主题。您有更具体的问题吗? 是的。如何配置 CMake 来编译 java/pascal/delphi/c# 文件?我可以为我拥有的每个来源创建一个自定义 CMakeLists.txt 文件。 一个严肃的 Java 项目应该已经带有基于 Ant、Maven、Gradle 或任何其他构建工具的构建过程。我从未见过任何使用 cmake 构建的 Java 项目。它只是不适合这项工作的工具。此外,Java 二进制文件本质上是跨平台的。您可以在 Windows 上构建它并在 Linux 上运行它。 @JBNizet 是的,我知道。我只想让我的软件支持的所有语言的构建过程都通用。对于java,我认为,我可以使用javacjava 命令分别编译和运行。但是我真的不知道如何使 java %s 用于 java 二进制文件和 ./%s 与标准(C++,Pascal)二进制文件一起运行...... @shybovycha -- 在 Java 应用程序上没有调用 cl.exe... 你确定你第一次运行vcvarsall.bat(Microsoft 实用程序,它为工具设置命令环境好好工作)?这是重要。否则,这是 Java 应用程序调用本地系统命令的“安全”问题吗?您可以查看 scons(基于 Python 的构建系统)来运行 vcvarsall.bat 进行设置,但 scons 更“类似于”,并且也不太适合 Java 构建... 【参考方案1】:

每个*make 系统都不适用于Java 项目,因为make 基本上假定“一个文件输入,一个文件输出”(例如.c.o)或“N 个文件输入,一个文件输出”之一"(例如 *.o.a.dll.exe 之一)。使用这些“原语”执行构建。

但是 Java 编译器本质上需要“完整的源树输入,完整的类树输出”。

这两个范式不匹配,并且尝试这样做迟早会引入比其价值更多的小问题。去过也做过。

您能做的最好的事情是从*** Makefile 中调用 Ant 或 Maven(或其他)。

编辑:不要忘记另外两件事:

make 编译Java 是一门黑暗而神秘的艺术。您不会找到很多既了解 Java 又了解 make 并且可以使用这种组合解决问题的人。 Ant/Maven 和 Java 是标准的组合。使用这种组合找到帮助或建议完全没有问题。

Java 中的许多框架都需要特殊的编译步骤。在几乎所有情况下,都有可用的 Ant 和 Maven 插件。每次使用 make 都必须重新发明***。

【讨论】:

FreePascal/Delphi 也有同样的问题。编译器调用可以使用内置依赖解析器编译数百个文件,也可以只编译一个文件,具体取决于您传递的是主程序的名称还是叶模块的名称。 @AH 史诗般的短语dark, arcane art!我仍然需要从 Java 应用程序中运行微软编译器。它导致了我近 3 天无法修复的问题。你有什么想法? (请参阅我对问题本身的最后评论) @shybovycha:在 Java 应用程序中使用 MS 编译器与这个问题无关。你应该问另一个新问题。【参考方案2】:

Free Pascal 提供了自己的构建系统。参见例如

http://www.stack.nl/~marcov/buildfaq.pdf

默认的 makefile(基于大多数生成的 gmake makefile)已经具备交叉能力。

我不认识任何使用 Free Pascal 的 cmake 的人,而且我已经在他们的邮件列表中工作了十多年。

【讨论】:

以上是关于非C项目的跨平台自动构建的主要内容,如果未能解决你的问题,请参考以下文章

初见 cmake

基于node平台项目的gulp自动化构建打包工具

用Ant实现Java项目的自动构建和部署

Mavenmaven简介

cake-build -.Net Core 跨平台构建自动化系统。

Maven——服务于Java平台的自动化构建工具