autotools:创建具有 .exe 和 .com 扩展名的可执行文件

autotools: create executables with both .exe and .com extensions

在 W32 上(以及从 linux 系统为 W32 交叉编译时)我想让 automake 从相同的 Makefile.am 构建两个扩展名不同的可执行文件。 例如。 - foo.exe - foo.com

由于 automake 神奇地处理了扩展,我真的不知道如何实现它。例如

bin_PROGRAMS=foo foo.com
foo_SOURCES=foo.c
foo_com_SOURCES=foo.c

将愉快地生成两个二进制文件 foo.exefoo.com.exe :-(

到目前为止我想到的最好的是:

AUTOMAKE_OPTIONS = no-exeext

bin_PROGRAMS=foo
noinst_PROGRAMS=foocom
bin_SCRIPTS=foo.com

foo_SOURCES=foo.c flub.c
foocom_SOURCES=foo.c knark.c

clean-local:
    -rm -rf foo.com
foo.com: foocom$(EXEEXT)
    cp $^ $@

我可以期待更多吗?

背景

我正在使用基于 automake 的构建系统构建一个跨平台应用程序(我们称之为 foo)。

在 un*x-like 系统上,应用程序停留在前台(并输出到 stdout/stderr)。 在 W32 上,这通常是不需要的(因为它要求应用程序是一个 控制台应用程序 ,带有一个丑陋的控制台 - window 以在应用程序处于 运行 时保持打开状态).有时它是需要的(例如用于调试)。 当前应用的解决方案(在 W32 上使用基于非 automake 的构建系统)是构建与 foo.exe(本机 W32 应用程序)和 foo.com(控制台应用程序)相同的应用程序。

我基本上会使用你想出的最好的,并做一些非常小的改动:

AM_INSTALLCHECK_STD_OPTIONS_EXEMPT  =
CLEANFILES                          =
bin_PROGRAMS                        =
noinst_PROGRAMS                     =
bin_SCRIPTS                         =

common_sources                      =
common_sources                     += foo.c

if BUILD_FOR_WINDOWS

AM_INSTALLCHECK_STD_OPTIONS_EXEMPT += foo$(EXEEXT)
bin_PROGRAMS                       += foo
foo_CFLAGS                          = -mwindows
foo_SOURCES                         = foo-windows.c
foo_SOURCES                        += $(common_sources)

AM_INSTALLCHECK_STD_OPTIONS_EXEMPT += foo-console$(EXEEXT)
noinst_PROGRAMS                    += foo-console
foo_console_CFLAGS                  = -mconsole
foo_console_SOURCES                 = foo-console.c
foo_console_SOURCES                += $(common_sources)

CLEANFILES                         += foo.com
AM_INSTALLCHECK_STD_OPTIONS_EXEMPT += foo.com
bin_SCRIPTS                        += foo.com
foo.com: foo-console$(EXEEXT)
        cp $^ $@

endif

变更列表:

  • 删除了 AUTOMAKE_OPTIONS = no-exeext,这似乎是不必要的。

  • 使用 CLEANFILES 而不是连接到 clean-local

  • 重新格式化以便通过 adding/removing 行轻松修补。

  • 添加 AM_CONDITIONAL 来构建这些 windows 特定程序,当且仅当您实际上是在为 windows 目标构建时。 (对于 MacOSX 或 GNU/Linux 目标,您需要编写和构建非常不同的程序。)

    # Add this to configure.ac
    build_for_windows=no
    case "${host_os}" in
         cygwin*|mingw*)
             build_for_windows=yes
             ;;
    esac
    AM_CONDITIONAL([BUILD_FOR_WINDOWS],
                   [test "x$build_for_windows" = "xyes"])