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 ©_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 ©_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 ©_1doc( $docs . ".1" ); 452*21817992SBaptiste Daroussin if ( $docs eq "tic" ) { 453*21817992SBaptiste Daroussin ©_1doc("captoinfo.1"); 454*21817992SBaptiste Daroussin ©_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 ©_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 ©_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 ©_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 ©_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 ©_file( "$target_dir/shlib_version", $update_dir ) 516*21817992SBaptiste Daroussin if ( $dst =~ /^lib\// ); 517*21817992SBaptiste Daroussin ©_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 ©_code( "$source_dir/ncurses/base", "$update_dir/base" ); 1007*21817992SBaptiste Daroussin ©_code( "$source_dir/ncurses/tinfo", "$update_dir/tinfo" ); 1008*21817992SBaptiste Daroussin ©_code( "$source_dir/ncurses/tty", "$update_dir/tty" ); 1009*21817992SBaptiste Daroussin ©_code( "$source_dir/ncurses/widechar", "$update_dir/widechar" ); 1010*21817992SBaptiste Daroussin ©_file( "$source_dir/include/Caps", $update_dir ); 1011*21817992SBaptiste Daroussin ©_file( "$source_dir/include/capdefaults.c", $update_dir ); 1012*21817992SBaptiste Daroussin ©_file( "$source_dir/include/curses.h", $update_dir ); 1013*21817992SBaptiste Daroussin ©_file( "$source_dir/include/hashed_db.h", $update_dir ); 1014*21817992SBaptiste Daroussin ©_file( "$source_dir/include/hashsize.h", $update_dir ); 1015*21817992SBaptiste Daroussin ©_file( "$source_dir/include/nc_alloc.h", $update_dir ); 1016*21817992SBaptiste Daroussin ©_file( "$source_dir/include/nc_panel.h", $update_dir ); 1017*21817992SBaptiste Daroussin ©_file( "$source_dir/include/nc_tparm.h", $update_dir ); 1018*21817992SBaptiste Daroussin ©_file( "$source_dir/include/ncurses_cfg.h", $update_dir ); 1019*21817992SBaptiste Daroussin ©_file( "$source_dir/include/ncurses_def.h", $update_dir ); 1020*21817992SBaptiste Daroussin ©_file( "$source_dir/include/ncurses_dll.h", $update_dir ); 1021*21817992SBaptiste Daroussin ©_file( "$source_dir/include/parametrized.h", $update_dir ); 1022*21817992SBaptiste Daroussin ©_file( "$source_dir/include/term.h", $update_dir ); 1023*21817992SBaptiste Daroussin ©_file( "$source_dir/include/termcap.h", $update_dir ); 1024*21817992SBaptiste Daroussin ©_file( "$source_dir/include/term_entry.h", $update_dir ); 1025*21817992SBaptiste Daroussin ©_file( "$source_dir/include/tic.h", $update_dir ); 1026*21817992SBaptiste Daroussin ©_file( "$source_dir/include/unctrl.h", $update_dir ); 1027*21817992SBaptiste Daroussin ©_file( "$source_dir/man/terminfo.5", $update_dir ); 1028*21817992SBaptiste Daroussin ©_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 ©_code( "$source_dir/ncurses/trace", "$update_dir/trace" ); 1044*21817992SBaptiste Daroussin } 1045*21817992SBaptiste Daroussin else { 1046*21817992SBaptiste Daroussin ©_file( "$source_dir/ncurses/trace/lib_trace.c", $update_dir ); 1047*21817992SBaptiste Daroussin ©_file( "$source_dir/ncurses/trace/visbuf.c", $update_dir ); 1048*21817992SBaptiste Daroussin } 1049*21817992SBaptiste Daroussin ©_file( "$source_dir/include/nc_termios.h", $update_dir ) 1050*21817992SBaptiste Daroussin if ( &patchdate >= 20110625 ); 1051*21817992SBaptiste Daroussin ©_file( "$source_dir/include/nc_string.h", $update_dir ) 1052*21817992SBaptiste Daroussin if ( &patchdate >= 20120222 ); 1053*21817992SBaptiste Daroussin ©_file( "$source_dir/include/nc_access.h", $update_dir ) 1054*21817992SBaptiste Daroussin if ( &patchdate >= 20210626 ); 1055*21817992SBaptiste Daroussin ©_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 ©_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 ©_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 ©_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 ©_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 ©_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 ©_file( "$source_dir/progs/tparm_type.c", $update_dir ); 1106*21817992SBaptiste Daroussin ©_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 ©_file( "$source_dir/progs/reset_cmd.c", $update_dir ); 1112*21817992SBaptiste Daroussin ©_file( "$source_dir/progs/reset_cmd.h", $update_dir ); 1113*21817992SBaptiste Daroussin } 1114*21817992SBaptiste Daroussin if ( &patchdate >= 20161022 ) { 1115*21817992SBaptiste Daroussin ©_file( "$source_dir/progs/clear_cmd.c", $update_dir ); 1116*21817992SBaptiste Daroussin ©_file( "$source_dir/progs/clear_cmd.h", $update_dir ); 1117*21817992SBaptiste Daroussin } 1118*21817992SBaptiste Daroussin if ( &patchdate >= 20161224 ) { 1119*21817992SBaptiste Daroussin ©_file( "$source_dir/progs/tty_settings.c", $update_dir ); 1120*21817992SBaptiste Daroussin ©_file( "$source_dir/progs/tty_settings.h", $update_dir ); 1121*21817992SBaptiste Daroussin } 1122*21817992SBaptiste Daroussin ©_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 ©_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 ©_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 ©_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 ©_code( $target_dir, $update_dir ); 1155*21817992SBaptiste Daroussin ©_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