1# $Id: mk-0th.awk,v 1.22 2012/06/30 20:56:11 tom Exp $
2##############################################################################
3# Copyright (c) 1998-2010,2012 Free Software Foundation, Inc.                #
4#                                                                            #
5# Permission is hereby granted, free of charge, to any person obtaining a    #
6# copy of this software and associated documentation files (the "Software"), #
7# to deal in the Software without restriction, including without limitation  #
8# the rights to use, copy, modify, merge, publish, distribute, distribute    #
9# with modifications, sublicense, and/or sell copies of the Software, and to #
10# permit persons to whom the Software is furnished to do so, subject to the  #
11# following conditions:                                                      #
12#                                                                            #
13# The above copyright notice and this permission notice shall be included in #
14# all copies or substantial portions of the Software.                        #
15#                                                                            #
16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
17# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
18# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
19# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
20# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
21# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
22# DEALINGS IN THE SOFTWARE.                                                  #
23#                                                                            #
24# Except as contained in this notice, the name(s) of the above copyright     #
25# holders shall not be used in advertising or otherwise to promote the sale, #
26# use or other dealings in this Software without prior written               #
27# authorization.                                                             #
28##############################################################################
29#
30# Author: Thomas E. Dickey 1996-on
31#
32# Generate list of sources for a library, together with lint/lintlib rules
33#
34# Variables:
35#	libname (library name, e.g., "ncurses", "panel", "forms", "menus")
36#	subsets (is used here to decide if wide-character code is used)
37#	ticlib (library name for libtic, e.g., "tic")
38#	termlib (library name for libtinfo, e.g., "tinfo")
39#
40function make_lintlib(name,sources) {
41	print  ""
42	print  "clean ::"
43	printf "\trm -f llib-l%s.*\n", name
44	print  ""
45	print  "realclean ::"
46	printf "\trm -f llib-l%s\n", name
47	print  ""
48	printf "llib-l%s : %s\n", name, sources
49	printf "\tcproto -a -l -DNCURSES_ENABLE_STDBOOL_H=0 -DLINT $(CPPFLAGS) %s >$@\n", sources
50	print  ""
51	print  "lintlib ::"
52	printf "\tsh $(srcdir)/../misc/makellib %s $(CPPFLAGS)\n", name
53	print ""
54	print "lint ::"
55	printf "\t$(LINT) $(LINT_OPTS) $(CPPFLAGS) %s $(LINT_LIBS)\n", sources
56}
57
58# A blank in "subsets" indicates a split-off of the library into a separate
59# file, e.g., for libtic or libtinfo.  They are all logical parts of the same
60# library.
61function which_library() {
62	if ( ( which == "ticlib" ) && ( subsets ~ /ticlib / ) ) {
63		return ticlib;
64	} else if ( ( which == "termlib" || which == "ext_tinfo" ) && ( subsets ~ /[[:space:]]base/ ) ) {
65		return termlib;
66	} else {
67		return libname;
68	}
69}
70
71function show_list(name, len, list) {
72	if ( len > 0 ) {
73		printf "\n%s_SRC =", toupper(name);
74		for (n = 0; n < len; ++n)
75			printf " \\\n\t%s", list[n];
76		print "";
77		make_lintlib(name, sprintf("$(%s_SRC)", toupper(name)));
78	}
79}
80
81BEGIN	{
82		which = libname;
83		using = 0;
84		found = 0;
85		count_ticlib = 0;
86		count_termlib = 0;
87		count_library = 0;
88	}
89	/^@/ {
90		which = $0;
91		sub(/^@[[:blank:]]+/, "", which);
92		sub(/[[:blank:]]+$/, "", which);
93	}
94	!/^[@#]/ {
95		if (using == 0)
96		{
97			print  ""
98			print  "# generated by mk-0th.awk"
99			printf "#   libname:    %s\n", libname
100			printf "#   subsets:    %s\n", subsets
101			if ( libname ~ /ncurses/ ) {
102				printf "#   ticlib:     %s\n", ticlib
103				printf "#   termlib:    %s\n", termlib
104			}
105			print  ""
106			print  ".SUFFIXES: .c .cc .h .i .ii"
107			print  ".c.i :"
108			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
109			print  ".cc.ii :"
110			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
111			print  ".h.i :"
112			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
113			print  ""
114			using = 1;
115		}
116		if (which ~ /port_/ )
117		{
118			# skip win32 source
119		}
120		else if ( $0 != "" && $1 != "link_test" )
121		{
122			if ( found == 0 )
123			{
124				if ( subsets ~ /widechar/ )
125					widechar = 1;
126				else
127					widechar = 0;
128				printf "C_SRC ="
129				if ( $2 == "lib" )
130					found = 1
131				else
132					found = 2
133			}
134			if ( libname == "c++" || libname == "c++w" ) {
135				srcname = sprintf("%s/%s.cc", $3, $1);
136				printf " \\\n\t%s", srcname;
137			} else if ( widechar == 1 || $3 != "$(wide)" ) {
138				srcname = sprintf("%s/%s.c", $3, $1);
139				printf " \\\n\t%s", srcname;
140				if ( which_library() == libname ) {
141					list_library[count_library++] = srcname;
142				} else if ( which_library() == ticlib ) {
143					list_ticlib[count_ticlib++] = srcname;
144				} else {
145					list_termlib[count_termlib++] = srcname;
146				}
147			}
148		}
149	}
150END	{
151		print  ""
152		if ( found == 1 )
153		{
154			print  ""
155			printf "# Producing llib-l%s is time-consuming, so there's no direct-dependency for\n", libname;
156			print  "# it in the lintlib rule.  We'll only remove in the cleanest setup.";
157			show_list(libname, count_library, list_library);
158			show_list(ticlib, count_ticlib, list_ticlib);
159			show_list(termlib, count_termlib, list_termlib);
160		}
161		else
162		{
163			print  ""
164			print  "lintlib :"
165			print  "\t@echo no action needed"
166		}
167	}
168# vile:ts=4 sw=4
169