Check for an up-to-date copyright year in coreutils.texi.
[coreutils/ericb.git] / src / Makefile.am
blob0da57e357fd6e29e71a3a0444ed8073d96cb7071
1 ## Process this file with automake to produce Makefile.in -*-Makefile-*-
3 ## Copyright (C) 1990, 1991, 1993-2007 Free Software Foundation, Inc.
5 ## This program is free software; you can redistribute it and/or modify
6 ## it under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation; either version 2, or (at your option)
8 ## any later version.
10 ## This program is distributed in the hope that it will be useful,
11 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ## GNU General Public License for more details.
15 ## You should have received a copy of the GNU General Public License
16 ## along with this program; if not, write to the Free Software Foundation,
17 ## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 EXTRA_PROGRAMS = chroot df hostid nice pinky stty su uname uptime users who
21 bin_SCRIPTS = groups
22 bin_PROGRAMS = [ chcon chgrp chown chmod cp dd dircolors du \
23   ginstall link ln dir vdir ls mkdir \
24   mkfifo mknod mv nohup readlink rm rmdir shred stat sync touch unlink \
25   cat cksum comm csplit cut expand fmt fold head join md5sum \
26   nl od paste pr ptx sha1sum sha224sum sha256sum sha384sum sha512sum \
27   shuf sort split sum tac tail tr tsort unexpand uniq wc \
28   basename date dirname echo env expr factor false \
29   hostname id kill logname pathchk printenv printf pwd \
30   runcon seq sleep tee \
31   test true tty whoami yes \
32   base64 \
33   $(OPTIONAL_BIN_PROGS) $(DF_PROG)
35 noinst_PROGRAMS = setuidgid
37 noinst_HEADERS = \
38   chown-core.h \
39   copy.h \
40   cp-hash.h \
41   dircolors.h \
42   fs.h \
43   ls.h \
44   remove.h \
45   system.h \
46   wheel-size.h \
47   wheel.h
49 EXTRA_DIST = dcgen dircolors.hin tac-pipe.c \
50   groups.sh wheel-gen.pl extract-magic c99-to-c89.diff
51 BUILT_SOURCES =
52 CLEANFILES = $(SCRIPTS) su
54 AM_CPPFLAGS = -I$(top_srcdir)/lib
56 # Sometimes, the expansion of $(LIBINTL) includes -lc which may
57 # include modules defining variables like `optind', so libcoreutils.a
58 # must precede $(LIBINTL) in order to ensure we use GNU getopt.
59 # But libcoreutils.a must also follow $(LIBINTL), since libintl uses
60 # replacement functions defined in libcoreutils.a.
61 LDADD = ../lib/libcoreutils.a $(LIBINTL) ../lib/libcoreutils.a
63 # for eaccess in lib/euidaccess.c.
64 chcon_LDADD = $(LDADD) $(LIB_SELINUX)
65 cp_LDADD = $(LDADD) $(LIB_EACCESS) $(LIB_SELINUX)
66 ginstall_LDADD = $(LDADD) $(LIB_EACCESS) $(LIB_SELINUX)
67 mkdir_LDADD = $(LDADD) $(LIB_SELINUX)
68 mkfifo_LDADD = $(LDADD) $(LIB_SELINUX)
69 mknod_LDADD = $(LDADD) $(LIB_SELINUX)
70 mv_LDADD = $(LDADD) $(LIB_EACCESS) $(LIB_SELINUX)
71 runcon_LDADD = $(LDADD) $(LIB_SELINUX)
72 pathchk_LDADD = $(LDADD) $(LIB_EACCESS)
73 rm_LDADD = $(LDADD) $(LIB_EACCESS)
74 test_LDADD = $(LDADD) $(LIB_EACCESS)
75 # This is for the '[' program.  Automake transliterates '[' to '_'.
76 __LDADD = $(LDADD) $(LIB_EACCESS)
78 # for clock_gettime and fdatasync
79 dd_LDADD = $(LDADD) $(LIB_GETHRXTIME) $(LIB_FDATASYNC)
80 dir_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_SELINUX)
81 id_LDADD = $(LDADD) $(LIB_SELINUX)
82 ls_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_SELINUX)
83 pr_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
84 shred_LDADD = $(LDADD) $(LIB_GETHRXTIME) $(LIB_FDATASYNC)
85 shuf_LDADD = $(LDADD) $(LIB_GETHRXTIME)
86 vdir_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_SELINUX)
88 ## If necessary, add -lm to resolve use of pow in lib/strtod.c.
89 sort_LDADD = $(LDADD) $(POW_LIB) $(LIB_GETHRXTIME)
91 # for get_date and gettime
92 date_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
93 touch_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
95 # If necessary, add -lm to resolve use of pow in lib/strtod.c.
96 # If necessary, add -liconv to resolve use of iconv in lib/unicodeio.c.
97 printf_LDADD = $(LDADD) $(POW_LIB) $(LIBICONV)
99 # If necessary, add -lm to resolve use of pow in lib/strtod.c.
100 seq_LDADD = $(LDADD) $(POW_LIB)
102 # If necessary, add libraries to resolve the `pow' reference in lib/strtod.c
103 # and the `nanosleep' reference in lib/xnanosleep.c.
104 nanosec_libs = $(LDADD) $(POW_LIB) $(LIB_NANOSLEEP)
106 sleep_LDADD = $(nanosec_libs)
107 tail_LDADD = $(nanosec_libs)
109 # If necessary, add -lm to resolve use of pow in lib/strtod.c.
110 uptime_LDADD = $(LDADD) $(POW_LIB) $(GETLOADAVG_LIBS)
112 su_LDADD = $(LDADD) $(LIB_CRYPT)
114 dir_LDADD += $(LIB_ACL_TRIVIAL) $(LIB_ACL)
115 ls_LDADD += $(LIB_ACL_TRIVIAL) $(LIB_ACL)
116 vdir_LDADD += $(LIB_ACL_TRIVIAL) $(LIB_ACL)
117 cp_LDADD += $(LIB_ACL)
118 mv_LDADD += $(LIB_ACL)
119 ginstall_LDADD += $(LIB_ACL)
121 stat_LDADD = $(LDADD) $(LIB_SELINUX)
123 $(PROGRAMS): ../lib/libcoreutils.a
125 SUFFIXES = .sh
127 # Get the release year from ../lib/version-etc.c.
128 RELEASE_YEAR = \
129   `sed -n '/.*COPYRIGHT_YEAR = \([0-9][0-9][0-9][0-9]\) };/s//\1/p' \
130     $(top_srcdir)/lib/version-etc.c`
132 .sh:
133         rm -f $@ $@-t
134         sed \
135           -e 's!@''bindir''@!$(bindir)!' \
136           -e 's/@''RELEASE_YEAR'@/$(RELEASE_YEAR)/ \
137           -e 's/@''GNU_PACKAGE''@/$(GNU_PACKAGE)/' \
138           -e 's/@''PACKAGE_BUGREPORT''@/$(PACKAGE_BUGREPORT)/' \
139           -e 's/@''VERSION''@/$(VERSION)/' $< > $@-t
140         chmod +x $@-t
141         mv $@-t $@
143 all-local: su$(EXEEXT)
145 installed_su = $(DESTDIR)$(bindir)/`echo su|sed '$(transform)'`
147 setuid_root_mode = a=rx,u+s
149 INSTALL_SU = \
150   p=su; \
151   echo " $(INSTALL_PROGRAM) $$p $(installed_su)"; \
152   $(INSTALL_PROGRAM) $$p $(installed_su); \
153   echo " chown root $(installed_su)"; \
154   chown root $(installed_su); \
155   echo " chmod $(setuid_root_mode) $(installed_su)"; \
156   chmod $(setuid_root_mode) $(installed_su)
158 install-root: su$(EXEEXT)
159         @$(INSTALL_SU)
161 install-exec-local: su$(EXEEXT)
162         @TMPFILE=$(DESTDIR)$(bindir)/.su-$$$$; \
163         rm -f $$TMPFILE; \
164         echo > $$TMPFILE; \
165 ## See if we can create a setuid root executable in $(bindir).
166 ## If not, then don't even try to install su.
167         can_create_suid_root_executable=no; \
168         chown root $$TMPFILE > /dev/null 2>&1 \
169           && chmod $(setuid_root_mode) $$TMPFILE > /dev/null 2>&1 \
170           && can_create_suid_root_executable=yes; \
171         rm -f $$TMPFILE; \
172         if test $$can_create_suid_root_executable = yes; then \
173           $(INSTALL_SU); \
174         else \
175           echo "WARNING: insufficient access; not installing su"; \
176           echo "NOTE: to install su, run 'make install-root' as root"; \
177         fi
179 uninstall-local:
180 # Remove su only if it's one we installed.
181         @if grep '$(GNU_PACKAGE)' $(installed_su) > /dev/null 2>&1; then \
182           echo "  rm -f $(installed_su)"; \
183           rm -f $(installed_su); \
184         else :; fi
186 # Use `ginstall' in the definition of PROGRAMS and in dependencies to avoid
187 # confusion with the `install' target.  The install rule transforms `ginstall'
188 # to install before applying any user-specified name transformations.
190 transform = s/ginstall/install/; @program_transform_name@
191 ginstall_SOURCES = install.c copy.c cp-hash.c
193 # This is for the '[' program.  Automake transliterates '[' to '_'.
194 __SOURCES = lbracket.c
196 cp_SOURCES = cp.c copy.c cp-hash.c
197 dir_SOURCES = ls.c ls-dir.c
198 vdir_SOURCES = ls.c ls-vdir.c
199 ls_SOURCES = ls.c ls-ls.c
200 chown_SOURCES = chown.c chown-core.c
201 chgrp_SOURCES = chgrp.c chown-core.c
203 mv_SOURCES = mv.c copy.c cp-hash.c remove.c
204 rm_SOURCES = rm.c remove.c
206 md5sum_SOURCES = md5sum.c
207 md5sum_CPPFLAGS = -DHASH_ALGO_MD5=1 $(AM_CPPFLAGS)
208 sha1sum_SOURCES = md5sum.c
209 sha1sum_CPPFLAGS = -DHASH_ALGO_SHA1=1 $(AM_CPPFLAGS)
210 sha224sum_SOURCES = md5sum.c
211 sha224sum_CPPFLAGS = -DHASH_ALGO_SHA224=1 $(AM_CPPFLAGS)
212 sha256sum_SOURCES = md5sum.c
213 sha256sum_CPPFLAGS = -DHASH_ALGO_SHA256=1 $(AM_CPPFLAGS)
214 sha384sum_SOURCES = md5sum.c
215 sha384sum_CPPFLAGS = -DHASH_ALGO_SHA384=1 $(AM_CPPFLAGS)
216 sha512sum_SOURCES = md5sum.c
217 sha512sum_CPPFLAGS = -DHASH_ALGO_SHA512=1 $(AM_CPPFLAGS)
219 editpl = sed -e 's,@''PERL''@,$(PERL),g'
221 BUILT_SOURCES += dircolors.h
222 dircolors.h: dcgen dircolors.hin
223         @rm -f $@ $@-t
224         $(PERL) -w -- $(srcdir)/dcgen $(srcdir)/dircolors.hin > $@-t
225         @chmod a-w $@-t
226         mv $@-t $@
228 wheel_size = 5
230 BUILT_SOURCES += wheel-size.h
231 wheel-size.h: Makefile.am
232         @rm -f $@ $@-t
233         echo '#define WHEEL_SIZE $(wheel_size)' > $@-t
234         @chmod a-w $@-t
235         mv $@-t $@
237 BUILT_SOURCES += wheel.h
238 wheel.h: wheel-gen.pl Makefile.am
239         @rm -f $@ $@-t
240         $(srcdir)/wheel-gen.pl $(wheel_size) > $@-t
241         @chmod a-w $@-t
242         mv $@-t $@
244 # false exits nonzero even with --help or --version.
245 # test doesn't support --help or --version.
246 # Tell automake to exempt then from that installcheck test.
247 AM_INSTALLCHECK_STD_OPTIONS_EXEMPT = false test
249 BUILT_SOURCES += fs.h
250 fs.h: stat.c extract-magic
251         rm -f $@
252         $(PERL) $(srcdir)/extract-magic $(srcdir)/stat.c > $@t
253         @chmod a-w $@t
254         mv $@t $@
256 MAINTAINERCLEANFILES = $(BUILT_SOURCES)
258 # Sort in traditional ASCII order, regardless of the current locale;
259 # otherwise we may get into trouble with distinct strings that the
260 # current locale considers to be equal.
261 ASSORT = LC_ALL=C sort
263 all_programs = \
264     $(bin_PROGRAMS) \
265     $(bin_SCRIPTS) \
266   $(EXTRA_PROGRAMS)
268 all_programs.list:
269         @echo $(all_programs) | tr ' ' '\n' | sed -e 's,$(EXEEXT)$$,,' \
270           | $(ASSORT) -u
272 pm = progs-makefile
273 pr = progs-readme
274 # Ensure that the list of programs in README matches the list
275 # of programs we can build.
276 check: check-README check-misc
277 .PHONY: check-README
278 check-README:
279         rm -rf $(pr) $(pm)
280         echo $(all_programs) \
281          | tr -s ' ' '\n' | sed -e 's,$(EXEEXT)$$,,;s/ginstall/install/' \
282          | $(ASSORT) -u > $(pm) && \
283         sed -n '/^The programs .* are:/,/^[a-zA-Z]/p' $(top_srcdir)/README \
284           | sed -n '/^   */s///p' | tr -s ' ' '\n' > $(pr)
285         diff $(pm) $(pr) && rm -rf $(pr) $(pm)
287 # Ensure that the list of programs and author names is accurate.
288 au_dotdot = authors-dotdot
289 au_actual = authors-actual
290 .PHONY: check-AUTHORS
291 check-AUTHORS: $(all_programs)
292         rm -f $(au_actual) $(au_dotdot)
293         for i in `ls $(all_programs) | sed -e 's,$(EXEEXT)$$,,' \
294             | $(ASSORT) -u`; do                         \
295           test "$$i" = '[' && continue;                 \
296           exe=$$i;                                      \
297           if test "$$i" = install; then                 \
298             exe=ginstall;                               \
299           elif test "$$i" = test; then                  \
300             exe='[';                                    \
301           fi;                                           \
302           ./$$exe --version                             \
303             |sed -n '/Written by /{ s//'"$$i"': /; s/,* and /, /; s/\.$$//; p; }'; \
304         done > $(au_actual)
305         sed -n '/:/p' $(top_srcdir)/AUTHORS > $(au_dotdot)
306         diff $(au_actual) $(au_dotdot) && rm -f $(au_actual) $(au_dotdot)
308 # Make sure we don't define any S_IS* macros in src/*.c files.
309 # Not a big deal, but they're already defined via system.h.
311 # Also make sure we don't use st_blocks.  Use ST_NBLOCKS instead.
312 # This is a bit of a kludge, since it prevents use of the string
313 # even in comments, but for now it does the job with no false positives.
314 .PHONY: check-misc
315 check-misc:
316         cd $(srcdir); grep '^# *define  *S_IS' $(SOURCES) && exit 1 || :
317         cd $(srcdir); grep st_blocks $(SOURCES) && exit 1 || :
318         cd $(srcdir); grep '^# *define .*defined' $(SOURCES) && exit 1 || :
320 # Extract the list of authors from each file.
321 sed_filter = s/^ *//;s/N_ (//;s/^"//;s/")*$$//
322 # Sometimes the string is on the same line as the #define...
323 s1 = '/^\#define AUTHORS \([^\\]\)/{;s//\1/;$(sed_filter);p;q;}'
324 # Sometimes the string is on the backslash-continued line after the #define.
325 s2 = '/^\#define AUTHORS \\\\/{;n;$(sed_filter);p;q;}'
326 # FIXME: handle *.sh;  and use $(all_programs), not $(SOURCES)
327 ../AUTHORS: $(SOURCES)
328         rm -f $@-t
329         (                                               \
330           set -e;                                       \
331           echo "Here are the names of the programs in this package,";   \
332           echo "each followed by the name(s) of its author(s).";        \
333           echo;                                         \
334           for i in $(SOURCES); do                       \
335             a=`sed -n $(s1) $$i`;                       \
336             test "$$a" && :                             \
337               || a=`sed -n $(s2) $$i`;                  \
338             if test "$$a"; then                         \
339               prog=`echo $$i|sed 's/\.c$$//'`;          \
340               echo "$$prog: $$a";                       \
341             fi;                                         \
342           done | $(ASSORT) -u ) > $@-t
343         chmod a-w $@-t
344         mv $@-t $@
346 # The following rule is not designed to be portable,
347 # and relies on tools that not everyone has.
349 # Most functions in src/*.c should have static scope.
350 # Any that don't must be marked with `extern', but `main'
351 # and `usage' are exceptions.  They're always extern, but
352 # don't need to be marked.
354 # The second nm|grep checks for file-scope variables with `extern' scope.
355 .PHONY: sc_tight_scope
356 sc_tight_scope: $(all_programs)
357         @t=exceptions-$$$$;                                             \
358         trap "s=$$?; rm -f $$t; exit $$s" 0 1 2 13 15;                  \
359         ( printf '^main$$\n^usage$$\n';                                 \
360           grep -h -A1 '^extern .*[^;]$$' $(SOURCES)                     \
361             | grep -vE '^(extern |--)' |sed 's/^/^/;s/ .*/$$/' ) > $$t; \
362         nm -e *.$(OBJEXT)                                               \
363             | sed -n 's/.* T //p'                                       \
364             | grep -Ev -f $$t &&                                        \
365           { echo 'the above functions should have static scope' 1>&2;   \
366             exit 1; } || : ;                                            \
367         ( printf '^program_name$$\n';                                   \
368           sed -n 's/^extern int \([^ ][^ ]*\);$$/^\1$$/p'               \
369             $(noinst_HEADERS) ) > $$t;                                  \
370         nm -e *.$(OBJEXT)                                               \
371             | sed -n 's/.* [BD] //p'                                    \
372             | grep -Ev -f $$t &&                                        \
373           { echo 'the above variables should have static scope' 1>&2;   \
374             exit 1; } || :