xref: /freebsd/contrib/ncurses/misc/ncu2openbsd (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
1*21817992SBaptiste Daroussin#!/usr/bin/env perl
2*21817992SBaptiste Daroussin# $Id: ncu2openbsd,v 1.67 2023/09/09 15:59:17 tom Exp $
3*21817992SBaptiste Daroussin# -----------------------------------------------------------------------------
4*21817992SBaptiste Daroussin# Copyright 2021,2023 by Thomas E. Dickey
5*21817992SBaptiste Daroussin#
6*21817992SBaptiste Daroussin#                         All Rights Reserved
7*21817992SBaptiste Daroussin#
8*21817992SBaptiste Daroussin# Permission is hereby granted, free of charge, to any person obtaining a
9*21817992SBaptiste Daroussin# copy of this software and associated documentation files (the
10*21817992SBaptiste Daroussin# "Software"), to deal in the Software without restriction, including
11*21817992SBaptiste Daroussin# without limitation the rights to use, copy, modify, merge, publish,
12*21817992SBaptiste Daroussin# distribute, sublicense, and/or sell copies of the Software, and to
13*21817992SBaptiste Daroussin# permit persons to whom the Software is furnished to do so, subject to
14*21817992SBaptiste Daroussin# the following conditions:
15*21817992SBaptiste Daroussin#
16*21817992SBaptiste Daroussin# The above copyright notice and this permission notice shall be included
17*21817992SBaptiste Daroussin# in all copies or substantial portions of the Software.
18*21817992SBaptiste Daroussin#
19*21817992SBaptiste Daroussin# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20*21817992SBaptiste Daroussin# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21*21817992SBaptiste Daroussin# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22*21817992SBaptiste Daroussin# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
23*21817992SBaptiste Daroussin# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24*21817992SBaptiste Daroussin# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25*21817992SBaptiste Daroussin# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26*21817992SBaptiste Daroussin#
27*21817992SBaptiste Daroussin# Except as contained in this notice, the name(s) of the above copyright
28*21817992SBaptiste Daroussin# holders shall not be used in advertising or otherwise to promote the
29*21817992SBaptiste Daroussin# sale, use or other dealings in this Software without prior written
30*21817992SBaptiste Daroussin# authorization.
31*21817992SBaptiste Daroussin# -----------------------------------------------------------------------------
32*21817992SBaptiste Daroussin# https://invisible-island.net/ncurses/ncurses-openbsd.html
33*21817992SBaptiste Daroussin#
34*21817992SBaptiste Daroussin# Update the OpenBSD source-tree given an ncurses tarball or build-tree.
35*21817992SBaptiste Daroussin
36*21817992SBaptiste Daroussinuse strict;
37*21817992SBaptiste Daroussinuse warnings;
38*21817992SBaptiste Daroussin
39*21817992SBaptiste Daroussinuse Getopt::Std;
40*21817992SBaptiste Daroussinuse Cwd;
41*21817992SBaptiste Daroussinuse Cwd 'abs_path';
42*21817992SBaptiste Daroussinuse File::Path qw/ remove_tree /;
43*21817992SBaptiste Daroussinuse File::Temp qw/ tempdir /;
44*21817992SBaptiste Daroussin
45*21817992SBaptiste Daroussin$| = 1;
46*21817992SBaptiste Daroussin
47*21817992SBaptiste Daroussinour ( $opt_d, $opt_n, $opt_r, $opt_t, $opt_v, $opt_x, $opt_6 );
48*21817992SBaptiste Daroussinour $source_dir;
49*21817992SBaptiste Daroussinour $target_dir;
50*21817992SBaptiste Daroussinour $update_dir;
51*21817992SBaptiste Daroussinour $backup_dir;
52*21817992SBaptiste Daroussin
53*21817992SBaptiste Daroussinour $tempdir = tempdir( CLEANUP => 1 );
54*21817992SBaptiste Daroussinmy $current = getcwd;
55*21817992SBaptiste Daroussinmy $working = $current;
56*21817992SBaptiste Daroussin
57*21817992SBaptiste Daroussinour $generated_by = "generated by: ncu2openbsd";
58*21817992SBaptiste Daroussin
59*21817992SBaptiste Daroussinour %setup_dir = qw(
60*21817992SBaptiste Daroussin  lib/libcurses         ncurses
61*21817992SBaptiste Daroussin  lib/libform           form
62*21817992SBaptiste Daroussin  lib/libmenu           menu
63*21817992SBaptiste Daroussin  lib/libpanel          panel
64*21817992SBaptiste Daroussin  usr.bin/infocmp       progs
65*21817992SBaptiste Daroussin  usr.bin/tabs          progs
66*21817992SBaptiste Daroussin  usr.bin/tic           progs
67*21817992SBaptiste Daroussin  usr.bin/toe           progs
68*21817992SBaptiste Daroussin  usr.bin/tput          progs
69*21817992SBaptiste Daroussin  usr.bin/tset          progs
70*21817992SBaptiste Daroussin  share/termtypes       misc
71*21817992SBaptiste Daroussin);
72*21817992SBaptiste Daroussin
73*21817992SBaptiste Daroussinour %generated = qw(
74*21817992SBaptiste Daroussin  codes.c 1
75*21817992SBaptiste Daroussin  comp_captab.c         1
76*21817992SBaptiste Daroussin  comp_userdefs.c       1
77*21817992SBaptiste Daroussin  expanded.c            1
78*21817992SBaptiste Daroussin  fallback.c            1
79*21817992SBaptiste Daroussin  init_keytry.h         1
80*21817992SBaptiste Daroussin  keys.list             1
81*21817992SBaptiste Daroussin  lib_gen.c             1
82*21817992SBaptiste Daroussin  lib_keyname.c         1
83*21817992SBaptiste Daroussin  make_hash             1
84*21817992SBaptiste Daroussin  make_keys             1
85*21817992SBaptiste Daroussin  names.c               1
86*21817992SBaptiste Daroussin  termsort.c            1
87*21817992SBaptiste Daroussin  unctrl.c              1
88*21817992SBaptiste Daroussin);
89*21817992SBaptiste Daroussin
90*21817992SBaptiste Daroussinour %definitions = qw(
91*21817992SBaptiste Daroussin  CAPTOINFO             captoinfo
92*21817992SBaptiste Daroussin  DATADIR               /usr/share
93*21817992SBaptiste Daroussin  INFOCMP               infocmp
94*21817992SBaptiste Daroussin  INFOTOCAP             infotocap
95*21817992SBaptiste Daroussin  NCURSES_MAJOR         5
96*21817992SBaptiste Daroussin  NCURSES_MINOR         7
97*21817992SBaptiste Daroussin  NCURSES_OSPEED        int
98*21817992SBaptiste Daroussin  NCURSES_PATCH         20081102
99*21817992SBaptiste Daroussin  TERMINFO              /usr/share/terminfo
100*21817992SBaptiste Daroussin  TIC                   tic
101*21817992SBaptiste Daroussin  TOE                   toe
102*21817992SBaptiste Daroussin  TPUT                  tput
103*21817992SBaptiste Daroussin  TSET                  tset
104*21817992SBaptiste Daroussin);
105*21817992SBaptiste Daroussin
106*21817992SBaptiste Daroussinsub patchdate() {
107*21817992SBaptiste Daroussin    return $definitions{"NCURSES_PATCH"};
108*21817992SBaptiste Daroussin}
109*21817992SBaptiste Daroussin
110*21817992SBaptiste Daroussinsub failed($) {
111*21817992SBaptiste Daroussin    chdir $current;
112*21817992SBaptiste Daroussin    printf STDERR "? %s\n", $_[0];
113*21817992SBaptiste Daroussin    exit;
114*21817992SBaptiste Daroussin}
115*21817992SBaptiste Daroussin
116*21817992SBaptiste Daroussinsub verbose($) {
117*21817992SBaptiste Daroussin    my $text = shift;
118*21817992SBaptiste Daroussin    printf "%s\n", $text if ($opt_v);
119*21817992SBaptiste Daroussin}
120*21817992SBaptiste Daroussin
121*21817992SBaptiste Daroussinsub read_file($) {
122*21817992SBaptiste Daroussin    my $name = shift;
123*21817992SBaptiste Daroussin    open( my $fp, $name ) || &failed("cannot open $name");
124*21817992SBaptiste Daroussin    my (@input) = <$fp>;
125*21817992SBaptiste Daroussin    chomp @input;
126*21817992SBaptiste Daroussin    close($fp);
127*21817992SBaptiste Daroussin    return @input;
128*21817992SBaptiste Daroussin}
129*21817992SBaptiste Daroussin
130*21817992SBaptiste Daroussinsub read_dir($) {
131*21817992SBaptiste Daroussin    my $path = shift;
132*21817992SBaptiste Daroussin    my @result;
133*21817992SBaptiste Daroussin    if ( opendir( my $dh, $path ) ) {
134*21817992SBaptiste Daroussin        my @data = sort readdir($dh);
135*21817992SBaptiste Daroussin        closedir $dh;
136*21817992SBaptiste Daroussin        for my $d ( 0 .. $#data ) {
137*21817992SBaptiste Daroussin            next if ( $data[$d] =~ /^\.(\.)?$/ );
138*21817992SBaptiste Daroussin            next if ( -l $path . "/" . $data[$d] );
139*21817992SBaptiste Daroussin            $result[ $#result + 1 ] = $data[$d];
140*21817992SBaptiste Daroussin        }
141*21817992SBaptiste Daroussin    }
142*21817992SBaptiste Daroussin    return @result;
143*21817992SBaptiste Daroussin}
144*21817992SBaptiste Daroussin
145*21817992SBaptiste Daroussinsub rename_dir($$) {
146*21817992SBaptiste Daroussin    my $src = shift;
147*21817992SBaptiste Daroussin    my $dst = shift;
148*21817992SBaptiste Daroussin    printf "%% mv %s -> %s\n", $src, $dst if ($opt_v);
149*21817992SBaptiste Daroussin    rename $src, $dst unless ($opt_n);
150*21817992SBaptiste Daroussin}
151*21817992SBaptiste Daroussin
152*21817992SBaptiste Daroussinsub check_sourcedir($) {
153*21817992SBaptiste Daroussin    my $path = shift;
154*21817992SBaptiste Daroussin    &failed("not a directory: $path") unless ( -d $path );
155*21817992SBaptiste Daroussin    my $full = abs_path($path);
156*21817992SBaptiste Daroussin    chdir $full;
157*21817992SBaptiste Daroussin    &failed("not an ncurses source-tree: $path")
158*21817992SBaptiste Daroussin      unless ( -f "NEWS" and -f "dist.mk" );
159*21817992SBaptiste Daroussin    $source_dir = $full;
160*21817992SBaptiste Daroussin}
161*21817992SBaptiste Daroussin
162*21817992SBaptiste Daroussinsub unpack($) {
163*21817992SBaptiste Daroussin    my $path    = shift;
164*21817992SBaptiste Daroussin    my $full    = abs_path($path);
165*21817992SBaptiste Daroussin    my $command = "";
166*21817992SBaptiste Daroussin    if ( $path =~ /\.tgz$/ or $path =~ /\.tar\.gz$/ ) {
167*21817992SBaptiste Daroussin        $command = "tar xzf %s";
168*21817992SBaptiste Daroussin    }
169*21817992SBaptiste Daroussin    elsif ( $path =~ /\.zip$/ ) {
170*21817992SBaptiste Daroussin        $command = "unzip -q %s";
171*21817992SBaptiste Daroussin    }
172*21817992SBaptiste Daroussin    else {
173*21817992SBaptiste Daroussin        &failed("not a gzip'd tarball or zip-file: $path");
174*21817992SBaptiste Daroussin    }
175*21817992SBaptiste Daroussin    chdir $tempdir;
176*21817992SBaptiste Daroussin    system( sprintf( $command, $full ) );
177*21817992SBaptiste Daroussin
178*21817992SBaptiste Daroussin    # there should be exactly one subdirectory -- the source-tree
179*21817992SBaptiste Daroussin    my @data = &read_dir(".");
180*21817992SBaptiste Daroussin    &failed("found no subdirectories of $path") if ( $#data < 0 );
181*21817992SBaptiste Daroussin    &failed( "too many subdirectories: " . $data[0] . " vs " . $data[1] )
182*21817992SBaptiste Daroussin      if ( $#data > 0 );
183*21817992SBaptiste Daroussin    &check_sourcedir( $data[0] );
184*21817992SBaptiste Daroussin}
185*21817992SBaptiste Daroussin
186*21817992SBaptiste Daroussinsub remove_dir($) {
187*21817992SBaptiste Daroussin    my $tree = shift;
188*21817992SBaptiste Daroussin    if ( -d $tree ) {
189*21817992SBaptiste Daroussin        printf "%% rm -rf %s\n", $tree if ($opt_v);
190*21817992SBaptiste Daroussin        remove_tree( $tree, $opt_v ? 1 : 0, 1 ) unless ($opt_n);
191*21817992SBaptiste Daroussin    }
192*21817992SBaptiste Daroussin}
193*21817992SBaptiste Daroussin
194*21817992SBaptiste Daroussinsub copy_CVS($) {
195*21817992SBaptiste Daroussin    my $leaf    = shift;
196*21817992SBaptiste Daroussin    my $src     = $target_dir . $leaf . "/CVS";
197*21817992SBaptiste Daroussin    my $dst     = $update_dir . $leaf . "/CVS";
198*21817992SBaptiste Daroussin    my $verbose = $opt_v ? "v" : "";
199*21817992SBaptiste Daroussin    if ( -d $src and !-d $dst ) {
200*21817992SBaptiste Daroussin        my $mid = $update_dir . $leaf;
201*21817992SBaptiste Daroussin        mkdir $mid unless ( -d $mid );
202*21817992SBaptiste Daroussin        mkdir $dst unless ( -d $dst );
203*21817992SBaptiste Daroussin        system("cp -a$verbose $src/* $dst/");
204*21817992SBaptiste Daroussin    }
205*21817992SBaptiste Daroussin}
206*21817992SBaptiste Daroussin
207*21817992SBaptiste Daroussinsub is_tic_code($) {
208*21817992SBaptiste Daroussin    my $item   = shift;
209*21817992SBaptiste Daroussin    my $result = 0;
210*21817992SBaptiste Daroussin    $result = 1
211*21817992SBaptiste Daroussin      if (
212*21817992SBaptiste Daroussin        $item =~ /^(capconvert
213*21817992SBaptiste Daroussin                   |tic
214*21817992SBaptiste Daroussin                   |dump
215*21817992SBaptiste Daroussin                   |progs
216*21817992SBaptiste Daroussin                   |termsort
217*21817992SBaptiste Daroussin                   |transform
218*21817992SBaptiste Daroussin                   |MKtermsort)/x
219*21817992SBaptiste Daroussin      );
220*21817992SBaptiste Daroussin    return $result;
221*21817992SBaptiste Daroussin}
222*21817992SBaptiste Daroussin
223*21817992SBaptiste Daroussinsub is_ident($$) {
224*21817992SBaptiste Daroussin    my $name = shift;
225*21817992SBaptiste Daroussin    my $text = shift;
226*21817992SBaptiste Daroussin    my $code = 0;
227*21817992SBaptiste Daroussin    $code = 1 if ( $text =~ /\$$name:.*\$/ );
228*21817992SBaptiste Daroussin    return $code;
229*21817992SBaptiste Daroussin}
230*21817992SBaptiste Daroussin
231*21817992SBaptiste Daroussin# We "could", filter out differences with ident's using the diff -I option,
232*21817992SBaptiste Daroussin# but in practice, that is cumbersome.
233*21817992SBaptiste Daroussinsub munge_ident($) {
234*21817992SBaptiste Daroussin    my $target = shift;
235*21817992SBaptiste Daroussin    my $source = $target;
236*21817992SBaptiste Daroussin    $source =~ s/\.update\b//;
237*21817992SBaptiste Daroussin    &failed("bug at $source") if ( $source eq $target );
238*21817992SBaptiste Daroussin    return unless ( -f $source );
239*21817992SBaptiste Daroussin    my @source = &read_file($source);
240*21817992SBaptiste Daroussin    my @target = &read_file($target);
241*21817992SBaptiste Daroussin    my $old_id = "";
242*21817992SBaptiste Daroussin    my $gap_id = 0;
243*21817992SBaptiste Daroussin    my $new_id = "";
244*21817992SBaptiste Daroussin    my $skipit = -1;
245*21817992SBaptiste Daroussin
246*21817992SBaptiste Daroussin    for my $n ( 0 .. $#source ) {
247*21817992SBaptiste Daroussin        if ( &is_ident( "OpenBSD", $source[$n] ) ) {
248*21817992SBaptiste Daroussin            $old_id = $source[$n];
249*21817992SBaptiste Daroussin            $skipit = $n + 1;
250*21817992SBaptiste Daroussin        }
251*21817992SBaptiste Daroussin        elsif ( &is_ident( "Id", $source[$n] ) ) {
252*21817992SBaptiste Daroussin            $new_id = $source[$n];
253*21817992SBaptiste Daroussin            last;
254*21817992SBaptiste Daroussin        }
255*21817992SBaptiste Daroussin        elsif ( $n == $skipit ) {
256*21817992SBaptiste Daroussin            $source[$n] =~ s/\s+$//;
257*21817992SBaptiste Daroussin            if ( $source[$n] eq "" ) {
258*21817992SBaptiste Daroussin                $gap_id = $source[$n];
259*21817992SBaptiste Daroussin            }
260*21817992SBaptiste Daroussin            elsif ( $source[$n] eq '.\"' ) {
261*21817992SBaptiste Daroussin                $gap_id = $source[$n];
262*21817992SBaptiste Daroussin            }
263*21817992SBaptiste Daroussin        }
264*21817992SBaptiste Daroussin    }
265*21817992SBaptiste Daroussin    if ( $old_id ne "" ) {
266*21817992SBaptiste Daroussin        my @update;
267*21817992SBaptiste Daroussin        my $tables = &uses_tables($target);
268*21817992SBaptiste Daroussin        $update[ $#update + 1 ] = $target[0] if ($tables);
269*21817992SBaptiste Daroussin        $update[ $#update + 1 ] = $old_id;
270*21817992SBaptiste Daroussin        $update[ $#update + 1 ] = $gap_id unless ( $gap_id eq 0 );
271*21817992SBaptiste Daroussin        for my $n ( $tables .. $#target ) {
272*21817992SBaptiste Daroussin            if ( &is_ident( "Id", $target[$n] ) ) {
273*21817992SBaptiste Daroussin                $update[ $#update + 1 ] = $new_id;
274*21817992SBaptiste Daroussin            }
275*21817992SBaptiste Daroussin            else {
276*21817992SBaptiste Daroussin                $update[ $#update + 1 ] = $target[$n];
277*21817992SBaptiste Daroussin            }
278*21817992SBaptiste Daroussin        }
279*21817992SBaptiste Daroussin        system("chmod u+w $target");
280*21817992SBaptiste Daroussin        if ( open my $fp, ">", $target ) {
281*21817992SBaptiste Daroussin            for my $n ( 0 .. $#update ) {
282*21817992SBaptiste Daroussin                printf $fp "%s\n", $update[$n];
283*21817992SBaptiste Daroussin            }
284*21817992SBaptiste Daroussin            close $fp;
285*21817992SBaptiste Daroussin            system("chmod u-w $target");
286*21817992SBaptiste Daroussin        }
287*21817992SBaptiste Daroussin    }
288*21817992SBaptiste Daroussin}
289*21817992SBaptiste Daroussin
290*21817992SBaptiste Daroussin# ncurses manual pages provide for renaming the utilities, normally as part of
291*21817992SBaptiste Daroussin# the scripts provided in its sources.  OpenBSD developers do not use those.
292*21817992SBaptiste Daroussinsub munge_docs($) {
293*21817992SBaptiste Daroussin    my $path = shift;
294*21817992SBaptiste Daroussin    my @data = &read_file($path);
295*21817992SBaptiste Daroussin    my $done = 0;
296*21817992SBaptiste Daroussin    for my $n ( 0 .. $#data ) {
297*21817992SBaptiste Daroussin        my $text = $data[$n];
298*21817992SBaptiste Daroussin        $text =~ s/\b1M\b/1/g;
299*21817992SBaptiste Daroussin        $text =~ s/\b3X\b/3/g;
300*21817992SBaptiste Daroussin        $text =~ s/\bcurs_(term(info|cap)\s*3\b)/$1/g;
301*21817992SBaptiste Daroussin        $text =~ s/(\\fB)curs_(term(info|cap)\\f[RP]\(3\))/$1$2/g;
302*21817992SBaptiste Daroussin        my $left = "";
303*21817992SBaptiste Daroussin        while ( $text =~ /@[[:alnum:]_]+@/ ) {
304*21817992SBaptiste Daroussin            my $next = index( $text, "@" );
305*21817992SBaptiste Daroussin            last if ( $next < 0 );
306*21817992SBaptiste Daroussin            $left .= substr( $text, 0, $next++ );
307*21817992SBaptiste Daroussin            $text = substr( $text, $next );
308*21817992SBaptiste Daroussin            $next = index( $text, "@" );
309*21817992SBaptiste Daroussin            last if ( $next < 0 );
310*21817992SBaptiste Daroussin            my $word = substr( $text, 0, $next );
311*21817992SBaptiste Daroussin            if ( $word =~ /^[[:alnum:]_]+/ ) {
312*21817992SBaptiste Daroussin
313*21817992SBaptiste Daroussin                if ( $definitions{$word} ) {
314*21817992SBaptiste Daroussin                    $word = $definitions{$word};
315*21817992SBaptiste Daroussin                }
316*21817992SBaptiste Daroussin                else {
317*21817992SBaptiste Daroussin                    $word = "?";
318*21817992SBaptiste Daroussin                }
319*21817992SBaptiste Daroussin                $left .= $word;
320*21817992SBaptiste Daroussin                $text = substr( $text, $next + 1 );
321*21817992SBaptiste Daroussin            }
322*21817992SBaptiste Daroussin            else {
323*21817992SBaptiste Daroussin                &failed("unexpected definition @$word@");
324*21817992SBaptiste Daroussin            }
325*21817992SBaptiste Daroussin        }
326*21817992SBaptiste Daroussin        $text = $left . $text;
327*21817992SBaptiste Daroussin        if ( $text ne $data[$n] ) {
328*21817992SBaptiste Daroussin            $done++;
329*21817992SBaptiste Daroussin            $data[$n] = $text;
330*21817992SBaptiste Daroussin        }
331*21817992SBaptiste Daroussin    }
332*21817992SBaptiste Daroussin    if ($done) {
333*21817992SBaptiste Daroussin        system("chmod u+w $path");
334*21817992SBaptiste Daroussin        if ( open my $fp, ">", $path ) {
335*21817992SBaptiste Daroussin            for my $n ( 0 .. $#data ) {
336*21817992SBaptiste Daroussin                printf $fp "%s\n", $data[$n];
337*21817992SBaptiste Daroussin            }
338*21817992SBaptiste Daroussin            close $fp;
339*21817992SBaptiste Daroussin            system("chmod u-w $path");
340*21817992SBaptiste Daroussin        }
341*21817992SBaptiste Daroussin    }
342*21817992SBaptiste Daroussin}
343*21817992SBaptiste Daroussin
344*21817992SBaptiste Daroussinsub copy_file($$) {
345*21817992SBaptiste Daroussin    my $src     = shift;
346*21817992SBaptiste Daroussin    my $dst     = shift;
347*21817992SBaptiste Daroussin    my $verbose = $opt_v ? "v" : "";
348*21817992SBaptiste Daroussin    if ( -d $dst ) {
349*21817992SBaptiste Daroussin        my $leaf = $src;
350*21817992SBaptiste Daroussin        $leaf =~ s,^.*/,,;
351*21817992SBaptiste Daroussin        $dst .= "/" . $leaf;
352*21817992SBaptiste Daroussin    }
353*21817992SBaptiste Daroussin    system("chmod u+w $dst") if ( -f $dst );
354*21817992SBaptiste Daroussin    system("cp -a$verbose $src $dst");
355*21817992SBaptiste Daroussin    &munge_ident($dst);
356*21817992SBaptiste Daroussin}
357*21817992SBaptiste Daroussin
358*21817992SBaptiste Daroussinsub copy_code($) {
359*21817992SBaptiste Daroussin    my $src = shift;
360*21817992SBaptiste Daroussin    my $dst = shift;
361*21817992SBaptiste Daroussin    &copy_CVS( substr( $dst, length($update_dir) ) );
362*21817992SBaptiste Daroussin    printf ".. copying files for $dst\n";
363*21817992SBaptiste Daroussin    my @data = &read_dir($src);
364*21817992SBaptiste Daroussin    printf ".. %d entries\n", $#data + 1;
365*21817992SBaptiste Daroussin    my $verbose = $opt_v ? "v" : "";
366*21817992SBaptiste Daroussin    for my $d ( 0 .. $#data ) {
367*21817992SBaptiste Daroussin        my $item     = $data[$d];
368*21817992SBaptiste Daroussin        my $src_item = $src . "/" . $item;
369*21817992SBaptiste Daroussin        next if ( -d $src_item );
370*21817992SBaptiste Daroussin        next if ( -l $src_item );
371*21817992SBaptiste Daroussin        next if ( $item =~ /^\.(\.)?$/ );
372*21817992SBaptiste Daroussin        next if ( $item =~ /\.(bak|in|log|status)$/ );
373*21817992SBaptiste Daroussin        next if ( $item =~ /^llib-/ );
374*21817992SBaptiste Daroussin        next if ( $item =~ /^modules/ );
375*21817992SBaptiste Daroussin        next if ( $item =~ /^[fm]_trace\.c/ and not $opt_t );
376*21817992SBaptiste Daroussin        next
377*21817992SBaptiste Daroussin          if ( $item =~ /^Makefile/ and index( $update_dir, "/share/" ) < 0 );
378*21817992SBaptiste Daroussin        next if ( $item =~ /^README/ );
379*21817992SBaptiste Daroussin        next if ( $item eq "headers" );
380*21817992SBaptiste Daroussin        next if ( $generated{$item} );
381*21817992SBaptiste Daroussin        next if ( $item eq "link_test.c" );
382*21817992SBaptiste Daroussin
383*21817992SBaptiste Daroussin        if ( index( $dst, "/usr.bin/" ) >= 0 ) {
384*21817992SBaptiste Daroussin            next if ( $item =~ /^(clear)/ );    # OpenBSD uses "tput clear"
385*21817992SBaptiste Daroussin            my $prog = $dst;
386*21817992SBaptiste Daroussin            $prog =~ s%^.*/%%;
387*21817992SBaptiste Daroussin            $prog =~ s/(update|backup)//;
388*21817992SBaptiste Daroussin            $prog .= "c";
389*21817992SBaptiste Daroussin            if ( $dst =~ /infocmp/ ) {
390*21817992SBaptiste Daroussin                next if ( $item ne $prog );
391*21817992SBaptiste Daroussin            }
392*21817992SBaptiste Daroussin            elsif ( $dst =~ /tabs/ ) {
393*21817992SBaptiste Daroussin                next if ( $item ne $prog );
394*21817992SBaptiste Daroussin            }
395*21817992SBaptiste Daroussin            elsif ( $dst =~ /tic/ ) {
396*21817992SBaptiste Daroussin                next if ( &is_tic_code($item) == 0 );
397*21817992SBaptiste Daroussin            }
398*21817992SBaptiste Daroussin            elsif ( $dst =~ /toe/ ) {
399*21817992SBaptiste Daroussin                next if ( $item ne $prog );
400*21817992SBaptiste Daroussin            }
401*21817992SBaptiste Daroussin            elsif ( $dst =~ /tput/ ) {
402*21817992SBaptiste Daroussin                next if ( $item ne $prog );
403*21817992SBaptiste Daroussin            }
404*21817992SBaptiste Daroussin            elsif ( $dst =~ /tset/ ) {
405*21817992SBaptiste Daroussin                next if ( $item ne $prog );
406*21817992SBaptiste Daroussin            }
407*21817992SBaptiste Daroussin            else {
408*21817992SBaptiste Daroussin                next;
409*21817992SBaptiste Daroussin            }
410*21817992SBaptiste Daroussin        }
411*21817992SBaptiste Daroussin        system( sprintf( "cp -a$verbose %s %s/%s", $src_item, $dst, $item ) );
412*21817992SBaptiste Daroussin        &munge_ident("$dst/$item");
413*21817992SBaptiste Daroussin    }
414*21817992SBaptiste Daroussin}
415*21817992SBaptiste Daroussin
416*21817992SBaptiste Daroussin# Checking if nroff supports tables is a long-obsolete issue, and is not really
417*21817992SBaptiste Daroussin# necessary, except to match OpenBSD's source-tree.
418*21817992SBaptiste Daroussinsub uses_tables($) {
419*21817992SBaptiste Daroussin    my $docs = shift;
420*21817992SBaptiste Daroussin    my @docs = &read_file($docs);
421*21817992SBaptiste Daroussin    my $code = 0;
422*21817992SBaptiste Daroussin    for my $n ( 0 .. $#docs ) {
423*21817992SBaptiste Daroussin        if ( $docs[$n] =~ /^[.']\\"\s+t\b.*/ ) {
424*21817992SBaptiste Daroussin            $code = 1;
425*21817992SBaptiste Daroussin            last;
426*21817992SBaptiste Daroussin        }
427*21817992SBaptiste Daroussin        elsif ( $docs[$n] =~ /^\./ ) {
428*21817992SBaptiste Daroussin            last;
429*21817992SBaptiste Daroussin        }
430*21817992SBaptiste Daroussin    }
431*21817992SBaptiste Daroussin    return $code;
432*21817992SBaptiste Daroussin}
433*21817992SBaptiste Daroussin
434*21817992SBaptiste Daroussinsub copy_1doc($$) {
435*21817992SBaptiste Daroussin    my $docs = shift;
436*21817992SBaptiste Daroussin    my $src  = "$source_dir/man/$docs";
437*21817992SBaptiste Daroussin    my $dst  = "$update_dir/$docs";
438*21817992SBaptiste Daroussin    $src .= "m" if ( -f "${src}m" );
439*21817992SBaptiste Daroussin    $dst =~ s/x$//;
440*21817992SBaptiste Daroussin    if ( $dst =~ /\.3/ ) {
441*21817992SBaptiste Daroussin        $dst =~ s/\bncurses/curses/ if ( $dst =~ /ncurses\./ );
442*21817992SBaptiste Daroussin        $dst =~ s/\bcurs_//         if ( $dst =~ /_term(cap|info)\./ );
443*21817992SBaptiste Daroussin    }
444*21817992SBaptiste Daroussin    &copy_file( $src, $dst );
445*21817992SBaptiste Daroussin    &munge_docs($dst);
446*21817992SBaptiste Daroussin}
447*21817992SBaptiste Daroussin
448*21817992SBaptiste Daroussinsub copy_docs($) {
449*21817992SBaptiste Daroussin    my $docs = shift;
450*21817992SBaptiste Daroussin    if ( index( $update_dir, "/usr.bin/" ) >= 0 ) {
451*21817992SBaptiste Daroussin        &copy_1doc( $docs . ".1" );
452*21817992SBaptiste Daroussin        if ( $docs eq "tic" ) {
453*21817992SBaptiste Daroussin            &copy_1doc("captoinfo.1");
454*21817992SBaptiste Daroussin            &copy_1doc("infotocap.1");
455*21817992SBaptiste Daroussin        }
456*21817992SBaptiste Daroussin    }
457*21817992SBaptiste Daroussin    else {
458*21817992SBaptiste Daroussin        my @docs = &read_dir("$source_dir/man");
459*21817992SBaptiste Daroussin        if ( $docs eq "curses" ) {
460*21817992SBaptiste Daroussin            for my $n ( 0 .. $#docs ) {
461*21817992SBaptiste Daroussin                next if ( $docs[$n] eq "Makefile" );
462*21817992SBaptiste Daroussin                next if ( $docs[$n] eq "make_sed.sh" );
463*21817992SBaptiste Daroussin                next if ( $docs[$n] eq "man_db.renames" );
464*21817992SBaptiste Daroussin                next if ( $docs[$n] eq "manlinks.sed" );
465*21817992SBaptiste Daroussin                next if ( $docs[$n] =~ /\.(1|head|tail|in)/ );
466*21817992SBaptiste Daroussin                next if ( $docs[$n] =~ /^(form|menu|mitem|panel)/ );
467*21817992SBaptiste Daroussin                &copy_1doc( $docs[$n] );
468*21817992SBaptiste Daroussin            }
469*21817992SBaptiste Daroussin        }
470*21817992SBaptiste Daroussin        elsif ( $docs eq "form" ) {
471*21817992SBaptiste Daroussin            for my $n ( 0 .. $#docs ) {
472*21817992SBaptiste Daroussin                next unless ( $docs[$n] =~ /^form/ );
473*21817992SBaptiste Daroussin                &copy_1doc( $docs[$n] );
474*21817992SBaptiste Daroussin            }
475*21817992SBaptiste Daroussin        }
476*21817992SBaptiste Daroussin        elsif ( $docs eq "menu" ) {
477*21817992SBaptiste Daroussin            for my $n ( 0 .. $#docs ) {
478*21817992SBaptiste Daroussin                next unless ( $docs[$n] =~ /^(menu|mitem)/ );
479*21817992SBaptiste Daroussin                &copy_1doc( $docs[$n] );
480*21817992SBaptiste Daroussin            }
481*21817992SBaptiste Daroussin        }
482*21817992SBaptiste Daroussin        elsif ( $docs eq "panel" ) {
483*21817992SBaptiste Daroussin            for my $n ( 0 .. $#docs ) {
484*21817992SBaptiste Daroussin                next unless ( $docs[$n] =~ /^panel/ );
485*21817992SBaptiste Daroussin                &copy_1doc( $docs[$n] );
486*21817992SBaptiste Daroussin            }
487*21817992SBaptiste Daroussin        }
488*21817992SBaptiste Daroussin    }
489*21817992SBaptiste Daroussin}
490*21817992SBaptiste Daroussin
491*21817992SBaptiste Daroussinsub setup_dir($) {
492*21817992SBaptiste Daroussin    my $dst = shift;
493*21817992SBaptiste Daroussin    &failed("no definition for $dst")
494*21817992SBaptiste Daroussin      unless ( defined $setup_dir{$dst} or $opt_r );
495*21817992SBaptiste Daroussin    $target_dir = sprintf( "%s/%s", $opt_d, $dst );
496*21817992SBaptiste Daroussin    $update_dir = $target_dir . ".update";
497*21817992SBaptiste Daroussin    $backup_dir = $target_dir . ".backup";
498*21817992SBaptiste Daroussin    my $result = 0;
499*21817992SBaptiste Daroussin    if ($opt_r) {
500*21817992SBaptiste Daroussin        &remove_dir($update_dir);
501*21817992SBaptiste Daroussin        if ( $target_dir =~ /\/(tabs|toe)$/ ) {
502*21817992SBaptiste Daroussin            &remove_dir($target_dir);
503*21817992SBaptiste Daroussin        }
504*21817992SBaptiste Daroussin        elsif ( -d $backup_dir ) {
505*21817992SBaptiste Daroussin            &remove_dir($target_dir);
506*21817992SBaptiste Daroussin            &rename_dir( $backup_dir, $target_dir );
507*21817992SBaptiste Daroussin        }
508*21817992SBaptiste Daroussin    }
509*21817992SBaptiste Daroussin    else {
510*21817992SBaptiste Daroussin        &remove_dir($update_dir);
511*21817992SBaptiste Daroussin        mkdir $update_dir;
512*21817992SBaptiste Daroussin
513*21817992SBaptiste Daroussin        # reuse the shared-library version, assuming ABI=5 would involve at
514*21817992SBaptiste Daroussin        # most a minor-version bump.
515*21817992SBaptiste Daroussin        &copy_file( "$target_dir/shlib_version", $update_dir )
516*21817992SBaptiste Daroussin          if ( $dst =~ /^lib\// );
517*21817992SBaptiste Daroussin        &copy_code( $source_dir . "/" . $setup_dir{$dst}, $update_dir )
518*21817992SBaptiste Daroussin          unless ( $setup_dir{$dst} eq "misc" );
519*21817992SBaptiste Daroussin        $result = 1;
520*21817992SBaptiste Daroussin    }
521*21817992SBaptiste Daroussin    return $result;
522*21817992SBaptiste Daroussin}
523*21817992SBaptiste Daroussin
524*21817992SBaptiste Daroussinsub do_build($) {
525*21817992SBaptiste Daroussin    my $command = shift;
526*21817992SBaptiste Daroussin    printf "%% %s\n", $command if ($opt_v);
527*21817992SBaptiste Daroussin    system($command);
528*21817992SBaptiste Daroussin}
529*21817992SBaptiste Daroussin
530*21817992SBaptiste Daroussinsub finish_dir() {
531*21817992SBaptiste Daroussin    printf "** $target_dir\n";
532*21817992SBaptiste Daroussin    system("diff -Naurb $target_dir $update_dir | diffstat -n 30")
533*21817992SBaptiste Daroussin      if ( -d $target_dir );
534*21817992SBaptiste Daroussin    if ($opt_n) {
535*21817992SBaptiste Daroussin        &do_build("cd $update_dir && make -n") if ($opt_x);
536*21817992SBaptiste Daroussin    }
537*21817992SBaptiste Daroussin    else {
538*21817992SBaptiste Daroussin        if ( -d $backup_dir ) {
539*21817992SBaptiste Daroussin            printf STDERR "? backup directory exists: %s\n", $backup_dir;
540*21817992SBaptiste Daroussin        }
541*21817992SBaptiste Daroussin        else {
542*21817992SBaptiste Daroussin            &rename_dir( $target_dir, $backup_dir );
543*21817992SBaptiste Daroussin            &rename_dir( $update_dir, $target_dir );
544*21817992SBaptiste Daroussin        }
545*21817992SBaptiste Daroussin        &do_build("cd $target_dir && make") if ($opt_x);
546*21817992SBaptiste Daroussin    }
547*21817992SBaptiste Daroussin}
548*21817992SBaptiste Daroussin
549*21817992SBaptiste Daroussin################################################################################
550*21817992SBaptiste Daroussin
551*21817992SBaptiste Daroussinsub only_c_files($) {
552*21817992SBaptiste Daroussin    my @data = @{ $_[0] };
553*21817992SBaptiste Daroussin    my %data;
554*21817992SBaptiste Daroussin    for my $n ( 0 .. $#data ) {
555*21817992SBaptiste Daroussin        my $text = $data[$n];
556*21817992SBaptiste Daroussin        $data{$text}++ if ( $text =~ /\.c$/ );
557*21817992SBaptiste Daroussin    }
558*21817992SBaptiste Daroussin    return sort keys %data;
559*21817992SBaptiste Daroussin}
560*21817992SBaptiste Daroussin
561*21817992SBaptiste Daroussinsub makefile_list($$$) {
562*21817992SBaptiste Daroussin    my @data = @{ $_[0] };
563*21817992SBaptiste Daroussin    my $name = $_[1];
564*21817992SBaptiste Daroussin    my $skip = $_[2];
565*21817992SBaptiste Daroussin    my %data;
566*21817992SBaptiste Daroussin    my $state = 0;
567*21817992SBaptiste Daroussin    for my $n ( 0 .. $#data ) {
568*21817992SBaptiste Daroussin        my $text = $data[$n];
569*21817992SBaptiste Daroussin        $text =~ s/^\s+//;
570*21817992SBaptiste Daroussin        next if ( index( $text, $skip ) == 0 );
571*21817992SBaptiste Daroussin        $text =~ s/\s+=/=/;
572*21817992SBaptiste Daroussin        $text =~ s/=\s+/=/;
573*21817992SBaptiste Daroussin        $text =~ s/\s*\\//;
574*21817992SBaptiste Daroussin        $state = 1 if ( $text =~ /^${name}=/ );
575*21817992SBaptiste Daroussin        next unless ( $state == 1 );
576*21817992SBaptiste Daroussin
577*21817992SBaptiste Daroussin        if ( index( $text, "(trace)" ) >= 0 and not $opt_t ) {
578*21817992SBaptiste Daroussin            next unless ( $text =~ /\b(lib_trace|visbuf)\.c$/ );
579*21817992SBaptiste Daroussin        }
580*21817992SBaptiste Daroussin        if ( not $opt_t ) {
581*21817992SBaptiste Daroussin            next if ( $text =~ /\b[fm]_trace\.c$/ );
582*21817992SBaptiste Daroussin        }
583*21817992SBaptiste Daroussin        $text =~ s/^.*=//;
584*21817992SBaptiste Daroussin        $text =~ s/\$o/.o/g;
585*21817992SBaptiste Daroussin        $text =~ s/^.*\///;
586*21817992SBaptiste Daroussin        next           if ( $text eq "link_test.c" );
587*21817992SBaptiste Daroussin        next           if ( $text eq "mf_common.h" );
588*21817992SBaptiste Daroussin        next           if ( $text eq "transform.h" );
589*21817992SBaptiste Daroussin        $data{$text}++ if ( $text ne "" );
590*21817992SBaptiste Daroussin        last           if ( $data[$n] !~ /\\$/ );
591*21817992SBaptiste Daroussin    }
592*21817992SBaptiste Daroussin    return sort keys %data;
593*21817992SBaptiste Daroussin}
594*21817992SBaptiste Daroussin
595*21817992SBaptiste Daroussinsub manpage_list($) {
596*21817992SBaptiste Daroussin    my $path = shift;
597*21817992SBaptiste Daroussin    my @data = &read_dir($path);
598*21817992SBaptiste Daroussin    my %data;
599*21817992SBaptiste Daroussin    for my $n ( 0 .. $#data ) {
600*21817992SBaptiste Daroussin        my $text = $data[$n];
601*21817992SBaptiste Daroussin        $data{$text}++ if ( $text =~ /\.\d$/ );
602*21817992SBaptiste Daroussin    }
603*21817992SBaptiste Daroussin    return sort keys %data;
604*21817992SBaptiste Daroussin}
605*21817992SBaptiste Daroussin
606*21817992SBaptiste Daroussinsub columns_of($) {
607*21817992SBaptiste Daroussin    my $string = shift;
608*21817992SBaptiste Daroussin    my $result = 0;
609*21817992SBaptiste Daroussin    for my $n ( 0 .. length($string) - 1 ) {
610*21817992SBaptiste Daroussin        my $c = substr( $string, $n, 1 );
611*21817992SBaptiste Daroussin        if ( $c eq "\t" ) {
612*21817992SBaptiste Daroussin            $result |= 7;
613*21817992SBaptiste Daroussin            $result++;
614*21817992SBaptiste Daroussin        }
615*21817992SBaptiste Daroussin        elsif ( $c eq "\n" ) {
616*21817992SBaptiste Daroussin            $result = 0;
617*21817992SBaptiste Daroussin        }
618*21817992SBaptiste Daroussin        else {
619*21817992SBaptiste Daroussin            ++$result;
620*21817992SBaptiste Daroussin        }
621*21817992SBaptiste Daroussin    }
622*21817992SBaptiste Daroussin    return $result;
623*21817992SBaptiste Daroussin}
624*21817992SBaptiste Daroussin
625*21817992SBaptiste Daroussinsub format_list($$) {
626*21817992SBaptiste Daroussin    my $name = $_[0];
627*21817992SBaptiste Daroussin    my @data = @{ $_[1] };
628*21817992SBaptiste Daroussin    my $keep = ( defined $_[2] ) ? 1 : 0;
629*21817992SBaptiste Daroussin    my $base;
630*21817992SBaptiste Daroussin    my $fill;
631*21817992SBaptiste Daroussin    if ( length($name) >= 9 ) {
632*21817992SBaptiste Daroussin        $fill = " ";
633*21817992SBaptiste Daroussin        $base = length($name) + 1;
634*21817992SBaptiste Daroussin    }
635*21817992SBaptiste Daroussin    else {
636*21817992SBaptiste Daroussin        $base = 9;
637*21817992SBaptiste Daroussin        $fill = "\t";
638*21817992SBaptiste Daroussin    }
639*21817992SBaptiste Daroussin    my $result = sprintf( "%s%s", $name, $fill );
640*21817992SBaptiste Daroussin    if ( $keep == 0 ) {
641*21817992SBaptiste Daroussin        my %data;
642*21817992SBaptiste Daroussin        for my $n ( 0 .. $#data ) {
643*21817992SBaptiste Daroussin            $data{ $data[$n] } = 1 if ( defined $data[$n] );
644*21817992SBaptiste Daroussin        }
645*21817992SBaptiste Daroussin        @data = sort keys %data;
646*21817992SBaptiste Daroussin    }
647*21817992SBaptiste Daroussin    for my $n ( 0 .. $#data ) {
648*21817992SBaptiste Daroussin        my $data = $data[$n];
649*21817992SBaptiste Daroussin        my $col  = &columns_of($result);
650*21817992SBaptiste Daroussin        my $add  = 1 + length($data);
651*21817992SBaptiste Daroussin        if ( ( $col + $add ) > 76 ) {
652*21817992SBaptiste Daroussin            $result .= " " if ( $col > $base );
653*21817992SBaptiste Daroussin            $base = 9;
654*21817992SBaptiste Daroussin            $fill = "\t";
655*21817992SBaptiste Daroussin            $result .= "\\\n" . $fill . $data;
656*21817992SBaptiste Daroussin        }
657*21817992SBaptiste Daroussin        else {
658*21817992SBaptiste Daroussin            $result .= " " if ( $col > $base );
659*21817992SBaptiste Daroussin            $result .= $data;
660*21817992SBaptiste Daroussin        }
661*21817992SBaptiste Daroussin    }
662*21817992SBaptiste Daroussin    return $result;
663*21817992SBaptiste Daroussin}
664*21817992SBaptiste Daroussin
665*21817992SBaptiste Daroussin################################################################################
666*21817992SBaptiste Daroussin
667*21817992SBaptiste Daroussinsub compare_makefiles($) {
668*21817992SBaptiste Daroussin    if ($opt_v) {
669*21817992SBaptiste Daroussin        my $newfile = shift;
670*21817992SBaptiste Daroussin        my $bakfile =
671*21817992SBaptiste Daroussin          ( -d $backup_dir ? $backup_dir : $target_dir ) . "/Makefile";
672*21817992SBaptiste Daroussin        system("diff -u $bakfile $newfile") if ( -f $bakfile );
673*21817992SBaptiste Daroussin    }
674*21817992SBaptiste Daroussin}
675*21817992SBaptiste Daroussin
676*21817992SBaptiste Daroussin# The curses makefile has to build build-time utilities and generate source.
677*21817992SBaptiste Daroussinsub gen_1st_makefile() {
678*21817992SBaptiste Daroussin    my $libname = "curses";
679*21817992SBaptiste Daroussin    my $oldfile = "$source_dir/n$libname/Makefile";
680*21817992SBaptiste Daroussin    my @oldfile = &read_file($oldfile);
681*21817992SBaptiste Daroussin
682*21817992SBaptiste Daroussin    my $newfile = "$update_dir/Makefile";
683*21817992SBaptiste Daroussin    open( my $fp, ">", $newfile ) || &failed("cannot open $newfile");
684*21817992SBaptiste Daroussin    my @subdirs = (
685*21817992SBaptiste Daroussin        '${.CURDIR}/base', '${.CURDIR}/tinfo',
686*21817992SBaptiste Daroussin        '${.CURDIR}/tty',  '${.CURDIR}/widechar'
687*21817992SBaptiste Daroussin    );
688*21817992SBaptiste Daroussin    $subdirs[ $#subdirs + 1 ] = '${.CURDIR}/trace' if ($opt_t);
689*21817992SBaptiste Daroussin    printf $fp <<EOF;
690*21817992SBaptiste Daroussin# $generated_by
691*21817992SBaptiste Daroussin
692*21817992SBaptiste DaroussinLIB=	$libname
693*21817992SBaptiste Daroussin
694*21817992SBaptiste Daroussin# Uncomment this to enable tracing in libcurses
695*21817992SBaptiste Daroussin#CURSESTRACE=-DTRACE
696*21817992SBaptiste Daroussin
697*21817992SBaptiste Daroussin# This is used to compile terminal info directly into the library
698*21817992SBaptiste DaroussinFALLBACK_LIST=
699*21817992SBaptiste Daroussin
700*21817992SBaptiste Daroussin# XXX - should be defined elsewhere
701*21817992SBaptiste DaroussinAWK?=	/usr/bin/awk
702*21817992SBaptiste Daroussin
703*21817992SBaptiste Daroussin# Search in subdirs
704*21817992SBaptiste DaroussinEOF
705*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( ".PATH:", \@subdirs );
706*21817992SBaptiste Daroussin
707*21817992SBaptiste Daroussin    my @autosrc = &makefile_list( \@oldfile, "AUTO_SRC", "?" );
708*21817992SBaptiste Daroussin    my @auto_cc = &only_c_files( \@autosrc );
709*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "SRCS=", \@auto_cc );
710*21817992SBaptiste Daroussin
711*21817992SBaptiste Daroussin    my @sources = &makefile_list( \@oldfile, "C_SRC", "./" );
712*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "SRCS+=", \@sources );
713*21817992SBaptiste Daroussin
714*21817992SBaptiste Daroussin    printf $fp <<EOF;
715*21817992SBaptiste Daroussin
716*21817992SBaptiste DaroussinHOSTCFLAGS?=	\${CFLAGS}
717*21817992SBaptiste DaroussinHOSTLDFLAGS?=	\${LDFLAGS}
718*21817992SBaptiste DaroussinHOSTCFLAGS+=	-I. -I\${.CURDIR} \${CURSESTRACE}
719*21817992SBaptiste DaroussinCFLAGS+=	-I. -I\${.CURDIR} \${CURSESTRACE} -D_XOPEN_SOURCE_EXTENDED -DNDEBUG
720*21817992SBaptiste Daroussin
721*21817992SBaptiste DaroussinEOF
722*21817992SBaptiste Daroussin    my @manpages = &manpage_list($update_dir);
723*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "MAN=", \@manpages );
724*21817992SBaptiste Daroussin
725*21817992SBaptiste Daroussin    $autosrc[ $#autosrc++ ] = "make_hash";
726*21817992SBaptiste Daroussin    $autosrc[ $#autosrc++ ] = "make_keys";
727*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "GENERATED=", \@autosrc );
728*21817992SBaptiste Daroussin    printf $fp <<EOF;
729*21817992SBaptiste Daroussin
730*21817992SBaptiste DaroussinCAPLIST	= \${.CURDIR}/Caps
731*21817992SBaptiste DaroussinUSE_BIG_STRINGS	= 1
732*21817992SBaptiste Daroussin
733*21817992SBaptiste DaroussinCLEANFILES+= \${GENERATED}
734*21817992SBaptiste Daroussin
735*21817992SBaptiste DaroussinBUILDFIRST = \${GENERATED}
736*21817992SBaptiste Daroussin
737*21817992SBaptiste Daroussinincludes:
738*21817992SBaptiste Daroussin	\@cmp -s \${DESTDIR}/usr/include/ncurses.h \${.CURDIR}/curses.h || \\
739*21817992SBaptiste Daroussin	  \${INSTALL} \${INSTALL_COPY} -m 444 -o \$(BINOWN) -g \$(BINGRP) \\
740*21817992SBaptiste Daroussin	  \${.CURDIR}/curses.h \${DESTDIR}/usr/include/ncurses.h
741*21817992SBaptiste Daroussin	\@cd \${.CURDIR}; for i in ncurses_dll.h unctrl.h term.h termcap.h; do \\
742*21817992SBaptiste Daroussin	  cmp -s \$\$i \${DESTDIR}/usr/include/\$\$i || \\
743*21817992SBaptiste Daroussin	  \${INSTALL} \${INSTALL_COPY} -m 444 -o \$(BINOWN) -g \$(BINGRP) \$\$i \\
744*21817992SBaptiste Daroussin	  \${DESTDIR}/usr/include; done
745*21817992SBaptiste Daroussin
746*21817992SBaptiste Daroussinkeys.list: \${.CURDIR}/tinfo/MKkeys_list.sh
747*21817992SBaptiste Daroussin	sh \${.CURDIR}/tinfo/MKkeys_list.sh \${.CURDIR}/Caps | sort > \${.TARGET}
748*21817992SBaptiste Daroussin
749*21817992SBaptiste Daroussinfallback.c: \${.CURDIR}/tinfo/MKfallback.sh
750*21817992SBaptiste Daroussin	sh \${.CURDIR}/tinfo/MKfallback.sh /usr/share/terminfo \${.CURDIR}/../../share/termtypes/termtypes.master \$(FALLBACK_LIST) > \${.TARGET}
751*21817992SBaptiste Daroussin
752*21817992SBaptiste Daroussinlib_gen.c: \${.CURDIR}/base/MKlib_gen.sh
753*21817992SBaptiste Daroussin	sh \${.CURDIR}/base/MKlib_gen.sh "\${CC} -E -P -I\${.CURDIR}" \\
754*21817992SBaptiste Daroussin		"\${AWK}" generated < \${.CURDIR}/curses.h > lib_gen.c
755*21817992SBaptiste Daroussin
756*21817992SBaptiste Daroussininit_keytry.h: make_keys keys.list
757*21817992SBaptiste Daroussin	./make_keys keys.list > \${.TARGET}
758*21817992SBaptiste Daroussin
759*21817992SBaptiste Daroussinmake_keys: \${.CURDIR}/tinfo/make_keys.c \${.CURDIR}/curses.priv.h names.c
760*21817992SBaptiste Daroussin	\${HOSTCC} \${LDSTATIC} \${HOSTCFLAGS} \${HOSTLDFLAGS} \\
761*21817992SBaptiste Daroussin		-o \${.TARGET} \${.CURDIR}/tinfo/make_keys.c \${LDADD}
762*21817992SBaptiste DaroussinEOF
763*21817992SBaptiste Daroussin
764*21817992SBaptiste Daroussin    if ( &patchdate >= 20090808 ) {
765*21817992SBaptiste Daroussin        printf $fp <<EOF;
766*21817992SBaptiste Daroussinmake_hash:	\${.CURDIR}/tinfo/make_hash.c \\
767*21817992SBaptiste Daroussin		\${.CURDIR}/curses.priv.h \\
768*21817992SBaptiste Daroussin		\${.CURDIR}/hashsize.h
769*21817992SBaptiste Daroussin	\${HOSTCC} \${LDSTATIC} \${HOSTCFLAGS} -DMAIN_PROGRAM \${HOSTLDFLAGS} \\
770*21817992SBaptiste Daroussin		-o \${.TARGET} \${.CURDIR}/tinfo/make_hash.c \${LDADD}
771*21817992SBaptiste DaroussinEOF
772*21817992SBaptiste Daroussin    }
773*21817992SBaptiste Daroussin    else {
774*21817992SBaptiste Daroussin        printf $fp <<EOF;
775*21817992SBaptiste Daroussinmake_hash: \${.CURDIR}/tinfo/comp_hash.c \\
776*21817992SBaptiste Daroussin		\${.CURDIR}/curses.priv.h \\
777*21817992SBaptiste Daroussin		\${.CURDIR}/hashsize.h
778*21817992SBaptiste Daroussin	\${HOSTCC} \${LDSTATIC} \${HOSTCFLAGS} -DMAIN_PROGRAM \${HOSTLDFLAGS} \\
779*21817992SBaptiste Daroussin		-o \${.TARGET} \${.CURDIR}/tinfo/comp_hash.c \${LDADD}
780*21817992SBaptiste DaroussinEOF
781*21817992SBaptiste Daroussin    }
782*21817992SBaptiste Daroussin
783*21817992SBaptiste Daroussin    if ( &patchdate >= 20190309 ) {
784*21817992SBaptiste Daroussin        printf $fp <<EOF;
785*21817992SBaptiste DaroussinCAPLIST += \${.CURDIR}/Caps-ncurses
786*21817992SBaptiste Daroussin
787*21817992SBaptiste Daroussincomp_userdefs.c: make_hash \\
788*21817992SBaptiste Daroussin		\${.CURDIR}/hashsize.h \\
789*21817992SBaptiste Daroussin		\${.CURDIR}/tinfo/MKuserdefs.sh
790*21817992SBaptiste Daroussin	sh \${.CURDIR}/tinfo/MKuserdefs.sh \${AWK} \${USE_BIG_STRINGS} \${CAPLIST} > \${.TARGET}
791*21817992SBaptiste DaroussinEOF
792*21817992SBaptiste Daroussin    }
793*21817992SBaptiste Daroussin    printf $fp <<EOF;
794*21817992SBaptiste Daroussin
795*21817992SBaptiste Daroussinexpanded.c: \${.CURDIR}/term.h \${.CURDIR}/curses.priv.h \\
796*21817992SBaptiste Daroussin		\${.CURDIR}/ncurses_cfg.h \${.CURDIR}/tty/MKexpanded.sh
797*21817992SBaptiste Daroussin	sh \${.CURDIR}/tty/MKexpanded.sh "\${CC} -E -P" \${CPPFLAGS} > \${.TARGET}
798*21817992SBaptiste Daroussin
799*21817992SBaptiste Daroussincomp_captab.c: make_hash
800*21817992SBaptiste Daroussin	sh \${.CURDIR}/tinfo/MKcaptab.sh \${AWK} \${USE_BIG_STRINGS} \\
801*21817992SBaptiste Daroussin		\${.CURDIR}/tinfo/MKcaptab.awk \${CAPLIST} > \${.TARGET}
802*21817992SBaptiste Daroussin
803*21817992SBaptiste Daroussinlib_keyname.c: keys.list \${.CURDIR}/base/MKkeyname.awk
804*21817992SBaptiste Daroussin	\${AWK} -f \${.CURDIR}/base/MKkeyname.awk \\
805*21817992SBaptiste Daroussin		bigstrings=\${USE_BIG_STRINGS} \\
806*21817992SBaptiste Daroussin		keys.list > \${.TARGET}
807*21817992SBaptiste Daroussin
808*21817992SBaptiste Daroussinnames.c: \${.CURDIR}/tinfo/MKnames.awk
809*21817992SBaptiste Daroussin	\${AWK} -f \${.CURDIR}/tinfo/MKnames.awk \\
810*21817992SBaptiste Daroussin		bigstrings=\${USE_BIG_STRINGS} \\
811*21817992SBaptiste Daroussin		\${CAPLIST} > \${.TARGET}
812*21817992SBaptiste Daroussincodes.c: \${.CURDIR}/tinfo/MKcodes.awk
813*21817992SBaptiste Daroussin	\${AWK} -f \${.CURDIR}/tinfo/MKcodes.awk \\
814*21817992SBaptiste Daroussin		bigstrings=\${USE_BIG_STRINGS} \\
815*21817992SBaptiste Daroussin		\${CAPLIST} > \${.TARGET}
816*21817992SBaptiste Daroussin
817*21817992SBaptiste Daroussinunctrl.c: \${.CURDIR}/base/MKunctrl.awk
818*21817992SBaptiste Daroussin	echo | \${AWK} -f \${.CURDIR}/base/MKunctrl.awk bigstrings=1 > \${.TARGET}
819*21817992SBaptiste Daroussin
820*21817992SBaptiste Daroussin.include <bsd.own.mk>
821*21817992SBaptiste Daroussin
822*21817992SBaptiste Daroussin# Link libtermlib, libtermcap to libcurses so we don't break people's Makefiles
823*21817992SBaptiste Daroussinafterinstall:
824*21817992SBaptiste Daroussin	-cd \${DESTDIR}\${LIBDIR}; \\
825*21817992SBaptiste Daroussin	for i in \${_LIBS}; do \\
826*21817992SBaptiste Daroussin	    ln -f \$\$i `echo \$\$i | sed 's/curses/termlib/'`; \\
827*21817992SBaptiste Daroussin	    ln -f \$\$i `echo \$\$i | sed 's/curses/termcap/'`; \\
828*21817992SBaptiste Daroussin	    ln -f \$\$i `echo \$\$i | sed 's/curses/ncurses/'`; \\
829*21817992SBaptiste Daroussin	    ln -f \$\$i `echo \$\$i | sed 's/curses/ncursesw/'`; \\
830*21817992SBaptiste Daroussin	done
831*21817992SBaptiste Daroussin
832*21817992SBaptiste Daroussin.include <bsd.lib.mk>
833*21817992SBaptiste DaroussinEOF
834*21817992SBaptiste Daroussin    close $fp;
835*21817992SBaptiste Daroussin    &compare_makefiles($newfile);
836*21817992SBaptiste Daroussin}
837*21817992SBaptiste Daroussin
838*21817992SBaptiste Daroussinsub gen_lib_makefile($) {
839*21817992SBaptiste Daroussin    my $libname = shift;
840*21817992SBaptiste Daroussin    my $oldfile = "$source_dir/$libname/Makefile";
841*21817992SBaptiste Daroussin    my @oldfile = &read_file($oldfile);
842*21817992SBaptiste Daroussin
843*21817992SBaptiste Daroussin    # in ncurses, header-files are quasi-generated, because the original
844*21817992SBaptiste Daroussin    # header file for form/menu/panel lives in the source-directory, but is
845*21817992SBaptiste Daroussin    # copied to the include-directory with "make sources".
846*21817992SBaptiste Daroussin    my @headers = &makefile_list( \@oldfile, "AUTO_SRC", "?" );
847*21817992SBaptiste Daroussin
848*21817992SBaptiste Daroussin    # The C source is more straightforward.
849*21817992SBaptiste Daroussin    my @sources = &makefile_list( \@oldfile, "C_SRC", "?" );
850*21817992SBaptiste Daroussin    my $newfile = "$update_dir/Makefile";
851*21817992SBaptiste Daroussin    open( my $fp, ">", $newfile ) || &failed("cannot open $newfile");
852*21817992SBaptiste Daroussin    printf $fp <<EOF;
853*21817992SBaptiste Daroussin# $generated_by
854*21817992SBaptiste Daroussin
855*21817992SBaptiste DaroussinLIB=	$libname
856*21817992SBaptiste DaroussinEOF
857*21817992SBaptiste Daroussin
858*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "SRCS=", \@sources );
859*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "HDRS=", \@headers );
860*21817992SBaptiste Daroussin    my $includes = '-I${.CURDIR}/../libcurses';
861*21817992SBaptiste Daroussin    $includes .= ' -I${.CURDIR}/../libmenu' if ( $libname eq "form" );
862*21817992SBaptiste Daroussin    printf $fp <<EOF;
863*21817992SBaptiste DaroussinCFLAGS+=$includes -D_XOPEN_SOURCE_EXTENDED -DNDEBUG
864*21817992SBaptiste DaroussinEOF
865*21817992SBaptiste Daroussin    my @manpages = &manpage_list($update_dir);
866*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "MAN=", \@manpages );
867*21817992SBaptiste Daroussin    printf $fp <<EOF;
868*21817992SBaptiste Daroussin
869*21817992SBaptiste Daroussinincludes:
870*21817992SBaptiste Daroussin	\@cd \$\{.CURDIR}; for i in \$\{HDRS}; do \\
871*21817992SBaptiste Daroussin	  cmp -s \$\$i \${DESTDIR}/usr/include/\$\$i || \\
872*21817992SBaptiste Daroussin	  \${INSTALL} \${INSTALL_COPY} -m 444 -o \$(BINOWN) -g \$(BINGRP) \$\$i \\
873*21817992SBaptiste Daroussin	  \${DESTDIR}/usr/include; done
874*21817992SBaptiste Daroussin
875*21817992SBaptiste Daroussin.include <bsd.own.mk>
876*21817992SBaptiste Daroussin
877*21817992SBaptiste Daroussinafterinstall:
878*21817992SBaptiste Daroussin	-cd \${DESTDIR}\${LIBDIR}; \\
879*21817992SBaptiste Daroussin	for i in \${_LIBS}; do \\
880*21817992SBaptiste Daroussin	    ln -f \$\$i `echo \$\$i | sed 's/${libname}/${libname}w/'`; \\
881*21817992SBaptiste Daroussin	done
882*21817992SBaptiste Daroussin
883*21817992SBaptiste Daroussin.include <bsd.lib.mk>
884*21817992SBaptiste DaroussinEOF
885*21817992SBaptiste Daroussin    close $fp;
886*21817992SBaptiste Daroussin    &compare_makefiles($newfile);
887*21817992SBaptiste Daroussin}
888*21817992SBaptiste Daroussin
889*21817992SBaptiste Daroussinsub gen_bin_makefile($) {
890*21817992SBaptiste Daroussin    my $binname = shift;
891*21817992SBaptiste Daroussin    my $oldfile = "$source_dir/progs/Makefile";
892*21817992SBaptiste Daroussin    my @oldfile = &read_file($oldfile);
893*21817992SBaptiste Daroussin    my $newfile = "$update_dir/Makefile";
894*21817992SBaptiste Daroussin
895*21817992SBaptiste Daroussin    open( my $fp, ">", $newfile ) || &failed("cannot open $newfile");
896*21817992SBaptiste Daroussin    my @sources = ("$binname.c");
897*21817992SBaptiste Daroussin    my @links   = ();
898*21817992SBaptiste Daroussin    my @autosrc = &makefile_list( \@oldfile, "AUTO_SRC", "?" );
899*21817992SBaptiste Daroussin
900*21817992SBaptiste Daroussin    my $tput_ver       = 0;
901*21817992SBaptiste Daroussin    my $use_dump_entry = 0;
902*21817992SBaptiste Daroussin    my $use_termsort   = 0;
903*21817992SBaptiste Daroussin    my $use_tparm_type = 0;
904*21817992SBaptiste Daroussin    my $use_transform  = 0;
905*21817992SBaptiste Daroussin
906*21817992SBaptiste Daroussin    $use_dump_entry = 1 if ( $binname eq "infocmp" or $binname eq "tic" );
907*21817992SBaptiste Daroussin    $use_termsort   = 1 if ( $use_dump_entry       or $binname eq "tput" );
908*21817992SBaptiste Daroussin
909*21817992SBaptiste Daroussin    if ( &patchdate >= 20090314 ) {
910*21817992SBaptiste Daroussin        $use_transform = 1 if ( $binname =~ /^(tic|tput|tset)/ );
911*21817992SBaptiste Daroussin    }
912*21817992SBaptiste Daroussin    if ( &patchdate >= 20140521 ) {
913*21817992SBaptiste Daroussin        $use_tparm_type = 1 if ( $binname =~ /^(tic|tput)$/ );
914*21817992SBaptiste Daroussin    }
915*21817992SBaptiste Daroussin    if ( &patchdate >= 20160806 ) {
916*21817992SBaptiste Daroussin        $tput_ver = &patchdate;
917*21817992SBaptiste Daroussin    }
918*21817992SBaptiste Daroussin
919*21817992SBaptiste Daroussin    $sources[ ++$#sources ] = "dump_entry.c" if ($use_dump_entry);
920*21817992SBaptiste Daroussin    $sources[ ++$#sources ] = "tparm_type.c" if ($use_tparm_type);
921*21817992SBaptiste Daroussin    $sources[ ++$#sources ] = "transform.c"  if ($use_transform);
922*21817992SBaptiste Daroussin
923*21817992SBaptiste Daroussin    $autosrc[ ++$#autosrc ] = "termsort.c" if ($use_termsort);
924*21817992SBaptiste Daroussin
925*21817992SBaptiste Daroussin    # transform.h also is generated, but OpenBSD checked-in a copy
926*21817992SBaptiste Daroussin
927*21817992SBaptiste Daroussin    if ( $binname eq "tic" ) {
928*21817992SBaptiste Daroussin        $links[ ++$#links ] = "captoinfo";
929*21817992SBaptiste Daroussin        $links[ ++$#links ] = "infotocap";
930*21817992SBaptiste Daroussin    }
931*21817992SBaptiste Daroussin    elsif ( $binname eq "tabs" ) {
932*21817992SBaptiste Daroussin        $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 );
933*21817992SBaptiste Daroussin    }
934*21817992SBaptiste Daroussin    elsif ( $binname eq "tput" ) {
935*21817992SBaptiste Daroussin        $sources[ ++$#sources ] = "clear_cmd.c"    if ( $tput_ver >= 20161022 );
936*21817992SBaptiste Daroussin        $sources[ ++$#sources ] = "reset_cmd.c"    if ( $tput_ver >= 20160806 );
937*21817992SBaptiste Daroussin        $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 );
938*21817992SBaptiste Daroussin        $links[ ++$#links ]     = "clear";
939*21817992SBaptiste Daroussin    }
940*21817992SBaptiste Daroussin    elsif ( $binname eq "tset" ) {
941*21817992SBaptiste Daroussin        $sources[ ++$#sources ] = "reset_cmd.c"    if ( $tput_ver >= 20160806 );
942*21817992SBaptiste Daroussin        $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 );
943*21817992SBaptiste Daroussin        $links[ ++$#links ]     = "reset";
944*21817992SBaptiste Daroussin    }
945*21817992SBaptiste Daroussin
946*21817992SBaptiste Daroussin    printf $fp <<EOF;
947*21817992SBaptiste Daroussin# $generated_by
948*21817992SBaptiste Daroussin
949*21817992SBaptiste DaroussinPROG=	$binname
950*21817992SBaptiste DaroussinEOF
951*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "SRCS=", \@sources );
952*21817992SBaptiste Daroussin    printf $fp <<EOF;
953*21817992SBaptiste DaroussinCURSES=	\${.CURDIR}/../../lib/libcurses
954*21817992SBaptiste DaroussinDPADD=	\${LIBCURSES}
955*21817992SBaptiste DaroussinLDADD=	-L\${CURSES} -lcurses\t# in-tree link to add _nc_strict_bsd, etc
956*21817992SBaptiste DaroussinEOF
957*21817992SBaptiste Daroussin    if ( $#links >= 0 ) {
958*21817992SBaptiste Daroussin        my @bin_links;
959*21817992SBaptiste Daroussin        for my $n ( 0 .. $#links ) {
960*21817992SBaptiste Daroussin            $bin_links[ ++$#bin_links ] = '${BINDIR}/' . $binname;
961*21817992SBaptiste Daroussin            $bin_links[ ++$#bin_links ] = '${BINDIR}/' . $links[$n];
962*21817992SBaptiste Daroussin        }
963*21817992SBaptiste Daroussin        printf $fp "%s\n", &format_list( "LINKS=", \@bin_links, 1 );
964*21817992SBaptiste Daroussin    }
965*21817992SBaptiste Daroussin    my $ticfix = '${.CURDIR}/';
966*21817992SBaptiste Daroussin    if ( $binname eq "tic" ) {
967*21817992SBaptiste Daroussin        printf $fp <<EOF;
968*21817992SBaptiste DaroussinCFLAGS+= -I\${CURSES} -I\${.CURDIR} -I.
969*21817992SBaptiste DaroussinEOF
970*21817992SBaptiste Daroussin    }
971*21817992SBaptiste Daroussin    else {
972*21817992SBaptiste Daroussin        $ticfix = '${TIC}/';
973*21817992SBaptiste Daroussin        printf $fp <<EOF;
974*21817992SBaptiste DaroussinTIC= \${.CURDIR}/../tic
975*21817992SBaptiste DaroussinCFLAGS+= -I\${CURSES} -I\${TIC} -I\${.CURDIR} -I.
976*21817992SBaptiste Daroussin.PATH:  \${TIC}
977*21817992SBaptiste DaroussinEOF
978*21817992SBaptiste Daroussin    }
979*21817992SBaptiste Daroussin    printf $fp "%s\n", &format_list( "CLEANFILES+=", \@autosrc );
980*21817992SBaptiste Daroussin    if ($use_dump_entry) {
981*21817992SBaptiste Daroussin        printf $fp <<EOF;
982*21817992SBaptiste Daroussin
983*21817992SBaptiste Daroussindump_entry.o: termsort.c
984*21817992SBaptiste DaroussinEOF
985*21817992SBaptiste Daroussin    }
986*21817992SBaptiste Daroussin    if ($use_termsort) {
987*21817992SBaptiste Daroussin        printf $fp <<EOF;
988*21817992SBaptiste Daroussin
989*21817992SBaptiste Daroussintermsort.c: ${ticfix}MKtermsort.sh
990*21817992SBaptiste Daroussin	sh ${ticfix}MKtermsort.sh awk \${CURSES}/Caps > \${.TARGET}
991*21817992SBaptiste DaroussinEOF
992*21817992SBaptiste Daroussin    }
993*21817992SBaptiste Daroussin    printf $fp <<EOF;
994*21817992SBaptiste Daroussin
995*21817992SBaptiste Daroussin.include <bsd.prog.mk>
996*21817992SBaptiste DaroussinEOF
997*21817992SBaptiste Daroussin    close $fp;
998*21817992SBaptiste Daroussin
999*21817992SBaptiste Daroussin    &compare_makefiles($newfile);
1000*21817992SBaptiste Daroussin}
1001*21817992SBaptiste Daroussin
1002*21817992SBaptiste Daroussin################################################################################
1003*21817992SBaptiste Daroussin
1004*21817992SBaptiste Daroussinsub setup_lib_libcurses() {
1005*21817992SBaptiste Daroussin    if ( &setup_dir("lib/libcurses") ) {
1006*21817992SBaptiste Daroussin        &copy_code( "$source_dir/ncurses/base",     "$update_dir/base" );
1007*21817992SBaptiste Daroussin        &copy_code( "$source_dir/ncurses/tinfo",    "$update_dir/tinfo" );
1008*21817992SBaptiste Daroussin        &copy_code( "$source_dir/ncurses/tty",      "$update_dir/tty" );
1009*21817992SBaptiste Daroussin        &copy_code( "$source_dir/ncurses/widechar", "$update_dir/widechar" );
1010*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/Caps",           $update_dir );
1011*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/capdefaults.c",  $update_dir );
1012*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/curses.h",       $update_dir );
1013*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/hashed_db.h",    $update_dir );
1014*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/hashsize.h",     $update_dir );
1015*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/nc_alloc.h",     $update_dir );
1016*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/nc_panel.h",     $update_dir );
1017*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/nc_tparm.h",     $update_dir );
1018*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/ncurses_cfg.h",  $update_dir );
1019*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/ncurses_def.h",  $update_dir );
1020*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/ncurses_dll.h",  $update_dir );
1021*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/parametrized.h", $update_dir );
1022*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/term.h",         $update_dir );
1023*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/termcap.h",      $update_dir );
1024*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/term_entry.h",   $update_dir );
1025*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/tic.h",          $update_dir );
1026*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/unctrl.h",       $update_dir );
1027*21817992SBaptiste Daroussin        &copy_file( "$source_dir/man/terminfo.5",         $update_dir );
1028*21817992SBaptiste Daroussin        &copy_docs("curses");
1029*21817992SBaptiste Daroussin
1030*21817992SBaptiste Daroussin        &verbose(".. work around a bug in /bin/sh in OpenBSD");
1031*21817992SBaptiste Daroussin        system( "sed -i"
1032*21817992SBaptiste Daroussin              . " -e 's,^shift,test \$# != 0 \\&\\& shift,'"
1033*21817992SBaptiste Daroussin              . " $update_dir/tinfo/MKfallback.sh" );
1034*21817992SBaptiste Daroussin
1035*21817992SBaptiste Daroussin        # OpenBSD dropped support for sys/ttydev.h, without mentioning the
1036*21817992SBaptiste Daroussin        # system version.  Just trim it.
1037*21817992SBaptiste Daroussin        &verbose(".. work around mishandled sys/ttydef.h");
1038*21817992SBaptiste Daroussin        system( "sed -i"
1039*21817992SBaptiste Daroussin              . " -e '/__FreeBSD_version/s,|| defined(__OpenBSD__),,'"
1040*21817992SBaptiste Daroussin              . " $update_dir/tinfo/lib_baudrate.c" );
1041*21817992SBaptiste Daroussin
1042*21817992SBaptiste Daroussin        if ($opt_t) {
1043*21817992SBaptiste Daroussin            &copy_code( "$source_dir/ncurses/trace", "$update_dir/trace" );
1044*21817992SBaptiste Daroussin        }
1045*21817992SBaptiste Daroussin        else {
1046*21817992SBaptiste Daroussin            &copy_file( "$source_dir/ncurses/trace/lib_trace.c", $update_dir );
1047*21817992SBaptiste Daroussin            &copy_file( "$source_dir/ncurses/trace/visbuf.c",    $update_dir );
1048*21817992SBaptiste Daroussin        }
1049*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/nc_termios.h", $update_dir )
1050*21817992SBaptiste Daroussin          if ( &patchdate >= 20110625 );
1051*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/nc_string.h", $update_dir )
1052*21817992SBaptiste Daroussin          if ( &patchdate >= 20120222 );
1053*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/nc_access.h", $update_dir )
1054*21817992SBaptiste Daroussin          if ( &patchdate >= 20210626 );
1055*21817992SBaptiste Daroussin        &copy_file( "$source_dir/include/Caps-ncurses", $update_dir )
1056*21817992SBaptiste Daroussin          if ( &patchdate >= 20190302 );
1057*21817992SBaptiste Daroussin        &gen_1st_makefile;
1058*21817992SBaptiste Daroussin        &finish_dir;
1059*21817992SBaptiste Daroussin    }
1060*21817992SBaptiste Daroussin}
1061*21817992SBaptiste Daroussin
1062*21817992SBaptiste Daroussinsub setup_lib_libform() {
1063*21817992SBaptiste Daroussin    if ( &setup_dir("lib/libform") ) {
1064*21817992SBaptiste Daroussin        &copy_docs("form");
1065*21817992SBaptiste Daroussin        &gen_lib_makefile("form");
1066*21817992SBaptiste Daroussin        &finish_dir;
1067*21817992SBaptiste Daroussin    }
1068*21817992SBaptiste Daroussin}
1069*21817992SBaptiste Daroussin
1070*21817992SBaptiste Daroussinsub setup_lib_libmenu() {
1071*21817992SBaptiste Daroussin    if ( &setup_dir("lib/libmenu") ) {
1072*21817992SBaptiste Daroussin        &copy_docs("menu");
1073*21817992SBaptiste Daroussin        &gen_lib_makefile("menu");
1074*21817992SBaptiste Daroussin        &finish_dir;
1075*21817992SBaptiste Daroussin    }
1076*21817992SBaptiste Daroussin}
1077*21817992SBaptiste Daroussin
1078*21817992SBaptiste Daroussinsub setup_lib_libpanel() {
1079*21817992SBaptiste Daroussin    if ( &setup_dir("lib/libpanel") ) {
1080*21817992SBaptiste Daroussin        &copy_docs("panel");
1081*21817992SBaptiste Daroussin        &gen_lib_makefile("panel");
1082*21817992SBaptiste Daroussin        &finish_dir;
1083*21817992SBaptiste Daroussin    }
1084*21817992SBaptiste Daroussin}
1085*21817992SBaptiste Daroussin
1086*21817992SBaptiste Daroussinsub setup_bin_infocmp() {
1087*21817992SBaptiste Daroussin    if ( &setup_dir("usr.bin/infocmp") ) {
1088*21817992SBaptiste Daroussin        &copy_docs("infocmp");
1089*21817992SBaptiste Daroussin        &gen_bin_makefile("infocmp");
1090*21817992SBaptiste Daroussin        &finish_dir;
1091*21817992SBaptiste Daroussin    }
1092*21817992SBaptiste Daroussin}
1093*21817992SBaptiste Daroussin
1094*21817992SBaptiste Daroussinsub setup_bin_tabs() {
1095*21817992SBaptiste Daroussin    if ( &setup_dir("usr.bin/tabs") ) {
1096*21817992SBaptiste Daroussin        &copy_docs("tabs");
1097*21817992SBaptiste Daroussin        &gen_bin_makefile("tabs");
1098*21817992SBaptiste Daroussin        &finish_dir;
1099*21817992SBaptiste Daroussin    }
1100*21817992SBaptiste Daroussin}
1101*21817992SBaptiste Daroussin
1102*21817992SBaptiste Daroussinsub setup_bin_tic() {
1103*21817992SBaptiste Daroussin    if ( &setup_dir("usr.bin/tic") ) {
1104*21817992SBaptiste Daroussin        if ( &patchdate >= 20140521 ) {
1105*21817992SBaptiste Daroussin            &copy_file( "$source_dir/progs/tparm_type.c", $update_dir );
1106*21817992SBaptiste Daroussin            &copy_file( "$source_dir/progs/tparm_type.h", $update_dir );
1107*21817992SBaptiste Daroussin        }
1108*21817992SBaptiste Daroussin
1109*21817992SBaptiste Daroussin        # shared files for tput/tset
1110*21817992SBaptiste Daroussin        if ( &patchdate >= 20160806 ) {
1111*21817992SBaptiste Daroussin            &copy_file( "$source_dir/progs/reset_cmd.c", $update_dir );
1112*21817992SBaptiste Daroussin            &copy_file( "$source_dir/progs/reset_cmd.h", $update_dir );
1113*21817992SBaptiste Daroussin        }
1114*21817992SBaptiste Daroussin        if ( &patchdate >= 20161022 ) {
1115*21817992SBaptiste Daroussin            &copy_file( "$source_dir/progs/clear_cmd.c", $update_dir );
1116*21817992SBaptiste Daroussin            &copy_file( "$source_dir/progs/clear_cmd.h", $update_dir );
1117*21817992SBaptiste Daroussin        }
1118*21817992SBaptiste Daroussin        if ( &patchdate >= 20161224 ) {
1119*21817992SBaptiste Daroussin            &copy_file( "$source_dir/progs/tty_settings.c", $update_dir );
1120*21817992SBaptiste Daroussin            &copy_file( "$source_dir/progs/tty_settings.h", $update_dir );
1121*21817992SBaptiste Daroussin        }
1122*21817992SBaptiste Daroussin        &copy_docs("tic");
1123*21817992SBaptiste Daroussin        &gen_bin_makefile("tic");
1124*21817992SBaptiste Daroussin        &finish_dir;
1125*21817992SBaptiste Daroussin    }
1126*21817992SBaptiste Daroussin}
1127*21817992SBaptiste Daroussin
1128*21817992SBaptiste Daroussinsub setup_bin_toe() {
1129*21817992SBaptiste Daroussin    if ( &setup_dir("usr.bin/toe") ) {
1130*21817992SBaptiste Daroussin        &copy_docs("toe");
1131*21817992SBaptiste Daroussin        &gen_bin_makefile("toe");
1132*21817992SBaptiste Daroussin        &finish_dir;
1133*21817992SBaptiste Daroussin    }
1134*21817992SBaptiste Daroussin}
1135*21817992SBaptiste Daroussin
1136*21817992SBaptiste Daroussinsub setup_bin_tput() {
1137*21817992SBaptiste Daroussin    if ( &setup_dir("usr.bin/tput") ) {
1138*21817992SBaptiste Daroussin        &copy_docs("tput");
1139*21817992SBaptiste Daroussin        &gen_bin_makefile("tput");
1140*21817992SBaptiste Daroussin        &finish_dir;
1141*21817992SBaptiste Daroussin    }
1142*21817992SBaptiste Daroussin}
1143*21817992SBaptiste Daroussin
1144*21817992SBaptiste Daroussinsub setup_bin_tset() {
1145*21817992SBaptiste Daroussin    if ( &setup_dir("usr.bin/tset") ) {
1146*21817992SBaptiste Daroussin        &copy_docs("tset");
1147*21817992SBaptiste Daroussin        &gen_bin_makefile("tset");
1148*21817992SBaptiste Daroussin        &finish_dir;
1149*21817992SBaptiste Daroussin    }
1150*21817992SBaptiste Daroussin}
1151*21817992SBaptiste Daroussin
1152*21817992SBaptiste Daroussinsub setup_terminfo() {
1153*21817992SBaptiste Daroussin    if ( &setup_dir("share/termtypes") ) {
1154*21817992SBaptiste Daroussin        &copy_code( $target_dir, $update_dir );
1155*21817992SBaptiste Daroussin        &copy_file( "$source_dir/misc/terminfo.src",
1156*21817992SBaptiste Daroussin            "$update_dir/termtypes.master" );
1157*21817992SBaptiste Daroussin
1158*21817992SBaptiste Daroussin        # build the terminfo database using the in-tree tic.
1159*21817992SBaptiste Daroussin        # This is always best practice, but for ncurses 6.2 in particular is
1160*21817992SBaptiste Daroussin        # required.
1161*21817992SBaptiste Daroussin        my $prog = abs_path("$target_dir/../../usr.bin/tic");
1162*21817992SBaptiste Daroussin        my $libs = abs_path("$target_dir/../../lib/libcurses");
1163*21817992SBaptiste Daroussin        if ( defined $prog and defined $libs ) {
1164*21817992SBaptiste Daroussin            $prog .= "/tic";
1165*21817992SBaptiste Daroussin            &verbose(".. changing makefile to use in-tree tic");
1166*21817992SBaptiste Daroussin            system( "sed -i -E "
1167*21817992SBaptiste Daroussin                  . "-e 's,(TIC=).*,\\1\t$prog,' "
1168*21817992SBaptiste Daroussin                  . "-e 's,(\\\${TIC}),LD_LIBRARY_PATH=$libs \\1,' "
1169*21817992SBaptiste Daroussin                  . "$update_dir/Makefile" );
1170*21817992SBaptiste Daroussin        }
1171*21817992SBaptiste Daroussin        &finish_dir;
1172*21817992SBaptiste Daroussin    }
1173*21817992SBaptiste Daroussin}
1174*21817992SBaptiste Daroussin
1175*21817992SBaptiste Daroussinsub configure_tree() {
1176*21817992SBaptiste Daroussin    return if ( -f "ncurses/Makefile" );
1177*21817992SBaptiste Daroussin    my @search = ( "/usr/share/terminfo", "/usr/local/share/terminfo" );
1178*21817992SBaptiste Daroussin    my @prefix = ("./configure");
1179*21817992SBaptiste Daroussin    $prefix[ ++$#prefix ] = "--with-abi-version=5"
1180*21817992SBaptiste Daroussin      if ( &patchdate >= 20150502 && !$opt_6 );
1181*21817992SBaptiste Daroussin    my @options = (
1182*21817992SBaptiste Daroussin        "--with-ospeed=int",                               #
1183*21817992SBaptiste Daroussin        "--with-shared",                                   #
1184*21817992SBaptiste Daroussin        "--without-normal",                                #
1185*21817992SBaptiste Daroussin        "--without-debug",                                 #
1186*21817992SBaptiste Daroussin        "--with-terminfo-dirs=" . join( ':', @search ),    #
1187*21817992SBaptiste Daroussin        "--without-ada",                                   #
1188*21817992SBaptiste Daroussin        "--disable-hard-tabs",                             #
1189*21817992SBaptiste Daroussin        "--enable-const",                                  #
1190*21817992SBaptiste Daroussin        "--enable-getcap",                                 #
1191*21817992SBaptiste Daroussin        "--enable-bsdpad",                                 #
1192*21817992SBaptiste Daroussin        "--enable-signed-char",                            #
1193*21817992SBaptiste Daroussin        "--enable-termcap",                                #
1194*21817992SBaptiste Daroussin        "--enable-widec",                                  #
1195*21817992SBaptiste Daroussin        "--disable-setuid-environ"
1196*21817992SBaptiste Daroussin    );
1197*21817992SBaptiste Daroussin    $options[ ++$#options ] = "--with-trace" if ($opt_t);
1198*21817992SBaptiste Daroussin    $options[ ++$#options ] = "--enable-string-hacks"
1199*21817992SBaptiste Daroussin      if ( &patchdate >= 20120225 );
1200*21817992SBaptiste Daroussin    system( join( ' ', @prefix ) . ' ' . join( ' ', @options ) );
1201*21817992SBaptiste Daroussin    &failed("problem with configuring") unless ( -f "ncurses/Makefile" );
1202*21817992SBaptiste Daroussin
1203*21817992SBaptiste Daroussin    system("make sources");
1204*21817992SBaptiste Daroussin
1205*21817992SBaptiste Daroussin    # OpenBSD developers edit the generated file and do not regen it when
1206*21817992SBaptiste Daroussin    # doing upgrades.  This script reflects those edits.
1207*21817992SBaptiste Daroussin    system( "sed -i" . " -E"
1208*21817992SBaptiste Daroussin          . " -e '/TYPEOF_CHTYPE/s,int,long,'"
1209*21817992SBaptiste Daroussin          . " -e '/USE_TERMCAP/d'"
1210*21817992SBaptiste Daroussin          . " -e '/HAVE_LIB(FORM|MENU|PANEL)/s,^(.*)\$,/* \\1 */,'"
1211*21817992SBaptiste Daroussin          . " -e 's/TERMPATH.*/PURE_TERMINFO 0/'"
1212*21817992SBaptiste Daroussin          . " -e '/SYSTEM_NAME/s,\[0-9.\]+,,'"
1213*21817992SBaptiste Daroussin          . " include/ncurses_cfg.h" );
1214*21817992SBaptiste Daroussin}
1215*21817992SBaptiste Daroussin
1216*21817992SBaptiste Daroussinsub get_definitions() {
1217*21817992SBaptiste Daroussin    my @data = &read_file("dist.mk");
1218*21817992SBaptiste Daroussin    for my $n ( 0 .. $#data ) {
1219*21817992SBaptiste Daroussin        my $text = $data[$n];
1220*21817992SBaptiste Daroussin        $text =~ s/^\s*//;
1221*21817992SBaptiste Daroussin        next unless ( $text =~ /^NCURSES.*=/ );
1222*21817992SBaptiste Daroussin        $text =~ s/\s*=\s+/=/;
1223*21817992SBaptiste Daroussin        my $name = $text;
1224*21817992SBaptiste Daroussin        $name =~ s/=.*//;
1225*21817992SBaptiste Daroussin        my $value = $text;
1226*21817992SBaptiste Daroussin        $value =~ s/^[^=]*=//;
1227*21817992SBaptiste Daroussin        $value =~ s/\s.*//;
1228*21817992SBaptiste Daroussin        $definitions{$name} = $value;
1229*21817992SBaptiste Daroussin    }
1230*21817992SBaptiste Daroussin}
1231*21817992SBaptiste Daroussin
1232*21817992SBaptiste Daroussinsub setup_all_dirs() {
1233*21817992SBaptiste Daroussin    printf "** %s all build-directories\n", $opt_r ? "removing" : "setting up";
1234*21817992SBaptiste Daroussin    &get_definitions;
1235*21817992SBaptiste Daroussin    &configure_tree unless ($opt_r);
1236*21817992SBaptiste Daroussin    &setup_lib_libcurses;
1237*21817992SBaptiste Daroussin    &setup_lib_libmenu;
1238*21817992SBaptiste Daroussin    &setup_lib_libform;    # build after libmenu, for mf_common.h
1239*21817992SBaptiste Daroussin    &setup_lib_libpanel;
1240*21817992SBaptiste Daroussin    &setup_bin_tic;        # do this first, for shared headers
1241*21817992SBaptiste Daroussin    &setup_bin_infocmp;
1242*21817992SBaptiste Daroussin    &setup_bin_tabs if ( -f "$source_dir/progs/tabs.c" );
1243*21817992SBaptiste Daroussin    &setup_bin_toe;
1244*21817992SBaptiste Daroussin    &setup_bin_tput;
1245*21817992SBaptiste Daroussin    &setup_bin_tset;
1246*21817992SBaptiste Daroussin    &setup_terminfo;
1247*21817992SBaptiste Daroussin}
1248*21817992SBaptiste Daroussin
1249*21817992SBaptiste Daroussinsub usage() {
1250*21817992SBaptiste Daroussin    print <<EOF;
1251*21817992SBaptiste DaroussinUsage: ncu2openbsd [options] [sourcetree]
1252*21817992SBaptiste Daroussin
1253*21817992SBaptiste DaroussinOptions:
1254*21817992SBaptiste Daroussin  -6       use ABI 6 rather than 5 if available
1255*21817992SBaptiste Daroussin  -d DST   specify destination (default: /usr/src)
1256*21817992SBaptiste Daroussin  -n       no-op, do not update destination
1257*21817992SBaptiste Daroussin  -r       remove update, restore sources from ".orig"
1258*21817992SBaptiste Daroussin  -t       enable ncurses trace
1259*21817992SBaptiste Daroussin  -v       verbose
1260*21817992SBaptiste Daroussin  -x       build each directory after setting up
1261*21817992SBaptiste DaroussinEOF
1262*21817992SBaptiste Daroussin    exit;
1263*21817992SBaptiste Daroussin}
1264*21817992SBaptiste Daroussin
1265*21817992SBaptiste Daroussin$Getopt::Std::STANDARD_HELP_VERSION = 1;
1266*21817992SBaptiste Daroussin&getopts('6d:nrtvx') || &usage();
1267*21817992SBaptiste Daroussin$opt_d = "/usr/src" unless ($opt_d);
1268*21817992SBaptiste Daroussin&usage() unless ( $#ARGV <= 0 );
1269*21817992SBaptiste Daroussin
1270*21817992SBaptiste Daroussinif ( $#ARGV == 0 ) {
1271*21817992SBaptiste Daroussin    if ( -f $ARGV[0] ) {
1272*21817992SBaptiste Daroussin        printf "** unpacking sources: %s\n", $ARGV[0];
1273*21817992SBaptiste Daroussin        &unpack( $ARGV[0] );
1274*21817992SBaptiste Daroussin    }
1275*21817992SBaptiste Daroussin    else {
1276*21817992SBaptiste Daroussin        &check_sourcedir( $ARGV[0] );
1277*21817992SBaptiste Daroussin    }
1278*21817992SBaptiste Daroussin}
1279*21817992SBaptiste Daroussinelse {
1280*21817992SBaptiste Daroussin    &check_sourcedir(".");
1281*21817992SBaptiste Daroussin}
1282*21817992SBaptiste Daroussin
1283*21817992SBaptiste Daroussin&setup_all_dirs;
1284*21817992SBaptiste Daroussin
1285*21817992SBaptiste Daroussin# move out of temp-directory to allow cleanup.
1286*21817992SBaptiste Daroussinchdir $current;
1287*21817992SBaptiste Daroussin
1288*21817992SBaptiste Daroussin1;
1289