0
votes

I'm trying to port an application I'm developing to autotools. I'm not an expert in writing makefiles and it's a requisite for me to be able to use autotools. In particular, the structure of the project is the following:

..
../src/Main.cpp
../src/foo/
../src/foo/x.cpp
../src/foo/y.cpp
../src/foo/A/k.cpp
../src/foo/A/Makefile.am
../src/foo/Makefile.am
../src/bar/
../src/bar/z.cpp
../src/bar/w.cpp
../src/bar/Makefile.am
../inc/foo/
../inc/bar/
../inc/foo/A
../configure.in
../Makefile.am

The root folder of the project contains a "src" folder containing the main of the program AND a number of subfolders containing the other sources of the program. The root of the project also contains an "inc" folder containing the .h files that are nothing more than the definitions of the classes in "src", thus "inc" reflects the structure of "src".

I have written the following configure.in in the root:

AC_INIT([PNAME], [1.0])
AC_CONFIG_SRCDIR([src/Main.cpp])
AC_CONFIG_HEADER([config.h])

AC_PROG_CXX
AC_PROG_CC
AC_PROG_LIBTOOL

AM_INIT_AUTOMAKE([foreign])
AC_CONFIG_FILES([Makefile 
    src/Makefile 
    src/foo/Makefile 
    src/foo/A/Makefile 
    src/bar/Makefile])
AC_OUTPUT

And the following is ../Makefile.am

SUBDIRS = src

and then in ../src where the main of the project is contained:

bin_PROGRAMS = pname
gsi_SOURCES = Main.cpp
AM_CPPFLAGS = -I../../inc/foo\
    -I../../inc/foo/A \
    -I../../inc/bar/ 
pname_LDADD= foo/libfoo.a bar/libbar.a
SUBDIRS = foo bar

and in ../src/foo

noinst_LIBRARIES = libfoo.a
libfoo_a_SOURCES = \
    x.cpp \
    y.cpp

AM_CPPFLAGS = \
    -I../../inc/foo \
    -I../../inc/foo/A \
    -I../../inc/bar

And the analogous in src/bar.

The problem is that after calling automake and autoconf, when calling "make" the compilation fails. In particular, the program enters the directory src, then foo and creates libfoo.a, but the same fail for libbar.a, with the following error:

Making all in bar
make[3]: Entering directory `/user/Raffo/project/src/bar'
make[3]: *** No rule to make target `all'.  Stop.

I have read the autotools documentation, but I'm not able to find a similar example to the one I am working on. Unfortunately I can't change the directory structure as this is a fixed requisite of the project I'm working on.

I don't know if you can help me or give me any hint, but maybe you can guess the error or give me a link to a similar structured example.

Thank you.

1
If you have a tarball or git repo up somewhere, the better to look at.jørgensen
It sounds like there is no src/bar/Makefile. Does src/bar/Makefile.in exist?William Pursell
AC_PROG_LIBTOOL is obsolete. Use LT_INIT instead. Also, use "configure.ac" instead of "configure.in".William Pursell

1 Answers

0
votes

if it fails in src/bar, why is src/bar/Makefile.am the only code that you do not post?

and btw, you should use $(srcdir) or $(top_srcdir) rather than referring to relative paths like "../../" (this comes in handy if people want to produce binaries without poluuting the source directory)