如何使用 autotools 为 windows 生成配置脚本

How to produce a configure script for windows with autotools

我正在用 C++ 编写应用程序,并且正在使用 autotools 制作构建脚本。然后最终用户将能够在源目录中 运行 ./configure && make && make install。我的问题是:可以在 windows 上使用相同的命令吗?如果没有,我如何使用 autotools 实现类似的过程?还是 autotools 无法为 windows 生成构建脚本?如果是这样,哪个构建工具可以用于 windows ?提前致谢!

can the same command be used on windows ?

Autoconf 生成 configure 作为可移植 (POSIX) shell 脚本。 Windows 不是 POSIX shell 的标准配置,也不是 Autotools 配置脚本和 makefile 所依赖的任何标准工具。 Windows 也没有与适合与 Autotools 构建的 makefile 一起使用的 make 实现作为标准,据我所知,Visual Studio 也没有提供。

您可以非常轻松地在 Windows 上的 WSL 容器中构建和 运行 您的项目,但这不会让您获得本机 Windows 可执行文件。

如果您想在 Windows 上使用 Autotools 构建系统来生成 Windows 可执行文件,那么您最好的选择可能是依赖 msys2 and mingw-w64。这些一起可以在 Windows 中提供一个标准的 POSIX 环境 运行,能够通过常用命令构建 Windows 库和可执行文件。但请注意,这种方法意味着任何想要在 Windows 上构建您的项目的人都必须先安装这些或类似的组件。

If not, how can i achieve a similar process with autotools ? Or is autotools incapable of producing a build script for windows ?

Autotools 生成针对类 Unix 操作系统的构建系统,包括(但不限于)Linux 和 MacOS。这样的构建系统不适合 Windows 机器,除非添加了相当大的第三方组件套件,例如 msys2 和 mingw-x64 可以提供。

If so, which build tool could be used for windows ?

如果您希望与 Windows 和 Unix 兼容,

CMake 是更典型的选择。这通常会代替 Autotools,而不是它们的补充,因为谁愿意为同一个项目维护多个独立的构建系统?

我认为您不了解实际问题,所有建议使用 MSYS、Cygwin 或 WSL 的人也不了解。 运行在 WSL 中使用 bash 配置脚本与在真正的 Hyper-V linux VM 中使用 运行 配置脚本有什么区别?有 none。 WSL 及其朋友正在提供 LINUX 环境,真正的 VM 也是如此。在配置脚本或后续的 makefile-s 中有一个 OS 检查? VM 会说,“我是 linux!” WSL 也将如此。有一个符号的检查,它存在于 linux,但不存在于 Windows? WSL 会说,“无论如何!符号存在!”是否检查“size_t”?是的,它就在那里!除了,它不是,因为 msvc 只知道“SIZE_T”(大写字母)。

所以我 运行 在 linux 上配置 + 制作。很好,我创建了所有必要的 .config.h 文件,我得到了 make SHELL="/usr/bin/bash -x" 详细输出。除了所有变量都是错误的,因为所有内容都根据 linux + clang 检查!所以我必须手动重新运行所有检查,修复配置文件

#define HAVE_STRTOK_R

不,等等,该死的,windows 上没有 strtok_r!

#define HAVE_DIRENT_H

不,MSVC 中没有 dirent.h!

#define HAVE_LONG_LONG

应该在那里……对吗?

#define SIZEOF_WHATEVER x

稍等...让我检查一下...

然后我必须将所有 makefile 介子转换成一个 cmake 文件,最后我可以使用 MSVC 进行构建。那么所有那些 *.am 和 *.m4 文件呢?神秘的东西,我不知道它们是什么。 cmake 适用于所有系统,但网上 90% 的代码都使用配置脚本 + make,没有 cmakelists.txt 适合你,没有 *.vcxproj 文件,没有 nmake 文件,没有 Windows!

交叉编译?不是解决方案。 linux VM 的体系结构可以与主机 windows 系统、amd64 等之一相同,问题是,linux 构建系统会检查 linux 上的 clang ],但我需要的是针对 MSVC 的检查。因此,linux 脚本检查可见性属性,clang 说是,MSVC 说不。

所有这些修复都花费了大量时间。所以问题依然存在。如何有效地为 MSVC 调整 linux 构建系统,而不浪费时间和学习用于构建系统的 20 种语言?不,我不会使用其他编译器来构建 Windows。他们知道什么 Windows,MS 什么也没告诉他们。