Fred Foo
Fred Foo

Reputation: 363467

Include a (header-only) library in an autotools project

I want to integrate a header-only C++ library in my Autotools project. Since the library uses Autoconf and Automake, I use AC_CONFIG_SUBDIRS in configure.ac and added the library dir to the SUBDIRS = line in Makefile.am.

My question is: how do I prevent the header library from being installed by make install? I'm building a single binary, so my users don't need these headers.

I'd prefer not to tamper with the library, so I can fetch upgrade by just untarring the new version.

Upvotes: 3

Views: 1291

Answers (3)

Andreas
Andreas

Reputation: 736

just came across a similar problem and found the solution in the automake manual:

noinst_HEADERS would be the right variable to use in a directory containing only headers and no associated library or program

Andreas

Upvotes: 1

adl
adl

Reputation: 16034

Here is an idea.

Move all the third-party libraries you do not want to see installed into a subdirectory called noinst/. So for instance if you want to ship your project with something like Boost, unpack it into the directory noinst/boost/. Use AC_CONFIG_SUBDIRS([noinst/boost]). Inside noinst/Makefile.am, do something like this:

SUBDIRS = boost
# Override Automake's installation targets with the command ":" that does nothing.
install:; @:
install-exec:; @:
install-data:; @:
uninstall:; @:

The effect is that whenever some of the recursive "make install*" or "make uninstall" commands are run from the top-level directory, the recursion will stop in noinst/ and not visit its subdirectories. Other recursive commands (like "make", "make clean" or "make dist") will still recurse into the subdirectories.

You could of course override install: and friends directly into the third-party package, and avoid the extra noinst/ directory. But if you are like me, you don't want to tamper with third-party packages to ease their update. Also a nice property of the above setup is that if someone goes into noinst/boost/ and decide to run make install, it will work. It just does not occur by default when they install your package.

Upvotes: 2

user502515
user502515

Reputation: 4444

Don't use SUBDIRS then. The following hack may work:

all-local:
        ${MAKE} -C thatlib all

Of course it would be best if the library remained in its own directory outside of your project, and you just point to it via CFLAGS/LIBS flags.

Upvotes: 0

Related Questions