xref: /freebsd/contrib/ncurses/mk-0th.awk (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
1*21817992SBaptiste Daroussin# $Id: mk-0th.awk,v 1.24 2021/03/20 11:44:48 tom Exp $
20e3d5408SPeter Wemm##############################################################################
3*21817992SBaptiste Daroussin# Copyright 2020,2021 Thomas E. Dickey                                       #
4e1865124SBaptiste Daroussin# Copyright 1998-2010,2012 Free Software Foundation, Inc.                    #
50e3d5408SPeter Wemm#                                                                            #
60e3d5408SPeter Wemm# Permission is hereby granted, free of charge, to any person obtaining a    #
70e3d5408SPeter Wemm# copy of this software and associated documentation files (the "Software"), #
80e3d5408SPeter Wemm# to deal in the Software without restriction, including without limitation  #
90e3d5408SPeter Wemm# the rights to use, copy, modify, merge, publish, distribute, distribute    #
100e3d5408SPeter Wemm# with modifications, sublicense, and/or sell copies of the Software, and to #
110e3d5408SPeter Wemm# permit persons to whom the Software is furnished to do so, subject to the  #
120e3d5408SPeter Wemm# following conditions:                                                      #
130e3d5408SPeter Wemm#                                                                            #
140e3d5408SPeter Wemm# The above copyright notice and this permission notice shall be included in #
150e3d5408SPeter Wemm# all copies or substantial portions of the Software.                        #
160e3d5408SPeter Wemm#                                                                            #
170e3d5408SPeter Wemm# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
180e3d5408SPeter Wemm# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
190e3d5408SPeter Wemm# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
200e3d5408SPeter Wemm# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
210e3d5408SPeter Wemm# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
220e3d5408SPeter Wemm# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
230e3d5408SPeter Wemm# DEALINGS IN THE SOFTWARE.                                                  #
240e3d5408SPeter Wemm#                                                                            #
250e3d5408SPeter Wemm# Except as contained in this notice, the name(s) of the above copyright     #
260e3d5408SPeter Wemm# holders shall not be used in advertising or otherwise to promote the sale, #
270e3d5408SPeter Wemm# use or other dealings in this Software without prior written               #
280e3d5408SPeter Wemm# authorization.                                                             #
290e3d5408SPeter Wemm##############################################################################
300e3d5408SPeter Wemm#
3106bfebdeSXin LI# Author: Thomas E. Dickey 1996-on
320e3d5408SPeter Wemm#
330e3d5408SPeter Wemm# Generate list of sources for a library, together with lint/lintlib rules
340e3d5408SPeter Wemm#
350e3d5408SPeter Wemm# Variables:
3639f2269fSPeter Wemm#	libname (library name, e.g., "ncurses", "panel", "forms", "menus")
374a1a9510SRong-En Fan#	subsets (is used here to decide if wide-character code is used)
3873f0a83dSXin LI#	ticlib (library name for libtic, e.g., "tic")
3973f0a83dSXin LI#	termlib (library name for libtinfo, e.g., "tinfo")
400e3d5408SPeter Wemm#
4173f0a83dSXin LIfunction make_lintlib(name,sources) {
4273f0a83dSXin LI	print  ""
4373f0a83dSXin LI	print  "clean ::"
4473f0a83dSXin LI	printf "\trm -f llib-l%s.*\n", name
4573f0a83dSXin LI	print  ""
4673f0a83dSXin LI	print  "realclean ::"
4773f0a83dSXin LI	printf "\trm -f llib-l%s\n", name
4873f0a83dSXin LI	print  ""
4973f0a83dSXin LI	printf "llib-l%s : %s\n", name, sources
5073f0a83dSXin LI	printf "\tcproto -a -l -DNCURSES_ENABLE_STDBOOL_H=0 -DLINT $(CPPFLAGS) %s >$@\n", sources
5173f0a83dSXin LI	print  ""
5273f0a83dSXin LI	print  "lintlib ::"
5373f0a83dSXin LI	printf "\tsh $(srcdir)/../misc/makellib %s $(CPPFLAGS)\n", name
5473f0a83dSXin LI	print ""
5573f0a83dSXin LI	print "lint ::"
5673f0a83dSXin LI	printf "\t$(LINT) $(LINT_OPTS) $(CPPFLAGS) %s $(LINT_LIBS)\n", sources
5773f0a83dSXin LI}
5873f0a83dSXin LI
5973f0a83dSXin LI# A blank in "subsets" indicates a split-off of the library into a separate
6073f0a83dSXin LI# file, e.g., for libtic or libtinfo.  They are all logical parts of the same
6173f0a83dSXin LI# library.
6273f0a83dSXin LIfunction which_library() {
6373f0a83dSXin LI	if ( ( which == "ticlib" ) && ( subsets ~ /ticlib / ) ) {
6473f0a83dSXin LI		return ticlib;
6573f0a83dSXin LI	} else if ( ( which == "termlib" || which == "ext_tinfo" ) && ( subsets ~ /[[:space:]]base/ ) ) {
6673f0a83dSXin LI		return termlib;
6773f0a83dSXin LI	} else {
6873f0a83dSXin LI		return libname;
6973f0a83dSXin LI	}
7073f0a83dSXin LI}
7173f0a83dSXin LI
7273f0a83dSXin LIfunction show_list(name, len, list) {
7373f0a83dSXin LI	if ( len > 0 ) {
7473f0a83dSXin LI		printf "\n%s_SRC =", toupper(name);
7573f0a83dSXin LI		for (n = 0; n < len; ++n)
7673f0a83dSXin LI			printf " \\\n\t%s", list[n];
7773f0a83dSXin LI		print "";
7873f0a83dSXin LI		make_lintlib(name, sprintf("$(%s_SRC)", toupper(name)));
7973f0a83dSXin LI	}
8073f0a83dSXin LI}
8173f0a83dSXin LI
820e3d5408SPeter WemmBEGIN	{
8306bfebdeSXin LI		which = libname;
844a1a9510SRong-En Fan		using = 0;
854a1a9510SRong-En Fan		found = 0;
8673f0a83dSXin LI		count_ticlib = 0;
8773f0a83dSXin LI		count_termlib = 0;
8873f0a83dSXin LI		count_library = 0;
894a1a9510SRong-En Fan	}
9006bfebdeSXin LI	/^@/ {
9106bfebdeSXin LI		which = $0;
9273f0a83dSXin LI		sub(/^@[[:blank:]]+/, "", which);
9373f0a83dSXin LI		sub(/[[:blank:]]+$/, "", which);
9406bfebdeSXin LI	}
954a1a9510SRong-En Fan	!/^[@#]/ {
964a1a9510SRong-En Fan		if (using == 0)
974a1a9510SRong-En Fan		{
980e3d5408SPeter Wemm			print  ""
990e3d5408SPeter Wemm			print  "# generated by mk-0th.awk"
1004a1a9510SRong-En Fan			printf "#   libname:    %s\n", libname
1014a1a9510SRong-En Fan			printf "#   subsets:    %s\n", subsets
10273f0a83dSXin LI			if ( libname ~ /ncurses/ ) {
10373f0a83dSXin LI				printf "#   ticlib:     %s\n", ticlib
10473f0a83dSXin LI				printf "#   termlib:    %s\n", termlib
10573f0a83dSXin LI			}
1060e3d5408SPeter Wemm			print  ""
1077a69bbfbSPeter Wemm			print  ".SUFFIXES: .c .cc .h .i .ii"
10815589c42SPeter Wemm			print  ".c.i :"
10915589c42SPeter Wemm			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
1107a69bbfbSPeter Wemm			print  ".cc.ii :"
1117a69bbfbSPeter Wemm			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
11215589c42SPeter Wemm			print  ".h.i :"
11315589c42SPeter Wemm			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
11415589c42SPeter Wemm			print  ""
1154a1a9510SRong-En Fan			using = 1;
1160e3d5408SPeter Wemm		}
11706bfebdeSXin LI		if (which ~ /port_/ )
11806bfebdeSXin LI		{
11906bfebdeSXin LI			# skip win32 source
12006bfebdeSXin LI		}
12106bfebdeSXin LI		else if ( $0 != "" && $1 != "link_test" )
1220e3d5408SPeter Wemm		{
1230e3d5408SPeter Wemm			if ( found == 0 )
1240e3d5408SPeter Wemm			{
12539f2269fSPeter Wemm				if ( subsets ~ /widechar/ )
12639f2269fSPeter Wemm					widechar = 1;
12739f2269fSPeter Wemm				else
12839f2269fSPeter Wemm					widechar = 0;
1290e3d5408SPeter Wemm				printf "C_SRC ="
1300e3d5408SPeter Wemm				if ( $2 == "lib" )
1310e3d5408SPeter Wemm					found = 1
132*21817992SBaptiste Daroussin				else if ( $2 == "c++" )
1330e3d5408SPeter Wemm					found = 2
134*21817992SBaptiste Daroussin				else
135*21817992SBaptiste Daroussin					found = 3
1360e3d5408SPeter Wemm			}
13739f2269fSPeter Wemm			if ( libname == "c++" || libname == "c++w" ) {
13873f0a83dSXin LI				srcname = sprintf("%s/%s.cc", $3, $1);
13973f0a83dSXin LI				printf " \\\n\t%s", srcname;
14039f2269fSPeter Wemm			} else if ( widechar == 1 || $3 != "$(wide)" ) {
14173f0a83dSXin LI				srcname = sprintf("%s/%s.c", $3, $1);
14273f0a83dSXin LI				printf " \\\n\t%s", srcname;
14373f0a83dSXin LI				if ( which_library() == libname ) {
14473f0a83dSXin LI					list_library[count_library++] = srcname;
14573f0a83dSXin LI				} else if ( which_library() == ticlib ) {
14673f0a83dSXin LI					list_ticlib[count_ticlib++] = srcname;
14773f0a83dSXin LI				} else {
14873f0a83dSXin LI					list_termlib[count_termlib++] = srcname;
14973f0a83dSXin LI				}
1500e3d5408SPeter Wemm			}
1510e3d5408SPeter Wemm		}
15239f2269fSPeter Wemm	}
1530e3d5408SPeter WemmEND	{
1540e3d5408SPeter Wemm		print  ""
1550e3d5408SPeter Wemm		if ( found == 1 )
1560e3d5408SPeter Wemm		{
1570e3d5408SPeter Wemm			print  ""
15873f0a83dSXin LI			printf "# Producing llib-l%s is time-consuming, so there's no direct-dependency for\n", libname;
15973f0a83dSXin LI			print  "# it in the lintlib rule.  We'll only remove in the cleanest setup.";
16073f0a83dSXin LI			show_list(libname, count_library, list_library);
16173f0a83dSXin LI			show_list(ticlib, count_ticlib, list_ticlib);
16273f0a83dSXin LI			show_list(termlib, count_termlib, list_termlib);
1630e3d5408SPeter Wemm		}
164*21817992SBaptiste Daroussin		else if ( found == 2 )
165*21817992SBaptiste Daroussin		{
166*21817992SBaptiste Daroussin			make_lintlib(libname, "$(C_SRC)");
167*21817992SBaptiste Daroussin		}
1680e3d5408SPeter Wemm		else
1690e3d5408SPeter Wemm		{
1700e3d5408SPeter Wemm			print  ""
1710e3d5408SPeter Wemm			print  "lintlib :"
1720e3d5408SPeter Wemm			print  "\t@echo no action needed"
1730e3d5408SPeter Wemm		}
1740e3d5408SPeter Wemm	}
17573f0a83dSXin LI# vile:ts=4 sw=4
176