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.exe
和 foo.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"])
在 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.exe
和 foo.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"])