2010-05-24 4 views
0

Lorsque je déplace un sous-répertoire à partir d'un projet géré par "./configure" et tout ce qui se passe, il essaye d'accéder à "../../configure.ac" et à d'autres choses et n'est pas facile à construire.Comment extraire une partie du projet basé sur GNU Build System?

Comment extraire une partie d'un tel projet et le rendre indépendant?

Répondre

0

Il existe deux façons de gérer cela, créer un processus de construction d'outils auto séparé ou supprimer les outils automatiques et le code main ou créer un nouveau Makefile.

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

Jetez un oeil à l'illustration ci-dessus, pour un projet fictif appelé myprojectfoo et utilise des outils d'auto-construire un binaire appelé foo. Le répertoire de haut niveau à savoir myprojectfoo aura configure.ac, Makefile.am et Makefile.in, dans les sous-répertoires il y aurait au moins Makefile.am et Makefile.in. Les outils automatiques vont créer et exécuter les commandes make pour construire le projet.

Maintenant, d'après ce que je comprends ce que vous essayez de faire:

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

Vous voulez prendre le sous-répertoire src et il est include's aussi. Alors dans ce cas, il serait plus facile de créer un Makefile séparé (read - pas d'auto-tools) construire .. dans ce cas, ce serait plus facile.

La meilleure façon que je peux penser est, vous devrez prendre cette décision en fin de compte, la taille est le sous-ensemble des sources du projet que vous souhaitez extraire, une fois que vous aller de l'avant avec cela, supprimer tous les les références à Makefile.am, Makefile.in ... et emprunter un modèle de Makefile simple existant pour le construire et l'invoquer comme celui-ci

 
make -f MyMakefile 

OU

Si vous voulez construire un projet distinct en utilisant ce sous-ensemble en utilisant des outils d'auto-:

  1. Créer un bare-bones Makefile.am comme indiqué ci-dessous.
  2. Créer un bare-bones configure.ac comme indiqué ci-dessous ...
  3. Run autoscan la source pour choisir les dépendances, ajoutez les résultats du fichier de sortie 'configure.scan' au configure.ac
  4. Run automake (Faites-le une fois!)
  5. Exécutez ensuite autoconf.Il peut se plaindre de manquer des fichiers tels que INSTALLER, COPIER etc
  6. Puis toute modification ultérieure de configure.ac, exécutez autoreconf après, qui exécutera automake, autoconf, et d'autres programmes de soutien auto-outils.

Prendre un échantillon du Makefile.am pour Linux ...

 
SUBDIRS = src include 
ACLOCAL_AMFLAGS = -I m4 

Prendre un échantillon du configure.ac pour Linux ...

 
AC_PREREQ(2.63) 

AC_INIT([mysubsetprojectfoo], [0.1a], [[email protected]]) 
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 

Les commandes pour les outils d'auto, C'est le sommet de ma tête et j'ai peut-être manqué quelque chose ... N'hésitez pas à le signaler en plaçant un commentaire sur ce sujet au bas de ce post et il sera modifié en conséquence.

+0

Trop complexe ... Je viens de finir de copier l'ensemble du projet et de supprimer des parties du script "./configure" qui se plaignaient de choses manquantes. Je voulais extraire un petit programme supplémentaire de la grande chose. Il a également eu des dépendances supplémentaires inutiles. –

+0

Je pensais qu'il y avait peut-être quelque chose qui analysait makefiles (si gros à cause des autotools) et qui trouvait un sous-ensemble de fichiers sources utilisés pour construire la cible donnée. –

+0

Plutôt que d'exécuter automake et autoconf directement (et d'oublier d'exécuter aclocal, autoheader, libtoolize, etc.), il est plus facile de lancer simplement autoreconf. Cela invoquera tous les autotools requis dans le bon ordre. –

Questions connexes