title: Autoconf -- including a static library (newbie)
body: <p>I am trying to migrate my application from manual build to autoconf, which is working very nicely so far.  But I have one static library that I can't figure out how to integrate.  That library will NOT be located in the usual library locations - the location of the binary (.a file) and header (.h file) will be given as a configure argument.  (Notably, even if I move the .a file to /usr/lib or anywhere else I can think of, it still won't work.)  It is also not named traditionally (it does not start with "lib" or "l").  </p>
  
  <p>Manual compilation is working with these (directory is not predictable - this is just an example):</p>
  
  <pre><code>gcc ...  -I/home/john/mystuff  /home/john/mystuff/helper.a
  </code></pre>
  
  <p>(Uh, I actually don't understand why the .a file is referenced directly, not with -L or anything.  Yes, I have a half-baked understanding of building C programs.)</p>
  
  <p>So, in my configure.ac, I can use the relevant configure argument to successfully find the header (.h file) using AC_CHECK_HEADER.  Inside the AC_CHECK_HEADER I then add the location to CPFLAGS and the #include of the header file in the actual C code picks it up nicely.</p>
  
  <p>Given a configure argument that has been put into $location and the name of the needed files are helper.h and helper.a (which are both in the same directory), here is what works so far:</p>
  
  <pre><code>AC_CHECK_HEADER([$location/helper.h], 
      [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
      CFLAGS="$CFLAGS -I$location"])
  </code></pre>
  
  <p>Where I run into difficulties is getting the binary (.a file) linked in.  No matter what I try, I always get an error about undefined references to the function calls for that library.  I'm pretty sure it's a linkage issue, because I can fuss with the C code and make an intentional error in the function calls to that library which produces earlier errors that indicate that the function prototypes have been loaded and used to compile.</p>
  
  <p>I tried adding the location that contains the .a file to LDFLAGS and then doing a AC_CHECK_LIB but it is not found.</p>
  
  <p>Maybe my syntax is wrong, or maybe I'm missing something more fundamental, which would not be surprising since I'm a newbie and don't really know what I'm doing.</p>
  
  <p>Here is what I have tried:</p>
  
  <pre><code>AC_CHECK_HEADER([$location/helper.h], 
      [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
      CFLAGS="$CFLAGS -I$location"; 
      LDFLAGS="$LDFLAGS -L$location"; 
      AC_CHECK_LIB(helper)])
  </code></pre>
  
  <p>No dice.  AC_CHECK_LIB is looking for -lhelper I guess (or libhelper?) so I'm not sure if that's a problem, so I tried this, too (omit AC_CHECK_LIB and include the .a directly in LDFLAGS), without luck:</p>
  
  <pre><code>AC_CHECK_HEADER([$location/helper.h], 
      [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
      CFLAGS="$CFLAGS -I$location"; 
      LDFLAGS="$LDFLAGS -L$location/helper.a"])
  </code></pre>
  
  <p>To emulate the manual compilation, I tried removing the -L but that doesn't help:</p>
  
  <pre><code>AC_CHECK_HEADER([$location/helper.h], 
      [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
      CFLAGS="$CFLAGS -I$location"; 
      LDFLAGS="$LDFLAGS $location/helper.a"])
  </code></pre>
  
  <p>I tried other combinations and permutations, but I think I might be missing something more fundamental....</p>
  
  <p>================ UPDATE</p>
  
  <p>I got it to work with a hard-coded path to the .a file in Makefile.am using _LDADD like this:</p>
  
  <pre><code>myprog_LDADD=/home/john/mystuff/helper.a
  </code></pre>
  
  <p>But I can't predict the location of the .a file.  For some reason, defining myprog_LDADD in configure.ac doesn't work (I wish it did, so I can use my dynamic location variable), and no combination of changes to LDFLAGS, myprog_LDFLAGS, AM_LDFLAGS seems to work.</p>
  
  <p>If, in Makefile.am, I try to use the variable location that is defined in configure.ac, it doesn't work</p>
  
  <pre><code>myprog_LDADD=($location)helper.a
  </code></pre>
  
  <p>================ UPDATE</p>
  
  <p>I think I figured it out, but since I have no idea what I'm doing, I'd REALLY appreciate some feedback.  I used AC_SUBST() to get myprog_LDADD to work from configure.ac, so the final solution looks like this:</p>
  
  <pre><code>AC_CHECK_HEADER([$location/helper.h], 
      [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
      CFLAGS="$CFLAGS -I$location" 
      myprog_LDADD="$location/helper.a" 
      AC_SUBST(myprog_LDADD)])
  </code></pre>