cf7817d22993c9552b9b3d10d3ae6996ffab0d98
[ncurses.git] / mk-1st.awk
1 # $Id: mk-1st.awk,v 1.65 2005/06/18 19:15:57 tom Exp $
2 ##############################################################################
3 # Copyright (c) 1998-2004,2005 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
31 #
32 # Generate list of objects for a given model library
33 # Variables:
34 #       name (library name, e.g., "ncurses", "panel", "forms", "menus")
35 #       traces ("all" or "DEBUG", to control whether tracing is compiled in)
36 #       MODEL (e.g., "DEBUG", uppercase; toupper is not portable)
37 #       model (directory into which we compile, e.g., "obj")
38 #       prefix (e.g., "lib", for Unix-style libraries)
39 #       suffix (e.g., "_g.a", for debug libraries)
40 #       subset ("none", "base", "base+ext_funcs" or "termlib")
41 #       ShlibVer ("rel", "abi" or "auto", to augment DoLinks variable)
42 #       ShlibVerInfix ("yes" or "no", determines location of version #)
43 #       DoLinks ("yes", "reverse" or "no", flag to add symbolic links)
44 #       rmSoLocs ("yes" or "no", flag to add extra clean target)
45 #       ldconfig (path for this tool, if used)
46 #       overwrite ("yes" or "no", flag to add link to libcurses.a
47 #       depend (optional dependencies for all objects, e.g, ncurses_cfg.h)
48 #       host (cross-compile host, if any)
49 #
50 # Notes:
51 #       CLIXs nawk does not like underscores in command-line variable names.
52 #       Mixed-case is ok.
53 #       HP/UX requires shared libraries to have executable permissions.
54 #
55 function symlink(src,dst) {
56                 if ( src != dst ) {
57                         printf "rm -f %s; ", dst
58                         printf "$(LN_S) %s %s; ", src, dst
59                 }
60         }
61 function rmlink(directory, dst) {
62                 printf "\t-rm -f %s/%s\n", directory, dst
63 }
64 function removelinks(directory) {
65                 rmlink(directory, end_name);
66                 if ( DoLinks == "reverse" ) {
67                                 if ( ShlibVer == "rel" ) {
68                                         rmlink(directory, abi_name);
69                                         rmlink(directory, rel_name);
70                                 } else if ( ShlibVer == "abi" ) {
71                                         rmlink(directory, abi_name);
72                                 }
73                 } else {
74                                 if ( ShlibVer == "rel" ) {
75                                         rmlink(directory, abi_name);
76                                         rmlink(directory, lib_name);
77                                 } else if ( ShlibVer == "abi" ) {
78                                         rmlink(directory, lib_name);
79                                 }
80                 }
81         }
82 function sharedlinks(directory) {
83                 if ( ShlibVer != "auto" && ShlibVer != "cygdll" ) {
84                         printf "\tcd %s && (", directory
85                         if ( DoLinks == "reverse" ) {
86                                 if ( ShlibVer == "rel" ) {
87                                         symlink(lib_name, abi_name);
88                                         symlink(abi_name, rel_name);
89                                 } else if ( ShlibVer == "abi" ) {
90                                         symlink(lib_name, abi_name);
91                                 }
92                         } else {
93                                 if ( ShlibVer == "rel" ) {
94                                         symlink(rel_name, abi_name);
95                                         symlink(abi_name, lib_name);
96                                 } else if ( ShlibVer == "abi" ) {
97                                         symlink(abi_name, lib_name);
98                                 }
99                         }
100                         printf ")\n"
101                 }
102         }
103 BEGIN   {
104                 found = 0
105                 using = 0
106         }
107         /^@/ {
108                 using = 0
109                 if (subset == "none") {
110                         using = 1
111                 } else if (index(subset,$2) > 0) {
112                         if (using == 0) {
113                                 if (found == 0) {
114                                         print  ""
115                                         printf "# generated by mk-1st.awk (subset=%s)\n", subset
116                                         printf "#  name:          %s\n", name 
117                                         printf "#  traces:        %s\n", traces 
118                                         printf "#  MODEL:         %s\n", MODEL 
119                                         printf "#  model:         %s\n", model 
120                                         printf "#  prefix:        %s\n", prefix 
121                                         printf "#  suffix:        %s\n", suffix 
122                                         printf "#  subset:        %s\n", subset 
123                                         printf "#  ShlibVer:      %s\n", ShlibVer 
124                                         printf "#  ShlibVerInfix: %s\n", ShlibVerInfix 
125                                         printf "#  DoLinks:       %s\n", DoLinks 
126                                         printf "#  rmSoLocs:      %s\n", rmSoLocs 
127                                         printf "#  ldconfig:      %s\n", ldconfig 
128                                         printf "#  overwrite:     %s\n", overwrite 
129                                         printf "#  depend:        %s\n", depend 
130                                         printf "#  host:          %s\n", host 
131                                         print  ""
132                                 }
133                                 using = 1
134                         }
135                         if ( subset == "termlib" || subset == "termlib+ext_tinfo" ) {
136                                 OBJS  = MODEL "_T"
137                         } else {
138                                 OBJS  = MODEL
139                         }
140                 }
141         }
142         /^[@#]/ {
143                 next
144         }
145         $1 ~ /trace/ {
146                 if (traces != "all" && traces != MODEL && $1 != "lib_trace")
147                         next
148         }
149         {
150                 if (using \
151                  && ( $1 != "link_test" ) \
152                  && ( $2 == "lib" \
153                    || $2 == "progs" \
154                    || $2 == "c++" \
155                    || $2 == "tack" ))
156                 {
157                         if ( found == 0 )
158                         {
159                                 printf "%s_OBJS =", OBJS
160                                 if ( $2 == "lib" )
161                                         found = 1
162                                 else
163                                         found = 2
164                         }
165                         printf " \\\n\t../%s/%s$o", model, $1
166                 }
167         }
168 END     {
169                 print  ""
170                 if ( found != 0 )
171                 {
172                         printf "\n$(%s_OBJS) : %s\n", OBJS, depend
173                 }
174                 if ( found == 1 )
175                 {
176                         print  ""
177                         lib_name = sprintf("%s%s%s", prefix, name, suffix)
178                         if ( MODEL == "SHARED" )
179                         {
180                                 if (ShlibVerInfix == "cygdll") {
181                                         abi_name = sprintf("%s%s$(ABI_VERSION)%s", "cyg", name, suffix);
182                                         rel_name = sprintf("%s%s$(REL_VERSION)%s", "cyg", name, suffix);
183                                         imp_name = sprintf("%s%s%s.a", prefix, name, suffix);
184                                 } else if (ShlibVerInfix == "yes") {
185                                         abi_name = sprintf("%s%s.$(ABI_VERSION)%s", prefix, name, suffix);
186                                         rel_name = sprintf("%s%s.$(REL_VERSION)%s", prefix, name, suffix);
187                                 } else {
188                                         abi_name = sprintf("%s.$(ABI_VERSION)", lib_name);
189                                         rel_name = sprintf("%s.$(REL_VERSION)", lib_name);
190                                 }
191                                 if ( DoLinks == "reverse") {
192                                         end_name = lib_name;
193                                 } else {
194                                         if ( ShlibVer == "rel" ) {
195                                                 end_name = rel_name;
196                                         } else if ( ShlibVer == "abi" || ShlibVer == "cygdll" ) {
197                                                 end_name = abi_name;
198                                         } else {
199                                                 end_name = lib_name;
200                                         }
201                                 }
202
203                                 if ( ShlibVer == "cygdll" ) {
204                                         dst_dirs = "$(DESTDIR)$(bindir) $(DESTDIR)$(libdir)";
205                                         printf "$(SHARED_LIB) $(IMPORT_LIB) : $(%s_OBJS)\n", OBJS;
206                                         print "\t-@rm -f $(SHARED_LIB) $(IMPORT_LIB)";
207                                 } else {
208                                         dst_dirs = "$(DESTDIR)$(libdir)";
209                                         printf "../lib/%s : $(%s_OBJS)\n", end_name, OBJS
210                                         print "\t-@rm -f $@";
211                                 }
212                                 if ( subset == "termlib" || subset == "termlib+ext_tinfo" ) {
213                                         printf "\t$(MK_SHARED_LIB) $(%s_OBJS) $(TINFO_LIST) $(LDFLAGS)\n", OBJS
214                                 } else {
215                                         printf "\t$(MK_SHARED_LIB) $(%s_OBJS) $(SHLIB_LIST) $(LDFLAGS)\n", OBJS
216                                 }
217                                 sharedlinks("../lib")
218
219                                 print  ""
220                                 print  "install \\"
221                                 print  "install.libs \\"
222                                 printf "install.%s :: %s $(LIBRARIES)\n", name, dst_dirs
223
224                                 if ( ShlibVer == "cygdll" ) {
225
226                                         src_name = sprintf("../lib/%s", end_name);
227                                         dst_name = sprintf("$(DESTDIR)$(bindir)/%s", end_name);
228                                         printf "\t@echo installing %s as %s\n", src_name, dst_name
229                                         printf "\t-@rm -f %s\n", dst_name
230                                         printf "\t$(INSTALL_LIB) %s %s\n", src_name, dst_name
231
232                                         src_name = sprintf("../lib/%s", imp_name);
233                                         dst_name = sprintf("$(DESTDIR)$(libdir)/%s", imp_name);
234                                         printf "\t@echo installing %s as %s\n", src_name, dst_name
235                                         printf "\t-@rm -f %s\n", dst_name
236                                         printf "\t$(INSTALL_LIB) %s %s\n", src_name, dst_name
237
238                                 } else {
239
240                                         src_name = sprintf("../lib/%s", end_name);
241                                         dst_name = sprintf("$(DESTDIR)$(libdir)/%s", end_name);
242                                         printf "\t@echo installing %s as %s\n", src_name, dst_name
243                                         printf "\t-@rm -f %s\n", dst_name
244                                         printf "\t$(INSTALL_LIB) %s %s\n", src_name, dst_name
245
246                                         sharedlinks("$(DESTDIR)$(libdir)")
247
248                                 }
249
250                                 if ( overwrite == "yes" && name == "ncurses" )
251                                 {
252                                         if ( ShlibVer == "cygdll" ) {
253                                                 ovr_name = sprintf("libcurses%s.a", suffix)
254                                                 printf "\t@echo linking %s to %s\n", imp_name, ovr_name
255                                                 printf "\tcd $(DESTDIR)$(libdir) && (rm -f %s; $(LN_S) %s %s; )\n", ovr_name, imp_name, ovr_name
256                                         } else {
257                                                 ovr_name = sprintf("libcurses%s", suffix)
258                                                 printf "\t@echo linking %s to %s\n", end_name, ovr_name
259                                                 printf "\tcd $(DESTDIR)$(libdir) && (rm -f %s; $(LN_S) %s %s; )\n", ovr_name, end_name, ovr_name
260                                         }
261                                 }
262                                 if ( ldconfig != "" ) {
263                                         printf "\t- test -z \"$(DESTDIR)\" && %s\n", ldconfig
264                                 }
265                                 print  ""
266                                 print  "uninstall \\"
267                                 print  "uninstall.libs \\"
268                                 printf "uninstall.%s ::\n", name
269                                 if ( ShlibVer == "cygdll" ) {
270
271                                         printf "\t@echo uninstalling $(DESTDIR)$(bindir)/%s\n", end_name
272                                         printf "\t-@rm -f $(DESTDIR)$(bindir)/%s\n", end_name
273
274                                         printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", imp_name
275                                         printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", imp_name
276
277                                 } else {
278                                         printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", end_name
279                                         removelinks("$(DESTDIR)$(libdir)")
280                                         if ( overwrite == "yes" && name == "ncurses" )
281                                         {
282                                                 if ( ShlibVer == "cygdll" ) {
283                                                         ovr_name = sprintf("libcurses%s.a", suffix)
284                                                 } else {
285                                                         ovr_name = sprintf("libcurses%s", suffix)
286                                                 }
287                                                 printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", ovr_name
288                                         }
289                                 }
290                                 if ( rmSoLocs == "yes" ) {
291                                         print  ""
292                                         print  "mostlyclean \\"
293                                         print  "clean ::"
294                                         printf "\t-@rm -f so_locations\n"
295                                 }
296                         }
297                         else if ( MODEL == "LIBTOOL" )
298                         {
299                                 if ( $2 == "c++" ) {
300                                         compile="CXX"
301                                 } else {
302                                         compile="CC"
303                                 }
304                                 end_name = lib_name;
305                                 printf "../lib/%s : $(%s_OBJS)\n", lib_name, OBJS
306                                 printf "\tcd ../lib && $(LIBTOOL_LINK) $(%s) -o %s $(%s_OBJS:$o=.lo) -rpath $(DESTDIR)$(libdir) -version-info $(NCURSES_MAJOR):$(NCURSES_MINOR) $(SHLIB_LIST)\n", compile, lib_name, OBJS
307                                 print  ""
308                                 print  "install \\"
309                                 print  "install.libs \\"
310                                 printf "install.%s :: $(DESTDIR)$(libdir) ../lib/%s\n", name, lib_name
311                                 printf "\t@echo installing ../lib/%s as $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name
312                                 printf "\tcd ../lib; $(LIBTOOL_INSTALL) $(INSTALL) %s $(DESTDIR)$(libdir)\n", lib_name
313                                 print  ""
314                                 print  "uninstall \\"
315                                 print  "uninstall.libs \\"
316                                 printf "uninstall.%s ::\n", name
317                                 printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", lib_name
318                                 printf "\t-@$(LIBTOOL_UNINSTALL) rm -f $(DESTDIR)$(libdir)/%s\n", lib_name
319                         }
320                         else
321                         {
322                                 end_name = lib_name;
323                                 printf "../lib/%s : $(%s_OBJS)\n", lib_name, OBJS
324                                 printf "\t$(AR) $(AR_OPTS) $@ $?\n"
325                                 printf "\t$(RANLIB) $@\n"
326                                 if ( host == "vxworks" )
327                                 {
328                                         printf "\t$(LD) $(LD_OPTS) $? -o $(@:.a=$o)\n"
329                                 }
330                                 print  ""
331                                 print  "install \\"
332                                 print  "install.libs \\"
333                                 printf "install.%s :: $(DESTDIR)$(libdir) ../lib/%s\n", name, lib_name
334                                 printf "\t@echo installing ../lib/%s as $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name
335                                 printf "\t$(INSTALL_DATA) ../lib/%s $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name
336                                 if ( overwrite == "yes" && lib_name == "libncurses.a" )
337                                 {
338                                         printf "\t@echo linking libcurses.a to libncurses.a\n"
339                                         printf "\t-@rm -f $(DESTDIR)$(libdir)/libcurses.a\n"
340                                         printf "\t(cd $(DESTDIR)$(libdir) && $(LN_S) libncurses.a libcurses.a)\n"
341                                 }
342                                 printf "\t$(RANLIB) $(DESTDIR)$(libdir)/%s\n", lib_name
343                                 if ( host == "vxworks" )
344                                 {
345                                         printf "\t@echo installing ../lib/lib%s$o as $(DESTDIR)$(libdir)/lib%s$o\n", name, name
346                                         printf "\t$(INSTALL_DATA) ../lib/lib%s$o $(DESTDIR)$(libdir)/lib%s$o\n", name, name
347                                 }
348                                 print  ""
349                                 print  "uninstall \\"
350                                 print  "uninstall.libs \\"
351                                 printf "uninstall.%s ::\n", name
352                                 printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", lib_name
353                                 printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", lib_name
354                                 if ( overwrite == "yes" && lib_name == "libncurses.a" )
355                                 {
356                                         printf "\t@echo linking libcurses.a to libncurses.a\n"
357                                         printf "\t-@rm -f $(DESTDIR)$(libdir)/libcurses.a\n"
358                                 }
359                                 if ( host == "vxworks" )
360                                 {
361                                         printf "\t@echo uninstalling $(DESTDIR)$(libdir)/lib%s$o\n", name
362                                         printf "\t-@rm -f $(DESTDIR)$(libdir)/lib%s$o\n", name
363                                 }
364                         }
365                         print ""
366                         print "clean ::"
367                         removelinks("../lib");
368                         print ""
369                         print "mostlyclean::"
370                         printf "\t-rm -f $(%s_OBJS)\n", OBJS
371                         if ( MODEL == "LIBTOOL" ) {
372                                 printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS
373                         }
374                 }
375                 else if ( found == 2 )
376                 {
377                         print ""
378                         print "mostlyclean::"
379                         printf "\t-rm -f $(%s_OBJS)\n", OBJS
380                         if ( MODEL == "LIBTOOL" ) {
381                                 printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS
382                         }
383                         print ""
384                         print "clean ::"
385                         printf "\t-rm -f $(%s_OBJS)\n", OBJS
386                         if ( MODEL == "LIBTOOL" ) {
387                                 printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS
388                         }
389                 }
390         }