Difference between revisions of "Writing Makefiles"

From Apertium
Jump to navigation Jump to search
Line 67: Line 67:
When you do <code>./autogen.sh --with-lang1=foo</code>, the variable AP_SRC1 will be set to "foo" in the makefile.
When you do <code>./autogen.sh --with-lang1=foo</code>, the variable AP_SRC1 will be set to "foo" in the makefile.


;The details: The autogen.sh script passes its arguments on to the configure script. If configure.ac says e.g. <code>AP_CHECK_LING([1], [aperitum-lol])</code>, then the configure script will have a --with-lang1 option to set to the location of the package apertium-lol (and if you don't pass --with-lang1 to autogen.sh, configure will attempt to find the location of an installed apertium-lol package using pkg-config).
The details:
The autogen.sh script passes its arguments on to the configure script. If configure.ac says e.g. <code>AP_CHECK_LING([1], [aperitum-lol])</code>, then the configure script will have a --with-lang1 option to set to the location of the package apertium-lol (and if you don't pass --with-lang1 to autogen.sh, configure will attempt to find the location of an installed apertium-lol package using pkg-config).


The gory details: The actual configure code for all this checking is in apertium.m4, typically in /usr/share/aclocal/apertium.m4 or /usr/local/share/aclocal/apertium.m4 if you're very interested in reading m4sh code.
:;The gory details: The actual configure code for all this checking is in apertium.m4, typically in /usr/share/aclocal/apertium.m4 or /usr/local/share/aclocal/apertium.m4 if you're very interested in reading m4sh code.


[[Category:Tools]]
[[Category:Tools]]

Revision as of 09:46, 2 December 2014

Some tips for writing clean Makefile.am's in Apertium:

Modes

If you have apertium version 3.3 or higher, you can do this to simplify dealing with Modes files / modes.xml:

In configure.ac, add this:

AP_MKINCLUDE

In Makefile.am, add this:

# Only include one mode file here, the rest will be built along with it (listing several leads to problems with parallell make):
noinst_DATA=modes/$(PREFIX1).mode

@ap_include@

# Most language pairs don't need to specify anything else for install-data-local:
install-data-local: install-modes

EXTRA_DIST: 
	modes.xml \
	# here you'll typically also have other things, like .dix and .t1x 
        # files that are to be included when you make a release

Nowhere else should modes be mentioned in the Makefile.am.

If you follow this system, the modes with install="yes" in modes.xml will be installed, and you won't end up with root-owned modes files, and make -j4 will work fine.

Use .deps/.d to say that the .deps directory must be created

Say you have several goals that put temporary files in .deps/, e.g.

.deps/apertium-wat-lol.lol.dix: apertium-wat-lol.lol.dix
	test -d .deps || mkdir .deps
	xsltproc lexchoicebil.xsl $< >$@

and so on. The .deps directory has to be created for the file in .deps to be created. If you put mkdir .deps in each such goal, you can get a race condition where two goals try to make .deps at the same time.

The solution is this: if a goal needs the .deps directory to be created, let it depend on the file .deps/.d. First put this in Makefile.am:

.deps/.d:
	test -d .deps || mkdir .deps
	touch $@

.PRECIOUS: .deps/.d

(If using apertium 3.3 or higher, you can just do AP_MKINCLUDE, which includes the above .deps/.d goal.)

And then, instead of creating the dir in each goal, just depend on .deps/.d for those goals:

.deps/apertium-wat-lol.lol.dix: apertium-wat-lol.lol.dix .deps/.d
	xsltproc lexchoicebil.xsl $< >$@

(The PRECIOUS line prevents the .d file from being cleaned up and removed automatically.)

Removing directories on make clean

Say you want to remove .deps and modes on "make clean". Don't do CLEANFILES=-rf .deps modes file1 file2 …, it doesn't work everywhere.

A more portable solution is this:

CLEANFILES = $(TARGETS_COMMON)
clean-local: 
	-rm -rf .deps modes

Where does this $AP_SRC1 stuff come from?

When you do ./autogen.sh --with-lang1=foo, the variable AP_SRC1 will be set to "foo" in the makefile.

The details
The autogen.sh script passes its arguments on to the configure script. If configure.ac says e.g. AP_CHECK_LING([1], [aperitum-lol]), then the configure script will have a --with-lang1 option to set to the location of the package apertium-lol (and if you don't pass --with-lang1 to autogen.sh, configure will attempt to find the location of an installed apertium-lol package using pkg-config).
The gory details
The actual configure code for all this checking is in apertium.m4, typically in /usr/share/aclocal/apertium.m4 or /usr/local/share/aclocal/apertium.m4 if you're very interested in reading m4sh code.