summaryrefslogtreecommitdiffstats
path: root/INSTALL_MAINT
blob: 2f42cf0f04e07c99fca9b332ef042f39f296196c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
Information for HDF5 maintainers:

* You can run make from any directory.  However, running in a
  subdirectory only knows how to build things in that directory and
  below.  However, all makefiles know when their target depends on
  something outside the local directory tree:

	$ cd test
	$ make
	make: *** No rule to make target ../src/libhdf5.a

* All Makefiles understand the following targets:

        all              -- build locally.
        install          -- install libs, headers, progs.
        uninstall        -- remove installed files.
        mostlyclean      -- remove temp files (eg, *.o but not *.a).
        clean            -- mostlyclean plus libs and progs.
        distclean        -- all non-distributed files.
        maintainer-clean -- all derived files but H5config.h.in and configure.

* Most Makefiles also understand:

	TAGS		-- build a tags table
	dep, depend	-- recalculate source dependencies
	lib		-- build just the libraries w/o programs

* If you have personal preferences for which make, compiler, compiler
  flags, preprocessor flags, etc., that you use and you don't want to
  set environment variables, then use a site configuration file.

  When configure starts, it looks in the config directory for files
  whose name is some combination of the CPU name, vendor, and
  operating system in this order:

	CPU-VENDOR-OS
	VENDOR-OS
	OS

  The first file which is found is sourced and can therefore affect
  the behavior of the rest of configure.  For example, the linux
  configuration file might contain:

	# Site configuration -- do not distribute this file.
	if test "X$CFLAGS" = "X"; then
	   CFLAGS="-g -Wall"
        fi

  Site configuration files are for personal preferences and should
  not be distributed. Run bin/config.guess to see what we think your
  CPU, VENDOR, and OS values are.

* If you use GNU make along with gcc the Makefile will contain targets
  that automatically maintain a list of source interdependencies; you
  seldom have to say `make clean'.  I say `seldom' because if you
  change how one `*.h' file includes other `*.h' files you'll have
  to force an update.

  To force an update of all dependency information remove the
  `.depend' file from each directory and type `make'.  For
  instance:

	$ cd $HDF5_HOME
	$ find . -name .depend -exec rm {} \;
	$ make

* Object files stay in the directory and are added to the library as a
  final step instead of placing the file in the library immediately
  and removing it from the directory.  The reason is three-fold:

	1.  Most versions of make don't allow `$(LIB)($(SRC:.c=.o))'
	    which makes it necessary to have two lists of files, one
	    that ends with `.c' and the other that has the library
	    name wrapped around each `.o' file.

	2.  Some versions of make/ar have problems with modification
	    times of archive members.

	3.  Adding object files immediately causes problems on SMP
	    machines where make is doing more than one thing at a
	    time.

* When using GNU make on an SMP you can cause it to compile more than
  one thing at a time.  At the top of the source tree invoke make as

	$ make -j -l6

  which causes make to fork as many children as possible as long as
  the load average doesn't go above 6.  In subdirectories one can say

	$ make -j2

  which limits the number of children to two (this doesn't work at the
  top level because the `-j2' is not passed to recursive makes.