如何基于GNU Build System提取部分项目?

时间:2010-05-24 15:00:17

标签: build autotools configure

当我将一些子目录从“./configure”所管理的项目中移开时,它会尝试获取某些“../../configure.ac”等内容并且不易构建。< / p>

如何提取部分此类项目并使其独立?

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决此问题,创建单独的自动工具构建流程,或者取消自动工具和手动代码,或者制作新的Makefile

myprojectfoo
   |
   +-- src
   |
   +-- man
   |
   +-- messages
   |
   +-- lib
   |
   +-- include
   |
   +-- others

请查看上面的插图,了解名为myprojectfoo的虚构项目,并使用自动工具构建名为foo的二进制文件。顶级目录即myprojectfoo将在子目录中包含 configure.ac Makefile.am Makefile.in 至少 Makefile.am Makefile.in 。自动工具将创建并执行make命令来构建项目。

现在,根据我对你要做的事情的理解:

myprojectfoo
   |   \ /
   +-- sXc
   |   / \
   +-- man
   |
   +-- messages
   |
   +-- lib
   |     \ /
   +-- incXude
   |     / \
   +-- others

您想要取出src子目录,它也是include's。那么在这种情况下,创建一个单独的Makefile( 读取 - no auto-tools )构建会更容易..在这种情况下,这会更容易。

我能想到的最好方法是,你必须最终做出决定, 你想要提取的项目源的子集有多大 ,继续执行此操作后,删除对 Makefile.am Makefile.in 的所有引用...并借用现有的简单Makefile模板来构建它并像这样调用它

make -f MyMakefile

如果您想使用自动工具使用该子集构建单独的项目:

  1. 创建一个简单的Makefile.am,如下所示。
  2. 创建一个简单的configure.ac,如下所示......
  3. 在源代码上运行 autoscan 以选择依赖项,将输出文件'configure.scan'的结果添加到configure.ac
  4. 运行 automake (执行一次!)
  5. 然后运行 autoconf 。它可能会抱怨缺少文件,如安装,复制等
  6. 然后对configure.ac进行任何后续更改,之后运行 autoreconf ,这将执行 automake autoconf 和其他支持自动工具程序。
  7. 为Linux发送Makefile.am的样本...

    SUBDIRS = src include
    ACLOCAL_AMFLAGS = -I m4
    

    为Linux发送configure.ac的样本...

    AC_PREREQ(2.63)
    
    AC_INIT([mysubsetprojectfoo], [0.1a], [foo@bar.baz])
    AC_CONFIG_AUX_DIR([build-aux])
    
    AM_INIT_AUTOMAKE([-Wall -Werror])
    AM_GNU_GETTEXT_VERSION([0.17])
    AM_GNU_GETTEXT([external])
    AM_CFLAGS=
    # Checks for programs.
    AC_HEADER_STDC
    AC_PROG_CC
    
    AC_ARG_ENABLE([debug],
    [  --enable-debug               Turn on debugging],
    [case "${enableval}" in
      yes) debug=true ;;
      no)  debug=false ;;
      *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
    esac],[debug=false])
    AM_CONDITIONAL([DEBUG], [test x$debug = xtrue])
    # Checks for libraries.
    AC_CHECK_LIB([mylib], [mylib_function], [:])
    if test "$mylib" = :; then
            AC_MSG_ERROR([MyLib is missing.\
                                      This can be downloaded from 'http://www.foo.baz'])
    fi
    AC_CONFIG_HEADERS([config.h])
    
    # Checks for header files. 
    # FROM running 'autoscan' on the source directory
    AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h locale.h netinet/in.h stdlib.h string.h sys/ioctl.h sys/socket.h syslog.h unistd.h])
    
    # Checks for typedefs, structures, and compiler characteristics.
    AC_C_INLINE
    AC_C_CONST
    AC_TYPE_SIGNAL
    AC_TYPE_PID_T
    AC_TYPE_UID_T
    AC_TYPE_SIZE_T
    
    # Checks for library functions.
    AC_FUNC_FORK
    AC_FUNC_MALLOC
    AC_CHECK_FUNCS([atexit inet_ntoa memset regcomp socket strdup strerror])
    
    AC_CONFIG_FILES([Makefile src/Makefile include/Makefile])
    AC_OUTPUT
    

    自动工具的命令是我的头脑,我可能已经错过了一些东西......可以通过在这篇帖子的底部发表评论来指出这一点,并会相应地进行修改。