非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,我认为,我可以使用javac
和java
命令分别编译和运行。但是我真的不知道如何使 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项目的跨平台自动构建的主要内容,如果未能解决你的问题,请参考以下文章