summaryrefslogtreecommitdiffstats
path: root/doc/html/TechNotes/Automake.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/html/TechNotes/Automake.html')
-rw-r--r--doc/html/TechNotes/Automake.html223
1 files changed, 223 insertions, 0 deletions
diff --git a/doc/html/TechNotes/Automake.html b/doc/html/TechNotes/Automake.html
new file mode 100644
index 0000000..c6dfc41
--- /dev/null
+++ b/doc/html/TechNotes/Automake.html
@@ -0,0 +1,223 @@
+<html>
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=utf-8">
+<title>An Automake Primer for HDF5</title>
+</head>
+
+<h2>An Automake Primer for HDF5</h2>
+<h4>James Laird - May 2005</h4><br>
+
+<p><h2><u>How to:</u><h2></p>
+
+<p><h3>Change a Makefile</h3></p>
+
+<p><h3>Add a source file to an existing program or library</h3></p>
+
+<p><h3>Add a simple test</h3></p>
+
+<p><h3>Add a test with multiple sources</h3></p>
+
+<p><h3>Add a new directory</h3></p>
+
+<p><h3>Add a program that is only compiled in parallel</h3></p>
+
+<p><h3>Change a program's name when it is compiled in parallel</h3></p>
+
+<p><h3>Add a new library</h3></p>
+
+<p><h3>Change the library's API</h3></p>
+<br>
+
+<p><h4>Changing a Makefile</h4></p>
+
+<p>Suppose you need to make a minor change to the Makefile in the test directory
+(<code>hdf5/test/Makefile</code>). You have checked out hdf5 from the CVS repository into
+<code>~/scratch/hdf5</code>. You want to build the library in a directory named
+<code>~/scratch/build</code>.<br>
+First, edit the Makefile.am in the source tree. You must make any changes in the Makefile.am,
+not the Makefile, since the Makefile is automatically generated.</p>
+
+<p><code>cd ~/scratch/hdf5/test<br>
+vi Makefile.am</code></p>
+
+<p>Now, go to the root of the source tree and run the reconfigure script, which updates the
+source tree. It will create a new Makefile.in in the test directory with your changes.</p>
+
+<p><code>cd ~/scratch/hdf5<br>
+./bin/reconfigure</code></p>
+
+<p>After running <code>bin/reconfigure</code>, you will want to test your change. Go to
+<code>~/scratch/build</code> and run <code>configure</code>.</p>
+
+<p><code>cd ~/scratch/build<br>
+
+../hdf5/configure<br>
+
+make check</code></p>
+
+<p>Configure generates Makefiles from the Makefiles.in in the source tree. The dependencies are:</p>
+
+<p><code>Makefile.am -&gt; (bin/reconfigure) -&gt; Makefile.in -&gt; (configure) -&gt; Makefile</code></p>
+
+<p>Reconfigure should also be used when any change is made to configure.in.</p>
+<br>
+
+<p><h4>Adding a source file to an existing program or library</h4></p>
+
+<p>Suppose you want to add the source file <code>h5testfoo.c</code> to the HDF5 test
+library in the test directory. You open up <code>test/Makefile.am</code> in your
+favorite text editor and scroll down until you see the line:</p>
+
+<p><code>libh5test_la_SOURCES=h5test.c testframe.c</code></p>
+
+<p>Just add <code>h5testfoo.c</code> to the list of sources. You're done!<br>
+Now run <code>bin/reconfigure</code> to create a new Makefile.in from the Makefile.am you just
+edited.</p>
+<br>
+
+<p><h4>Adding a simple test</h4></p>
+
+<p>Suppose you want to create a new test executable named <code>newtest</code> with one
+source file, <code>newtest.c</code>. You open up <code>test/Makefile.am</code> and find
+the line</p>
+
+<p><code>TEST_PROG=testhdf5 lheap ohdr ...</code></p>
+
+<p>Just add <code>newtest</code> to the list of programs. That's it!  Automake will by
+default guess that your program <code>newtest</code> has one source file named
+<code>newtest.c</code>.<br>
+Now run <code>bin/reconfigure</code> to update the Makefile.in.</p>
+<br>
+
+<p><h4>Adding a slightly more complicated test</h4></p>
+
+<p>Suppose you want to create a new test executable named <code>newertest</code> with
+several source files. You open up <code>test/Makefile.am</code> as before and find the line</p>
+
+<p><code>TEST_PROG=testhdf5 lheap ohdr ...</code></p>
+
+<p>Add <code>newertest</code> to the list of programs.<br>
+Now you need to tell Automake how to build newertest. Add a new line below
+<code>TEST_PROG</code>:</p>
+
+<p><code>newtest_SOURCES = source1.c source2.c source3.c</code></p>
+
+<p>You don't need to mention header files, as these will be automatically detected.<br>
+Now run <code>bin/reconfigure</code> to update the Makefile.in.</p>
+<br>
+
+<p><h4>Adding a directory</h4></p>
+
+<p>To add the directory for a new tool, <code>h5merge</code>, go to the Makefile.am
+in the tools directory (the parent directory of the directory you want to add).
+Find the line that reads</p>
+
+<p><code>SUBDIRS=lib h5dump...</code></p>
+
+<p>Add <code>h5merge</code> to this list of subdirectories.<br>
+Now you probably want to create a Makefile.am in the h5merge directory. A good starting
+point for this Makefile.am might be the sample Makefile.am in the config directory
+(<code>config/Makefile.am.blank</code>). Alternately, you could copy the Makefile.am
+from another directory.<br>
+Once you have your new Makefile.am in place, edit <code>configure.in</code> in the root
+directory. Near the end of the file is a list of files generated by configure.
+Add <code>tools/h5merge/Makefile.in</code> to this list.<br>
+Now run <code>bin/reconfigure</code>. This will update configure and generate a Makefile.in in the
+<code>tools/h5merge</code> directory. Don't forget to add both the Makefile.am and the Makefile.in to
+CVS, and to update the manifest!.</p>
+<br>
+
+<p><h4>Adding a program that is only compiled in parallel</h4></p>
+
+<p>Suppose you only want to compile a program when HDF5 is configured to run in
+parallel--for example, a parallel version of h5repack called <code>h5prepack</code>.
+Open up the h5repack Makefile.am<br>
+The simple solution is:</p>
+
+<p><code>if BUILD_PARALLEL_CONDITIONAL<br>
+&nbsp;&nbsp;&nbsp;H5PREPACK=h5prepack<br>
+endif</code></p>
+
+<p>Now the variable <code>$H5PREPACK</code> will be &quot;h5prepack&quot; if parallel is
+enabled and &quot;&quot; if parallel is disabled. Add <code>$H5PREPACK</code> to the list of
+programs to be built:</p>
+
+<p><code>bin_PROGRAMS=h5repack $(H5PREPACK)</code></p>
+
+<p>Add sources for this program as usual:</p>
+
+<p><code>h5prepack_SOURCES=...</code></p>
+
+<p>Don't forget to run <code>bin/reconfigure</code> when you're done!</p>
+<br>
+
+<p><h4>Changing a program's name when it is compiled in parallel</h4></p>
+
+<p>Automake conditionals can be a very powerful tool. Suppose that instead of building
+two versions of h5repack during a parallel build, you want to change the name of
+the tool depending on whether or not HDF5 is configured to run in parallel--you
+want to create either h5repack or h5prepack, but not both.<br>
+Open up the h5repack Makefile.am and use an automake conditional:</p>
+
+<p><code>if BUILD_PARALLEL_CONDITIONAL<br>
+&nbsp;&nbsp;&nbsp;H5REPACK_NAME=h5prepack<br>
+else<br>
+&nbsp;&nbsp;&nbsp;H5REPACK_NAME=h5repack<br>
+endif<br>
+bin_PROGRAMS=$(H5REPACK_NAME)</p>
+
+<p>Now you only build one program, but the name of that program changes. You still need
+to define sources for both h5repack and h5prepack, but you needn't type them out twice if
+they are the same:</p>
+
+<p><code>h5repack_SOURCES=...<br>
+h5prepack_SOURCES=$(h5repack_SOURCES)</code></p>
+
+<p>Don't forget to run <code>bin/reconfigure</code> when you're done!</p>
+<br>
+
+<p><h4>Adding a new library</h4></p>
+
+<p>Suppose you want to add a new library to the HDF5 build tree, libfoo. The procedure for
+building libraries is very similar to that for building programs:</p>
+
+<p><code>lib_LTLIBRARIES=libfoo.la<br>
+libfoo_la_SOURCES=sourcefoo.c sourcefootwo.c </code></p>
+
+<p>This library will be installed in the lib directory when a user types
+"<code>make install</code>".<br>
+You might instead be building a convenience library for testing purposes (like
+<code>libh5test.la</code>) and not want it to be installed. If this is the case, you
+would type</p>
+
+<p><code>check_LTLIBRARIES=libfoo.la</code><br>
+instead of<br>
+<code>lib_LTLIBRARIES=libfoo.la</code></p>
+
+<p>To make it easier for other directories to link to your library,
+you might want to assign its path to a variable in all HDF5 Makefiles. You can
+make changes to all Makefiles by editing <code>config/commence.am</code> and adding a line
+like</p>
+
+<p><code>LIBFOO=$(top_builddir)/foo/src/libfoo.la</code></p>
+
+<p><code>config/commence.am</code> is textually included in all Makefiles.am when automake
+processes them.<br>
+As always, if you change a Makefile.am or <code>config/commence.am</code>, don't forget to run
+<code>bin/reconfigure</code>.</p>
+<br>
+
+<p><h4>Changing HDF5's API</h4></p>
+
+<p>If you have added or removed a function from HDF5, or if you have changed a function
+signature, you must indicate this by updating the file <code>lt_vers.am</code> located in
+the <code>config</code> directory.<br>
+If you have changed the API at all, increment <code>LT_VERS_INTERFACE</code> and set
+<code>LT_VERS_REVISION</code> to zero.<br>
+If you have added functions but not altered or removed existing ones, also increment
+<code>LT_VERS_AGE</code>.<br>
+If instead you have altered or removed any functions, reset <code>LT_VERS_AGE</code> to
+zero.</p>
+</body>
+</html>