Automake中ENABLE_GUI条件失效,--enable-gui开关不生效如何解决?
问题:--enable-gui开关未按预期工作
尝试为程序配置--enable-gui开关,但执行./autogen.sh && ./configure --with-gui=no && make时,系统提示找不到gtk.h,推测Makefile仍将ENABLE_GUI判定为true。相关配置代码如下:
configure.ac 代码:
AC_INIT([cwallet], [1.1], [bug-automake@gnu.org]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_PROG_CC AM_PROG_CC_C_O AC_CONFIG_HEADERS([config.h]) AC_ARG_ENABLE([gui], [AS_HELP_STRING([--enable-gui], [enable GUI (default is yes)])], [enable_gui=$enableval], [enable_gui=yes]) if test x$enable_gui != xno; then PKG_CHECK_MODULES([GTK2],[gtk+-2.0]) fi < ... some stuff ... > AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUT AM_CONDITIONAL([ENABLE_GUI],[test x$enable_gui == xyes])
src/Makefile.am 代码:
if ENABLE_GUI bin_PROGRAMS = cwallet cwallet-gui cwallet_SOURCES = main.c cwallet.c cwallet_gui_SOURCES = main-gui.c cwallet.c cwallet_gui_LDADD = $(GTK2_LIBS) cwallet_gui_CPPFLAGS = $(GTK2_CFLAGS) else bin_PROGRAMS = cwallet cwallet_SOURCES = main.c cwallet.c endif
解决方案
问题根源有两处:
命令参数不匹配:配置中定义的是
--enable-gui开关,你却用了--with-gui=no,正确的禁用参数应为--disable-gui或者--enable-gui=no。条件判断位置错误:
AM_CONDITIONAL必须放在AC_OUTPUT之前执行,否则automake无法将条件规则正确注入到生成的Makefile中,导致条件判断失效。
修改后的configure.ac:
AC_INIT([cwallet], [1.1], [bug-automake@gnu.org]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_PROG_CC AM_PROG_CC_C_O AC_CONFIG_HEADERS([config.h]) AC_ARG_ENABLE([gui], [AS_HELP_STRING([--enable-gui], [enable GUI (default is yes)])], [enable_gui=$enableval], [enable_gui=yes]) # 将AM_CONDITIONAL移至AC_OUTPUT之前 AM_CONDITIONAL([ENABLE_GUI],[test x$enable_gui == xyes]) if test x$enable_gui != xno; then PKG_CHECK_MODULES([GTK2],[gtk+-2.0]) fi < ... some stuff ... > AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUT
执行正确的构建命令:
./autogen.sh && ./configure --disable-gui && make
或者:
./autogen.sh && ./configure --enable-gui=no && make
可选优化:简化Makefile.am代码
把公共的cwallet配置提到条件判断外,减少重复代码:
bin_PROGRAMS = cwallet cwallet_SOURCES = main.c cwallet.c if ENABLE_GUI bin_PROGRAMS += cwallet-gui cwallet_gui_SOURCES = main-gui.c cwallet.c cwallet_gui_LDADD = $(GTK2_LIBS) cwallet_gui_CPPFLAGS = $(GTK2_CFLAGS) endif
内容的提问来源于stack exchange,提问作者Andrew K
相关产品推荐
相关产品推荐

