views:

49

answers:

2

There are struct definitions in the .h file that my library creates after I build it.. but I cannot find these in the corresponding .h.in. Can somebody tell me how all this works and where it gets the extra info from?

To be specific: I am building pth, the userspace threading library. It has pth_p.h.in, which doesn't contain the struct definition I am looking for, yet when I build the library, a pth_p.h appears and it has the definition I need.

In fact, I have searched every single file in the library before it is built and cannot find where it is generating the struct definition.

A: 

.h.in is probably processed within a configure (generated from configure.ac) script, look out for

AC_CONFIG_FILES([thatfile.h])

It replaces variables of the form @VAR@ in the .in file with their values.

Edit: Just noticed if I'm right you should retag your question

hroptatyr
+2  A: 

Pth uses GNU Autoconf, Automake, and Libtool. By running ./configure you'll be running a shell script which eventually runs m4 to detect the presence of a whole bunch of different system attributes and make changes to a number of files.

It looks like it boils down to ./configure generating Makefile from Makefile.in and then running something via make that triggers the shtool subcommand scpp:

pth_p.h: $(S)pth_p.h.in
    $(SHTOOL) scpp -o pth_p.h -t $(S)pth_p.h.in -Dcpp -Cintern -M '==#==' $(HSRCS)

Obscure link, but here's an shtool-scpp manpage, which describes it as:

This command is an additional ANSI C source file pre-processor for sharing cpp(1) code segments, internal variables and internal functions. The intention for this comes from writing libraries in ANSI C. Here a common shared internal header file is usually used for sharing information between the library source files.

The operation is to parse special constructs in files, generate a few things out of these constructs and insert them at position mark in tfile by writing the output to ofile. Additionally the files are never touched or modified. Instead the constructs are removed later by the cpp(1) phase of the build process. The only prerequisite is that every file has a ``"#include ""ofile"""'' at the top.

leander
Close, but not quite. `m4` is used to compile `configure.ac` or `configure.in` (deprecated) into `./configure`, which is a shell script that runs the whole pile of tests. I'd never seen shtool-scpp before and I'm not sure if I like it or hate it. It's certainly cool, though.
Jack Kelly