Search code examples
makefileautotoolsautomake

How to issue a new compile command in Makefile.am?


I am building a library (using Autotools) that looks like the following. The building of the library works fine when I add a *.cpp file to libmytest_la_SOURCES.

lib_LTLIBRARIES = libmytest.la

libmytest_la_SOURCES = test.capnp.c++

libmytest_la_CXXFLAGS = -I/usr/include -I$(top_srcdir)/src/includes 

libmytest_la_LDFLAGS = -version-info 0:0:0 -L/usr/lib64

libmytest_la_LIBADD = -lcapnp

The problem is that I need to call a third-party compiler to generate code before doing the normal compile process. The following capnp tool will generate a c++ output file named test.capnp.c++.

capnp compile -oc++ test.capnp

And if I plug the output of that (test.capnp.c++) into the makefile above, my library is built. What I don't get is how to invoke that command into the Makefile.am to generate the needed source file and plug it into the libmytest_la_SOURCES variable.

Any thoughts?


Solution

  • Automake does not have direct support for capnp, and adding support for a new language or tool would involve hacking the program. But you can provide ordinary make rules in your Makefile.am file, and these will be carried through to the final generated Makefile. This is Automake's primary extension point.

    Thus, you might add this to your Makefile:

    test.capnp.c++ : test.capnp
         capnp compile -oc++ $<
    
    # or
    #    $(CAPNP) compile -oc++ $<
    # where $(CAPNP) is the capnp binary as discovered by configure
    

    You would want to also designate test.capnp as an additional file to distribute:

    EXTRA_DIST = test.capnp
    

    You should also consider whether you want the .c++ file to be included in distribution packages, to relieve the build-time dependency on capnp. If not, then instead of listing it in libmytest_la_SOURCES you should list it in nodist_libmytest_la_SOURCES, plus also in CLEANFILES:

    #
    # test.capnp.c++ is a built file that we choose not to distribute
    #
    nodist_libmytest_la_SOURCES = test.capnp.c++
    CLEANFILES = test.capnp.c++
    
    # or: CLEANFILES = $(nodist_libmytest_la_SOURCES)