From 8bfc5756fb68e0b13d7e7c0073ad5b9a4790d1b6 Mon Sep 17 00:00:00 2001 From: rmanfredi Date: Thu, 24 Aug 2006 12:32:52 +0000 Subject: Moving project to sourceforge. git-svn-id: https://dist.svn.sourceforge.net/svnroot/dist/trunk/dist@1 190e5f8e-a817-0410-acf6-e9863daed9af --- Artistic | 125 ++ ChangeLog | 1457 ++++++++++++++++++ Configure | 3892 +++++++++++++++++++++++++++++++++++++++++++++++ Credits | 112 ++ Jmakefile | 35 + Known_bugs | 14 + MANIFEST | 612 ++++++++ Makefile.SH | 218 +++ README | 138 ++ Wishlist | 60 + bin/Jmakefile | 45 + bin/Makefile.SH | 216 +++ bin/manicheck.SH | 82 + bin/manicheck.man | 51 + bin/manilist.SH | 484 ++++++ bin/manilist.man | 332 ++++ bin/packinit.SH | 447 ++++++ bin/packinit.man | 148 ++ bin/perload | 648 ++++++++ dist.man | 317 ++++ install.SH | 216 +++ jmake/Jmakefile | 51 + jmake/Makefile.SH | 300 ++++ jmake/NOTES | 189 +++ jmake/README | 70 + jmake/bindex.SH | 185 +++ jmake/files/Jmake.rules | 1801 ++++++++++++++++++++++ jmake/files/Jmake.tmpl | 253 +++ jmake/fixcpp.SH | 183 +++ jmake/jmake.SH | 526 +++++++ jmake/jmake.man | 491 ++++++ jmake/jmkmf.SH | 106 ++ jmake/jmkmf.man | 80 + kit/Jmakefile | 49 + kit/Makefile.SH | 235 +++ kit/README | 35 + kit/kitpost.SH | 237 +++ kit/kitpost.man | 89 ++ kit/kitsend.SH | 192 +++ kit/kitsend.man | 42 + kit/makeSH | 76 + kit/makeSH.man | 46 + kit/makedist.SH | 460 ++++++ kit/makedist.man | 147 ++ kit/manifake.SH | 51 + kit/manifake.man | 46 + lib/C/Jmakefile | 20 + lib/C/Makefile.SH | 188 +++ lib/C/fake/Jmakefile | 29 + lib/C/fake/Makefile.SH | 156 ++ lib/C/fake/dup2.C | 78 + lib/C/fake/getopt.C | 133 ++ lib/C/fake/rename.C | 45 + lib/C/fake/scandir.C | 131 ++ lib/C/fake/setsid.C | 64 + lib/Jmakefile | 57 + lib/Makefile.SH | 246 +++ lib/errnolist.a | 52 + lib/errnolist.mk | 42 + lib/errnolist.sh | 44 + lib/makedepend.sh | 169 ++ lib/makedir.sh | 86 ++ mcon/INTRO | 109 ++ mcon/Jmakefile | 93 ++ mcon/Makefile.SH | 378 +++++ mcon/NOTES | 174 +++ mcon/README | 24 + mcon/U/AAAAA.U | 46 + mcon/U/Begin.U | 39 + mcon/U/Checkcc.U | 135 ++ mcon/U/Chk_MANI.U | 88 ++ mcon/U/Chk_whoami.U | 25 + mcon/U/Compile.U | 63 + mcon/U/Config_h.U | 114 ++ mcon/U/Config_sh.U | 110 ++ mcon/U/Configdir.U | 28 + mcon/U/Cppsym.U | 286 ++++ mcon/U/Cross.U | 349 +++++ mcon/U/Csym.U | 97 ++ mcon/U/End.U | 27 + mcon/U/Extract.U | 105 ++ mcon/U/Extractall.U | 51 + mcon/U/Filexp.U | 69 + mcon/U/Findhdr.U | 126 ++ mcon/U/Finish.U | 141 ++ mcon/U/Getfile.U | 339 +++++ mcon/U/Guess.U | 228 +++ mcon/U/Head.U | 282 ++++ mcon/U/Inhdr.U | 77 + mcon/U/Init.U | 81 + mcon/U/Inlibc.U | 64 + mcon/U/Instruct.U | 116 ++ mcon/U/Loc.U | 381 +++++ mcon/U/Loc_sed.U | 33 + mcon/U/Magic_h.U | 43 + mcon/U/MailAuthor.U | 192 +++ mcon/U/MailList.U | 82 + mcon/U/Mkdirp.U | 51 + mcon/U/Mksymlinks.U | 90 ++ mcon/U/Myinit.U | 26 + mcon/U/Myread.U | 199 +++ mcon/U/Nothing.U | 19 + mcon/U/Null.U | 20 + mcon/U/Obsol_h.U | 28 + mcon/U/Obsol_sh.U | 27 + mcon/U/Oldconfig.U | 687 +++++++++ mcon/U/Oldsym.U | 66 + mcon/U/Options.U | 363 +++++ mcon/U/Prefixit.U | 68 + mcon/U/Prefixup.U | 38 + mcon/U/Rcs.U | 34 + mcon/U/Setvar.U | 50 + mcon/U/Signal.U | 271 ++++ mcon/U/Tr.U | 103 ++ mcon/U/Typedef.U | 63 + mcon/U/Unix.U | 64 + mcon/U/Warn.U | 57 + mcon/U/Warn_v7EXT.U | 34 + mcon/U/Warn_v7ND.U | 33 + mcon/U/Whoa.U | 51 + mcon/U/abortsig.U | 79 + mcon/U/active.U | 50 + mcon/U/afs.U | 55 + mcon/U/alignbytes.U | 64 + mcon/U/archlib.U | 125 ++ mcon/U/archname.U | 76 + mcon/U/baserev.U | 22 + mcon/U/basicshell.U | 47 + mcon/U/bin.U | 88 ++ mcon/U/bitpbyte.U | 74 + mcon/U/byteorder.U | 99 ++ mcon/U/cc.U | 58 + mcon/U/ccflags.U | 403 +++++ mcon/U/cf_email.U | 58 + mcon/U/cf_name.U | 72 + mcon/U/cf_who.U | 62 + mcon/U/charorder.U | 143 ++ mcon/U/charsize.U | 58 + mcon/U/contains.U | 43 + mcon/U/cpp_stuff.U | 157 ++ mcon/U/cpp_trad.U | 41 + mcon/U/cppfilecom.U | 204 +++ mcon/U/cppstdin.U | 249 +++ mcon/U/d_NOFILE.U | 189 +++ mcon/U/d_NeWS.U | 101 ++ mcon/U/d_PORTAR.U | 79 + mcon/U/d_SHM_MAC.U | 141 ++ mcon/U/d_access.U | 74 + mcon/U/d_alarm.U | 33 + mcon/U/d_attribut.U | 64 + mcon/U/d_bcmp.U | 44 + mcon/U/d_bcopy.U | 44 + mcon/U/d_brokstat.U | 75 + mcon/U/d_bsdjmp.U | 86 ++ mcon/U/d_byacc.U | 33 + mcon/U/d_bzero.U | 44 + mcon/U/d_casti32.U | 87 ++ mcon/U/d_castneg.U | 143 ++ mcon/U/d_cbrt.U | 32 + mcon/U/d_charsprf.U | 52 + mcon/U/d_chown.U | 33 + mcon/U/d_chroot.U | 33 + mcon/U/d_chsize.U | 32 + mcon/U/d_ckeypad.U | 54 + mcon/U/d_closedir.U | 107 ++ mcon/U/d_const.U | 66 + mcon/U/d_crypt.U | 76 + mcon/U/d_csh.U | 62 + mcon/U/d_ctermid.U | 31 + mcon/U/d_cuserid.U | 34 + mcon/U/d_dbl_dig.U | 61 + mcon/U/d_debugging.U | 42 + mcon/U/d_difftime.U | 33 + mcon/U/d_dlerror.U | 46 + mcon/U/d_dlopen.U | 45 + mcon/U/d_dosuid.U | 169 ++ mcon/U/d_drem.U | 35 + mcon/U/d_dup2.U | 31 + mcon/U/d_eofpipe.U | 93 ++ mcon/U/d_euc2jis.U | 32 + mcon/U/d_fchmod.U | 32 + mcon/U/d_fchown.U | 32 + mcon/U/d_fcntl.U | 31 + mcon/U/d_fd_set.U | 138 ++ mcon/U/d_ffs.U | 33 + mcon/U/d_fgetpos.U | 31 + mcon/U/d_flexfnam.U | 77 + mcon/U/d_flock.U | 31 + mcon/U/d_fmod.U | 34 + mcon/U/d_fork.U | 33 + mcon/U/d_fsetpos.U | 31 + mcon/U/d_ftime.U | 78 + mcon/U/d_ftrncate.U | 31 + mcon/U/d_gconvert.U | 147 ++ mcon/U/d_getgrps.U | 33 + mcon/U/d_gethbynm.U | 32 + mcon/U/d_gethent.U | 31 + mcon/U/d_gethid.U | 31 + mcon/U/d_gethname.U | 287 ++++ mcon/U/d_getlogin.U | 34 + mcon/U/d_getopt.U | 31 + mcon/U/d_getpagsz.U | 104 ++ mcon/U/d_getpgid.U | 34 + mcon/U/d_getpgrp.U | 108 ++ mcon/U/d_getpgrp2.U | 32 + mcon/U/d_getppid.U | 34 + mcon/U/d_getprior.U | 31 + mcon/U/d_getpwent.U | 40 + mcon/U/d_getwd.U | 41 + mcon/U/d_gnulibc.U | 98 ++ mcon/U/d_group.U | 23 + mcon/U/d_havetlib.U | 125 ++ mcon/U/d_hidnet.U | 68 + mcon/U/d_htonl.U | 88 ++ mcon/U/d_inetaton.U | 34 + mcon/U/d_inetd.U | 70 + mcon/U/d_internet.U | 52 + mcon/U/d_isascii.U | 57 + mcon/U/d_itimer.U | 32 + mcon/U/d_keepsig.U | 81 + mcon/U/d_killpg.U | 33 + mcon/U/d_link.U | 31 + mcon/U/d_linuxstd.U | 55 + mcon/U/d_locconv.U | 33 + mcon/U/d_lockf.U | 33 + mcon/U/d_lstat.U | 31 + mcon/U/d_mblen.U | 34 + mcon/U/d_mbstowcs.U | 32 + mcon/U/d_mbtowc.U | 32 + mcon/U/d_memalign.U | 29 + mcon/U/d_memccpy.U | 33 + mcon/U/d_memchr.U | 32 + mcon/U/d_memcmp.U | 35 + mcon/U/d_memcpy.U | 35 + mcon/U/d_memmove.U | 34 + mcon/U/d_memset.U | 35 + mcon/U/d_mkdir.U | 33 + mcon/U/d_mkfifo.U | 36 + mcon/U/d_mktime.U | 33 + mcon/U/d_mmap.U | 31 + mcon/U/d_msem_lck.U | 28 + mcon/U/d_msg.U | 45 + mcon/U/d_msgctl.U | 31 + mcon/U/d_msgget.U | 31 + mcon/U/d_msgrcv.U | 31 + mcon/U/d_msgsnd.U | 31 + mcon/U/d_msync.U | 31 + mcon/U/d_munmap.U | 31 + mcon/U/d_newsadm.U | 72 + mcon/U/d_nice.U | 33 + mcon/U/d_nolnbuf.U | 99 ++ mcon/U/d_normsig.U | 57 + mcon/U/d_open3.U | 90 ++ mcon/U/d_passwd.U | 23 + mcon/U/d_pathconf.U | 55 + mcon/U/d_pause.U | 34 + mcon/U/d_perror.U | 44 + mcon/U/d_pidcheck.U | 75 + mcon/U/d_pipe.U | 34 + mcon/U/d_poll.U | 36 + mcon/U/d_popen.U | 31 + mcon/U/d_portable.U | 71 + mcon/U/d_pread.U | 29 + mcon/U/d_preadv.U | 30 + mcon/U/d_psignal.U | 31 + mcon/U/d_pwrite.U | 29 + mcon/U/d_pwritev.U | 30 + mcon/U/d_raster.U | 57 + mcon/U/d_rdchk.U | 33 + mcon/U/d_readdir.U | 79 + mcon/U/d_readlink.U | 34 + mcon/U/d_regcmp.U | 80 + mcon/U/d_rename.U | 33 + mcon/U/d_rmdir.U | 32 + mcon/U/d_rusage.U | 36 + mcon/U/d_safebcpy.U | 124 ++ mcon/U/d_safemcpy.U | 127 ++ mcon/U/d_sanemcmp.U | 88 ++ mcon/U/d_sbrk.U | 31 + mcon/U/d_scandir.U | 31 + mcon/U/d_scannl.U | 74 + mcon/U/d_scorfl.U | 58 + mcon/U/d_select.U | 33 + mcon/U/d_sem.U | 45 + mcon/U/d_semctl.U | 31 + mcon/U/d_semget.U | 31 + mcon/U/d_semop.U | 31 + mcon/U/d_setegid.U | 32 + mcon/U/d_seteuid.U | 32 + mcon/U/d_setgrps.U | 33 + mcon/U/d_setlnbuf.U | 36 + mcon/U/d_setlocale.U | 33 + mcon/U/d_setpgid.U | 37 + mcon/U/d_setpgrp.U | 116 ++ mcon/U/d_setpgrp2.U | 32 + mcon/U/d_setprior.U | 31 + mcon/U/d_setregid.U | 46 + mcon/U/d_setreuid.U | 46 + mcon/U/d_setrgid.U | 32 + mcon/U/d_setruid.U | 32 + mcon/U/d_setsid.U | 34 + mcon/U/d_sgndchr.U | 59 + mcon/U/d_shm.U | 45 + mcon/U/d_shmat.U | 93 ++ mcon/U/d_shmctl.U | 31 + mcon/U/d_shmdt.U | 31 + mcon/U/d_shmget.U | 31 + mcon/U/d_sigaction.U | 61 + mcon/U/d_sigblock.U | 31 + mcon/U/d_sighold.U | 31 + mcon/U/d_siglist.U | 39 + mcon/U/d_sigsetjmp.U | 105 ++ mcon/U/d_sigsetmk.U | 41 + mcon/U/d_sigvec.U | 79 + mcon/U/d_sjis2jis.U | 32 + mcon/U/d_socket.U | 123 ++ mcon/U/d_speedopt.U | 62 + mcon/U/d_stat.U | 31 + mcon/U/d_statblks.U | 46 + mcon/U/d_stdstdio.U | 325 ++++ mcon/U/d_strccmp.U | 38 + mcon/U/d_strchr.U | 95 ++ mcon/U/d_strcoll.U | 33 + mcon/U/d_strcspn.U | 32 + mcon/U/d_strctcpy.U | 53 + mcon/U/d_strdup.U | 32 + mcon/U/d_strerror.U | 117 ++ mcon/U/d_strftime.U | 31 + mcon/U/d_strstr.U | 31 + mcon/U/d_strtod.U | 34 + mcon/U/d_strtok.U | 35 + mcon/U/d_strtol.U | 32 + mcon/U/d_strtoul.U | 34 + mcon/U/d_strxfrm.U | 33 + mcon/U/d_su_chown.U | 41 + mcon/U/d_symlink.U | 32 + mcon/U/d_syscall.U | 31 + mcon/U/d_sysconf.U | 34 + mcon/U/d_syslog.U | 44 + mcon/U/d_system.U | 31 + mcon/U/d_table.U | 34 + mcon/U/d_tcgtpgrp.U | 34 + mcon/U/d_tcstpgrp.U | 34 + mcon/U/d_time.U | 66 + mcon/U/d_times.U | 74 + mcon/U/d_tminsys.U | 41 + mcon/U/d_truncate.U | 31 + mcon/U/d_tzmin.U | 53 + mcon/U/d_tzname.U | 42 + mcon/U/d_ulimit.U | 31 + mcon/U/d_umask.U | 34 + mcon/U/d_usendir.U | 79 + mcon/U/d_usleep.U | 31 + mcon/U/d_uwait.U | 123 ++ mcon/U/d_vfork.U | 91 ++ mcon/U/d_voidsig.U | 89 ++ mcon/U/d_volatile.U | 74 + mcon/U/d_vprintf.U | 81 + mcon/U/d_wait3.U | 31 + mcon/U/d_wait4.U | 30 + mcon/U/d_waitpid.U | 31 + mcon/U/d_wcstombs.U | 32 + mcon/U/d_wctomb.U | 34 + mcon/U/d_wifstat.U | 87 ++ mcon/U/d_xdrs.U | 42 + mcon/U/defeditor.U | 45 + mcon/U/doublesize.U | 58 + mcon/U/ebcdic.U | 58 + mcon/U/errnolist.U | 106 ++ mcon/U/etc.U | 42 + mcon/U/filexp.U | 30 + mcon/U/floatsize.U | 58 + mcon/U/fpostype.U | 39 + mcon/U/fpu.U | 73 + mcon/U/gccvers.U | 117 ++ mcon/U/gidtype.U | 61 + mcon/U/groupstype.U | 63 + mcon/U/h_fcntl.U | 23 + mcon/U/h_sysfile.U | 23 + mcon/U/i_arpainet.U | 31 + mcon/U/i_db.U | 146 ++ mcon/U/i_dbm.U | 79 + mcon/U/i_dirent.U | 146 ++ mcon/U/i_dld.U | 34 + mcon/U/i_dlfcn.U | 34 + mcon/U/i_fcntl.U | 61 + mcon/U/i_float.U | 35 + mcon/U/i_gdbm.U | 53 + mcon/U/i_grp.U | 31 + mcon/U/i_inttypes.U | 35 + mcon/U/i_limits.U | 33 + mcon/U/i_locale.U | 32 + mcon/U/i_malloc.U | 31 + mcon/U/i_math.U | 34 + mcon/U/i_memory.U | 65 + mcon/U/i_ndbm.U | 53 + mcon/U/i_neterrno.U | 65 + mcon/U/i_niin.U | 45 + mcon/U/i_pwd.U | 162 ++ mcon/U/i_regex.U | 35 + mcon/U/i_sfio.U | 32 + mcon/U/i_stddef.U | 32 + mcon/U/i_stdlib.U | 32 + mcon/U/i_string.U | 62 + mcon/U/i_sysdir.U | 34 + mcon/U/i_sysfile.U | 60 + mcon/U/i_sysioctl.U | 202 +++ mcon/U/i_sysmman.U | 34 + mcon/U/i_sysndir.U | 31 + mcon/U/i_sysparam.U | 31 + mcon/U/i_sysresrc.U | 34 + mcon/U/i_sysselct.U | 39 + mcon/U/i_syssock.U | 32 + mcon/U/i_sysstat.U | 32 + mcon/U/i_systable.U | 32 + mcon/U/i_systimeb.U | 55 + mcon/U/i_systimes.U | 31 + mcon/U/i_systwgcf.U | 31 + mcon/U/i_systypes.U | 34 + mcon/U/i_sysun.U | 35 + mcon/U/i_syswait.U | 34 + mcon/U/i_termio.U | 123 ++ mcon/U/i_time.U | 171 +++ mcon/U/i_unistd.U | 31 + mcon/U/i_utime.U | 31 + mcon/U/i_values.U | 35 + mcon/U/i_varhdr.U | 164 ++ mcon/U/i_vfork.U | 40 + mcon/U/i_whoami.U | 35 + mcon/U/inc.U | 39 + mcon/U/install.U | 194 +++ mcon/U/intsize.U | 124 ++ mcon/U/ipc.U | 171 +++ mcon/U/issymlink.U | 85 ++ mcon/U/kernel.U | 63 + mcon/U/lex.U | 67 + mcon/U/lib.U | 54 + mcon/U/libc.U | 405 +++++ mcon/U/libdbm.U | 47 + mcon/U/libflex.U | 65 + mcon/U/libnlist.U | 49 + mcon/U/libnm.U | 45 + mcon/U/libpth.U | 132 ++ mcon/U/libs.U | 242 +++ mcon/U/libyacc.U | 64 + mcon/U/lintlib.U | 38 + mcon/U/lns.U | 41 + mcon/U/locdist.U | 174 +++ mcon/U/longsize.U | 24 + mcon/U/lseektype.U | 40 + mcon/U/maildir.U | 41 + mcon/U/mailer.U | 61 + mcon/U/mailfile.U | 56 + mcon/U/make.U | 60 + mcon/U/mallocsrc.U | 171 +++ mcon/U/man1dir.U | 147 ++ mcon/U/man3dir.U | 158 ++ mcon/U/manfmt.U | 118 ++ mcon/U/mansrc.U | 150 ++ mcon/U/mboxchar.U | 70 + mcon/U/mkdep.U | 268 ++++ mcon/U/models.U | 214 +++ mcon/U/modetype.U | 40 + mcon/U/myhostname.U | 284 ++++ mcon/U/n.U | 45 + mcon/U/nametype.U | 134 ++ mcon/U/nblock_io.U | 254 ++++ mcon/U/newslevel.U | 53 + mcon/U/newslib.U | 61 + mcon/U/newsspool.U | 52 + mcon/U/nis.U | 168 ++ mcon/U/nlist_pfx.U | 135 ++ mcon/U/orderlib.U | 95 ++ mcon/U/orgname.U | 65 + mcon/U/packadmin.U | 33 + mcon/U/package.U | 56 + mcon/U/pager.U | 59 + mcon/U/patchlevel.U | 35 + mcon/U/perlpath.U | 56 + mcon/U/pidtype.U | 39 + mcon/U/pkgsrc.U | 26 + mcon/U/prefix.U | 80 + mcon/U/prefshell.U | 60 + mcon/U/privlib.U | 96 ++ mcon/U/prototype.U | 118 ++ mcon/U/ptrsize.U | 58 + mcon/U/randbits.U | 83 + mcon/U/randfunc.U | 164 ++ mcon/U/rcs_branch.U | 43 + mcon/U/registers.U | 103 ++ mcon/U/rootid.U | 35 + mcon/U/sbrksmart.U | 85 ++ mcon/U/sbrktype.U | 44 + mcon/U/scriptdir.U | 110 ++ mcon/U/selecttype.U | 109 ++ mcon/U/sh.U | 92 ++ mcon/U/shm_for.U | 118 ++ mcon/U/sig_name.U | 157 ++ mcon/U/sitearch.U | 94 ++ mcon/U/sitelib.U | 97 ++ mcon/U/sizetype.U | 40 + mcon/U/so.U | 50 + mcon/U/sockopt.U | 88 ++ mcon/U/spitshell.U | 107 ++ mcon/U/src.U | 92 ++ mcon/U/ssizetype.U | 91 ++ mcon/U/startperl.U | 95 ++ mcon/U/startsh.U | 50 + mcon/U/stdchar.U | 40 + mcon/U/sunscanf.U | 55 + mcon/U/sysman.U | 50 + mcon/U/trnl.U | 59 + mcon/U/uidtype.U | 57 + mcon/U/usenm.U | 144 ++ mcon/U/usesocks.U | 46 + mcon/U/usrinc.U | 93 ++ mcon/U/vaproto.U | 65 + mcon/U/voidflags.U | 168 ++ mcon/U/warnflags.U | 55 + mcon/U/yacc.U | 90 ++ mcon/configure | 144 ++ mcon/files/Internal.U | 20 + mcon/files/README | 6 + mcon/files/d_function.U | 31 + mcon/files/dir.U | 47 + mcon/files/file.U | 47 + mcon/files/i_include.U | 32 + mcon/files/keyword.U | 54 + mcon/files/locate.U | 47 + mcon/files/question.U | 58 + mcon/files/rcshead.U | 15 + mcon/files/shell.U | 68 + mcon/files/type.U | 47 + mcon/makegloss.SH | 217 +++ mcon/man/Jmakefile | 24 + mcon/man/Makefile.SH | 167 ++ mcon/man/mconfig.SH | 2103 +++++++++++++++++++++++++ mcon/man/mlint.SH | 559 +++++++ mcon/man/mxref.SH | 133 ++ mcon/mconfig.SH | 182 +++ mcon/mlint.SH | 136 ++ mcon/mxref.SH | 146 ++ mcon/pl/common.pl | 289 ++++ mcon/pl/configure.pl | 245 +++ mcon/pl/cosmetic.pl | 114 ++ mcon/pl/depend.pl | 138 ++ mcon/pl/eval.pl | 300 ++++ mcon/pl/extract.pl | 109 ++ mcon/pl/files.pl | 109 ++ mcon/pl/gensym.pl | 22 + mcon/pl/init.pl | 55 + mcon/pl/lint.pl | 1411 +++++++++++++++++ mcon/pl/locate.pl | 153 ++ mcon/pl/makefile.pl | 176 +++ mcon/pl/obsolete.pl | 103 ++ mcon/pl/order.pl | 42 + mcon/pl/tsort.pl | 166 ++ mcon/pl/wanted.pl | 263 ++++ mcon/pl/xref.pl | 67 + mcon/pl/xwant.pl | 149 ++ pat/Jmakefile | 68 + pat/Makefile.SH | 269 ++++ pat/README | 120 ++ pat/pat.SH | 154 ++ pat/pat.man | 513 +++++++ pat/patbase.SH | 122 ++ pat/patchlevel.h | 34 + pat/patcil.SH | 541 +++++++ pat/patclean.SH | 185 +++ pat/patcol.SH | 235 +++ pat/patdiff.SH | 236 +++ pat/patftp.SH | 118 ++ pat/patindex.SH | 66 + pat/patlog.SH | 390 +++++ pat/patmake.SH | 413 +++++ pat/patname.SH | 175 +++ pat/patnotify.SH | 232 +++ pat/patpost.SH | 179 +++ pat/patsend.SH | 218 +++ pat/patsnap.SH | 124 ++ patchlevel.h | 4 + pl/comment.pl | 46 + pl/copyright.pl | 71 + pl/editor.pl | 23 + pl/fullname.pl | 49 + pl/listedit.pl | 36 + pl/logname.pl | 24 + pl/makedir.pl | 29 + pl/manifake.pl | 42 + pl/newer.pl | 78 + pl/package.pl | 40 + pl/patseq.pl | 27 + pl/profile.pl | 73 + pl/rangeargs.pl | 48 + pl/rcsargs.pl | 60 + pl/snapshot.pl | 28 + pl/tilde.pl | 25 + pl/users.pl | 48 + 598 files changed, 63879 insertions(+) create mode 100644 Artistic create mode 100644 ChangeLog create mode 100755 Configure create mode 100644 Credits create mode 100644 Jmakefile create mode 100644 Known_bugs create mode 100644 MANIFEST create mode 100755 Makefile.SH create mode 100644 README create mode 100644 Wishlist create mode 100644 bin/Jmakefile create mode 100755 bin/Makefile.SH create mode 100755 bin/manicheck.SH create mode 100644 bin/manicheck.man create mode 100755 bin/manilist.SH create mode 100644 bin/manilist.man create mode 100755 bin/packinit.SH create mode 100644 bin/packinit.man create mode 100755 bin/perload create mode 100644 dist.man create mode 100755 install.SH create mode 100644 jmake/Jmakefile create mode 100755 jmake/Makefile.SH create mode 100644 jmake/NOTES create mode 100644 jmake/README create mode 100755 jmake/bindex.SH create mode 100644 jmake/files/Jmake.rules create mode 100644 jmake/files/Jmake.tmpl create mode 100755 jmake/fixcpp.SH create mode 100755 jmake/jmake.SH create mode 100644 jmake/jmake.man create mode 100755 jmake/jmkmf.SH create mode 100644 jmake/jmkmf.man create mode 100644 kit/Jmakefile create mode 100755 kit/Makefile.SH create mode 100644 kit/README create mode 100755 kit/kitpost.SH create mode 100644 kit/kitpost.man create mode 100755 kit/kitsend.SH create mode 100644 kit/kitsend.man create mode 100644 kit/makeSH create mode 100644 kit/makeSH.man create mode 100755 kit/makedist.SH create mode 100644 kit/makedist.man create mode 100755 kit/manifake.SH create mode 100644 kit/manifake.man create mode 100644 lib/C/Jmakefile create mode 100755 lib/C/Makefile.SH create mode 100644 lib/C/fake/Jmakefile create mode 100755 lib/C/fake/Makefile.SH create mode 100644 lib/C/fake/dup2.C create mode 100644 lib/C/fake/getopt.C create mode 100644 lib/C/fake/rename.C create mode 100644 lib/C/fake/scandir.C create mode 100644 lib/C/fake/setsid.C create mode 100644 lib/Jmakefile create mode 100755 lib/Makefile.SH create mode 100644 lib/errnolist.a create mode 100644 lib/errnolist.mk create mode 100644 lib/errnolist.sh create mode 100644 lib/makedepend.sh create mode 100644 lib/makedir.sh create mode 100644 mcon/INTRO create mode 100644 mcon/Jmakefile create mode 100755 mcon/Makefile.SH create mode 100644 mcon/NOTES create mode 100644 mcon/README create mode 100644 mcon/U/AAAAA.U create mode 100644 mcon/U/Begin.U create mode 100644 mcon/U/Checkcc.U create mode 100644 mcon/U/Chk_MANI.U create mode 100644 mcon/U/Chk_whoami.U create mode 100644 mcon/U/Compile.U create mode 100644 mcon/U/Config_h.U create mode 100644 mcon/U/Config_sh.U create mode 100644 mcon/U/Configdir.U create mode 100644 mcon/U/Cppsym.U create mode 100644 mcon/U/Cross.U create mode 100644 mcon/U/Csym.U create mode 100644 mcon/U/End.U create mode 100644 mcon/U/Extract.U create mode 100644 mcon/U/Extractall.U create mode 100644 mcon/U/Filexp.U create mode 100644 mcon/U/Findhdr.U create mode 100644 mcon/U/Finish.U create mode 100644 mcon/U/Getfile.U create mode 100644 mcon/U/Guess.U create mode 100644 mcon/U/Head.U create mode 100644 mcon/U/Inhdr.U create mode 100644 mcon/U/Init.U create mode 100644 mcon/U/Inlibc.U create mode 100644 mcon/U/Instruct.U create mode 100644 mcon/U/Loc.U create mode 100644 mcon/U/Loc_sed.U create mode 100644 mcon/U/Magic_h.U create mode 100644 mcon/U/MailAuthor.U create mode 100644 mcon/U/MailList.U create mode 100644 mcon/U/Mkdirp.U create mode 100644 mcon/U/Mksymlinks.U create mode 100644 mcon/U/Myinit.U create mode 100644 mcon/U/Myread.U create mode 100644 mcon/U/Nothing.U create mode 100644 mcon/U/Null.U create mode 100644 mcon/U/Obsol_h.U create mode 100644 mcon/U/Obsol_sh.U create mode 100644 mcon/U/Oldconfig.U create mode 100644 mcon/U/Oldsym.U create mode 100644 mcon/U/Options.U create mode 100644 mcon/U/Prefixit.U create mode 100644 mcon/U/Prefixup.U create mode 100644 mcon/U/Rcs.U create mode 100644 mcon/U/Setvar.U create mode 100644 mcon/U/Signal.U create mode 100644 mcon/U/Tr.U create mode 100644 mcon/U/Typedef.U create mode 100644 mcon/U/Unix.U create mode 100644 mcon/U/Warn.U create mode 100644 mcon/U/Warn_v7EXT.U create mode 100644 mcon/U/Warn_v7ND.U create mode 100644 mcon/U/Whoa.U create mode 100644 mcon/U/abortsig.U create mode 100644 mcon/U/active.U create mode 100644 mcon/U/afs.U create mode 100644 mcon/U/alignbytes.U create mode 100644 mcon/U/archlib.U create mode 100644 mcon/U/archname.U create mode 100644 mcon/U/baserev.U create mode 100644 mcon/U/basicshell.U create mode 100644 mcon/U/bin.U create mode 100644 mcon/U/bitpbyte.U create mode 100644 mcon/U/byteorder.U create mode 100644 mcon/U/cc.U create mode 100644 mcon/U/ccflags.U create mode 100644 mcon/U/cf_email.U create mode 100644 mcon/U/cf_name.U create mode 100644 mcon/U/cf_who.U create mode 100644 mcon/U/charorder.U create mode 100644 mcon/U/charsize.U create mode 100644 mcon/U/contains.U create mode 100644 mcon/U/cpp_stuff.U create mode 100644 mcon/U/cpp_trad.U create mode 100644 mcon/U/cppfilecom.U create mode 100644 mcon/U/cppstdin.U create mode 100644 mcon/U/d_NOFILE.U create mode 100644 mcon/U/d_NeWS.U create mode 100644 mcon/U/d_PORTAR.U create mode 100644 mcon/U/d_SHM_MAC.U create mode 100644 mcon/U/d_access.U create mode 100644 mcon/U/d_alarm.U create mode 100644 mcon/U/d_attribut.U create mode 100644 mcon/U/d_bcmp.U create mode 100644 mcon/U/d_bcopy.U create mode 100644 mcon/U/d_brokstat.U create mode 100644 mcon/U/d_bsdjmp.U create mode 100644 mcon/U/d_byacc.U create mode 100644 mcon/U/d_bzero.U create mode 100644 mcon/U/d_casti32.U create mode 100644 mcon/U/d_castneg.U create mode 100644 mcon/U/d_cbrt.U create mode 100644 mcon/U/d_charsprf.U create mode 100644 mcon/U/d_chown.U create mode 100644 mcon/U/d_chroot.U create mode 100644 mcon/U/d_chsize.U create mode 100644 mcon/U/d_ckeypad.U create mode 100644 mcon/U/d_closedir.U create mode 100644 mcon/U/d_const.U create mode 100644 mcon/U/d_crypt.U create mode 100644 mcon/U/d_csh.U create mode 100644 mcon/U/d_ctermid.U create mode 100644 mcon/U/d_cuserid.U create mode 100644 mcon/U/d_dbl_dig.U create mode 100644 mcon/U/d_debugging.U create mode 100644 mcon/U/d_difftime.U create mode 100644 mcon/U/d_dlerror.U create mode 100644 mcon/U/d_dlopen.U create mode 100644 mcon/U/d_dosuid.U create mode 100644 mcon/U/d_drem.U create mode 100644 mcon/U/d_dup2.U create mode 100644 mcon/U/d_eofpipe.U create mode 100644 mcon/U/d_euc2jis.U create mode 100644 mcon/U/d_fchmod.U create mode 100644 mcon/U/d_fchown.U create mode 100644 mcon/U/d_fcntl.U create mode 100644 mcon/U/d_fd_set.U create mode 100644 mcon/U/d_ffs.U create mode 100644 mcon/U/d_fgetpos.U create mode 100644 mcon/U/d_flexfnam.U create mode 100644 mcon/U/d_flock.U create mode 100644 mcon/U/d_fmod.U create mode 100644 mcon/U/d_fork.U create mode 100644 mcon/U/d_fsetpos.U create mode 100644 mcon/U/d_ftime.U create mode 100644 mcon/U/d_ftrncate.U create mode 100644 mcon/U/d_gconvert.U create mode 100644 mcon/U/d_getgrps.U create mode 100644 mcon/U/d_gethbynm.U create mode 100644 mcon/U/d_gethent.U create mode 100644 mcon/U/d_gethid.U create mode 100644 mcon/U/d_gethname.U create mode 100644 mcon/U/d_getlogin.U create mode 100644 mcon/U/d_getopt.U create mode 100644 mcon/U/d_getpagsz.U create mode 100644 mcon/U/d_getpgid.U create mode 100644 mcon/U/d_getpgrp.U create mode 100644 mcon/U/d_getpgrp2.U create mode 100644 mcon/U/d_getppid.U create mode 100644 mcon/U/d_getprior.U create mode 100644 mcon/U/d_getpwent.U create mode 100644 mcon/U/d_getwd.U create mode 100644 mcon/U/d_gnulibc.U create mode 100644 mcon/U/d_group.U create mode 100644 mcon/U/d_havetlib.U create mode 100644 mcon/U/d_hidnet.U create mode 100644 mcon/U/d_htonl.U create mode 100644 mcon/U/d_inetaton.U create mode 100644 mcon/U/d_inetd.U create mode 100644 mcon/U/d_internet.U create mode 100644 mcon/U/d_isascii.U create mode 100644 mcon/U/d_itimer.U create mode 100644 mcon/U/d_keepsig.U create mode 100644 mcon/U/d_killpg.U create mode 100644 mcon/U/d_link.U create mode 100644 mcon/U/d_linuxstd.U create mode 100644 mcon/U/d_locconv.U create mode 100644 mcon/U/d_lockf.U create mode 100644 mcon/U/d_lstat.U create mode 100644 mcon/U/d_mblen.U create mode 100644 mcon/U/d_mbstowcs.U create mode 100644 mcon/U/d_mbtowc.U create mode 100644 mcon/U/d_memalign.U create mode 100644 mcon/U/d_memccpy.U create mode 100644 mcon/U/d_memchr.U create mode 100644 mcon/U/d_memcmp.U create mode 100644 mcon/U/d_memcpy.U create mode 100644 mcon/U/d_memmove.U create mode 100644 mcon/U/d_memset.U create mode 100644 mcon/U/d_mkdir.U create mode 100644 mcon/U/d_mkfifo.U create mode 100644 mcon/U/d_mktime.U create mode 100644 mcon/U/d_mmap.U create mode 100644 mcon/U/d_msem_lck.U create mode 100644 mcon/U/d_msg.U create mode 100644 mcon/U/d_msgctl.U create mode 100644 mcon/U/d_msgget.U create mode 100644 mcon/U/d_msgrcv.U create mode 100644 mcon/U/d_msgsnd.U create mode 100644 mcon/U/d_msync.U create mode 100644 mcon/U/d_munmap.U create mode 100644 mcon/U/d_newsadm.U create mode 100644 mcon/U/d_nice.U create mode 100644 mcon/U/d_nolnbuf.U create mode 100644 mcon/U/d_normsig.U create mode 100644 mcon/U/d_open3.U create mode 100644 mcon/U/d_passwd.U create mode 100644 mcon/U/d_pathconf.U create mode 100644 mcon/U/d_pause.U create mode 100644 mcon/U/d_perror.U create mode 100644 mcon/U/d_pidcheck.U create mode 100644 mcon/U/d_pipe.U create mode 100644 mcon/U/d_poll.U create mode 100644 mcon/U/d_popen.U create mode 100644 mcon/U/d_portable.U create mode 100644 mcon/U/d_pread.U create mode 100644 mcon/U/d_preadv.U create mode 100644 mcon/U/d_psignal.U create mode 100644 mcon/U/d_pwrite.U create mode 100644 mcon/U/d_pwritev.U create mode 100644 mcon/U/d_raster.U create mode 100644 mcon/U/d_rdchk.U create mode 100644 mcon/U/d_readdir.U create mode 100644 mcon/U/d_readlink.U create mode 100644 mcon/U/d_regcmp.U create mode 100644 mcon/U/d_rename.U create mode 100644 mcon/U/d_rmdir.U create mode 100644 mcon/U/d_rusage.U create mode 100644 mcon/U/d_safebcpy.U create mode 100644 mcon/U/d_safemcpy.U create mode 100644 mcon/U/d_sanemcmp.U create mode 100644 mcon/U/d_sbrk.U create mode 100644 mcon/U/d_scandir.U create mode 100644 mcon/U/d_scannl.U create mode 100644 mcon/U/d_scorfl.U create mode 100644 mcon/U/d_select.U create mode 100644 mcon/U/d_sem.U create mode 100644 mcon/U/d_semctl.U create mode 100644 mcon/U/d_semget.U create mode 100644 mcon/U/d_semop.U create mode 100644 mcon/U/d_setegid.U create mode 100644 mcon/U/d_seteuid.U create mode 100644 mcon/U/d_setgrps.U create mode 100644 mcon/U/d_setlnbuf.U create mode 100644 mcon/U/d_setlocale.U create mode 100644 mcon/U/d_setpgid.U create mode 100644 mcon/U/d_setpgrp.U create mode 100644 mcon/U/d_setpgrp2.U create mode 100644 mcon/U/d_setprior.U create mode 100644 mcon/U/d_setregid.U create mode 100644 mcon/U/d_setreuid.U create mode 100644 mcon/U/d_setrgid.U create mode 100644 mcon/U/d_setruid.U create mode 100644 mcon/U/d_setsid.U create mode 100644 mcon/U/d_sgndchr.U create mode 100644 mcon/U/d_shm.U create mode 100644 mcon/U/d_shmat.U create mode 100644 mcon/U/d_shmctl.U create mode 100644 mcon/U/d_shmdt.U create mode 100644 mcon/U/d_shmget.U create mode 100644 mcon/U/d_sigaction.U create mode 100644 mcon/U/d_sigblock.U create mode 100644 mcon/U/d_sighold.U create mode 100644 mcon/U/d_siglist.U create mode 100644 mcon/U/d_sigsetjmp.U create mode 100644 mcon/U/d_sigsetmk.U create mode 100644 mcon/U/d_sigvec.U create mode 100644 mcon/U/d_sjis2jis.U create mode 100644 mcon/U/d_socket.U create mode 100644 mcon/U/d_speedopt.U create mode 100644 mcon/U/d_stat.U create mode 100644 mcon/U/d_statblks.U create mode 100644 mcon/U/d_stdstdio.U create mode 100644 mcon/U/d_strccmp.U create mode 100644 mcon/U/d_strchr.U create mode 100644 mcon/U/d_strcoll.U create mode 100644 mcon/U/d_strcspn.U create mode 100644 mcon/U/d_strctcpy.U create mode 100644 mcon/U/d_strdup.U create mode 100644 mcon/U/d_strerror.U create mode 100644 mcon/U/d_strftime.U create mode 100644 mcon/U/d_strstr.U create mode 100644 mcon/U/d_strtod.U create mode 100644 mcon/U/d_strtok.U create mode 100644 mcon/U/d_strtol.U create mode 100644 mcon/U/d_strtoul.U create mode 100644 mcon/U/d_strxfrm.U create mode 100644 mcon/U/d_su_chown.U create mode 100644 mcon/U/d_symlink.U create mode 100644 mcon/U/d_syscall.U create mode 100644 mcon/U/d_sysconf.U create mode 100644 mcon/U/d_syslog.U create mode 100644 mcon/U/d_system.U create mode 100644 mcon/U/d_table.U create mode 100644 mcon/U/d_tcgtpgrp.U create mode 100644 mcon/U/d_tcstpgrp.U create mode 100644 mcon/U/d_time.U create mode 100644 mcon/U/d_times.U create mode 100644 mcon/U/d_tminsys.U create mode 100644 mcon/U/d_truncate.U create mode 100644 mcon/U/d_tzmin.U create mode 100644 mcon/U/d_tzname.U create mode 100644 mcon/U/d_ulimit.U create mode 100644 mcon/U/d_umask.U create mode 100644 mcon/U/d_usendir.U create mode 100644 mcon/U/d_usleep.U create mode 100644 mcon/U/d_uwait.U create mode 100644 mcon/U/d_vfork.U create mode 100644 mcon/U/d_voidsig.U create mode 100644 mcon/U/d_volatile.U create mode 100644 mcon/U/d_vprintf.U create mode 100644 mcon/U/d_wait3.U create mode 100644 mcon/U/d_wait4.U create mode 100644 mcon/U/d_waitpid.U create mode 100644 mcon/U/d_wcstombs.U create mode 100644 mcon/U/d_wctomb.U create mode 100644 mcon/U/d_wifstat.U create mode 100644 mcon/U/d_xdrs.U create mode 100644 mcon/U/defeditor.U create mode 100644 mcon/U/doublesize.U create mode 100644 mcon/U/ebcdic.U create mode 100644 mcon/U/errnolist.U create mode 100644 mcon/U/etc.U create mode 100644 mcon/U/filexp.U create mode 100644 mcon/U/floatsize.U create mode 100644 mcon/U/fpostype.U create mode 100644 mcon/U/fpu.U create mode 100644 mcon/U/gccvers.U create mode 100644 mcon/U/gidtype.U create mode 100644 mcon/U/groupstype.U create mode 100644 mcon/U/h_fcntl.U create mode 100644 mcon/U/h_sysfile.U create mode 100644 mcon/U/i_arpainet.U create mode 100644 mcon/U/i_db.U create mode 100644 mcon/U/i_dbm.U create mode 100644 mcon/U/i_dirent.U create mode 100644 mcon/U/i_dld.U create mode 100644 mcon/U/i_dlfcn.U create mode 100644 mcon/U/i_fcntl.U create mode 100644 mcon/U/i_float.U create mode 100644 mcon/U/i_gdbm.U create mode 100644 mcon/U/i_grp.U create mode 100644 mcon/U/i_inttypes.U create mode 100644 mcon/U/i_limits.U create mode 100644 mcon/U/i_locale.U create mode 100644 mcon/U/i_malloc.U create mode 100644 mcon/U/i_math.U create mode 100644 mcon/U/i_memory.U create mode 100644 mcon/U/i_ndbm.U create mode 100644 mcon/U/i_neterrno.U create mode 100644 mcon/U/i_niin.U create mode 100644 mcon/U/i_pwd.U create mode 100644 mcon/U/i_regex.U create mode 100644 mcon/U/i_sfio.U create mode 100644 mcon/U/i_stddef.U create mode 100644 mcon/U/i_stdlib.U create mode 100644 mcon/U/i_string.U create mode 100644 mcon/U/i_sysdir.U create mode 100644 mcon/U/i_sysfile.U create mode 100644 mcon/U/i_sysioctl.U create mode 100644 mcon/U/i_sysmman.U create mode 100644 mcon/U/i_sysndir.U create mode 100644 mcon/U/i_sysparam.U create mode 100644 mcon/U/i_sysresrc.U create mode 100644 mcon/U/i_sysselct.U create mode 100644 mcon/U/i_syssock.U create mode 100644 mcon/U/i_sysstat.U create mode 100644 mcon/U/i_systable.U create mode 100644 mcon/U/i_systimeb.U create mode 100644 mcon/U/i_systimes.U create mode 100644 mcon/U/i_systwgcf.U create mode 100644 mcon/U/i_systypes.U create mode 100644 mcon/U/i_sysun.U create mode 100644 mcon/U/i_syswait.U create mode 100644 mcon/U/i_termio.U create mode 100644 mcon/U/i_time.U create mode 100644 mcon/U/i_unistd.U create mode 100644 mcon/U/i_utime.U create mode 100644 mcon/U/i_values.U create mode 100644 mcon/U/i_varhdr.U create mode 100644 mcon/U/i_vfork.U create mode 100644 mcon/U/i_whoami.U create mode 100644 mcon/U/inc.U create mode 100644 mcon/U/install.U create mode 100644 mcon/U/intsize.U create mode 100644 mcon/U/ipc.U create mode 100644 mcon/U/issymlink.U create mode 100644 mcon/U/kernel.U create mode 100644 mcon/U/lex.U create mode 100644 mcon/U/lib.U create mode 100644 mcon/U/libc.U create mode 100644 mcon/U/libdbm.U create mode 100644 mcon/U/libflex.U create mode 100644 mcon/U/libnlist.U create mode 100644 mcon/U/libnm.U create mode 100644 mcon/U/libpth.U create mode 100644 mcon/U/libs.U create mode 100644 mcon/U/libyacc.U create mode 100644 mcon/U/lintlib.U create mode 100644 mcon/U/lns.U create mode 100644 mcon/U/locdist.U create mode 100644 mcon/U/longsize.U create mode 100644 mcon/U/lseektype.U create mode 100644 mcon/U/maildir.U create mode 100644 mcon/U/mailer.U create mode 100644 mcon/U/mailfile.U create mode 100644 mcon/U/make.U create mode 100644 mcon/U/mallocsrc.U create mode 100644 mcon/U/man1dir.U create mode 100644 mcon/U/man3dir.U create mode 100644 mcon/U/manfmt.U create mode 100644 mcon/U/mansrc.U create mode 100644 mcon/U/mboxchar.U create mode 100644 mcon/U/mkdep.U create mode 100644 mcon/U/models.U create mode 100644 mcon/U/modetype.U create mode 100644 mcon/U/myhostname.U create mode 100644 mcon/U/n.U create mode 100644 mcon/U/nametype.U create mode 100644 mcon/U/nblock_io.U create mode 100644 mcon/U/newslevel.U create mode 100644 mcon/U/newslib.U create mode 100644 mcon/U/newsspool.U create mode 100644 mcon/U/nis.U create mode 100644 mcon/U/nlist_pfx.U create mode 100644 mcon/U/orderlib.U create mode 100644 mcon/U/orgname.U create mode 100644 mcon/U/packadmin.U create mode 100644 mcon/U/package.U create mode 100644 mcon/U/pager.U create mode 100644 mcon/U/patchlevel.U create mode 100644 mcon/U/perlpath.U create mode 100644 mcon/U/pidtype.U create mode 100644 mcon/U/pkgsrc.U create mode 100644 mcon/U/prefix.U create mode 100644 mcon/U/prefshell.U create mode 100644 mcon/U/privlib.U create mode 100644 mcon/U/prototype.U create mode 100644 mcon/U/ptrsize.U create mode 100644 mcon/U/randbits.U create mode 100644 mcon/U/randfunc.U create mode 100644 mcon/U/rcs_branch.U create mode 100644 mcon/U/registers.U create mode 100644 mcon/U/rootid.U create mode 100644 mcon/U/sbrksmart.U create mode 100644 mcon/U/sbrktype.U create mode 100644 mcon/U/scriptdir.U create mode 100644 mcon/U/selecttype.U create mode 100644 mcon/U/sh.U create mode 100644 mcon/U/shm_for.U create mode 100644 mcon/U/sig_name.U create mode 100644 mcon/U/sitearch.U create mode 100644 mcon/U/sitelib.U create mode 100644 mcon/U/sizetype.U create mode 100644 mcon/U/so.U create mode 100644 mcon/U/sockopt.U create mode 100644 mcon/U/spitshell.U create mode 100644 mcon/U/src.U create mode 100644 mcon/U/ssizetype.U create mode 100644 mcon/U/startperl.U create mode 100644 mcon/U/startsh.U create mode 100644 mcon/U/stdchar.U create mode 100644 mcon/U/sunscanf.U create mode 100644 mcon/U/sysman.U create mode 100644 mcon/U/trnl.U create mode 100644 mcon/U/uidtype.U create mode 100644 mcon/U/usenm.U create mode 100644 mcon/U/usesocks.U create mode 100644 mcon/U/usrinc.U create mode 100644 mcon/U/vaproto.U create mode 100644 mcon/U/voidflags.U create mode 100644 mcon/U/warnflags.U create mode 100644 mcon/U/yacc.U create mode 100644 mcon/configure create mode 100644 mcon/files/Internal.U create mode 100644 mcon/files/README create mode 100644 mcon/files/d_function.U create mode 100644 mcon/files/dir.U create mode 100644 mcon/files/file.U create mode 100644 mcon/files/i_include.U create mode 100644 mcon/files/keyword.U create mode 100644 mcon/files/locate.U create mode 100644 mcon/files/question.U create mode 100644 mcon/files/rcshead.U create mode 100644 mcon/files/shell.U create mode 100644 mcon/files/type.U create mode 100755 mcon/makegloss.SH create mode 100644 mcon/man/Jmakefile create mode 100755 mcon/man/Makefile.SH create mode 100755 mcon/man/mconfig.SH create mode 100755 mcon/man/mlint.SH create mode 100755 mcon/man/mxref.SH create mode 100755 mcon/mconfig.SH create mode 100755 mcon/mlint.SH create mode 100755 mcon/mxref.SH create mode 100644 mcon/pl/common.pl create mode 100644 mcon/pl/configure.pl create mode 100644 mcon/pl/cosmetic.pl create mode 100644 mcon/pl/depend.pl create mode 100644 mcon/pl/eval.pl create mode 100644 mcon/pl/extract.pl create mode 100644 mcon/pl/files.pl create mode 100644 mcon/pl/gensym.pl create mode 100644 mcon/pl/init.pl create mode 100644 mcon/pl/lint.pl create mode 100644 mcon/pl/locate.pl create mode 100644 mcon/pl/makefile.pl create mode 100644 mcon/pl/obsolete.pl create mode 100644 mcon/pl/order.pl create mode 100644 mcon/pl/tsort.pl create mode 100644 mcon/pl/wanted.pl create mode 100644 mcon/pl/xref.pl create mode 100644 mcon/pl/xwant.pl create mode 100644 pat/Jmakefile create mode 100755 pat/Makefile.SH create mode 100644 pat/README create mode 100755 pat/pat.SH create mode 100644 pat/pat.man create mode 100755 pat/patbase.SH create mode 100644 pat/patchlevel.h create mode 100755 pat/patcil.SH create mode 100755 pat/patclean.SH create mode 100755 pat/patcol.SH create mode 100755 pat/patdiff.SH create mode 100755 pat/patftp.SH create mode 100755 pat/patindex.SH create mode 100755 pat/patlog.SH create mode 100755 pat/patmake.SH create mode 100755 pat/patname.SH create mode 100755 pat/patnotify.SH create mode 100755 pat/patpost.SH create mode 100755 pat/patsend.SH create mode 100755 pat/patsnap.SH create mode 100644 patchlevel.h create mode 100644 pl/comment.pl create mode 100644 pl/copyright.pl create mode 100644 pl/editor.pl create mode 100644 pl/fullname.pl create mode 100644 pl/listedit.pl create mode 100644 pl/logname.pl create mode 100644 pl/makedir.pl create mode 100644 pl/manifake.pl create mode 100644 pl/newer.pl create mode 100644 pl/package.pl create mode 100644 pl/patseq.pl create mode 100644 pl/profile.pl create mode 100644 pl/rangeargs.pl create mode 100644 pl/rcsargs.pl create mode 100644 pl/snapshot.pl create mode 100644 pl/tilde.pl create mode 100644 pl/users.pl diff --git a/Artistic b/Artistic new file mode 100644 index 0000000..a05f9e8 --- /dev/null +++ b/Artistic @@ -0,0 +1,125 @@ + The "Artistic License" + + Preamble + +The intent of this document is to state the conditions under which a +Package may be copied, such that the Copyright Holder maintains some +semblance of artistic control over the development of the Package, +while giving the users of the package the right to use and distribute +the Package in a more-or-less customary fashion, plus the right to make +reasonable modifications. + +It also grants you the rights to reuse parts of a Package in your own +programs without transferring this License to those programs, provided +that you meet some reasonable requirements. + +Definitions: + + "Package" refers to the collection of files distributed by the + Copyright Holder, and derivatives of that collection of files + created through textual modification. + + "Standard Version" refers to such a Package if it has not been + modified, or has been modified in accordance with the wishes + of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or + copyrights for the package. + + "You" is you, if you're thinking about copying or distributing + this Package. + + "Reasonable copying fee" is whatever you can justify on the + basis of media cost, duplication charges, time of people involved, + and so on. (You will not be required to justify it to the + Copyright Holder, but only to the computing community at large + as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item + itself, though there may be fees involved in handling the item. + It also means that recipients of the item may redistribute it + under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications +derived from the Public Domain or from the Copyright Holder. A Package +modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and +when you changed that file, and provided that you do at least ONE of the +following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or + an equivalent medium, or placing the modifications on a major archive + site such as uunet.uu.net, or by allowing the Copyright Holder to include + your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and provide + a separate manual page for each non-standard executable that clearly + documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or +executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where + to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), together + with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this +Package. You may charge any fee you choose for support of this +Package. You may not charge a fee for this Package itself. However, +you may distribute this Package in aggregate with other (possibly +commercial) programs as part of a larger (possibly commercial) software +distribution provided that you do not advertise this Package as a +product of your own. + +6. The scripts and library files supplied as input to or produced as +output from the programs of this Package do not automatically fall +under the copyright of this Package, but belong to whoever generated +them, and may be sold commercially, and may be aggregated with this +Package. If such scripts or library files are aggregated with this +Package via the so-called "undump" or "unexec" methods of producing a +binary executable image, then distribution of such an image shall +neither be construed as a distribution of this Package nor shall it +fall under the restrictions of Paragraphs 3 and 4, provided that you do +not represent such an executable image as a Standard Version of this +Package. + +7. You may reuse parts of this Package in your own programs, provided that +you explicitly state where you got them from, in the source code (and, left +to your courtesy, in the documentation), duplicating all the associated +copyright notices and disclaimers. Besides your changes, if any, must be +clearly marked as such. Parts reused that way will no longer fall under this +license if, and only if, the name of your program(s) have no immediate +connection with the name of the Package itself or its associated programs. +You may then apply whatever restrictions you wish on the reused parts or +choose to place them in the Public Domain--this will apply only within the +context of your package. + +8. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..3dce502 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,1457 @@ +Fri Feb 28 17:48:41 MET 1997 Raphael Manfredi + +. Description: + + This huge set of patch results from an integration of the + perl5 units into the dist-3.0 package. A few improvements + of mine are also incorporated here, but this patch set should + mainly be credited to Andy Dougherty and Chip Salzenberg, who + have both assumed the perl5 Patch Pumpkin with success and brio. + + I won't document most of the changes in detail. Only the obvious + ones were kept here. You can look closer to the patches themselves + to see what really changed. Especially the new units, since you + now have more symbols to check for in your C code... + + Regenerated Configure with current set of units. + + Added Perl Patch Pumpkin credits. Thanks to Andy Dougherty and + to Chip Salzenberg for their incredible contributions to + metaconfig. + + Changed my email address and updated copyright dates + + Added support for src.U. This means you can now run Configure + from a remote directory to separate the build directory and + the (possibly read-only) source tree. + Note that some of your private units may require some changes + due to that... + + Removed support for NO_PROTOTYPE detection on SCO. + + Added cute quoting trick for wild stringify support, which + allows non-ANSI stringification to occur. + + Replaced .a with $_a all over the place. + Likewise for .o replaced by $_o. + You'll have to do that to your own private units. + + Integrated new units from perl5. I will not document most + of the perl5-related changes here. People interested can + look at Andy's notes in the perl5 distribution. + + New USE_BSD_GETPGRP to detect the getpgrp() flavour. The old + USE_BSDPGRP has been obsoleted in favor of USE_BSD_SETPGRP. + Indeed, setpgrp() and getpgrp() can have distinct flavors, + so we need two distinct tests for them. + + Useless units dropped: d_group.U and d_passwd.U. + + Mention that can be included if HAS_POLL defined. + + Improved overlapping copy check. + + Added support for Free_t, the type of free(). + + Don't use nm with the GNU C library. + Added support for Linux shared libs. + + Don't prompt them if the void support is high enough for us + and don't ask for the include path unless they are on a MIPS. + + Added the srcdir support to "configure" now that we have src.U. + + Documented the runnning environment and the src.U unit in + the metaconfig man page. The $_a and $_o are also mentionned. + All the generated scripts must now start with a "$startsh" + to ensure proper shell execution. + + New "create" and "empty" lint directives. + + New -L option for metaxref to match metaconfig and metalint. + + Documents contents of the message sent by patnotify: + we now let them know the patch priority and description. + + Added a whole bunch of new units, mostly from the perl5 team. + +. Files changed: + + * bin/packinit.SH: Fixed one wrong ':' comment in .package. + + * jmake/files/Jmake.rules: Now handles USRINC for dependencies. + Smarter about dependencies computation. + + * jmake/files/Jmake.tmpl: Lex path can now be configured. + + * mcon/U/Begin.U: Added Extractall dependency. + + * mcon/U/Config_sh.U, mcon/U/Oldsym.U, mcon/U/Extract.U, + mcon/U/patchlevel.U, mcon/U/MailAuthor.U, mcon/U/Chk_MANI.U, + mcon/U/Config_h.U: Added support for src.U. + + * mcon/U/Configdir.U: Have README explicitely mention the package + name. + + * mcon/U/make.U, mcon/U/d_strtoul.U, mcon/U/Unix.U, + mcon/U/d_inetaton.U, mcon/U/sitearch.U, mcon/U/d_sanemcmp.U, + mcon/U/i_locale.U, mcon/U/d_sigaction.U, mcon/U/d_getpgid.U, + mcon/U/src.U, mcon/U/sitelib.U, mcon/U/d_brokstat.U, mcon/U/man3dir.U, + , mcon/U/d_sigsetjmp.U, mcon/U/i_sysstat.U, mcon/U/d_strtod.U, + mcon/U/d_byacc.U, mcon/U/sh.U, mcon/U/Signal.U, mcon/U/d_gnulibc.U, + mcon/U/man1dir.U, mcon/U/Extractall.U, mcon/U/i_values.U, + mcon/U/i_sfio.U: Created. + + * mcon/U/Getfile.U: Getfile script now begins with "startsh". + + * mcon/U/Head.U: Make sure we unset CDPATH for shells that support + this. Improved Korn shell detection and handling. + + * mcon/U/Instruct.U: Logname / whoami sequence rewritten to use case. + + * mcon/U/Loc.U: Allow users to specify paths on the command line. + Will now substitute cp for ln if not supported. + + * mcon/U/Myread.U: Myread script now starts with a "startsh". + Miscellaneous fixes. + + * mcon/U/Oldconfig.U: Added support for src.U. New OSNAME define. + Can now sense new OSes. + + * mcon/U/Options.U: Optdef.sh now starts with a "startsh". Moved + some code from Head.U. + + * mcon/U/Whoa.U: Whoa script now starts with leading "startsh". + + * mcon/U/afs.U: Can now explicitely tell Configure whether AFS is + running. + + * mcon/U/archlib.U: Skip existence checks for archlib. + + * mcon/U/archname.U: Changed the way the archname is mangled from + uname. + + * mcon/U/byteorder.U: No longer ask the user if the test runs ok. + + * mcon/U/ccflags.U: Removed support for NO_PROTOTYPE detection on + SCO. New locincpth variable. Added info on the "additional ld + flags" question. + + * mcon/U/cf_who.U: New computation method avoiding use of temporary + file. + + * mcon/U/cpp_stuff.U: Added cute quoting trick for wild stringify + support. + + * mcon/U/d_bsdjmp.U, mcon/U/d_fd_set.U, mcon/U/models.U, + mcon/U/d_scannl.U, mcon/U/d_open3.U, mcon/U/d_closedir.U: Added ?F: + metalint hint. + + * mcon/U/libs.U, mcon/U/libnm.U, mcon/U/libyacc.U, mcon/U/libflex.U, + mcon/U/libdbm.U, mcon/U/d_socket.U, mcon/U/d_normsig.U, + mcon/U/d_crypt.U: Replaced .a with $_a all over the place. + + * mcon/U/d_csh.U: Added full_csh to preserve the full path even when + portable. + + * mcon/U/d_dosuid.U: Moved unit to TOP via a ?Y: layout directive. + Tell them /dev/fd is not about floppy disks. + + * mcon/U/d_gconvert.U: Integrated new unit from perl5. + + * mcon/U/d_getpgrp.U: New USE_BSD_GETPGRP to detect the getpgrp() + flavour. + + * mcon/U/d_group.U, mcon/U/d_passwd.U: Useless unit dropped. + + * mcon/U/d_usendir.U, mcon/U/d_havetlib.U, mcon/U/errnolist.U: + Replaced .a with $_a all over the place. Likewise for .o replaced by + $_o. + + * mcon/U/d_newsadm.U: Added Guess dependency. + + * mcon/U/d_pidcheck.U: Replaced .o with $_o all over the place. + Added ?F: metalint hint. + + * mcon/U/d_poll.U: Mention that can be included if HAS_POLL + defined. + + * mcon/U/d_safebcpy.U, mcon/U/d_safemcpy.U: Improved overlapping copy + check. Comfort them if they have memmove. Added ?F: metalint hint. + + * mcon/U/d_setpgid.U: Reworded symbol comments. + + * mcon/U/d_setpgrp.U: Obsoleted USE_BSDGRP in favor of + USE_BSD_SETPGRP. Another unit now also defines a USE_BSD_GETPGRP. + Fallback for test program failure improved. + + * mcon/U/d_sgndchr.U, mcon/U/d_wifstat.U: Added a ?F: metalint hint. + + * mcon/U/d_sigvec.U: There is now a separate routine for sigaction(). + + * mcon/U/d_stdstdio.U: Merged with perl5's unit. + + * mcon/U/d_syslog.U, mcon/U/mkdep.U: Replaced .o with $_o all over + the place. + + * mcon/U/i_dbm.U: Added I_RPCSVC_DBM check. + + * mcon/U/i_varhdr.U: Varargs script now starts with leading "startsh". + + * mcon/U/intsize.U: Avoid prompting the user if the test runs ok. + Moved code from longsize.U into there. New tests for shortsize as + well. + + * mcon/U/libc.U: Replaced .a with $_a all over the place. Added + support for HPUX-10 nm output. + + * mcon/U/libnlist.U: Added usrinc and mips on the dependency line. + Make sure we call ./mips. Added a ?LINT: hint. + + * mcon/U/libpth.U: New loclibpth variable. + + * mcon/U/longsize.U: Code moved to intsize.U. + + * mcon/U/mallocsrc.U: Added support for Free_t, the type of free(). + Replaced .o with $_o all over the place. + + * mcon/U/manfmt.U, mcon/U/mansrc.U: Don't ask for AFS when they + choose to not install pages. + + * mcon/U/myhostname.U: Improved hostname lookup by using ypmatch when + NIS is used. + + * mcon/U/nblock_io.U: Simplify here document for shells that can't + handle them well. Force use of "startsh" at the head of the + generated script. Added new files to the ?F: metalint hint. + + * mcon/U/nis.U: Ensure suitable defaults for hostcat and friends. + + * mcon/U/orderlib.U: Replaced .a with $_a all over the place. + Likewise for .o replaced by $_o. Now uses the ar located by Loc.U. + + * mcon/U/randbits.U: Added and to the C program + test. + + * mcon/U/registers.U: Removed empty ?LINT lines. + + * mcon/U/selecttype.U: Always include when available + for test. + + * mcon/U/sig_name.U: Brand new algorithm for sig_name and (new!) + sig_num. + + * mcon/U/spitshell.U: Removed useless chatter as this is now done + very early. + + * mcon/U/ssizetype.U: Integrated perl5 concerns for mis-configured + sfio. + + * mcon/U/startperl.U: Warn them if the #! line is too long for their + OS. + + * mcon/U/startsh.U: Avoid needless chatter since this is now done + very early. + + * mcon/U/usenm.U: Don't use nm with the GNU C library. Added support + for Linux shared libs. + + * mcon/U/usrinc.U: Don't ask for the include path unless they are on + a MIPS. + + * mcon/U/voidflags.U: Don't prompt them if the void support is high + enough for us. + + * mcon/configure: Added the srcdir support now that we have src.U. + Random cleanup for nicer help message. + + * mcon/man/mconfig.SH: Documents the runnning environment and the + src.U unit. Added warnings for $_a and $_o, as well as "startsh". + + * mcon/man/mlint.SH: New "create" and "empty" lint directives. + Documented new messages. + + * mcon/mxref.SH, mcon/man/mxref.SH: New -L option to match metaconfig + and metalint. + + * mcon/pl/lint.pl: Added support for ?F: lines to monitor file usage. + Now honours "create" and "empty" lint directives. + + * pat/pat.man: Documents contents of the message sent by patnotify. + + * pat/patlog.SH: Typo fix. + + * pat/patnotify.SH: Let them know the patch priority and description. + +Mon Sep 25 10:33:26 MET 1995 Raphael Manfredi + +. Description: + + Smarter sed command to strip /usr/include dependencies in + jmake-generated Makfiles. Thanks to Ulrich Pfeifer + for contributing it. + + In response to the discussion on dist-users, jmake will now force + macro definitions to the left in the generated Makefile, even + though they may be nicely formatted in the imake-style within + the Jmakefile itself (centered on the =). + + Commented the purpose of the #un-def directive in the relevant + unit, since I tend to forget about this hack and almost considered + removing it without seeing the consequences. ;-) + + Configure will now abort when a mandatory command is missing. + Indeed, Configure relies on such commands to perform its various + tasks, and a miss can have dreadful consequences, without the + end-users noticing it. + + Protected option parsing code against 'echo -*' option failure. + + Various units are now forced to the top of Configure, if possible. + This is mainly interactive questions. Note that dependencies are + still respected, i.e. all the units on which those depend will + come before, so the top-ness is a relative issue. + + All possible install programs are now looked for, instead of + breaking the loop once one was found. Also, to optimize cache + access on AFS directories, the lookup is done on directories + first, then on programs instead of the other way round. + + New ?Y: directive to change unit layout. You may specify a + TOP, DEFAULT or BOTTOM request on that line to respectively + force the unit to the earliest possible, default or latest + possible place in the Configure script, as dependencies + permit. + + Symbols are now sorted according to the ?Y: layout directive. + + If you use the MailAuthor.U unit, you will be interested by the + new -i option for patsend to add extra instructions for people + receiving mailed patches. patnotify also tells users how to directly + request for mailed patches. The patch making process now automatically + supply the -i when invoking patsend. Changes contributed by Graham + Stoney . + +. Files changed: + + * jmake/files/Jmake.rules: Smarter sed command to strip /usr/include + dependencies. + + * jmake/jmake.SH: Will now force macro definitions to the left. + + * mcon/U/Config_h.U: Commented the purpose of the #un-def directive. + + * mcon/U/Loc.U: Commented the purpose of the #un-def directive. + Abort Configure run when mandatory command is missing. + + * mcon/U/Options.U: Protected option parsing code against 'echo -*' + option failure. + + * mcon/U/perlpath.U, mcon/U/manfmt.U, mcon/U/mansrc.U, + mcon/U/scriptdir.U, mcon/U/archlib.U, mcon/U/lib.U, mcon/U/privlib.U, + mcon/U/bin.U: Unit is now forced to the top of Configure, if possible. + + * mcon/U/install.U: All possible install programs are now looked for. + + * mcon/man/mconfig.SH, mcon/man/mlint.SH: Documented new ?Y: + directive. Fixed my e-mail address. + + * mcon/pl/depend.pl, mcon/pl/init.pl, mcon/pl/lint.pl: New ?Y: + directive to change unit layout. + + * mcon/pl/makefile.pl: Symbols are now sorted according to the ?Y: + layout directive. + + * mcon/pl/xref.pl: Added empty p_layout stub for new ?Y: directives. + + * pat/pat.man: New -i option for patsend to add extra instructions. + + * pat/patmake.SH: Now calls patsend with -i to add more instructions. + + * pat/patnotify.SH: Now tells users how to directly request for + mailed patches. + + * pat/patsend.SH: New -i option to add more instructions for + end-users. + +Tue Jul 25 16:41:40 METDST 1995 Raphael Manfredi + +. Description: + + pat/Jmakefile was missing an entry for the patlog program, which + prevented it from being installed, leading to chaos when patmake + was run. + + New contributions from Ilya Zakharevich + to provide OS/2 support. Configure can now be run under OS/2 using + a ksh shell interpreter. Support for pdksh is undergoing, as far + as I understand. + + The installation of script man pages can now cope with missing + files. The jmake rules used to require that all scripts or none + have .man files associated with them. From now on, the generated + Makefile will check for the manual page existence before trying + to install it. + + The clobber target now removes the .config directory as well, + which is generated by Configure to cache various information + over runs. Since clobber is intended to make a clean distribution, + that directory must be removed at that stage. + + All jmake error messages are now prefixed with the program name. + + Re-arranged compile line to include ldflags before objects + within all the compile-link tests in the metaconfig units, since + some systems require that ld flags be specfied at that place. + The only exception to this being the -llib directive, which stays + at the end of the line (from Spider Boardman). + + added SVR4-ish /opt directories to path list (ADO) + + Added backslash escapes within evals in Typedef.U to prevent problems + when the assigned variables have space in them (such as 'int *')... + + Force compile-link test for dl* routines since those symbols might lie + in crt0.o, and not in any other library (ADO) + + Improved comments about the Gconvert macro and forced a compile-link + test since the gconvert routine may exist but be unusable because + it would refer to otherwise missing routines... Sigh! (ADO) + + Made cc and ccflags optional dependencies in several units. + + Added knowledge of the O_NONBLOCK symbol in d_open3.U (required for + non-blocking I/O support, which is now computed by the new nblock_io.U + unit). + + Use findhdr to find , to get the right one (ADO) + + Typo fix on ?C: line for FILE_bufsiz in d_stdstdio.U. + Also fixed unbalanced parenthesis and check whether FILE_cnt + and FILE_ptr can be assigned to, i.e. may be used as lvalues. (ADO) + + Typo fix, sytem -> system in d_time.U and d_times.U. + + Conditionally use const in test programs for i_db.U (ADO) + + Use setvar so hint file values can override our guesses in + i_pwd.U. (ADO) + + Removed <> characters from comments, per metalint suggestion + + Ensure ctrl-A characters are visible in prompt within the + mboxchar.U unit (WED) + + Removed harmful spaces in assignment for selecttype.U. + + Added lookup for correct signal name lookup + under linux. That's probably as far as we'll get to support + those idiosyncracies. + + Obsoleted KEEPALIVE in favor of CAN_KEEPALIVE for consistency + with the 3.0 naming scheme. + + New metaconfig -G option to include a GNU configure-like + wrapper over the generated Configure script. That way, + people with a GNU background will be able to use (some) of + the GNU configure options to configure the package. The + wrapper computes suitable Configure options and then launches + that script. + + Manual page for metaconfig now documents the new -G option, + includes an extended description of the Csym.U unit and + mentions what a compile-link test line should look like. + + Metalint will now check : comments line for potential danger, + since those lines are really interpreted by the shell. Therefore, + unbalanced quotes could cause huge parts of the Configure script + to be ignored at run time, yielding weird results. Anyway, + metalint will tell you about them. + + Two new files: a new unit, and the GNU configure-like wrapper. + +. Files changed: + + * Jmakefile: Re-ordered macros, moving the install at the end. + + * bin/packinit.man: Fixed a typo. + + * jmake/files/Jmake.rules: Install of script man pages can now cope + with missing files. The clobber target now removes the .config + directory as well. + + * jmake/jmake.SH: All error messages are now prefixed with the + program name. + + * mcon/Jmakefile: Installs the GNU configure-like front-end to + Configure. + + * mcon/U/Csym.U: Re-arranged compile line to include ldflags before + objects. Added quotes for OS/2 support. + + * mcon/U/libs.U, mcon/U/Loc.U, mcon/U/Guess.U, mcon/U/Oldconfig.U, + mcon/U/libc.U: Now knows about OS/2 platforms. + + * mcon/U/Head.U: Added SVR4-ish /opt directories to path list (ADO). + OS/2 platforms are using another path separator. + + * mcon/U/Typedef.U: Added backslash escapes within evals to prevent + space problems. + + * mcon/U/d_safebcpy.U, mcon/U/d_wifstat.U, mcon/U/d_setpgrp.U, + mcon/U/ccflags.U, mcon/U/d_safemcpy.U: Re-arranged compile line to + include ldflags before objects. + + * mcon/U/d_dlerror.U, mcon/U/d_dlopen.U: Force compile-link test + since symbol might lie in crt0.o (ADO). + + * mcon/U/d_gconvert.U: Improved comments about the Gconvert macro + (ADO). Force compile-link test since it may exist but be unusable + (ADO). + + * mcon/U/d_volatile.U, mcon/U/d_sgndchr.U, mcon/U/d_scannl.U, + mcon/U/d_keepsig.U: Made cc and ccflags optional dependencies. + + * mcon/U/d_open3.U: Added knowledge of the O_NONBLOCK symbol. + + * mcon/U/d_shmat.U: Use findhdr to find , to get the right + one (ADO). + + * mcon/U/d_stdstdio.U: Typo fix on ?C: line for FILE_bufsiz. Fixed + unbalanced parenthesis (ADO). Check whether FILE_cnt and FILE_ptr + can be assigned to (ADO). + + * mcon/U/d_times.U, mcon/U/d_time.U: Typo fix, sytem -> system. + + * mcon/U/i_db.U: Conditionally use const in test programs (ADO). + + * mcon/U/i_pwd.U: Use setvar so hint file values can override our + guesses (ADO). + + * mcon/U/i_sysfile.U: Removed <> characters from comment, per + metalint suggestion. + + * mcon/U/mboxchar.U: Ensure ctrl-A characters are visible in prompt + (WED). + + * mcon/U/nblock_io.U, mcon/configure: Created. + + * mcon/U/selecttype.U: Removed harmful spaces in assignment. + + * mcon/U/sig_name.U: Added lookup for linux. + + * mcon/U/sockopt.U: Obsoleted KEEPALIVE in favor of CAN_KEEPALIVE for + consistency. + + * mcon/man/mconfig.SH: Added extra nroff escapes at line heads to + keep leading dots. Documented new -G option. Extended description + of the Csym.U unit. Now mentions what a compile-link test line + should look like. + + * mcon/man/mlint.SH: Added two new warnings for : comments lines in + Configure. + + * mcon/mconfig.SH: New -G option. + + * mcon/pl/cosmetic.pl: Added support for new -G option. + + * mcon/pl/lint.pl: Will now check : comments line for potential + danger. + + * pat/Jmakefile: Was missing an entry for the patlog program. + +Fri May 12 14:39:16 METDST 1995 Raphael Manfredi + +. Description: + + Regenerated Configure with pre-release of PL54. + + Updated my e-mail address in all manual pages. I had forgotten + about that in my previous patch. + + Various fixes in units from Andy Dougherty. Thanks to him and + to the efficient perl5-porters team that strive to port perl5 + to every possible existing platform on Earth, hence making + Configure more and more robust ;-). Here are Andy's fixes: + + . split awk command onto two lines for older awks + . fixed C test program to bypasss gcc builtin type checks + . deleted tabs that caused some /bin/sh to core dump + . cleaned up and extended osvers for DEC OSF/1 + . added MachTen detection + . protect against spaces in "uname -m" output + . extended for more intimate DB probing + . made more robust [ng]dbm units by checking both header + and libraries for features + . can now grok linux nm output with leading __IO + . added support for linux ELF output, using 'W' for alias + . now looks for too + . ensure that ./mips always exists + + Added -K option for experts. That Configure option should only + be used when you know what you are doing. The config.sh reload + logic now knows about new -K switch so that you now have to say: + Configure -dK + to get the old + Configure -d + behaviour. + + Configure now checks for a valid C compiler and that the + specified ccflags and ldflags are coherent with the choice + of the C compiler. It aborts if the C compiler does not + work (since it might be used for feature testing), but only + offers to abort when a flag inconsistency is detected. + Contributed by Tye McQueen (again!). + + Complete rewrite of d_stdstdio.U by Tye McQueen to fit modern + systems. The USE_STD_STDIO symbol has been obsoleted by the + new USE_STDIO_PTR symbol. Also, access to _ptr, _cnt and + _base fields in the FILE structure should be made only via the + new metaconfig macros FILE_ptr, FILE_cnt, etc... + + Made sure only most recent version of shared lib is picked. + This is for systems where libc.so.3 and libc.so.13 might + co-exist. We really need to pick the second one, whereas the + previous alphabetic sort was picking the first. + + Final "nm -p" check now uses xscan and xrun like everybody. + It used to do its checking manually. Using xscan and xrun allows + for the printing of the busy dots while scanning. + + The patpost script will now add an explicit From: header line + pointing to the maintainer address, as configured in your + .package. This is to prevent broken inews to insert the hostname + where patpost is ran, which might not be visible from the outside. + +. Files changed: + + * pat/pat.man, bin/packinit.man, jmake/jmake.man, kit/kitpost.man, + bin/manilist.man, kit/makedist.man, jmake/jmkmf.man, kit/manifake.man, + , dist.man: Updated my e-mail address. + + * mcon/U/Cppsym.U: Split awk command onto two lines for older awks + (ADO). + + * mcon/U/Csym.U: Fixed C test program to bypasss gcc builtin type + checks (ADO). + + * mcon/U/Inhdr.U: Deleted tabs that caused some /bin/sh to core dump + (ADO). + + * mcon/U/Oldconfig.U: Config.sh reload logic now knows about new -K + switch. Cleaned up and extended osvers for DEC OSF/1 (ADO). Added + MachTen detection (ADO). + + * mcon/U/Options.U: Added -K option for experts. + + * mcon/U/archname.U: Protect against spaces in "uname -m" output + (ADO). + + * mcon/U/cc.U: May now abort Configure when cc does not work. + + * mcon/U/ccflags.U: Now checks for cc/ccflags/ldflags coherency. + + * mcon/U/d_casti32.U: Made sure cc and ccflags are conditional + dependencies. + + * mcon/U/d_castneg.U: Made sure cc and ccflags are conditional + dependencies. Added improved test case for Interactive Unix. + + * mcon/U/d_stdstdio.U: Complete rewrite by Tye McQueen to fit modern + systems. + + * mcon/U/d_voidsig.U: Made cppflags dependency optional. + + * mcon/U/i_db.U: Extended for more intimate DB probing (ADO). + + * mcon/U/i_gdbm.U, mcon/U/i_ndbm.U, mcon/U/i_dbm.U: Made more robust + by checking both header and lib (ADO). + + * mcon/U/libc.U: Made sure only most recent version of shared lib is + picked. Final "nm -p" check now uses xscan and xrun like everybody. + Can now grok linux nm output with lead __IO (ADO). Added support for + linux ELF output, using 'W' for alias (ADO). + + * mcon/U/sig_name.U: Now looks for too (ADO). + + * mcon/U/usrinc.U: Ensure that ./mips always exists (ADO). + + * mcon/man/mconfig.SH: Documented new -K switch for knowledgeable + users. + + * pat/patpost.SH: Added explicit From: header line pointing to the + maintainer. + +Tue Mar 21 09:55:57 MET 1995 Raphael Manfredi + +. Description: + + Regenerated Configure to reflect my email address change. I moved + from ACRI to HP, and my email is now: . + The "critical" nature of this patch is due to that mere fix. + + Jmake was not working at all on HP-UX due to the way their cpp + systematically removes trailing backslashes in text. The new + fixcpp script is now a wrapper over cpp to first escape those + backslashes that should be preserved accross cpp before feeding + it with the text of the Jmakefile... + + Suppressed extra argument to NormalProgramTarget call in jmake rules. + + Definition of the paths variable in Head.U wrongly added spurious + ':' chars. Thanks to Karst Koymans for + pointing it out. + + Swapped two first arguments of memcpy() calls for memcpy safe + overlapping copy tests. Indeed, the memcpy() calling sequence used + was the same as bcopy(), but the first two arguments should be + swapped to preserve the same semantics. + + Continued fix for NeXT NIS/NetInfo handling, from Graham Stoney. + + Two new files. + +. Files changed: + + * jmake/Jmakefile: Now installs new fixcpp script in the private + libdir. + + * jmake/files/Jmake.rules: Suppressed extra argument to + NormalProgramTarget call. + + * jmake/fixcpp.SH, mcon/U/d_wifstat.U: Created. + + * jmake/jmake.SH: Now invokes cpp through new fixcpp script. First + pass now skips cpp comments alltogether. + + * mcon/U/Head.U: Definition of paths wrongly added spurious ':' chars. + + * mcon/U/d_safemcpy.U: Swapped two first arguments of memcpy() calls. + + * mcon/U/nis.U: Continued fix for NeXT NIS/NetInfo handling. + +Wed Feb 15 15:23:06 MET 1995 Raphael Manfredi + +. Description: + + This patch only contains random cleanup and minor fixes that were + brought to my attention on the dist-users list. + + Regenerated Configure with pre-release of 3.0 PL51, since it + was a little outdated. + + Wayne Davison's changes: + . now clearer about how to edit config.sh at the end of Configure. + . Getfile was not working if ~'s allowed with d_portable on + . Instruct.U: author name now appears at the end of a paragraph + + Andy Dougherty adapted osvers computation for AIX. He also + fixed mansrc.U where I had mistakenly duplicated /usr/local/man/man1. + He added /opt/man/man1 to the lookpath instead, a change originating + from Tye McQueen . + + Architecture name is now computed by a separate unit. This allows + authors to precompute it in a hint file, while warning the user + when the machine's architecture name changes (because for instance + the OS was upgraded), preventing mistakes. + + Now correctly handles NeXT using NIS rather than NetInfo, thanks + to a patch sent by Graham Stoney . + + One new file (unit archname.U). + +. Files changed: + + * mcon/U/Finish.U: Now clearer about how to edit config.sh at the + prompt (WED). + + * mcon/U/Getfile.U: Was not working if ~'s allowed with d_portable on + (WED). + + * mcon/U/Instruct.U: Author name now appears at the end of the + paragraph (WED). + + * mcon/U/Oldconfig.U: Adapted osvers computation for AIX (ADO). + + * mcon/U/archlib.U: Architecture name is now computed by a separate + unit. + + * mcon/U/archname.U: Created. + + * mcon/U/mansrc.U: Was mistakenly duplicating /usr/local/man/man1 + (ADO). Added /opt/man/man1 to the lookpath (ADO). + + * mcon/U/nis.U: Now correctly handles NeXT using NIS rather than + NetInfo. + +Mon Jan 30 15:59:00 MET 1995 Raphael Manfredi + +. Description: + + The dist-3.0 package now works with perl 5.0. I have made perl 5.0 + the default perl on my machine and ran the whole set of pat* tools, + jmake and metaconfig without any trouble so far. However, you need + a patched-up version of perl 5.0 PL0, as explained in README. + + This set of patches is mainly an integration of Wayne Davison's + changes for trn. His changes are flagged as WED. + + Begin.U: + Avoid an empty rmlist: systems might choke on it (WED). + + Config_h.U: + Typo fixes in leading config.h comment (WED). + + Oldconfig.U: + Update code for myuname changed (WED). + + Configure can now handle installation prefix changes. I have + slightly adapted the changes proposed by Wayne, introducing two + new special units (Prefixit.U and Prefixup.U) to factorize code. + + d_attribut.U: + Test C program now includes (WED) + + page.U: + Ensure dflt gets initialized in case no pagers are found (WED) + + prefix.U: + Save off previous prefix value in oldprefix if changed (WED) + Added the INSTALLPREFIX define for C programs to use (WED) + + Archname is now systematically recomputed. This avoids problem when + the user changes his mind about the OS name. + + Now looks for POSIX regcomp() routine, and for , thanks + to Sidney C. Smith . + + New installmanfmt and AFS-lookup for formatted man pages, derived + from what is done for troffed man pages. + + New prefixexp variable holding a fully expanded prefix, in case + they use ~name expansion in their prefix. + + Documented new special units Prefixit.U and Prefixup.U. + + Clean-up and workarounds for perl 5.0 PL0 port: + Removed old "do name()" routine call constructs. + Forgot to localize the spaces variable. + Random clean-up in &record_obsolete. + + Three new files. + +. Files changed: + + * mcon/U/Begin.U: Avoid an empty rmlist: systems might choke on it + (WED). + + * mcon/U/Config_h.U: Typo fixes in leading config.h comment (WED). + + * mcon/U/Oldconfig.U: Unit Options.U now exports file optdef.sh, not + a variable. Update code for myuname changed (WED). + + * mcon/U/Options.U: This unit now exports file optdef.sh, not a + variable. + + * mcon/U/i_regex.U, mcon/U/Prefixit.U, mcon/U/Prefixup.U: Created. + + * mcon/U/archlib.U: Archname is now systematically recomputed. Can + now handle installation prefix changes (from WED). + + * mcon/U/mansrc.U, mcon/U/scriptdir.U, mcon/U/lib.U, mcon/U/privlib.U, + , mcon/U/bin.U: Can now handle installation prefix changes (from WED). + + * mcon/U/d_attribut.U: Test C program now includes (WED). + + * mcon/U/d_regcmp.U: Now looks for POSIX regcomp() routine. + + * mcon/U/manfmt.U: New installmanfmt and AFS-lookup for formatted man + pages. Can now handle installation prefix changes (from WED). + + * mcon/U/pager.U: Ensure dflt gets initialized in case no pagers are + found (WED). + + * mcon/U/prefix.U: New prefixexp variable holding a fully expanded + prefix. Save off previous prefix value in oldprefix if changed + (WED). Added the INSTALLPREFIX define for C programs to use (WED). + + * mcon/U/rootid.U: Now only prints a single empty line when + outputting something. + + * mcon/man/mconfig.SH: Documented new special units Prefixit.U and + Prefixup.U. + + * mcon/pl/configure.pl, mcon/pl/eval.pl: Removed old "do name()" + routine call constructs. + + * mcon/pl/cosmetic.pl: Forgot to localize the spaces variable. + + * mcon/pl/obsolete.pl: Random clean-up in &record_obsolete. + +Wed Jan 11 17:03:22 MET 1995 Raphael Manfredi + +. Description: + + Regenerated Configure with pre-release of metaconfig PL45 to + benefit from the new install program lookup. From now on, the + supplied install.SH script will not be used if a BSD-compatible + install executable is found on your host (to accelerate the whole + install procedure). + + Regenerated many Makefile.SH files with pre-release of jmake PL45 + to correctly handle the new install and installdir configuration + variables. + + Updated the Wishlist file. + + New jmake macros. Also the MakeDirs macro was modified to benefit + from the information gathered by Configure concerning the way to + install nested directories (uses the new installdir variable). + + As a consequence, Makefile.SH files now pre-compute INSTALL and + INSTALLDIR variables before substituting (concerns jmake-generated + makefiles). + + Moved path stripping from d_portable.U to end of Configure. This + lets Configure use $vi and $perl, etc... set to their fully + qualified path name, hence making it easier for units to know + whether a particular program was located. Formerly, you had to + use $_vi, $_perl, etc... in case they asked for portability, which + stripped out executable paths. + + New cc vs. cpp symbol checking, as well as more cpp symbols in + the attribute list. Configure will now try to determine separately + symbols defined by cpp and by the cc wrapper, letting you know about + what is defined and by whom. Thanks to Jarkko Hietaniemi for this + suggestion. + + Added support for escaping answers to skip various checks in the + Getfile.U unit. For instance, you may now say: + fn='/fe~(foo)' + . ./getfile + and let them answer only fully qualified paths OR the string 'foo'. + You may supply a comma-separated list between the parenthesis. See + the manual page or the new install.U unit for more information. + + Modified message issued after file expansion in the Getfile unit. + + Protected various "sh -c" calls within backquotes for Linux and + SGI shells (to prevent an "ambiguous output redirection" message). + Thanks to Xavier Le Vourch for suggesting it. + + Added & escape allowing user to turn on -d from the prompt. Several + people have expressed the need for such a feature, arguing that + once they have re-run a Configure script to fix the answer to a + particular question, they would like to have the remaining of the + script ran as if -d had been given to Configure. Well, they now + may reply '& -d' at the Myread prompt to turn -d on. + + New -O option allowing -D and -U to override config.sh setttings. + This may be used to alter particular variables but still re-use + most of the previously guessed-at ones. Still, this may produce + inconsistencies and therefore is not the default behaviour (the + -D and -U switches have no effect by default if a previous config + file is loaded). + + Therefore, file optdef.sh is no longer removed after sourcing from + the UU directory. + + Changed gcc checking message to a more explicit one (WED) + Call ./mips instead of just mips (WED) + Use 'test -f' instead of 'test -r' for exec-only cat progs (WED) + Fixed typo in the d_attribut variable (ADO) + + New unit install.U to locate BSD-compatible install programs. + New unit poll.U to check for the poll() routine availability. + + Allows hint files to specify their own value for 'ranlib', to + overcome a bug in the NeXT ranlib program. Suggested by + Andreas Koenig on the perl5-porters + mailing list. Thanks! + + Now sets sbrksmart to undef explicitely when lacking sbrk(). + Forgot a cast when using return value from sbrk(). Both fixes + reported by Xavier Le Vourch . + + Now allows @if statements for the add.Config_sh unit inclusion. + + Metaconfig will now tell users about possible extra file-extension + lookups they have requested via 'packinit'. + +. Files changed: + + * jmake/files/Jmake.rules: New macros ShellScriptTargetExt and + SimpleShellScriptTargetExt. Directory installation is now made via + INSTALLDIR (Configure). + + * jmake/files/Jmake.tmpl: Now pre-computes INSTALL and INSTALLDIR + variables. + + * mcon/U/Config_sh.U: Moved path stripping from d_portable.U to end + of Configure. + + * mcon/U/Cppsym.U: New cc vs. cpp symbol checking suggested by JHI. + Added more cpp symbols (JHI). + + * mcon/U/Getfile.U: Added support for escaping answers to skip + various checks. Modified message issued after file expansion. + + * mcon/U/Instruct.U: Now documents the & escape to turn -d on at the + read prompt. + + * mcon/U/Loc.U: Protected "sh -c" within backquotes for Linux and + SGI. Added path lookup for the 'comm' program. + + * mcon/U/Myread.U: Added & escape allowing user to turn on -d from + the prompt. + + * mcon/U/Oldconfig.U: Added quotes around the INITPROG variable + (ADO). Allows variable overriding after config file loading. + + * mcon/U/Options.U: New -O option allowing -D and -U to override + config.sh setttings. File optdef.sh is no longer removed after + sourcing. + + * mcon/U/cc.U: Changed gcc checking message to a more explicit one + (WED). + + * mcon/U/d_attribut.U: Fixed typo in the d_attribut variable (ADO). + + * mcon/U/d_keepsig.U: Protected "sh -c" within backquotes for Linux + and SGI. + + * mcon/U/install.U, mcon/U/d_poll.U: Created. + + * mcon/U/d_portable.U: Executable path stripping moved to the end in + Config_sh.U. + + * mcon/U/d_safebcpy.U: Added 'ldflags' to the test compile line (ADO). + + * mcon/U/defeditor.U: Can now use the 'vi' variable since path + stripping is deferred. + + * mcon/U/libpth.U: Call ./mips instead of just mips (WED). + + * mcon/U/perlpath.U, mcon/U/mansrc.U, mcon/U/mailer.U: Can now use + Loc variables since path stripping is deferred. + + * mcon/U/orderlib.U: Allows hint files to specify their own value for + 'ranlib'. + + * mcon/U/sbrksmart.U: Now sets sbrksmart to undef explicitely when + lacking sbrk(). Forgot a cast when using return value from sbrk(). + + * mcon/U/spitshell.U: Use 'test -f' instead of 'test -r' for + exec-only cat progs (WED). Protected "sh -c" within backquotes for + Linux and SGI. + + * mcon/U/voidflags.U: Cosmetic change to avoid spurious blank lines + when using -s. + + * mcon/man/mconfig.SH: Documents new -O option and new Getfile escape + supports. Documents the & escape in Myread and the new cc symbol + lookup. + + * mcon/pl/configure.pl: Now allows @if statements for the + add.Config_sh unit inclusion. + + * mcon/pl/wanted.pl: Added % in front of hash table names for perl5's + each() (ADO). Tell users about possible extra file-extension lookups. + +Mon Oct 31 10:57:05 MET 1994 Raphael Manfredi + +. Description: + + It used to be that option processing was done before Configure + initializations were performed, because Options was listed in + the dependency line of Init.U. However, this was wrong because + -D and -U command line switches were then unable to override any + default setting done in Myinit.U, which is counter-intuitive at + best. Thanks to Andras Salamon for pointing + this out. + + I therefore created a new unit Begin.U, which clearly marks + the beginning of the configuration questions (so End.U now + has its pending unit). On that unit, we list Myinit followed + by Options on the ?MAKE: line, so that option processing + comes after user-defined or default initializations but before + the real interactive start (which is mandatory for a correct + Configure -h processing, for instance). + + A few units were making use of variables set up in Options.U + and made visible. However, those did not need to list Options + in their ?MAKE: line due to the way metalint performs its visible + symbol lookup (by following dependencies recursively and implicitely + placing Init at the top). Since Options is no longer a dependency + of Init, Myread.U and Csym.U now explicitely mention Options in + their dependency line. + + Also, the leading comment in Chk_MANI.U now explains how this + unit gets included into the Configure script. There used to be + an explaination there, but it was no longer accurate. + + One new unit file (Begin.U). + +. Files changed: + + * mcon/U/Begin.U: Created. + + * mcon/U/Chk_MANI.U: Now lists Begin instead of Myinit in its + dependencies. Leading comment now explains how this unit is included. + + * mcon/U/Myread.U, mcon/U/Csym.U: Added Options to the MAKE line + since it's no longer in Init.U. + + * mcon/U/Init.U: Removed Options from MAKE to prevent Init overrides. + Option processing now done after Myinit thanks to new Begin.U. Moved + "Beginning of configuration questions" to Begin.U. Moved signal + trapping instruction to Begin.U as well. + + * mcon/U/Myinit.U: Leading comment states this unit comes before + option processing. + +Sat Oct 29 19:05:42 MET 1994 Raphael Manfredi + +. Description: + + I forgot to quote $@ to protect against "evil" characters. + Unfortunately, this causes Configure to output an error message + when calling the created 'tr' script (which it does all the time + given the leading '.' in PATH) with arguments like '\012'. The + final + exec tr $@ + line causes a 'tr' failure because it does not understand the + arguments it is given. Saying + exec tr "$@" + fixes the problem since then the original quotes are "propagated" + to the new call. + + The amazing thing is that I have tested this, but apparently the + simple Configure script I generated for that purpose did not make + use of the "tr '/012' ' '" construct. Hence I missed it. Sorry. + +. Files changed: + + * mcon/U/Tr.U: Forgot to quote $@ to protect against "evil" + characters. + +Sat Oct 29 18:16:03 MET 1994 Raphael Manfredi + +. Description: + + Regenerated Configure with metaconfig 3.0 PL35 to benefit from + the lattest enhancements. Unfortunately, I have not pre-installed + the patch relased before regenerating, so Configure is still behind + the current patchlevel. I hope you don't mind ;-) + + The good news is: I've made sure all the scripts compile fine + with perl 5.0. This involved fixing an open precedence problem + in manilist, and some escapes in strings and regexps to make + sure all dangerous '@' are protected since they now interpolate. + I also fixed perload since perl5's packages are now introduced + by '::' instead of the single quote. + + The bad news is: it's not guaranteed to work. At least with the + pre-release version of perl 5.0 I have, metaconfig (the dataloaded + version) fails, and I've not been able to narrow down the problem + to a small test-case so I don't know what's happening. The non + dataloaded version appears to be running fine, but if you get + strange problems, make sure you use perl 4.0 PL36 before sending + me a bug report. :-) + + Added support for user-defined C and shell file extensions. This + was needed in perl5 for instance (.xs files are containing C + symbols and metaconfig should really look at those). Well, you + may now add as many extensions (C or SH) from within packinit. + + Packinit also asks whether a ChangeLog file is to be managed. + This is a new feature relying on the new patlog script. If you + don't ask for a ChangeLog file, you should get the old behaviour. + If you do, well you will have to read the documentation to know + what changes it involves (mainly at the user-interface level when + running 'patmake', which now calls 'patlog'). Don't forget to + add ChangeLog to your MANIFEST.new before running patmake anyway. + + Optionally, you can include the RCS logs within your ChangeLog + file, and they will follow the description (what you are reading + now) which normally appears within the Description: section of + the patch itself. + + Packinit now creates new variables cext, shext, changelog and + changercs in the .package file to handle user-defined file extensions + and the ChangeLog file. + + Added new RemoteDependency rule for jmake. + + Don't use rootid as a variable, it is known by metaconfig and + results in having Configure compute the root uid when it's not + needed. Renamed it to rootmsgid to avoid this kind of problem. + + Added ?F: lines in units creating files for metalint checking. + This incurred many small changes in units where things like + if usg; then + were written when in fact meaning: + if ./usg; then + Well, I know Configure sets '.' at the beginning of the PATH, but + since metalint now systematically warns about such abuse (provided + files are declared in the ?F: lines in the special unit defining + them), it was the only way to shut up metalint. + + Metalint also now checks for variables used as ${var}. + + Symbols ardent and titan are now looked at for cpp definition. (ADO) + + Make sure ENV is unset before calling /bin/ksh. Not doing this + is known to produce strange results. For instance, if one has + a ~/.kshrc aliasing 'cd' to something else. Configure might + get confused and do the wrong thing. Not setting ENV ensures + no such startup file will be used. Of course, this does not + work if you say 'ksh Configure', but then you are supposed to + know what you are doing. + + The loc script can now perform safe wildcard searching. (ADO) + + The Oldconfig.U unit was merged with the version used for perl5's + Configure (ADO). Be careful if you use hints, the behaviour you + will now get might not be fully backward compatible. Since the + Author currently does not have any such package, he did not test + that specific feature. You have been warned. (But everything + should be fine). + + Configure now protects variable definitions with spaces in them, + so that people saying: + Configure -D cc='cc -posix' + will get what they expect. + + Added checks for secure setuid scripts. (Tye McQueen) + + Spurious single quote in the lex.U unit could cause Configure + to crash, reported by Xavier Le Vourch . + Indeed, the unit was saying something like + : .... and they'll ... + so the shell happily began to eat everything up to the next + single quote it could found, resulting in weird behaviours... + + Now looks for shared libraries before anything else and + removed the old broken thislib/thatlib processing in libs.U. + This has been tested in the perl5 distribution and is believed + to be better than the previous scheme. (ADO) + + New Tr unit to convert to/from lowercase. Whenever you need + to say: + tr '[A-Z]' '[a-z]' + or the other way round, add Tr in your dependency line and + say something like + ./tr '[A-Z]' '[a-z]' + i.e. you need to call a local tr script that will trap the + arguments and possibly call + tr '[:upper:]' '[:lower:]' + if your machine supports this. Otherwise, with a non-ascii + character set, you will get strange results (HP is know + to exercise this, thanks to Andreas Sahlbach + for letting me know about it). + + ranlib checking is more accurate now (ADO) + + Newer RCS programs chop trailing spaces in log messages, and + that could cause 'patcil -s' to fail stripping the RSC logs. + + separated V/E and v/e commands in the patcil built-in prompter. + The new 'v' command now edits the file being patcil'ed. + added hook for 'V' command (not implemented yet) + The 'e' and 'E' commands have retained their semantics. + + 19 new files, mostly metaconfig units. + +. Files changed: + + * bin/manilist.SH: Fixed open precedence problem for perl5. + + * bin/packinit.SH: Added support for user-defined C and shell file + extensions. Now asks whether a ChangeLog file is to be managed. + + * bin/packinit.man: Added new variables cext, shext, changelog and + changercs. + + * bin/perload: Added minimal support for perl5 dataloading. + + * dist.man: Mentions new patlog script and ChangeLog file. + + * jmake/files/Jmake.rules: Added RemoteDependency rule. + + * jmake/jmake.SH, pat/patnotify.SH, mcon/pl/depend.pl: Added various + escapes in strings for perl5 support. + + * kit/kitpost.SH: Don't use rootid as a variable, it is known by + metaconfig. + + * mcon/U/bitpbyte.U, mcon/U/d_NOFILE.U, mcon/U/mkdep.U, + mcon/U/d_PORTAR.U, mcon/U/alignbytes.U, mcon/U/byteorder.U, + mcon/U/Finish.U, mcon/U/nlist_pfx.U, mcon/U/charorder.U, + mcon/U/d_getpagsz.U, mcon/U/ptrsize.U, mcon/U/intsize.U, + mcon/U/Getfile.U, mcon/U/Extract.U, mcon/U/Myread.U, mcon/U/Whoa.U, + mcon/U/longsize.U, mcon/U/floatsize.U, mcon/U/Config_sh.U, + mcon/U/cppstdin.U, mcon/U/doublesize.U, mcon/U/Findhdr.U, + mcon/U/i_varhdr.U, mcon/U/charsize.U: Added ?F: line for metalint + file checking. + + * mcon/U/Cppsym.U: Added ?F: line for metalint file checking. New + symbols ardent and titan (ADO). + + * mcon/U/Filexp.U: Added ?F: line for metalint file checking. Added + HOME to the ?T: line since metalint now checks ${HOME}. + + * mcon/U/Guess.U: Added ?F: line for metalint file checking. Call + ./xenix explicitely instead of relying on PATH. + + * mcon/U/Head.U: Make sure ENV is unset before calling /bin/ksh. + + * mcon/U/Setvar.U, mcon/U/Inhdr.U, mcon/U/Inlibc.U: Call ./whoa + explicitely instead of relying on PATH. + + * mcon/U/Loc.U: Added ?F: line for metalint file checking. Be + careful and guard against wildcard searching (ADO). + + * mcon/U/Oldconfig.U: Added ?F: line for metalint file checking. + Merged with the version used for perl5's Configure (ADO). + + * mcon/U/Options.U: Ensure option definition file is removed before + appending. Protect variable definitions with spaces in them. + + * pat/patlog.SH, mcon/U/Tr.U: Created. + + * mcon/U/Typedef.U: Don't clobber visible 'val' variable, use + 'varval' instead. + + * mcon/U/Warn_v7EXT.U, mcon/U/Warn_v7ND.U: Call ./v7 explicitely + instead of relying on PATH. + + * mcon/U/abortsig.U, mcon/U/d_bsdjmp.U: Call ./usg explicitely + instead of relying on PATH. + + * mcon/U/d_attribut.U, mcon/U/d_gconvert.U, mcon/U/d_drem.U, + mcon/U/d_locconv.U, mcon/U/d_mkfifo.U, mcon/U/d_fmod.U, + mcon/U/d_linuxstd.U, mcon/U/d_pathconf.U, mcon/U/archlib.U, + mcon/U/d_dlerror.U, mcon/U/d_sysconf.U, mcon/U/i_dld.U, + mcon/U/modetype.U: Created by ADO. + + * mcon/U/cc.U: Detect gcc even when not called as 'gcc' (ADO). + Simplified gcc version checking (ADO). Added ?F: line for metalint + file checking. + + * mcon/U/ccflags.U: Gcc versionning no longer relies on the C + compiler's name. Simplified check for gcc version checking (ADO). + + * mcon/U/cpp_stuff.U: Now uses cppstdin instead of plain cpp for + consistency (ADO). Remove temporary files when done. + + * mcon/U/d_casti32.U: Declare signal handler correctly (ADO). + + * mcon/U/d_castneg.U: Don't forget to tell user about compilation + failures (ADO). Declare signal handler correctly using 'signal_t' + (ADO). + + * mcon/U/d_closedir.U, mcon/U/d_safemcpy.U, mcon/U/d_isascii.U: Added + 'ldflags' to the test compile line (ADO). + + * mcon/U/d_dosuid.U: Added checks for secure setuid scripts (Tye + McQueen). + + * mcon/U/d_keepsig.U, mcon/U/d_eofpipe.U, mcon/U/d_normsig.U, + mcon/U/d_tzmin.U: Call ./bsd explicitely instead of relying on PATH. + + * mcon/U/d_gethname.U: Call ./xenix explicitely instead of relying on + PATH. + + * mcon/U/d_newsadm.U: Call ./eunice explicitely instead of relying on + PATH. + + * mcon/U/d_setpgrp.U: Added 'ldflags' to the test compile line (ADO). + Call ./usg explicitely instead of relying on PATH. + + * mcon/U/registers.U, mcon/U/shm_for.U, mcon/U/d_speedopt.U: Call + ./Cppsym explicitely instead of relying on PATH. + + * mcon/U/d_time.U: Now uses new Typedef unit to compute type + information (ADO). + + * mcon/U/groupstype.U: No longer uses Setvar to set 'groupstype' + (ADO). Typo fix in the word 'argument' (ADO). + + * mcon/U/i_dirent.U: Failed scanning for 'd_namlen' with missing + (ADO). + + * mcon/U/i_neterrno.U: Forgot to initialize 'val' to an empty value + (ADO). + + * mcon/U/i_termio.U: Call ./usg and ./Cppsym explicitely instead of + relying on PATH. + + * mcon/U/lex.U: Spurious single quote could cause Configure to crash. + (reported by Xavier Le Vourch .). + + * mcon/U/libc.U: Now looks for shared libraries before anything else + (ADO). Added new nm output format (ADO). + + * mcon/U/libs.U: Removed old broken thislib/thatlib processing (ADO). + + * mcon/U/mailfile.U: The Loc unit was missing from the dependency + line. + + * mcon/U/myhostname.U: Call ./xenix explicitely instead of relying on + PATH. Now uses new Tr unit to convert to/from lowercase. + + * mcon/U/nametype.U: Call ./usg and ./bsd explicitely instead of + relying on PATH. + + * mcon/U/orderlib.U: Now performs a real small compile for accurate + checks (ADO). + + * mcon/U/package.U: Beware of non-ascii character sets when + translating case. + + * mcon/U/pager.U: Replaced Myread by Getfile in the dependency line. + + * mcon/U/prefshell.U: Added SHELL temporary since metalint now sees + ${SHELL}. + + * mcon/U/so.U: Now tells user how he can suppress shared lib lookup + (ADO). Removed echo at the top, since it's now in the here-doc (ADO). + + * mcon/U/ssizetype.U: Added ?F: line for metalint file checking. + Added 'ldflags' to the test compile line (ADO). + + * mcon/man/mconfig.SH: Added nroff protection for lines beginning + with '.'. Documents new ?F: line for file declarations. Added + example showing how ./loc can be used. + + * mcon/man/mlint.SH: Documents new ?F: lines and the related metalint + warnings. Removed statement in BUGS since all warnings may now be + shut. + + * mcon/man/mxref.SH: The leading .TH was referring to metaconfig. + + * mcon/pl/common.pl: Metaconfig and metaxref ignore ?F: lines from + now on. + + * mcon/pl/files.pl: Added user-defined file extension support for + lookups. + + * mcon/pl/lint.pl: Now extensively checks created files thanks to new + ?F: lines. + + * mcon/pl/locate.pl: Misspelled a 'closedir' as a 'close' statement. + + * pat/pat.SH: Now unlinks all the files created by patlog in bugs. + + * pat/pat.man: Documents new patlog script and the files it uses. + The RCS layer section has been extended slightly. + + * pat/patcil.SH: Now honors the VISUAL and EDITOR environment + variables. Newer RCS programs chop trailing spaces in log messages. + Separated V/E and v/e commands. New 'v' command to edit the file + being patcil'ed. Added hook for 'V' command (not implemented yet). + + * pat/patmake.SH: A lot of setup is now performed by patlog. Added + various escapes in strings for perl5 support. + diff --git a/Configure b/Configure new file mode 100755 index 0000000..e8906f2 --- /dev/null +++ b/Configure @@ -0,0 +1,3892 @@ +#! /bin/sh +# +# If these # comments don't work, trim them. Don't worry about any other +# shell scripts, Configure will trim # comments from them for you. +# +# (If you are trying to port this package to a machine without sh, +# I would suggest you have a look at the prototypical config_h.SH file +# and edit it to reflect your system. Some packages may include samples +# of config.h for certain machines, so you might look for one of those.) +# +# Yes, you may rip this off to use in other distribution packages. This +# script belongs to the public domain and cannot be copyrighted. +# +# Note: this Configure script was generated automatically. Rather than +# working with this copy of Configure, you may wish to get metaconfig. +# The dist package (which contains metaconfig) is available at +# http://sourceforge.net/projects/dist/ + +# $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp ram $ +# +# Generated on Sun Feb 8 21:03:36 MET 2004 [metaconfig 3.0 PL70] + +cat >c1$$ <c2$$ </dev/null` + test "$me" || me=$0 + ;; +esac + +: Proper separator for the PATH environment variable +p_=: +: On OS/2 this directory should exist if this is not floppy only system ":-]" +if test -d c:/. ; then + if test -n "$OS2_SHELL"; then + p_=\; + PATH=`cmd /c "echo %PATH%" | tr '\\\\' / ` + OS2_SHELL=`cmd /c "echo %OS2_SHELL%" | tr '\\\\' / | tr '[A-Z]' '[a-z]'` + elif test -n "$DJGPP"; then + case "X${MACHTYPE:-nonesuchmach}" in + *cygwin) ;; + *) p_=\; ;; + esac + fi +fi + +: Proper PATH setting +paths='/bin /usr/bin /usr/local/bin /usr/ucb /usr/local /usr/lbin' +paths="$paths /opt/bin /opt/local/bin /opt/local /opt/lbin" +paths="$paths /usr/5bin /etc /usr/gnu/bin /usr/new /usr/new/bin /usr/nbin" +paths="$paths /opt/gnu/bin /opt/new /opt/new/bin /opt/nbin" +paths="$paths /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/ucb" +paths="$paths /bsd4.3/usr/bin /usr/bsd /bsd43/bin /usr/ccs/bin" +paths="$paths /etc /usr/lib /usr/ucblib /lib /usr/ccs/lib" +paths="$paths /sbin /usr/sbin /usr/libexec" +paths="$paths /system/gnu_library/bin" + +for p in $paths +do + case "$p_$PATH$p_" in + *$p_$p$p_*) ;; + *) test -d $p && PATH=$PATH$p_$p ;; + esac +done + +PATH=.$p_$PATH +export PATH + +: shall we be using ksh? +inksh='' +needksh='' +avoidksh='' +newsh=/bin/ksh +changesh='' +if (PATH=.; alias -x) >/dev/null 2>&1; then + inksh=true +fi +if test -f /hp-ux -a -f /bin/ksh; then + needksh='to avoid sh bug in "here document" expansion' +fi +if test -d /usr/lpp -a -f /usr/bin/bsh -a -f /usr/bin/uname; then + if test X`/usr/bin/uname -v` = X4; then + avoidksh="to avoid AIX 4's /bin/sh" + newsh=/usr/bin/bsh + fi +fi +if test -f /osf_boot -a -f /usr/sbin/setld; then + if test X`/usr/bin/uname -s` = XOSF1; then + avoidksh="to avoid Digital UNIX' ksh" + newsh=/bin/sh + unset BIN_SH + fi +fi +case "$inksh/$needksh" in +/[a-z]*) + ENV='' + changesh=true + reason="$needksh" + ;; +esac +case "$inksh/$avoidksh" in +true/[a-z]*) + changesh=true + reason="$avoidksh" + ;; +esac +case "$inksh/$needksh-$avoidksh-" in +true/--) + cat <&2 +$me: Fatal Error: I can't find a Bourne Shell anywhere. + +Usually it's in /bin/sh. How did you even get this far? +Please contact me (Raphael Manfredi) at Raphael_Manfredi@grenoble.hp.com and +we'll try to straighten this all out. +EOM + exit 1 + ;; +esac + +: see if sh knows # comments +if `$sh -c '#' >/dev/null 2>&1`; then + shsharp=true + spitshell=cat + xcat=/bin/cat + test -f $xcat$_exe || xcat=/usr/bin/cat + if test ! -f $xcat$_exe; then + for p in `echo $PATH | sed -e "s/$p_/ /g"` $paths; do + if test -f $p/cat$_exe; then + xcat=$p/cat + break + fi + done + if test ! -f $xcat$_exe; then + echo "Can't find cat anywhere!" + exit 1 + fi + fi + echo "#!$xcat" >try + $eunicefix try + chmod +x try + ./try > today 2>/dev/null + if test -s today; then + sharpbang='#!' + else + echo "#! $xcat" > try + $eunicefix try + chmod +x try + ./try > today 2>/dev/null + if test -s today; then + sharpbang='#! ' + else + sharpbang=': use ' + fi + fi +else + echo " " + echo "Your $sh doesn't grok # comments--I will strip them later on." + shsharp=false + cd .. + echo "exec grep -v '^[ ]*#'" >spitshell + chmod +x spitshell + $eunicefix spitshell + spitshell=`pwd`/spitshell + cd UU + echo "I presume that if # doesn't work, #! won't work either!" + sharpbang=': use ' +fi +rm -f try today + +: figure out how to guarantee sh startup +case "$startsh" in +'') startsh=${sharpbang}${sh} ;; +*) +esac +cat >try < cmdline.opt <>cmdline.opt < cmdl.opt +$arg +EOC + arg_exp=`cat cmdl.opt` + args_exp="$args_exp$args_sep'$arg_exp'" + argn=`expr $argn + 1` + args_sep=' ' +done +# args_exp is good for restarting self: eval "set X $args_exp"; shift; $0 "$@" +# used by ./hints/os2.sh +rm -f cmdl.opt + +: produce awk script to parse command line options +cat >options.awk <<'EOF' +BEGIN { + optstr = "A:dD:eEf:hKOrsSU:V"; # getopt-style specification + + len = length(optstr); + for (i = 1; i <= len; i++) { + c = substr(optstr, i, 1); + if (i < len) a = substr(optstr, i + 1, 1); else a = ""; + if (a == ":") { + arg[c] = 1; + i++; + } + opt[c] = 1; + } +} +{ + expect = 0; + str = $0; + if (substr(str, 1, 1) != "-") { + printf("'%s'\n", str); + next; + } + len = length($0); + for (i = 2; i <= len; i++) { + c = substr(str, i, 1); + if (!opt[c]) { + printf("-%s\n", substr(str, i)); + next; + } + printf("-%s\n", c); + if (arg[c]) { + if (i < len) + printf("'%s'\n", substr(str, i + 1)); + else + expect = 1; + next; + } + } +} +END { + if (expect) + print "?"; +} +EOF + +: process the command line options +set X `for arg in "$@"; do echo "X$arg"; done | + sed -e s/X// | awk -f options.awk` +eval "set $*" +shift +rm -f options.awk + +: set up default values +fastread='' +reuseval=false +config_sh='' +alldone='' +error='' +silent='' +extractsh='' +override='' +knowitall='' +rm -f optdef.sh posthint.sh +cat >optdef.sh <&2 + error=true + fi + cd UU + shift;; + -h) shift; error=true;; + -r) shift; reuseval=true;; + -s) shift; silent=true; realsilent=true;; + -E) shift; alldone=exit;; + -K) shift; knowitall=true;; + -O) shift; override=true;; + -S) shift; silent=true; extractsh=true;; + -D) + shift + case "$1" in + *=) + echo "$me: use '-U symbol=', not '-D symbol='." >&2 + echo "$me: ignoring -D $1" >&2 + ;; + *=*) echo "$1" | \ + sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> optdef.sh;; + *) echo "$1='define'" >> optdef.sh;; + esac + shift + ;; + -U) + shift + case "$1" in + *=) echo "$1" >> optdef.sh;; + *=*) + echo "$me: use '-D symbol=val', not '-U symbol=val'." >&2 + echo "$me: ignoring -U $1" >&2 + ;; + *) echo "$1='undef'" >> optdef.sh;; + esac + shift + ;; + -A) + shift + xxx='' + yyy="$1" + zzz='' + uuu=undef + case "$yyy" in + *=*) zzz=`echo "$yyy"|sed 's!=.*!!'` + case "$zzz" in + *:*) zzz='' ;; + *) xxx=append + zzz=" "`echo "$yyy"|sed 's!^[^=]*=!!'` + yyy=`echo "$yyy"|sed 's!=.*!!'` ;; + esac + ;; + esac + case "$xxx" in + '') case "$yyy" in + *:*) xxx=`echo "$yyy"|sed 's!:.*!!'` + yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` + zzz=`echo "$yyy"|sed 's!^[^=]*=!!'` + yyy=`echo "$yyy"|sed 's!=.*!!'` ;; + *) xxx=`echo "$yyy"|sed 's!:.*!!'` + yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` ;; + esac + ;; + esac + case "$xxx" in + append) + echo "$yyy=\"\${$yyy}$zzz\"" >> posthint.sh ;; + clear) + echo "$yyy=''" >> posthint.sh ;; + define) + case "$zzz" in + '') zzz=define ;; + esac + echo "$yyy='$zzz'" >> posthint.sh ;; + eval) + echo "eval \"$yyy=$zzz\"" >> posthint.sh ;; + prepend) + echo "$yyy=\"$zzz\${$yyy}\"" >> posthint.sh ;; + undef) + case "$zzz" in + '') zzz="$uuu" ;; + esac + echo "$yyy=$zzz" >> posthint.sh ;; + *) echo "$me: unknown -A command '$xxx', ignoring -A $1" >&2 ;; + esac + shift + ;; + -V) echo "$me generated by metaconfig 3.0 PL70." >&2 + exit 0;; + --) break;; + -*) echo "$me: unknown option $1" >&2; shift; error=true;; + *) break;; + esac +done + +case "$error" in +true) + cat >&2 <&1 +case "$silent" in +true) exec 1>/dev/null;; +esac + +: run the defines and the undefines, if any, but leave the file out there... +touch optdef.sh +. ./optdef.sh +: create the posthint manipulation script and leave the file out there... +touch posthint.sh + +: set package name +package=dist +first=`echo $package | sed -e 's/^\(.\).*/\1/'` +last=`echo $package | sed -e 's/^.\(.*\)/\1/'` +case "`echo AbyZ | tr '[:lower:]' '[:upper:]' 2>/dev/null`" in +ABYZ) spackage=`echo $first | tr '[:lower:]' '[:upper:]'`$last;; +*) spackage=`echo $first | tr '[a-z]' '[A-Z]'`$last;; +esac + +: Some greps do not return status, grrr. +echo "grimblepritz" >grimble +if grep blurfldyick grimble >/dev/null 2>&1 ; then + contains=contains +elif grep grimblepritz grimble >/dev/null 2>&1 ; then + contains=grep +else + contains=contains +fi +rm -f grimble +: the following should work in any shell +case "$contains" in +contains*) + echo " " + echo "AGH! Grep doesn't return a status. Attempting remedial action." + cat >contains <<'EOSS' +grep "$1" "$2" >.greptmp && cat .greptmp && test -s .greptmp +EOSS +chmod +x contains +esac + +: Find the path to the source tree +case "$src" in +'') case "$0" in + */*) src=`echo $0 | sed -e 's%/[^/][^/]*$%%'`;; + *) src='.';; + esac;; +esac +case "$src" in +'') src=/ + rsrc=/ + ;; +/*) rsrc="$src";; +*) rsrc="../$src";; +esac +if test -f $rsrc/Configure && \ + $contains "^package=$package$" $rsrc/Configure >/dev/null 2>&1 +then + : found it, so we are ok. +else + rsrc='' + for src in . .. ../.. ../../.. ../../../..; do + if test -f ../$src/Configure && \ + $contains "^package=$package$" ../$src/Configure >/dev/null 2>&1 + then + rsrc=../$src + break + fi + done +fi +case "$rsrc" in +'') + cat <&4 + +Sorry, I can't seem to locate the source dir for $package. Please start +Configure with an explicit path -- i.e. /some/path/Configure. + +EOM + exit 1 + ;; +../.) rsrc='..';; +*) + echo " " + echo "Sources for $package found in \"$src\"." >&4 + ;; +esac + +: script used to extract .SH files with variable substitutions +cat >extract <>extract <<'EOS' +echo "Doing variable substitutions on .SH files..." +if test -f "$SRC/MANIFEST"; then + set x `awk '{print $1}' <$SRC/MANIFEST | grep '\.SH'` +else + echo "(Looking for .SH files under the source directory.)" + set x `(cd "$SRC"; find . -name "*.SH" -print)` +fi +shift +case $# in +0) set x `(cd "$SRC"; echo *.SH)`; shift;; +esac +if test ! -f "$SRC/$1"; then + shift +fi +mkdir_p=' +name=$1; +create=""; +while test $name; do + if test ! -d "$name"; then + create="$name $create"; + name=`echo $name | sed -e "s|^[^/]*$||"`; + name=`echo $name | sed -e "s|\(.*\)/.*|\1|"`; + else + name=""; + fi; +done; +for file in $create; do + mkdir $file; +done +' +for file in $*; do + case "$SRC" in + ".") + case "$file" in + */*) + dir=`expr X$file : 'X\(.*\)/'` + file=`expr X$file : 'X.*/\(.*\)'` + (cd $dir && . ./$file) + ;; + *) + . ./$file + ;; + esac + ;; + *) + case "$file" in + */*) + dir=`expr X$file : 'X\(.*\)/'` + file=`expr X$file : 'X.*/\(.*\)'` + (set x $dir; shift; eval $mkdir_p) + sh <"$SRC/$dir/$file" + ;; + *) + sh <"$SRC/$file" + ;; + esac + ;; + esac +done +if test -f "$SRC/config_h.SH"; then + if test ! -f config.h; then + : oops, they left it out of MANIFEST, probably, so do it anyway. + . "$SRC/config_h.SH" + fi +fi +EOS + +: extract files and exit if asked to do so +case "$extractsh" in +true) + case "$realsilent" in + true) ;; + *) exec 1>&4;; + esac + case "$config_sh" in + '') config_sh='config.sh';; + esac + echo " " + echo "Fetching answers from $config_sh..." + cd .. + . $config_sh + test "$override" && . ./optdef.sh + echo " " + . UU/extract + rm -rf UU + echo "Extraction done." + exit 0 + ;; +esac + +: Eunice requires " " instead of "", can you believe it +echo " " +: Here we go... +echo "Beginning of configuration questions for $package." + +trap 'echo " "; test -d ../UU && rm -rf X $rmlist; exit 1' 1 2 3 15 + +: first determine how to suppress newline on echo command +echo " " +echo "Checking echo to see how to suppress newlines..." +(echo "hi there\c" ; echo " ") >.echotmp +if $contains c .echotmp >/dev/null 2>&1 ; then + echo "...using -n." + n='-n' + c='' +else + cat <<'EOM' +...using \c +EOM + n='' + c='\c' +fi +echo $n "The star should be here-->$c" +echo '*' +rm -f .echotmp + +: Now test for existence of everything in MANIFEST +echo " " +if test -f "$rsrc/MANIFEST"; then + echo "First let's make sure your kit is complete. Checking..." >&4 + awk '$1 !~ /PACK[A-Z]+/ {print $1}' "$rsrc/MANIFEST" | \ + (split -l 50 2>/dev/null || split -50) + rm -f missing + tmppwd=`pwd` + for filelist in x??; do + (cd "$rsrc"; ls `cat "$tmppwd/$filelist"` \ + >/dev/null 2>>"$tmppwd/missing") + done + if test -s missing; then + cat missing >&4 + cat >&4 <<'EOM' + +THIS PACKAGE SEEMS TO BE INCOMPLETE. + +You have the option of continuing the configuration process, despite the +distinct possibility that your kit is damaged, by typing 'y'es. If you +do, don't blame me if something goes wrong. I advise you to type 'n'o +and contact the author (Raphael_Manfredi@grenoble.hp.com). + +EOM + echo $n "Continue? [n] $c" >&4 + read ans + case "$ans" in + y*) + echo "Continuing..." >&4 + rm -f missing + ;; + *) + echo "ABORTING..." >&4 + kill $$ + ;; + esac + else + echo "Looks good..." + fi +else + echo "There is no MANIFEST file. I hope your kit is complete !" +fi +rm -f missing x?? + +: Find the appropriate value for a newline for tr +echo " " +if test -n "$DJGPP"; then + trnl='\012' +fi +if test X"$trnl" = X; then + case "`echo foo | tr '\n' x 2>/dev/null`" in + foox) trnl='\n' ;; + esac +fi +if test X"$trnl" = X; then + case "`echo foo | tr '\012' x 2>/dev/null`" in + foox) trnl='\012' ;; + esac +fi +if test X"$trnl" = X; then + case "`echo foo | tr '\r\n' xy 2>/dev/null`" in + fooxy) trnl='\n\r' ;; + esac +fi +if test X"$trnl" = X; then + cat <&2 + +$me: Fatal Error: cannot figure out how to translate newlines with 'tr'. + +EOM + exit 1 +else + echo "We'll use '$trnl' to transliterate a newline." +fi + +: compute the number of columns on the terminal for proper question formatting +case "$COLUMNS" in +'') COLUMNS='80';; +esac + +: set up the echo used in my read +myecho="case \"\$xxxm\" in +'') echo $n \"\$rp $c\" >&4;; +*) case \"\$rp\" in + '') echo $n \"[\$xxxm] $c\";; + *) + if test \`echo \"\$rp [\$xxxm] \" | wc -c\` -ge $COLUMNS; then + echo \"\$rp\" >&4 + echo $n \"[\$xxxm] $c\" >&4 + else + echo $n \"\$rp [\$xxxm] $c\" >&4 + fi + ;; + esac;; +esac" + +: now set up to do reads with possible shell escape and default assignment +cat <myread +$startsh +xxxm=\$dflt +$myecho +ans='!' +case "\$fastread" in +yes) case "\$dflt" in + '') ;; + *) ans=''; + case "\$silent-\$rp" in + true-) ;; + *) echo " " >&4;; + esac;; + esac;; +*) case "\$silent" in + true) case "\$rp" in + '') ans='';; + esac;; + esac;; +esac +while expr "X\$ans" : "X!" >/dev/null; do + read answ + set x \$xxxm + shift + aok=''; eval "ans=\\"\$answ\\"" && aok=y + case "\$answ" in + "!") + sh 1>&4 + echo " " + $myecho + ;; + !*) + set x \`expr "X\$ans" : "X!\(.*\)\$"\` + shift + sh 1>&4 -c "\$*" + echo " " + $myecho + ;; + "\$ans") + case "\$ans" in + \\&*) + set x \`expr "X\$ans" : "X&\(.*\)\$"\` + shift + case "\$1" in + -d) + fastread=yes + echo "(OK, I'll run with -d after this question.)" >&4 + ;; + -*) + echo "*** Sorry, \$1 not supported yet." >&4 + ;; + esac + $myecho + ans=! + ;; + esac;; + *) + case "\$aok" in + y) + echo "*** Substitution done -- please confirm." + xxxm="\$ans" + ans=\`echo $n "\$ans$c" | tr '$trnl' ' '\` + xxxm="\$ans" + ans=! + ;; + *) + echo "*** Error -- try again." + ans=! + ;; + esac + $myecho + ;; + esac + case "\$ans\$xxxm\$nostick" in + '') + ans=! + $myecho + ;; + esac +done +case "\$ans" in +'') ans="\$xxxm";; +esac +EOSC + +: create .config dir to save info across Configure sessions +test -d ../.config || mkdir ../.config +cat >../.config/README </dev/null` +case "$user" in +'') user=`whoami 2>&1`;; +esac +if $contains "^$user\$" ../.config/instruct >/dev/null 2>&1; then + firsttime=false + echo " " + rp='Would you like to see the instructions?' + dflt=n + . ./myread + case "$ans" in + [yY]*) ;; + *) needman=false;; + esac +fi +if $needman; then + cat <>../.config/instruct;; + esac +fi + +: script used to emit important warnings +cat >warn <msg +else + cat >msg +fi +echo " " +echo "*** WARNING:" >&4 +sed -e 's/^/*** /' &4 +echo "*** " >&4 +cat msg >>config.msg +echo " " >>config.msg +rm -f msg +EOS +chmod +x warn +$eunicefix warn + +: find out where common programs are +echo " " +echo "Locating common programs..." >&4 +cat <loc +$startsh +case \$# in +0) exit 1;; +esac +thing=\$1 +shift +dflt=\$1 +shift +for dir in \$*; do + case "\$thing" in + .) + if test -d \$dir/\$thing; then + echo \$dir + exit 0 + fi + ;; + *) + for thisthing in \$dir/\$thing; do + : just loop through to pick last item + done + if test -f \$thisthing; then + echo \$thisthing + exit 0 + elif test -f \$thisthing$_exe; then + echo \$thisthing + exit 0 + elif test -f \$dir/\$thing.exe; then + if test -n "$DJGPP"; then + echo \$dir/\$thing.exe + else + : on Eunice apparently + echo \$dir/\$thing + fi + exit 0 + fi + ;; + esac +done +echo \$dflt +exit 1 +EOSC +chmod +x loc +$eunicefix loc +loclist=" +awk +cat +chgrp +chmod +chown +cp +echo +expr +grep +mkdir +mv +rm +sed +sort +touch +tr +uniq +" +trylist=" +cpp +date +inews +less +line +ln +mail +make +more +nroff +perl +pg +rmail +sendmail +smail +test +uname +vi +zcat +" +pth=`echo $PATH | sed -e "s/$p_/ /g"` +pth="$pth /lib /usr/lib" +for file in $loclist; do + eval xxx=\$$file + case "$xxx" in + /*|?:[\\/]*) + if test -f "$xxx"; then + : ok + else + ./warn "no $xxx -- ignoring your setting for $file." + xxx=`./loc $file $file $pth` + fi + ;; + '') xxx=`./loc $file $file $pth`;; + *) xxx=`./loc $xxx $xxx $pth`;; + esac + eval $file=$xxx$_exe + eval _$file=$xxx + case "$xxx" in + /*) + echo $file is in $xxx. + ;; + ?:[\\/]*) + echo $file is in $xxx. + ;; + *) + echo "I don't know where '$file' is, and my life depends on it." >&4 + echo "Go find a public domain implementation or fix your PATH setting!" >&4 + exit 1 + ;; + esac +done +echo " " +echo "Don't worry if any of the following aren't found..." +say=offhand +for file in $trylist; do + eval xxx=\$$file + case "$xxx" in + /*|?:[\\/]*) + if test -f "$xxx"; then + : ok + else + ./warn "no $xxx -- ignoring your setting for $file." + xxx=`./loc $file $file $pth` + fi + ;; + '') xxx=`./loc $file $file $pth`;; + *) xxx=`./loc $xxx $xxx $pth`;; + esac + eval $file=$xxx$_exe + eval _$file=$xxx + case "$xxx" in + /*) + echo $file is in $xxx. + ;; + ?:[\\/]*) + echo $file is in $xxx. + ;; + *) + echo "I don't see $file out there, $say." + say=either + ;; + esac +done +case "$egrep" in +egrep) + echo "Substituting grep for egrep." + egrep=$grep + _egrep=$_grep + ;; +esac +case "$ln" in +ln) + echo "Substituting cp for ln." + ln=$cp + _ln=$_cp + ;; +esac +case "$make" in +make) + case "$gmake" in + gmake) + echo "I can't find make or gmake, and my life depends on it." >&4 + echo "Go find a public domain implementation or fix your PATH setting!" >&4 + exit 1 + ;; + esac + ;; +esac +case "$gmake" in +gmake) ;; +*) # We can't have osname yet. + if test -f "/system/gnu_library/bin/ar.pm"; then # Stratus VOS + # Assume that gmake, if found, is definitely GNU make + # and prefer it over the system make. + echo "Substituting gmake for make." + make=$gmake + _make=$_gmake + fi + ;; +esac +case "$test" in +test) + echo "Hopefully test is built into your sh." + ;; +*) + if `sh -c "PATH= test true" >/dev/null 2>&1`; then + echo "Using the test built into your sh." + test=test + _test=test + fi + ;; +esac +case "$echo" in +echo) + echo "Hopefully echo is built into your sh." + ;; +'') ;; +*) + echo " " +echo "Checking compatibility between $echo and builtin echo (if any)..." >&4 + $echo $n "hi there$c" >foo1 + echo $n "hi there$c" >foo2 + if cmp foo1 foo2 >/dev/null 2>&1; then + echo "They are compatible. In fact, they may be identical." + else + case "$n" in + '-n') n='' c='\c';; + *) n='-n' c='';; + esac + cat <$c" + $echo "*" + fi + $rm -f foo1 foo2 + ;; +esac + +: generate the trygcc script for later perusal +cat <trygcc +$startsh +EOS +cat <<'EOSC' >>trygcc +case "$cc" in +'') ;; +*) $rm -f try try.* + $cat >try.c <&4 + despair=yes + trygcc=yes + case "$cc" in + *gcc*) trygcc=no ;; + esac + case "`$cc -v -c try.c 2>&1`" in + *gcc*) trygcc=no ;; + esac + if $test X"$trygcc" = Xyes; then + if gcc -o try -c try.c; then + echo " " + echo "You seem to have a working gcc, though." >&4 + rp="Would you like to use it?" + dflt=y + if $test -f myread; then + . ./myread + else + if $test -f UU/myread; then + . ./UU/myread + else + echo "Cannot find myread, sorry. Aborting." >&2 + exit 1 + fi + fi + case "$ans" in + [yY]*) cc=gcc; ccname=gcc; ccflags=''; despair=no; + if $test -f usethreads.cbu; then + $cat >&4 <checkcc +$startsh +EOS +cat <<'EOSC' >>checkcc +case "$cc" in +'') ;; +*) $rm -f try try.* + $cat >try.c <&4 + fi + $cat >&4 < /dev/null 2>&1 ; then + echo "Symbolic links are supported." >&4 + lns="$ln -s" +else + echo "Symbolic links are NOT supported." >&4 + lns="$ln" +fi +$rm -f blurfl sym + +: determine whether symbolic links are supported +echo " " +case "$lns" in +*"ln"*" -s") + echo "Checking how to test for symbolic links..." >&4 + $lns blurfl sym + if $test "X$issymlink" = X; then + case "$newsh" in + '') sh -c "PATH= test -h sym" >/dev/null 2>&1 ;; + *) $newsh -c "PATH= test -h sym" >/dev/null 2>&1 ;; + esac + if test $? = 0; then + issymlink="test -h" + else + echo "Your builtin 'test -h' may be broken." >&4 + case "$test" in + /*) ;; + *) pth=`echo $PATH | sed -e "s/$p_/ /g"` + for p in $pth + do + if test -f "$p/$test"; then + test="$p/$test" + break + fi + done + ;; + esac + case "$test" in + /*) + echo "Trying external '$test -h'." >&4 + issymlink="$test -h" + if $test ! -h sym >/dev/null 2>&1; then + echo "External '$test -h' is broken, too." >&4 + issymlink='' + fi + ;; + *) issymlink='' ;; + esac + fi + fi + if $test "X$issymlink" = X; then + if $test -L sym 2>/dev/null; then + issymlink="$test -L" + echo "The builtin '$test -L' worked." >&4 + fi + fi + if $test "X$issymlink" != X; then + echo "You can test for symbolic links with '$issymlink'." >&4 + else + echo "I do not know how you can test for symbolic links." >&4 + fi + $rm -f blurfl sym + ;; +*) echo "No symbolic links, so not testing for their testing..." >&4 + ;; +esac + +: Duplicate the tree with symbolic links if -Dmksymlinks was supplied +case "$mksymlinks" in +$define|true|[yY]*) + case "$src" in + ''|'.') echo "Cannot create symlinks in the original directory." >&4 + exit 1 + ;; + *) case "$lns:$issymlink" in + *"ln"*" -s:"*"test -"?) + echo "Creating the symbolic links..." >&4 + echo "(First creating the subdirectories...)" >&4 + cd .. + awk '{print $1}' $src/MANIFEST | grep / | sed 's:/[^/]*$::' | \ + sort -u | while true + do + read directory + test -z "$directory" && break + if mkdir -p $directory 2>/dev/null && test -d $directory; then + : ok + else + echo "Failed to create '$directory'. Aborting." >&4 + exit 1 + fi + done + echo "(Then creating the symlinks...)" >&4 + awk '{print $1}' $src/MANIFEST | while true; do + read filename + test -z "$filename" && break + if test -f $filename; then + if $issymlink $filename; then + rm -f $filename + fi + fi + if test -f $filename; then + echo "$filename already exists, not symlinking." + else + ln -s $src/$filename $filename + fi + done + echo "(Checking current directory...)" >&4 + cd UU + awk '$1 !~ /PACK[A-Z]+/ {print $1}' "$rsrc/MANIFEST" | \ + (split -l 50 2>/dev/null || split -50) + rm -f missing + tmppwd=`pwd` + for filelist in x??; do + (cd ..; ls `cat "$tmppwd/$filelist"` \ + >/dev/null 2>>"$tmppwd/missing") + done + if test -s missing; then + cat missing >&4 + echo "Failed duplication of source tree. Aborting." >&4 + exit 1 + fi + ;; + *) echo "(I cannot figure out how to do symbolic links, ignoring!)" >&4 + ;; + esac + ;; + esac + ;; +esac + +: setup for possible cross-compilation +run='' +to=: +from=: +usecrosscompile='undef' +targetarch='' +case "$usecrosscompile" in +$define|true|[yY]*) + echo "Cross-compilation is not supported for this package." >&4 + exit 1 + ;; +esac + +: see whether [:lower:] and [:upper:] are supported character classes +echo " " +case "`echo AbyZ | $tr '[:lower:]' '[:upper:]' 2>/dev/null`" in +ABYZ) + echo "Good, your tr supports [:lower:] and [:upper:] to convert case." >&4 + up='[:upper:]' + low='[:lower:]' + ;; +*) # There is a discontinuity in EBCDIC between 'I' and 'J' + # (0xc9 and 0xd1), therefore that is a nice testing point. + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | $tr '[I-J]' '[i-j]' 2>/dev/null`" in + ij) up='[A-Z]' + low='[a-z]' + ;; + esac + fi + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | $tr I-J i-j 2>/dev/null`" in + ij) up='A-Z' + low='a-z' + ;; + esac + fi + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | od -x 2>/dev/null`" in + *C9D1*|*c9d1*) + echo "Hey, this might be EBCDIC." >&4 + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | $tr '[A-IJ-RS-Z]' '[a-ij-rs-z]' 2>/dev/null`" in + ij) up='[A-IJ-RS-Z]' + low='[a-ij-rs-z]' + ;; + esac + fi + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | $tr A-IJ-RS-Z a-ij-rs-z 2>/dev/null`" in + ij) up='A-IJ-RS-Z' + low='a-ij-rs-z' + ;; + esac + fi + ;; + esac + fi +esac +case "`echo IJ | $tr \"$up\" \"$low\" 2>/dev/null`" in +ij) + echo "Using $up and $low to convert case." >&4 + ;; +*) + echo "I don't know how to translate letters from upper to lower case." >&4 + echo "Your tr is not acting any way I know of." >&4 + exit 1 + ;; +esac +: set up the translation script tr, must be called with ./tr of course +cat >tr </dev/null` +$test -z "$myuname" && myuname=`hostname 2>/dev/null` +myuname=`echo $myuname | $sed -e 's/^[^=]*=//' -e 's/\///g' | \ + ./tr '[A-Z]' '[a-z]' | $tr $trnl ' '` +newmyuname="$myuname" +dflt=n +case "$knowitall" in +'') + if test -f ../config.sh; then + if $contains myuname= ../config.sh >/dev/null 2>&1; then + eval "`grep myuname= ../config.sh`" + fi + if test "X$myuname" = "X$newmyuname"; then + dflt=y + fi + fi + ;; +*) dflt=y;; +esac + +: Get old answers, if there is a config file out there +hint=default +hintfile='' +if test -f ../config.sh; then + echo " " + rp="I see a config.sh file. Shall I use it to set the defaults?" + . ./myread + case "$ans" in + n*|N*) echo "OK, I'll ignore it.";; + *) echo "Fetching default answers from your old config.sh file..." >&4 + tmp_n="$n" + tmp_c="$c" + . ../config.sh + cp ../config.sh . + n="$tmp_n" + c="$tmp_c" + hint=previous + ;; + esac +fi +;; +*) + echo " " + echo "Fetching default answers from $config_sh..." >&4 + tmp_n="$n" + tmp_c="$c" + cd .. + cp $config_sh config.sh 2>/dev/null + chmod +w config.sh + . ./config.sh + cd UU + cp ../config.sh . + n="$tmp_n" + c="$tmp_c" + hint=previous + ;; +esac +test "$override" && . ./optdef.sh + +: Restore computed paths +for file in $loclist $trylist; do + eval $file="\$_$file" +done + +: process their -A options +. ./posthint.sh + +: who configured the system +LC_ALL=C; export LC_ALL +cf_time=`$date 2>&1` +cf_by=`(logname) 2>/dev/null` +case "$cf_by" in +"") + cf_by=`(whoami) 2>/dev/null` + case "$cf_by" in + "") cf_by=unknown ;; + esac ;; +esac + +: is AFS running? +echo " " +case "$afs" in +$define|true) afs=true ;; +$undef|false) afs=false ;; +*) if test -d /afs; then + afs=true + else + afs=false + fi + ;; +esac +if $afs; then + echo "AFS may be running... I'll be extra cautious then..." >&4 +else + echo "AFS does not seem to be running..." >&4 +fi + +: determine where manual pages are on this system +echo " " +case "$sysman" in +'') + syspath='/usr/man/man1 /usr/man/mann /usr/man/manl /usr/man/local/man1' + syspath="$syspath /usr/man/u_man/man1 /usr/share/man/man1" + syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1" + syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1" + syspath="$syspath /usr/man/man.L /local/man/man1 /usr/local/man/man1" + sysman=`./loc . /usr/man/man1 $syspath` + ;; +esac +if $test -d "$sysman"; then + echo "System manual is in $sysman." >&4 +else + echo "Could not find manual pages in source form." >&4 +fi + +: decide how portable to be +case "$d_portable" in +"$define") dflt=y;; +*) dflt=n;; +esac +$cat <<'EOH' + +I can set things up so that your shell scripts and binaries are more portable, +at what may be a noticable cost in performance. In particular, if you +ask to be portable, the following happens: + + 1) Shell scripts will rely on the PATH variable rather than using + the paths derived above. + 2) ~username interpretations will be done at run time rather than + by Configure. + +EOH +rp="Do you expect to run these scripts and binaries on multiple machines?" +. ./myread +case "$ans" in + y*) d_portable="$define" + ;; + *) d_portable="$undef" ;; +esac + +: set up shell script to do ~ expansion +cat >filexp <&2 + exit 1 + fi + case "\$1" in + */*) + echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\` + ;; + *) + echo \$dir + ;; + esac + fi + ;; +*) + echo \$1 + ;; +esac +EOSS +chmod +x filexp +$eunicefix filexp + +: now set up to get a file name +cat <getfile +$startsh +EOS +cat <<'EOSC' >>getfile +tilde='' +fullpath='' +already='' +skip='' +none_ok='' +exp_file='' +nopath_ok='' +orig_rp="$rp" +orig_dflt="$dflt" + +case "$fn" in +*\(*) + expr $fn : '.*(\(.*\)).*' | tr ',' '\012' >getfile.ok + fn=`echo $fn | sed 's/(.*)//'` + ;; +esac + +case "$fn" in +*:*) + loc_file=`expr $fn : '.*:\(.*\)'` + fn=`expr $fn : '\(.*\):.*'` + ;; +esac + +case "$fn" in +*~*) tilde=true;; +esac +case "$fn" in +*/*) fullpath=true;; +esac +case "$fn" in +*+*) skip=true;; +esac +case "$fn" in +*n*) none_ok=true;; +esac +case "$fn" in +*e*) exp_file=true;; +esac +case "$fn" in +*p*) nopath_ok=true;; +esac + +case "$fn" in +*f*) type='File';; +*d*) type='Directory';; +*l*) type='Locate';; +esac + +what="$type" +case "$what" in +Locate) what='File';; +esac + +case "$exp_file" in +'') + case "$d_portable" in + "$define") ;; + *) exp_file=true;; + esac + ;; +esac + +cd .. +while test "$type"; do + redo='' + rp="$orig_rp" + dflt="$orig_dflt" + case "$tilde" in + true) rp="$rp (~name ok)";; + esac + . UU/myread + if test -f UU/getfile.ok && \ + $contains "^$ans\$" UU/getfile.ok >/dev/null 2>&1 + then + value="$ans" + ansexp="$ans" + break + fi + case "$ans" in + none) + value='' + ansexp='' + case "$none_ok" in + true) type='';; + esac + ;; + *) + case "$tilde" in + '') value="$ans" + ansexp="$ans";; + *) + value=`UU/filexp $ans` + case $? in + 0) + if test "$ans" != "$value"; then + echo "(That expands to $value on this system.)" + fi + ;; + *) value="$ans";; + esac + ansexp="$value" + case "$exp_file" in + '') value="$ans";; + esac + ;; + esac + case "$fullpath" in + true) + case "$ansexp" in + /*) value="$ansexp" ;; + *) + redo=true + case "$already" in + true) + echo "I shall only accept a full path name, as in /bin/ls." >&4 + echo "Use a ! shell escape if you wish to check pathnames." >&4 + ;; + *) + echo "Please give a full path name, starting with slash." >&4 + case "$tilde" in + true) + echo "Note that using ~name is ok provided it expands well." >&4 + already=true + ;; + esac + esac + ;; + esac + ;; + esac + case "$redo" in + '') + case "$type" in + File) + if test -f "$ansexp"; then + type='' + elif test -r "$ansexp" || (test -h "$ansexp") >/dev/null 2>&1 + then + echo "($value is not a plain file, but that's ok.)" + type='' + fi + ;; + Directory) + if test -d "$ansexp"; then + type='' + fi + ;; + Locate) + if test -d "$ansexp"; then + echo "(Looking for $loc_file in directory $value.)" + value="$value/$loc_file" + ansexp="$ansexp/$loc_file" + fi + if test -f "$ansexp"; then + type='' + fi + case "$nopath_ok" in + true) case "$value" in + */*) ;; + *) echo "Assuming $value will be in people's path." + type='' + ;; + esac + ;; + esac + ;; + esac + + case "$skip" in + true) type=''; + esac + + case "$type" in + '') ;; + *) + if test "$fastread" = yes; then + dflt=y + else + dflt=n + fi + rp="$what $value doesn't exist. Use that name anyway?" + . UU/myread + dflt='' + case "$ans" in + y*) type='';; + *) echo " ";; + esac + ;; + esac + ;; + esac + ;; + esac +done +cd UU +ans="$value" +rp="$orig_rp" +dflt="$orig_dflt" +rm -f getfile.ok +EOSC + +: determine root of directory hierarchy where package will be installed. +case "$prefix" in +'') + dflt=`./loc . /usr/local /usr/local /local /opt /usr` + ;; +*) + dflt="$prefix" + ;; +esac +$cat <bsd +echo exit 1 >usg +echo exit 1 >v7 +echo exit 1 >osf1 +echo exit 1 >eunice +echo exit 1 >xenix +echo exit 1 >venix +echo exit 1 >os2 +echo exit 1 >gnu +echo exit 1 >linux +d_bsd="$undef" +d_linux="$undef" +$cat /usr/include/signal.h /usr/include/sys/signal.h >foo 2>/dev/null +if test -f /osf_boot || $contains 'OSF/1' /usr/include/ctype.h >/dev/null 2>&1 +then + echo "Looks kind of like an OSF/1 system, but we'll see..." + echo exit 0 >osf1 +elif test `echo abc | $tr a-z A-Z` = Abc ; then + xxx=`./loc addbib blurfl $pth` + if $test -f $xxx; then + echo "Looks kind of like a USG system with BSD features, but we'll see..." + echo exit 0 >bsd + echo exit 0 >usg + else + if $contains SIGTSTP foo >/dev/null 2>&1 ; then + echo "Looks kind of like an extended USG system, but we'll see..." + else + echo "Looks kind of like a USG system, but we'll see..." + fi + echo exit 0 >usg + fi +elif $contains SIGTSTP foo >/dev/null 2>&1 ; then + echo "Looks kind of like a BSD system, but we'll see..." + d_bsd="$define" + echo exit 0 >bsd +elif + $rm --version 2>/dev/null >foo; + $contains "Free Software Foundation" foo >/dev/null +then + xxx=`uname` + echo exit 0 >gnu + echo "Looks kind of like a GNU/$xxx system, but we'll see..." + if $test X$xxx = XLinux; then + d_linux="$define" + echo exit 0 >linux + fi +else + echo "Looks kind of like a Version 7 system, but we'll see..." + echo exit 0 >v7 +fi +case "$eunicefix" in +*unixtovms*) + $cat <<'EOI' +There is, however, a strange, musty smell in the air that reminds me of +something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit. +EOI + echo exit 0 >eunice + d_eunice="$define" +: it so happens the Eunice I know will not run shell scripts in Unix format + ;; +*) + echo " " + echo "Congratulations. You aren't running Eunice." + d_eunice="$undef" + ;; +esac +case "$p_" in +:) ;; +*) + $cat <<'EOI' +I have the feeling something is not exactly right, however...don't tell me... +lemme think...does HAL ring a bell?...no, of course, you're only running OS/2! +EOI + echo exit 0 >os2 + ;; +esac +if test -f /xenix; then + echo "Actually, this looks more like a XENIX system..." + echo exit 0 >xenix + d_xenix="$define" +else + echo " " + echo "It's not Xenix..." + d_xenix="$undef" +fi +chmod +x xenix +$eunicefix xenix +if test -f /venix; then + echo "Actually, this looks more like a VENIX system..." + echo exit 0 >venix +else + echo " " + if ./xenix; then + : null + else + echo "Nor is it Venix..." + fi +fi +chmod +x bsd usg v7 osf1 eunice xenix venix os2 gnu linux +$eunicefix bsd usg v7 osf1 eunice xenix venix os2 gnu linux +$rm -f foo + +: see if we have to deal with yellow pages, now NIS. +if $test -d /usr/etc/yp || $test -d /etc/yp; then + if $test -f /usr/etc/nibindd; then + echo " " + echo "I'm fairly confident you're on a NeXT." + echo " " + rp='Do you get the hosts file via NetInfo?' + dflt=y + case "$hostcat" in + nidump*) ;; + '') ;; + *) dflt=n;; + esac + . ./myread + case "$ans" in + y*) hostcat='nidump hosts .';; + *) case "$hostcat" in + nidump*) hostcat='';; + esac + ;; + esac + fi + case "$hostcat" in + nidump*) ;; + *) + case "$hostcat" in + *ypcat*) dflt=y;; + '') if $contains '^\+' /etc/passwd >/dev/null 2>&1; then + dflt=y + else + dflt=n + fi;; + *) dflt=n;; + esac + echo " " + rp='Are you getting the hosts file via yellow pages?' + . ./myread + case "$ans" in + y*) hostcat='ypcat hosts';; + *) hostcat='cat /etc/hosts';; + esac + ;; + esac +fi +case "$hostcat" in +'') hostcat='cat /etc/hosts';; +esac +case "$groupcat" in +'') groupcat='cat /etc/group';; +esac +case "$passcat" in +'') passcat='cat /etc/passwd';; +esac + +: now get the host name +echo " " +echo "Figuring out host name..." >&4 +case "$myhostname" in +'') cont=true + echo 'Maybe "hostname" will work...' + if tans=`sh -c hostname 2>&1` ; then + myhostname=$tans + phostname=hostname + cont='' + fi + ;; +*) cont='';; +esac +if $test "$cont"; then + if ./xenix; then + echo 'Oh, dear. Maybe "/etc/systemid" is the key...' + if tans=`cat /etc/systemid 2>&1` ; then + myhostname=$tans + phostname='cat /etc/systemid' + echo "Whadyaknow. Xenix always was a bit strange..." + cont='' + fi + elif $test -r /etc/systemid; then + echo "(What is a non-Xenix system doing with /etc/systemid?)" + fi +fi +if $test "$cont"; then + echo 'No, maybe "uuname -l" will work...' + if tans=`sh -c 'uuname -l' 2>&1` ; then + myhostname=$tans + phostname='uuname -l' + else + echo 'Strange. Maybe "uname -n" will work...' + if tans=`sh -c 'uname -n' 2>&1` ; then + myhostname=$tans + phostname='uname -n' + else + echo 'Oh well, maybe I can mine it out of whoami.h...' + if tans=`sh -c $contains' sysname $usrinc/whoami.h' 2>&1` ; then + myhostname=`echo "$tans" | $sed 's/^.*"\(.*\)"/\1/'` + phostname="sed -n -e '"'/sysname/s/^.*\"\\(.*\\)\"/\1/{'"' -e p -e q -e '}' <$usrinc/whoami.h" + else + case "$myhostname" in + '') echo "Does this machine have an identity crisis or something?" + phostname='';; + *) + echo "Well, you said $myhostname before..." + phostname='echo $myhostname';; + esac + fi + fi + fi +fi +: you do not want to know about this +set $myhostname +myhostname=$1 + +: verify guess +if $test "$myhostname" ; then + dflt=y + rp='Your host name appears to be "'$myhostname'".'" Right?" + . ./myread + case "$ans" in + y*) ;; + *) myhostname='';; + esac +fi + +: bad guess or no guess +while $test "X$myhostname" = X ; do + dflt='' + rp="Please type the (one word) name of your host:" + . ./myread + myhostname="$ans" +done + +: translate upper to lower if necessary +case "$myhostname" in +*[A-Z]*) + echo "(Normalizing case in your host name)" + myhostname=`echo $myhostname | ./tr '[A-Z]' '[a-z]'` + ;; +esac + +case "$myhostname" in +*.*) + dflt=`expr "X$myhostname" : "X[^.]*\(\..*\)"` + myhostname=`expr "X$myhostname" : "X\([^.]*\)\."` + echo "(Trimming domain name from host name--host name is now $myhostname)" + ;; +*) case "$mydomain" in + '') + { + test "X$hostcat" = "Xypcat hosts" && + ypmatch "$myhostname" hosts 2>/dev/null |\ + $sed -e 's/[ ]*#.*//; s/$/ /' > hosts && \ + $test -s hosts + } || { + $hostcat | $sed -n -e "s/[ ]*#.*//; s/\$/ / + /[ ]$myhostname[ . ]/p" > hosts + } + tmp_re="[ . ]" + $test x`$awk "/[0-9].*[ ]$myhostname$tmp_re/ { sum++ } + END { print sum }" hosts` = x1 || tmp_re="[ ]" + dflt=.`$awk "/[0-9].*[ ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \ + hosts | $sort | $uniq | \ + $sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"` + case `$echo X$dflt` in + X*\ *) echo "(Several hosts in /etc/hosts matched hostname)" + dflt=. + ;; + X.) echo "(You do not have fully-qualified names in /etc/hosts)" + ;; + esac + case "$dflt" in + .) + tans=`./loc resolv.conf X /etc /usr/etc` + if $test -f "$tans"; then + echo "(Attempting domain name extraction from $tans)" + dflt=.`$sed -n -e 's/ / /g' \ + -e 's/^search *\([^ ]*\).*/\1/p' $tans \ + | ./tr '[A-Z]' '[a-z]' 2>/dev/null` + case "$dflt" in + .) dflt=.`$sed -n -e 's/ / /g' \ + -e 's/^domain *\([^ ]*\).*/\1/p' $tans \ + | ./tr '[A-Z]' '[a-z]' 2>/dev/null` + ;; + esac + fi + ;; + esac + case "$dflt" in + .) echo "(No help from resolv.conf either -- attempting clever guess)" + dflt=.`sh -c domainname 2>/dev/null` + case "$dflt" in + '') dflt='.';; + .nis.*|.yp.*|.main.*) dflt=`echo $dflt | $sed -e 's/^\.[^.]*//'`;; + esac + ;; + esac + case "$dflt" in + .) echo "(Lost all hope -- silly guess then)" + dflt='.uucp' + ;; + esac + $rm -f hosts + ;; + *) dflt="$mydomain";; + esac;; +esac +echo " " +rp="What is your domain name?" +. ./myread +tans="$ans" +case "$ans" in +'') ;; +.*) ;; +*) tans=".$tans";; +esac +mydomain="$tans" + +: translate upper to lower if necessary +case "$mydomain" in +*[A-Z]*) + echo "(Normalizing case in your domain name)" + mydomain=`echo $mydomain | ./tr '[A-Z]' '[a-z]'` + ;; +esac + +: a little sanity check here +case "$phostname" in +'') ;; +*) + case `$phostname | ./tr '[A-Z]' '[a-z]'` in + $myhostname$mydomain|$myhostname) ;; + *) + case "$phostname" in + sed*) + echo "(That doesn't agree with your whoami.h file, by the way.)" + ;; + *) + echo "(That doesn't agree with your $phostname command, by the way.)" + ;; + esac + ;; + esac + ;; +esac + +: determine the e-mail address of the user who is running us +$cat <&4 +$cat >foo.c <<'EOF' +#define A(x) x +#define B(y) y +A(a)B(b) +EOF +if $cpp foo.c >foo.cpp; $contains ab foo.cpp >/dev/null 2>&1; then + echo "Plain '$cpp' works just fine." + cpp_trad="$cpp" +elif $cpp -traditional foo.c >foo.cpp; \ + $contains ab foo.cpp >/dev/null 2>&1; then + echo "We'll use '$cpp -traditional' to get proper semantics." + cpp_trad="$cpp -traditional" +else + echo "I don't know how to get traditional semantics with '$cpp'." >&4 + cpp_trad="$cpp" +fi +$rm -f foo.c foo.cpp + +: determine default editor +echo " " +case "$defeditor" in +'') + case "$vi" in + */*) dflt="$vi";; + *) dflt=/usr/ucb/vi;; + esac + ;; +*) dflt="$defeditor" + ;; +esac +fn=f/ +rp="What is the default editor on your system?" +. ./getfile +defeditor="$ans" + +: locate a BSD compatible install program +echo " " +echo "Looking for a BSD-compatible install program..." >&4 +creatdir='' +case "$install" in +'') + tryit='' + for dir in $pth; do + for file in ginstall installbsd scoinst install; do + if $test -f $dir/$file; then + tryit="$tryit $dir/$file" + fi + done + done + $cat >try.c </dev/null 2>&1; then + cp try try.ns + strip try >/dev/null 2>&1 + else + echo "(I can't seem to compile a trivial C program -- bypassing.)" + echo "try" >try + cp try try.ns + fi + $cat >tryinst </dev/null 2>&1 + if $test -d foo/bar; then + creatdir="$prog -d" + fi + (ls -l d/try >try.ls; ls -l d/try.ns >tryno.ls) 2>/dev/null + if (cmp -s d/try try && cmp -s d/try.ns try.ns && \ + $contains 'rwxrw-r--' tryno.ls && \ + $contains 'rw-r---w-' try.ls) >/dev/null 2>&1 + then + dflt="$prog" + echo "ok, that will do." + break + fi + echo "not good$either." + either=' either' + $rm -f try*.ls + done + $rm -rf foo d tryinst try try*.ls try.* + case "$dflt" in + '') + echo "Hopefully, $package comes with its own install script!" + dflt='./install' + ;; + esac + ;; +*) dflt="$install";; +esac +$cat <&4 +case "$installdir" in +'') + case "$creatdir" in + '') + $mkdir -p foo/bar >/dev/null 2>&1 + if $test -d foo/bar; then + echo "Great, we can build them using 'mkdir -p'." + creatdir='mkdir -p' + elif eval "$install -d foo/bar"; $test -d foo/bar; then + creatdir="install -d" + echo "It looks like '$creatdir' will do it for us." + fi + ;; + *) + eval "$creatdir foo/bar" >/dev/null 2>&1 + if $test -d foo/bar; then + echo "Ah! We can use '$creatdir' to do just that." + fi + ;; + esac + $rm -rf foo + case "$creatdir" in + '') + echo "Heck! Another ancient system lacking the comfort of modern ones!" + echo "You can thank $package for bringing you its own install script!" + installdir='./install -d' + ;; + *) installdir="$creatdir";; + esac + ;; +*) echo "As you already told me, '$installdir' should work.";; +esac + +: determine the name of a reasonable mailer +case "$mailer" in +'') + if $test -f "$sendmail"; then + dflt="$sendmail" + elif $test -f "$smail"; then + dflt="$smail" + elif $test -f "$rmail"; then + dflt="$rmail" + elif $test -f /bin/mail; then + dflt=/bin/mail + else + dflt=$mail + fi + ;; +*) dflt="$mailer";; +esac +$cat <&4 +cat <<'EOT' >testcpp.c +#define ABC abc +#define XYZ xyz +ABC.XYZ +EOT +cd .. +echo 'cat >.$$.c; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >cppstdin +chmod 755 cppstdin +wrapper=`pwd`/cppstdin +ok='false' +cd UU + +if $test "X$cppstdin" != "X" && \ + $cppstdin $cppminus testcpp.out 2>&1 && \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 +then + echo "You used to use $cppstdin $cppminus so we'll use that again." + case "$cpprun" in + '') echo "But let's see if we can live without a wrapper..." ;; + *) + if $cpprun $cpplast testcpp.out 2>&1 && \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 + then + echo "(And we'll use $cpprun $cpplast to preprocess directly.)" + ok='true' + else + echo "(However, $cpprun $cpplast does not work, let's see...)" + fi + ;; + esac +else + case "$cppstdin" in + '') ;; + *) + echo "Good old $cppstdin $cppminus does not seem to be of any help..." + ;; + esac +fi + +if $ok; then + : nothing +elif echo 'Maybe "'"$cc"' -E" will work...'; \ + $cc -E testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "Yup, it does." + x_cpp="$cc -E" + x_minus=''; +elif echo 'Nope...maybe "'"$cc"' -E -" will work...'; \ + $cc -E - testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "Yup, it does." + x_cpp="$cc -E" + x_minus='-'; +elif echo 'Nope...maybe "'"$cc"' -P" will work...'; \ + $cc -P testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "Yipee, that works!" + x_cpp="$cc -P" + x_minus=''; +elif echo 'Nope...maybe "'"$cc"' -P -" will work...'; \ + $cc -P - testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "At long last!" + x_cpp="$cc -P" + x_minus='-'; +elif echo 'No such luck, maybe "'$cpp'" will work...'; \ + $cpp testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "It works!" + x_cpp="$cpp" + x_minus=''; +elif echo 'Nixed again...maybe "'$cpp' -" will work...'; \ + $cpp - testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "Hooray, it works! I was beginning to wonder." + x_cpp="$cpp" + x_minus='-'; +elif echo 'Uh-uh. Time to get fancy. Trying a wrapper...'; \ + $wrapper testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + x_cpp="$wrapper" + x_minus='' + echo "Eureka!" +else + dflt='' + rp="No dice. I can't find a C preprocessor. Name one:" + . ./myread + x_cpp="$ans" + x_minus='' + $x_cpp testcpp.out 2>&1 + if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "OK, that will do." >&4 + else +echo "Sorry, I can't get that to work. Go find one and rerun Configure." >&4 + exit 1 + fi +fi + +case "$ok" in +false) + cppstdin="$x_cpp" + cppminus="$x_minus" + cpprun="$x_cpp" + cpplast="$x_minus" + set X $x_cpp + shift + case "$1" in + "$cpp") + echo "Perhaps can we force $cc -E using a wrapper..." + if $wrapper testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 + then + echo "Yup, we can." + cppstdin="$wrapper" + cppminus=''; + else + echo "Nope, we'll have to live without it..." + fi + ;; + esac + case "$cpprun" in + "$wrapper") + cpprun='' + cpplast='' + ;; + esac + ;; +esac + +case "$cppstdin" in +"$wrapper") ;; +*) $rm -f $wrapper;; +esac +$rm -f testcpp.c testcpp.out + +: find out how to generate dependencies +echo " " +echo "Checking how to generate makefile dependencies on your machine..." >&4 +toplev=`cd ..;pwd` +$cat >dep.c <<'EOCP' +#include "dep.h" +EOCP +$cat >dep.h <<'EOCP' + +EOCP +takeflags='flags="" +case "$@" in +*--*) + for arg + do + shift + case "$arg" in + --) break;; + *) flags="$flags $arg";; + esac + done;; +esac' +case "$mkdep" in +'') + ;; +*) + if test -f "$mkdep" && + $mkdep dep.c >dep.out 2>/dev/null && + $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1 + then + echo "$mkdep works." + else + mkdep= + fi +esac + +case "$mkdep" in +'') + $spitshell > ../mkdep </dev/null +done +exit 0 +EOM + mkdep=$toplev/mkdep + chmod +x $mkdep + $eunicefix $mkdep + if $mkdep dep.c >dep.out 2>/dev/null && + $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1 + then + echo "Looks like we can use $cpp -M." + else + mkdep= + fi + ;; +esac + +case "$mkdep" in +'') + $spitshell > ../mkdep </dev/null +done +exit 0 +EOM + mkdep=$toplev/mkdep + chmod +x $mkdep + $eunicefix $mkdep + if $mkdep dep.c >dep.out 2>/dev/null && + $contains "dep$_o: dep.h" dep.out >/dev/null 2>&1 + then + echo "Looks like we can use $cc -MM." + else + mkdep= + fi + ;; +esac + +case "$mkdep" in +'') + $spitshell >../mkdep </dev/null | \\ + $sed -e '/^# *[0-9]/!d' \\ + -e 's/^.*"\(.*\)".*\$/'\$filebase'$_o: \1/' \\ + -e 's|: \./|: |' \\ + -e 's|: *$|: '\$srcfile'|' | \\ + $grep -v '^#' | $sort | $uniq +done +exit 0 +EOS + mkdep=$toplev/mkdep + chmod +x $mkdep + $eunicefix $mkdep + if $mkdep dep.c >dep.out 2>/dev/null && + $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1 + then + echo "A shell script using $cpp does the trick." + else + echo "$cpp doesn't seem to be any use at all." + $spitshell >../mkdep </ d' \\ + -e 's/:[^"]*"\([^"]*\)".*/: \1/' \\ + -e "s/\\.c:/$_o:/p" > /tmp/mkdep\$\$ + IFS=': ' + while read file dep; do + for dir in \$inc; do + if $test -f "\$dir/\$dep"; then + dep="\$dir/\$dep" + break + fi + done + echo "\$file: \$dep" | $sed -e 's,: \./,: ,' + done dep.out 2>/dev/null && + $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1 + then + cat << EOM + +I can use a script with grep instead, but it will make some incorrect +dependencies, since it doesn't understand about conditional compilation. +Moreover, some dependencies may be missing, because scanning won't be +a recursive process. +If you have a program which generates makefile dependencies, you may want +to use it. If not, you can use the script and edit the Makefile by hand +if you need to. +EOM + else + mkdep= + cat << EOM + +I can't seem to generate makefile dependencies at all! Perhaps you have a +program that does? If you don't, you might look at the mkdep script to +see if you can create one which works. +EOM + fi + fi +esac +dflt="$mkdep" +fn=f~/ +rp="Name of program to make makefile dependencies?" +. ./getfile +mkdep="$ans" +$rm -f dep.c dep.h dep$_o dep.out + +: find out how to find out full name +case "$d_berknames" in +"$define") + dflt=y;; +"$undef") + dflt=n;; +*) + if ./bsd; then + dflt=y + elif ./xenix; then + dflt=y + else + dflt=n + fi + ;; +esac +$cat <<'EOM' + +Does your /etc/passwd file keep full names in Berkeley/V7 format (name first +thing after ':' in GCOS field)? In that case, a typical entry in the password +file looks like this: + + guest:**paswword**:10:100:Mister Guest User:/usr/users:/bin/sh + ^^^^^^^^^^^^^^^^^ +EOM +rp="Berkeley/V7 format for full name in /etc/passwd?" +. ./myread +case "$ans" in +y*) d_passnames="$define" + d_berknames="$define" + d_usgnames="$undef" + nametype=bsd + ;; +*) + case "$d_usgnames" in + "$define") dflt=y;; + "$undef") dflt=n;; + *) + if ./usg; then + dflt=y + else + dflt=n + fi + ;; + esac +$cat <<'EOM' + +Does your passwd file keep full names in USG format (name sandwiched between a +'-' and a '(')? In that case, a typical entry in the password file looks like +this: + + guest:**paswword**:10:100:000-Mister Guest User(000):/usr/users:/bin/sh + ^^^^^^^^^^^^^^^^^ +EOM + rp="USG format for full name in /etc/passwd?" + . ./myread + case "$ans" in + n*) echo "Full name will be taken from ~/.fullname" + d_passnames="$undef" + d_berknames="$undef" + d_usgnames="$undef" + nametype=other + ;; + *) + d_passnames="$define" + d_berknames="$undef" + d_usgnames="$define" + nametype=usg + ;; + esac;; +esac + +: get organization name +longshots='/local/src /usr/src/new /usr/src/local /usr/local/src' +case "$orgname" in +'') if xxx=`./loc news/src/defs.h x $longshots`; then + dflt=`$sed -n 's/^.*MYORG[ ]*"\(.*\)".*$/\1/p' $xxx` + else + dflt='' + fi + ;; +*) dflt="$orgname";; +esac +$cat << 'EOH' + +Please type the name of your organization as you want it to appear on the +Organization line of outgoing articles. (It's nice if this also specifies +your location. Your city name is probably sufficient if well known.) +For example: + + University of Southern North Dakota, Hoople + +You may also put the name of a file, as long as it begins with a slash. +For example: + + /etc/organization + +EOH +orgname="" +while test "X$orgname" = "X"; do + rp='Organization:' + . ./myread + orgname="$ans" +done + +: locate the preferred pager for this system +case "$pager" in +'') + dflt='' + case "$pg" in + /*) dflt=$pg;; + esac + case "$more" in + /*) dflt=$more;; + esac + case "$less" in + /*) dflt=$less;; + esac + case "$dflt" in + '') dflt=/usr/ucb/more;; + esac + ;; +*) dflt="$pager";; +esac +echo " " +fn=f/ +rp='What pager is used on your system?' +. ./getfile +pager="$ans" + +: get the patchlevel +echo " " +echo "Getting the current patchlevel..." >&4 +if $test -r $rsrc/patchlevel.h;then + patchlevel=`awk \ + '/^#[ ]*define[ ][ ]*PATCHLEVEL/ {print $3}' \ + < $rsrc/patchlevel.h` +else + patchlevel=0 +fi +echo "(You have $package $baserev PL$patchlevel.)" + +: determine perl absolute location +case "$perlpath" in +'') + if test -f /usr/bin/perl; then + dflt=/usr/bin/perl + else + case "$perl" in + */*) dflt="$perl";; + *) dflt=/usr/bin/perl;; + esac + fi + ;; +*) dflt="$perlpath" + ;; +esac +echo " " +fn=f~/ +rp="Where is perl located on your system?" +. ./getfile +perlpath="$ans" + +: figure out how to guarantee perl startup +case "$sharpbang" in +*!) + $cat >xtry </dev/null 2>&1; then + $cat <&4 + . ./config.arch +fi + +: configuration may be patched via a 'config.over' file +if $test -f config.over; then + echo " " + dflt=y + rp='I see a config.over file. Do you wish to load it?' + . UU/myread + case "$ans" in + n*) echo "OK, I'll ignore it.";; + *) . ./config.over + echo "Configuration override changes have been loaded." + ;; + esac +fi + +: in case they want portability, strip down executable paths +case "$d_portable" in +"$define") + echo " " + echo "Stripping down executable paths..." >&4 + xsed=$sed + for file in $loclist $trylist; do + eval sfile="\$$file" + sfile=`echo $sfile | $xsed -e 's,.*/\(.*\),\1,'` + eval $file="$sfile" + done + ;; +esac + +: create config.sh file +echo " " +echo "Creating config.sh..." >&4 +$spitshell <config.sh +$startsh +# +# This file was produced by running the Configure script. It holds all the +# definitions figured out by Configure. Should you modify one of these values, +# do not forget to propagate your changes by running "Configure -der". You may +# instead choose to run each of the .SH files by yourself, or "Configure -S". +# + +# Package name : $package +# Source directory : $src +# Configuration time: $cf_time +# Configured by : $cf_by +# Target system : $myuname + +Author='$Author' +Date='$Date' +Header='$Header' +Id='$Id' +Locker='$Locker' +Log='$Log' +Mcc='$Mcc' +RCSfile='$RCSfile' +Revision='$Revision' +Source='$Source' +State='$State' +_a='$_a' +_exe='$_exe' +_o='$_o' +afs='$afs' +ar='$ar' +archobjs='$archobjs' +awk='$awk' +baserev='$baserev' +bash='$bash' +bison='$bison' +byacc='$byacc' +c='$c' +cat='$cat' +ccname='$ccname' +ccversion='$ccversion' +cf_by='$cf_by' +cf_email='$cf_email' +cf_time='$cf_time' +chgrp='$chgrp' +chmod='$chmod' +chown='$chown' +comm='$comm' +compress='$compress' +contains='$contains' +cp='$cp' +cpio='$cpio' +cpp='$cpp' +cpp_trad='$cpp_trad' +cpplast='$cpplast' +cppminus='$cppminus' +cpprun='$cpprun' +cppstdin='$cppstdin' +csh='$csh' +d_berknames='$d_berknames' +d_bsd='$d_bsd' +d_eunice='$d_eunice' +d_linux='$d_linux' +d_passnames='$d_passnames' +d_portable='$d_portable' +d_usgnames='$d_usgnames' +d_xenix='$d_xenix' +date='$date' +defeditor='$defeditor' +echo='$echo' +egrep='$egrep' +emacs='$emacs' +eunicefix='$eunicefix' +expr='$expr' +find='$find' +firstmakefile='$firstmakefile' +flex='$flex' +from='$from' +gmake='$gmake' +grep='$grep' +groupcat='$groupcat' +gzip='$gzip' +hint='$hint' +hostcat='$hostcat' +inews='$inews' +install='$install' +installdir='$installdir' +installmansrc='$installmansrc' +installprivlib='$installprivlib' +installscript='$installscript' +issymlink='$issymlink' +ksh='$ksh' +less='$less' +line='$line' +lint='$lint' +ln='$ln' +lns='$lns' +lp='$lp' +lpr='$lpr' +ls='$ls' +mail='$mail' +mailer='$mailer' +mailx='$mailx' +make='$make' +make_set_make='$make_set_make' +manext='$manext' +mansrc='$mansrc' +mansrcexp='$mansrcexp' +mkdep='$mkdep' +mkdir='$mkdir' +more='$more' +mv='$mv' +mydomain='$mydomain' +myhostname='$myhostname' +myuname='$myuname' +n='$n' +nametype='$nametype' +nm='$nm' +nroff='$nroff' +orgname='$orgname' +osname='$osname' +osvers='$osvers' +package='$package' +pager='$pager' +passcat='$passcat' +patchlevel='$patchlevel' +perl='$perl' +perlpath='$perlpath' +pg='$pg' +phostname='$phostname' +pmake='$pmake' +pr='$pr' +prefix='$prefix' +prefixexp='$prefixexp' +privlib='$privlib' +privlibexp='$privlibexp' +rm='$rm' +rmail='$rmail' +run='$run' +scriptdir='$scriptdir' +scriptdirexp='$scriptdirexp' +sed='$sed' +sendmail='$sendmail' +sh='$sh' +shar='$shar' +sharpbang='$sharpbang' +shsharp='$shsharp' +sleep='$sleep' +smail='$smail' +sort='$sort' +spackage='$spackage' +spitshell='$spitshell' +src='$src' +startperl='$startperl' +startsh='$startsh' +submit='$submit' +sysman='$sysman' +tail='$tail' +tar='$tar' +targetarch='$targetarch' +tbl='$tbl' +tee='$tee' +test='$test' +to='$to' +touch='$touch' +tr='$tr' +trnl='$trnl' +troff='$troff' +uname='$uname' +uniq='$uniq' +usecrosscompile='$usecrosscompile' +uuname='$uuname' +vi='$vi' +zcat='$zcat' +zip='$zip' +EOT + +: add special variables +$test -f $src/patchlevel.h && \ +awk '/^#define/ {printf "%s=%s\n",$2,$3}' $src/patchlevel.h >>config.sh +echo "CONFIG=true" >>config.sh + +: propagate old symbols +if $test -f UU/config.sh; then + UU/oldconfig.sh + sed -n 's/^\([a-zA-Z_0-9]*\)=.*/\1/p' config.sh config.sh UU/oldconfig.sh |\ + sort | uniq -u >UU/oldsyms + set X `cat UU/oldsyms` + shift + case $# in + 0) ;; + *) + cat <>config.sh + for sym in `cat UU/oldsyms`; do + echo " Propagating $hint variable "'$'"$sym..." + eval 'tmp="$'"${sym}"'"' + echo "$tmp" | \ + sed -e "s/'/'\"'\"'/g" -e "s/^/$sym='/" -e "s/$/'/" >>config.sh + done + ;; + esac +fi + +: Finish up by extracting the .SH files +case "$alldone" in +exit) + $rm -rf UU + echo "Extraction done." + exit 0 + ;; +cont) + ;; +'') + dflt='' + nostick=true + $cat <&4 -c "$ans";; + esac + ;; +esac + +: if this fails, just run all the .SH files by hand +. ./config.sh + +echo " " +exec 1>&4 +pwd=`pwd` +. ./UU/extract +cd "$pwd" + +if $contains '^depend:' [Mm]akefile >/dev/null 2>&1; then + dflt=y + case "$silent" in + true) ;; + *) + $cat < makedepend.out &" +It can take a while, so you might not want to run it right now. + +EOM + ;; + esac + rp="Run $make depend now?" + . UU/myread + case "$ans" in + y*) + $make depend && echo "Now you must run '$make'." + ;; + *) + echo "You must run '$make depend' then '$make'." + ;; + esac +elif test -f [Mm]akefile; then + echo " " + echo "Now you must run a $make." +else + echo "Configure done." +fi + +if $test -f Policy.sh; then + $cat <&4 +fi +$rm -f kit*isdone ark*isdone +$rm -rf UU + +: End of Configure + diff --git a/Credits b/Credits new file mode 100644 index 0000000..af26e33 --- /dev/null +++ b/Credits @@ -0,0 +1,112 @@ +INTRO + +This version of dist has been written by Raphael Manfredi based on +previous work from Larry Wall and Harlan Stenn. + +HISTORY + +I started working on this in September 1990 while I was still a student +at the Ecole des Mines de Saint-Etienne, France. From then on, I worked +during two years at ISE (building the Eiffel 3.0 compiler -- the run-time +part and code generation). Since I chose to use metaconfig for the run-time +library, which is written in plain C, I had the chance to continue improving +the whole dist package. + +By the end of 1991, I contacted Harlan Stenn who had +been working separately on his own dist version. I started the painful merge. +At the same time, I started releasing alpha version of dist 3.0. + +In 1992, I started a parallel project: mailagent. The dist 2.0 release upon +which this work is based included a simple perl script called mailagent, whose +sole job was to filter out @SH commands to automatically mail patches to some +people. I liked the idea of having a perl mail filter and so I extended +mailagent up to the point where it became really big and only marginally +dist-related. I released it on the net (comp.sources.misc) on July 1992, after +7 months of hard work. + +In March 1993, I left ISE and returned to France to join ACRI. The dist 3.0 +package was "almost" finished by that time, but the documentation was no +longer accurate and needed a lot of work. My new job does not give me enough +free time, so things have been longer than I expected. + +In July 1993, under the pressure of many of my alpha testers, I decided to +go into the final process, sacrifying nights and week ends to finish up what +turns out to have been a 3 years process... + +CREDITS + +My first thanks will go to Larry Wall who wrote perl +and dist 2.0 in the first place. I would never have dived into dist 2.0 +if it had not been written in perl. + +During my work, I had the chance to benefit some useful comments and +contributions from Craig Kolb who +has been the very first user of metaconfig (with a rather pre-historic +version). He used it on its rayshade 4.0 release (a ray tracing program). + +Then of course, many thanks are due to my co-worker, Harlan Stenn +. Although I did the integration of his work all by +myself, I have found many good ideas in his early work. For instance, he wrote +the first implementation of the metalint program, something I could not live +without today! His remarks, comments and encouragements have always been +appreciated, even though we did not always agree on the same things at the +same time... + +Then I would like to thank the many contributors to the metaconfig units. +I hope I'm not forgetting anybody! Here they come, in alphabetical order: +(sorted on the first name) + + Andy Dougherty + Craig Kolb + Graham Stoney + Harlan Stenn + Jan Djarv + Larry Wall + Ralf E. Stranzenbach + Scott Grosch + Syd Weinstein + Thomas Neumann + Wayne Davison + +If I forgot your name, please let me know, and accept my apologies (not +necessarily in that order ;-). + +Finally, thank you Shigeya Suzuki for hosting the +dist-users mailing list. Send mail to majordomo@foretune.co.jp to subscribe. + + Raphael Manfredi + Lyon, France, August 1993 + +[This section added by subsequent patches] + +PATCHES + +I'm grateful to the following people for sending me patches and/or reporting +bugs and giving me some suggestions (sorted on the first name): + + Andy Dougherty + Graham Stoney + Ilya Zakharevich + Jarkko Hietaniemi + Joseph H Buehler + Keith Walker + Scott Presnell + Wayne Davison + +Due to a mistake of mine, changes from Wayne Davison were flagged 'WAD', +but his middle initial being an 'E', new ones are now flagged as 'WED'. +Sorry Wayne, I did not know. We don't use middle initials here in Europe. + +Special thanks to the perl5 Patch Pumpkin Holders (in chronological order): + + Andy Dougherty + Chip Salzenberg + +for their wonderful creativity. Perl5 is by far the largest metaconfig +customer with the widest audience, so Configure got run on a variety +of new platforms requiring specific fixes... which they provided, +thereby greatly enhancing the metaconfig "portability database". + + Raphael Manfredi + Grenoble, France, February 1997 + diff --git a/Jmakefile b/Jmakefile new file mode 100644 index 0000000..a64b607 --- /dev/null +++ b/Jmakefile @@ -0,0 +1,35 @@ +/* + * Main Jmakefile for dist 3.0 + */ + +;# $Id: Jmakefile,v 3.0.1.2 1995/07/25 13:29:41 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.2 1995/07/25 13:29:41 ram +;# patch56: re-ordered macros, moving the install at the end +;# +;# Revision 3.0.1.1 1994/01/24 13:42:41 ram +;# patch16: added dependency generation stage +;# +;# Revision 3.0 1993/08/18 12:03:53 ram +;# Baseline for dist 3.0 netwide release. +;# + +>MANSRC /* This should really become automated */ + +all:: /* So that default target is not clobber! */ + +SetSubdirs(bin mcon jmake pat kit lib) +DependDirs(bin mcon pat jmake kit) +AddedByConfigure(install) + +InstallManPage(dist,$(MANSRC)) + diff --git a/Known_bugs b/Known_bugs new file mode 100644 index 0000000..b5c6180 --- /dev/null +++ b/Known_bugs @@ -0,0 +1,14 @@ +Here are some known bugs that I plan to fix soon. + ++ Patname ought to ask for a log message for the symbolic number. + ++ A unit name is always wanted by Configure. Hence in a unit d_waitpid, if +you write: + + @if WAITPID || d_waitpid + ..... + @end + +then the <....> part of the code will always be loaded even if no shell +script references d_waitpid or C code references WAITPID. + diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..2c93375 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,612 @@ +Artistic The Artistic Licence +ChangeLog Where changes are recorded. +Configure Portability tool +Credits Traditional "thank you" list +Jmakefile Description of the main Makefile +Known_bugs A list of known bugs +MANIFEST This list of files +Makefile.SH A makefile to run subsidiary makefiles +README Basic instructions +Wishlist Features I would like to add +bin/ Some binary tools +bin/Jmakefile Generic makefile description for bin +bin/Makefile.SH Jmake-generated configured makefile +bin/manicheck.SH Check manifest accuracy +bin/manicheck.man Manual page for manicheck +bin/manilist.SH Produces reports based on manifest +bin/manilist.man Manual page for manilist +bin/packinit.SH Creates a .package file describing your package +bin/packinit.man Manual page for packinit +bin/perload Build dynamically loaded perl scripts +dist.man Introduction to dist +install.SH Installation script with a BSD-like syntax +jmake/ Where makefile generator is stored +jmake/Jmakefile High level makefile description for jmake +jmake/Makefile.SH Generated makefile for jmake +jmake/NOTES Quick description of the internal syntax +jmake/README Welcome to jmake +jmake/bindex.SH Script to build an index of rules +jmake/files/ Where rules for jmake are held +jmake/files/Jmake.rules Generic rules for jmake +jmake/files/Jmake.tmpl Template used by jmake to produce Makefile.SH +jmake/fixcpp.SH Wrapper around cpp to fix buggy backslash hanling +jmake/jmake.SH The makefile generator +jmake/jmake.man Manual page for jmake +jmake/jmkmf.SH Wrapper for jmake +jmake/jmkmf.man Manual page for jmkmf +kit/ Where distribution tools are stored +kit/Jmakefile Jmake's description of kit builder's makefile +kit/Makefile.SH Builds kit builder +kit/README Instructions on makedist +kit/kitpost.SH Post shell archive kits +kit/kitpost.man Manual page for kitpost +kit/kitsend.SH Mail shell archive kits +kit/kitsend.man Manual page for kitsend +kit/makeSH Does most of turning a script into an SH file +kit/makeSH.man Manual page for same +kit/makedist.SH Makes a set of kits in the current directory +kit/makedist.man Manual page for same +kit/manifake.SH Makes a MANIFEST.new file out of a MANIFEST +kit/manifake.man Manual page for same +lib/ Some library support files +lib/C/ Some useful C routines +lib/C/Jmakefile Generic makefile for C lib routines +lib/C/Makefile.SH Produces Makefile for C lib routines +lib/C/fake/ Fake implementations of real routines +lib/C/fake/Jmakefile Generic makefile for faked C routines +lib/C/fake/Makefile.SH Jmake-generated configured makefile +lib/C/fake/dup2.C A dup2() replacement +lib/C/fake/getopt.C A getopt() replacement +lib/C/fake/rename.C A rename() replacement for files +lib/C/fake/scandir.C A scandir() replacement +lib/C/fake/setsid.C A setsid() pale imitation +lib/Jmakefile Generic makefile description for lib +lib/Makefile.SH Jmake-generated configured makefile +lib/errnolist.a Awk script to build sys_errnolist[] +lib/errnolist.mk Rule files to add for errnolist.c +lib/errnolist.sh Script to build errnolist.c +lib/makedepend.sh Script to make dependecies, Larry Wall's way +lib/makedir.sh Emulates 'mkdir -p' +mcon/ Where metaconfig tools are stored +mcon/INTRO Quick introduction for newcommers +mcon/Jmakefile The file used by jmake to produce the Makefile +mcon/Makefile.SH Builds metaconfig +mcon/NOTES Documents the changes in metaconfig +mcon/README Instructions on using metaconfig +mcon/U/ Holds Units for metaconfig +mcon/U/AAAAA.U Does magic before Head.U +mcon/U/Begin.U "Beginning of configuration questions" +mcon/U/Checkcc.U A unit for checking the C compiler for sanity +mcon/U/Chk_MANI.U MANIFEST checks +mcon/U/Chk_whoami.U A unit which checks for conflicts +mcon/U/Compile.U Unit for performing compile and link tests +mcon/U/Config_h.U Makes config.h.SH--bizarrity here +mcon/U/Config_sh.U Makes config.sh +mcon/U/Configdir.U Creates .config directory to store persistent info +mcon/U/Cppsym.U Makes program to test for cpp symbols +mcon/U/Cross.U Unit for cross-compiling support +mcon/U/Csym.U Determines whether C symbol is defined +mcon/U/End.U "End of configuration questions" +mcon/U/Extract.U .SH file extraction +mcon/U/Extractall.U Support for the -S Configure option +mcon/U/Filexp.U Makes program to do tilde expansion +mcon/U/Findhdr.U Locate header files +mcon/U/Finish.U A unit which always goes last +mcon/U/Getfile.U Get file/directory name +mcon/U/Guess.U Hazard guesses as to overall philosophy +mcon/U/Head.U First unit, does "#!/bin/sh" et al +mcon/U/Inhdr.U Defines a look-for-header function +mcon/U/Init.U Magically gathers ?Init: lines from other units +mcon/U/Inlibc.U Defines an is-in-libc? function +mcon/U/Instruct.U Prints instructions +mcon/U/Loc.U Look for common programs +mcon/U/Loc_sed.U Full path of sed interpreter, even when portable +mcon/U/Magic_h.U Makes confmagic.h--bizarrity here +mcon/U/MailAuthor.U Offers user to register himself +mcon/U/MailList.U Offers user to subscribe to users list +mcon/U/Mkdirp.U Unit producing shell script to "mkdir -p" +mcon/U/Mksymlinks.U Unit to generate symlink to source tree +mcon/U/Myinit.U For copying to private U directories +mcon/U/Myread.U Makes program to do read with shell escape +mcon/U/Nothing.U For empty dependencies +mcon/U/Null.U Zeroes out variables. Probably unnecessary +mcon/U/Obsol_h.U Warnings about obsolete C symbols +mcon/U/Obsol_sh.U Warnings about obsolete shell symbols +mcon/U/Oldconfig.U Looks for old config.sh file +mcon/U/Oldsym.U Try to propagate symbols +mcon/U/Options.U Configure option parsing +mcon/U/Prefixit.U Fixes path prefix in variables in case it changed +mcon/U/Prefixup.U Fixes vars with path prefix using ~name expansion +mcon/U/Rcs.U Some stupid redefinitions to keep RCS happy +mcon/U/Setvar.U Set a variable with some sanity checks +mcon/U/Signal.U Utilities for sig_name.U +mcon/U/Tr.U Builds a tr script to handle lower and upper classes +mcon/U/Typedef.U Defines a typedef lookup function +mcon/U/Unix.U Common UNIX settings and assumptions +mcon/U/Warn.U Summarizes warnings emitted during Configure run +mcon/U/Warn_v7EXT.U V7 has some ideosyncracies +mcon/U/Warn_v7ND.U V7 has no O_NDELAY read +mcon/U/Whoa.U Warning function +mcon/U/abortsig.U Which signal is sent by abort()? +mcon/U/active.U Find the news active file +mcon/U/afs.U Look whether AFS is running or not +mcon/U/alignbytes.U Check for alignment constraints +mcon/U/archlib.U Where architecture-dependent files are installed +mcon/U/archname.U Computes the architecture name (cpu-osname) +mcon/U/baserev.U Base revision of package +mcon/U/basicshell.U Which basic shell is available +mcon/U/bin.U Find where to install public executables +mcon/U/bitpbyte.U Computes the number of bits in a byte +mcon/U/byteorder.U Computes the byte order (big-endian?) +mcon/U/cc.U Which C compiler should be used? +mcon/U/ccflags.U Any additional C flags? +mcon/U/cf_email.U Computes user's e-mail address +mcon/U/cf_name.U Computes user's full name +mcon/U/cf_who.U Who configured the sytem, where and when +mcon/U/charorder.U Character order within a byte +mcon/U/charsize.U What is the size of "char"? +mcon/U/contains.U Makes status-returning grep +mcon/U/cpp_stuff.U Some cpp stuff +mcon/U/cpp_trad.U Checks how to get traditional cpp behaviour +mcon/U/cppfilecom.U Running cpp while preserving C comments +mcon/U/cppstdin.U Check how to invoke the C pre-processor +mcon/U/d_NOFILE.U Maximum # of file descriptors +mcon/U/d_NeWS.U Old NeWS stuff +mcon/U/d_PORTAR.U Do we know about portable archives? +mcon/U/d_SHM_MAC.U SHMLBA macro stuff +mcon/U/d_access.U Do we have access()? +mcon/U/d_alarm.U Do we have alarm()? +mcon/U/d_attribut.U Checks wether your cc groks __attribute__ +mcon/U/d_bcmp.U Do we have bcmp() or memcmp()? +mcon/U/d_bcopy.U Do we have bcopy() or memcpy()? +mcon/U/d_brokstat.U Check whether stat() macros are broken +mcon/U/d_bsdjmp.U Do we have BSD _setjmp() and _longjmp()? +mcon/U/d_byacc.U Is byacc available? +mcon/U/d_bzero.U Do we have bzero() or memset()? +mcon/U/d_casti32.U Can the compiler cast large flots to 32-bit ints? +mcon/U/d_castneg.U Can the C compiler cast negative to unsigned? +mcon/U/d_cbrt.U Do we have cubic root cbrt()? +mcon/U/d_charsprf.U How is sprintf() defined? +mcon/U/d_chown.U Do we have chown()? +mcon/U/d_chroot.U Do we have chroot()? +mcon/U/d_chsize.U Size of a char +mcon/U/d_ckeypad.U Do we have the curses keypad()? +mcon/U/d_closedir.U Do we have closedir()? +mcon/U/d_const.U Can cc grok the const keyword? +mcon/U/d_crypt.U Does crypt() exist? +mcon/U/d_csh.U csh path +mcon/U/d_ctermid.U Do we have ctermid()? +mcon/U/d_cuserid.U Do we have cuserid()? +mcon/U/d_dbl_dig.U Is DBL_DIG defined in or ? +mcon/U/d_debugging.U Conditionally defines -DDEBUGGING +mcon/U/d_difftime.U Do we have difftime()? +mcon/U/d_dlerror.U Do we have dlerror()? +mcon/U/d_dlopen.U Do we have dlopen()? +mcon/U/d_dosuid.U Do they want setuid emulation? +mcon/U/d_drem.U Do we have drem()? +mcon/U/d_dup2.U Do we have dup2()? +mcon/U/d_eofpipe.U Will EOF be seen on closed pipes? +mcon/U/d_euc2jis.U Do we have euc2jis()? +mcon/U/d_fchmod.U Do we have fchmod()? +mcon/U/d_fchown.U Do we have fchown()? +mcon/U/d_fcntl.U Do we have fcntl()? +mcon/U/d_fd_set.U Do we have the fd set manipulation macros? +mcon/U/d_ffs.U Do we have ffs()? +mcon/U/d_fgetpos.U Do we have fgetpos()? +mcon/U/d_flexfnam.U Long filenames? +mcon/U/d_flock.U Do we have flock()? +mcon/U/d_fmod.U Do we have fmod()? +mcon/U/d_fork.U Do we have fork()? +mcon/U/d_fsetpos.U Do we have fsetpos()? +mcon/U/d_ftime.U Do we have ftime()? +mcon/U/d_ftrncate.U Do we have ftruncate()? +mcon/U/d_gconvert.U Do we have gconvert() or gcvt()? +mcon/U/d_getgrps.U Do we have getgroups()? +mcon/U/d_gethbynm.U Do we have gethostbyname()? +mcon/U/d_gethent.U Do we have gethostent()? +mcon/U/d_gethid.U Do we have gethostid()? +mcon/U/d_gethname.U What is the C function to get host name? +mcon/U/d_getlogin.U Do we have getlogin()? +mcon/U/d_getopt.U Do we have getopt()? +mcon/U/d_getpagsz.U Computes system's page size +mcon/U/d_getpgid.U Do we have getpgid()? +mcon/U/d_getpgrp.U Do we have getpgrp()? +mcon/U/d_getpgrp2.U Do we have getpgrp2()? (DG/UX) +mcon/U/d_getppid.U Do we have getppid()? +mcon/U/d_getprior.U Do we have getpriority()? +mcon/U/d_getpwent.U How is passwd info gotten? +mcon/U/d_getwd.U Do we have getwd()? +mcon/U/d_gnulibc.U Are we using the GNU C library? +mcon/U/d_group.U Do we have group()? +mcon/U/d_havetlib.U Where is termlib? +mcon/U/d_hidnet.U Do hiddennet stuff? +mcon/U/d_htonl.U Do we have htonl() and friends? +mcon/U/d_inetaton.U Do we have inet_aton()? +mcon/U/d_inetd.U Should internet communication be done via inetd? +mcon/U/d_internet.U Use internet addresses? +mcon/U/d_isascii.U Do we have isascii()? +mcon/U/d_itimer.U Do we have setitimer()? +mcon/U/d_keepsig.U Will signal handlers need to be rearmed? +mcon/U/d_killpg.U Do we have killpg()? +mcon/U/d_link.U Do we have link()? +mcon/U/d_linuxstd.U Do we have Linux standard I/O structures? +mcon/U/d_locconv.U Do we have localeconv()? +mcon/U/d_lockf.U Do we have lockf()? +mcon/U/d_lstat.U Do we have lstat()? +mcon/U/d_mblen.U Do we have mblen()? +mcon/U/d_mbstowcs.U Do we have mbstowcs()? +mcon/U/d_mbtowc.U Do we have mbtowc()? +mcon/U/d_memalign.U Do we have memalign()? +mcon/U/d_memccpy.U Do we have memccpy()? +mcon/U/d_memchr.U Do we have memchr()? +mcon/U/d_memcmp.U Do we have memcmp()? +mcon/U/d_memcpy.U Do we have memcpy()? +mcon/U/d_memmove.U Do we have memmove()? +mcon/U/d_memset.U Do we have memset()? +mcon/U/d_mkdir.U Do we have mkdir()? +mcon/U/d_mkfifo.U Do we have mkfifo()? +mcon/U/d_mktime.U Do we have mktime()? +mcon/U/d_mmap.U Do we have mmap()? +mcon/U/d_msem_lck.U Do we have msem_lock()? +mcon/U/d_msg.U Do we have full msg(2) support? +mcon/U/d_msgctl.U Do we have msgctl()? +mcon/U/d_msgget.U Do we have msgget()? +mcon/U/d_msgrcv.U Do we have msgrcv()? +mcon/U/d_msgsnd.U Do we have msgsnd()? +mcon/U/d_msync.U Do we have msync()? +mcon/U/d_munmap.U Do we have munmap()? +mcon/U/d_newsadm.U Who is news administrator? +mcon/U/d_nice.U Do we have nice()? +mcon/U/d_nolnbuf.U Is stdout line buffered? +mcon/U/d_normsig.U signal() vs sigset() +mcon/U/d_open3.U Do we have the 3 arguments form for open()? +mcon/U/d_passwd.U Do we have passwd()? +mcon/U/d_pathconf.U Do we have pathconf()? +mcon/U/d_pause.U Do we have pause()? +mcon/U/d_perror.U Do we have perror()? +mcon/U/d_pidcheck.U Is kill(pid, 0) allowed for PID checks? +mcon/U/d_pipe.U Do we have pipe()? +mcon/U/d_poll.U Do we have poll()? +mcon/U/d_popen.U Do we have popen()? +mcon/U/d_portable.U How portable do we want to be? +mcon/U/d_pread.U Do we have pread()? +mcon/U/d_preadv.U Do we have preadv()? +mcon/U/d_psignal.U Do we have psignal()? +mcon/U/d_pwrite.U Do we have pwrite()? +mcon/U/d_pwritev.U Do we have pwritev()? +mcon/U/d_raster.U Is this a Raster Tech machine? +mcon/U/d_rdchk.U Is rdchk() there to check for input? +mcon/U/d_readdir.U Do we have readdir()? +mcon/U/d_readlink.U Do we have readlink()? +mcon/U/d_regcmp.U Do we have regcmp()? +mcon/U/d_rename.U Do we have rename()? +mcon/U/d_rmdir.U Do we have rmdir()? +mcon/U/d_rusage.U Do we have getrusage()? +mcon/U/d_safebcpy.U Can bcopy() handle overlapping blocks? +mcon/U/d_safemcpy.U Can memcpy() handle overlapping blocks? +mcon/U/d_sanemcmp.U Can we compare 8th bit in chars with memcmp()? +mcon/U/d_sbrk.U Do we have sbrk()? +mcon/U/d_scandir.U Do we have scandir()? +mcon/U/d_scannl.U Does scanf() groks '\n' correctly? +mcon/U/d_scorfl.U Keep scoreboards by full name? +mcon/U/d_select.U Do we have select()? +mcon/U/d_sem.U Do we have full sem(2) support? +mcon/U/d_semctl.U Do we have d_semctl()? +mcon/U/d_semget.U Do we have semget()? +mcon/U/d_semop.U Do we have semop()? +mcon/U/d_setegid.U Do we have setegid()? +mcon/U/d_seteuid.U Do we have seteuid()? +mcon/U/d_setgrps.U Do we have setgroups()? +mcon/U/d_setlnbuf.U Do we have setlinebuf()? +mcon/U/d_setlocale.U Do we have setlocale()? +mcon/U/d_setpgid.U Do we have setpgid()? +mcon/U/d_setpgrp.U Do we have setpgrp()? +mcon/U/d_setpgrp2.U Do we have setpgrp2()? (DG/UX) +mcon/U/d_setprior.U Do we have setpriority()? +mcon/U/d_setregid.U Do we have setregid()? +mcon/U/d_setreuid.U Do we have setreuid()? +mcon/U/d_setrgid.U Do we have setrgid()? +mcon/U/d_setruid.U Do we have setruid()? +mcon/U/d_setsid.U Do we have setsid()? +mcon/U/d_sgndchr.U Are chars signed? +mcon/U/d_shm.U Do we have full shm(2) support? +mcon/U/d_shmat.U Do we have shmat()? +mcon/U/d_shmctl.U Do we have shmctl()? +mcon/U/d_shmdt.U Do we have shmdt()? +mcon/U/d_shmget.U Do we have shmget()? +mcon/U/d_sigaction.U Do we have sigaction()? +mcon/U/d_sigblock.U Do we have sigblock()? +mcon/U/d_sighold.U Do we have sighold()? +mcon/U/d_siglist.U Do we have sys_siglist[]? +mcon/U/d_sigsetjmp.U Do we have sigsetjmp()? +mcon/U/d_sigsetmk.U Do we have sigsetmask()? +mcon/U/d_sigvec.U BSD reliable signals supported? +mcon/U/d_sjis2jis.U Do we have sjis2jis()? +mcon/U/d_socket.U BSD socket interface supported? +mcon/U/d_speedopt.U Optimize speed vs memory? +mcon/U/d_stat.U Do we have stat()? +mcon/U/d_statblks.U Does stat know about blksize and blocks? +mcon/U/d_stdstdio.U How standard is stdio? +mcon/U/d_strccmp.U Do we have strcasecmp()? +mcon/U/d_strchr.U Use strchr() or index()? +mcon/U/d_strcoll.U Do we have strcoll()? +mcon/U/d_strcspn.U Do we have strcspn()? +mcon/U/d_strctcpy.U Do we do struct copies? +mcon/U/d_strdup.U Do we have strdup()? +mcon/U/d_strerror.U Do we have strerror()? +mcon/U/d_strftime.U Do we have strftime()? +mcon/U/d_strstr.U Do we have strtr()? +mcon/U/d_strtod.U Do we have strtod()? +mcon/U/d_strtok.U Do we have strtok()? +mcon/U/d_strtol.U Do we have strtol()? +mcon/U/d_strtoul.U Do we have strtoul()? +mcon/U/d_strxfrm.U Do we have strxfrm()? +mcon/U/d_su_chown.U Do we need to be root to do a chown? +mcon/U/d_symlink.U Does symlink() exist? +mcon/U/d_syscall.U Do we have syscall()? +mcon/U/d_sysconf.U Do we have sysconf()? +mcon/U/d_syslog.U Do we have syslog()? +mcon/U/d_system.U Do we have system()? +mcon/U/d_table.U De we have table()? +mcon/U/d_tcgtpgrp.U Do we have tcgetpgrp()? +mcon/U/d_tcstpgrp.U Do we have tcsetpgrp()? +mcon/U/d_time.U Do we have time()? +mcon/U/d_times.U Do we have a times() function? +mcon/U/d_tminsys.U Is struct tm in ? +mcon/U/d_truncate.U Do we have truncate()? +mcon/U/d_tzmin.U Do we use tz_minuteswest? +mcon/U/d_tzname.U Do we have tzname[]? +mcon/U/d_ulimit.U Do we have ulimit()? +mcon/U/d_umask.U Do we have umask()? +mcon/U/d_usendir.U Use our own ndir routines? +mcon/U/d_usleep.U Do we have usleep()? +mcon/U/d_uwait.U Is there a 'union wait' declaration around here? +mcon/U/d_vfork.U vfork() vs fork() +mcon/U/d_voidsig.U How is signal() declared? +mcon/U/d_volatile.U Does our C compiler support "volatile"? +mcon/U/d_vprintf.U Do we have vprintf()? +mcon/U/d_wait3.U Do we have wait3()? +mcon/U/d_wait4.U Do we have wait4()? +mcon/U/d_waitpid.U Do we have waitpid() system call? +mcon/U/d_wcstombs.U Do we have wcstombs()? +mcon/U/d_wctomb.U Do we have wctomb()? +mcon/U/d_wifstat.U Can we safely use WIFEXITED() and friends? +mcon/U/d_xdrs.U Do we have XDR serialization routines? +mcon/U/defeditor.U Find default editor +mcon/U/doublesize.U What is the size of "double"? +mcon/U/ebcdic.U Check for an EBCDIC system +mcon/U/errnolist.U See if we need our own .c to get sys_errnolist[] +mcon/U/etc.U Where administrative executable should go +mcon/U/filexp.U Finds location of filexp made by Filexp.U +mcon/U/floatsize.U What is the size of "float"? +mcon/U/fpostype.U What is the type for file positions? +mcon/U/fpu.U What kind of Sun fpu is in use? +mcon/U/gccvers.U Computes the version of the GCC compiler +mcon/U/gidtype.U What is the type of gids? +mcon/U/groupstype.U What is the type for groups in getgroups()? +mcon/U/h_fcntl.U Do we need to include fcntl.h? +mcon/U/h_sysfile.U Do we need to include sys/file.h? +mcon/U/i_arpainet.U Shall we include ? +mcon/U/i_db.U Shall we include ? +mcon/U/i_dbm.U Shall we include ? +mcon/U/i_dirent.U Shall we include +mcon/U/i_dld.U Shall we include ? +mcon/U/i_dlfcn.U Shall we include ? +mcon/U/i_fcntl.U Shall we include ? +mcon/U/i_float.U Shall we include ? +mcon/U/i_gdbm.U Shall we include ? +mcon/U/i_grp.U Shall we include ? +mcon/U/i_inttypes.U Shall we include ? +mcon/U/i_limits.U Shall we include ? +mcon/U/i_locale.U Shall we include ? +mcon/U/i_malloc.U Shall we include ? +mcon/U/i_math.U Shall we include ? +mcon/U/i_memory.U Shall we include ? +mcon/U/i_ndbm.U Shall we include ? +mcon/U/i_neterrno.U Shall we include ? +mcon/U/i_niin.U Shall we include ? +mcon/U/i_pwd.U Shall we include ? +mcon/U/i_regex.U Shall we include ? +mcon/U/i_sfio.U Shall we include ? +mcon/U/i_stddef.U Shall we include ? +mcon/U/i_stdlib.U Shall we include ? +mcon/U/i_string.U or ? +mcon/U/i_sysdir.U Shall we include ? +mcon/U/i_sysfile.U Do we need ? +mcon/U/i_sysioctl.U Include or ? +mcon/U/i_sysmman.U Do we have to include ? +mcon/U/i_sysndir.U Shall we include ? +mcon/U/i_sysparam.U Shall we include ? +mcon/U/i_sysresrc.U Shall we include ? +mcon/U/i_sysselct.U Shall we include ? +mcon/U/i_syssock.U Shall we include ? +mcon/U/i_sysstat.U Shall we include +mcon/U/i_systable.U De we have to include ? +mcon/U/i_systimeb.U Is struct timeb defined in ? +mcon/U/i_systimes.U Shall we include ? +mcon/U/i_systwgcf.U Shall we include ? +mcon/U/i_systypes.U Do we have to include ? +mcon/U/i_sysun.U Shall we include ? +mcon/U/i_syswait.U Is there a ? +mcon/U/i_termio.U Include or ? +mcon/U/i_time.U Which time.h should we include? +mcon/U/i_unistd.U Include ? +mcon/U/i_utime.U Include ? +mcon/U/i_values.U Shall we include +mcon/U/i_varhdr.U Choose between and +mcon/U/i_vfork.U Include ? +mcon/U/i_whoami.U Include ? +mcon/U/inc.U Where to put public include files? +mcon/U/install.U Look for a BSD-compatible install +mcon/U/intsize.U What is the size of "int"? +mcon/U/ipc.U Choose IPC mechanism +mcon/U/issymlink.U How to test for symlink status from the shell +mcon/U/kernel.U Compute the kernel pathname +mcon/U/lex.U Use lex or flex? +mcon/U/lib.U Where to put public library files ? +mcon/U/libc.U Where is libc? +mcon/U/libdbm.U Look for a suitable dbm library +mcon/U/libflex.U Locate flex library +mcon/U/libnlist.U Locate an nlist library +mcon/U/libnm.U New math library? +mcon/U/libpth.U Set path to locate libraries +mcon/U/libs.U Optional libraries? +mcon/U/libyacc.U Locate yacc library +mcon/U/lintlib.U Where lint library should be placed +mcon/U/lns.U Are symbolic links supported by ln? +mcon/U/locdist.U Find distribution names for news +mcon/U/longsize.U What is the size of "long"? +mcon/U/lseektype.U What is the type of lseek()? +mcon/U/maildir.U Where is mail spooled +mcon/U/mailer.U What delivers mail? +mcon/U/mailfile.U What filename in maildir? +mcon/U/make.U Does make set the $(MAKE) macro? +mcon/U/mallocsrc.U Use malloc included in kit? +mcon/U/man1dir.U Where to put traditional section 1 manpage sources +mcon/U/man3dir.U Where to put traditional section 3 manpage sources +mcon/U/manfmt.U Formatted man directories +mcon/U/mansrc.U Where to put manual pages source +mcon/U/mboxchar.U How to determine if file is mailbox +mcon/U/mkdep.U How to generate makefile dependencies? +mcon/U/models.U Large vs small, split I&D, etc +mcon/U/modetype.U What is the type for file modes? +mcon/U/myhostname.U How to determine hostname from shell +mcon/U/n.U How to suppress newline with echo +mcon/U/nametype.U How to get user's fullname +mcon/U/nblock_io.U Support for non-blocking I/O +mcon/U/newslevel.U What version of news are we running? +mcon/U/newslib.U Where is the news library? +mcon/U/newsspool.U Where is news spooled? +mcon/U/nis.U Do we have to deal with NIS (former YP)? +mcon/U/nlist_pfx.U nlist() related stuff +mcon/U/orderlib.U Shall we order components libraries? +mcon/U/orgname.U What is the organizaton name? +mcon/U/packadmin.U E-mail address of the package administrator +mcon/U/package.U Gets package name from .package magically +mcon/U/pager.U What's the pager, more or less? +mcon/U/patchlevel.U Grab current patchlevel out of patchlevel.h +mcon/U/perlpath.U The full path of perl +mcon/U/pidtype.U What is the type of a PID? +mcon/U/pkgsrc.U Computes the absolute package source directory +mcon/U/prefix.U Installation prefix setting (none, /usr/local) +mcon/U/prefshell.U Preferred user shell +mcon/U/privlib.U Where is the private library? +mcon/U/prototype.U Do we support prototypes? +mcon/U/ptrsize.U What is the size of a pointer? +mcon/U/randbits.U How many bits in rand()? +mcon/U/randfunc.U Which random number function shall we use? +mcon/U/rcs_branch.U Does RCS know about the -b switch? +mcon/U/registers.U How many register declarations to use +mcon/U/rootid.U Root user id +mcon/U/sbrksmart.U Can sbrk() be used to release core? +mcon/U/sbrktype.U What is the return type of sbrk()? +mcon/U/scriptdir.U Where to put public scripts +mcon/U/selecttype.U What type for select() file bitfields? +mcon/U/sh.U Where the shell is located +mcon/U/shm_for.U More shared memory stuff +mcon/U/sig_name.U Signal names +mcon/U/sitearch.U Where user-installed arch-dependant files should go +mcon/U/sitelib.U Where user-installed regular library files should go +mcon/U/sizetype.U What is the type for byte size? +mcon/U/so.U Shared object extension +mcon/U/sockopt.U Check for socket options +mcon/U/spitshell.U Shell comment stripper, maybe +mcon/U/src.U Build and source tree separation support +mcon/U/ssizetype.U What is the signed type for byte size? +mcon/U/startperl.U Do we start perl with #! or what? +mcon/U/startsh.U How to guarantee sh startup +mcon/U/stdchar.U Are chars unsigned in stdio? +mcon/U/sunscanf.U Is this Sun's version of scanf()? +mcon/U/sysman.U Where is the man(1) located? +mcon/U/trnl.U Finds appropriate value for a newline in tr +mcon/U/uidtype.U What is the type of uids? +mcon/U/usenm.U Shall we use the costly nm extraction? +mcon/U/usesocks.U Defines USE_SOCKS when SOCKS is to be used +mcon/U/usrinc.U Where are include files located? +mcon/U/vaproto.U How do we prototype varargs, with ...? +mcon/U/voidflags.U How supported is void? +mcon/U/warnflags.U Any additional cc warning flags? +mcon/U/yacc.U Which compiler-compiler to use? +mcon/configure GNU configure-like wrapper to metaconfig's Configure +mcon/files/ Templates for new units +mcon/files/Internal.U Template for special units with internal symbols +mcon/files/README Why those templates are here... +mcon/files/d_function.U Template for C defines +mcon/files/dir.U Template to get a directory +mcon/files/file.U Template get a file +mcon/files/i_include.U Template for include files +mcon/files/keyword.U Template for keyword checking +mcon/files/locate.U Template to locate a file +mcon/files/question.U Template for setvar questions +mcon/files/rcshead.U Template for unit head +mcon/files/shell.U Template for non-setvar questions +mcon/files/type.U Template for type lookup +mcon/makegloss.SH Extracts Glossary from Unit files +mcon/man/ Manual pages for metaconfig et al. +mcon/man/Jmakefile Generic makefile description for manual pages +mcon/man/Makefile.SH Jmake-generated makefile for manual pages +mcon/man/mconfig.SH Manual page for metaconfig +mcon/man/mlint.SH Manual page for metalint +mcon/man/mxref.SH Manual page for metaxref +mcon/mconfig.SH Writes Configure scripts for you +mcon/mlint.SH Lints metaconfig units +mcon/mxref.SH Builds symbol cross-reference files +mcon/pl/ Perl library for metaconfig et al. +mcon/pl/common.pl Common control lines extraction +mcon/pl/configure.pl Generates Configure +mcon/pl/cosmetic.pl Some cosmetic fixes +mcon/pl/depend.pl Metaconfig-only dependencies +mcon/pl/eval.pl Built-in interpreter +mcon/pl/extract.pl Dependency extractor engine +mcon/pl/files.pl Extracts files from MANIFEST.new +mcon/pl/gensym.pl Dynamic symbol generator +mcon/pl/init.pl Initialization of dependency control array +mcon/pl/lint.pl Lint-only dependencies +mcon/pl/locate.pl Locate units +mcon/pl/makefile.pl Builds temporary Makefiles +mcon/pl/obsolete.pl Deals with obsolete symbols +mcon/pl/order.pl Re-order units within Configure +mcon/pl/tsort.pl Topological sort +mcon/pl/wanted.pl Set up Wanted file +mcon/pl/xref.pl Metaxref-only dependencies +mcon/pl/xwant.pl Metaxref symbol extraction +pat/ Where patching tools are stored +pat/Jmakefile High level makefile description for pat +pat/Makefile.SH Makefile for pat tools +pat/README Instructions for patch/developping tools +pat/pat.SH Check in, do diffs, make patch, send it +pat/pat.man Manual page for patch tools +pat/patbase.SH To set the base for future differences +pat/patchlevel.h Prototypical patchlevel.h +pat/patcil.SH Check in the latest changes +pat/patclean.SH Check in latest changes and remove files +pat/patcol.SH Check out working file +pat/patdiff.SH Find the differences since last patch +pat/patftp.SH Put patches in ftp pub directory +pat/patindex.SH Create an index of patches sent out +pat/patlog.SH Handles the ChangeLog file +pat/patmake.SH Put together a patch file +pat/patname.SH Assign symbolic name to a revision +pat/patnotify.SH Notifies that new patches have been released +pat/patpost.SH Send patches via news +pat/patsend.SH Sends patches via mail +pat/patsnap.SH Builds RCS snapshot file +patchlevel.h The current patchlevel for dist +pl/ Directory for public perl libraries +pl/comment.pl Perl library to find comment in front of $Log +pl/copyright.pl Perl library to expand copyright +pl/editor.pl Perl library to compute suitable editor name +pl/fullname.pl Perl library to get full name +pl/listedit.pl Perl library to edit list of items +pl/logname.pl Perl library to get login name +pl/makedir.pl Perl library to emulate 'mkdir -p' +pl/manifake.pl Perl library to build a MANIFEST.new if none found +pl/newer.pl Perl library to Find files newer than patchlevel.h +pl/package.pl Perl library to read .package +pl/patseq.pl Perl library to compute issued patch sequence +pl/profile.pl Perl library to get ~/.dist_profile +pl/rangeargs.pl Perl library to expand number lists +pl/rcsargs.pl Perl library to expand rcs filename lists +pl/snapshot.pl Perl library to parse RCS snapshot file +pl/tilde.pl Perl library to perform ~name expansion +pl/users.pl Perl library to parse users file diff --git a/Makefile.SH b/Makefile.SH new file mode 100755 index 0000000..2b54336 --- /dev/null +++ b/Makefile.SH @@ -0,0 +1,218 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL55] +: $X-Id: Jmake.tmpl,v 3.0.1.2 1995/01/11 14:50:21 ram Exp ram $ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=. +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.3 1995/03/21 08:35:28 ram Exp ram $ +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.2 1995/07/25 13:29:41 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.2 1995/07/25 13:29:41 ram +# patch56: re-ordered macros, moving the install at the end +# +# Revision 3.0.1.1 1994/01/24 13:42:41 ram +# patch16: added dependency generation stage +# +# Revision 3.0 1993/08/18 12:03:53 ram +# Baseline for dist 3.0 netwide release. +# + +all:: + +depend:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in bin mcon pat jmake kit ;\ + do \ + (cd $$i ; echo "Depending" "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) depend); \ + done + +local_clobber:: + $(RM) install + +install.man:: dist.man + $(INSTALL) -c -m 444 dist.man $(MANSRC)/dist.$(L) + +deinstall.man:: + $(RM) $(MANSRC)/dist.$(L) + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: sub_clean local_clean +realclean: sub_realclean local_realclean +clobber: sub_clobber local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + $(RM) -r UU + +local_clobber:: local_realclean + $(RM) config.sh config.h + $(RM) -r .config + $(RM) Makefile + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Rules for building in sub-directories -- do not edit + +subdirs: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)); \ + done + +install:: + @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= + +deinstall:: + @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= + +install.man:: + @$(MAKE) subdirs TARGET=install.man VERB="Installing man pages" FLAGS= + +deinstall.man:: + @$(MAKE) subdirs TARGET=deinstall.man VERB="Deinstalling man pages" FLAGS= + +sub_clean:: + @$(MAKE) subdirs TARGET=clean VERB="Cleaning" FLAGS= + @echo "Back to $(CURRENT) for "clean... + +sub_realclean:: + @$(MAKE) subdirs TARGET=realclean VERB="Real cleaning" FLAGS= + @echo "Back to $(CURRENT) for "realclean... + +sub_clobber:: + @$(MAKE) subdirs TARGET=clobber VERB="Clobbering" FLAGS= + @echo "Back to $(CURRENT) for "clobber... + +tag:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo "Tagging" "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) tag); \ + done + +Makefiles:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + echo "Making "Makefiles" in $(DIR)$$i..."; \ + (cd $$i || exit 1; \ + if test ! -f Makefile; then /bin/sh Makefile.SH; fi; \ + $(MAKE) $(MFLAGS) Makefiles) \ + done + +Makefiles.SH:: Makefile.SH + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + case "$(DIR)$$i/" in \ + */*/*/*/) newtop=../../../..;; \ + */*/*/) newtop=../../..;; \ + */*/) newtop=../..;; \ + */) newtop=..;; \ + esac; \ + case "$(TOP)" in \ + /*) newtop="$(TOP)" ;; \ + esac; \ + echo "Making Makefiles.SH in $(DIR)$$i..."; \ + (cd $$i || exit 1; $(MAKE) $(MFLAGS) -f ../Makefile \ + Makefile TOP=$$newtop CURRENT=$(DIR)$$i;\ + $(MAKE) $(MFLAGS) Makefiles.SH) \ + done + +all:: + @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= + +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/README b/README new file mode 100644 index 0000000..4f31741 --- /dev/null +++ b/README @@ -0,0 +1,138 @@ + dist 4.0 + ** Alpha version ** + + Copyright (c) 1988, Larry Wall + Copyright (c) 1990-1992, Harlan Stenn + Copyright (c) 1991-1997, Raphael Manfredi + Copyright (c) 2004-2005, Raphael Manfredi + +------------------------------------------------------------------------ + This program is free software; you can redistribute it and/or modify + it under the terms of the Artistic License, a copy of which can be + found with this package. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + Artistic License for more details. +------------------------------------------------------------------------ + +This version of dist requires you to have at least perl 4.0 PL36. +It has also been ported to work with perl 5.0 PL0, provided you have +at least integrated patches 0a-0h, issued by Andy Dougherty and made +available at the following ftp sites: + + ftp.demon.co.uk:/pub/perl/db/perl5.000-p0a-p0h.tar.gz + ftp.funet.fi:/pub/languages/perl/ports/perl5/perl5.000-p0a-p0h.tar.gz + +Please read all the directions below before you proceed any further, and +then follow them carefully. + +After you have unpacked your kit, you should have all the files listed +in MANIFEST. + +======================================================================== + It's not the way I wrote it, but the + way you play it makes it sound a lot better. + -- Camille Saint-Saens (French composer) + +The dist package consists of four parts: + + 1) The Configure generator (metaconfig) and its supporting files. + 2) The distribution kit maker (makedist) and its supporting files. + 3) The patch distribution system (pat*) and its supporting files. + 4) The Makefile generator (jmake) and its supporting files. + +Each of these can be used separately from the others. Before you can +use any of those, however, the directory containing your package (not this +package) must be initialized by putting a .package file into it. This +can be done by running packinit in that directory. + +There is a mailing list hosted in Japan and set up by Shigeya Suzuki +, for discussion about the dist package as a +whole. It's a good place to ask questions (or answer them) and to +send your patches. I will post official patches to the net, as well +as to the dist-users list. + +To send a mail to the list, address it to . +To subscribe, send a mail to . If you don't +know how to use majordomo, the syntax of the subscribe command is: + + subscribe dist-users [address] + +where the address part is optional. You may unsubscribe automatically +at any time by sending: + + unsubscribe dist-users + +If you have a problem with this version of dist, it is recommended that +you subscribe to the list, then send a description of your problem to it. +If you send mail to me personally, I may not be able to answer in a +timely fashion. + +This mailing list has low traffic (a few articles per week, typically), +and it is expected to remain so, with a high signal/noise ratio. + +Notes: + + If you are running on a system with <= 14 char filenames, don't + distribute any files with filenames longer than 12 chars (with the + exception of patchlevel.h), so that there will be room for a + 2-digit extension indicating patch number in your bugs direcory. + This includes .SH files, so any shell script built by a .SH file + should be 9 characters or less. On systems with flexfilenames you + don't have to worry about it. + + This package has been designed on top of dist 2.0, which has been + written by Larry Wall . +======================================================================== + +INSTALLATION + +1) Run Configure. This will figure out various things about your +system. After it has completed, it will produce config.h and config.sh. + +You might possibly have to trim # comments from the front of Configure +if your shell doesn't handle them, but all other comments will be taken +care of. + +2) Run make. + +3) If make succeeded, you may wish to do "make install install.man". Be +sure your rights are correct (if you install manual pages, you may need +super-user privileges). By not running "make install.man", you avoid the +installation of the manual pages. + +4) Read the manual entry before running. + +5) IMPORTANT! Communicate any problem and suggested patches to me, +ram@hptnos02.grenoble.hp.com (Raphael Manfredi), so we can keep this +distribution in sync. If you have a problem, there will be someone else +who had it or will have it too... + +If possible, send me patches such that the patch program will apply +them. Context diffs are the best, then normal diffs. Do not send ed +scripts, I have probably changed my copy since the version you got. + +6) After everything is installed, you can do make clobber. This will +clean up everything and let you re-distribute this kit, without +carrying useless files. You should keep this distribution intact, so +that future patches will be applyable. + +7) I have an automatic patch sender. Send me the following mail: + + Subject: Command + @SH mailhelp PATH + +and you'll get instructions (PATH stands for YOUR e-mail address, either +in INTERNET or in bang notation). I would recommend you to get all the +issued patches before you start making some modifications on this +package. + +8) If you wish to deinstall the package, you may run "make deinstall". +A separate "make deinstall.man" will remove the manual pages. Be sure +the makefiles are correctly set before running any deinstall target. +On USG systems, some executable have a chance to remain despite the +deinstall (text file busy...). + + Raphael Manfredi diff --git a/Wishlist b/Wishlist new file mode 100644 index 0000000..81bbb8c --- /dev/null +++ b/Wishlist @@ -0,0 +1,60 @@ +*** List of wishes for dist version 3.0 *** + +======================================================================= +If you wish to implement one of the following, you're welcome :-). In +that case, please let me know about it. I will probably integrate your +changes in my version (after some sanity checks, because I can't +maintain something I don't understand). + +This list has no priority order whatsoever, so you may pick up one of +the following suggestion and start working on it. In that case, you +may want to get all the official patches for dist 3.0 first and make +sure nobody is already working on that topic. +======================================================================= + +*** jmake + +Make the names used more uniform. For instance, 'Simple' appears in +many rules, but with different meanings, thus making the Jmakefile +harder to understand at a first glance. + +Allow per-system compilation rules, so that objects and source file +do not inter-mix but are kept in separate directories. + +*** metaconfig + +Write some "generic" templates for writing new units, so that the user +only needs to fill up some fields. For instance, there could be a +template for d_* and i_* units. [That's done, they are under mcon/files. +Now I only need to write the generator on top of them] + +Make Configure know about cross-compiling. + +Make Configure know about VPATH for separate object directory, with +proper support from jmake. + +Implement the ?I: and ?L: lines. The ?I: fills in inclwanted for you, +while ?L: fills in the libswanted variable. For instance, when using +a socket() call, one may need to look at -lbsd. If d_socket.U lists +'bsd' within its ?L: line, then the libswanted variable will be +correctly set. [Note: there are some hooks for this already] + +Build a library of PD routines that may be otherwise missing on +some older systems, eg: getopt(). Those routines will be automagically +added to the package by relying on ?P: lines, something like: + + ?P:getopt (HAS_GETOPT): getopt.c + +which would include getopt.c in the package (under some PD dir) +when getopt is used and HAS_GETOPT is *not* used within the sources, +in order to achieve transparent implementation. + +*** metalint + +Process '@' pre-processor lines, and signal mismatches, unrecognized +commands, etc... Also warn when testing wantedness of unknown symbols +or obsolete ones, etc... + +*** pat tools + +Clean that stuff. diff --git a/bin/Jmakefile b/bin/Jmakefile new file mode 100644 index 0000000..795cb7b --- /dev/null +++ b/bin/Jmakefile @@ -0,0 +1,45 @@ +/* + * Jmakefile for bin subdirectory. + */ + +;# $Id: Jmakefile,v 3.0.1.1 1994/01/24 13:42:53 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.1 1994/01/24 13:42:53 ram +;# patch16: added dependency generation stage +;# +;# Revision 3.0 1993/08/18 12:04:00 ram +;# Baseline for dist 3.0 netwide release. +;# + +BINPL = packinit manilist +BIN = manicheck $(BINPL) + +ShellScriptTarget($(BIN)) + +BINSH = \ +|expand f!$(BINPL)! + !f.SH \ +-expand \\ + +>SED +>RM +>MKDEP + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(BINSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>[ ]*\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + diff --git a/bin/Makefile.SH b/bin/Makefile.SH new file mode 100755 index 0000000..977ce80 --- /dev/null +++ b/bin/Makefile.SH @@ -0,0 +1,216 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL44] +: $X-Id: Jmake.tmpl,v 3.0.1.1 1993/08/20 07:36:36 ram Exp ram $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=bin +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.1 1994/10/29 15:46:30 ram Exp ram $ + +######################################################################## +# Force 'make depend' to be performed first -- do not edit + +.FORCE_DEPEND:: + +all:: .FORCE_DEPEND + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.1 1994/01/24 13:42:53 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.1 1994/01/24 13:42:53 ram +# patch16: added dependency generation stage +# +# Revision 3.0 1993/08/18 12:04:00 ram +# Baseline for dist 3.0 netwide release. +# + +BINPL = packinit manilist +BIN = manicheck $(BINPL) + +all:: $(BIN) + +local_realclean:: + $(RM) $(BIN) + +manicheck: manicheck.SH + /bin/sh manicheck.SH + +packinit: packinit.SH + /bin/sh packinit.SH + +manilist: manilist.SH + /bin/sh manilist.SH + + +install:: $(SCRIPTS) $(LSCRIPTS) + @for file in $(SCRIPTS) $(LSCRIPTS); do \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(INSTALL) -c -m 555 $$file $(SCRIPTDIR)); \ + done + +deinstall:: + @for file in $(SCRIPTS) $(LSCRIPTS); do \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(RM) $(SCRIPTDIR)/$$file); \ + done + +install.man:: + @if test "$(MANSRC)"; then \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for file in $(SCRIPTS); do \ + (set -x; \ + $(INSTALL) -c -m 444 $$file.man $(MANSRC)/$$file.$(L)); \ + done; \ + else exit 0; fi + +deinstall.man:: + @if test "$(MANSRC)"; then \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for file in $(SCRIPTS); do \ + (set -x; $(RM) $(MANSRC)/$$file.$(L)); \ + done; \ + else exit 0; fi + +BINSH = \ + packinit.SH \ + manilist.SH + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(BINSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>[ ]*\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +install:: + @echo "install in $(CURRENT) done." + +deinstall:: + @echo "deinstall in $(CURRENT) done." + +install.man:: + @echo "install.man in $(CURRENT) done." + +deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +######################################################################## +# Dependencies generated by make depend +# DO NOT DELETE THIS LINE -- make depend relies on it + +# Put nothing here or make depend will gobble it up +.FORCE_DEPEND:: + @echo "You must run 'make depend' in $(TOP) first."; exit 1 +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/bin/manicheck.SH b/bin/manicheck.SH new file mode 100755 index 0000000..a2ea9dd --- /dev/null +++ b/bin/manicheck.SH @@ -0,0 +1,82 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting bin/manicheck (with variable substitutions)" +$spitshell >manicheck <>manicheck <<'!NO!SUBS!' +# $Id$ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# Original Author: Harlan Stenn +# +# $Log: manicheck.SH,v $ +# Revision 3.0.1.1 1993/08/19 06:41:51 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:04:02 ram +# Baseline for dist 3.0 netwide release. +# + +find . ! -type d -print | sed -e ' +s|^./|| +/RCS\//d +/UU\//d +/core$/d +/\.bak$/d +/\.orig$/d +' | sort > check.present + +manifest='' +if test -r MANIFEST.new; then + manifest='MANIFEST.new' +else + if test -r MANIFEST; then + manifest='MANIFEST' + else + echo "No MANIFEST.new or MANIFEST file--don't know what to look for." + fi +fi + +awk '{print $1}' $manifest | sort > check.expected + +comm -23 check.expected check.present > check.want +comm -13 check.expected check.present > check.extra + +rm -f check.expected check.present + +if test -s check.want; then + echo "Some files listed in $manifest are missing; see check.want." +else + rm check.want +fi + +if test -s check.extra; then + echo "Some files not listed in $manifest are present; see check.extra." +else + rm check.extra +fi +!NO!SUBS! +chmod 755 manicheck +$eunicefix manicheck diff --git a/bin/manicheck.man b/bin/manicheck.man new file mode 100644 index 0000000..e17352a --- /dev/null +++ b/bin/manicheck.man @@ -0,0 +1,51 @@ +''' $Id: manicheck.man,v 3.0 1993/08/18 12:04:02 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: manicheck.man,v $ +''' Revision 3.0 1993/08/18 12:04:02 ram +''' Baseline for dist 3.0 netwide release. +''' +''' +.TH MANICHECK 1 ram +.SH NAME +manicheck \- check manifest accuracy +.SH SYNOPSIS +.B manicheck +.SH DESCRIPTION +.I Manicheck +compares the files listed in your MANIFEST.new (or MANIFEST if that file +is not present) with the files within your distribution. It will report +files listed in the manifest but not present or files missing from your +manifest file. +.SH FILES +.I Manicheck +produces the following temporary files: +.TP 20 +.PD 0 +check.expected +lists filenames from manifest +.TP +check.present +lists all potential source files +.PD +.PP +If MANIFEST is not 100% accurate, the following files may be created: +.TP 20 +.PD 0 +check.extra +files not listed in manifest +.TP +check.want +files missing from manifest +.PD +.SH AUTHOR +Harlan Stenn +.SH "SEE ALSO" +manifake(1), makedist(1), manilist(1). diff --git a/bin/manilist.SH b/bin/manilist.SH new file mode 100755 index 0000000..75dd073 --- /dev/null +++ b/bin/manilist.SH @@ -0,0 +1,484 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting bin/manilist (with variable substitutions)" +$spitshell >manilist <>manilist <<'!NO!SUBS!' + +# This script scans the MANIFEST.new file and builds some reports. + +# The output can be somewhat changed to produce other kind of reports. +# The format is specified with a leading set of activation character, followed +# by a ':', and then a set of formatting macros. The leading characters tell +# when a report line shall be issued: +# a: all files (shortcut for 'ix') +# A: all files but the excluded ones +# f: report for files only +# d: report for directories only +# m: report for files/directories found in the MANIFEST.new +# n: report for files/directories not found in the MANIFEST.new +# i: included files are listed +# x: excluded files are listed +# Then a set of macros introduced by %: +# %c: the leading one character code defined as follows: +# . if the file is up to date (i.e. not newer than patchlevel.h) +# - if the file is present in the manifest but is missing +# > if the file has changed since last patch. +# + if the file is not present in the manifest but exists +# o if the file is not listed but exists and is older than patchlevel.h +# x if the file in manifest and exists but was excluded +# ? if the file in manifest but was excluded and does not exist +# %n: the name of the file (its path from the top directory) +# %t: time stamp of last modification +# %d: description from MANIFEST.new file, if any +# %s: size of the file, in bytes + +$format = 'A:%c %n'; + +# By default, only the source files whith the following extensions are reported +# (but a -a option will report ALL the files, and a -i option can specify some +# other extensions as well). +# .sh .SH .c .h .l .y .man + +@include = ('.sh', '.SH', '.c', '.h', '.l', '.y', '.man'); + +# By default, the following extensions are excluded from the list. More +# exclusions can be added with the -x option: +# ^core .o .bak .rej .new .old .orig ,v + +@exclude = ('^core', '.o', '.bak', '.rej', '.new', '.old', '.orig', ',v'); + +# The column separator character (or string) is used to separate each formatted +# column on the output. Formatting is requested by adding a '|' character in +# the format string. A new separator can be specified via the -C option. +# The maximum column size is fixed by the -L. + +$col_separator = ' '; +$col_size = ''; + +&profile; # Read ~/.dist_profile +require 'getopts.pl'; +require 'stat.pl'; +&usage unless &Getopts('abcdhntVi:f:p:s:w:x:C:L:I:X:'); + +&usage if $opt_h; +if ($opt_V) { + print "manilist $version PL$pl\n"; + exit 0; +} + +# Go to the top of the package, and update any file name given as argument +# by prepending the needed path. The process then performs a chdir to the +# top. +unless ($opt_b) { + chop($pwd = `pwd`) unless -f '.package'; + until (-f '.package') { + die "No .package file! Run packinit.\n" unless $pwd; + chdir '..' || die "Can't cd ..\n"; + $pwd =~ s|(.*)/(.*)|$1|; + $prefix = $2 . '/' . $prefix; + } + if ($prefix) { + for (@ARGV) { + s/^\.$/$prefix/ && next; + s/^/$prefix/ unless m|^[-/]|; + } + } +} + +# We now are at the top level + +# Build up the file hierarchy filter in @filter +foreach $entry (@ARGV) { + $entry =~ s|/$||; # Remove final / in directory names + if (-d $entry) { + push(@filter, "d:$entry"); + } elsif (-f $entry) { + push(@filter, "f:$entry"); + } else { + die "$entry: No such file or directory.\n"; + } +} + +$prefix = '.' unless $prefix; +($top = $prefix) =~ s|/$||; +$top = '.' if $opt_t; # Start from top, not from original dir +@ARGV = ($top) unless @ARGV; + +if ($opt_n) { # "manifest" files are found by scanning the directory + open(MANIFEST, "find @ARGV -print|") || die "Can't run find: $!\n"; + while () { + chop; + s|^./||; + push(@manifest, $_); + } + close MANIFEST; +} else { + $MANIFEST = $opt_f; + $MANIFEST = 'MANIFEST.new' unless $opt_f; + open(MANIFEST, $MANIFEST) || die "Can't open $MANIFEST: $!\n"; + while () { + chop; + s|^./||; + s|^(\S+)||; + local($name) = $1; + push(@manifest, $name); + m|^\s+(\d+)*\s*(.*)| && ($comment{$name} = $2); + } + close MANIFEST; +} + +# If we have to compare the files in the MANIFEST with the actual files on +# the file system, then grab them... +if ($opt_c && !$opt_n) { + open(FILES, "find @ARGV -print|") || die "Can't run find: $!\n"; + while () { + chop; + s|^./||; + push(@files, $_); + } + close FILES; +} + +# If there is a patchlevel.h file, get its time stamp. +$pl_mtime = 0; +$pl_mtime = (stat('patchlevel.h'))[$ST_MTIME] if -f 'patchlevel.h'; + +# Dealing with command-line options +$format = $opt_p if $opt_p; +$col_separator = $opt_C if $opt_C; +$col_size = $opt_L if $opt_L; +unless ($opt_p) { # -p may be used as a shortcut for -w and -s + local($which) = ($format =~ /^(\w+):/); + local($string) = ($format =~ /^\w+:(.*)/); + $which = $opt_w if $opt_w; + $string = $opt_s if $opt_s; + $format = "$which:$string"; +} +@include = split(' ', $opt_I) if $opt_I; # First reset included with -I +@exclude = split(' ', $opt_X) if $opt_X; # and excluded with -X +push(@include, split(' ', $opt_i)) if $opt_i; # before applying additions +push(@exclude, split(' ', $opt_x)) if $opt_x; +&mode_opt; # Compute $mode_xxx variables +&init_functions; # Compile &included and &excluded + +# Option -d requests dumping of inclusion and exclusion lists on stderr +if ($opt_d) { + print STDERR "Included: ", join(' ', @include), "\n"; + print STDERR "Excluded: ", join(' ', @exclude), "\n"; +} + +@manifest = sort @manifest; +@files = sort @files if defined(@files); + +# Build up the %manifest array so that we quickly know whether a file is in the +# manifest or not. +foreach (@manifest) { + ++$manifest{$_}; +} + +# Now loop other the files held in @manifest and perform your job... +foreach $mani (@manifest) { + if ($opt_c && !$opt_n) { # Check MANIFEST with actual files on disk + for (;;) { + $disk = $files[0]; # Next file coming up + last unless $disk; + last if $disk gt $mani; # Past the current point + shift(@files); # Remove the file from list + last if $disk eq $mani; # Reached the manifest point + # This means the file is before the current MANIFEST point + &report($disk); # File exists and not in MANIFEST + } + } + &report($mani); +} + +&flush_report; # Flush the @Report array if formatting is needed + +# Print usage and exit with a non-zero status +sub usage { + print STDERR < $pl_mtime; + $c_macro = 'x' if &excluded($file); + } else { + $c_macro = '-'; + $c_macro = '?' if &excluded($file); + } + } else { # File not in MANIFEST + if (-e $file) { # And file exists + $c_macro = $mtime < $pl_mtime ? 'o' : '+'; + } else { + return if -l $file; + warn "$file seems to have been removed...\n"; + } + } + + # Perform the macro substitution + $fmt =~ s/%%/\0/g; # Escape %% + $fmt =~ s/%/\01/g; # Transform %, in case substitution add some + $fmt =~ s/\01c/$c_macro/g; # %c is the code + $fmt =~ s/\01n/$file/g; # %n is the file name + $fmt =~ s/\01t/&fstamp/ge; # %t is the time stamp + $fmt =~ s/\01s/&fsize/ge; # %s is the file size, in bytes + $fmt =~ s/\01d/&mdesc/ge; # %d is the manifest description + $fmt =~ s/\01/%/g; # All other %'s are left undisturbed + + print "$fmt\n" unless $postproc; + push(@Report, $fmt) if $postproc; +} + +# Format and flush report on stdout. Columns are aligned on what was originally +# a '|' character in the format string, translated into a ^B by the reporting +# routine. +sub flush_report { + return unless @Report; # Early return if nothing to be done + local(@length); # Stores maximum length for each field + local(@max); # Maximum allowed column sizes + local($i); + local($report); + local($len); + local(@fields); + @max = split(',', $col_size); + foreach $report (@Report) { # First pass: compute fields lengths + $i = 0; + foreach (split(/\02/, $report)) { + $len = length($_); + $length[$i] = $length[$i] < $len ? $len : $length[$i]; + $i++; + } + } + for ($i = 0; $i < @length; $i++) { # Adapt to maximum specified length + $length[$i] = $max[$i] if $max[$i] > 0 && $length[$i] > $max[$i]; + } + foreach $report (@Report) { # Second pass: formats each line + @fields = split(/\02/, $report); + $i = 0; + foreach (@fields) { + $len = length($_); + if ($max[$i] > 0 && $len > $max[$i]) { + $_ = substr($_, 0, $max[$i]); # Truncate field + } else { + $_ .= ' ' x ($length[$i] - $len); # Pad with blanks + } + $i++; + } + print join($col_separator, @fields), "\n"; + } +} + +# The following macro subsitution functions are called with $file set + +# Return the modification time on file +sub fstamp { + (stat($file))[$ST_MTIME]; +} + +# Return the file size, in bytes +sub fsize { + (stat($file))[$ST_SIZE]; +} + +# Return the description from the MANIFEST file, if any +sub mdesc { + return '' unless defined $comment{$file}; + $comment{$file}; +} + +# Do we have to report informations on the specified file? +sub report_wanted { + return 1 unless @filter; + local($file) = @_; + local($filter); + foreach (@filter) { + $filter = $_; # Work on a copy + if ($filter =~ s/^d://) { + return 1 if $file =~ m|^$filter(/[^/]*)*|; + } else { + $filter =~ s/^f://; + return 1 if $filter eq $file; + } + } + return 0; +} + +# Build up the 'included' and 'excluded' functions which return true if a file +# is in the include or exclude set. +sub init_functions { + &build_function('included', *include, 1); + &build_function('excluded', *exclude, 0); +} + +# Build a function which returns true if a given name is found in the array +# list of regular expression. Each regular expression is applied on the file +# name, anchored at the end. False is returned only if none of the expressions +# match. The purpose of building such a function dynamically is to avoid the +# costly pattern recompilation every time. +sub build_function { + local($name) = shift(@_); # The name of the function to be built + local(*array) = shift(@_); # The extension array we have to check with + local($dflt) = shift(@_); # Default value when -a is used + local($fn) = &q(<> manilist +$grep -v '^;#' ../pl/profile.pl >> manilist +chmod 755 manilist +$eunicefix manilist diff --git a/bin/manilist.man b/bin/manilist.man new file mode 100644 index 0000000..f7dcd0d --- /dev/null +++ b/bin/manilist.man @@ -0,0 +1,332 @@ +''' $Id: manilist.man,v 3.0.1.3 1995/05/12 11:57:31 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: manilist.man,v $ +''' Revision 3.0.1.3 1995/05/12 11:57:31 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0.1.2 1994/01/24 13:52:55 ram +''' patch16: typo fix +''' +''' Revision 3.0.1.1 1993/08/24 12:11:02 ram +''' patch3: typo fix +''' +''' Revision 3.0 1993/08/18 12:04:04 ram +''' Baseline for dist 3.0 netwide release. +''' +''' +.TH MANILIST 1 ram +.SH NAME +manilist \- report status of files in a source directory +.SH SYNOPSIS +.B manilist +[ +.B \-abcdhnptV +] [ +.B \-i +.I extension +] [ +.B \-f +.I manifest +] [ +.B \-p +.I format +] [ +.B \-s +.I string +] [ +.B \-w +.I which +] [ +.B \-x +.I extension +] [ +.B \-C +.I separator +] [ +.B \-I +.I included +] [ +.B \-L +.I colsize +] [ +.B \-X +.I excluded +] [ +.I files or directories +] +.SH DESCRIPTION +.I Manilist +scans a source directory and produces a report on the status of each file: +whether it is up-to-date or not with respect to +.I patchlevel.h , +if it is missing from MANIFEST.new, and some other useful information which +may be dynamically configured. It can be use to maintain a MANIFEST.new file, +produce a detailed listing and status of a group of directories, etc... The +rich set of options concur to make \fImanilist\fR a perfect low-level tool. +.PP +Under its simplest invocation form at the top level directory of a package, +with no arguments, \fImanilist\fR will scan the MANIFEST.new and produce +a report on the status of each file listed there. Each line starts with a +single character flag which indicates the state of the file, followed by the +name of the file. +.PP +What happens in fact is more complex than that. \fIManilist\fR scans the +MANIFEST.new file and then loops over all the files listed there. Internally, +\fImanilist\fR maintains an inclusion and an exclusion list, both specifying +extensions for files. For instance, the inclusion list could be ('.c', '.h') +and the exclusion ('.o', ',v') so that C sources are included and object +or RCS files excluded. By default, all files but those excluded are used. +Some other selections may be applied at this stage, as will be explained later +on. For those files which pass this selection process, a report is issued +according to a report \fIformat\fR, which by default is "\fIA:%c %n\fR". +The letter \fIA\fR (or anything before the initial ':' character is the +file selection specification we've been talking about. The remaining is the +formatting, a string which is printed as-is, modulo some escape sequences. +It so happens that \fI%c\fR is the character flag and \fI%n\fR is the name +of the current file. +.PP +Generally speaking, \fImanilist\fR should be regarded as a tool which emits +configurable reports on a set of files, selectively picking them among a list +or by directly scanning the directories to see what's out there... +.PP +By specifying a set of directories or files as arguments on the command line, +you restrict the scanning area, limiting to reports concerning those files +or directories. If you do not specify any, manilist restricts its report to +the current directory and its subdirectories, unless the \fB\-t\fR option is +given. +.SH OPTIONS +.I Manilist +recognizes the following options: +.TP 15 +.B \-a +Make a report for \fIall\fR the files, regardless of what is specified by +the \fIincluded\fR and \fIexcluded\fR suffix lists. +.TP +.B \-b +Assume current directory is the base (root) of the package tree. When this +option is not specified, \fImanilist\fR will look for a \fI.package\fR file +to indicate the root directory of the package (also called the top) and +complain if it does not find it. +.TP +.B \-c +Check files against those listed in MANIFEST.new (or whatever file specified +via the \fB\-f\fR option) and report discrepancies via the \fI%c\fR macro. +.TP +.B \-d +Dump included and excluded suffix lists on stderr, extensions being space +separated. A good way to know the default lists is to run: \fImanilist +\-f /dev/null \-bd. +.TP +.B \-f\fI manifest +Specify an alternate manifest file, the default being to use MANIFEST.new. +.TP +.B \-h +Print the usage help message and exit. +.TP +.B \-i\fI extensions +Add new extensions to the included suffix list. The \fIextensions\fR argument +must list the suffixes separated by spaces, as in \fB\-i\fI '.ph .pl'\fR to add +both \fI.ph\fR and \fI.pl\fR to the existing suffixes. Note that the argument +needs to be quoted to protect spaces against shell interpretation. +.TP +.B \-n +Do not use any manifest file. Rather scan the directories and act as with all +the files there were already listed in a manifest. +.TP +.B \-p\fI format +Set the new printing format, which has the form \fIselection\fR:\fIstring\fR, +with \fIselection\fR being a list of single letters specifying which files +from the manifest are to be used for reports, and \fIstring\fR being a +message to print as report, with some macro substitutions. It is also possible +to have column formatting by specifying a '|' inside the string to delimit +the different columns you wish to see. See also \fB\-C\fR and \fB\-L\fR for +more formatting parameters. +.TP +.B \-s\fI string +Specify the \fIstring\fR part of the printing format (see \fB\-p\fR for a +general description of the \fIformat\fR). Available macros are listed further +down the manual page. +.TP +.B \-t +Start from the top directory (the root directory of the distribution) regardless +of the current directory. There must be a \fI.package\fR file to indicate +what the top directory is. +.TP +.B \-w\fI selection +Specifiy the \fIselection\fR part of the printing format. Available selections +will be discussed later. +.TP +.B \-x\fI extensions +Add new extensions to the excluded suffix list. The \fIextensions\fR argument +must list the suffixes separated by spaces, as in \fB\-x\fI '.s .p'\fR to add +both \fI.s\fR and \fI.p\fR to the existing list. Note that the argument +needs to be quoted to protect spaces against shell interpretation. +.TP +.B \-C\fI separator +Give the column separator, which is to be used in place of the '|' character +in the report format string. By default, it is a single space. +.TP +.B \-I\fI included +Specify a new list of suffixes to be included in the reports. This overrides +the original default list (whereas \fB\-i\fR is used to \fIadd\fR suffixes to +the list). Suffixes must be space separated. +.TP +.B \-L\fI colsize +When using column formatting (the '|' character being used to denote columns), +this option may be used to specify the maximum column width, separating each +width by a single ','. Leaving a width unspecified does not impose any limit +on its width. For instance, if the format string is \fI%n|%d|%t\fR, one could +limit the middle column (descriptions from MANIFEST.new) to 40 characters and +the name column (first one) to 15 characters, leaving the last one with no +imposed limits, by using \fB\-L\fI 15,40,\fR. +.TP +.B \-V +Print version number and exit. +.TP +.B \-X\fI excluded +Specify a new list of suffixes to be excluded in the reports. This overrides +the original default list (whereas \fB\-x\fR is used to \fIadd\fR suffixes to +the list). Suffixes must be space separated. +.SH USING FORMATS +The flexibility of \fImanilist\fR is brought by its use of a dynamic formatting +string for providing its reports. It is possible to specify a format via the +\fB\-p\fR option or just parts of it: the text string via \fB\-s\fR and the +file selection with \fB\-w\fR. +.SS "File Selection" +.PP +The leading part of the formatting string tells \fImanilist\fR which files you +wish to see in the final report. Available selectors are: +.sp +.PD 0 +.TP 5 +.B A +All the files but the excluded ones (i.e. those files whose suffix is listed +in the exclusion list). This is the default action. +.TP +.B a +All the files included and/or excluded (shortcut for \fIix\fR). Note that files +which are neither included nor excluded will not appear in the report. +.TP +.B d +Report only for directories. +.TP +.B f +Report only for files. +.TP +.B i +Only included files are listed. +.TP +.B m +Only those files or directories found in the manifest are listed. +.TP +.B n +Only those files or directories \fInot\fR found in the manifest are listed. +.TP +.B x +Only excluded files are listed. +.PD +.PP +When you specify more than one letter, the resulting report depends on the +nature of the selection. For \fId\fR, \fIf\fR, \fIm\fR and \fIn\fR, a logical +union is performed. This means specifying \fIfd\fR or \fImn\fR is the same +as not specifying anything, but it's less efficient since \fImanilist\fR is +forced to perform the checks it would otherwise bypass. The \fIi\fR and \fIx\fR +selectors are special: by default, all the files not excluded are reported. +Specifying \fIx\fR also asks for excluded files. Specifying \fIi\fR restricts +the report to the included files. Using both at the same time (\fIix\fR) will +force a report for files which are included or excluded. +.SS "Macro Substitution" +.PP +The string part of the report format can make use of the following macros: +.sp +.PD 0 +.TP 5 +%c +A character coding the status of the file. +.TP +%d +Description from the manifest file, if any. +.TP +%n +Name of the file (its path from the top directory). +.TP +%s +Size of the file, in bytes. +.TP +%t +Time stamp of the last modification. +.PD +.SS "File Status" +.PP +The \fI%c\fR macro, giving a single character coding the file status, can +expand into one of the following. +.PD 0 +.TP 5 +\&. +The file is up to date (not newer than \fIpatchlevel.h\fR). +.TP +- +The file is present in the manifest but is missing. +.TP +> +The file has been modified since last patch (newer than \fIpatchlevel.h\fR). +.TP ++ +The file exists but is not listed in the manifest. +.TP +o +The file exists but is not listed in the manifest and is older than +\fIpatchlevel.h\fR +.TP +x +The file is listed in the manifest and exists, but has been excluded. Naturally, +this will appear in the report only if the \fIx\fR selector is given in the +report format. +.TP +? +The file is listed in the manifest, does not exist, and was excluded. +.PD +.SH EXAMPLES +The command +.in +5 +.nf +.sp +\fImanilist -ct -p 'ni:%n'\fR +.sp +.fi +.in -5 +will list all the source files from your distribution which are not listed +in your MANIFEST.new file. Note that this includes only "source" files, that +is to say files whose extension is listed in the inclusion list. +If you do not wish this restriction, replace the formatting string with +\fIn:%n\fR (only the excluded files will not appear). +.PP +To build an initial MANIFEST file, use: +.in +5 +.nf +.sp +\fImanilist -n -p 'Af:%n' > MANIFEST\fR +.sp +.fi +.in -5 +from the top directory. You will eventually want to fill in descriptions for +each file listed in the manifest. +.SH FILES +.PD 0 +.TP 20 +MANIFEST.new +Default manifest file, listing files and giving a small description for each +of them. +.PD +.SH AUTHOR +Raphael Manfredi +.SH "SEE ALSO" +manifake(1), makedist(1), pat(1). diff --git a/bin/packinit.SH b/bin/packinit.SH new file mode 100755 index 0000000..c161093 --- /dev/null +++ b/bin/packinit.SH @@ -0,0 +1,447 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting bin/packinit (with variable substitutions)" +cat >packinit <>packinit <<'!NO!SUBS!' + +print < $mypackver) { + die "This .package file was produced by a newer packinit than I am.\n". + "Please find a packinit of version $packver or greater.\n"; + } +} elsif (-f '../.package' || -f '../../.package' || -f '../../../.package') { + die "Run in top level directory only.\n"; +} + +# Now set up to do reads with possible shell escape. +sub myread { + ($rp,$dflt) = @_; + $rp .= " [$dflt]"; + print "$rp "; + $ans='!'; + while ($ans =~ /^!/) { + $ans = ; + chop($ans); + if ($ans eq '!') { + system '/bin/sh'; + print "\n$rp "; + } elsif ($ans =~ s/^!//) { + system '/bin/sh', '-c', $ans; + print "\n$rp "; + } + } + $ans = $dflt if $ans eq ''; + $ans = '' if $ans eq 'none'; + $ans; +} + +$dflt = $package; +($dflt) = (`pwd | tr "[A-Z]" "[a-z]"` =~ m|.*/(.*)|) unless $package; + +print <; + $rcs = shift(@rcs); + if (! -f $rcs) { + $rcs = shift(@rcs); + if (! -f $1) { + print "I don't see any RCS files there (yet)."; + $dflt='1.1'; + } + } + $revs=0; + if ($dflt eq '') { + $rlog = `rlog $rcs`; + ($dflt) = ($rlog =~ /\nhead:\s*(\d+\.\d+)/); + $rlog = `rlog -r$dflt.1- -r$dflt.2- -r$dflt.3- -r$dflt.4- $rcs`; + ($revs) = ($rlog =~ /selected revisions:\s*([\d.]+)/); + $dflt='1.1' if $dflt eq ''; + } + + print < 1) { + print <.package') || die "Can't create .package"; +chop($date = `date`); +print PACKAGE <>packinit +$grep -v '^;#' ../pl/logname.pl >>packinit +$grep -v '^;#' ../pl/fullname.pl >>packinit +$grep -v '^;#' ../pl/tilde.pl >>packinit +chmod 755 packinit +$eunicefix packinit diff --git a/bin/packinit.man b/bin/packinit.man new file mode 100644 index 0000000..a43abdc --- /dev/null +++ b/bin/packinit.man @@ -0,0 +1,148 @@ +''' $Id: packinit.man,v 3.0.1.4 1995/07/25 13:31:38 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: packinit.man,v $ +''' Revision 3.0.1.4 1995/07/25 13:31:38 ram +''' patch56: fixed a typo +''' +''' Revision 3.0.1.3 1995/05/12 11:57:38 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0.1.2 1994/10/29 15:45:17 ram +''' patch36: added new variables cext, shext, changelog and changercs +''' +''' Revision 3.0.1.1 1994/01/24 13:54:31 ram +''' patch16: now documents variables set in .package by packinit +''' +''' Revision 3.0 1993/08/18 12:04:06 ram +''' Baseline for dist 3.0 netwide release. +''' +''' +.TH PACKINIT 1 ram +.SH NAME +packinit \- initialize or update your .package file +.SH SYNOPSIS +.B packinit +.SH DESCRIPTION +.B Packinit +will create (or update) a \fI.package\fR file, so that all the +.B dist +tools can be smart and know some basic things about your package, +such as its revision number, or the e-mail address of its maintainer. +.PP +.I Packinit +should be run from the top level directory of your package, before +using any other \fIdist\fR tool. Later on, you may rerun it to +update some of its values. +.I Packinit +will create a single file and leave the remaining of +your directory undisturbed. +.SH VARIABLES +.I Packinit +defines the following variables in your \fI.package\fR file: +.TP 15 +.PD 0 +baserev +The baseline revision number. +.TP +cext +The list (space separated) of file extensions identifying potential holders of +C symbols. This is added to the default .[chyl] extension lookup. +Shell-style patterns may be used. +.TP +changelog +The name of the \fIChangeLog\fR file managed by \fIpatlog\fR. +.TP +changercs +Boolean stating whether RCS logs are to be made part of \fIChangeLog\fR. +.TP +copyright +Name of the file used for Copyright expansion. +.TP +ftpdir +Directory where patches are located on the FTP site. +.TP +ftpsite +Name of the FTP site where patches may be retrieved from. +.TP +list_addr +Address of the package mailing list where users may post messages to. +.TP +list_manager +Type of list manager attached to the list administrative request address. +.TP +list_name +Name of the package users mailing list. +.TP +list_request +Address where subscribe and unsubscribe requests for the package mailing +list should be sent to. +.TP +list_sub +Format of the subscribe requests. +.TP +list_unsub +Format of the unsubscribe requests. +.TP +list_users +A boolean string set to 'true' when there is a mailing list set up for +discussion about the package. +.TP +mailagent +A boolean string set to 'true' when people are allowed to retrieve +patches via mailagent \fI@SH mailpatch\fR commands. +.TP +maintloc +E-mail address of the package maintainer, preferably in Internet format. +.TP +maintname +Full name of the package maintainer. +.TP +mydiff +Name of the \fIdiff\fR program to be used when computing a patch. +.TP +newsgroups +Newsgroup list where new patches should be posted to, empty for no +postings. +.TP +orgname +Full name of the organization where the package maitainer resides, or +path to a file containing that name. +.TP +package +Name of the package. +.TP +packver +Version of the \fIpackinit\fR program that built the \fI.package\fR file. +.TP +patchbranch +Name of the RCS branch used to store subsequent updates of a file after +a baseline has been released. +.TP +recipients +People who should be sent newly issued patches. +.TP +shext +The list (space separated) of file extensions identifying potential holders of +shell symbols. This is added to the default .SH extension lookup. +Shell-style patterns may be used. Note that only .SH extensions are looked +up by Configure for automatic shell extraction with variable substitutions, +no matter what this variable is set to. +.PD +.SH FILE +.TP 15 +\&.package +File holding all the package-related values +.SH AUTHORS +Larry Wall (version 2.0) +.br +Raphael Manfredi +.SH "SEE ALSO" +dist(1). diff --git a/bin/perload b/bin/perload new file mode 100755 index 0000000..2354790 --- /dev/null +++ b/bin/perload @@ -0,0 +1,648 @@ +: # feed this into perl +'/bin/true' && eval 'exec perl -S $0 "$@"' + if $running_under_some_shell; +'di'; +'ig00'; + +# +# This perl script is its own manual page [generated by wrapman] +# + +# $Id: perload,v 3.0.1.1 1994/10/29 15:45:36 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $Log: perload,v $ +# Revision 3.0.1.1 1994/10/29 15:45:36 ram +# patch36: added minimal support for perl5 dataloading +# +# Revision 3.0 1993/08/18 12:04:06 ram +# Baseline for dist 3.0 netwide release. +# + +# Replace each function definition in a loading section by two stubs and +# reject the definition into the DATA part of the script if in a dataload +# section or into a FILE if in an autoload section. + +$in_load = 0; # In a loading section +$autoload = ''; # Name of autoloaded file +$has_invocation_stub = 0; # True if we detect a #! stub +$current_package = 'main'; # Current package +$init_emitted = 0; # True when dataloading stamp was emitted +$in_function = 0; + +require 'getopt.pl'; +&Getopt; + +while (<>) { + if ($. == 1 && /^(:|#).*perl/) { # Invocation stub + $has_invocation_stub = 1; + print; + next; + } + if ($. <= 3 && $has_invocation_stub) { + print; + next; + } + if (/^\s*$/) { + &flush_comment; + print unless $in_function; + print if $in_function && !$in_load; + if ($in_function && $in_load) { + push(@Data, "\n") unless $autoload; + $Auto{$autoload} .= "\n" if $autoload; + } + next; + } + if (/^\s*;?#/) { + if (/#\s*perload on/i) { # Enter a loading section + print unless /:$/; + $in_load = 1; + next; + } + if (/#\s*perload off/i) { # End a loading section + print unless /:$/; + $in_load = 0; + next; + } + if (/#\s*autoload (\S+)/i) { # Enter autoloading section + print unless /:$/; + push(@autoload, $autoload); # Directives may be nested + $autoload = $1; + $in_load += 2; + next; + } + if (/#\s*offload/i) { # End autoloading section + print unless /:$/; + $autoload = pop(@autoload); # Revert to previously active file + $in_load -= 2; + next; + } + &emit_init unless $init_emitted; + push(@Comment, $_) unless $in_function; + print if $in_function && !$in_load; + next unless $in_function; + push(@Data, $_) unless $autoload; + $Auto{$autoload} .= $_ if $autoload; + next; + } + &emit_init unless $init_emitted; + /^package (\S+)\s*;/ && ($current_package = $1); + unless ($in_load) { + &flush_comment; + print; + next; + } + # We are in a loading section + if (/^sub\s+([\w']+)\s*\{(.*)/) { + die "line $.: function $1 defined within another function.\n" + if $in_function; + # Silently ignore one-line functions + if (/\}/) { + &flush_comment; + print; + next; + } + $comment = $2; + $in_function = 1; + $function = $1; + ($fn_package, $fn_basename) = $function =~ /^(\w+)'(\w+)/; + unless ($fn_package) { + $fn_package = $current_package; + $fn_basename = $function; + } + # Keep leading function comment + foreach (@Comment) { + push(@Data, $_) unless $autoload; + $Auto{$autoload} .= $_ if $autoload; + } + @Comment = (); + # Change package context for correct compilation: the name is visible + # within the original function package while the body of the function + # is compiled within the current package. + $declaration = "sub $fn_package" . "'load_$fn_basename {$comment\n"; + $package_context = "\tpackage $current_package;\n"; + if ($autoload) { + $Auto{$autoload} .= $declaration . $package_context; + } else { + push(@Data, $declaration, $package_context); + } + # Emit stubs + print "sub $fn_package", "'$fn_basename"; + print " { &auto_$fn_package", "'$fn_basename; }\n"; + print "sub auto_$fn_package", "'$fn_basename { "; + print '&main\'dataload' unless $autoload; + print '&main\'autoload(' . "'$autoload'" . ', @_)' if $autoload; + print "; }\n"; + next; + } + unless ($in_function) { + &flush_comment; + print; + next; + } + # We are in a loading section and inside a function body + push(@Data, $_) unless $autoload; + $Auto{$autoload} .= $_ if $autoload; + $in_function = 0 if /^\}/; + if (/^\}/) { + push(@Data, "\n") unless $autoload; + $Auto{$autoload} .= "\n" if $autoload; + } +} + +@auto = keys %Auto; +if (@auto > 0) { + print &q(<<'EOC'); +:# Load the calling function from file and call it. This function is called +:# only once per file to be loaded. +:sub main'autoload { +: local($__file__) = shift(@_); +: local($__packname__) = (caller(1))[3]; +: $__packname__ =~ s/::/'/; +: local($__rpackname__) = $__packname__; +: local($__saved__) = $@; +: $__rpackname__ =~ s/^auto_//; +: &perload'load_from_file($__file__); +: $__rpackname__ =~ s/'/'load_/; +: $@ = $__saved__; # Restore value $@ had on entrance +: &$__rpackname__(@_); # Call newly loaded function +:} +: +:# Load file and compile it, substituing the second stub function with the +:# loaded ones. Location of the file uses the @AUTO array. +:sub perload'load_from_file { +: package perload; +: local($file) = @_; # File to be loaded +: local($body) = ' ' x 1024; # Pre-extent +: local($load) = ' ' x 256; # Loading operations +: # Avoid side effects by protecting special variables which will be +: # changed by the autoloading operation. +: local($., $_, $@); +: $body = ''; +: $load = ''; +: &init_auto unless defined(@'AUTO); # Make sure we have a suitable @AUTO +: &locate_file unless -f "$file"; # Locate file if relative path +: open(FILE, $file) || +: die "Can't load $'__rpackname__ from $file: $!\n"; +: while () { +: $load .= '*auto_' . $1 . '\'' . $2 . '= *' . $1 . '\'' . "load_$2;\n" +: if (/^sub\s+(\w+)'load_(\w+)\s*\{/); +: $body .= $_; +: } +: close FILE; +EOC + if ($opt_t) { + print &q(<<'EOC'); +: # Untaint body when running setuid +: $body =~ /^([^\0]*)/; +: # No need to untaint $load, as it was built using trusted variables +: eval $1 . $load; +EOC + } else { + print &q(<<'EOC'); +: eval $body . $load; +EOC + } + print &q(<<'EOC'); +: chop($@) && die "$@, while parsing code of $file.\n"; +:} +: +:# Initialize the @AUTO array. Attempt defining it by using the AUTOLIB +:# environment variable if set, otherwise look in auto/ first, then in the +:# current directory. +:sub perload'init_auto { +: if (defined $ENV{'AUTOLIB'} && $ENV{'AUTOLIB'}) { +: @AUTO = split(':', $ENV{'AUTOLIB'}); +: } else { +: @AUTO = ('auto', '.'); +: } +:} +: +:# Locate to-be-loaded file held in $file by looking through the @AUTO array. +:# This variable, defined in 'load_from_file', is modified as a side effect. +:sub perload'locate_file { +: package perload; +: local($fullpath); +: foreach $dir (@'AUTO) { +: $fullpath = $dir . '/' . $file; +: last if -f "$fullpath"; +: $fullpath = ''; +: } +: $file = $fullpath if $fullpath; # Update var from 'load_from_file' +:} +: +EOC +} + +if (@Data > 0) { + print &q(<<'EOC'); +:# Load the calling function from DATA segment and call it. This function is +:# called only once per routine to be loaded. +:sub main'dataload { +: local($__packname__) = (caller(1))[3]; +: $__packname__ =~ s/::/'/; +: local($__rpackname__) = $__packname__; +: local($__at__) = $@; +: $__rpackname__ =~ s/^auto_//; +: &perload'load_from_data($__rpackname__); +: local($__fun__) = "$__rpackname__"; +: $__fun__ =~ s/'/'load_/; +: eval "*$__packname__ = *$__fun__;"; # Change symbol table entry +: die $@ if $@; # Should not happen +: $@ = $__at__; # Restore value $@ had on entrance +: &$__fun__; # Call newly loaded function +:} +: +:# Load function name given as argument, fatal error if not existent +:sub perload'load_from_data { +: package perload; +: local($pos) = $Datapos{$_[0]}; # Offset within DATA +: # Avoid side effects by protecting special variables which will be changed +: # by the dataloading operation. +: local($., $_, $@); +: $pos = &fetch_function_code unless $pos; +: die "Function $_[0] not found in data section.\n" unless $pos; +: die "Cannot seek to $pos into data section.\n" +: unless seek(main'DATA, $pos, 0); +: local($/) = "\n}"; +: local($body) = scalar(); +: local($*) = 1; +: die "End of file found while loading $_[0].\n" unless $body =~ /^\}$/; +EOC + if ($opt_t) { + print &q(<<'EOC'); +: # Untaint body when running setuid +: $body =~ /^([^\0]*)/; +: # Now we may safely eval it without getting an insecure dependency +: eval $1; # Load function into perl space +EOC + } else { + print &q(<<'EOC'); +: eval $body; # Load function into perl space +EOC + } + print &q(<<'EOC'); +: chop($@) && die "$@, while parsing code of $_[0].\n"; +:} +: +EOC + print &q(<<'EOC') unless $opt_o; +:# Parse text after the END token and record defined loadable functions (i.e. +:# those whose name starts with load_) into the %Datapos array. Such function +:# definitions must be left adjusted. Stop as soon as the function we want +:# has been found. +:sub perload'fetch_function_code { +: package perload; +: local($pos) = tell main'DATA; +: local($in_function) = 0; +: local($func_name); +: local($., $_); +: while () { +: if (/^sub\s+(\w+)'load_(\w+)\s*\{/) { +: die "DATA line $.: function $1'$2 defined within $func_name.\n" +: if $in_function; +: $func_name = $1 . '\'' . $2; +: $Datapos{$func_name} = $pos; +: $in_function = 1; +: next; +: } +: $in_function = 0 if /^\}/; +: next if $in_function; +: return $pos if $func_name eq $_[0]; +: $pos = tell main'DATA; +: } +: 0; # Function not found +:} +: +EOC + print &q(<<'EOC') if $opt_o; +:# This function is called only once, and fills in the %Datapos array with +:# the offset of each of the dataloaded routines held in the data section. +:sub perload'fetch_function_code { +: package perload; +: local($start) = 0; +: local($., $_); +: while () { # First move to start of offset table +: next if /^#/; +: last if /^$/ && ++$start > 2; # Skip two blank line after end token +: } +: $start = tell(main'DATA); # Offsets in table are relative to here +: local($key, $value); +: while () { # Load the offset table +: last if /^$/; # Ends with a single blank line +: ($key, $value) = split(' '); +: $Datapos{$key} = $value + $start; +: } +: $Datapos{$_[0]}; # All that pain to get this offset... +:} +: +EOC + print &q(<<'EOC'); +:# +:# The perl compiler stops here. +:# +: +:__END__ +: +:# +:# Beyond this point lie functions we may never compile. +:# +: +EOC + # Option -o directs us to optimize the function location by emitting an + # offset table, which lists all the position within DATA for each possible + # dataloaded routine. + if ($opt_o) { + print &q(<<'EOC'); +:# +:# DO NOT CHANGE A IOTA BEYOND THIS COMMENT! +:# The following table lists offsets of functions within the data section. +:# Should modifications be needed, change original code and rerun perload +:# with the -o option to regenerate a proper offset table. +:# +: +EOC + $trailing_message = &q(<<'EOC'); +: +:# +:# End of offset table and beginning of dataloading section. +:# +: +EOC + $pos = 0; # Offset relative to this point (start of table) + foreach (@Data) { + $Datapos{"$1\'$2"} = $pos - $now + if /^sub\s+(\w+)'load_(\w+)\s*\{/; # } for vi + $pos += length; + } + @poskeys = keys %Datapos; # Array of routine names (fully qualified) + + # Write out a formatted table, each entry stored on $entry bytes and + # formatted with the $format string. + ($entry, $format) = &get_format(*poskeys); + + # The total size occupied by the table is the size of one item times + # the number of items plus the final trailing message at the end of + # the table. + $table_size = $entry * @poskeys + length($trailing_message); + + # Output formatted table + foreach (sort @poskeys) { + printf($format, $_, $table_size + $Datapos{$_}); + } + print $trailing_message; + } + + # Output code for each dataloaded function + foreach (@Data) { + print; + } + print &q(<<'EOC'); +:# +:# End of dataloading section. +:# +: +EOC +} + +if (@auto > 0) { + mkdir('auto',0755) unless -d 'auto'; + foreach $file (@auto) { + unless (open(AUTO, ">auto/$file")) { + warn "Can't create auto/$file: $!\n"; + next; + } + print AUTO &q(<<'EOC'); +:# This file was generated by perload +: +EOC + print AUTO $Auto{$file}; + close AUTO; + } +} + +# Compute optimum format for routine offset table, returning both the size of +# each entry and the formating string for printf. +sub get_format { + local(*names) = @_; + local($name_len) = 0; + local($max_len) = 0; + foreach (@names) { + $name_len = length; + $max_len = $name_len if $name_len > $max_len; + } + # The size of each entry (preceded by one tab, followed by 12 chars) + $name_len = $max_len + 1 + 12; + ($name_len, "\t%${max_len}s %10d\n"); +} + +sub emit_init { + print &q(<<'EOC'); +:# +:# This perl program uses dynamic loading [generated by perload] +:# +: +:$ENV{LC_ALL} = 'C'; +: +EOC + $init_emitted = 1; +} + +sub flush_comment { + print @Comment if @Comment > 0; + @Comment = (); +} + +sub q { + local($_) = @_; + local($*) = 1; + s/^://g; + $_; +} + +# +# These next few lines are legal in both perl and nroff. +# + +.00; # finish .ig + +'di \" finish diversion--previous line must be blank +.nr nl 0-1 \" fake up transition to first page again +.nr % 0 \" start at page 1 +'; __END__ \" the perl compiler stops here + +''' +''' From here on it's a standard manual page. +''' + +.TH PERLOAD 1 "June 20, 1992" +.AT 3 +.SH NAME +perload \- builds up autoloaded and dataloaded perl scripts +.SH SYNOPSIS +.B perload +[ \fB\-ot\fR ] +[ \fIfile\fR ] +.SH DESCRIPTION +.I Perload +takes a perl script as argument (or from stdin if no argument is supplied) +and prints out on stdout an equivalent script set-up to perform autoloading +or dataloading. The translation is directed by special comments within the +original script. Using dynamic loading can drastically improve start-up +performances, both in time and in memory, as perl does not need to compile +the whole script nor store its whole compiled form in memory. +.PP +.I Autoloading +delays compilation of some functions until they are needed. The code for these +functions is loaded dynamically at run-time. The atomicity of loading is a +file, which means that putting more than one function into a file will cause +all these functions to be loaded and compiled as soon as one among them is +needed. +.PP +.I Dataloading +is a form of autoloading where no extra file are needed. The script carries +all the functions whose compilation is to be delayed in its data segment +(in the \fIperl\fR sense, i.e. they are accessible via the DATA filehandle). +The scripts parses the data segment and extracts only the code for the needed +subroutine, which means granularity is better than with autloading. +.PP +It is possible for a single script to use both autoloading and dataloading at +the same time. However, it should be noted that a script using only dataloading +is self contained and can be moved or shared accross different platforms without +fear. On the contrary, a script using only autoloading relies on some externally +provided files. Sharing this script among different platforms requires sharing +of these external files. The script itself cannot be redistributed without +also giving the extra files holding the autoloaded functions. +.PP +The major drawback with dataloading is that the DATA filehandle cannot be used +for anything else and may result in code duplication when two scripts could +share the same pieces of code. Autoloading appears as the perfect solution in +this case since two scripts may freely share the same functions without +actually duplicating them on the disk (hence saving some precious disk blocks +:-). +.SH CRITERIA +Functions to be dataloaded or autoloaded must meet the following layout +criteria: +.TP 5 +\- +They must not be one-line functions like \fIsub sorter { $a <=> $b }\fR. +Those functions are simply output verbatim, as they are already so +small that it would not be worth to dynamically load them, +.TP +\- +The first line must be of the form \fIsub routine_name {\fR, with an optional +comment allowed after the '{'. +.TP +\- +The function definition must end with a single '}' character left aligned. +.TP +\- +Package directives outside any function must be left aligned. +.PP +All the above restrictions should not be source of a problem if "standard" +writing style is used. There are also some name restrictions: the package +name \fIperload\fR is reserved, as is the \fI@AUTO\fR array when autoloading +is used. Packages must not start with \fIauto_\fR, as this is prepended to +user's package names when building the stubs. Furthermore, the subroutines +names \fImain'autoload\fR and +\fImain'dataload\fR must not be used by the original script. Again, these +should not cause any grief. +.SH DIRECTIVES +The translation performed by +.I Perload +is driven by some special comment directives placed directly within the code. +Ending those directives with a ':' character will actually prevent them from +being output into the produced script. Case is irrelevant for all the directives +and the comment need not be left-aligned, although it must be the first +non-space item on the line. +.PP +The following directives are available: +.TP 10 +# Perload ON +Turns on the \fIperload\fR processing. Any function definition which meets +the criteria listed in the previous section will be replaced by two stubs and +its actual definition will be rejected into the data segment (default) or a +file when inside an autoloading section. +.TP +# Perload OFF +Turns off any processing. The script is written as-is on the standard output. +.TP +# Autoload \fIpath\fR +Requests autoloading from file \fIpath\fR, which may be an absolute path or +a relative path. The file will be located at run-time using the @AUTO array +if a non-absolute path is supplied or if the file does not exist as listed. +Autoloading directives may be nested. +.TP +# Offload \fIpath\fR +The argument is not required. The directive ends the previous autoloading +directive (the inmost one). This does not turn off the \fIperload\fR processing +though. The \fIpath\fR name is optional here (in fact, it has only a comment +value). +.SH OPTIONS +Perload accepts only two options. Using \fB\-o\fR is meaningful only when +dataloading is used. It outputs an offset table which lists the relative +offset of the dataloaded functions within the data section. This will spare +perl the run-time parsing needed to locate the function, and results in an good +speed gain. However, it has one major drawback: it prevents people from +actually modifying the source beyond the start of the table. But anything +before can be freely edited, which is particulary useful when tailoring the +script. +.PP +This option should not be used when editing of functions within the data +section is necessary for whatever reason. When \fB\-o\fR is used, any +change in the dataloaded function must be committed by re-running perload +on the original script. +.PP +The other option \fB\-t\fR is to be used when producing a script which is +going to run setuid. The body of the loaded function is untainted before being +fed to eval, which slightly slows down loading (the first time the function is +called), but avoids either an insecure dependency report or weird warnings from +taintperl stating something is wrong (which is the behaviour with 4.0 PL35). +.SH FILES +.TP 10 +auto +the subdirectory where all produced autoloaded files are written. +.SH ENVIRONMENT +No environment variables are used by \fIperload\fR. However, the autoloaded +version of the script pays attention to the \fIAUTOLIB\fR variable as a colon +separated set of directories where the to-be-loaded files are to be found +when a non-absolute path was specified. If the \fIAUTOLIB\fR variable is not +set, the default value 'auto:.' is used (i.e. look first in the auto/ +subdirectory, then in the current directory. +.SH CAVEAT +Special care is required when using an autoloading script, especially when +executed by the super-user: it would be very easy for someone to leave a +special version of a routine to be loaded, in the hope the super-user (or +another suitable target) executes the autoloaded version of the script with +some \fIad hoc\fR changes... +.PP +The directory holding the to-be-loaded files should therefore be protected +against unauthorized access, and no file should have write permission on them. +The directory itself should not be world-writable either, or someone might +substitute his own version. +It should also be considered wise to manually set the @AUTO variable to a +suitable value within the script itself. +.PP +The \fB\-o\fR option uses \fIperl\fR's special variable \fI$/\fR with a +multi-character value. I suspect this did not work with versions of \fIperl\fR +prior to 4.0, so any script using this optimized form of dataloading will not +be 100% backward compatible. +.SH AUTHOR +Raphael Manfredi +.SH CREDITS +Valuable input came from Wayne H. Scott . He is +merely the author of the optimizing offset table (\fB\-o\fR option). +.PP +.I Perload +is based on an article from Tom Christiansen , +.I Autoloading in Perl, +explaining the concept of dataloading and giving a basic implementation. +.SH "SEE ALSO" +perl(1). diff --git a/dist.man b/dist.man new file mode 100644 index 0000000..4a7ab9a --- /dev/null +++ b/dist.man @@ -0,0 +1,317 @@ +''' $Id: dist.man,v 3.0.1.6 1995/05/12 11:57:53 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: dist.man,v $ +''' Revision 3.0.1.6 1995/05/12 11:57:53 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0.1.5 1994/10/29 15:46:03 ram +''' patch36: mentions new patlog script and ChangeLog file +''' +''' Revision 3.0.1.4 1994/05/06 13:54:17 ram +''' patch23: extended copyright notice to 1994 +''' patch23: new script kitpost +''' +''' Revision 3.0.1.3 1994/01/24 13:55:41 ram +''' patch16: documents profile and its components +''' +''' Revision 3.0.1.2 1993/11/10 17:31:03 ram +''' patch14: added mention for new confmagic.h file +''' +''' Revision 3.0.1.1 1993/08/24 12:12:00 ram +''' patch3: added entries for patnotify and patsnap +''' +''' Revision 3.0 1993/08/18 12:04:07 ram +''' Baseline for dist 3.0 netwide release. +''' +''' +.de Ex \" Start of Example +.sp +.in +5 +.nf +.. +.de Ef \" End of Example +.sp +.in -5 +.fi +.. +.TH DIST 1 ram +.SH NAME +dist \- introduction to dist +.SH DESCRIPTION +The \fIdist\fR package is a set of tools meant to ease the construction and +maintenance of portable software. There are four distinct parts in \fIdist\fR, +and it is also meant to be used with two external products, which are +publicly available: \fImailagent\fR and \fIpatch\fR. +.PP +The first component is the \fIConfigure\fR script generator, which is a +portability tool. It is automatically build up by \fImetaconfig\fR from your +sources and a set of units. Ideally, the end-user receiving your source code +will simply have to read your README file, run the \fIConfigure\fR script +(which is self-documented), and then run \fImake\fR. Your package should then +build cleanly on every UNIX platform. +.PP +The second component is the \fIMakefile.SH\fR generator, which is a generic +configured Makefile, reusing some of the information figured out by +.I Configure. +Although you may write your own Makefile and then use \fImakeSH\fR to transform +it into a \fIMakefile.SH\fR, it is better to write a generic \fIJmakefile\fR +description, which does not rely on a particular position within the source +tree, and then use \fIjmake\fR to recursively build your Makefiles. +.PP +The third component is the package generator, which is used when it's time +to build up the shell archives used to distribute your program. Although you +may use your own archiving mechanism, the one included here knows about RCS +files and will properly check out the lattest revisions, leaving your working +files alone. The \fImakedist\fR program will also perform Copyright expansion, +an useful feature when you share source files among more than one program, +placed under distinct Copyright information. +.PP +The fourth and latest component is the patch generator, used to make updates +of your sources, which can later be applied on the original distribution by +using the \fIpatch\fR program. +.PP +Before using any of the \fIdist\fR programs, you should probably identify your +package by running the \fIpackinit\fR program, which will create +a \fI.package\fR file in the top-level directory of your package. +.SH COMMANDS +The \fIdist\fR package implements the following commands (those +tagged as \fIlibrary\fR commands are to be found in the dist +library and should not be made publicly available in everyone's path): +.TP 15 +bindex +builds the \fIIndex\fR file (library). +.PD 0 +.TP +jmake +a Makefile.SH generator. +.TP +jmkmf +bootstraps top-level Makefile.SH file. +.TP +kitpost +posts distribution kits made by \fImakedist\fR. +.TP +kitsend +sends distribution kits made by \fImakedist\fR. +.TP +makeSH +wraps existing scripts into a .SH file. +.TP +makedist +builds up distribution kits. +.TP +makegloss +builds the \fIGlossary\fR file (library). +.TP +manicheck +checks MANIFEST.new accuracy +.TP +manifake +makes MANIFEST.new out of an existing MANIFEST. +.TP +manilist +builds MANIFEST.new reports. +.TP +metaconfig +a Configure script generator. +.TP +metalint +a metaconfig unit consistency checker. +.TP +metaxref +a metaconfig cross-reference builder. +.TP +packinit +initializes a package (creates a .package file). +.TP +pat +main patch generator. +.TP +patbase +resets patch base to current version. +.TP +patcil +checks new version in. +.TP +patclean +remove working version of up-to-date files. +.TP +patcol +checks file out. +.TP +patdiff +builds (contextual) diffs for the patch. +.TP +patftp +copies patches to public ftp directory. +.TP +patindex +builds a patch index. +.TP +patlog +handles ChangeLog file updates. +.TP +patmake +puts diffs together into a patch. +.TP +patnotify +notifies users that new patches have been released. +.TP +patpost +posts patch to some newsgroup. +.TP +patsend +mails patch to some people. +.TP +patsnap +builds a release snapshot with files and RCS revisions. +.PD +.SH PROFILE +Commands having a set of meaningful options (other +than \fB\-h\fR or \fB\-V\fR) can also take arguments from +the \fI~/.dist_profile\fR file, or whatever file the \fIDIST\fR +environment variable points to. Each line of the file is in the +format: +.Ex +profile-component: \fIvalue\fR +.Ef +whith shell-style comments (#) allowed provided they start the line. +.PP +Each command looks for a profile component entry matching its +name and loads the \fIvalue\fR as if it were arguments specified +on the command line. Those arguments precede any other argument +specified manually, in case order is meaningful. +.PP +Some commands may also be configured from within the profile, by setting +a specific \fIvariable\fR attached to the command by a profile +entry looking like this: +.Ex +cmdname-\fIvariable\fR: \fIvalue\fR +.Ef +For instance, assuming the variable \fIc-files\fR is recognized by the +\fImetaconfig\fR program, its default value could be overwritten by +this profile entry: +.Ex +metaconfig-c-files: \fIsuitable value\fR +.Ef +Only the first '-' after the command name is part of the syntax, the +other one used in the variable name is pure convention. Please refer to the +manual page of each command for a list of valid profile variables +which may be set. +.SH FILES +.PD 0 +.TP 15 +\&.MT +Temporary directory created by \fImetaconfig\fR and friends. +.TP +\&.newer +A list of files newer than \fIpatchlevel.h\fR, used by the patching tools. +.TP +\&.package +Main configuration file used by most of the dist tools to make them smart. +.TP +ChangeLog +The file where changes are recorded. Its name may be configured by +running \fIpackinit\fR, but this is the default "generic" name under +which it is referred to within the documentation. +.TP +Configure +The generated configuration script. +.TP +Glossary +A list of all the known portability symbols known by \fImetaconfig\fR. This +file is located in the dist library directory. +.TP +I.fui +Cross-reference file generated by \fImetaxref\fR, sorted by file, unit, item. +.TP +I.uif +Cross-reference file generated by \fImetaxref\fR, sorted by unit, item, file. +.TP +Index +A list of all the rules known by \fIjmake\fR. This file is located in the +dist library directory. +.TP +Jmakefile +Generic makefile description used by \fIjmake\fR. +.TP +MANIFEST +List of all the files to be included in the distribution. Usually a copy (not +a link) of MANIFEST.new. +.TP +MANIFEST.new +List of all the files to be taken into account by the dist tools. +.TP +Makefile.SH +The generated configured makefile (via Jmakefile) or hand-generated Makefile +making use of known metaconfig symbols. +.TP +Obsolete +A list of obsolete symbol used and their new equivalents. +.TP +RCS +Directory where RCS files are stored. +.TP +README +Main file explaining how to build your package. +.TP +U +Private unit directory. +.TP +Wanted +File used by \fImetaconfig\fR, listing all the symbols used by the sources. +.TP +bugs +Directory where patches are stored. +.TP +check.extra +Extra files present in MANIFEST.new, generated by \fImanicheck\fR. +.TP +check.want +Missing files from MANIFEST.new, generated by \fImanicheck\fR. +.TP +config_h.SH +Generated config.h template. +.TP +confmagic.h +Magic symbol remapping, activated via metaconfig's \fB\-M\fR option. +.TP +hints +This directory lists all the configuration hints for your package. +.TP +patchlevel.h +File recording your package patch level, should not be part of MANIFEST.new, +but may be listed in MANIFEST, at your discretion. +.TP +users +File recording the users of your package, generated by mailagent's \fIpackage\fR +command (see the MailAuthor.U unit and mailagent 3.0). +.PD +.SH ENVIRONMENT +The following environment variable is paid attention to: +.TP 15 +DIST +Location of the dist profile, defaults to ~/.dist_profile. This variable is +subject to ~name substitution, even if your shell does not support it. +.SH AUTHORS +By chronological order: +.sp +Larry Wall (dist 2.0 in 1988) +.br +Harlan Stenn (worked on dist 3.0 1990-1992) +.br +Raphael Manfredi (dist 3.0 and +integration 1991-1995) +.sp +Please look at the \fICredits\fR file in the distribution source tree for a +list of all the known contributors. +.SH "SEE ALSO" +jmake(1), metaconfig(1), pat(1). diff --git a/install.SH b/install.SH new file mode 100755 index 0000000..00055a2 --- /dev/null +++ b/install.SH @@ -0,0 +1,216 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting install (with variable substitutions)" +$spitshell >install <>install <<'!NO!SUBS!' + +mode="" +dst="" +src="" +dostrip="" +newdir="" +uid="" +gid="" + +# simulates mkdir -p +mkdir_p=' +name=$1; +create=""; +while $test $name; do + if $test ! -d "$name"; then + create="$name $create"; + name=`echo $name | $sed -e "s|^[^/]*$||"`; + name=`echo $name | $sed -e "s|\(.*\)/.*|\1|"`; + else + name=""; + fi; +done; +for file in $create; do + mkdir $file && $test $verbose && + echo "install: created directory $file" >&2; +done +' + +verbose='' + +while $test x$1 != x +do + case $1 in + -c) shift + continue + ;; + -m) mode="$2 " + shift + shift + continue + ;; + -o) uid="$2 " + shift + shift + continue + ;; + -g) gid="$2 " + shift + shift + continue + ;; + -s) dostrip="strip" + shift + continue + ;; + -d) newdir="$newdir$2 " + shift + shift + continue + ;; + -v) verbose='true' + shift + ;; + *) if $test x$src = x + then + src=$1 + else + dst=$1 + fi + shift + continue + ;; + esac +done + +# if -d option is used, we have to create the path given +if $test ! x$newdir = x +then + for i in $newdir + do + set x $i + shift + eval $mkdir_p + done + exit 0 # -d is the only action +fi + +if $test x$src = x +then + echo "install: no input file specified" >&2 + exit 1 +fi + +if $test x$dst = x +then + echo "install: no destination specified" >&2 + exit 1 +fi + +srcbase=`basename $src` +dstbase=`basename $dst` + +# If the destination is a directory, the target name is srcbase... +if $test -d $dst; then + dstbase=$srcbase +else + dst="`echo $dst | sed 's,^\(.*\)/.*$,\1,'`" + if $test ! -d $dst; then + dstbase=$dst + dst="." + fi +fi + +# If the src has a directory, extract the dir name... +if $test "$src" != "$srcbase" -a "$src" != "./$srcbase"; then + src="`echo $src | sed 's,^\(.*\)/.*$,\1,'`" +else + src="." +fi + +# dst is the destination directory and dstbase the base name. +# srcbase is the base name of source and src the source dir. + +srcpth=`(cd $src; pwd)`/$srcbase +destpth=`(cd $dst; pwd)`/$dstbase +if $test x$srcpth = x$destpth; then + $test $verbose && \ + echo "install: destination and source are identical" + exit 0 +fi + +# Do the install +( + cd $src + + if $test -f $dst/$dstbase; then + $rm -f $dst/$dstbase && $test $verbose && + echo "install: $dst/$dstbase removed" + fi + if $test -f $dst/$dstbase; then + $mv $dst/$dstbase $dst/OLD$dstbase && $test $verbose && + echo "install: $dst/$dstbase renamed as OLD$dstbase" + fi + + cp $srcbase $dst/$dstbase && $test $verbose && + echo "install: $srcbase installed as $dst/$dstbase" + + if $test ! x$dostrip = x; then + strip $dst/$dstbase 2>/dev/null && $test $verbose && + echo "install: stripped $dst/$dstbase" + fi + + if $test ! x$uid = x; then + $chown $uid $dst/$dstbase + fi + if $test ! x$gid = x; then + $chgrp $gid $dst/$dstbase + fi + if $test ! x$mode = x + then + $chmod $mode $dst/$dstbase + fi +) + +exit 0 +!NO!SUBS! +chmod 755 install +$eunicefix install diff --git a/jmake/Jmakefile b/jmake/Jmakefile new file mode 100644 index 0000000..81b9dc4 --- /dev/null +++ b/jmake/Jmakefile @@ -0,0 +1,51 @@ +/* + * Jmakefile for jmake + */ + +;# $Id: Jmakefile,v 3.0.1.2 1995/03/21 08:34:16 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.2 1995/03/21 08:34:16 ram +;# patch52: now installs new fixcpp script in the private libdir +;# +;# Revision 3.0.1.1 1994/01/24 13:42:36 ram +;# patch16: added dependency generation stage +;# +;# Revision 3.0 1993/08/18 12:04:09 ram +;# Baseline for dist 3.0 netwide release. +;# + +AllTarget(Index) + +Index: bindex + chmod +x bindex + ./bindex + +ShellScriptTarget(jmake jmkmf) +SimpleShellScriptTarget(bindex fixcpp) + +MakeInstallDirectories($(PRIVLIB) $(PRIVLIB)/files) +InstallNonExec(Index,$(PRIVLIB)) +InstallScript(bindex,$(PRIVLIB)) +InstallScript(fixcpp,$(PRIVLIB)/files) +InstallMultipleFlags(files/Jmake*,$(PRIVLIB)/files,-m 444) + +BINSH = jmake.SH fixcpp.SH + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(BINSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + diff --git a/jmake/Makefile.SH b/jmake/Makefile.SH new file mode 100755 index 0000000..e562274 --- /dev/null +++ b/jmake/Makefile.SH @@ -0,0 +1,300 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL70] +: $X-Id: Jmake.tmpl,v 3.0.1.3 1997/02/28 14:56:16 ram Exp ram $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=jmake +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +INSTALLDIR=`echo $installdir | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.7 2004/08/22 08:28:58 ram Exp ram $ + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.2 1995/03/21 08:34:16 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.2 1995/03/21 08:34:16 ram +# patch52: now installs new fixcpp script in the private libdir +# +# Revision 3.0.1.1 1994/01/24 13:42:36 ram +# patch16: added dependency generation stage +# +# Revision 3.0 1993/08/18 12:04:09 ram +# Baseline for dist 3.0 netwide release. +# + +all:: Index + +local_realclean:: + $(RM) Index + +Index: bindex + chmod +x bindex + ./bindex + +all:: jmake jmkmf + +local_realclean:: + $(RM) jmake jmkmf + +jmake: jmake.SH + /bin/sh jmake.SH + +jmkmf: jmkmf.SH + /bin/sh jmkmf.SH + + +local_install:: $(SCRIPTS) $(LSCRIPTS) + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(SCRIPTDIR) || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(SCRIPTDIR)); \ + for file in $(SCRIPTS) $(LSCRIPTS); do \ + (set -x; \ + $(INSTALL) -c -m 555 $$file $(INSTALL_PREFIX)$(SCRIPTDIR)); \ + done + +local_deinstall:: + @for file in $(SCRIPTS) $(LSCRIPTS); do \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(RM) $(INSTALL_PREFIX)$(SCRIPTDIR)/$$file); \ + done + +local_install.man:: + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(MANSRC) || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(MANSRC)); \ + for file in $(SCRIPTS); do \ + if test -f $$file.man; then \ + (set -x; \ + $(INSTALL) -c -m 444 $$file.man \ + $(INSTALL_PREFIX)$(MANSRC)/$$file.$(L)); \ + fi; \ + done + +local_deinstall.man:: + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for file in $(SCRIPTS); do \ + (set -x; $(RM) $(INSTALL_PREFIX)$(MANSRC)/$$file.$(L)); \ + done + +all:: bindex fixcpp + +local_realclean:: + $(RM) bindex fixcpp + +bindex: bindex.SH + /bin/sh bindex.SH + +fixcpp: fixcpp.SH + /bin/sh fixcpp.SH + + +local_install:: + + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for dir in $(PRIVLIB) $(PRIVLIB)/files; do \ + (set -x; test -d $(INSTALL_PREFIX)$$dir || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$$dir); \ + done + +local_deinstall:: + + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for dir in $(PRIVLIB) $(PRIVLIB)/files; do \ + (set -x; test -d $$dir && $(RM) -r $(INSTALL_PREFIX)$$dir); \ + done + +local_install:: Index + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(PRIVLIB) || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(PRIVLIB)); \ + $(INSTALL) -c -m 444 Index $(INSTALL_PREFIX)$(PRIVLIB) + +local_deinstall:: + $(RM) $(INSTALL_PREFIX)$(PRIVLIB)/Index + +local_install:: bindex + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(PRIVLIB) || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(PRIVLIB)); \ + $(INSTALL) -c -m 555 bindex $(INSTALL_PREFIX)$(PRIVLIB) + +local_deinstall:: + $(RM) $(INSTALL_PREFIX)$(PRIVLIB)/bindex + +local_install:: fixcpp + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(PRIVLIB)/files || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(PRIVLIB)/files); \ + $(INSTALL) -c -m 555 fixcpp $(INSTALL_PREFIX)$(PRIVLIB)/files + +local_deinstall:: + $(RM) $(INSTALL_PREFIX)$(PRIVLIB)/files/fixcpp + +local_install:: files/Jmake* + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(PRIVLIB)/files || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(PRIVLIB)/files); \ + for i in files/Jmake*; do \ + (set -x; $(INSTALL) -c -m 444 $$i $(INSTALL_PREFIX)$(PRIVLIB)/files); \ + done + +local_deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in files/Jmake*; do \ + (set -x; $(RM) $(INSTALL_PREFIX)$(PRIVLIB)/files/$$i); \ + done + +BINSH = jmake.SH fixcpp.SH + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(BINSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +install: local_install +install.man: maybe_install.man +deinstall: local_deinstall +deinstall.man: maybe_deinstall.man + +install.man-yes: local_install.man +install.man-no: +deinstall.man-yes: local_deinstall.man +deinstall.man-no: + +!NO!SUBS! +case "$installmansrc" in +'') man=no;; +*) man=yes;; +esac +$spitshell >>Makefile <>Makefile <<'!NO!SUBS!' + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +local_install:: + @echo "install in $(CURRENT) done." + +local_deinstall:: + @echo "deinstall in $(CURRENT) done." + +local_install.man:: + @echo "install.man in $(CURRENT) done." + +local_deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/jmake/NOTES b/jmake/NOTES new file mode 100644 index 0000000..a11618d --- /dev/null +++ b/jmake/NOTES @@ -0,0 +1,189 @@ +The syntax in Jmake.rules is not elegant at all, but: + + - It is easy to parse (like sendmail.cf or troff files). + - The rules are not supposed to change very often. + - It is simple enough to be mastered in five minutes. :-) + +Here is a small description: + +o To deal with various cpp implementations: + +Final @!\ means: end of line, next line starts at the left margin. +Final @@\ means: end of line, next line is to be indented by one tab. + +The conversion occurs during Pass1. + + +o Symbol definitions + +>SYMBOL: defines the symbol (Pass 1). +?SYMBOL:: keeps iff SYMBOL is defined (Pass 2). +%SYMBOL:: keeps iff SYMBOL is not defined (Pass 2). + +The ?SYM can be nested (logical AND), as in: + + ?SYMBOL:%TOKEN:text /* Keeps text if SYMBOL and not TOKEN */ + +To implement a logical OR, see below. + + +o Commands + +Commands can be passed to 'jmake'. They start with a leading '|'. + +Available commands are: + +|suffix : adds to the .SUFFIXES: list in the makefile (Pass 1 & 2). +|rule:: adds to the building rule section (Pass 1 & 2). +|rule: : same as before, with a leading tab. +|skip: skips text until a line starting with '-skip' is found (Pass 2). +|expand : expand lines until '-expand' with (Pass 2). +|once : text up to '-once' appears only the first time (Pass 1). + +Thus, a way to implement a logical OR could be: + + /* Implements SYMBOL or not TOKEN */ + ?SYMBOL:text /* Keeps text if SYMBOL */ + %SYMBOL:|skip + %TOKEN:text /* Keeps text if not TOKEN */ + -skip + +Actually, this is ugly, because the text has to appear twice. +Fortunately, I did not use it. :-) + +The '|' commands cannot be nested. In particular, due to the simple +implementation of '|skip', it is impossible to put '|skip' inside +a skipped part. However, a '|once' section may have '|skip' sections. + +But actually, as you have surely already guessed, the best way to +implement a logical OR is to use De Morgan's Law: + + not (p or q) <=> not p and not q + + /* Implements SYMBOL or not TOKEN (attempt #2) */ + %SYMBOL:?TOKEN:|skip + text /* If SYMBOL or not TOKEN */ + -skip + +Who said they don't care ? ;-) + +o Expansion + +Expansion is done with the 'expand' command. It has been provided to +avoid some cumbersome writings in makefiles when you have to repeat some +silly lines that only differ in file names, for instance. Let's look at +an example first: + + |expand a!foo bar! b!yes no! + !a:: + echo !a, !b + -expand + +Then two rules will be printed, and the values of (a,b) for the first +will be (foo, yes), for the second (bar, no). Substitution is controled +by the '!' character. If the word to be substituted is part of another +one, detach with the ^^ construct as in: !b^^c. It is possible to +use Makefile macros in the , and they will be expanded by +jmake. If this is not what you want, escape the first '$' sign (this is +a Makefile escape, i.e. you must double the '$', not precede it with a +backslash). A // stands for the null substitution value. + +Here is another example which shows how the macro Expand can be used. +It is defined in Jmake.rules as: + + #define Expand(rule, pattern) @!\ + |expand pattern @!\ + rule @!\ + -expand + +So we can write in the Jmakefile: + + |skip + A = foo bar + -skip + + #define Rule @!\ + $(DIR)/!a^^.o: !a^^.o @@\ + $(CC) -c !a^^.c @@\ + $(MV) !a^^.o $(DIR) + + Expand(Rule, a!$(A)!) + +which will generate in Makefile.SH: + + $(DIR)/foo.o: foo.o + $(CC) -c foo.c + $(MV) foo.o $(DIR) + + $(DIR)/bar.o: bar.o + $(CC) -c bar.c + $(MV) bar.o $$(DIR) + +The 'A' declaration has been surrounded by skip, so that it does +not appear in the generated Makefile.SH, but it will be taken into +account by jmake for the substitution in the pattern. + +The number of expansions is determined by the number of possible +values for the _first_ parameter. If other parameters have less +substitution values, they will get void ones. + +It is possible to add a regular expression at the end of '-expand'. +This regular expression will be removed from the final set of expansion +at the end of each line. It is also possible to do substitutions in the +expanded item, by using the syntax (if 'f' is the expanded variable) +!f:

= where

and are two regular expressions (without +spaces). The pattern

will be replaced by pattern (only the +first occurrence will be replaced). + +Finally, you may refer in the expanded section to variables whose value +is computed via another expansion, which makes it easy to define generic +Jmakefiles. + +Example: + + SRC = foo.c bar.c + OBJ = \ + |expand f!$(SRC)! + !f:\.c=\.o \ + -expand \\ + INC = \ + |expand f!$(OBJ)! + !f:\.o=\.h \ + -expand \\ + +which will generate in Makefile.SH: + + SRC = foo.c bar.c + OBJ = \ + foo.o \ + bar.o + INC = \ + foo.h \ + bar.h + +Do not forget to protect special characters in your regular expressions such +as backslash, point, etc... + +o Once + +The once command is tagged with a name. The first time the name appears, +the once construct is ignored and the text up to '-once' will be copied +in the generated Makefile.SH. However, future occurences of the same +name will be ignored (once will behave like skip). + +Example: + + |once this_is_a_name + + -once + +o Initializations + ++: Puts the whole line in the initialization section (Pass 1 & 2). +++SYMBOL : Adds to the SYMBOL macro (Pass 1 and 2). + +o User-defined variables + +CFLAGS: added flags to C compiler +DPFLAGS: cpp flags to be added to mkdep for dependency +LDFLAGS: flags/libraries to be added at linking stage diff --git a/jmake/README b/jmake/README new file mode 100644 index 0000000..636cc8f --- /dev/null +++ b/jmake/README @@ -0,0 +1,70 @@ +This is the root directory for jmake. + +The jmake program is a Makefile generator. It comes from 'imake' one +may find in the X11R4 distribution, but it produces a Makefile.SH +instead of a Makefile. Jmake has a template which knows some metaconfig +symbols and has built-in commands which make it more powerful than imake. + +The jmkmf script may be used to produce the Makefile.SH from a Jmakefile. +Once the bootstrap is done, you can run 'make Makefile.SH' to rebuild the +Makefile.SH in the current directory, or 'make Makefiles.SH' to build the +Makefiles in a recursive manner. + +All the rules used by jmake are listed in an automatically built index. +The jmake's cryptic syntax is documented in file NOTES. You may also +have a look at the sample Jmakefiles that come with this package. +Usually, you do not include them in the release, but I kept them so +that you may have a real example and see how things are organized. + +If you choose to use jmake, then you will have to use metaconfig, in +order to get a meaningful value for all the needed symbol. Thus, each +time you change your Jmakefiles, it may be necessary to update the +Configure script. + +Here is how to use jmake... + +First, you have to write a Jmakefile for each directory where you want +to put a Makefile. Be sure to declare all the sub-directories with the +SetSubdirs rule. Usually, the order of the rules is not significant, +but you should make sure the Makefile begins with an 'all::' target, +so that a default 'make' does not run a clean for instance. + +Then, if this is the first time, you have to bootstrap. Go to the main +directory of your package and run: + + jmkmf + make Makefiles.SH + +which will first produce the main makefile and then recursively build +all the makefiles. + +Once you have bootstrapped once, you can edit a Jmakefile and rebuild +the local makefile with + + make Makefile + +or all the hierachy below with: + + make Makefiles.SH + +If you want to extract all the makefiles, you may run + + sh Makefile.SH + make Makefiles + +in the top-level directory. Finally, if you only want to test the +generated Makefile.SH without disturbing the Makefile, run + + make Makefile.SH + +which will stop before running the produced file through sh. + + +CAUTION: + +On machines whose cpp eats up tabs in macro expansion, the Makefile.SH +produced might not be indented properly inside rules. + +Perl 4.0 PL10 sometimes dumps core, while PL3 does not. Thus, perl 4.0 +PL10 should NOT be used with jmake, at least on a MIPS. + diff --git a/jmake/bindex.SH b/jmake/bindex.SH new file mode 100755 index 0000000..3905f85 --- /dev/null +++ b/jmake/bindex.SH @@ -0,0 +1,185 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting bindex (with variable substitutions)" +$spitshell >bindex <>bindex <<'!NO!SUBS!' + eval 'exec perl -S $0 "$@"' + if $runnning_under_some_shell; + +# $Id$ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $Log: bindex.SH,v $ +# Revision 3.0.1.1 1993/08/19 06:42:12 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:04:13 ram +# Baseline for dist 3.0 netwide release. +# + +$file = "files/Jmake.rules"; + +open(INDEX, ">Index") || die "Cannot create Index.\n"; +open(RULES, "$file") || die "Cannot open $file.\n"; + +print INDEX +"[This Index is automatically generated from Jmake.rules file. Do not +edit this file or your changes will be lost. Edit Jmake.rules instead.] + +This file contains a listing of all the macros that can be used in a +Jmakefile. Only a few of these should be used in the Jmakefile (they +are the top-level macros). However, some low-level ones may be useful, +but it is up to you to make that decision. This explains why this file +holds all the available macros for jmake. + +In the following listing, the macros are separated by a line of dashes. +The signature of the macro is given, then a small comment of what it +does precedes the actual definition. + +Lines preceded by '->' show the set of symbols defined when the macro is +used. Initialization lines are shown as-is, i.e. have the form SYM = val +while concatenation is shown by SYM += val (which means val is added to +the value of SYM). + +Conditional lines are preceded by tests like (if SYM). This means the line +is to be kept if and only if the symbol SYM is defined. Other internal +requests are not formatted yet. + +"; +$inrule = 0; # Not inside a rule at the beginning +$incomment = 0; # Not inside a comment +$last_was_text = 0; # Last line was not a rule text +while () { + $inrule || next unless /^\s\*\s(\w+)\s*:/; + if ($inrule) { # We are already in a rule + if ($incomment) { + if (m|^\s*\*/|) { # End of comment + $incomment = 0; + $Comment{$current} .= "\n"; + } else { + s/^\s*\*\s*//; # Remove leading comment sign + $Comment{$current} .= " $_"; + } + next; # Anyway, go to next line + } + if (/^\s*$/) { # Empty line = end of rule + $inrule = 0; + next; + } + # Here, we have to print the body of the rule, after some cleaning + s/(@#|@@|@!)\\$//; # Remove final continuations + s/^(#define.*)\\/$1/; # Remove single '\' on first rule line + s/\|rule:\s*$/\n/; + s/\|rule:\s+/ /; # Remove rule markers + s/\|rule://; + s/%(\w+):\|skip/#ifdef $1/; # Deal with ugly skip syntax + s/\?(\w+):\|skip/#ifndef $1/; # Deal with ugly skip syntax + s/\-skip/#endif/; + s/\?(\w+):/(if $1) /; # Simple '?' test + s/%(\w+):/(not $1) /; # Simple '%' test + s/\|suffix/.SUFFIXES:/; # Make suffix command explicit + s/\t/ /g; # Expand all tabs to 4 chars + s/\s*$/\n/; # Remove any trailing space + s|\^\^\^|/***/|; # Change ^^^ to the more visual /***/ + s|\^\^|/**/|; # Restore ^^ to the more visual /**/ + if (/^$/) { # If empty line + $Index{$current} .= "\n" if $last_was_text; + $last_was_text = 0; + next; + } + if (/^[>+]/) { # Special commands + if (s/^>\s*//) { # Wanted symbol + chop; + $Wants{$current} .= " $_"; + } elsif (/^\+\+\s*(\S+)\s*(.*)/) { # Added symbol + $Added{$current} .= "\t$1 += $2\n"; + } else { + s/^\+\s*(.*)//; + $Init{$current} .= "\t$1\n"; + } + next; + } + if (s/^#define\s+//) { # Definition of the rule + chop; + $Sig{$current} = $_; # Signature of rule + } else { + $Index{$current} .= " $_"; # Rule's body + $last_was_text = 1; + } + } else { # We've just entered a rule + $current = $1; + next if $current =~ /patch\d/; # Skip RCS log messages + $inrule = 1; + $incomment = 1; # We're still in the leading comment + $Seen{$current} = 1; + $last_was_text = 0; + } +} +close RULES; + +# Now sort the rules in alphabetical order + +print INDEX '-' x 72, "\n"; +foreach $rule (sort(keys %Seen)) { + print INDEX "$Sig{$rule}:\n"; + print INDEX $Comment{$rule}; + $line = $Wants{$rule}; + if (length($line)) { + $line = "->$line."; + $line = &format($line); + print INDEX "$line\n"; + } + $line = $Init{$rule}; + print INDEX "$line\n" if length($line); + $line = $Added{$rule}; + print INDEX "$line\n" if length($line); + $line = $Index{$rule}; + print INDEX $line; + print INDEX "\n" if (length($line)); + print INDEX '-' x 72, "\n"; +} + +close INDEX; + +# Format $_ to fit in 80 columns (70 + size of tabs) +# Long lines are split, and the all but the first are indented +# by two leading spaces. The whole thing is then indented by +# one tab. +sub format { + local($tmp); + local($head) = ''; + local($_) = shift(@_); + while (length($_) > 70) { + $tmp = substr($_,0,70); + $tmp =~ s/^(.*) .*/$1/; + $head .= "\t$tmp\n"; + $_ = ' ' . substr($_,length($tmp),9999); + } + $head .= "\t$_\n"; +} +!NO!SUBS! +chmod 755 bindex +$eunicefix bindex diff --git a/jmake/files/Jmake.rules b/jmake/files/Jmake.rules new file mode 100644 index 0000000..cf3e9d6 --- /dev/null +++ b/jmake/files/Jmake.rules @@ -0,0 +1,1801 @@ +;######################################################################## +;# Jmake rules for building libraries, programs, scripts, and data files +;# $Id: Jmake.rules,v 3.0.1.7 2004/08/22 08:28:58 ram Exp ram $ + +/* + * MACHINE-INDEPENDENT RULES -- DO NOT MODIFY + */ + +/* $Id: Jmake.rules,v 3.0.1.7 2004/08/22 08:28:58 ram Exp ram $ + * + * Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi + * + * You may redistribute only under the terms of the Artistic Licence, + * as specified in the README file that comes with the distribution. + * You may reuse parts of this distribution only within the terms of + * that same Artistic Licence; a copy of which may be found at the root + * of the source tree for dist 4.0. + * + * $Log: Jmake.rules,v $ + * Revision 3.0.1.7 2004/08/22 08:28:58 ram + * patch71: random cleanup + * + * Revision 3.0.1.6 1997/02/28 14:56:01 ram + * patch61: now handles USRINC for dependencies + * patch61: smarter about dependencies computation + * + * Revision 3.0.1.5 1995/09/25 09:07:19 ram + * patch59: smarter sed command to strip /usr/include dependencies + * + * Revision 3.0.1.4 1995/07/25 13:33:59 ram + * patch56: install of script man pages can now cope with missing files + * patch56: the clobber target now removes the .config directory as well + * + * Revision 3.0.1.3 1995/03/21 08:35:28 ram + * patch52: suppressed extra argument to NormalProgramTarget call + * + * Revision 3.0.1.2 1995/01/11 14:49:55 ram + * patch45: new macros ShellScriptTargetExt and SimpleShellScriptTargetExt + * patch45: directory installation is now made via INSTALLDIR (Configure) + * + * Revision 3.0.1.1 1994/10/29 15:46:30 ram + * patch36: added RemoteDependency rule + * + * Revision 3.0 1993/08/18 12:04:14 ram + * Baseline for dist 3.0 netwide release. + * + */ + +/* Please, edit only with tabstops = 4 (":set ts=4" under vi) */ + +/* + * AddedByConfigure: + * Gives name of the files generated by Configure that can safely + * be removed when a "make clobber" is issued. Not that it is useless + * to name config.h or config.sh because these are already taken care + * of by jmake. + */ +#define AddedByConfigure(files) @!\ +local_clobber:: @@\ + $(RM) files + +/* + * AddSuffix: + * Adds a sufix to the .SUFFIXES: list. + */ +#define AddSuffix(ext) @!\ +|suffix ext + + +/* + * AllTarget: + * Generate rules to build necessary things during make all. + */ +#define AllTarget(depends) @!\ +all:: depends @!\ + @!\ +local_realclean:: @@\ + $(RM) depends + +/* + * RemoveTargetProgram: + * This is used in some other macros in order to remove the target + * before starting its building (saves disk space). There should be + * no '@!' at the end of the '#define' line, because this macro is + * used *inside* building rules. + */ +#define RemoveTargetProgram(program) \ + $(RM) program @@\ + if test -f program^^^$(_EXE); then \ @@\ + $(MV) program^^^$(_EXE) program^^~^^^$(_EXE); fi + +/* + * NormalProgramTarget: + * Generate rules to compile and link the indicated program; since + * it does not use any default object files, it may be used for + * multiple programs in the same Jmakefile. + */ +#define NormalProgramTarget(program,sources,objects) @!\ +++OBJECTS objects @!\ +++SOURCES sources @!\ +NormalObjectRule() @!\ +AllTarget(program) @!\ + @!\ +program: objects @@\ + RemoveTargetProgram($@) @@\ + $(CC) -o $@ objects $(JLDFLAGS) $(LIBS) @!\ + + +/* + * SingleProgramTarget: + * Obsolete version of NormalProgramTarget that doesn't have + * deplibs. + */ +#define SingleProgramTarget(program,objects,libs) \ +NormalProgramTarget(program,objects,libs) + +/* + * SimpleProgramTarget: + * Generate rules for compiling and linking programs that only have + * one C source file. It should only be used in Jmakefiles that + * describe a single program. + */ +#define SimpleProgramTarget(program) @!\ +NormalProgramTarget(program,program.c,program.o) + + + +/* + * ComplexProgramTarget: + * Generate rules for compiling and linking the program specified by + * $(OBJS) and $(SRCS), installing the program and its man page, and + * generating dependencies. It should only be used in Jmakefiles + * that describe a single program. + */ +#define ComplexProgramTarget(program) @!\ +++OBJECTS $(OBJS) @!\ +++SOURCES $(SRCS) @!\ +NormalObjectRule() @!\ +AllTarget(program) @!\ + @!\ +program: $(OBJS) @@\ + RemoveTargetProgram($@) @@\ + $(CC) -o $@ $(OBJS) $(JLDFLAGS) $(LIBS) @!\ + @!\ +InstallProgram(program,$(BINDIR)) @!\ +InstallManPage(program,$(MANSRC)) @!\ +DependTarget() @!\ +LintTarget() + + +/* + * ComplexProgramTarget_1: + * Generate rules for compiling and linking the program specified by + * $(OBJS1) and $(SRCS1), installing the program and its man page, + * and generating dependencies for it and any programs described by + * $(SRCS2) and $(SRCS3). It should be used to build the primary + * program in Jmakefiles that describe multiple programs. + */ +#define ComplexProgramTarget_1(program) @!\ +++OBJECTS $(OBJS1) @!\ +++SOURCES $(SRCS1) @!\ +NormalObjectRule() @!\ +AllTarget(program) @!\ + @!\ +program: $(OBJS1) @@\ + RemoveTargetProgram($@) @@\ + $(CC) -o $@ $(OBJS1) $(JLDFLAGS) $(LIBS) @!\ + @!\ +InstallProgram(program,$(BINDIR)) @!\ +InstallManPage(program,$(MANSRC)) @!\ + @!\ +DependTarget() @!\ +LintTarget() + + +/* + * ComplexProgramTarget_2: + * Generate rules for compiling and linking the program specified by + * $(OBJS2) and $(SRCS2) and installing the program and man page. + * It should be used to build the second program in Jmakefiles + * describing more than one program. + */ +#define ComplexProgramTarget_2(program) @!\ +++OBJECTS $(OBJS2) @!\ +++SOURCES $(SRCS2) @!\ +NormalObjectRule() @!\ +AllTarget(program) @!\ + @!\ +program: $(OBJS2) @@\ + RemoveTargetProgram($@) @@\ + $(CC) -o $@ $(OBJS2) $(JLDFLAGS) $(LIBS) @!\ + @!\ +InstallProgram(program,$(BINDIR)) @!\ +InstallManPage(program,$(MANSRC)) + + +/* + * ComplexProgramTarget_3: + * Generate rules for compiling and linking the program specified by + * $(OBJS3) and $(SRCS3) and installing the program and man page. It + * should be used to build the third program in Jmakefiles describing + * more than one program. + */ +#define ComplexProgramTarget_3(program) @!\ +++OBJECTS $(OBJS3) @!\ +++SOURCES $(SRCS3) @!\ +NormalObjectRule() @!\ +AllTarget(program) @!\ + @!\ +program: $(OBJS3) @@\ + RemoveTargetProgram($@) @@\ + $(CC) -o $@ $(OBJS3) $(JLDFLAGS) $(LIBS) @!\ + @!\ +InstallProgram(program,$(BINDIR)) @!\ +InstallManPage(program,$(MANSRC)) + + +/* + * ComplexShellManualTarget: + * Builds manual pages that are to be extracted from .SH files into + * .$manext files. + */ +#define ComplexShellManualTarget(manpages) @!\ +++MANPAGE manpages @!\ +|once _ShellManualRule_ @!\ +|rule:.SH.$manext: @!\ +|rule: /bin/sh $< @!\ +|rule: @!\ +-once @!\ +AddSuffix(.SH) @!\ +AddSuffix(.$manext) @!\ +AllTarget(manpages) @!\ + @!\ +local_install.man:: @@\ + _MakeInstallDirIgnore($(MANSRC)) \ @@\ + for file in manpages; do \ @@\ + (set -x; $(INSTALL) -c -m 444 $$file \ @@\ + $(INSTALL_PREFIX)$(MANSRC)) || exit 1; \ @@\ + done @!\ + @!\ +local_deinstall.man:: @@\ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + for file in manpages; do \ @@\ + (set -x; $(RM) $(INSTALL_PREFIX)$(MANSRC)/$$file); \ @@\ + done + + +/* + * Initialize: + * Puts the line symbol = value in the initialization section of + * Makefile.SH (the one that is subject to parameter substitutions). + */ +#define Initialize(symbol,value) @!\ ++symbol = value + + +/* + * InstallLibrary: + * Generate rules to install the indicated library. + */ +#define InstallLibrary(libname,dest) @!\ +local_install:: lib^^libname.a @@\ + _MakeInstallDirIgnore(dest) \ @@\ + $(INSTALL) -c -m 644 lib^^libname.a $(INSTALL_PREFIX)^^^dest @@\ + $(RANLIB) dest/lib^^libname.a @@\ + chmod 444 dest/lib^^libnane.a @!\ + @!\ +local_deinstall:: @@\ + $(RM) $(INSTALL_PREFIX)^^^dest/lib^^libname.a + + +/* + * InstallSharedLibrary: + * Generate rules to install the shared library. + */ +#define InstallSharedLibrary(libname,rev,dest) @!\ +local_install:: lib^^libname.so.rev @@\ + _MakeInstallDirIgnore(dest) \ @@\ + $(INSTALL) -c -m 444 lib^^libname.so.rev $(INSTALL_PREFIX)^^^dest @!\ + @!\ +local_deinstall:: @@\ + $(RM) $(INSTALL_PREFIX)^^^dest/lib^^libname.so.rev + + +/* + * InstallSharedLibraryData: + * Generate rules to install the shared library data + */ +#define InstallSharedLibraryData(libname,rev,dest) @!\ +local_install:: lib^^libname.sa.rev @@\ + _MakeInstallDirIgnore(dest) \ @@\ + $(INSTALL) -c -m 444 lib^^libname.sa.rev $(INSTALL_PREFIX)^^^dest @!\ + @!\ +local_deinstall:: @@\ + $(RM) $(INSTALL_PREFIX)^^^dest/lib^^libname.sa.rev + + +/* + * InstallLibraryAlias: + * Generate rules to create a link from one library name to another + * for the purposes of aliasing. + */ +#define InstallLibraryAlias(libname,alias,dest) @!\ +local_install:: lib^^libname.a @@\ + $(RM) lib^^alias.a @@\ + -(cd dest; $(LN) lib^^libname.a lib^^alias.a) @!\ + @!\ +local_deinstall:: @@\ + $(RM) dest/lib^^alias.a + + +/* + * InstallLintLibrary: + * Generate rules to install the indicated lint library. + */ +#define InstallLintLibrary(libname,dest) @!\ +install.ln:: llib-l^^libname.ln @@\ + _MakeInstallDirIgnore(dest) \ @@\ + $(INSTALL) -c -m 444 llib-l^^libname.ln $(INSTALL_PREFIX)^^^dest @!\ + @!\ +deinstall.ln:: @@\ + $(RM) $(INSTALL_PREFIX)^^^dest/llib-l^^libname.ln + + +/* + * InstallManPageLong: + * Generate rules to install the indicated manual page, giving it an + * alternate name. This is used for installing man pages whose base + * name without the .man suffix would normally be longer than 8 + * characters (the limit for using source code control systems on + * files systems with short file names). + */ +#define InstallManPageLong(file,destdir,dest) @!\ +local_install.man:: file.man @@\ + _MakeInstallDirIgnore(destdir) \ @@\ + $(INSTALL) -c -m 444 file.man $(INSTALL_PREFIX)^^^destdir/dest.$(L) @!\ + @!\ +local_deinstall.man:: @@\ + $(RM) $(INSTALL_PREFIX)^^^destdir/dest.$(L) @!\ + + +/* + * InstallManPage: + * Generate rules to install the indicated manual page. + */ +#define InstallManPage(file,dest) @!\ +InstallManPageLong(file,dest,file) + + +/* + * InstallNonExec: + * Generate rules to install a data file using any special + * install flags. + */ +#define InstallNonExec(file,dest) @!\ +local_install:: file @@\ + _MakeInstallDirIgnore(dest) \ @@\ + $(INSTALL) -c -m 444 file $(INSTALL_PREFIX)^^^dest @!\ + @!\ +local_deinstall:: @@\ + $(RM) $(INSTALL_PREFIX)^^^dest/file + + +/* + * InstallProgramWithFlags: + * Generate rules to install an executable program using given + * install flags. + */ +#define InstallProgramWithFlags(program,dest,flags) @!\ +local_install:: program @@\ + _MakeInstallDirIgnore(dest) \ @@\ + $(INSTALL) -c -s -m 555 flags program^^^$(_EXE) $(INSTALL_PREFIX)^^^dest @!\ + @!\ +local_deinstall:: @@\ + $(RM) $(INSTALL_PREFIX)^^^dest/program^^^$(_EXE) + + +/* + * InstallProgram: + * Generate rules to install an executable program using any special + * install flags set in $(INSTALLFLAGS). + */ +#define InstallProgram(program,dest) @!\ +InstallProgramWithFlags(program,dest,^^) + + +/* + * InstallScriptWithFlags: + * Generate rules to install an executable script using given + * install flags. + */ +#define InstallScriptWithFlags(script,dest,flags) @!\ +local_install:: script @@\ + _MakeInstallDirIgnore(dest) \ @@\ + $(INSTALL) -c -m 555 flags script $(INSTALL_PREFIX)^^^dest @!\ + @!\ +local_deinstall:: @@\ + $(RM) $(INSTALL_PREFIX)^^^dest/script + + +/* + * InstallScript: + * Generate rules to install an executable script using any special + * install flags set in $(INSTALLFLAGS). + */ +#define InstallScript(script,dest) @!\ +InstallScriptWithFlags(script,dest,^^) + + +/* + * InstallScripts: + * Generate rules to install all the scripts listed in the generated + * $(SCRIPTS) and $(LSCRIPTS) macros. + */ +#define InstallScripts() @!\ +|once _InstallScripts_ @!\ +local_install:: $(SCRIPTS) $(LSCRIPTS) @@\ + _MakeInstallDirIgnore($(SCRIPTDIR)) \ @@\ + for file in $(SCRIPTS) $(LSCRIPTS); do \ @@\ + (set -x; \ @@\ + $(INSTALL) -c -m 555 $$file $(INSTALL_PREFIX)$(SCRIPTDIR)) || \ @@\ + exit 1; \ @@\ + done @!\ + @!\ +local_deinstall:: @@\ + @for file in $(SCRIPTS) $(LSCRIPTS); do \ @@\ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + (set -x; $(RM) $(INSTALL_PREFIX)$(SCRIPTDIR)/$$file); \ @@\ + done @!\ +-once + +/* + * InstallManScripts: + * Generate rule to install/deinstall manual pages for scripts listed + * in the automatically generated $(SCRIPTS) macro. + */ +#define InstallManScripts() @!\ +|once _InstallManScripts_ @!\ +?NOMAN:|skip @!\ +local_install.man:: @@\ + _MakeInstallDirIgnore($(MANSRC)) \ @@\ + for file in $(SCRIPTS); do \ @@\ + if test -f $$file.man; then \ @@\ + (set -x; \ @@\ + $(INSTALL) -c -m 444 $$file.man \ @@\ + $(INSTALL_PREFIX)$(MANSRC)/$$file.$(L)) || \ @@\ + exit 1; \ @@\ + fi; \ @@\ + done @!\ + @!\ +local_deinstall.man:: @@\ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + for file in $(SCRIPTS); do \ @@\ + (set -x; $(RM) $(INSTALL_PREFIX)$(MANSRC)/$$file.$(L)); \ @@\ + done @!\ + @!\ +-skip @!\ +-once + + + +/* + * LinkFileList: + * Link a list of list of files from one place to another + */ +#define LinkFileList(step,list,dir,sub) @!\ +step:: list @@\ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + echo " cd" dir; cd dir; for i in list; do (set -x; $(LN) sub/$$i .); done + + +/* + * InstallMultipleDestFlags: + * Generate rules to install multiple files at once during a particular + * step in the build using a specific set of install flags. + */ +#define InstallMultipleDestFlags(step,list,dest,flags) @!\ +step:: list @@\ + _MakeInstallDirIgnore(dest) \ @@\ + for i in list; do \ @@\ + (set -x; $(INSTALL) -c flags \ @@\ + $$i $(INSTALL_PREFIX)^^^dest) || exit 1;\ @@\ + done + +/* + * DeinstallMultipleDest: + * Generate rules to deinstall multiple files at once during a particular + * step in the build. + */ +#define DeinstallMultipleDest(step,list,dest) @!\ +step:: @@\ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + for i in list; do \ @@\ + (set -x; $(RM) $(INSTALL_PREFIX)^^^dest/$$i); \ @@\ + done + +/* + * InstallMultiple: + * Generate rules to install multiple files at once during the install + * step of the build using any install flags set in $(INSTALLFLAGS) + * and deinstall them. + */ +#define InstallMultiple(list,dest) @!\ +InstallMultipleDestFlags(local_install,list,dest,$(INSTALLFLAGS)) @!\ +DeinstallMultipleDest(local_deinstall,list,dest) + + +/* + * InstallMultipleFlags: + * Generate rules to install multiple files at once during the + * install step of the build using the given install flags. + */ +#define InstallMultipleFlags(list,dest,flags) @!\ +InstallMultipleDestFlags(local_install,list,dest,flags) @!\ +DeinstallMultipleDest(local_deinstall,list,dest) + + +/* + * InstallMultipleMan: + * Generate rules to install a variety of manual pages + * during the install.man step of the build. + */ +#define InstallMultipleMan(list,dest) @!\ +InstallMultipleDestFlags(local_install.man,list,dest,$(INSTALLFLAGS)) @!\ +DeinstallMultipleDest(local_deinstall.man,list,dest) + + +/* + * DependDependency: + * Generate rules to build the makedepend program. + */ +#define DependDependency() @!\ +depend:: TOPDIR/mkdep @!\ + @!\ +TOPDIR/mkdep: @!\ +?TOP: @echo "You have to run Configure first."; exit 1 @!\ +%TOP: @echo "You have to run Configure in $(TOP) first."; exit 1 + + +/* + * DependTarget: + * Generate rules to compute dependencies for all files listed + * in $(SOURCES) (automatically generated macro). + */ +#define DependTarget() @!\ ++USRINC = $usrinc @!\ +|once _DependTarget_ @!\ +DependDependency() @!\ + @!\ +depend:: @@\ + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ @@\ + $(MKDEP) $(SOURCES) | \ @@\ + $(SED) -e 's:/usr/lib[^ ]*::g; s:$(USRINC)[^ ]*::g; ' \ @@\ + -e '/: / b print' -e '$$ b print' -e 'H; d; n; : print' \ @@\ + -e 'x; s/\\$$//; s/\\\n//g; s/ ^^ */ /g; s/ :/:/;' -e '/: *$$/d' \ @@\ + ) > Makefile.new @@\ + cp Makefile Makefile.bak @@\ + cp Makefile.new Makefile @@\ + $(RM) Makefile.new @!\ + @!\ +-once + + +/* + * CleanTarget: + * Generate rules to remove any garbage files. + */ +#define CleanTarget() @!\ +?SUBDIRS:clean: sub_clean local_clean @!\ +%SUBDIRS:clean: local_clean @!\ +?SUBDIRS:realclean: sub_realclean local_realclean @!\ +%SUBDIRS:realclean: local_realclean @!\ +?SUBDIRS:clobber: sub_clobber local_clobber @!\ +%SUBDIRS:clobber: local_clobber @!\ + @!\ +local_clean:: @@\ + if test -f core; then $(RM) core; fi @@\ + $(RM) *~ *.o @!\ + @!\ +local_realclean:: local_clean @!\ +?TOP: $(RM) -r UU @!\ + @!\ +local_clobber:: local_realclean @!\ +%TOP: $(RM) Makefile config.sh @!\ +?TOP: $(RM) config.sh config.h @!\ +?TOP: $(RM) -r .config @!\ +?TOP: $(RM) Makefile @!\ + + +/* + * InstallTarget: + * Generate rules to recursively install files + */ +#define InstallTarget() @!\ +?SUBDIRS:install: local_install sub_install @!\ +%SUBDIRS:install: local_install @!\ +?SUBDIRS:install.man: maybe_install.man sub_install.man @!\ +%SUBDIRS:install.man: maybe_install.man @!\ +?SUBDIRS:deinstall: sub_deinstall local_deinstall @!\ +%SUBDIRS:deinstall: local_deinstall @!\ +?SUBDIRS:deinstall.man: sub_deinstall.man maybe_deinstall.man @!\ +%SUBDIRS:deinstall.man: maybe_deinstall.man @!\ + @!\ +?MANSRC:install.man-yes: local_install.man @!\ +install.man-no: @!\ +?MANSRC:deinstall.man-yes: local_deinstall.man @!\ +deinstall.man-no: @!\ + + +/* + * TagsTarget: + * Generate rules to compute tags files for C source code. + */ +#define TagsTarget() @!\ +tags:: @@\ + $(CTAGS) -w *.[ch] @@\ + $(CTAGS) -xw *.[ch] > tags @!\ + @!\ +local_clobber:: @@\ + $(RM) tags + + + +/* + * BuildMakefileSH: + * Generate rules to build a Makefile.SH from an Jmakefile and any + * special jmake flags. This is generally done automatically by the + * template or by any special Jmakefiles. + * This function will simply touch Makefile.SH if no $(TOP)/.package + * exists, assuming the Jmakefile is not in a production environment. + */ +#define BuildMakefileSH(jmakeflags) @!\ +Makefile.SH: Jmakefile @@\ + -@if test -f $(TOP)/.package; then \ @@\ + if test -f Makefile.SH; then \ @@\ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ @@\ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ @@\ + fi; \ @@\ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" jmakeflags; \ @@\ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) jmakeflags; \ @@\ + else touch $@; fi + + +/* + * BuildMakefile: + * Generate rules to build a Makefile from a Makefile.SH. + */ +#define BuildMakefile() @!\ +Makefile: Makefile.SH @@\ + /bin/sh Makefile.SH + + +/* + * MakefileTarget: + * Generate rules to build a normal Makefile. + */ +#define MakefileTarget() @!\ +BuildMakefileSH(^^) @!\ +BuildMakefile() + + +/* + * NormalObjectRule: + * Generate make rule to build usual object files. + */ +#define NormalObjectRule() @!\ +|once _ObjectRule_ @!\ +|rule:.c.o: @!\ +|rule: $(CC) -c $(JCFLAGS) $< @!\ +|rule: @!\ +-once + +/* + * NormalLibraryObjectRule: + * Generate make rules to build "normal" objects. + */ +#define NormalLibraryObjectRule() @!\ +|once _ObjectRule_ @!\ +|rule:.c.o: @!\ +|rule: $(RM) $@ @!\ +|rule: $(CC) -c $(JCFLAGS) $< @!\ +|rule: @!\ +-once + +/* + * ProfiledLibraryObjectRule: + * Generate make rules to build both profiled and "normal" objects. + */ +#define ProfiledLibraryObjectRule() @!\ +all:: @@\ + @if [ ! -d profiled ]; then mkdir profiled; fi @!\ + @!\ +|rule:.c.o: @!\ +|rule: $(RM) $@ profiled/$@ @!\ +|rule: $(CC) -pg -c $(JCFLAGS) $*.c @!\ +|rule: $(MV) $*.o profiled/$*.o @!\ +|rule: $(CC) -c $(JCFLAGS) $*.c @!\ +|rule: @!\ +local_clean:: @@\ + -@if [ -d profiled ]; then echo " $(RM) profiled/?*.o"; \ @@\ + $(RM) profiled/?*.o; fi + + +/* + * DebuggedLibraryObjectRule: + * Generate make rules to build both debuggable and "normal" + * objects. + */ +#define DebuggedLibraryObjectRule() @!\ +all:: @@\ + @if [ ! -d debugger ]; then mkdir debugger; fi @!\ + @!\ +|rule:.c.o: @!\ +|rule: $(RM) $@ debugger/$@ @!\ +|rule: $(CC) -g -c $(JCFLAGS) $*.c @!\ +|rule: $(MV) $*.o debugger/$*.o @!\ +|rule: $(CC) -c $(JCFLAGS) $*.c @!\ +|rule: @!\ +local_clean:: @@\ + -@if [ -d debugger ]; then echo " $(RM) debugger/?*.o"; \ @@\ + $(RM) debugger/?*.o; fi + + +/* + * DebuggedAndProfiledLibraryOjbectRule: + * Generate make rules to build debuggable, profiled, and "normal" + * objects. + */ +#define DebuggedAndProfiledLibraryObjectRule() @!\ +all:: @@\ + @if [ ! -d profiled ]; then mkdir profiled; fi @@\ + @if [ ! -d debugger ]; then mkdir debugger; fi @!\ + @!\ +|rule:.c.o: @!\ +|rule: $(RM) $@ profiled/$@ debugger/$@ @!\ +|rule: $(CC) -pg -c $(JCFLAGS) $*.c @!\ +|rule: $(MV) $*.o profiled/$*.o @!\ +|rule: $(CC) -g -c $(JCFLAGS) $*.c @!\ +|rule: $(MV) $*.o debugger/$*.o @!\ +|rule: $(CC) -c $(JCFLAGS) $*.c @!\ +|rule: @!\ +local_clean:: @@\ + -@if [ -d profiled ]; then echo " $(RM) profiled/?*.o"; \ @@\ + $(RM) profiled/?*.o; fi @@\ + -@if [ -d debugger ]; then echo " $(RM) debugger/?*.o"; \ @@\ + $(RM) debugger/?*.o; fi + + +/* + * SharedLibraryObjectRule: + * Generate make rules to build shared and "normal" object files. + */ +#define SharedLibraryObjectRule() @!\ +all:: @@\ + @if [ ! -d shared ]; then mkdir shared; fi @!\ + @!\ +|rule:.c.o: @!\ +|rule: $(RM) $@ shared/$@ @!\ +|rule: $(CC) -pic -c $(SHAREDCODEDEF) $(SHLIBDEF) $(JCFLAGS) $*.c @!\ +|rule: $(MV) $*.o shared/$*.o @!\ +|rule: $(CC) -c $(SHLIBDEF) $(JCFLAGS) $*.c @!\ +|rule: @!\ +local_clean:: @@\ + -@if [ -d shared ]; then echo " $(RM) shared/?*.o"; \ @@\ + $(RM) shared/?*.o; fi + +/* + * SharedAndDebuggedLibraryObjectRule: + * Generate make rules to build shared, debuggable, and "normal" + * object files. + */ +#define SharedAndDebuggedLibraryObjectRule() @!\ +all:: @@\ + @if [ ! -d shared ]; then mkdir shared; fi @@\ + @if [ ! -d debugger ]; then mkdir debugger; fi @!\ + @!\ +|rule:.c.o: @!\ +|rule: $(RM) $@ shared/$@ debugger/$@ @!\ +|rule: $(CC) -pic -c $(SHAREDCODEDEF) $(SHLIBDEF) $(JCFLAGS) $*.c @!\ +|rule: $(MV) $*.o shared/$*.o @!\ +|rule: $(CC) -g -c $(SHLIBDEF) $(JCFLAGS) $*.c @!\ +|rule: $(MV) $*.o debugger/$*.o @!\ +|rule: $(CC) -c $(SHLIBDEF) $(JCFLAGS) $*.c @!\ +|rule: @!\ +local_clean:: @@\ + -@if [ -d shared ]; then echo " $(RM) shared/?*.o"; \ @@\ + $(RM) shared/?*.o; fi @@\ + -@if [ -d debugger ]; then echo " $(RM) debugger/?*.o"; \ @@\ + $(RM) debugger/?*.o; fi + +/* + * SpecialSharedAndDebuggedObjectRule: + * Generate rules to compile a file with special flags and to make + * shared and debuggable versions. + */ +#define SpecialSharedAndDebuggedObjectRule(objs,depends,options) @!\ +all:: @@\ + @if [ ! -d shared ]; then mkdir shared; fi @@\ + @if [ ! -d debugger ]; then mkdir debugger; fi @!\ + @!\ +objs: depends @@\ + $(RM) $@ shared/$@ debugger/$@ @@\ + $(CC) -pic -c $(SHAREDCODEDEF) $(SHLIBDEF) $(JCFLAGS) options $*.c @@\ + $(MV) $*.o shared/$*.o @@\ + $(CC) -g -c $(SHLIBDEF) $(JCFLAGS) options $*.c @@\ + $(MV) $*.o debugger/$*.o @@\ + $(CC) -c $(SHLIBDEF) $(JCFLAGS) options $*.c + +/* + * SpecialSharedObjectRule: + * Generate rules to compile a file with special flags and to make + * shared and debuggable versions. + */ +#define SpecialSharedObjectRule(objs,depends,options) @!\ +all:: @@\ + @if [ ! -d shared ]; then mkdir shared; fi @!\ + @!\ +objs: depends @@\ + $(RM) $@ shared/$@ @@\ + $(CC) -pic -c $(SHAREDCODEDEF) $(SHLIBDEF) $(JCFLAGS) options $*.c @@\ + $(MV) $*.o shared/$*.o @@\ + $(CC) -c $(SHLIBDEF) $(JCFLAGS) options $*.c + + +/* + * SpecialObjectRule: + * Generate rules to compile a file with special flags. + */ +#define SpecialObjectRule(objs,depends,options) @!\ +objs: depends @@\ + $(RM) $@ @@\ + $(CC) -c $(JCFLAGS) options $*.c + + +/* + * SpecialProfiledObjectRule: + * Generate rules to compile a file with special flags and to make a + * profiled version. + */ +#define SpecialProfiledObjectRule(objs,depends,options) @!\ +all:: @@\ + @if [ ! -d profiled ]; then mkdir profiled; fi @!\ + @!\ +objs: depends @@\ + $(RM) $@ profiled/$@ @@\ + $(CC) -pg -c $(JCFLAGS) options $*.c @@\ + $(MV) $*.o profiled/$*.o @@\ + $(CC) -c $(JCFLAGS) options $*.c + + +/* + * SpecialDebuggedObjectRule: + * Generate rules to compile a file with special flags and to make a + * debuggable version. + */ +#define SpecialDebuggedObjectRule(objs,depends,options) @!\ +all:: @@\ + @if [ ! -d debugger ]; then mkdir debugger; fi @!\ + @!\ +objs: depends @@\ + $(RM) $@ debugger/$@ @@\ + $(CC) -g -c $(JCFLAGS) options $*.c @@\ + $(MV) $*.o debugger/$*.o @@\ + $(CC) -c $(JCFLAGS) options $*.c + + +/* + * SpecialDebuggedAndProfiledObjectRule: + * Generate rules to compile a file with special flags and to make + * debuggable and profiled versions. + */ +#define SpecialDebuggedAndProfiledObjectRule(objs,depends,options) @!\ +all:: @@\ + @if [ ! -d profiled ]; then mkdir profiled; fi @@\ + @if [ ! -d debugger ]; then mkdir debugger; fi @!\ + @!\ +objs: depends @@\ + $(RM) $@ profiled/$@ debugger/$@ @@\ + $(CC) -pg -c $(JCFLAGS) options $*.c @@\ + $(MV) $*.o profiled/$*.o @@\ + $(CC) -g -c $(JCFLAGS) options $*.c @@\ + $(MV) $*.o debugger/$*.o @@\ + $(CC) -c $(JCFLAGS) options $*.c + + +/* + * NormalLibraryTarget: + * Generate rules to create a library. The 'srclist' and 'objlist' + * parameters are added to SOURCES and OBJECTS macros. The 'srclist' + * is not otherwise used by this rule, but is necessary for make depend. + */ +#define NormalLibraryTarget(libname,srclist,objlist) @!\ +++OBJECTS objlist @!\ +++SOURCES srclist @!\ +NormalLibraryObjectRule() @!\ +AllTarget(lib^^libname.a) @!\ + @!\ +lib^^libname.a: objlist @@\ + $(RM) $@ @@\ + $(AR) $@ objlist @@\ + $(RANLIB) $@ + + +/* + * NormalSharedLibraryTarget: + * Generate rules to create a shared library; build it into a + * different name so that the we don't hose people by having the + * library gone for long periods. + */ +#define NormalSharedLibraryTarget(libname,rev,solist) @!\ +AllTarget(lib^^libname.so.rev) @!\ + @!\ +lib^^libname.so.rev: solist @@\ + $(RM) $@~ @@\ + (cd shared; $(LD) -o ../$@~ -assert pure-text solist) @@\ + $(RM) $@ @@\ + $(MV) $@~ $@ + +/* + * NormalSharedLibraryDataTarget: + * Generate rules to create shlib data file; build it into a + * different name so that the we don't hose people by having the + * library gone for long periods. + */ +#define NormalSharedLibraryDataTarget(libname,rev,salist) @!\ +AllTarget(lib^^libname.sa.rev) @!\ + @!\ +lib^^libname.sa.rev: salist @@\ + $(RM) $@ @@\ + $(AR) $@ salist @@\ + $(RANLIB) $@ + + +/* + * NormalLibraryTarget2: + * Generate rules to create a library in two steps. This is used to + * create libraries with large numbers of files. + */ +#define NormalLibraryTarget2(libname,srclist,objlist1,objlist2) @!\ +++SOURCES srclist @!\ +++OBJECTS objlist1 @!\ +++OBJECTS objlist2 @!\ +NormalLibraryObjectRule() @!\ +AllTarget(lib^^libname.a) @!\ + @!\ +lib^^libname.a: objlist1 objlist2 @@\ + $(RM) $@ @@\ + $(AR) $@ objlist1 @@\ + $(AR) $@ objlist2 @@\ + $(RANLIB) $@ + + +/* + * ProfiledLibraryTarget: + * Generate rules to create a profiled library. + */ +#define ProfiledLibraryTarget(libname,srclist,objlist) @!\ +++SOURCES srclist @!\ +++OBJECTS objlist @!\ +AllTarget(lib^^libname^^_p.a) @!\ + @!\ +lib^^libname^^_p.a: objlist @@\ + $(RM) $@ @@\ + cd profiled; $(AR) ../$@ objlist @@\ + $(RANLIB) $@ + + +/* + * DebuggedLibraryTarget: + * Generate rules to create a debuggable library. + */ +#define DebuggedLibraryTarget(libname,srclist,objlist) @!\ +++SOURCES srclist @!\ +++OBJECTS objlist @!\ +AllTarget(lib^^libname^^_d.a) @!\ + @!\ +lib^^libname^^_d.a: objlist @@\ + $(RM) $@ @@\ + cd debugger; $(AR) ../$@ objlist @@\ + $(RANLIB) $@ + + +/* + * AliasedLibraryTarget: + * Generate rules to link one library to another. + */ +#define AliasedLibraryTarget(libname,alias) @!\ +AllTarget(lib^^alias.a) @!\ + @!\ +lib^^alias.a: lib^^libname.a @@\ + $(RM) $@ @@\ + $(LN) lib^^libname.a $@ + + +/* + * PrelinkedRelocatableTarget: + * Generate rules to produce a relocatable object file instead of a + * library. + */ +#define PrelinkedRelocatableTarget(objname,objlist,libs) @!\ +AllTarget(objname.o) @!\ + @!\ +objname.o: objlist @@\ + $(RM) $@ @@\ + $(LD) $(JLDFLAGS) -r objlist -o $@ libs + + +/* + * NormalObjectTarget: + * Generate rules to produce a single object file.o from a file.c. + */ +#define NormalObjectTarget(file) @!\ +++SOURCES file^^.c @!\ +AllTarget(file^^.o) @!\ +NormalObjectRule() + +/* + * NormalRelocatableTarget: + * Generate rules to produce a relocatable object file instead of a + * library. + */ +#define NormalRelocatableTarget(objname,objlist) @!\ +AllTarget(objname.o) @!\ + @!\ +objname.o: objlist @@\ + $(RM) $@ @@\ + $(LD) $(JLDFLAGS) -r objlist -o $@ + + +/* + * ProfiledRelocatableTarget: + * Generate rules to produce a profiled relocatable object file + * instead of a library. + */ +#define ProfiledRelocatableTarget(objname,objlist) @!\ +AllTarget(objname^^_p.o) @!\ + @!\ +objname^^_p.o: objlist @@\ + $(RM) $@ @@\ + $(LD) -X -r objlist -o $@ + + +/* + * DebuggedRelocatableTarget: + * Generate rules to produce a debuggable relocatable object file + * instead of a library. + */ +#define DebuggedRelocatableTarget(objname,objlist) @!\ +AllTarget(objname^^_d.o) @!\ + @!\ +objname^^_d.o: objlist @@\ + $(RM) $@ @@\ + $(LD) -X -r objlist -o $@ + +/* + * LintLibraryTarget: + * Generate rules to create a lint library. Note that the lint + * library is always forced to be newer than the library itself. + */ +#define LintLibraryTarget(libname,srclist) @!\ +lintlib:: llib-l^^libname.ln @!\ + @!\ +llib-l^^libname.ln: srclist @@\ + $(RM) $@ @@\ + $(LINT) $(LINTLIBFLAG)^^libname $(LINTFLAGS) srclist + + +/* + * NormalLintTarget: + * Generate rules to lint a set of sources. + */ +#define NormalLintTarget(srclist) @!\ +lint: @@\ + $(LINT) $(LINTFLAGS) srclist $(LINTLIBS) + + +/* + * LintTarget: + * Generate rules to lint $(SOURCES) (automatically generated) + */ +#define LintTarget() @!\ +|once _LintTarget_ @!\ +NormalLintTarget($(SOURCES)) @!\ +-once + + +/* + * LinkSourceFile: + * Snag source file from some other directory + */ +#define LinkSourceFile(src,dir) @!\ +src: dir/src @@\ + $(RM) $@ @@\ + $(LN) $? $@ @!\ + + +/* + * MakeSubincludesForBuild: + * Make includes in sub directories. + */ +#define MakeSubincludesForBuild(step,dir,srclist) @!\ +step:: dir srclist @@\ + @-(list=`echo srclist | sed -e 's/[^ ]*\///g'`; \ @@\ + set -x; cd dir; $(RM) $$list) @@\ + @for i in srclist; do \ @@\ + (set -x; cd dir; $(LN) ../$$i .) || exit 1; \ @@\ + done @!\ + @!\ +MakeDirectories(dir,dir) @!\ + @!\ +local_realclean:: @@\ + @-(if [ -d dir ]; then \ @@\ + list=`echo srclist | sed -e 's/[^ ]*\///g'`; \ @@\ + set -x; cd dir; $(RM) $$list; fi) + + +/* + * CommonSubdirsRule: + * Rule for making $(TARGET) in every subdirectory, with $(VERB) as + * verbose message and $(FLAGS) as additional flags. + */ +#define CommonSubdirsRule(dirs) @!\ +subdirs: @@\ + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ @@\ + for i in dirs ;\ @@\ + do \ @@\ + (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ @@\ + $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)) || exit 1; \ @@\ + done + + +/* + * NamedTargetSubdirsRule: + * Recursively make a series of steps in the specified directories. + */ +#define NamedTargetSubdirsRule(dirs,name,verb,flags) @!\ +name:: @@\ + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ @@\ + for i in dirs ;\ @@\ + do \ @@\ + (cd $$i ; echo verb "in $(DIR)$$i..."; \ @@\ + $(MAKE) $(MFLAGS) flags name) || exit 1; \ @@\ + done + + +/* + * NamedTargetSubdirs: + * Recursively make a series of steps. + */ +#define NamedTargetSubdirs(name,verb,flags) @!\ +name:: @@\ + @$(MAKE) subdirs TARGET=name VERB=verb FLAGS=flags + + +/* + * NamedSubTargetSubdirs: + * Recursively make a series of steps, like NamedTargetSubdirs. + * However, the supplied "name" has "sub_" prefixed to it. + */ +#define NamedSubTargetSubdirs(name,verb,flags) @!\ +sub_^^^name:: @@\ + @$(MAKE) subdirs TARGET=name VERB=verb FLAGS=flags + +/* + * NamedDepthTargetSubdirs: + * Recursively make a series of steps. We first enter the + * subdirectories, then perform the local entries. + * The supplied "name" has "sub_" prefixed to it. + */ +#define NamedDepthTargetSubdirs(name,verb,flags) @!\ +sub_^^^name:: @@\ + @$(MAKE) subdirs TARGET=name VERB=verb FLAGS=flags @@\ + @echo "Back to $(CURRENT) for "name^^... + + +/* + * MakeSubdirs: + * Generate rules to do makes in the given subdirectories. + */ +#define MakeSubdirs() \ +NamedTargetSubdirs(all,"Making all",^^) + + +/* + * DependDirs: + * Generate rules to recursively compute dependencies as part of the + * make depend step. + */ +#define DependDirs(dirs) \ +NamedTargetSubdirsRule(dirs,depend,"Depending",^^) + + +/* + * DependSubdirs: + * Generate rules to recursively compute dependencies as part of the + * make depend step. + */ +#define DependSubdirs() \ +DependDirs($(SUBDIRS)) + + +/* + * InstallSubdirs: + * Generate rules to recursively install and deinstall programs and + * files. + */ +#define InstallSubdirs() \ +NamedSubTargetSubdirs(install,"Installing",^^) @!\ +NamedDepthTargetSubdirs(deinstall,"Deinstalling",^^) + + +/* + * InstallManSubdirs: + * Generate rules to recursively install and deinstall manual pages. + */ +#define InstallManSubdirs() \ +NamedSubTargetSubdirs(install.man,"Installing man pages",^^) @!\ +NamedDepthTargetSubdirs(deinstall.man,"Deinstalling man pages",^^) + + +/* + * IncludesSubdirs: + * Generate rules to recursively put include files in build + */ +#define IncludesSubdirs() \ +NamedTargetSubdirs(includes,including,^^) + + +/* + * CleanSubdirs: + * Generate rules to recursively clean out garbage files. + */ +#define CleanSubdirs() \ +NamedDepthTargetSubdirs(clean,"Cleaning",^^) @!\ +NamedDepthTargetSubdirs(realclean,"Real cleaning",^^) @!\ +NamedDepthTargetSubdirs(clobber,"Clobbering",^^) + + +/* + * TagSubdirs: + * Generate rules to recursively create tags files. + */ +#define TagSubdirs(dirs) \ +NamedTargetSubdirsRule(dirs,tag,"Tagging",^^) + +/* + * MakeLintSubdirs: + * Generate rules to recursively lint directories as part of the + * named step. + */ +#define MakeLintSubdirs(dirs,target) \ +NamedTargetSubdirsRule(dirs,target,"Linting",^^) + + +/* + * LintDirs: + * Generate rules to recursively lint directories as part of the + * make lint step. + */ +#define LintDirs(dirs) \ +MakeLintSubdirs(dirs,lint) + + +/* + * LintSubdirs: + * Generate rules to recursively lint directories as part of the + * make lint step. + */ +#define LintSubdirs() \ +LintDirs($(SUBDIRS)) + + +/* + * MakeDirs: + * Creates a set of directories, even if some directories in the path + * do not already exist. There should be no '@!' at the end of the + * '#define' line, because this macro is used *inside* building rules. + */ +#define MakeDirs(dirs) \ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + for dir in dirs; do \ @@\ + (set -x; test -d $$dir || $(INSTALLDIR) $$dir) || \ @@\ + exit 1; \ @@\ + done + +/* + * _MakeInstallDirs: + * Creates a set of intall directories, even if some directories in the path + * do not already exist. There should be no '@!' at the end of the + * '#define' line, because this macro is used *inside* building rules. + */ +#define _MakeInstallDirs(dirs) \ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + for dir in dirs; do \ @@\ + _MakeInstallDir($$dir) \ @@\ + done + +/* + * _MakeInstallDir: + * Internal macro to create a missing install directory. + */ +#define _MakeInstallDir(dir) \ + (set -x; test -d $(INSTALL_PREFIX)^^^dir || \ @@\ + $(INSTALLDIR) $(INSTALL_PREFIX)^^^dir); + +/* + * _MakeInstallDirIgnore: + * Same as _MakeInstallDir but handles "make -i" as well. + */ +#define _MakeInstallDirIgnore(dir) \ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + _MakeInstallDir(dir) + +/* + * _RmInstallDirs: + * Removes a set of intall directories. + * There should be no '@!' at the end of the '#define' line, because this + * macro is used *inside* building rules. + */ +#define _RmInstallDirs(dirs) \ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + for dir in dirs; do \ @@\ + (set -x; test -d $$dir && $(RM) -r $(INSTALL_PREFIX)$$dir); \ @@\ + done + +/* + * MakeDirectories: + * Generate rules to create a hierarchy of directories. + */ +#define MakeDirectories(step,dirs) @!\ +step:: @!\ + MakeDirs(dirs) + + +/* + * MakeInstallDirectories: + * Generate a rule to create a set of directories at installation + * time (removed by deinstall). + */ +#define MakeInstallDirectories(dirs) @!\ +local_install:: @@\ + _MakeInstallDirs(dirs) @!\ + @!\ +local_deinstall:: @@\ + _RmInstallDirs(dirs) + + +/* + * MakeLintLibSubdirs: + * Generate rules to recursively create lint libraries. + */ +#define MakeLintLibSubdirs(dirs) @!\ +MakeLintSubdirs(dirs,lintlib) + + +/* + * MakeMakeSubdirs: + * Generate rules to recursively recreate target as part of the + * specified step in the build. This assumes Makefile.SH has + * already been built (which is the case for a delivery), but does + * not rely on the existence of a Makefile. + */ +#define MakeMakeSubdirs(target) @!\ +target:: @@\ + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ @@\ + for i in $(SUBDIRS);\ @@\ + do \ @@\ + echo "Making "target" in $(DIR)$$i..."; \ @@\ + (cd $$i || exit 1; \ @@\ + if test ! -f Makefile; then /bin/sh Makefile.SH; fi; \ @@\ + $(MAKE) $(MFLAGS) target) || exit 1;\ @@\ + done + + +/* + * MakeMakefilesSH: + * Generate rules to recursively recreate target as part of the + * specified step in the build. If $(TOP) is set to an absolute + * path, don't prepend the ../ prefix. This makes running things + * outside of the source tree to be much easier. + */ +#define MakeMakefilesSH() @!\ +Makefiles.SH:: Makefile.SH @@\ + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ @@\ + for i in $(SUBDIRS);\ @@\ + do \ @@\ + case "$(DIR)$$i/" in \ @@\ + ^^*^^/^^*^^/^^*^^/^^*^^/) newtop=../../../..;; \ @@\ + ^^*^^/^^*^^/^^*^^/) newtop=../../..;; \ @@\ + ^^*^^/^^*^^/) newtop=../..;; \ @@\ + *^^/) newtop=..;; \ @@\ + esac; \ @@\ + case "$(TOP)" in \ @@\ + /^^*) newtop="$(TOP)" ;; \ @@\ + esac; \ @@\ + echo "Making Makefiles.SH in $(DIR)$$i..."; \ @@\ + (cd $$i || exit 1; \ @@\ + if test -f Jmakefile; then \ @@\ + $(MAKE) $(MFLAGS) -f ../Makefile \ @@\ + Makefile TOP=$$newtop CURRENT=$(DIR)$$i && \ @@\ + $(MAKE) $(MFLAGS) Makefiles.SH; \ @@\ + fi; \ @@\ + ) || exit 1; \ @@\ + done + + +/* + * MakefileSubdirs: + * Generate rules to create Makefiles. + */ +#define MakefileSubdirs() @!\ +MakeMakeSubdirs(Makefiles) @!\ +MakeMakefilesSH() + + +/* + * CppScriptTarget: + * Generate rules to create a shell script by running the input + * through cpp. + */ +#define CppScriptTarget(dst,src,defs,deplist) @!\ +dst:: src deplist @@\ + $(RM) $@ @@\ + $(CPP) defs $@ @@\ + chmod a+x $@ + + +/* + * MakeScriptFromCpp: + * Generate rules to create a script from a file with a + * .cpp suffix. + */ +#define MakeScriptFromCpp(name,defs) @!\ +CppScriptTarget(name,name.cpp,defs,^^) + + +/* + * ShellScriptTargetExt: + * Generate rules to create and install a set of scripts from + * ext files (.sh and .SH are the most common examples). Man pages + * derived from the name of the scripts are also installed unless + * NoManPages() is specified. + */ +#define ShellScriptTargetExt(scripts,ext) @!\ +++SCRIPTS scripts @!\ +SimpleShellScriptTargetExt(scripts,ext) @!\ +InstallScripts() @!\ +InstallManScripts() + + +/* + * ShellScriptTarget: + * Generate rules to create and install a set of scripts from + * .SH files. Man pages derived from the name of the scripts are + * also installed unless NoManPages() is specified. + */ +#define ShellScriptTarget(scripts) @!\ +ShellScriptTargetExt(scripts,.SH) + + +/* + * SimpleShellScriptTargetExt: + * Generate rules to create a set of scripts from ext files where + * ext is usually something like .sh or .SH, or whatever file + * extension you like.. + */ +#define SimpleShellScriptTargetExt(scripts,ext) @!\ +AllTarget(scripts) @!\ + @!\ +|expand s!scripts! @!\ +!s: !s^^ext @@\ + /bin/sh !s^^ext @!\ + @!\ +-expand + + +/* + * SimpleShellScriptTarget: + * Generate rules to create a set of scripts from .SH files. + */ +#define SimpleShellScriptTarget(scripts) @!\ +SimpleShellScriptTargetExt(scripts,.SH) + + +/* + * ShellScriptLongTarget: + * Generate rules to create a set of scripts from .SH files where + * the name of the generated file is different from the basename of + * the .SH file (when, for instance, the total length with the .SH + * extension would not leave enough space for RCS ,v extension). + */ +#define ShellScriptLongTarget(basename,scriptname) @!\ +++LSCRIPTS scriptname @!\ +AllTarget(scriptname) @!\ + @!\ +scriptname: basename^^.SH @@\ + /bin/sh basename^^.SH @!\ + @!\ +InstallScripts() @!\ +?NOMAN:|skip @!\ +InstallManPageLong(basename,$(MANSRC),scriptname) @!\ +-skip + + +/* + * ForceTarget: + * The force target will force reconstruction of all the other + * targets which include .FORCE in their own dependencies. + */ +#define ForceTarget() @!\ +|once _force_ @!\ +.FORCE: @!\ + @!\ +-once + + +/* + * RemoteTargetDependency: + * A local target may rely on a remote dependency (e.g. a library) + * made in a separate directory. This rule explicits the dependency + * and forces a make of that dependency in the remote directory. + */ +#define RemoteTargetDependency(target,directory,dependency) @!\ +RemoteDependency(directory,dependency) @!\ +target: directory/^^^dependency @!\ + + +/* + * RemoteDependency: + * Specify rules for making a remote dependency. + */ +#define RemoteDependency(directory,dependency) @!\ +ForceTarget() @!\ +|once =directory/^^^dependency= @!\ +directory/^^^dependency: .FORCE @@\ + @echo "Checking "^^^dependency" in "^^^directory"..." @@\ + cd ^^^directory; $(MAKE) ^^^dependency @@\ + @echo "Continuing in $(CURRENT)..." @!\ + @!\ +-once + +/* + * SetSubdirs: + * Actually forces the definition of SUBDIRS, and lets the user + * specify what the sub-directories are. This will be added to the + * customization part. + */ +#define SetSubdirs(subdirs) @!\ +>SUBDIRS @!\ ++SUBDIRS = subdirs + + +/* + * NoManPages: + * Actually forces the definition of NOMAN, which tells the jmake + * program to not generate rules for installing manual pages. + */ +#define NoManPages() @!\ +>NOMAN + + +/* + * Expand: + * This powerful macro expands the `rule' given a `pattern'. It + * relies on a built-in command in jmake. The expansion is + * documented in the short notes file that comes with jmake and + * gives some insights on the internal syntax. + */ +#define Expand(rule, pattern) @!\ +|expand pattern @!\ +rule @!\ +-expand + + +/* + * Lex and yacc stuff. + */ + +/* + * YaccRule: + * This is the rule which is used to build a .c file from a .y file. + */ +#define YaccRule() @!\ +AddSuffix(.y) @!\ +|once _YaccRule_ @!\ +|rule:.y.c: @!\ +|rule: $(YACC) $(JYFLAGS) $< @!\ +|rule: $(MV) y.tab.c $@ @!\ +|rule: @!\ +-once + +/* + * SimpleYaccTarget: + * Declare a yacc base.y file to be used in the building of the + * specified target program. The source file must be given without + * its final .y extension. The name of the .c and .o will be + * derived from the source file basename provided. + */ +#define SimpleYaccTarget(program,base) @!\ +++SOURCES base.y @!\ +++OBJECTS base.o @!\ +YaccRule() @!\ +program: base.c @!\ + @!\ +local_realclean:: @@\ + $(RM) base.c @!\ + + +/* + * ComplexYaccTarget: + * Declare a yacc base.y file to be used in the building of the + * specified target program. The source file must be given without + * its final .y extension. The name of the .c and .o will be + * derived from the source file basename provided. + * The difference with SimpleYaccTarget is the identifying process + * where all the 'yy' are replaced by the specified prefix. + */ +#define ComplexYaccTarget(program,base,prefix) @!\ +++SOURCES base.y @!\ +++OBJECTS base.o @!\ +program: base.c @!\ + @!\ +base.c: base.y @@\ + $(YACC) $(JYFLAGS) base.y @@\ + $(SED) -e 's/yy\(.\)/prefix\1/g' < y.tab.c > base.c @@\ + $(SED) -e 's/yy\(.\)/prefix\1/g' < y.tab.h > base.h @@\ + $(RM) y.tab.c y.tab.h @!\ + @!\ +local_realclean:: @@\ + $(RM) base.c @!\ + + +/* + * SimpleYaccInclude: + * Declare that program will need an include file produced by + * the output of yacc on base.y, which typically produces a file + * named y.tab.h, which will be renamed as base.h. + * The only problem is that the dependencies towards base.h have + * to be manually given in the Jmakefile. + */ +#define SimpleYaccInclude(base) @!\ +base.h: base.c @@\ + @if test -f y.tab.h; then \ @@\ + echo " $(MV) y.tab.h $@"; \ @@\ + $(MV) y.tab.h $@; \ @@\ + fi @!\ + @!\ +local_realclean:: @@\ + $(RM) base.h + +/* + * ComplexYaccInclude: + * Declare that program will need an include file produced by + * the output of yacc on base.y, which typically produces a file + * named y.tab.h, which will be renamed as base.h. + * The difference with SimpleYaccInclude is the identifying process + * of the y.tab.h file where all 'yy' are renamed to prefix. + * The only problem is that the dependencies towards base.h have + * to be manually given in the Jmakefile. + */ +#define ComplexYaccInclude(base,prefix) @!\ +base.h: base.c @@\ + @if test -f y.tab.h; then \ @@\ + echo " $(SED) -e 's/yy\(.\)/prefix\1/g' < y.tab.h > base.h"; \ @@\ + $(SED) -e 's/yy\(.\)/prefix\1/g' < y.tab.h > base.h; \ @@\ + echo " $(RM) y.tab.h"; \ @@\ + $(RM) y.tab.h; \ @@\ + elif test -f base.h; then \ @@\ + echo " $(CP) base.h base.ht"; \ @@\ + $(CP) base.h base.ht; \ @@\ + echo " $(SED) -e 's/yy\(.\)/prefix\1/g' < base.ht > base.h"; \ @@\ + $(SED) -e 's/yy\(.\)/prefix\1/g' < base.ht > base.h; \ @@\ + echo " $(RM) base.ht"; \ @@\ + $(RM) base.ht; \ @@\ + fi @!\ + @!\ +local_realclean:: @@\ + $(RM) base.h + + +/* + * NormalYaccTarget: + * Declare a yacc base.y file which should produce a base.c and + * base.h file as derived from the output of yacc, to be used by + * the specified program. + */ +#define NormalYaccTarget(program,base) @!\ +SimpleYaccTarget(program,base) @!\ +SimpleYaccInclude(base) + + +/* + * IdentifiedYaccTarget: + * Declare a yacc base.y file which should produce a base.c and + * base.h file as derived from the output of yacc, to be used by + * the specified program. The specified prefix is used to remplace + * all the 'yy' in the generated file, for use when more than a + * single parser is needed in one executable. + */ +#define IdentifiedYaccTarget(program,base,prefix) @!\ +ComplexYaccTarget(program,base,prefix) @!\ +ComplexYaccInclude(base,prefix) + + +/* + * SimpleLexTarget: + * This declares a lex base.l file which is to be ran through + * lex to produce a base.c file. + */ +#define SimpleLexTarget(program,base) @!\ +++SOURCES base.l @!\ +++OBJECTS base.o @!\ +|once _LexRule_ @!\ +|rule:.l.c: @!\ +|rule: $(LEX) $(JLFLAGS) $< @!\ +|rule: $(MV) lex.yy.c $@ @!\ +|rule: @!\ +-once @!\ +AddSuffix(.l) @!\ +program: base.c @!\ + @!\ +local_realclean:: @@\ + $(RM) base.c @!\ + + +/* + * IdentifiedLexTarget: + * This declares a lex base.l file which is to be ran through + * lex to produce a base.c file. The prefix is used to replace + * the 'yy', so that the lexical analyzer may be identified. + */ +#define IdentifiedLexTarget(program,base,prefix) @!\ +++SOURCES base.l @!\ +++OBJECTS base.o @!\ +program: base.c @!\ + @!\ +base.c: base.l @@\ + $(LEX) $(JLFLAGS) base.l @@\ + $(SED) -e 's/yy\(.\)/prefix\1/g' < lex.yy.c > base.c @@\ + $(RM) lex.yy.c @!\ + @!\ +local_realclean:: @@\ + $(RM) base.c @!\ + + +/* + * NormalLexDependTarget: + * Declare that program will need an include file produced by + * the output of lex on base.l, which typically produces a file + * named lex.yy.c which will be renamed as base.c. Besides, the + * lexical analyzer needs the file parser.h produced by running + * parser.y through yacc and renaming y.tab.h as parser.h. + */ +#define NormalLexDependTarget(program,base,parser) @!\ +base.o: parser.h @!\ + @!\ +SimpleLexTarget(program,base) + + +/* + * IdentifiedLexDependTarget: + * Declare that program will need an include file produced by + * the output of lex on base.l, which typically produces a file + * named lex.yy.c which will be renamed as base.c. Besides, the + * lexical analyzer needs the file parser.h produced by running + * parser.y through yacc and renaming y.tab.h as parser.h. + * The lexical analyzer is identified with the supplied prefix, + * which replaces the regular 'yy' prefix in the symbol names. + */ +#define IdentifiedLexDependTarget(program,base,parser,prefix) @!\ +base.o: parser.h @!\ + @!\ +IdentifiedLexTarget(program,base,prefix) + + +/* + * NormalParserTarget: + * Specify that program is using the lex/yacc combination to + * produce a parser. The lexic and parser parameters are the + * base name of the .l and .y file, respectively. + */ +#define NormalParserTarget(program,lexic,parser) @!\ +NormalLexDependTarget(program,lexic,parser) @!\ +NormalYaccTarget(program,parser) + + +/* + * IdentifiedParserTarget: + * Specify that program is using the lex/yacc combination to + * produce a parser. The lexic and parser parameters are the + * base name of the .l and .y file, respectively. The parser + * produced is identified via its prefix, which replaces all + * the normally supplied 'yy' prefix, hence making it possible + * to have multiple parsers in a single executable. + */ +#define IdentifiedParserTarget(program,lexic,parser,prefix) @!\ +IdentifiedLexDependTarget(program,lexic,parser,prefix) @!\ +IdentifiedYaccTarget(program,parser,prefix) + + diff --git a/jmake/files/Jmake.tmpl b/jmake/files/Jmake.tmpl new file mode 100644 index 0000000..052ad5e --- /dev/null +++ b/jmake/files/Jmake.tmpl @@ -0,0 +1,253 @@ +/* + * Generic jmake template + * + * $Id: Jmake.tmpl,v 3.0.1.3 1997/02/28 14:56:16 ram Exp ram $ + * + * Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi + * + * You may redistribute only under the terms of the Artistic Licence, + * as specified in the README file that comes with the distribution. + * You may reuse parts of this distribution only within the terms of + * that same Artistic Licence; a copy of which may be found at the root + * of the source tree for dist 4.0. + * + * $Log: Jmake.tmpl,v $ + * Revision 3.0.1.3 1997/02/28 14:56:16 ram + * patch61: lex path can now be configured + * + * Revision 3.0.1.2 1995/01/11 14:50:21 ram + * patch45: now pre-computes INSTALL and INSTALLDIR variables + * + * Revision 3.0.1.1 1993/08/20 07:36:36 ram + * patch3: config.sh searching was not aborting properly + * + * Revision 3.0 1993/08/18 12:04:16 ram + * Baseline for dist 3.0 netwide release. + * + */ + +: Makefile.SH generated from Jmake.tmpl and Jmakefile +: $Id: Jmake.tmpl,v 3.0.1.3 1997/02/28 14:56:16 ram Exp ram $ + +/************************************************************************* + * * + * DO NOT MODIFY BELOW THIS LINE * + * * + *************************************************************************/ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/#*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +|expand cur!CURDIR! +CURRENT=!cur:^\./= +-expand +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" +/* + * Variable pre-computation. + */ +?INSTALL:INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +?INSTALLDIR:INSTALLDIR=`echo $installdir | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` +/* + * Makefile generation. + */ +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +#include + +%MKDEP:|skip /* Skip if no depend target */ +;######################################################################## +;# Force 'make depend' to be performed first -- do not edit + +.FORCE_DEPEND:: + +all:: .FORCE_DEPEND + +-skip /* Depend target */ +;######################################################################## +;# Start of Jmakefile +#include + +;######################################################################## +;# Common rules for all Makefiles -- do not edit +/* + * These need to be here so that rules in Jmakefile occur first; the blank + * all is to make sure that an empty Jmakefile doesn't default to make clean. + */ +emptyrule:: + +CleanTarget() +InstallTarget() + +/* + * The installation of manual pages is optional. When they say "none" in + * Configure, then they don't want any manual page and $installmansrc will + * be empty. + * + * To avoid protecting all the jmake rules for an empty destination, we use + * this clever hack: there is an "install.man-no" and an "install.man-yes" + * target defined, where the first does nothing and the second triggers + * the local install. The same goes for deinstall. + * + * If the `MANSRC' symbol is not wanted, then there is no manual page + * and we can force the -no version of the targets. + */ +%MANSRC:|skip /* Skip if no manual targets */ +!NO!SUBS! +case "$installmansrc" in +'') man=no;; +*) man=yes;; +esac +$spitshell >>Makefile <>Makefile <<'!NO!SUBS!' +-skip +?MANSRC:|skip /* Skip if it has manual targets */ +maybe_install.man: install.man-no +maybe_deinstall.man: deinstall.man-no +-skip + +MakefileTarget() +TagsTarget() + +%SUBDIRS:|skip /* Skip if no sub-directories */ +;######################################################################## +;# Rules for building in sub-directories -- do not edit + +CommonSubdirsRule($(SUBDIRS)) +InstallSubdirs() +InstallManSubdirs() +CleanSubdirs() +TagSubdirs($(SUBDIRS)) +MakefileSubdirs() +MakeSubdirs() + +/* + * Empty rules in case they don't define anything to be installed + * in this directory. + */ +local_install:: +local_deinstall:: +local_install.man:: +local_deinstall.man:: + +-skip /* Sub-directories */ +?SUBDIRS:|skip /* Skip if sub-directories */ +;######################################################################## +;# Empty rules for directories with no sub-directories -- do not edit + +local_install:: + @echo "install in $(CURRENT) done." + +local_deinstall:: + @echo "deinstall in $(CURRENT) done." + +local_install.man:: + @echo "install.man in $(CURRENT) done." + +local_deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +/* + * Action for 'Makefiles' would be required, if a .SUFFIXES: .SH rule + * were added, because in that case, a "/bin/sh Makefiles.SH" would + * be issued and raise an error. + */ +Makefiles:: + +Makefiles.SH:: + +-skip /* No sub-directories */ +%MKDEP:|skip /* Skip if no depend target */ +;######################################################################## +;# Dependencies generated by make depend +;# DO NOT DELETE THIS LINE -- make depend relies on it + +;# Put nothing here or make depend will gobble it up +.FORCE_DEPEND:: +?TOP: @echo "You haven't run a 'make depend' yet!"; exit 1 +%TOP: @echo "You must run 'make depend' in $(TOP) first."; exit 1 +-skip /* Depend target */ +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/jmake/fixcpp.SH b/jmake/fixcpp.SH new file mode 100755 index 0000000..24dd274 --- /dev/null +++ b/jmake/fixcpp.SH @@ -0,0 +1,183 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting jmake/fixcpp (with variable substitutions)" +$spitshell >fixcpp <>fixcpp <<'!NO!SUBS!' + +while ($ARGV[0] =~ /^-/) { + $_ = shift; + last if /--/; + $cpp_opt .= "$_ "; + next unless s/-I//; + push(@lookpath, $_); +} + +($file) = @ARGV; +$counter = 0; # Counter for temporary files + +$SIG{'INT'} = 'PLUMBER'; # Install cleaner in case of an interrupt... + +$result = &process($file); # Process file, result in a temporary +&cpp($result); # Pass resulting file with escaped \ to cpp +unlink $result; +exit 0; + +# Cleanup any temporary files... +sub PLUMBER { + warn "Could not cleanup all temporaries.\n" if @tmps != unlink(@tmps); + exit 1; +} + +# Compute a suitable temporary file name +sub mktmp { + $counter++; + local($tmp) = "/tmp/jmk.$counter.$$"; + push(@tmps, $tmp); # Keep track of them for &PLUMBER... + $tmp; +} + +# Process a given file, returning the name of the temporary file into which +# the result is left over. +# This routine is recursively called to process nested include directives. +sub process { + local($file) = @_; + local(*FILE, *TMP); + open(FILE, $file) || die "Can't read $file: $!\n"; + local($tmpfile) = &mktmp; + open(TMP, ">$tmpfile") || die "Can't create $tmpfile: $!\n"; + local($here, $include); + local($_); + while () { + if (s/^#\s*include\s*//) { # Ah, we found a #include something... + chop; + if (/"(\S+)"/) { + ($include, $here) = ($1, 1); + } elsif (/<(\S+)\>/) { + ($include, $here) = ($1, 0); + } else { + warn "Ignoring unkown include directive $_.\n"; + next; + } + local($incfile) = &lookup($include, $here); + unless (defined $incfile) { + warn "Can't locate include file $include.\n"; + next; + } + $include = &process($incfile); # Recursively process this file + &append($include, 'TMP'); # Append result to current tmp file + unlink $include; + } else { + &escape; + print TMP; + } + } + close FILE; + close TMP; + $tmpfile; # Return name of file where results has been left over +} + +# Perform necessary escaping work on current line. +sub escape { + # Don't escape trailing backslashes in macro definition or cpp + # won't see them as macro continuation any longer, and also within + # macro definitions, all those @@ or @! continuations... + s/\\$/\\ \015/ unless /\@[!@]\\$/ || /^#define/; +} + +# Append file to given (opened) file descriptor +sub append { + local($file, $fd) = @_; + local(*FILE); + open(FILE, $file) || die "Can't re-open $file: $!\n"; + local($_); + while () { + &escape; + print $fd $_; + } + close FILE; +} + +# Lookup file, returning its located name or undef if not found. +sub lookup { + local($file, $here) = @_; + unless ($here) { + foreach $dir (@lookpath) { + if (-r "$dir/$file") { # Use -r instead of -f for symlinks + $file = "$dir/$file"; + last; + } + } + } + return undef unless -r $file; + $file; +} + +# This is the final cpp processing. The output from cpp is filtered to un-escape +# all the trailing backslashes. +sub cpp { + local($file) = @_; + open(CPP, "$cpp $cpp_opt $file |") || die "Can't fork: $!\n"; + while () { + s/\\ \015$/\\/; # Un-escape trailing \ + print STDOUT; + } + close CPP; +} + +!NO!SUBS! +chmod 755 fixcpp +$eunicefix fixcpp diff --git a/jmake/jmake.SH b/jmake/jmake.SH new file mode 100755 index 0000000..3f676b2 --- /dev/null +++ b/jmake/jmake.SH @@ -0,0 +1,526 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting jmake/jmake (with variable substitutions)" +$spitshell >jmake <>jmake <<'!NO!SUBS!' + +($me = $0) =~ s|.*/(.*)|$1|; +$dir = &tilda_expand($dir); # ~name expansion +$file = $dir . '/Jmake.tmpl'; + +$cpp_opt = "-I. "; # For Jmakefile, which is local +while ($ARGV[0] =~ /^-/) { + $_ = shift; + last if /--/; + $cpp_opt .= "$_ "; +} +$cpp_opt .= "-I$dir"; + +# Pass 0 is looking at the template for "?CP:CP =" lines that are to be +# emitted if the CP variable is needed. Later on, when we see $(CP) being +# used, we'll be able to set the $symbol{CP} entry to 1 to have the CP +# variable initialized by the template. + +open(TMPL, $file) || die "$me: can't open $file: $!\n"; +while () { + next unless /^\?([\w_]+):\1\s+=/; + $wanted{$1}++; +} +close TMPL; + +# Thank you HP-UX for having a cpp that blindly strips trailing backslashes +# in the text. Run through cpp by using the fixcpp script... + +open(CPP, "$dir/fixcpp $cpp_opt $file |"); +while () { + # Record defined symbols in Jmakefile. We won't catch symbols + # in conditional commands, but that's ok, I hope. + if ($in_symbol) { + $val = $_; + $in_symbol = 0 if !($val =~ s/\\\s*$//); # Last line + if ($val = /^\|expand/) { # Found an expand command + $in_symbol = 0; # Stop gathering value + $val .= "void::x"; # Stop any incomplete escape sequence + } + chop($val); + $Makesym{$current_symbol} .= $val; + } elsif (/^\s*(\w+)\s*=(.*)/ && !$in_symbol) { + # Found a makefile's macro declaration + $val = $2; + $current_symbol = $1; + if ($val =~ s/\\\s*$//) { # Remove final '\' + $in_symbol = 1; # This is a continuation line + } + $Makesym{$current_symbol} = $val; + push(@Order, $current_symbol); # Keep track of order + } + # Protect RCS keyword Id or Header from normal substitution + s/\$(Id|Header|Log)/\$X-$1/; + # Restore possibly escaped C comments + s|/#\*|/*|g; + s|\*#/|*/|g; + # Remove all ^^^ (null space character) up to next non-space character + s|\^\^\^\s*||g; + # Remove all ^^ (null space character) + s|\^\^||g; + # Restore escaped ^^ and ^^^ sequences + s|\^\\\^\\\^|^^^|g; + s|\^\\\^|^^|g; + next if /^#\s+\d+/; # Skip cpp commments + + s/^;#/#/; + s/@#\s?/\n/g; # Kept for backward compatibility + s/@!\s?/\n/g; + s/@@\s?/\n\t/g; + + $* = 1; + # A '\r' is added to all lines, in order to let 'split' keep them + # As lines ending with '\' won't fit in the next regular + # expression (why ?), we have to treat that special case separately + s/\n$/\r\n/g; + s/\\\s*$/\\\r/g; # Remove spaces after final '\' and add '\r' + $* = 0; + @macro = split(/\n/); + for ($i = 0; $i <= $#macro; $i++) { + chop($_ = $macro[$i]); # Remove final '\r' + s/\s+$//g; # Remove possible useless spaces + if (/^TOP\s*=\s*(\S+)/) { # Get the top from generated file + $top = $1; + } + find_wanted($_); # Look for known $(VAR) usage + if (s/^\s*>//) { # '>' means "symbol wanted" + warn "$me: the '>$_' construct is deprecated for known symbols\n" + if $wanted{$_} && !$warned_wanted_symbol_deprecated++; + $symbol{$_} = 1; + } elsif (s/^\s*\+//) { # '+' means "initialization section" + if (s/^\+(\w+)//) { # '++' means add to variable list + $added{$1} .= $_; + } else { # A single '+' means "add as is". + push(@init, $_); + } + } elsif (s/^\|//) { # Command for us + if (/suffix\s+(\S+)/) { # Add suffix + push(@suffix, $1) unless $seen{$1}; + $seen{$1} = 1; + } elsif (s/^rule://) { # Add building rule + s/^\s(\s*\S+)/\t$1/; # Make sure leading tab is there + push(@rule, $_); + } elsif (/^skip/) { # Unconditional skip... funny! + push(@makefile, "|$_"); # Skip handled in pass 2 + } elsif (/^expand/) { + push(@makefile, "|$_"); # Expand handled in pass 2 + } elsif (/^once\s+(.*)/) { # Once handled in pass 1 + if ($Once{$1}++) { # Symbol already seen -- skip + for (; $i <= $#macro; $i++) { + last if $macro[$i] =~/^-once/; + } + warn("$me: -once not found for $1") + unless $macro[$i] =~/^-once/; + } + } elsif (/^shell/) { # Escaping to shell + push(@makefile, "|$_"); # will be handled in pass 2 + } elsif (/^case/) { # Conditional generation + push(@makefile, "|$_"); # will be handled in pass 2 + } elsif (/^subst/) { # Section with var substitution + push(@makefile, "|$_"); # will be handled in pass 2 + } else { + print "$me: Warning: unknown command $_\n"; + } + } else { + next if /^-once/; # Control statement removed + push(@makefile, $_); + } + } +} +close CPP; + +@key = keys(%added); +$last_was_blank = 1; # To avoid blank line at the top of the file +$symbol{'INIT'} = 1 if ($#init >= 0 || $#key >=0); # Initializations +$symbol{'SUFFIX'} = 1 if ($#suffix >= 0 || $#rule >=0); # Rules or suffixes +$symbol{'TOP'} = 1 if $top eq '.'; # If imake invoked for the top + +$shellmode = 0; # Set to true within "shell" section +$casemode = 0; # Counts nesting levels within "case" section +$substmode = 0; # True when within section with variable substitution + +$SPIT_START = "\$spitshell >>Makefile <<'!NO!SUBS!'\n"; +$SPIT_END = "!NO!SUBS!\n"; +$GROK_START = "\$spitshell >>Makefile <Makefile.SH"); +# We have to use for instead of foreach to handle 'skip' easily +line: for ($i = 0; $i <= $#makefile; $i++) { + $_ = $makefile[$i]; + next if /^-skip|-expand/; # They might have made a mistake + + # Strip consecutive blank lines in generated file + + if (/^\s*$/) { + next if ($last_was_blank); + $last_was_blank = 1; + } else { + $last_was_blank = 0; + } + + # In shell mode, we're transparent, untill we reach a "-shell" + # We don't call print_makefile() as we don't want to record + # those non-makefile lines in the @Generated array. + + if ($shellmode) { + if (/^-shell/) { # Ending shell mode, back to Makefile + print MAKEFILE $substmode ? $GROK_START : $SPIT_START; + $shellmode = 0; + } elsif (/^\|shell/) { + die "$me: can't nest 'shell' sections.\n"; + } else { + print MAKEFILE "$_\n"; + } + next; + } elsif (/^\|shell/) { + print MAKEFILE $substmode ? $GROK_END : $SPIT_END; + $shellmode = 1; # Next lines emitted verbatim as shell + next; + } + + # In subst mode, the section until "-subst" is emitted regularily, + # excepted that it will be in a grok section, so its $var will be + # substituted by the shell. + + if ($substmode) { + if (/^-subst/) { # Ending subst mode, back to regular + print MAKEFILE $GROK_END; + print MAKEFILE $SPIT_START; + $substmode = 0; + next; + } elsif (/^\|subst/) { + die "$me: can't nest 'subst' sections.\n"; + } + # Continue with line + } elsif (/^\|subst/) { + print MAKEFILE $SPIT_END; # End spit section in Makefile.SH + print MAKEFILE $GROK_START; + $substmode = 1; # Next lines subject to $ interpretation + next; + } + + # In a "case" section, the Makefile will be conditionally generated + # based on the value of the supplied variable, as evaluated by the shell. + # We can nest "case" sections without problems. + + if (/^-case/) { # Ending current case section + if ($casemode == 0) { + warn "$me: ignoring spurious '-case'\n"; + next; + } + print MAKEFILE $substmode ? $GROK_END : $SPIT_END; + my $indent = "\t" x ($casemode - 1); + print MAKEFILE "${indent}\t;;\n"; + print MAKEFILE "${indent}esac\n"; + print MAKEFILE "${indent}", $substmode ? $GROK_START : $SPIT_START; + $casemode--; + next; + } + + if (/^\|case/) { + my ($var, $value) = /^\|case\s+(\w+)\s+in\s+(.*)/; + die "$me: unparseable directive '$_'\n" if $var eq ''; + $casemode++; + print MAKEFILE $substmode ? $GROK_END : $SPIT_END; + my $indent = "\t" x ($casemode - 1); + print MAKEFILE "${indent}case \"\$$var\" in\n"; + print MAKEFILE "${indent}$value)\n"; + print MAKEFILE "${indent}\t", $substmode ? $GROK_START : $SPIT_START; + next; + } + + # Process regular line to be generated in Makefile.SH + + s//[jmake $version PL$patchlevel]/; + + # Lines starting with ?SYMBOL: (resp. %SYMBOL:) are to be processed + # only if SYMBOL is defined (resp. undefined). + + # Apply in sequence + while (/^\s*\?|\s*%/) { + if (s/^\s*\?(\w+)://) { # Wanted symbol ? + next line unless $symbol{$1}; + } elsif (s/^\s*%(\w+)://) { # Unwanted symbol ? + next line if $symbol{$1}; + } else { + print "$me: Warning: missing ':' in $_\n"; + last; + } + } + + # We wish to make sure there is a leading tab if the line starts with + # a space to prevent problems later on. However, variable definitions + # might want to be aligned on the '=' (imake style). Not all make + # may be able to cope with those though, so they are left justified + # again. + + s/^\s/\t/ unless /^\s+\w+\s+=/; # Make sure leading tab is there + s/^\s+(\w+\s+=)/$1/; # Left justify variable definition + s/^;#/#/; # Comments in Jmakefile + + if (s/^\|//) { # Command for us + if (/^skip/) { # Skip until -skip + for (; $i <= $#makefile; $i++) { + last if $makefile[$i] =~ /^-skip/; + } + } elsif (s/^expand//) { + &init_expand($_); # Initializes data structures + $i++; # Skip expand line + undef @Expand; # Storage for expanded lines + $pattern = ''; # Assume no pattern + for (; $i <= $#makefile; $i++) { + $_ = $makefile[$i]; + if (s/^-expand//) { # Reached end of expansion + if (s/^\s*(.*)/$1/) { # Expand followed by a pattern + $pattern = $_; # Get pattern to be removed + } + last; + } + s/^\s/\t/; # Make sure leading tab is there + push(@Expand, $_); # Line to be expanded + } + &expand($pattern); # Expand all lines in buffer + } else { + die "$me: unknown command $_\n"; + } + } elsif (/^INIT/) { # Initialization section + # All the initializations are put in the variable substitution + # section of the Makefile.SH. Therefore, we have to protect all + # the '$' signs that are not followed by an alphanumeric character. + foreach (@init) { + # Dumps core sometimes with perl 4.0 PL10 + # &protect_dollars(*_); + $_ = &protect_dollars($_); + &print_makefile($_); + } + foreach (@key) { # @key set earlier to keys(%added) + $_ .= " = " . $added{$_}; + # Dumps core sometimes with perl 4.0 PL10 + # &protect_dollars(*_); + $_ = &protect_dollars($_); + &print_makefile($_); + } + } elsif (/^SUFFIX/) { # Suffixes/Rules section + # Rules and suffixes are put in the variable substitution + # section of the Makefile.SH. Therefore, we have to protect all + # the '$' signs that are not followed by an alphanumeric character. + if ($#suffix >= 0) { + print MAKEFILE ".SUFFIXES:"; + foreach (@suffix) { + # Dumps core sometimes with perl 4.0 PL10 + # &protect_dollars(*_); + $_ = &protect_dollars($_); + print MAKEFILE " $_"; + } + print MAKEFILE "\n\n"; + } + foreach (@rule) { + # Dumps core sometimes with perl 4.0 PL10 + # &protect_dollars(*_); + $_ = &protect_dollars($_); + print MAKEFILE "$_\n"; + } + } else { + &print_makefile($_); + } +} +close MAKEFILE; + +sub protect_dollars { + # Dumps core sometimes with perl 4.0 PL10 + # local(*_) = shift(@_); + s/\\\$/\\=/g; # Protect already escaped '$' + s/(\$\W)/\\$1/g; # Escape unprotected '$' + s/\\=/\\\$/g; # Restore escaped '$' + $_; # Because perl dumps core... :-( +} + +# Initializes data structures for expansion. If we detect Makefile +# macro in the 'expand' line (the argument), then we write a small +# makefile that will do the substitution for us -- I'm lazy today :-) +sub init_expand { + local($_) = shift(@_); + undef %Vars; # Reset array of variables + $Vars_len = 0; # Number of "symbols" in first expanded + if (/\$\(\w+\)/) { # If at least one macro + local($make) = "/tmp/mkjm$$"; + open(MAKE, ">$make") || die "$me: can't create $make: $!\n"; + &gen_variables(); # Generates already computed variables + foreach $var (@Order) { # Print each in order we found them + print MAKE "$var = $Makesym{$var}\n" if !$Gvars{$var}; + } + # We prepend OUTPUT: in front of the line that interests us, because + # some makes can print extra information, especially GNU make with + # its entering/leaving blurb when invoked from another makefile. + print MAKE "all:\n\t\@echo 'OUTPUT: $_'\n"; + close MAKE; + chop($_ = `make -f $make all | grep ^OUTPUT:`); + unlink($make); + } + s/^OUTPUT: //; + while (s/^\s*(\w+)!([^!]*)!//) { + $Vars{$1} = $2; + # Record only length for _first_ expanded symbol + $Vars_len = split(/\s\s*/, $2) unless $Vars_len; + } +} + +# Expand lines in the @Expand array. The argument is a pattern which is to +# be removed from the last chunk of expanded lines. +# For each symbol s, !s is replaced by the next item, and !s:p=q does the +# same after having replaced the pattern 'p' by pattern 'q' in the item. +# Spaces are NOT allowed in 'p' or 'q'. Substitution is done once (no /g). +sub expand { + local($pattern) = shift; # To-be-removed pattern for last chunk + local($_); + local($sub); + local($i); + local(@expands); + for ($i = 0; $i < $Vars_len; $i++) { + foreach $line (@Expand) { + $_ = $line; # Don't modify elements in array + foreach $sym (keys %Vars) { + @expands = split(/\s\s*/, $Vars{$sym}); + $sub = $expands[$i]; + $sub =~ s/\/\///g; # // is a void value + while (s/!${sym}:([^\s]*)=([^\s]*)/,x##x,/) { + # Replacing item is altered by some pattern + local($p) = $1; + local($q) = $2; + local($subq) = $sub; + eval "\$subq =~ s=${p}=${q}="; + s/,x##x,/${subq}/; + } + s/!${sym}/${sub}/g; + } + # Protect substitution in an 'eval' in case of error + eval "s/${pattern}\$//" if $pattern && $i == ($Vars_len - 1); + &print_makefile($_); + } + } +} + +# Prints its argument in MAKEFILE and records it also in Generated +sub print_makefile { + local($_) = shift(@_); # Line to be printed + print MAKEFILE "$_\n"; + push(@Generated, "$_\n"); +} + +# Generates in MAKE file all the generated variable we have so far for +# final Makefile. This is mainly intended to allow expansion of variables +# which are already defined with an expand. +sub gen_variables { + undef %Gvars; # Reset already generated variables + local ($in_symbol) = 0; # True when in variable (Makefile's macro) + foreach (@Generated) { + if ($in_symbol) { + if (/^\s*(\w+)\s*=(.*)/) { # Missed the end of previous macro + $in_symbol = 0; + $Gvars{$1} = 1; # Definition of variable seen + $in_symbol = 1 if (/\\\s*$/); # There is a final '\' + print MAKE "void::\n"; # Cut incomplete esc sequence + } else { + $in_symbol = 0 if !(/\\\s*$/); # Last line + } + print MAKE; + } elsif (/^\s*(\w+)\s*=(.*)/ && !$in_symbol) { + # Found a makefile's macro declaration + $Gvars{$1} = 1; # Definition of variable seen + $in_symbol = 1 if (/\\\s*$/); # There is a final '\' + print MAKE; + } + } + print MAKE "void::\n"; # Cut incomplete escape sequence +} + +# Parse line to extract all $(VAR) usage and trigger the symbol if VAR +# is among the wanted set, as if they had manually said ">VAR" like in +# the old days. +sub find_wanted { + my ($l) = @_; + while ($l =~ s/\$\(([\w_]+)\)//) { + $symbol{$1}++ if $wanted{$1}; + } +} + +!NO!SUBS! +$grep -v '^;#' ../pl/tilde.pl >>jmake +chmod 755 jmake +$eunicefix jmake diff --git a/jmake/jmake.man b/jmake/jmake.man new file mode 100644 index 0000000..2b0997f --- /dev/null +++ b/jmake/jmake.man @@ -0,0 +1,491 @@ +''' $Id: jmake.man,v 3.0.1.3 2004/08/22 09:01:55 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: jmake.man,v $ +''' Revision 3.0.1.3 2004/08/22 09:01:55 ram +''' patch71: renamed |test as |case as the construct has its syntax +''' patch71: added |subst section to allow variable substitutions +''' +''' Revision 3.0.1.2 2004/08/21 23:19:52 ram +''' patch71: added '|shell' section to emit verbatim code in Makefile.SH +''' patch71: new '|test' to conditionally generate Makefile sections +''' +''' Revision 3.0.1.1 1995/05/12 11:57:58 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0 1993/08/18 12:04:18 ram +''' Baseline for dist 3.0 netwide release. +''' +.TH JMAKE 1 ram +.SH NAME +jmake \- a generic makefile builder +.SH SYNOPSIS +.B jmake +[ +.I cpp options +] +.SH DESCRIPTION +.I Jmake +builds a makefile out of a rather high level description held in a +.I Jmakefile +file. The generated file is a +.I Makefile.SH +rather than a simple makefile, which means it is ready to be used in +conjonction with +.I metaconfig. +In particular, parameters such as "where to install executables" will +be automatically determined by +.I Configure +and only the needed parameters will be taken into account. +.PP +To use +.I jmake +you have to write a +.I Jmakefile +first, which describes the way things are to be built. Your +.I Jmakefile +will be included inside a generic template through the C pre-processor. +This means you may use the usual C /**/ comments, but not the shell # comments. +The C comments will not appear in the generated +.I Makefile.SH +but lines starting with ;# will finally appear as shell comments. If you +have to write the string /* in the generated +.I Makefile.SH +then you have to escape it (otherwise +.I jmake +will think of it as the start of a C comment). Simply put a # in front +of the *, as in /#*. +.PP +You have a set of macros at your disposal, and all these macros are +listed in the Index file, along with the piece of code they will +expand to. Usually, a +.I Jmakefile +is fairly small and thus easier to maintain than a huge +.I Makefile. +Some internal powerful commands allow you to write +portable makefiles easily, without having to spend many efforts, because +someone else already did the job for you :-). +.PP +When you want to generate your makefile, you usually do not run +.I jmake +but use the +.I jmkmf +script which is a wrapper and will invoke +.I jmake +with the correct options. +.PP +All the knowledge of +.I jmake +is held in two files: the template +.I Jmake.tmpl +and the macro definition file +.I Jmake.rules. +The first file includes the second, along with the +.I Jmakefile. +It is sometimes necessary to know how things works to be able to correctly +use all the features provided. For instance, you may have to write your +own rules for a specific project. Although you cannot overwrite the +predefined rules, you can extent the +.I Jmake.rules +file or simply add your macros in your +.I Jmakefile. +You may also use +.I #include +statements when you want to share these macros and do not want to duplicate +the code. +.PP +The syntax in Jmake.rules is not elegant at all, but: +.sp +.PD 0 +.IP - +It is easy to parse (like sendmail.cf or troff files). +.IP - +The rules are not supposed to change very often. +.IP - +It is simple enough to be mastered in five minutes. :-) +.sp +Here is a small description: +.sp +.IP 1) +To deal with various \fIcpp\fR implementations: +.sp +.RS +.IP \(bu +Final @!\\ means: end of line, next line starts at the left margin. +.IP \(bu +Final @@\\ means: end of line, next line is to be indented by one tab. +.sp +.PP +There should always be one of @!\\ or @@\\ at the end of each line. +The only exception is for macros that are to be used as part of a +rule body (e.g. \fIRemoveTargetProgram\fR). In that case, the first +line (which holds the \fI#define\fR) should end with a single backslash. +.RE +.sp +.IP 2) +Symbol definitions: +.sp +.RS +.IP \(bu +>SYMBOL: defines the symbol. +.IP \(bu +?SYMBOL:: keeps iff SYMBOL is defined. +.IP \(bu +%SYMBOL:: keeps iff SYMBOL is not defined. +.sp +.PP +The ?SYM can be nested (logical AND), as in: +.sp +.in +5 +?SYMBOL:%TOKEN:text +.in -5 +.sp +which will keep text if SYMBOL is defined and TOKEN undefined. +To implement a logical OR, see below. +.RE +.sp +.IP 3) +Commands: +.sp +.RS +Commands can be passed to \fIjmake\fR. They start with a leading '|'. +Available commands are: +.sp +.IP \(bu +|suffix : adds to the .SUFFIXES: list in the makefile. +.sp +.IP \(bu +|rule:: adds to the building rule section. +.sp +.IP \(bu +|rule: : same as before, with a leading tab. +.sp +.IP \(bu +|skip: skips text until a line starting with '-skip' is found. +.sp +.IP \(bu +|subst: begins section where lines will be subject to variable substitution, +until '-subst' is found. This means that when the Makefile.SH is run, all +instances of $var within the \fIsubst\fR section will be substituted by the +shell. +.sp +.IP \(bu +|shell: emits section until matching '-shell' as-is in the generated +Makefile.SH. This can be useful to prepare \fI|case\fR sections. It is +not allowed to nest \fIshell\fR sections. +.sp +.IP \(bu +|case: this command must be followed by a shell variable name (without +its leading '$' sign) and a case-style pattern, for instance the string +"var in f*". It will generate the corresponding "case" test in the +Makefile.SH on the "$var" value and only if this test is true will the +section until the matching '-case' be generated in the Makefile when +Makefile.SH is run. It is possible to nest \fIcase\fR sections freely. +.sp +.IP \(bu +|expand : expand lines until '-expand' with . A +complete example is shown below. +.sp +.IP \(bu +|once : text up to '-once' appears only the first time. +.sp +.PP +The '|' commands cannot be nested, unless otherwise noted. +In particular, due to the simple +implementation of \fI|skip\fR, it is impossible to put \fI|skip\fR inside +a skipped part. However, a \fI|once\fR section may have \fI|skip\fR sections. +It is allowed to nest \fI|case\fR sections at will. +.sp +.PP +Here is a way to implement a logical OR: +.sp +.in +5 +.nf +/* Implements SYMBOL or not TOKEN */ +?SYMBOL:text /* Keeps text if SYMBOL */ +%SYMBOL:|skip + %TOKEN:text /* Keeps text if not TOKEN */ +-skip +.fi +.in -5 +.sp +Actually, this is ugly, because the text has to appear twice. +Fortunately, I did not use it. :-) +.sp +But actually, as you have surely already guessed, the best way to +implement a logical OR is to use De Morgan's Law: +.sp +.in +5 +.nf +not (p or q) <=> not p and not q + +/* Implements SYMBOL or not TOKEN (attempt #2) */ +%SYMBOL:?TOKEN:|skip +text /* If SYMBOL or not TOKEN */ +-skip +.sp +.in -5 +.fi +Who said they didn't care ? ;-) +.sp +.PP +Expansion is done with the \fIexpand\fR command. It has been provided to +avoid some cumbersome writings in makefiles when you have to repeat some +silly lines that only differ in file names, for instance. Let's look at +an example first: +.sp +.in +5 +.nf +|expand a!foo bar! b!yes no! +!a:: + echo !a, !b +-expand +.fi +.in -5 +.sp +.PP +Then two rules will be printed, and the values of (a,b) for the first +will be (foo, yes), for the second (bar, no). Substitution is controled +by the '!' character. If the word to be substituted is part of another +one, detach with the ^^ construct as in: !b^^c. It is possible to +use Makefile macros in the , and they will be expanded by +jmake. If this is not what you want, escape the first '$' sign (this is +a Makefile escape, i.e. you must double the '$', not precede it with a +backslash). A // stands for the null substitution value. +.PP +The ^^^ construct behaves like ^^, i.e. it is stripped out, but it also +removes any following white space after the ^^^. If you prepend something +to a macro argument, and that macro argument was written with spaces before +it, then this will let you concatenate something right before that argument's +final value. +.sp +.PP +Here is another example which shows how the macro Expand can be used. +It is defined in \fIJmake.rules\fR as: +.sp +.in +5 +.nf +#define Expand(rule, pattern) @!\\ +|expand pattern @!\\ +rule @!\\ +-expand +.sp +.in -5 +.fi +So we can write in the \fIJmakefile\fR: +.sp +.in +5 +.nf +|skip +A = foo bar +-skip + +#define Rule @!\\ +$(DIR)/!a^^.o: !a^^.o @@\\ + $(CC) -c !a^^.c @@\\ + $(MV) !a^^.o $(DIR) + +Expand(Rule, a!$(A)!) +.sp +.in -5 +.fi +which will generate in \fIMakefile.SH\fR: +.sp +.in +5 +.nf +$(DIR)/foo.o: foo.o + $(CC) -c foo.c + $(MV) foo.o $(DIR) + +$(DIR)/bar.o: bar.o + $(CC) -c bar.c + $(MV) bar.o $$(DIR) +.sp +.in -5 +.fi +.sp +.PP +The 'A' declaration has been surrounded by \fIskip\fR, so that it does +not appear in the generated Makefile.SH, but it will be taken into +account by \fIjmake\fR for the substitution in the pattern. +.sp +.PP +The number of expansions is determined by the number of possible +values for the \fBfirst\fR parameter. If other parameters have less +substitution values, they will get void ones. +.sp +.PP +It is possible to add a regular expression at the end of '-expand'. This +regular expression will be removed from the final set of expansion at the +end of each line. It is also possible to do substitutions in the expanded +item, by using the syntax (if 'f' is the expanded variable) +!f:\fI

\fR=\fI\fR +where \fI

\fR and \fI\fR are two regular expressions (without spaces). +The pattern \fI

\fR will be replaced by the pattern \fI\fR (only the first +occurrence will be replaced). +.sp +.PP +Finally, you may refer in the expanded section to variables whose value is +computed via another expansion, which makes it easy to define generic +\fIJmakefiles\fR. +.sp +Example: +.sp +.in +5 +.nf +SRC = foo.c bar.c +OBJ = \\ +|expand f!$(SRC)! + !f:\\.c=\\.o \\ +-expand \\\\ +INC = \\ +|expand f!$(OBJ)! + !f:\\.o=\\.h \\ +-expand \\\\ +.fi +.in -5 +.sp +which will generate in \fIMakefile.SH\fR: +.sp +.in +5 +.nf +SRC = foo.c bar.c +OBJ = \\ + foo.o \\ + bar.o +INC = \\ + foo.h \\ + bar.h +.in -5 +.fi +.sp +Do not forget to protect special characters in your regular expressions such +as backslash, point, etc... +.sp +.PP +The \fIonce\fR command is tagged with a name. The first time the name +appears, the once construct is ignored and the text up to '-once' will +be copied in the generated Makefile.SH. However, future occurences of +the same name will be ignored (\fIonce\fR will behave like \fIskip\fR). +.sp +Example: +.sp +.in +5 +.nf +|once this_is_a_name + +-once +.sp +.in -5 +.fi +.sp +.PP +The \fIshell\fR command can be used to generate a shell fragment +in the Makefile.SH. For instance, the following section in the Jmakefile: +.sp +.in +5 +.nf +|shell +case "$d_usegtk1" in +define) glib=1; gtk=1;; +esac +-shell +.sp +.in -5 +.fi +will cause the generation of the enclosed fragment in the Makefile.SH to +compute the values of the \fIglib\fR and \fIgtk\fR variables based on the +configuration variable \fId_usegtk1\fR set by running Configure. +.sp +.PP +In turn, this can be used in subsequent \fIcase\fR sections to activate +parts of the Makefile only when building for GTK1 using glib-1.x: +.sp +.in +5 +.nf +|case glib in 1 +display: + echo "Building for glib-1.x" +-case +.sp +.in -5 +.fi +This section will generate something like this in the Makefile.SH: +.sp +.in +5 +.nf +!NO!SUBS! +case "$glib" in +1) + $spitshell >>Makefile <<'!NO!SUBS!' +display: + echo "Building for glib-1.x" +!NO!SUBS! + ;; +esac +$spitshell >>Makefile <<'!NO!SUBS!' +.sp +.in -5 +.fi +And when running Makefile.SH, the "display" rule above will only appear +when building for glib-1.x. The form of the final \fIMakefile\fR can +therefore depend on the configuration options chosen when \fIConfigure\fR +was run. +.RE +.sp +.IP 4) +Initializations: +.sp +.RS +.IP \(bu ++: Puts the whole line in the initialization section. +.IP \(bu +++SYMBOL : Adds to the SYMBOL macro. +.RE +.sp +.IP 5) +User-defined variables: +.sp +The user may define CFLAGS, LDFLAGS or DPFLAGS as additional flags to be used +in C compilation, linking phase or depend target. It is thus possible to add +some extra flags such as -I or libraries for Makefiles in specific +sub-directories. +.sp +.PD +.SH AUTHOR +Raphael Manfredi +.SH FILES +.PD 0 +.TP 20 +Jmakefile +High level description of Makefile.SH +.TP +Jmake.rules +File holding the macro definitions +.TP +Jmake.tmpl +Template used to mould Makefile.SH +.PD +.SH BUGS +On systems whose +.I cpp +reduces multiple tabs and spaces to a single space, +.I jmake +attempts to put back any necessary tabs (which +.I make +expects in front of rules) but does not properly formats the +body of the rule itself. +.PP +There is a bootstraping problem when creating the first Makefile.SH, because +you cannot run it through a shell until there is a decent Configure +script, but you can't run \fImetaconfig\fR before there is a Makefile.SH +or some needed symbols will not be defined. +.SH "SEE ALSO" +jmkmf(1), metaconfig(1). diff --git a/jmake/jmkmf.SH b/jmake/jmkmf.SH new file mode 100755 index 0000000..64edf18 --- /dev/null +++ b/jmake/jmkmf.SH @@ -0,0 +1,106 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting jmake/jmkmf (with variable substitutions)" +$spitshell >jmkmf <>jmkmf <<'!NO!SUBS!' +# @(#) Generates a Makefile from a Jmakefile + +# $Id$ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $Log: jmkmf.SH,v $ +# Revision 3.0.1.2 2004/08/21 23:18:13 ram +# patch71: automatically figures the top dir and the current dir +# patch71: don't run Makefile.SH if the jmake call failed +# +# Revision 3.0.1.1 1993/08/19 06:42:14 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:04:19 ram +# Baseline for dist 3.0 netwide release. +# + +usage="usage: $0 [top_of_sources_pathname [current_directory]]" + +curdir= + +case $# in + 0) + if test -f .package; then topdir=.; + elif test -f ../.package; then topdir=..; + elif test -f ../../.package; then topdir=../..; + elif test -f ../../../.package; then topdir=../../..; + elif test -f ../../../../.package; then topdir=../../../..; + else + echo "$0: WARNING: can't determine top package directory" >&2 + fi + ;; + 1) topdir=$1 ;; + 2) topdir=$1 curdir=$2 ;; + *) echo "$usage" 1>&2; exit 1 ;; +esac + +case "$topdir" in + -*) echo "$usage" 1>&2; exit 1 ;; +esac + +case "$curdir" in +'') + here=`pwd` + top=`cd $topdir; pwd` + curdir=`perl -e \ + 'print substr($ARGV[0], length($ARGV[1])+1), "\n";' $here $top` + case "$curdir" in + '') curdir=.;; + esac + ;; +esac + +if test -f Jmakefile; then + : ok +else + echo "$0: no Jmakefile found in current directory" >&2 + exit 1 +fi + +if test -f Makefile.SH; then + echo mv Makefile.SH Makefile.SH~ + mv Makefile.SH Makefile.SH~ +fi + +args="-DTOPDIR=$topdir -DCURDIR=$curdir" + +echo jmake $args +if jmake $args; then + echo sh Makefile.SH + sh Makefile.SH +else + echo "jmake failed, aborting" >&2 + exit 1 +fi +!NO!SUBS! +chmod 755 jmkmf +$eunicefix jmkmf diff --git a/jmake/jmkmf.man b/jmake/jmkmf.man new file mode 100644 index 0000000..93af1f4 --- /dev/null +++ b/jmake/jmkmf.man @@ -0,0 +1,80 @@ +''' $Id: jmkmf.man,v 3.0.1.1 1995/05/12 11:58:03 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: jmkmf.man,v $ +''' Revision 3.0.1.1 1995/05/12 11:58:03 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0 1993/08/18 12:04:20 ram +''' Baseline for dist 3.0 netwide release. +''' +.TH JMKMF 1 ram +.SH NAME +jmkmf \- runs jmake with the correct options +.SH SYNOPSIS +.B jmkmf +[ +.I top-level dir +[ +.I current dir +] +] +.SH DESCRIPTION +.I Jmkmf +is a wrapper which calls +.I jmake +with the correct options, defining the symbols +.SM TOPDIR +(location of the top-level directory) and +.SM CURDIR +(current directory). The generated +.I Makefile.SH +is then ran through +.I /bin/sh +to produce a +.I Makefile. +.PP +.I Jmkmf +is useful when you generate a makefile for the first time. +.PP +When ran without arguments, +.I jmkmf +will scan the directories upwards, looking for a .package file marking +the top of your sources. It will then derive the top-level directory +and the name of the current directory by itself. +.PP +Once you have a +.I Makefile.SH +generated by +.I jmake, +and have run Configure already, you can use +.I make Makefile.SH +to build the Makefile.SH again and +.I make Makefile +to run the Makefile.SH through +.I /bin/sh. +To use the recursive commands, you have to append an 's' at the +end of the name as in +.I make Makefiles.SH +and +.I make Makefiles. +.SH AUTHOR +Raphael Manfredi +.SH FILES +.PD 0 +.TP 20 +Jmakefile +High level description of makefile +.TP +.package +The file marking the top of your package tree +.PD +.SH "SEE ALSO" +jmake(1), packinit(1). diff --git a/kit/Jmakefile b/kit/Jmakefile new file mode 100644 index 0000000..9d2b41a --- /dev/null +++ b/kit/Jmakefile @@ -0,0 +1,49 @@ +/* + * Jmakefile for kit maker + */ + +;# $Id: Jmakefile,v 3.0.1.2 1994/04/22 09:35:35 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.2 1994/04/22 09:35:35 ram +;# patch23: new kitpost script +;# +;# Revision 3.0.1.1 1994/01/24 13:42:21 ram +;# patch16: added dependency generation stage +;# +;# Revision 3.0 1993/08/18 12:04:21 ram +;# Baseline for dist 3.0 netwide release. +;# + +SCRIPT = makedist manifake kitsend kitpost + +ShellScriptTarget($(SCRIPT)) +InstallScript(makeSH,$(SCRIPTDIR)) +InstallManPage(makeSH,$(MANSRC)) + +SCRIPTSH = \ +|expand f!$(SCRIPT)! + !f.SH \ +-expand \\ + +>SED +>RM +>MKDEP + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(SCRIPTSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>[ ]*\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + diff --git a/kit/Makefile.SH b/kit/Makefile.SH new file mode 100755 index 0000000..bde4076 --- /dev/null +++ b/kit/Makefile.SH @@ -0,0 +1,235 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL44] +: $X-Id: Jmake.tmpl,v 3.0.1.1 1993/08/20 07:36:36 ram Exp ram $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=kit +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.1 1994/10/29 15:46:30 ram Exp ram $ + +######################################################################## +# Force 'make depend' to be performed first -- do not edit + +.FORCE_DEPEND:: + +all:: .FORCE_DEPEND + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.2 1994/04/22 09:35:35 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.2 1994/04/22 09:35:35 ram +# patch23: new kitpost script +# +# Revision 3.0.1.1 1994/01/24 13:42:21 ram +# patch16: added dependency generation stage +# +# Revision 3.0 1993/08/18 12:04:21 ram +# Baseline for dist 3.0 netwide release. +# + +SCRIPT = makedist manifake kitsend kitpost + +all:: $(SCRIPT) + +local_realclean:: + $(RM) $(SCRIPT) + +makedist: makedist.SH + /bin/sh makedist.SH + +manifake: manifake.SH + /bin/sh manifake.SH + +kitsend: kitsend.SH + /bin/sh kitsend.SH + +kitpost: kitpost.SH + /bin/sh kitpost.SH + + +install:: $(SCRIPTS) $(LSCRIPTS) + @for file in $(SCRIPTS) $(LSCRIPTS); do \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(INSTALL) -c -m 555 $$file $(SCRIPTDIR)); \ + done + +deinstall:: + @for file in $(SCRIPTS) $(LSCRIPTS); do \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(RM) $(SCRIPTDIR)/$$file); \ + done + +install.man:: + @if test "$(MANSRC)"; then \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for file in $(SCRIPTS); do \ + (set -x; \ + $(INSTALL) -c -m 444 $$file.man $(MANSRC)/$$file.$(L)); \ + done; \ + else exit 0; fi + +deinstall.man:: + @if test "$(MANSRC)"; then \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for file in $(SCRIPTS); do \ + (set -x; $(RM) $(MANSRC)/$$file.$(L)); \ + done; \ + else exit 0; fi + +install:: makeSH + $(INSTALL) -c -m 555 makeSH $(SCRIPTDIR) + +deinstall:: + $(RM) $(SCRIPTDIR)/makeSH + +install.man:: makeSH.man + $(INSTALL) -c -m 444 makeSH.man $(MANSRC)/makeSH.$(L) + +deinstall.man:: + $(RM) $(MANSRC)/makeSH.$(L) + +SCRIPTSH = \ + makedist.SH \ + manifake.SH \ + kitsend.SH \ + kitpost.SH + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(SCRIPTSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>[ ]*\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +install:: + @echo "install in $(CURRENT) done." + +deinstall:: + @echo "deinstall in $(CURRENT) done." + +install.man:: + @echo "install.man in $(CURRENT) done." + +deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +######################################################################## +# Dependencies generated by make depend +# DO NOT DELETE THIS LINE -- make depend relies on it + +# Put nothing here or make depend will gobble it up +.FORCE_DEPEND:: + @echo "You must run 'make depend' in $(TOP) first."; exit 1 +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/kit/README b/kit/README new file mode 100644 index 0000000..a521da2 --- /dev/null +++ b/kit/README @@ -0,0 +1,35 @@ +This directory contains a rudimentary kit maker. + +N.B.: This must not be confused with the kit package, which is a set of shell +scripts for sending arbitrary files and directories by mail and unpacking them. +One could call kit a binary tarmailer. The kit package has been released +separately from dist (posted on comp.sources.unix in 1991). + +Larry Wall said: + + Depending on where you are going to send your kits you might prefer + to use Rich $alz's kit maker instead--it makes more robust kits + but assumes more about the target system. + +I say: + + If you are using RCS 4.3, be sure to use makedist instead of your + own shell archiver, unless you do not use $Id, $Header or $Locker + markers. Moreover, makedist will take the latest checked in + revision intead of the working file, so that you archive a coherent + package even if you made some mods since the last patch. + +You run makedist in the top level directory of your package and it uses +the MANIFEST.new file to generate shar scripts of about 50000 bytes each. + +Just make sure MANIFEST.new contains everything you want, including any +Configure, config.h.SH, or patchlevel.h files. A prototype patchlevel.h +may be found in ../gen/patchlevel.h. See the manpage for more details. + +If you do not wish to build up shell archives but an up-to-date copy of +your source tree, run someting like: + + makedist -c dir + +to build an up-to-date source tree in dir, which you can then archive using +your own shell archiver. diff --git a/kit/kitpost.SH b/kit/kitpost.SH new file mode 100755 index 0000000..2a86bb3 --- /dev/null +++ b/kit/kitpost.SH @@ -0,0 +1,237 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting kit/kitpost (with variable substitutions)" +cat >kitpost <>kitpost <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("hrVm:D:H:"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$RCSEXT = ',v' unless $RCSEXT; +if ($inews eq 'inews') { + $inews = '/usr/lib/news/inews' if -f '/usr/lib/news/inews'; +} + +chdir '..' if -d '../bugs'; + +&readpackage; + +$orgname = &tilda_expand($orgname); +chop($orgname = `cat $orgname`) if $orgname =~ m|^/|; + +if ($opt_r) { + $repost = ' (REPOST)'; +} + +while ($_ = shift) { + if (/^(kit)?[1-9][\d\-]*$/) { + s/^kit//; + push(@argv,$_); + } else { + push(@ngroups,$_); + } +} +$ngroups = join(',',@ngroups) unless $#ngroups < 0; +$dest = $opt_m; +&usage unless $ngroups || $dest; + +@ARGV = @argv; + +if (-f "$package.kit10") { + @filelist = <$package.kit[0-9][0-9]>; +} +else { + @filelist = <$package.kit[0-9]>; +} +pop(@filelist) =~ /(\d+)$/ && ($maxnum = $1 + 0); + +if ($#ARGV < 0) { + $argv = "1-$maxnum"; + @ARGV = $argv; +} + +$argv = &rangeargs(@ARGV); +@ARGV = split(' ', $argv); + +$argv =~ s/ $//; + +if ($#ARGV < 0) { + print STDERR "$progname: no kits specified.\n"; + &usage; +} else { + local($s) = $#ARGV ? 's' : ''; + print "$progname: posting $package $baserev kit$s $argv to $ngroups...\n" + if $ngroups; + print "$progname: mailing $package $baserev kit$s $argv to $dest...\n" + if $dest; +} + +$desc = "$opt_D, " if $opt_D; + +fork && exit; + +# Compute a suitable root message ID that all parts will reference, so that +# threaded news readers will correctly process them. +# Unfortunately, this works only when all kits are sent. +($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = + localtime(time); +$mon++; +$rootmid = "$year$mon$mday$hour$min$sec.AA$$"; +$first = $maxnum >= 10 ? "01" : "1"; +$rootmsgid = "<$rootmid.P$first.$maintloc>"; + +until ($#ARGV < 0) { + $kitnum = shift; + $kitnum = "0$kitnum" if $kitnum < 10 && $maxnum >= 10; + open(FILE, "$package.kit$kitnum") || + die "$progname: can't open $package.kit$kitnum: $!\n"; + if ($ngroups) { + open(INEWS,"|$inews -h") || die "$progname: can't fork $inews: $!\n"; + } + if ($dest) { + $opt = '-odq' if $mailer =~ /sendmail/; + $dest =~ s/,/ /g; + ($to = $dest) =~ s/\s+/, /g; + open(MAILER,"|$mailer $opt $dest") || + die "$progname: can't fork $mailer: $!\n"; + } + + $msg_id = "<$rootmid.P$kitnum.$maintloc>"; + $msg_id = $rootmsgid if $kitnum == 1; + $msg_id .= "\nReferences: $rootmsgid" if $kitnum != 1; + + print INEWS "Newsgroups: $ngroups\n"; + print MAILER "To: $to\n"; +$head = < +Archive-name: $package-$baserev/part$kitnum +Environment: UNIX + +EOH + print INEWS $head; + print MAILER $head; + + if ($kitnum == 1 && $opt_H) { + open(HEAD, $opt_H) || warn "$progname: can't open $opt_H: $!\n"; + while () { + print INEWS; + print MAILER; + } + close HEAD; + } + + while () { + print INEWS; + print MAILER; + } + close FILE; + close INEWS; + die "$progname: could not post part$kitnum.\n" if $ngroups && $?; + close MAILER; + die "$progname: could not send part$kitnum.\n" if $dest && $?; +} + +sub usage { + print STDERR <= 0) { + $_ = shift(@_); + while (/^\s*\d/) { + s/^\s*(\d+)//; + $min = $1; + if (s/^,//) { + $max = $min; + } + elsif (s/^-(\d*)//) { + $max = $1; + if ($max == 0 && $maxnum) { + $max = $maxnum; + } + s/^[^,],?//; + } + else { + $max = $min; + } + for ($i = $min; $i <= $max; ++$i) { + $result .= $i . ' '; + } + } + } + $result; +} + +!NO!SUBS! +$grep -v '^;#' ../pl/package.pl >>kitpost +$grep -v '^;#' ../pl/tilde.pl >>kitpost +$grep -v '^;#' ../pl/profile.pl >>kitpost +chmod +x kitpost +$eunicefix kitpost diff --git a/kit/kitpost.man b/kit/kitpost.man new file mode 100644 index 0000000..d7ebf90 --- /dev/null +++ b/kit/kitpost.man @@ -0,0 +1,89 @@ +''' $Id: kitpost.man,v 3.0.1.2 1995/05/12 11:58:09 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: kitpost.man,v $ +''' Revision 3.0.1.2 1995/05/12 11:58:09 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0.1.1 1994/05/06 13:55:01 ram +''' patch23: created +''' +.TH KITSEND 1 ram +.SH NAME +kitpost \- posts distribution kits +.SH SYNOPSIS +.B kitpost +[ +.B \-hrV +] [ +.B -H +.I file +] [ +.B -D +.I desc +] [ +.B -m +.I dest1,dest2 +] [ +.I kits +] [ +.I newsgroups +] +.SH DESCRIPTION +.I Kitpost +posts distribution kits made by \fImakedist\fR to some (source) newsgroups +specified on the command line. If you do not specify any kit list, then all the +kits are sent. Otherwise, only the specified kits will be (re)sent. +.PP +A kit list may include ranges, \fI1-10\fR specifying kits 1 through 10, +and \fI5-\fR meaning kits 5 up to the last one. You may also specify kit +numbers by separating them with commas or spaces, and even mix with ranges, +such as: \fI1 3 5-7 9\fR. +.PP +.I Kitpost +ensures correct \fIReferences:\fR lines are inserted in your postings so that +all parts but the first point to the root article. Threaded newsreaders and +end-users traditionally appreciate that. +.SH OPTIONS +The following options are recognized by \fIkitpost\fR: +.TP 10 +.B \-h +Print help message and exit. +.TP +\fB\-m\fI dest1,destn\fR +Sends kits by e-mail to the specified recipients. This option may be used in +conjunction with newsgroup posting. It is mainly intended for sites where +direct posting to a moderated newsgroup is not allowed by \fIinews\fR. You may +thus send your kits to the newsgroup moderator in a form that will ease the +whole posting process. +.TP +.B \-r +Signals a repost. +.TP +\fB\-D\fI description\fR +Specify a description string that will be added to the subject line. Usually +a brief sentence (less than, say, 40 characters). +.TP +\fB\-H\fI file\fR +Specify a file to be used as header introduction in the first part of your +posting. Usually the root README file. +.TP +.B \-V +Print version number and exit. +.SH BUGS +Article cross-referencing is properly set-up only when the whole package is +(re)posted in one batch. +.PP +It is not currently possible to set-up the article headers manually or +better, interactively. +.SH AUTHOR +Raphael Manfredi +.SH "SEE ALSO" +makedist(1), kitsend(1). diff --git a/kit/kitsend.SH b/kit/kitsend.SH new file mode 100755 index 0000000..47bc354 --- /dev/null +++ b/kit/kitsend.SH @@ -0,0 +1,192 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting kit/kitsend (with variable substitutions)" +cat >kitsend < +# +# $Log: kitsend.SH,v $ +# Revision 3.0.1.2 1994/05/06 13:59:57 ram +# patch23: random code cleanup to follow pat tools style +# patch23: made configurable from dist profile +# patch23: now understands -V and -h options +# patch23: mails now flagged with a bulk precedence +# patch23: added X-Mailer header and now calls mailer via open() +# +# Revision 3.0.1.1 1993/08/19 06:42:15 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:04:25 ram +# Baseline for dist 3.0 netwide release. +# + +\$orgname='$orgname'; +\$mailer='$mailer'; +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +!GROK!THIS! +cat >>kitsend <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts('hV'); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$orgname = &tilda_expand($orgname); +chop($orgname = `cat $orgname`) if $orgname =~ m|^/|; + +&readpackage; + +while ($_ = shift) { + if (/^(kit)?[1-9][\d,-]*$/) { + s/^kit//; + push(@argv, $_); + } + else { + push(@dest, $_); + } +} +$dest = join(' ',@dest); +&usage unless $dest; + +@ARGV = @argv; + +if (-f "$package.kit10") { + @filelist = <$package.kit[0-9][0-9]>; +} +else { + @filelist = <$package.kit[0-9]>; +} +pop(@filelist) =~ /(\d+)$/ && ($maxnum = $1 + 0); + +if ($#ARGV < 0) { + $argv = "1-$maxnum"; + @ARGV = $argv; +} +$argv = &rangeargs(@ARGV); +@ARGV = split(' ', $argv); + +$argv =~ s/ $//; + +if ($#ARGV < 0) { + die "$progname: no kits specified.\n"; +} elsif ($#ARGV) { + print "$progname: sending $package $baserev kits $argv to $dest...\n"; +} else { + print "$progname: sending $package $baserev kit $argv to $dest...\n"; +} + +fork && exit; + +$opt = '-odq' if $mailer =~ /sendmail/; + +until ($#ARGV < 0) { + $kitnum = shift; + + # Provision for broken mailers... + @dest = split(' ', $dest); + while (@smalldest = splice(@dest, 0, 50)) { + $to = join(', ', @smalldest); # Sensible To: for sendmail + $smalldest = join(' ', @smalldest); + + open(MAILER, "|$mailer $opt $smalldest") || + die "$progname: can't fork $mailer: $!\n"; + print MAILER +"To: $to +Subject: $package $baserev kit #$kitnum +Precedence: bulk +X-Mailer: dist [version $version PL$patchlevel] +Organization: $orgname + +[There are $maxnum kits for $package version $baserev.] + +"; + $kitnum = "0$kitnum" if $kitnum < 10 && $maxnum >= 10; + open(FILE,"$package.kit$kitnum") || + die "$progname: can't open $package.kit$kitnum: $!\n"; + while () { + print MAILER; + } + close FILE; + close MAILER; + warn "$progname: ERROR mailing of $package.kit$kitnum to $dest\n" if $?; + } +} + +sub usage { + print STDERR <= 0) { + $_ = shift(@_); + while (/^\s*\d/) { + s/^\s*(\d+)//; + $min = $1; + if (s/^,//) { + $max = $min; + } + elsif (s/^-(\d*)//) { + $max = $1; + if ($max == 0 && $maxnum) { + $max = $maxnum; + } + s/^[^,],?//; + } + else { + $max = $min; + } + for ($i = $min; $i <= $max; ++$i) { + $result .= $i . ' '; + } + } + } + $result; +} + +!NO!SUBS! +$grep -v '^;#' ../pl/package.pl >>kitsend +$grep -v '^;#' ../pl/tilde.pl >>kitsend +$grep -v '^;#' ../pl/profile.pl >>kitsend +chmod +x kitsend +$eunicefix kitsend diff --git a/kit/kitsend.man b/kit/kitsend.man new file mode 100644 index 0000000..d5bca4c --- /dev/null +++ b/kit/kitsend.man @@ -0,0 +1,42 @@ +''' $Id: kitsend.man,v 3.0.1.1 1994/05/06 14:00:11 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: kitsend.man,v $ +''' Revision 3.0.1.1 1994/05/06 14:00:11 ram +''' patch23: documented new -V and -h options +''' +''' Revision 3.0 1993/08/18 12:04:26 ram +''' Baseline for dist 3.0 netwide release. +''' +.TH KITSEND 1 ram +.SH NAME +kitsend \- sends distribution kits +.SH SYNOPSIS +.B kitsend +[ +.B \-hV +] [ \fIkits\fR ] \fIrecipients\fR +.SH DESCRIPTION +.I Kitsend +sends distribution kits made by \fImakedist\fR to some recipients specified +on the command line. If you do not specify any kit list, then all the +kits are sent. Otherwise, only the specified kits will be (re)sent. +.PP +A kit list may include ranges, \fI1-10\fR specifying kits 1 through 10, +and \fI5-\fR meaning kits 5 up to the last one. You may also specify kit +numbers by separating them with commas or spaces, and even mix with ranges, +such as: \fI1 3 5-7 9\fR. +.PP +The \fB\-h\fR switch will print out the usage and \fB-V\fR will print +the version number. +.SH AUTHOR +Harlan Stenn +.SH "SEE ALSO" +makedist(1), kitpost(1). diff --git a/kit/makeSH b/kit/makeSH new file mode 100644 index 0000000..54e7b3e --- /dev/null +++ b/kit/makeSH @@ -0,0 +1,76 @@ +#!/bin/sh + +# $Id: makeSH,v 3.0.1.1 1993/08/19 06:42:16 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# Original Author: Larry Wall +# +# $Log: makeSH,v $ +# Revision 3.0.1.1 1993/08/19 06:42:16 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:04:26 ram +# Baseline for dist 3.0 netwide release. +# + +for file do + if test -f $file.SH; then + mv $file.SH $file.SH.old + echo "makeSH: renaming $file.SH as $file.SH.old." + fi + base=`basename $file` + + cat >$file.SH <$base <>$file.SH ;; + esac + + cat >>$file.SH <>$base <<'!NO!SUBS!' +BLURFL + + sed -e '1{' -e '/#!.*\/bin\/sh$/d' -e '}' $file >>$file.SH + + cat >>$file.SH < +.SH SEE ALSO +pat(1), metaconfig(1), makedist(1). +.SH BUGS +It could assume that variables from metaconfig's Glossary need to be +initialized in the first section, but I'm too lazy to make it do that. diff --git a/kit/makedist.SH b/kit/makedist.SH new file mode 100755 index 0000000..2d38f2a --- /dev/null +++ b/kit/makedist.SH @@ -0,0 +1,460 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +echo "Extracting kit/makedist (with variable substitutions)" +cat >makedist <>makedist <<'!NO!SUBS!' + +&profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts('c:f:dhvqs:V'); + +$ENV{'DIST'} = '/dev/null'; # Disable ~/.dist_profile + +if ($opt_V) { + print STDERR "makedist $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$MAXKITSIZE = 50000 unless $MAXKITSIZE = $opt_s; +$KITOVERHEAD = 1800; +$FILEOVERHEAD = 90; +$CHOPSIZE = $MAXKITSIZE - $KITOVERHEAD - $FILEOVERHEAD; + +$NEWMANI = 'MANIFEST.new' unless $NEWMANI = $opt_f; +$MANI = 'MANIFEST' unless $opt_f; +$PACKLIST = 'PACKLIST'; +$PACKNOTES = 'PACKNOTES'; + +$tmpdir = "/tmp/MKst$$"; # Where to copy distribution +$tmpdir = '.' if $opt_q; # Quick mode: no need to copy distribution + +&set_sig('aborted'); # Make sure we clean up in case of emergency + +&readpackage; +&get_patchlevel; + +eval '&manifake'; # Want to trap possible die and redirect to fatal +if ($@ ne '') { + chop($@); + &fatal($@); +} + +if ($opt_c) { # Copy distribution only, no shell archive + &distcopy; + exit 0; +} + +&distfake; +©right'init($copyright) if -f $copyright; + +unlink <$package.kit? $package.kit??>; +chop($curdir = `pwd`); +chdir $tmpdir || die "Can't chdir to $tmpdir.\n"; + +&maniread; +&kitlists; +&manimake; +&kitbuild; +&cleanup; +exit 0; + +# Physically build the kits +sub kitbuild { + $numkits = $#list; + if ($numkits > 9) { + $sp = '%02d'; + } else { + $sp = '%d'; + } + + for ($kitnum = 1; $kitnum <= $numkits; $kitnum++) { + $list = $list[$kitnum]; + $kit = sprintf("$package.kit" . $sp,$kitnum); + print "*** Making $kit ***\n"; + open(KIT,">$curdir/$kit") || do fatal("Can't create $curdir/$kit: $!"); + + &kitleader; + + @files = split(' ',$list); + reset 'X'; + for $file (@files) { + $_ = $file; + while (s|^(.*)/.*$|$1|) { + push(@Xdirs,$_) unless $Xseen{$_}++; + } + } + print KIT "mkdir ",join(' ', sort @Xdirs)," 2>/dev/null\n"; + + foreach $file (@files) { + print "\t",$file,"\n" if $opt_v; + print KIT "echo Extracting $file\n"; + print KIT "sed >$file <<'!STUFFY!FUNK!' -e 's/X//'\n"; + open(FILE, $file); + ©right'reset; # Reset copyright for new file + while () { + # Use Lock[e]r as a pattern in case it is applied on ourselves + s|Lock[e]r:.*\$|\$|; # Remove locker mark + print KIT ©right'filter($_, 'X'); + } + close FILE; + print KIT "!STUFFY!FUNK!\n"; + -x "$file" && (print KIT "chmod +x $file\n"); + } + &kittrailer; + chmod 0755, $kit; + } +} + +sub kitlists { + for $filename (keys %comment) { + next if $filename =~ m|/$|; # Skip directories + next if -d $filename; # Better safe than sorry + ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($filename); + + # Make sure file is not larger than the CHOPSIZE limit. If it is, + # a split is attempted. + if ($size > $CHOPSIZE) { + print "Splitting $filename...\n" if $opt_v; + $file_comment = $comment{$filename}; + open(FILE, $filename) || die "Can't open $filename: $!\n"; + $piece = 'AA'; + ($dir, $name) = ('.', $filename) + unless ($dir, $name) = ($filename =~ m|(.*)/(.*)|); + $chopped = $dir . '/' . substr($name, 0, 11); + $chopped =~ s|^\./||; + &fatal("There is already a split file named $chopped") + if defined $Chopped{$chopped}; + $Chopped{$chopped} = $filename; # Association split <-> real file + $size = 0; + open(CURPIECE, ">$chopped:$piece") || + &fatal("Can't create $chopped:$piece: $!"); + while () { + if ($size + length($_) > $CHOPSIZE) { + close CURPIECE; + $size{"$chopped:$piece"} = $size; + $comment{"$chopped:$piece"} = "$file_comment (part $piece)"; + push(@files, "$chopped:$piece"); + print "\t$chopped:$piece ($size bytes)\n" if $opt_v; + $size = 0; + $piece++; # AA -> AB, etc... + open(CURPIECE, ">$chopped:$piece") || + &fatal("Can't create $chopped:$piece: $!"); + } + print CURPIECE $_; + $size += length($_); + } + close FILE; + close CURPIECE; + $size{"$chopped:$piece"} = $size; + $comment{"$chopped:$piece"} = "$file_comment (part $piece)"; + push(@files, "$chopped:$piece"); + print "\t$chopped:$piece ($size bytes)\n" if $opt_v; + delete $comment{$filename}; # File split, not in PACKLIST + } else { + $size += 1000000 if $filename =~ /README/; + $size{$filename} = $size; + push(@files, "$filename"); + } + } + + # Build a file PACKNOTES to reconstruct split files + if (defined %Chopped) { + open(PACKNOTES, ">$PACKNOTES") || &fatal("Can't create PACKNOTES: $!"); + foreach (keys %Chopped) { + print PACKNOTES < $Chopped{$_} +rm -f $_:[A-Z][A-Z] +EOC + } + close PACKNOTES; + push(@files, $PACKNOTES); + $comment{$PACKNOTES} = 'Script to reconstruct split files'; + ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($PACKNOTES); + $size{$PACKNOTES} = $size; + } + + # Currently, file PACKLIST does not exist, so its size is unknown and + # it cannot be correctly put in one archive. Therefore, we take the + # size of MANIFEST.new, which will give us a good estimation. + push(@files, 'PACKLIST'); + + ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($NEWMANI); + $size{$PACKLIST} = $size; + + sub revnum { $size{$a} < $size{$b} ? 1 : $size{$a} > $size{$b} ? -1 : 0; } + @files = sort revnum @files; + + for (@files) { + $size = $size{$_}; + $size -= 1000000 if /README/; + $i=1; + while (($newtot = int($tot[$i] + $size + $size/40 + $FILEOVERHEAD)) > + $MAXKITSIZE-$KITOVERHEAD && $tot[$i]) { + $i++; + } + $tot[$i] = $newtot; + print "Adding $_ to kit $i giving $newtot bytes\n" if $opt_d; + $kit{$_} = $i; + $list[$i] .= " $_"; + } +} + +# Read manifest file and initialize the %comment array. +sub maniread { + do fatal("You don't have a $NEWMANI file. Run manifake") + unless -f "$NEWMANI"; + open(NEWMANI,$NEWMANI) || do fatal("Can't read $NEWMANI: $!"); + while () { + ($key,$val) = split(' ',$_,1) unless ($key,$val) = /^(\S+)\s+(.*)/; + $comment{$key} = $val; + } + close NEWMANI; +} + +# MANIFEST and MANIFEST.new must say the same thing. Create the +# PACKLIST file (thus avoiding kit numbers in MANIFEST, which causes big +# patches when only re-ordering occurred). Note that PACKLIST should +# not appear in MANIFEST.new (the user may remove it). +sub manimake { + # Add built packlist + $comment{$PACKLIST} = 'Which files came with which kits'; + + open(PACKLIST, ">$PACKLIST") || do fatal("Can't create $PACKLIST: $!"); + print PACKLIST +"After all the $package kits are run you should have the following files: + +Filename Kit Description +-------- --- ----------- +"; + for (sort keys(comment)) { + printf PACKLIST "%-27s %2s %.47s\n", $_, $kit{$_}, $comment{$_}; + } + close PACKLIST; +} + +sub kitleader { + local($plevel); + $plevel = " at patchlevel $patch_level" if $patch_level ne ''; + print KIT <kit${kitnum}isdone +run='' +config='' +for iskit in$rangelist; do + if test -f kit\${iskit}isdone; then + run=\"\$run \$iskit\" + else + todo=\"\$todo \$iskit\" + fi +done +case \$todo in + '') + echo \"You have run all your kits.\" +EOM + if (defined %Chopped) { # Some splitting occurred + print KIT <) { + /^#define\s+PATCHLEVEL\s+(\w+)/ && ($patch_level = $1); + } + close PL; + } +} + +sub distfake { + return if $opt_q; + local($sw); + $sw = 's' unless $opt_v; + mkdir($tmpdir, 0700) || die "Can't create directory $tmpdir.\n"; + print "Building a copy of distribution in $tmpdir...\n" if $opt_v; + system 'perl', '-S', 'patcol', "-a$sw", '-f', $NEWMANI, '-d', $tmpdir; + system 'cp', $NEWMANI, "$tmpdir/$NEWMANI" + unless -f "$tmpdir/$NEWMANI" && !$opt_f; +} + +sub distcopy { + local($sw); # Switch to force patcol to copy checked out files + &makedir($opt_c); + print "Building a copy of distribution in $opt_c...\n" if $opt_v; + $sw = 'c' if $opt_q; + $sw .= 's' unless $opt_v; + system 'perl', '-S', 'patcol', "-aRC$sw", '-f', $NEWMANI, '-d', $opt_c; +} + +sub distrm { + return if $opt_q; + print "Removing distribution in $tmpdir...\n" if $opt_v; + chdir "/"; # Do not stay in removed directory... + system '/bin/rm', '-rf', "$tmpdir"; +} + +sub splitrm { + foreach $base (keys %Chopped) { + print "Removing split files for $base:\n" if $opt_v; + $piece = 'AA'; + while (-f "$base:$piece") { + print "\t$base:$piece\n" if $opt_v; + unlink "$base:$piece"; + $piece++; # AA -> AB, etc... + } + } +} + +sub cleanup { + &distrm if -d $tmpdir; + if ($opt_q) { + &splitrm; # Remove in-place split files + unlink $PACKLIST, $PACKNOTES; + } +} + +sub fatal { + local($reason) = shift(@_); + &cleanup; + die "$reason\n"; +} + +sub set_sig { + local($handler) = @_; + $SIG{'HUP'} = $handler; + $SIG{'INT'} = $handler; + $SIG{'QUIT'} = $handler; + $SIG{'TERM'} = $handler; +} + +sub aborted { + &set_sig('IGNORE'); + $opt_v = 1; # Force verbose message in distrm + &cleanup; + print "Aborted.\n"; + exit 1; +} + +sub usage { + print STDERR <>makedist +$grep -v '^;#' ../pl/manifake.pl >>makedist +$grep -v '^;#' ../pl/copyright.pl >>makedist +$grep -v '^;#' ../pl/makedir.pl >>makedist +$grep -v '^;#' ../pl/tilde.pl >>makedist +$grep -v '^;#' ../pl/profile.pl >>makedist +chmod +x makedist +$eunicefix makedist diff --git a/kit/makedist.man b/kit/makedist.man new file mode 100644 index 0000000..0a13318 --- /dev/null +++ b/kit/makedist.man @@ -0,0 +1,147 @@ +.rn '' }` +''' $Id: makedist.man,v 3.0.1.2 1995/05/12 11:58:16 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: makedist.man,v $ +''' Revision 3.0.1.2 1995/05/12 11:58:16 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0.1.1 1994/05/06 14:00:50 ram +''' patch23: now mentions kitpost and kitsend +''' +''' Revision 3.0 1993/08/18 12:04:31 ram +''' Baseline for dist 3.0 netwide release. +''' +''' +.de Sh +.br +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' +.ie n \{\ +.tr \(*W-\*(Tr +.ds -- \(*W- +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +.ds L' ' +.ds R' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds L' ` +.ds R' ' +'br\} +.TH MAKEDIST 1 LOCAL +.SH NAME +makedist \- a distribution kit maker +.SH SYNOPSIS +.B makedist +[ \fB\-dhqvV\fR ] [ \fB\-c\fI dir\fR ] +[ \fB\-s\fI size\fR ] [\fB\-f \fImanifest\fR ] +.SH DESCRIPTION +.I Makedist +is a rather simpleminded shar program that knows how to pack files +into multiple kits of approximately 50000 bytes each. +The shar scripts produced assume very little about the target machine; +there is correspondingly little error checking done compared to other +shar programs. Alternatively, with the \fB\-c\fR option, you can +create a directory containing the whole source tree, and then pack it +up using your own shell archiver. +.PP +If you are using the copyright expansion feature (as determined by +\fIpackinit\fR), then you have to pack your distribution using this +program to ensure the copyright is correctly set. +.PP +In order to run \fImakedist\fR you have to do two things: +.IP 1) 4 +Create a .package file in the package's top-level directory by running +\fIpackinit\fR. +This program will ask you about your package and remember what you tell +it so that all the \fIdist\fR programs can be smart. +.IP 2) 4 +Create a MANIFEST.new file in your top-level directory that lists all the +files in your package. +The filename should be the first field on each line. +After some whitespace you can add a comment describing your file (briefly). +.PP +After running \fImakedist\fR, +you will have a set of kits in your top-level directory. +If your package name is "foo", they will be named foo.kit1, foo.kit2, etc. +The file created PACKLIST file is automatically added to the distribution and +tells which files come with which kits. +If you used the \fB\-c\fR option, you will end-up with a single directory +instead, containing the whole distribution, ready to be sent to the end-user. +.PP +If a file is too large to be packed as-is in one archive, it will be +automatically split in smaller parts. Only the first 11 characters of the file +will be kept though, and \fImakedist\fR will abort if two distinct files are +to be split and have the same 11 first characters in their names. The split +files will automatically be reconstructed at the end of the archive extraction +by runnning a script generated in PACKNOTES. +.PP +You may then mail your kits via \fIkitsend\fR or post them with \fIkitpost\fR. +.SH OPTIONS +The following options are handled by \fImakedist\fR: +.TP 10 +.B \-c \fIdir\fR +Tell \fImakedist\fR that the distribution should be copied (mirrored) in +the specified directory, instead of producing shell archives. Compatible with +the \fB\-q\fR option. +.TP +.B \-d +Turn on debug mode. Probably not useful. +.TP +\fB-f\fI file\fR +Use \fIfile\fR as manifest. By default, MANIFEST.new is used. +.TP +.B \-h +Print help message and exit. +.TP +.B \-q +Quick production of the kits: the checked-out version of the files is used, +instead of using the RCS file to actually get the latest checked-in version. +This will save some considerable time, but you have to be sure the checked-out +version is up-to-date or you might end up with an inconsistent package. +.TP +\fB\-s\fI size\fR +Set maximum kit size to \fIsize\fR bytes. +.TP +.B \-v +Verbose mode: trace kit building process or tree mirroring. +.TP +.B \-V +Print version number and exit. +.SH AUTHORS +Larry Wall (version 2.0) +.br +Raphael Manfredi +.SH FILES +Creates ./$package.kit* unless \fB\-c\fR option is used. +.br +PACKLIST and PACKNOTES are also temporarily created. +.SH "SEE ALSO" +kitsend(1), kitpost(1), metaconfig(1), patcol(1) +.rn }` '' diff --git a/kit/manifake.SH b/kit/manifake.SH new file mode 100755 index 0000000..0a7d561 --- /dev/null +++ b/kit/manifake.SH @@ -0,0 +1,51 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting kit/manifake (with variable substitutions)" +$spitshell >manifake <>manifake <<'!NO!SUBS!' +$NEWMANI = 'MANIFEST.new'; +$MANI = 'MANIFEST'; + +&manifake; + +!NO!SUBS! +chmod 755 manifake +$grep -v '^;#' ../pl/manifake.pl >> manifake +$eunicefix manifake diff --git a/kit/manifake.man b/kit/manifake.man new file mode 100644 index 0000000..9ec2754 --- /dev/null +++ b/kit/manifake.man @@ -0,0 +1,46 @@ +''' $Id: manifake.man,v 3.0.1.1 1995/05/12 11:58:21 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: manifake.man,v $ +''' Revision 3.0.1.1 1995/05/12 11:58:21 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0 1993/08/18 12:04:33 ram +''' Baseline for dist 3.0 netwide release. +''' +.TH MANIFAKE 1 ram +.SH NAME +manifake \- creates a MANIFEST.new out of a MANIFEST file +.SH SYNOPSIS +.B manifake +.SH DESCRIPTION +.I Manifake +is a real simpleminded program that takes a MANIFEST file, such as one +produced by a shar program, and creates a MANIFEST.new file ready to be +used by all the dist programs. What it does is that all archive numbers +are removed and the optional leading comments up to a dashed-line are +thrown away. +.PP +.I Manifake +will typically be used when converting an existing package +to use \fImetaconfig\fR or any other dist utility. +.SH AUTHOR +Raphael Manfredi +.SH FILES +.PD 0 +.TP 20 +MANIFEST +Original manifest produced by some shar program +.TP +MANIFEST.new +Faked manifest file, suitable for use by any dist programs. +.PD +.SH "SEE ALSO" +makedist(1), metaconfig(1), pat(1). diff --git a/lib/C/Jmakefile b/lib/C/Jmakefile new file mode 100644 index 0000000..1b2b569 --- /dev/null +++ b/lib/C/Jmakefile @@ -0,0 +1,20 @@ +/* + * Jmakefile for C subdirectory. + */ + +;# $Id: Jmakefile,v 3.0.1.1 1994/01/24 13:43:38 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.1 1994/01/24 13:43:38 ram +;# patch16: created +;# + +SetSubdirs(fake) diff --git a/lib/C/Makefile.SH b/lib/C/Makefile.SH new file mode 100755 index 0000000..764aa48 --- /dev/null +++ b/lib/C/Makefile.SH @@ -0,0 +1,188 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL44] +: $X-Id: Jmake.tmpl,v 3.0.1.1 1993/08/20 07:36:36 ram Exp ram $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=lib/C +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.1 1994/10/29 15:46:30 ram Exp ram $ + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.1 1994/01/24 13:43:38 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.1 1994/01/24 13:43:38 ram +# patch16: created +# + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: sub_clean local_clean +realclean: sub_realclean local_realclean +clobber: sub_clobber local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Rules for building in sub-directories -- do not edit + +subdirs: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)); \ + done + +install:: + @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= + +deinstall:: + @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= + +install.man:: + @$(MAKE) subdirs TARGET=install.man VERB="Installing man pages" FLAGS= + +deinstall.man:: + @$(MAKE) subdirs TARGET=deinstall.man VERB="Deinstalling man pages" FLAGS= + +sub_clean:: + @$(MAKE) subdirs TARGET=clean VERB="Cleaning" FLAGS= + @echo "Back to $(CURRENT) for "clean... + +sub_realclean:: + @$(MAKE) subdirs TARGET=realclean VERB="Real cleaning" FLAGS= + @echo "Back to $(CURRENT) for "realclean... + +sub_clobber:: + @$(MAKE) subdirs TARGET=clobber VERB="Clobbering" FLAGS= + @echo "Back to $(CURRENT) for "clobber... + +tag:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo "Tagging" "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) tag); \ + done + +Makefiles:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + echo "Making "Makefiles" in $(DIR)$$i..."; \ + (cd $$i || exit 1; \ + if test ! -f Makefile; then /bin/sh Makefile.SH; fi; \ + $(MAKE) $(MFLAGS) Makefiles) \ + done + +Makefiles.SH:: Makefile.SH + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + case "$(DIR)$$i/" in \ + */*/*/*/) newtop=../../../..;; \ + */*/*/) newtop=../../..;; \ + */*/) newtop=../..;; \ + */) newtop=..;; \ + esac; \ + case "$(TOP)" in \ + /*) newtop="$(TOP)" ;; \ + esac; \ + echo "Making Makefiles.SH in $(DIR)$$i..."; \ + (cd $$i || exit 1; $(MAKE) $(MFLAGS) -f ../Makefile \ + Makefile TOP=$$newtop CURRENT=$(DIR)$$i;\ + $(MAKE) $(MFLAGS) Makefiles.SH) \ + done + +all:: + @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= + +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/lib/C/fake/Jmakefile b/lib/C/fake/Jmakefile new file mode 100644 index 0000000..41afc72 --- /dev/null +++ b/lib/C/fake/Jmakefile @@ -0,0 +1,29 @@ +/* + * Jmakefile for C/fake subdirectory. + */ + +;# $Id: Jmakefile,v 3.0.1.1 1994/01/24 13:43:44 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.1 1994/01/24 13:43:44 ram +;# patch16: created +;# + +FILES = dup2.C getopt.C rename.C scandir.C setsid.C + +INSTALLFLAGS = -m 444 + +all:: /* So that default make does not default to install */ + +>PRIVLIB /* Grrr.. Have to let jmake know I need this */ + +MakeDirectories(install,$(PRIVLIB)/lib/C/fake) +InstallMultiple($(FILES),$(PRIVLIB)/lib/C/fake) diff --git a/lib/C/fake/Makefile.SH b/lib/C/fake/Makefile.SH new file mode 100755 index 0000000..6030d62 --- /dev/null +++ b/lib/C/fake/Makefile.SH @@ -0,0 +1,156 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL44] +: $X-Id: Jmake.tmpl,v 3.0.1.1 1993/08/20 07:36:36 ram Exp ram $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=lib/C/fake +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +INSTALLDIR=`echo $installdir | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.1 1994/10/29 15:46:30 ram Exp ram $ + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.1 1994/01/24 13:43:44 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.1 1994/01/24 13:43:44 ram +# patch16: created +# + +FILES = dup2.C getopt.C rename.C scandir.C setsid.C + +INSTALLFLAGS = -m 444 + +all:: + +install:: + @for dir in $(PRIVLIB)/lib/C/fake; do \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $$dir || $(INSTALLDIR) $$dir); \ + done + +install:: $(FILES) + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in $(FILES); do \ + (set -x; $(INSTALL) -c $(INSTALLFLAGS) $$i $(PRIVLIB)/lib/C/fake); \ + done + +deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in $(FILES); do \ + (set -x; $(RM) $(PRIVLIB)/lib/C/fake/$$i); \ + done + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +install:: + @echo "install in $(CURRENT) done." + +deinstall:: + @echo "deinstall in $(CURRENT) done." + +install.man:: + @echo "install.man in $(CURRENT) done." + +deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/lib/C/fake/dup2.C b/lib/C/fake/dup2.C new file mode 100644 index 0000000..97432b9 --- /dev/null +++ b/lib/C/fake/dup2.C @@ -0,0 +1,78 @@ +/* + * dup2.C -- A dup2 emulation. + */ + +/* + * $Id: dup2.C,v 3.0.1.1 1994/01/24 13:58:37 ram Exp ram $ + * + * Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi + * + * You may redistribute only under the terms of the Artistic Licence, + * as specified in the README file that comes with the distribution. + * You may reuse parts of this distribution only within the terms of + * that same Artistic Licence; a copy of which may be found at the root + * of the source tree for dist 4.0. + * + * Original Author: Larry Wall + * + * $Log: dup2.C,v $ + * Revision 3.0.1.1 1994/01/24 13:58:37 ram + * patch16: created + * + */ + +#include "config.h" + +#ifdef I_FCNTL +#include +#endif + +#include "confmagic.h" /* Remove if not metaconfig -M */ + +#ifndef HAS_DUP2 +/* + * dup2 + * + * This routine duplicates file descriptor 'old' into 'new'. After the + * operation, both 'new' and 'old' refer to the same file 'old' was referring + * to in the first place. + * + * Returns 0 if OK, -1 on failure with errno being set to indicate the error. + * + */ +V_FUNC(int dup2, (old, new), + int old /* Opened file descriptor */ NXT_ARG + int new /* File descriptor we'd like to get */) +{ +#ifdef HAS_FCNTL +#ifdef F_DUPFD +#define USE_FNCTL +#endif +#endif + +#ifdef USE_FCNTL + if (old == new) + return 0; + + close(new); + return fcntl(old, F_DUPFD, new); +#else + int fd_used[256]; /* Fixed stack used to record dup'ed files */ + int fd_top = 0; /* Top in the fixed stack */ + int fd; /* Currently dup'ed file descriptor */ + + if (old == new) + return 0; + + close(new); /* Ensure one free slot */ + while ((fd = dup(old)) != new) /* Until dup'ed file matches */ + fd_used[fd_top++] = fd; /* Remember we have to close it later */ + + while (fd_top > 0) /* Close all useless dup'ed slots */ + close(fd_used[--fd_top]); + + return 0; +#endif +} +#endif + diff --git a/lib/C/fake/getopt.C b/lib/C/fake/getopt.C new file mode 100644 index 0000000..41019e1 --- /dev/null +++ b/lib/C/fake/getopt.C @@ -0,0 +1,133 @@ +/* + * getopt.C -- A getopt implementation. + */ + +/* + * $Id: getopt.C,v 3.0.1.1 1994/01/24 13:58:40 ram Exp ram $ + * + * Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi + * + * You may redistribute only under the terms of the Artistic Licence, + * as specified in the README file that comes with the distribution. + * You may reuse parts of this distribution only within the terms of + * that same Artistic Licence; a copy of which may be found at the root + * of the source tree for dist 4.0. + * + * Original Author: unknown, got this off net.sources + * + * $Log: getopt.C,v $ + * Revision 3.0.1.1 1994/01/24 13:58:40 ram + * patch16: created + * + */ + +#include "config.h" +#include + +#ifdef I_STRING +#include +#else +#include +#endif + +#include "confmagic.h" /* Remove if not metaconfig -M */ + +#ifndef HAS_GETOPT + +/* + * Get option letter from argument vector + */ + +int opterr = 1, /* Useless, never set or used */ + optind = 1, /* Index into parent argv vector */ + optopt; /* Character checked for validity */ +char *optarg; /* Argument associated with option */ + +#define BADCH (int) '?' +#define EMSG "" + +#define tell(s) \ +do { \ + fputs(*nargv, stderr); \ + fputs(s, stderr); \ + fputc(optopt, stderr); \ + fputc('\n', stderr); \ + return BADCH; \ +} while (0) + +/* + * getopt + * + * Parses command line flags and arguments. Given the original arguments + * via the (nargc, nargv) tuple, and a list of flags via 'ostr', it returns + * the next flag recognized, and sets the externally visible 'optarg' + * variable to point to the start of the flags's parameter, if any expected. + * + * When facing an invalid flag, getopt() returns '?'. + * + * The 'ostr' string is a list of allowed flag characters, optionally by ':' + * when the flag expects a parameter, which can immediately follow the + * flag or come as the next word. + * + * In any case, the 'optopt' variable is set upon return to the flag being + * looked at, whether it was a valid flag or not. + */ +V_FUNC(int getopt, (nargc, nargv, ostr) + int nargc /* Argument count */ NXT_ARG + char **nargv /* Argument vector */ NXT_ARG + char *ostr /* String specifying options */) +{ + static char *place = EMSG; /* Option letter processing */ + register1 char *oli; /* Option letter list index */ + + /* + * Update scanning pointer. + */ + + if (!*place) { + if( + optind >= nargc || + *(place = nargv[optind]) != '-' || + !*++place + ) + return EOF; + if (*place == '-') { /* Found "--", end option processing */ + ++optind; + return EOF; + } + } + + /* + * Is option letter OK? + */ + + if ( + (optopt = (int)*place++) == (int)':' || + !(oli = index(ostr,optopt)) + ) { + if (!*place) ++optind; + tell(": illegal option -- "); + } + + /* + * Found a valid option, process it. + */ + + if (*++oli != ':') { /* Don't need argument */ + optarg = NULL; + if (!*place) ++optind; + } else { /* Need an argument */ + if (*place) optarg = place; /* No white space */ + else if (nargc <= ++optind) { /* No argument */ + place = EMSG; + tell(": option requires an argument -- "); + } else + optarg = nargv[optind]; /* White space */ + place = EMSG; + ++optind; + } + + return optopt; /* Dump back option letter */ +} +#endif + diff --git a/lib/C/fake/rename.C b/lib/C/fake/rename.C new file mode 100644 index 0000000..f50ea83 --- /dev/null +++ b/lib/C/fake/rename.C @@ -0,0 +1,45 @@ +/* + * rename.C -- A rename emulation, for renaming files only. + */ + +/* + * $Id: rename.C,v 3.0.1.1 1994/01/24 13:58:42 ram Exp ram $ + * + * Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi + * + * You may redistribute only under the terms of the Artistic Licence, + * as specified in the README file that comes with the distribution. + * You may reuse parts of this distribution only within the terms of + * that same Artistic Licence; a copy of which may be found at the root + * of the source tree for dist 4.0. + * + * $Log: rename.C,v $ + * Revision 3.0.1.1 1994/01/24 13:58:42 ram + * patch16: created + * + */ + +#include "config.h" +#include "confmagic.h" /* Remove if not metaconfig -M */ + +#ifndef HAS_RENAME +/* + * rename + * + * Renames a file within a file system. This cannot be used to rename + * directories, unfortunately. + */ +V_FUNC(int rename, (from, to), + char *from /* Original name */ NXT_ARG + char *to /* Target name */) +{ + (void) unlink(to); + if (-1 == link(from, to)) + return -1; + if (-1 == unlink(from)) + return -1; + + return 0; +} +#endif + diff --git a/lib/C/fake/scandir.C b/lib/C/fake/scandir.C new file mode 100644 index 0000000..9d1cdd8 --- /dev/null +++ b/lib/C/fake/scandir.C @@ -0,0 +1,131 @@ +/* + * scandir.C -- A scandir implementation. + */ + +/* + * $Id: scandir.C,v 3.0.1.1 1994/01/24 13:58:45 ram Exp ram $ + * + * Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi + * + * You may redistribute only under the terms of the Artistic Licence, + * as specified in the README file that comes with the distribution. + * You may reuse parts of this distribution only within the terms of + * that same Artistic Licence; a copy of which may be found at the root + * of the source tree for dist 4.0. + * + * $Log: scandir.C,v $ + * Revision 3.0.1.1 1994/01/24 13:58:45 ram + * patch16: created + * + */ + +#include "config.h" + +#ifdef I_STRING +#include +#else +#include +#endif + +#ifdef I_DIRENT +#include +#else +#ifdef I_SYS_NDIR +#include +#else +#ifdef I_SYS_DIR +#include +#endif +#endif +#endif + +#include "confmagic.h" /* Remove if not metaconfig -M */ + +#ifndef HAS_SCANDIR + +extern Malloc_t malloc(); +extern Malloc_t realloc(); + +extern DIR *opendir(); +extern Direntry_t *readdir(); + +#define DIR_NULL ((DIR *) 0) +#define ENTRY_NULL ((Direntry_t *) 0) + +static int alphasort _((Direntry_t **, Direntry_t **)); + +/* + * scandir + * + * This routine reads the directory `dirnam' and builds an array of + * pointers to directory entries using malloc(). The second parameter + * is the address of a pointer to an array of structure pointers. The + * third parameter is a pointer to a routine which is called with a + * pointer to a directory entry and should return a non zero value + * if the directory entry should be included in the arrary. If this + * pointer is NULL, then all the directory entries will be included. + * The last argument is a pointer to a routine which is passed to + * qsort() to sort the completed array. If this pointer is NULL, the + * array is not sorted. + * scandir() returns the number of entries in the array and a pointer + * to the array through the parameter namlist. + * alphasort() is a routine which sorts the array alphabetically. + */ +V_FUNC(int scandir, (dirnam, namelist, sel, comp), + char *dirnam /* Direcotry name */ NXT_ARG + Direntry_t ***namelist /* Pointer to an array of struct ptrs */ NXT_ARG + int (*sel)() /* Routine to select entries */ NXT_ARG + int (*comp)() /* Routine passed to qsort */) +{ + DIR *dirp; /* Returned by opendir() */ + Direntry_t *dp; /* Read entry */ + Direntry_t *dp_save; /* Place where entry is stored */ + Direntry_t **tmplist; /* Where the array list is stored */ + int nent = 0; /* Number of entries */ + + dirp = opendir(dirnam); + if (dirp == DIR_NULL) + return -1; /* Directory cannot be opened for reading */ + + for (dp = readdir(dirp); dp != ENTRY_NULL; dp = readdir(dirp)) { + if (sel == ((int (*)()) 0) || (*sel)(dp)) { + /* If entry has to be included */ + nent++; /* One more entry */ + + if (nent == 1) { /* Create array for first entry */ + tmplist = (Direntry_t **) + malloc(sizeof(Direntry_t *)); + if (tmplist == (Direntry_t **) 0) + return -1; /* Cannot create array */ + } else { /* Reallocate for a new entry */ + tmplist = (Direntry_t **) + realloc(tmplist, nent*sizeof(Direntry_t *)); + if (tmplist == (Direntry_t **) 0) + return -1; /* Cannot reallocate array */ + } + + dp_save = (Direntry_t *) malloc(sizeof(Direntry_t)); + if (dp_save == ENTRY_NULL) + return -1; /* No space to save entry */ + bcopy((char *) dp, (char *) dp_save, sizeof(Direntry_t)); + *(tmplist+(nent-1)) = dp_save; + } + } + + if (comp != ((int (*)()) 0) && nent) /* Need sorting ? */ + qsort(tmplist, nent, sizeof(Direntry_t *), comp); + + *namelist = tmplist; /* Passes the address of the arrray */ + closedir(dirp); /* Close directory */ + + return nent; /* Number of items */ +} + +P_FUNC(int alphasort, (d1, d2), + Direntry_t **d1 NXT_ARG Direntry_t **d2) +{ + return strcmp((*d1)->d_name, (*d2)->d_name); +} + +#endif + diff --git a/lib/C/fake/setsid.C b/lib/C/fake/setsid.C new file mode 100644 index 0000000..6811dec --- /dev/null +++ b/lib/C/fake/setsid.C @@ -0,0 +1,64 @@ +/* + * setsid.C -- A setsid replacement. + */ + +/* + * $Id: setsid.C,v 3.0.1.1 1994/01/24 13:58:47 ram Exp ram $ + * + * Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi + * + * You may redistribute only under the terms of the Artistic Licence, + * as specified in the README file that comes with the distribution. + * You may reuse parts of this distribution only within the terms of + * that same Artistic Licence; a copy of which may be found at the root + * of the source tree for dist 4.0. + * + * $Log: setsid.C,v $ + * Revision 3.0.1.1 1994/01/24 13:58:47 ram + * patch16: created + * + */ + +#include "config.h" +#include "confmagic.h" /* Remove if not metaconfig -M */ + +#ifndef HAS_SETSID +/* + * setsid + * + * Set the process group ID and create a new session for the process. + * + * This is a pale imitation of the setsid() system call, since a session + * and a process group are two distinct things for the kernel. However, + * when setsid() is not available, the effects should be comparable. + */ +V_FUNC_VOID(int setsid) +{ + int error = 0; + +#ifdef HAS_SETPGID + /* + * setpgid() supersedes setpgrp() in OSF/1. + */ + error = setpgid(0 ,getpid()); +#else +#ifdef HAS_SETPGRP + /* + * Good old way to get a process group leader. + */ +#ifdef USE_BSDPGRP + error = setpgrp(0 ,getpid()); /* bsd way */ +#else + error = setpgrp(); /* usg way */ +#endif +#endif +#endif + + /* + * When none of the above is defined, do nothing. + */ + + return error; +} +#endif + diff --git a/lib/Jmakefile b/lib/Jmakefile new file mode 100644 index 0000000..a44f86a --- /dev/null +++ b/lib/Jmakefile @@ -0,0 +1,57 @@ +/* + * Jmakefile for lib subdirectory. + */ + +;# $Id: Jmakefile,v 3.0.1.1 1994/01/24 13:43:31 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.1 1994/01/24 13:43:31 ram +;# patch16: added new directory for C code sources +;# +;# Revision 3.0 1993/08/18 12:04:34 ram +;# Baseline for dist 3.0 netwide release. +;# + +FILES = errnolist.a errnolist.mk +FILES_SH = errnolist makedepend makedir + +INSTALLFLAGS = -m 444 + +all:: /* So that default make does not default to install */ + +>PRIVLIB /* Grrr.. Have to let jmake know I need this */ + +MakeDirectories(install,$(PRIVLIB)/lib) +InstallMultiple($(FILES),$(PRIVLIB)/lib) + +/* + * InstallSingleExt: + * This rule installs a single file whose basename is 'file' and + * extension is 'old' into 'file^^new'. This allows changing the + * dot extension of a file, for instance file.sh can be installed as + * file.SH. + */ +#define InstallSingleExt(step,file,dest,flags,old,new) @!\ +>INSTALL @!\ +>RM @!\ +step:: file^^old @@\ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + (set -x; $(INSTALL) -c flags file^^old dest/file^^new) @@\ + @!\ +de^^step:: @@\ + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ @@\ + (set -x; $(RM) dest/file^^new) + +#define install_rule \ + InstallSingleExt(install,!f,$(PRIVLIB)/lib,-m 444,.sh,.SH) + +Expand(install_rule,f!$(FILES_SH)!) +SetSubdirs(C) diff --git a/lib/Makefile.SH b/lib/Makefile.SH new file mode 100755 index 0000000..02e4528 --- /dev/null +++ b/lib/Makefile.SH @@ -0,0 +1,246 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL44] +: $X-Id: Jmake.tmpl,v 3.0.1.1 1993/08/20 07:36:36 ram Exp ram $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=lib +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +INSTALLDIR=`echo $installdir | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.1 1994/10/29 15:46:30 ram Exp ram $ + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.1 1994/01/24 13:43:31 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.1 1994/01/24 13:43:31 ram +# patch16: added new directory for C code sources +# +# Revision 3.0 1993/08/18 12:04:34 ram +# Baseline for dist 3.0 netwide release. +# + +FILES = errnolist.a errnolist.mk +FILES_SH = errnolist makedepend makedir + +INSTALLFLAGS = -m 444 + +all:: + +install:: + @for dir in $(PRIVLIB)/lib; do \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $$dir || $(INSTALLDIR) $$dir); \ + done + +install:: $(FILES) + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in $(FILES); do \ + (set -x; $(INSTALL) -c $(INSTALLFLAGS) $$i $(PRIVLIB)/lib); \ + done + +deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in $(FILES); do \ + (set -x; $(RM) $(PRIVLIB)/lib/$$i); \ + done + + +install:: errnolist.sh + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(INSTALL) -c -m 444 errnolist.sh $(PRIVLIB)/lib/errnolist.SH) + +deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(RM) $(PRIVLIB)/lib/errnolist.SH) + +install:: makedepend.sh + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(INSTALL) -c -m 444 makedepend.sh $(PRIVLIB)/lib/makedepend.SH) + +deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(RM) $(PRIVLIB)/lib/makedepend.SH) + +install:: makedir.sh + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(INSTALL) -c -m 444 makedir.sh $(PRIVLIB)/lib/makedir.SH) + +deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; $(RM) $(PRIVLIB)/lib/makedir.SH) + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: sub_clean local_clean +realclean: sub_realclean local_realclean +clobber: sub_clobber local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Rules for building in sub-directories -- do not edit + +subdirs: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)); \ + done + +install:: + @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= + +deinstall:: + @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= + +install.man:: + @$(MAKE) subdirs TARGET=install.man VERB="Installing man pages" FLAGS= + +deinstall.man:: + @$(MAKE) subdirs TARGET=deinstall.man VERB="Deinstalling man pages" FLAGS= + +sub_clean:: + @$(MAKE) subdirs TARGET=clean VERB="Cleaning" FLAGS= + @echo "Back to $(CURRENT) for "clean... + +sub_realclean:: + @$(MAKE) subdirs TARGET=realclean VERB="Real cleaning" FLAGS= + @echo "Back to $(CURRENT) for "realclean... + +sub_clobber:: + @$(MAKE) subdirs TARGET=clobber VERB="Clobbering" FLAGS= + @echo "Back to $(CURRENT) for "clobber... + +tag:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo "Tagging" "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) tag); \ + done + +Makefiles:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + echo "Making "Makefiles" in $(DIR)$$i..."; \ + (cd $$i || exit 1; \ + if test ! -f Makefile; then /bin/sh Makefile.SH; fi; \ + $(MAKE) $(MFLAGS) Makefiles) \ + done + +Makefiles.SH:: Makefile.SH + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + case "$(DIR)$$i/" in \ + */*/*/*/) newtop=../../../..;; \ + */*/*/) newtop=../../..;; \ + */*/) newtop=../..;; \ + */) newtop=..;; \ + esac; \ + case "$(TOP)" in \ + /*) newtop="$(TOP)" ;; \ + esac; \ + echo "Making Makefiles.SH in $(DIR)$$i..."; \ + (cd $$i || exit 1; $(MAKE) $(MFLAGS) -f ../Makefile \ + Makefile TOP=$$newtop CURRENT=$(DIR)$$i;\ + $(MAKE) $(MFLAGS) Makefiles.SH) \ + done + +all:: + @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= + +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/lib/errnolist.a b/lib/errnolist.a new file mode 100644 index 0000000..7844b97 --- /dev/null +++ b/lib/errnolist.a @@ -0,0 +1,52 @@ +# $Id: errnolist.a,v 3.0 1993/08/18 12:04:35 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# Original Author: Harlan Stenn +# +# $Log: errnolist.a,v $ +# Revision 3.0 1993/08/18 12:04:35 ram +# Baseline for dist 3.0 netwide release. +# +# +# This is a simple-minded awk script to generate an initialization for +# sys_errnolist on systems that don't have it. +# This file now depends only on sys/errno.h error numbers under maxerr being +# in order. It will complain and die if not. NOTE: It will still produce +# a compilable output file, even with errors, so you must check the output. + + +BEGIN { + format = "\t\"%s\",\n" + printf("/*\n** This is a generated file. Do NOT edit it unless you really have to...\n*/\n\n") + printf("char *sys_errnolist[] = {\n") + maxerr = 89 + } + +$1=="#define" { + if(count > maxerr || substr($2,1,1) != "E") + next # we're not interested + if($3 < count) { # this is bad + printf("Fatal error: %s out of order at %s\n",\ + FILENAME, $2)>"/dev/tty" + exit 1 + } + # fill in the blanks + while($3 > count) { + dummy=sprintf("EDUMMY%d",count) + printf(format,dummy) + count++ + } + printf(format,$2) + count++ + } + +END { + printf("\t0\n};\n") + } diff --git a/lib/errnolist.mk b/lib/errnolist.mk new file mode 100644 index 0000000..e79a21b --- /dev/null +++ b/lib/errnolist.mk @@ -0,0 +1,42 @@ +# $Id: errnolist.mk,v 3.0.1.1 1994/01/24 13:59:32 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# Original Author: Harlan Stenn +# +# $Log: errnolist.mk,v $ +# Revision 3.0.1.1 1994/01/24 13:59:32 ram +# patch16: now uses modern shell metaconfig symbols +# +# Revision 3.0 1993/08/18 12:04:36 ram +# Baseline for dist 3.0 netwide release. +# +# +# Make rules for the errnolist stuff + +case "$errnolist" in +'') ;; +*) + $spitshell >>Makefile <>Makefile <>Makefile <<'!NO!SUBS!' + +foo: foo.o $(ERRNOLIST_OBJ) + $(CC) -o $@ foo.o $(ERRNOLIST_OBJ) +!NO!SUBS! diff --git a/lib/errnolist.sh b/lib/errnolist.sh new file mode 100644 index 0000000..6101db7 --- /dev/null +++ b/lib/errnolist.sh @@ -0,0 +1,44 @@ +# $Id: errnolist.sh,v 3.0.1.1 1994/01/24 14:00:00 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# Original Author: Harlan Stenn +# +# $Log: errnolist.sh,v $ +# Revision 3.0.1.1 1994/01/24 14:00:00 ram +# patch16: changed top ln-style config.sh lookup into test-style one +# +# Revision 3.0 1993/08/18 12:04:36 ram +# Baseline for dist 3.0 netwide release. +# + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +case "$errnolistc" in +'') ;; +*) + echo "Making $errnolistc ..." + awk -f errnolist.a < /usr/include/sys/errno.h > $errnolistc + echo "It would be a good idea to make sure that $errnolistc is correct." +esac + diff --git a/lib/makedepend.sh b/lib/makedepend.sh new file mode 100644 index 0000000..6ee561e --- /dev/null +++ b/lib/makedepend.sh @@ -0,0 +1,169 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting makedepend (with variable substitutions)" +$spitshell >makedepend < +# +# $Log: makedepend.sh,v $ +# Revision 3.0.1.1 1994/01/24 14:00:05 ram +# patch16: changed top ln-style config.sh lookup into test-style one +# +# Revision 3.0 1993/08/18 12:04:37 ram +# Baseline for dist 3.0 netwide release. +# + +export PATH || (echo "OOPS, this isn't sh. Desperation time. I will feed myself to sh."; sh \$0; kill \$\$) + +cat='$cat' +cppflags='$cppflags' +cp='$cp' +cpp='$cppstdin' +echo='$echo' +egrep='$egrep' +expr='$expr' +mv='$mv' +rm='$rm' +sed='$sed' +sort='$sort' +test='$test' +tr='$tr' +uniq='$uniq' +!GROK!THIS! + +$spitshell >>makedepend <<'!NO!SUBS!' + +$cat /dev/null >.deptmp +$rm -f *.c.c c/*.c.c +if test -f Makefile; then + mf=Makefile +else + mf=makefile +fi +if test -f $mf; then + defrule=`<$mf sed -n \ + -e '/^\.c\.o:.*;/{' \ + -e 's/\$\*\.c//' \ + -e 's/^[^;]*;[ ]*//p' \ + -e q \ + -e '}' \ + -e '/^\.c\.o: *$/{' \ + -e N \ + -e 's/\$\*\.c//' \ + -e 's/^.*\n[ ]*//p' \ + -e q \ + -e '}'` +fi +case "$defrule" in +'') defrule='$(CC) -c $(CFLAGS)' ;; +esac + +make clist || ($echo "Searching for .c files..."; \ + $echo *.c | $tr ' ' '\012' | $egrep -v '\*' >.clist) +gotnone=true +for file in `$cat .clist`; do +# for file in `cat /dev/null`; do + case "$file" in + *.c) filebase=`basename $file .c` ;; + *.y) filebase=`basename $file .c` ;; + '') continue ;; + esac + gotnone=false + $echo "Finding dependencies for $filebase.o." + $sed -n <$file >$file.c \ + -e "/^${filebase}_init(/q" \ + -e '/^#/{' \ + -e 's|/\*.*$||' \ + -e 's|\\$||' \ + -e p \ + -e '}' + $cpp -I/usr/local/include -I. $cppflags $file.c | \ + $sed \ + -e '/^# *[0-9]/!d' \ + -e 's/^.*"\(.*\)".*$/'$filebase'.o: \1/' \ + -e 's|: \./|: |' \ + -e 's|\.c\.c|.c|' | \ + $uniq | $sort | $uniq >> .deptmp +done + +$sed Makefile.new -e '1,/^# AUTOMATICALLY/!d' + +make shlist || ($echo "Searching for .SH files..."; \ + $echo *.SH | $tr ' ' '\012' | $egrep -v '\*' >.shlist) +if $gotnone || $test -s .deptmp; then + for file in `cat .shlist`; do + $echo `$expr X$file : 'X\(.*\).SH`: $file config.sh \; \ + /bin/sh $file >> .deptmp + done + $echo "Updating Makefile..." + $echo "# If this runs make out of memory, delete /usr/include lines." \ + >> Makefile.new + $sed 's|^\(.*\.o:\) *\(.*/.*\.c\) *$|\1 \2; '"$defrule \2|" .deptmp \ + >>Makefile.new +else + make hlist || ($echo "Searching for .h files..."; \ + $echo *.h | $tr ' ' '\012' | $egrep -v '\*' >.hlist) + $echo "You don't seem to have a proper C preprocessor. Using grep instead." + $egrep '^#include ' `cat .clist` `cat .hlist` >.deptmp + $echo "Updating Makefile..." + <.clist $sed -n \ + -e '/\//{' \ + -e 's|^\(.*\)/\(.*\)\.c|\2.o: \1/\2.c; '"$defrule \1/\2.c|p" \ + -e d \ + -e '}' \ + -e 's|^\(.*\)\.c|\1.o: \1.c|p' >> Makefile.new + <.hlist $sed -n 's|\(.*/\)\(.*\)|s= \2= \1\2=|p' >.hsed + <.deptmp $sed -n 's|c:#include "\(.*\)".*$|o: \1|p' | \ + $sed 's|^[^;]*/||' | \ + $sed -f .hsed >> Makefile.new + <.deptmp $sed -n 's|c:#include <\(.*\)>.*$|o: /usr/include/\1|p' \ + >> Makefile.new + <.deptmp $sed -n 's|h:#include "\(.*\)".*$|h: \1|p' | \ + $sed -f .hsed >> Makefile.new + <.deptmp $sed -n 's|h:#include <\(.*\)>.*$|h: /usr/include/\1|p' \ + >> Makefile.new + for file in `$cat .shlist`; do + $echo `$expr X$file : 'X\(.*\).SH`: $file config.sh \; \ + /bin/sh $file >> Makefile.new + done +fi +$rm -f Makefile.old +$cp Makefile Makefile.old +$cp Makefile.new Makefile +$rm Makefile.new +$echo "# WARNING: Put nothing here or make depend will gobble it up!" >> Makefile +$rm -f .deptmp `sed 's/\.c/.c.c/' .clist` .shlist .clist .hlist .hsed + +!NO!SUBS! +$eunicefix makedepend +chmod +x makedepend +case `pwd` in +*SH) + $rm -f ../makedepend + ln makedepend ../makedepend + ;; +esac diff --git a/lib/makedir.sh b/lib/makedir.sh new file mode 100644 index 0000000..2805714 --- /dev/null +++ b/lib/makedir.sh @@ -0,0 +1,86 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting makedir (with variable substitutions)" +$spitshell >makedir < +# +# $Log: makedir.sh,v $ +# Revision 3.0.1.1 1994/01/24 14:00:08 ram +# patch16: changed top ln-style config.sh lookup into test-style one +# +# Revision 3.0 1993/08/18 12:04:38 ram +# Baseline for dist 3.0 netwide release. +# + +export PATH || (echo "OOPS, this isn't sh. Desperation time. I will feed myself to sh."; sh \$0; kill \$\$) + +case \$# in + 0) + $echo "makedir pathname filenameflag" + exit 1 + ;; +esac + +: guarantee one slash before 1st component +case \$1 in + /*) ;; + *) set ./\$1 \$2 ;; +esac + +: strip last component if it is to be a filename +case X\$2 in + X1) set \`$echo \$1 | $sed 's:\(.*\)/[^/]*\$:\1:'\` ;; + *) set \$1 ;; +esac + +: return reasonable status if nothing to be created +if $test -d "\$1" ; then + exit 0 +fi + +list='' +while true ; do + case \$1 in + */*) + list="\$1 \$list" + set \`echo \$1 | $sed 's:\(.*\)/:\1 :'\` + ;; + *) + break + ;; + esac +done + +set \$list + +for dir do + $mkdir \$dir >/dev/null 2>&1 +done +!GROK!THIS! +$eunicefix makedir +chmod +x makedir diff --git a/mcon/INTRO b/mcon/INTRO new file mode 100644 index 0000000..51f4417 --- /dev/null +++ b/mcon/INTRO @@ -0,0 +1,109 @@ +This is a quick introduction to metaconfig. + +Metaconfig is a combination of a methodology and a program that will +help you write portable programs. It is well known that all UN*X +systems are not the same. Instead of writing lots of #ifdef/#endif for +each machine the program is ported on, it seems better to directly rely +on the actual possibilities of the system, without having to consider +whether it comes from HP or SUN. The idea is to write the program using +some symbols, known by a "unit", for all the hardware- or kernel- +specific parts of code. A metaconfig unit will automatically define the +symbol or not, depending on the system. Source files are scanned by +metaconfig and the necessary units are loaded and put into a shell +script called Configure. Running the Configure script will +automatically determine a suitable value for each symbol. + +How does a Configure script work ? It studies the environment it runs on +by extracting names in the C library, by compiling some small sample C +programs, and by asking questions when in doubt, always providing a +computed default answer. + +Here is a small example. + +It is said in the glossary of the symbols that RENAME is defined if the +rename routine is available to rename files. Without metaconfig, we +could write (for each occurrence of a "rename" in the code): + +#if defined(HP-UX-7.0) || defined(SUN) || defined(BSD) + rename(old, new); +#else + unlink(new); + link(old, new); + unlink(old); +#endif + +With the help of metaconfig, we shall write (once !): + +#ifndef HAS_RENAME +int rename(old, new) +char *old, *new; +{ + (void) unlink(new); + if (-1 != link(old, new)) + return unlink(old); + else + return -1; +} +#endif + + .... + + rename(old, new); + + +And that's all. The Configure script will check whether `rename' is +available on the target machine and accordingly define the RENAME +symbol. It is even more powerful that it may appear on a first glance, +because "rename" was not there on old SUNOS3 systems or HP-UX older than +6.5 (for series 800) and 7.0 (for series 300). You cannot rely on the +fact that the target machine has the latest OS release ! + +Another problem is to determine whether a C program should include +, or with KERNEL defined. With +metaconfig, you simply write: + +#ifdef I_TIME +# include +#endif +#ifdef I_SYS_TIME +# include +#endif +#ifdef I_SYS_TIME_KERNEL +# define KERNEL +# include +# undef KERNEL +#endif + +and the Configure script will generate a small C program, compile it, +and correctly define one of the three symbols I_TIME, I_SYS_TIME and +I_SYS_TIME_KERNEL. + +Another kind of precious information can be collected by a Configure +script. For instance, the symbol USE_STRUCT_COPY will be defined if the +C compiler can copy structures. It is up to the programmer to use this +information, of course. The symbol VOIDSIG will be defined if the +system declares "void (*signal())()" instead of "int (*signal())()". +Thus you can say: + +#ifdef VOIDSIG +extern void (*signal())(); +#else +extern int (*signal())(); +#endif + +and no suspicious warning will be emitted by the C compiler. + +Finally, Configure can help you in shell scripts or in makefile. By +using a file called Makefile.SH, which will be run through a shell to +produce a Makefile, you can use the variable substitution feature. The +variable $ranlib will be set to 'ranlib' or to ': ' (null statement) in +a makefile, which is useful for random libraries generation. Likewise, +the variable $bin will hold the full path for installing binaries (a +question will be issued by Configure). + +Needless to say, an initial amount of time must be spent before being +able to use metaconfig. The proper symbols must be known, and the +program must be prepared to deal with all the possible configurations. +But likewise, it will adapt itself to a greater number of systems +without any further source code modification. + diff --git a/mcon/Jmakefile b/mcon/Jmakefile new file mode 100644 index 0000000..559ba87 --- /dev/null +++ b/mcon/Jmakefile @@ -0,0 +1,93 @@ +/* + * Jmakefile for metaconfig + */ + +;# $Id: Jmakefile,v 3.0.1.4 1995/07/25 13:23:09 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.4 1995/07/25 13:23:09 ram +;# patch56: installs the GNU configure-like front-end to Configure +;# +;# Revision 3.0.1.3 1994/01/24 13:42:29 ram +;# patch16: added dependency generation stage +;# +;# Revision 3.0.1.2 1993/11/02 10:40:01 ram +;# patch14: now invokes perload explicitely via perl executable +;# +;# Revision 3.0.1.1 1993/08/25 08:46:44 ram +;# patch6: split unit installation to avoid shell command line overflow +;# +;# Revision 3.0 1993/08/18 12:04:40 ram +;# Baseline for dist 3.0 netwide release. +;# + +SetSubdirs(man) +AllTarget(Glossary) + +Glossary: makegloss + chmod +x makegloss + ./makegloss + +SimpleShellScriptTarget(makegloss) + +>PRIVLIB /* We need the privlib definition */ +>SCRIPTDIR /* As well as the script directory */ + +MakeInstallDirectories($(PRIVLIB) $(PRIVLIB)/U) +InstallNonExec(Glossary,$(PRIVLIB)) +InstallScript(makegloss,$(PRIVLIB)) +InstallScript(configure,$(PRIVLIB)) + +/* Split install list to avoid make overflow */ +InstallMultipleFlags(U/[a-d]*.U,$(PRIVLIB)/U,-m 444) +InstallMultipleFlags(U/[A-Ze-z]*.U,$(PRIVLIB)/U,-m 444) + +/* + * Build up dataloading versions of metalint, metaconfig and metaxref. + */ + +#define SimpleDataloadTarget(file,datafile) @!\ +++BIN datafile @!\ +AllTarget(datafile file) @!\ +SimpleShellScriptTarget(file) @!\ +datafile: file @@\ + perl $(TOP)/bin/perload -o file > $@ @@\ + chmod +rx $@ @!\ + @!\ +InstallScript(datafile,$(SCRIPTDIR)) + +SimpleDataloadTarget(mconfig,metaconfig) +SimpleDataloadTarget(mlint,metalint) +SimpleDataloadTarget(mxref,metaxref) + +BINFILES = \ +|expand f!$(BIN)! + !f:^meta=m \ +-expand \\ + +BINSH = \ +|expand f!$(BINFILES)! + !f.SH \ +-expand \\ + +>SED +>RM +>MKDEP + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(BINSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + diff --git a/mcon/Makefile.SH b/mcon/Makefile.SH new file mode 100755 index 0000000..cf4798e --- /dev/null +++ b/mcon/Makefile.SH @@ -0,0 +1,378 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL55] +: $X-Id: Jmake.tmpl,v 3.0.1.2 1995/01/11 14:50:21 ram Exp ram $ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=mcon +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +INSTALLDIR=`echo $installdir | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.3 1995/03/21 08:35:28 ram Exp ram $ +######################################################################## +# Force 'make depend' to be performed first -- do not edit + +.FORCE_DEPEND:: + +all:: .FORCE_DEPEND + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.4 1995/07/25 13:23:09 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.4 1995/07/25 13:23:09 ram +# patch56: installs the GNU configure-like front-end to Configure +# +# Revision 3.0.1.3 1994/01/24 13:42:29 ram +# patch16: added dependency generation stage +# +# Revision 3.0.1.2 1993/11/02 10:40:01 ram +# patch14: now invokes perload explicitely via perl executable +# +# Revision 3.0.1.1 1993/08/25 08:46:44 ram +# patch6: split unit installation to avoid shell command line overflow +# +# Revision 3.0 1993/08/18 12:04:40 ram +# Baseline for dist 3.0 netwide release. +# + +all:: Glossary + +local_realclean:: + $(RM) Glossary + +Glossary: makegloss + chmod +x makegloss + ./makegloss + +all:: makegloss + +local_realclean:: + $(RM) makegloss + +makegloss: makegloss.SH + /bin/sh makegloss.SH + + +install:: + @for dir in $(PRIVLIB) $(PRIVLIB)/U; do \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + (set -x; test -d $$dir || $(INSTALLDIR) $$dir); \ + done + +deinstall:: + $(RM) -r $(PRIVLIB) $(PRIVLIB)/U + +install:: Glossary + $(INSTALL) -c -m 444 Glossary $(PRIVLIB) + +deinstall:: + $(RM) $(PRIVLIB)/Glossary + +install:: makegloss + $(INSTALL) -c -m 555 makegloss $(PRIVLIB) + +deinstall:: + $(RM) $(PRIVLIB)/makegloss + +install:: configure + $(INSTALL) -c -m 555 configure $(PRIVLIB) + +deinstall:: + $(RM) $(PRIVLIB)/configure + +install:: U/[a-d]*.U + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in U/[a-d]*.U; do \ + (set -x; $(INSTALL) -c -m 444 $$i $(PRIVLIB)/U); \ + done + +deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in U/[a-d]*.U; do \ + (set -x; $(RM) $(PRIVLIB)/U/$$i); \ + done + +install:: U/[A-Ze-z]*.U + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in U/[A-Ze-z]*.U; do \ + (set -x; $(INSTALL) -c -m 444 $$i $(PRIVLIB)/U); \ + done + +deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in U/[A-Ze-z]*.U; do \ + (set -x; $(RM) $(PRIVLIB)/U/$$i); \ + done + +all:: metaconfig mconfig + +local_realclean:: + $(RM) metaconfig mconfig + +all:: mconfig + +local_realclean:: + $(RM) mconfig + +mconfig: mconfig.SH + /bin/sh mconfig.SH + +metaconfig: mconfig + perl $(TOP)/bin/perload -o mconfig > $@ + chmod +rx $@ + +install:: metaconfig + $(INSTALL) -c -m 555 metaconfig $(SCRIPTDIR) + +deinstall:: + $(RM) $(SCRIPTDIR)/metaconfig + +all:: metalint mlint + +local_realclean:: + $(RM) metalint mlint + +all:: mlint + +local_realclean:: + $(RM) mlint + +mlint: mlint.SH + /bin/sh mlint.SH + +metalint: mlint + perl $(TOP)/bin/perload -o mlint > $@ + chmod +rx $@ + +install:: metalint + $(INSTALL) -c -m 555 metalint $(SCRIPTDIR) + +deinstall:: + $(RM) $(SCRIPTDIR)/metalint + +all:: metaxref mxref + +local_realclean:: + $(RM) metaxref mxref + +all:: mxref + +local_realclean:: + $(RM) mxref + +mxref: mxref.SH + /bin/sh mxref.SH + +metaxref: mxref + perl $(TOP)/bin/perload -o mxref > $@ + chmod +rx $@ + +install:: metaxref + $(INSTALL) -c -m 555 metaxref $(SCRIPTDIR) + +deinstall:: + $(RM) $(SCRIPTDIR)/metaxref + +BINFILES = \ + mconfig \ + mlint \ + mxref + +BINSH = \ + mconfig.SH \ + mlint.SH \ + mxref.SH + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(BINSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: sub_clean local_clean +realclean: sub_realclean local_realclean +clobber: sub_clobber local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Rules for building in sub-directories -- do not edit + +subdirs: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)); \ + done + +install:: + @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= + +deinstall:: + @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= + +install.man:: + @$(MAKE) subdirs TARGET=install.man VERB="Installing man pages" FLAGS= + +deinstall.man:: + @$(MAKE) subdirs TARGET=deinstall.man VERB="Deinstalling man pages" FLAGS= + +sub_clean:: + @$(MAKE) subdirs TARGET=clean VERB="Cleaning" FLAGS= + @echo "Back to $(CURRENT) for "clean... + +sub_realclean:: + @$(MAKE) subdirs TARGET=realclean VERB="Real cleaning" FLAGS= + @echo "Back to $(CURRENT) for "realclean... + +sub_clobber:: + @$(MAKE) subdirs TARGET=clobber VERB="Clobbering" FLAGS= + @echo "Back to $(CURRENT) for "clobber... + +tag:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo "Tagging" "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) tag); \ + done + +Makefiles:: + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + echo "Making "Makefiles" in $(DIR)$$i..."; \ + (cd $$i || exit 1; \ + if test ! -f Makefile; then /bin/sh Makefile.SH; fi; \ + $(MAKE) $(MFLAGS) Makefiles) \ + done + +Makefiles.SH:: Makefile.SH + @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + case "$(DIR)$$i/" in \ + */*/*/*/) newtop=../../../..;; \ + */*/*/) newtop=../../..;; \ + */*/) newtop=../..;; \ + */) newtop=..;; \ + esac; \ + case "$(TOP)" in \ + /*) newtop="$(TOP)" ;; \ + esac; \ + echo "Making Makefiles.SH in $(DIR)$$i..."; \ + (cd $$i || exit 1; $(MAKE) $(MFLAGS) -f ../Makefile \ + Makefile TOP=$$newtop CURRENT=$(DIR)$$i;\ + $(MAKE) $(MFLAGS) Makefiles.SH) \ + done + +all:: + @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= + +######################################################################## +# Dependencies generated by make depend +# DO NOT DELETE THIS LINE -- make depend relies on it + +# Put nothing here or make depend will gobble it up +.FORCE_DEPEND:: + @echo "You must run 'make depend' in $(TOP) first."; exit 1 +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/mcon/NOTES b/mcon/NOTES new file mode 100644 index 0000000..b6762e0 --- /dev/null +++ b/mcon/NOTES @@ -0,0 +1,174 @@ +This file shortly documents the built-in interpreter and other new +features from metaconfig. + +The notion of "conditional unit" has been added. In the ?MAKE: line, +each unit whose name begins with a "+" will not be loaded in the +Configure script unless its exact value is a mandatory. The default +value specified in ?DEF: will be used instead. If no ?DEF: line is +found, then the symbol is initialized with a null default value. + +In the config.h.SH file, only the necessary symbols are loaded. Note +that the format in ?H: line has changed. It is no longer necessary to +write ?H:?%1: to get a line included in config.h. First of all, the %1 +symbol is not defined any more. Secondly, the unit's name is now %< and +it does not matter whether the name appears first in the ?MAKE: line or +not. Lastly, metaconfig can guess for itself whether to include a +symbol or not. + +Sometimes, it is necessary to force a given value, because metaconfig is +not smart enough to guess 100% of the time. See voidflags.U for an +example (look at the ?C: and ?H: lines and read the comments). + +The Myread.U unit changed. It is now able to do variable substitutions, +and it sets the prompt correctly if there is no supplied default. Thus, +instead of the old: + + dflt=y + rp="Question? [$dflt]" + $echo $n "$rp $c" + . myread + +you must now write: + + dflt=y + rp='Question?' + . myread + +and 'myread' will take care of echoing the question with the default +put in square brakets. + +Likewise, question asking for filenames or pathnames may now use the Getfile.U +unit to take care of all the burden. The presetting is the same as for myread +and the answer is finally held in $ans. But the variable $fn must be set to +indicate the type of file and enable/disable some of the sanity checks. See +leading comments in Getfile.U. Here is a simple example to locate the active +file: + + dflt='~news/lib' + fn='l~:active' + rp='Where is the active file?' + . getfile + active="$ans" + +The user may answer the question by using ~substitution and giving only the +directory where the active file is located (in which case getfile will try +to locate a file named 'active' in that directory). A full path may also be +given of course, if the basename of the file is not 'active'. + +The units are now filtered by a built-in interpreter before getting +loaded in Configure. That way, a Configure script can be more or less +tuned. See d_gethname.U for a complex example. + +All the interpreter commands start with a leading '@'. Possible +commands include: + +o if/elsif/else/end is the traditional conditional construct. +o define tells metaconfig the is to be defined. + +Expressions in conditional constructs can include the &&, || and ! +operator with same meaning as in the shell. Backslash at the end of a +line stands for the continuation character. All the symbols in the +expression stands for themselves, and their value is true if they are +defined/wanted and false otherwise. + +It is possible to include shell and perl test. All the text enclosed in +single brackets as {} is expanded in a shell as + + if >/dev/null 2>&1; then exit 0; else exit 1; fi + +whereas text in double brackets as {{}} is expanded in perl as + + if ( {exit 0;} else {exit 1;} + +and the exit status is used in the standard way to get a boolean value +(i.e 0 is true and everything else is false). See Oldconfig.U for an +example. + +Metaconfig's interpreter has standard C operator priority, but you may +force the evaluation order with parenthesis. A simple error recovery +attempt is made, so that you should get meaningful error messages. + +The simple test ?sym: means "keep the remaining of the line iff the +symbol is defined" and %sym: is the same for non-definedness. + +Some special symbols may be put in a unit and will get expanded, +provided the ?MAKE: command line is 'wipe' and not 'add'. Here are the +available symbols: + + is the name $package as found in .package + is the $maintloc variable as found in .pakcage + is metaconfig's version number + is metaconfig's patchlevel + is the current frozen date as given by `date` + +A 'wipe'ed unit is passed through the interpreter too. + +It is also possible to declare a symbol obsolete. A warning message +will be issued if the symbol is used and the Glossary mentions it. +the "Obsolete" clause. The syntax is: + + ?C:symbol (obsolete list): + ?S:symbol (obsolete list): + +If metaconfig is used with the -o option, it will generate code to remap +those old symbols to the new ones, so the old code does not have to be changed +right away. If you do not use -o, the Obsolete file will still be generated +to warn you about obsolete symbols but no maping will be done. + +The new ?W: line can be use to tie up the destiny of some symbols. The syntax +is: + + ?W:shell symbols list:C symbol list + +and the symbols in the shell list will be defined if one of the C symbols is. +For instance, unit d_const.U uses the following: + + ?W:%<:const + +so that any 'const' usage in the C code will have %< (the unit name) handled +as a wanted symbol. In particular, this has the interesting side effect of +loading the unit into Configure when the 'const' keyword is used. + +This shell symbol list part may be left empty. For example unit i_time.U uses: + + ?W::timezone + +for its side effect: the symbol 'timezone' may now be part of the interpreter +tests to conditionally load some code into Configure when struct timezone is +used. + +C symbol aliasing can be used to let metaconfig know that the symbol comment +is to be loaded in config_h.SH even when the main symbol is not used in C. +For instance, d_const.U writes: + + ?C:HASCONST ~ %<: + +so that the HASCONST hype is loaded iff the unit (%<) is wanted. This is why +the ?H: lines are also explicitely tied to the wanted-ness of the d_const +symbol, by writing: + + ?H:?%<:#$d_const HASCONST /**/ + ?H:?%<:#ifndef HASCONST + ?H:?%<:#define const + ?H:?%<:#endif + ?H:. + +because we want all those lines to appear in config_h.SH as soon as the d_const +unit is loaded into Configure. + +Because of the new -s (silent) option of Configure, the important messages which +are to appear even in silent mode must be written on file descriptor #4. Others +will simply not be echoed under -s. Note that all the questions and default +answers are written on #4. You should write: + + echo " " + echo "Checking to see if......" >&4 + ..... + echo "Yes, it does" + +which will have the traditional behaviour unless -s is used, in which case only +the line + + Checking to see if..... + +will echo on the terminal. diff --git a/mcon/README b/mcon/README new file mode 100644 index 0000000..0a6b26e --- /dev/null +++ b/mcon/README @@ -0,0 +1,24 @@ +This is the root directory for metaconfig. + +If you are new to metaconfig, you may wish to have a look at the INTRO +file, which gives a quick introduction. + +The metaconfig you have here is a modified version of Larry Wall's 2.0 +release. The units themselves have been ripped off from some Configure +scripts (perl 4.0, elm 2.3). They all carry a copyright from me, which +is not true, but it was automatically produced and I had no time yet to +set the proper copyrights for each unit. + +Although metaconfig, as being part of dist, is covered by the Artistic +License, a Configure script is not copyrighted and belongs to the +public domain. Units can be copyrighted, and credits for each unit may +appear in the generated Configure script, at the author's request. + +The manual page for metaconfig is not up-to-date. The built-in +interpreter and the changes are documented in NOTES. + +The units that come from dist 2.0 need to be changed. A script should be +provided in the final release to do an automatic conversion, which will +be fine 90% of the time. If you want to see how new features can be used, +I would recommend you to have a look at Oldconfig.U, d_gethname.U and +voidflags.U. diff --git a/mcon/U/AAAAA.U b/mcon/U/AAAAA.U new file mode 100644 index 0000000..b2f6211 --- /dev/null +++ b/mcon/U/AAAAA.U @@ -0,0 +1,46 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: AAAAA.U,v $ +?RCS: Revision 3.0.1.4 1994/06/20 06:50:26 ram +?RCS: patch30: changes from Jarkko Hietaniemi are tagged with JHI +?RCS: +?RCS: Revision 3.0.1.3 1994/05/06 14:01:39 ram +?RCS: patch23: initials for Wayne Davison are now WED +?RCS: patch23: added initials for new unit contributor Andy Dougherty +?RCS: +?RCS: Revision 3.0.1.2 1994/01/24 14:01:09 ram +?RCS: patch16: make metalint shut up on special unit definition for All target +?RCS: +?RCS: Revision 3.0.1.1 1993/09/13 15:43:57 ram +?RCS: patch10: documents initials used for Wayne Davison's contributions +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:44 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: The purpose of this file is to supply the head of the Makefile created +?X: by metaconfig. For this reason it must be first in alphabetical order. +?X: The leading '+' in front of the unit name is a hint for metalint, since +?X: the use of that special unit name as a "made" unit is legitimate here. +?X: +?MAKE:+All: Finish +?X: +?X: Throughout the units, the following initials are used to identify comments: +?X: +?X: HMS: Harlan Stenn +?X: RAM: Raphael Manfredi +?X: WED: Wayne Davison (was WAD by mistake--RAM) +?X: ADO: Andy Dougherty +?X: JHI: Jarkko Hietaniemi +?X: +?X: Agreed, this is a weird place to document it, but I couldn't find a better +?X: place to do so. I've bet on the curiosity of users, who would probably +?X: want to know what's in this strangely-named file--RAM. diff --git a/mcon/U/Begin.U b/mcon/U/Begin.U new file mode 100644 index 0000000..c05d239 --- /dev/null +++ b/mcon/U/Begin.U @@ -0,0 +1,39 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Begin.U,v $ +?RCS: Revision 3.0.1.3 1997/02/28 14:56:35 ram +?RCS: patch61: added Extractall dependency +?RCS: +?RCS: Revision 3.0.1.2 1995/01/30 14:25:08 ram +?RCS: patch49: avoid an empty rmlist: systems might choke on it (WED) +?RCS: +?RCS: Revision 3.0.1.1 1994/10/31 09:32:20 ram +?RCS: patch44: created +?RCS: +?X: +?X: This file comes after option processing had been done and after all +?X: the default values have been set up. It marks the beginning of questions. +?X: It is important that Options be listed *after* Myinit to ensure that the +?X: default initializations performed by Init and Myinit will not clobber +?X: any setting done on the command line via -D or -U. +?X: +?MAKE:Begin: Myinit Options package Extractall +?MAKE: -pick add $@ %< +: Eunice requires " " instead of "", can you believe it +echo " " +: Here we go... +echo "Beginning of configuration questions for $package." + +?X: Make sure the rm below is given a non-empty list for some systems. +?X: This is run only when within the UU directory, hence we can safely +?X: attempt to rm a non-existent 'X' file... +trap 'echo " "; test -d ../UU && rm -rf X $rmlist; exit 1' 1 2 3 15 + diff --git a/mcon/U/Checkcc.U b/mcon/U/Checkcc.U new file mode 100644 index 0000000..ac1b513 --- /dev/null +++ b/mcon/U/Checkcc.U @@ -0,0 +1,135 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Copyright (c) 2000, Jarkko Hietaniemi +?RCS: +?X: +?X: This unit produces a bit of shell code that must be dotted in order +?X: to make quick check on whether the current C compiler is working. +?X: +?MAKE:Checkcc ccname ccversion: Myread Warn startsh cat contains test +?MAKE: -pick add $@ %< +?S:ccname: +?S: This can set either by hints files or by Configure. If using +?S: gcc, this is gcc, and if not, usually equal to cc, unimpressive, no? +?S: Some platforms, however, make good use of this by storing the +?S: flavor of the C compiler being used here. For example if using +?S: the Sun WorkShop suite, ccname will be 'workshop'. +?S:. +?S:ccversion: +?S: This can set either by hints files or by Configure. If using +?S: a (non-gcc) vendor cc, this variable may contain a version for +?S: the compiler. +?S:. +?F:./checkcc ./trygcc !checktmp +?V:despair +?T:trygcc +?LINT:extern cc rm ccflags ldflags +?LINT:change cc ccflags +?LINT:usefile checktmp +?INIT:ccname='' +?INIT:ccversion='' +: generate the trygcc script for later perusal +cat <trygcc +$startsh +EOS +cat <<'EOSC' >>trygcc +case "$cc" in +'') ;; +*) $rm -f try try.* + $cat >try.c <&4 + despair=yes + trygcc=yes + case "$cc" in + *gcc*) trygcc=no ;; + esac + case "`$cc -v -c try.c 2>&1`" in + *gcc*) trygcc=no ;; + esac + if $test X"$trygcc" = Xyes; then + if gcc -o try -c try.c; then + echo " " + echo "You seem to have a working gcc, though." >&4 + rp="Would you like to use it?" + dflt=y + if $test -f myread; then + . ./myread + else + if $test -f UU/myread; then + . ./UU/myread + else + echo "Cannot find myread, sorry. Aborting." >&2 + exit 1 + fi + fi + case "$ans" in + [yY]*) cc=gcc; ccname=gcc; ccflags=''; despair=no; +?X: Look whether we have 'call-back units' generated by hints that would +?X: seemingly affect the compiling environment. + $cat *.cbu >checktmp 2>/dev/null + if $contains ccflags checktmp >/dev/null; then + ./warn <checkcc +$startsh +EOS +cat <<'EOSC' >>checkcc +case "$cc" in +'') ;; +*) $rm -f try try.* + $cat >try.c <&4 + fi + $cat >&4 <&4 +?X: +?X: Files spelled uppercased and beginning with PACK are produced by the +?X: shell archive builder and may be removed by the user. Usually, they are +?X: not listed in the MANIFEST file, but you never know... +?X: +?X: "split -l" is the new way of running a split, but we also try the older way +?X: + awk '$1 !~ /PACK[A-Z]+/ {print $1}' "$rsrc/MANIFEST" | \ + (split -l 50 2>/dev/null || split -50) + rm -f missing + tmppwd=`pwd` + for filelist in x??; do + (cd "$rsrc"; ls `cat "$tmppwd/$filelist"` \ + >/dev/null 2>>"$tmppwd/missing") + done + if test -s missing; then + cat missing >&4 + cat >&4 <<'EOM' + +THIS PACKAGE SEEMS TO BE INCOMPLETE. + +You have the option of continuing the configuration process, despite the +distinct possibility that your kit is damaged, by typing 'y'es. If you +do, don't blame me if something goes wrong. I advise you to type 'n'o +and contact the author (). + +EOM +?X: Can't use $echo at this early stage + echo $n "Continue? [n] $c" >&4 + read ans + case "$ans" in + y*) + echo "Continuing..." >&4 + rm -f missing + ;; + *) +?X: +?X: Use kill and not exit, so that the trap gets executed to clean up +?X: + echo "ABORTING..." >&4 + kill $$ + ;; + esac + else + echo "Looks good..." + fi +else + echo "There is no MANIFEST file. I hope your kit is complete !" +fi +rm -f missing x?? + +@end diff --git a/mcon/U/Chk_whoami.U b/mcon/U/Chk_whoami.U new file mode 100644 index 0000000..a18ae1d --- /dev/null +++ b/mcon/U/Chk_whoami.U @@ -0,0 +1,25 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Chk_whoami.U,v $ +?RCS: Revision 3.0 1993/08/18 12:04:46 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit makes sure we don't try to include whoami.h if uname() exists. +?X: +?MAKE:Chk_whoami: d_uname i_whoami +?MAKE: -pick add $@ %< +?LINT:change i_whoami +: weed out incompatibilities +case "$d_uname" in + "$define") i_whoami="$undef" ;; +esac + diff --git a/mcon/U/Compile.U b/mcon/U/Compile.U new file mode 100644 index 0000000..a8af2e0 --- /dev/null +++ b/mcon/U/Compile.U @@ -0,0 +1,63 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Copyright (c) 1998 Andy Dougherty +?RCS: +?RCS: You may distribute under the terms of either the GNU General Public +?RCS: License or the Artistic License, as specified in the README file. +?RCS: +?RCS: +?X: +?X: This unit is just a quick shorthand for the compile command +?X: to be used in all the other metaconfig units. +?X: +?MAKE:Compile: +cc +optimize +ccflags +ldflags +libs +?MAKE: -pick add $@ %< +?LINT:define compile compile_ok +?V:compile compile_ok mc_file +?S:compile: +?S: This shell variable is used internally by Configure to provide +?S: a convenient shorthand for the typical compile command, namely +?S: $cc $optimize $ccflags $ldflags -o $1 $1.c $libs > /dev/null 2>&1 +?S: Note that the output filename does _not_ include the _exe +?S: extension. Instead we assume that the linker will be +?S: "helpful" and automatically appending the correct suffix. +?S: OS/2 users will apparently need to supply the -Zexe flag to +?S: get this behavior. +?S: +?S: To use this variable, say something like: +?S: echo 'int main() { exit(0); }' > try.c +?S: set try +?S: if eval $compile; then +?S: echo "success" # and do whatever . . . +?S: else +?S: echo "failure" # and do whatever . . . +?S: fi +?S: To add extra flags cc flags (e.g. -DWHATEVER) just put them +?S: in $*, e.g. +?S: set try -DTRY_THIS_FLAG +?S:. +?S:compile_ok: +?S: This shell variable is used internally by Configure to provide +?S: a convenient shorthand for the typical compile command that you +?S: expect to work ok. It is the same as $compile, except we +?S: deliberately let the user see any error messages. +?S:. +: define a shorthand compile call +compile=' +mc_file=$1; +shift; +$cc -o ${mc_file} $optimize $ccflags $ldflags $* ${mc_file}.c $libs > /dev/null 2>&1;' +: define a shorthand compile call for compilations that should be ok. +compile_ok=' +mc_file=$1; +shift; +$cc -o ${mc_file} $optimize $ccflags $ldflags $* ${mc_file}.c $libs;' + diff --git a/mcon/U/Config_h.U b/mcon/U/Config_h.U new file mode 100644 index 0000000..04336c2 --- /dev/null +++ b/mcon/U/Config_h.U @@ -0,0 +1,114 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Config_h.U,v $ +?RCS: Revision 3.0.1.5 1997/02/28 14:57:43 ram +?RCS: patch61: added support for src.U +?RCS: +?RCS: Revision 3.0.1.4 1995/09/25 09:10:49 ram +?RCS: patch59: commented the purpose of the #un-def directive +?RCS: +?RCS: Revision 3.0.1.3 1995/01/30 14:25:39 ram +?RCS: patch49: typo fixes in leading config.h comment (WED) +?RCS: +?RCS: Revision 3.0.1.2 1993/08/24 12:13:20 ram +?RCS: patch3: added TOP as a local shell temporary variable +?RCS: +?RCS: Revision 3.0.1.1 1993/08/19 06:42:20 ram +?RCS: patch1: leading config.sh searching was not aborting properly +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:47 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This file ends up producing the config_h.SH script, which is run to produce +?X: the config.h file. The file ./.Config_h below contains all the ?H: lines +?X: extracted out of all the units. Metaconfig itself adds the !GROK!THIS!. +?X: Note that this code isn't included into Configure, but must be shipped with. +?X: +?X: For those who wish to know why the file is config_h.SH instead of the more +?X: natural config.h.SH, well... it is to support systems like MS-DOG. Only one +?X: 'dot' is allowed within the file name, as it is part of the "extension" of +?X: the file. MS-DOG will not let you have two 'dots' because that would mean +?X: two "extensions". +?X: +?MAKE:Config_h: Id End Config_sh Obsol_h myuname cf_time cf_by package src +?MAKE: -pick c_h_weed $@ %< +?MAKE: -pick c_h_weed $@ ./Config_h +?MAKE: -pick c_h_weed $@ ./Obsol_h +?T:CONFIG TOP +?LINT:unclosed !GROK!THIS! +?LINT:extern CONFIG_H CONFIG_SH +?LINT:change CONFIG_H CONFIG_SH +?LINT:nocomment +case "$CONFIG_SH" in +'') CONFIG_SH=config.sh;; +esac +case "$CONFIG_H" in +'') CONFIG_H=config.h;; +esac +case $CONFIG in +'') + if test -f $CONFIG_SH; then TOP=.; + elif test -f ../$CONFIG_SH; then TOP=..; + elif test -f ../../$CONFIG_SH; then TOP=../..; + elif test -f ../../../$CONFIG_SH; then TOP=../../..; + elif test -f ../../../../$CONFIG_SH; then TOP=../../../..; + else + echo "Can't find $CONFIG_SH."; exit 1 + fi + . $TOP/$CONFIG_SH + ;; +esac +?X: Make sure we are in the directory where the .SH file is located. +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting $CONFIG_H (with variable substitutions)" +?X: +?X: Since we unconditionally translate leading #undef into /*#define, we're +?X: stuck when we really want to have a #undef in config.h. That's why there +?X: is provision here for #un-def, which is translated back into #undef after +?X: all original #undef have been processed. +?X: +?X: Previously, we changed all +?X: #undef FOO /**/ +?X: into +?X: /*#define FOO /**/ +?X: The xlc compiler (available on IBM's AIX) complains that this is +?X: an illegal attempt to write a nested comment, and warns against it. +?X: There's apparently no way to shut the compiler up, either. +?X: This sed command from Hallvard B Furuseth +?X: changes it to +?X: /*#define FOO / **/ +sed <$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-def!#undef!' +/* + * This file was produced by running the config_h.SH script, which + * gets its values from $CONFIG_SH, which is generally produced by + * running Configure. + * + * Feel free to modify any of this as the need arises. Note, however, + * that running config_h.SH again will wipe out any changes you've made. + * For a more permanent change edit $CONFIG_SH and rerun config_h.SH. + * + * \$Id$ + */ + +/* + * Package name : $package + * Source directory : $src + * Configuration time: $cf_time + * Configured by : $cf_by + * Target system : $myuname + */ + +#ifndef _config_h_ +#define _config_h_ + diff --git a/mcon/U/Config_sh.U b/mcon/U/Config_sh.U new file mode 100644 index 0000000..3d71a2e --- /dev/null +++ b/mcon/U/Config_sh.U @@ -0,0 +1,110 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Config_sh.U,v $ +?RCS: Revision 3.0.1.3 1997/02/28 14:57:53 ram +?RCS: patch61: added support for src.U +?RCS: +?RCS: Revision 3.0.1.2 1995/01/11 14:53:31 ram +?RCS: patch45: moved path stripping from d_portable.U to end of Configure +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 15:50:37 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:48 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit ends up producing the config.sh script, which contains all the +?X: definitions figured out by Configure. The add.Config_sh command knows +?X: which variables need to be remembered. It also adds the EOT (ends the +?X: here document redirection with variable substitution). +?X: +?MAKE:Config_sh: cf_time cf_by test spitshell startsh myuname Myread \ + End Obsol_sh Loc +d_portable package src cat sed +?MAKE: -pick add.Config_sh $@ %< +?MAKE: -pick add $@ ./Obsol_sh +?MAKE: -pick close.Config_sh $@ %< +?F:!config.over !config.arch +?T:file sfile xsed +?LINT:unclosed EOT +: back to where it started +if test -d ../UU; then + cd .. +fi + +: configuration may be unconditionally patched via a 'config.arch' file +if $test -f config.arch; then + echo "I see a config.arch file, loading it." >&4 + . ./config.arch +fi + +: configuration may be patched via a 'config.over' file +if $test -f config.over; then + echo " " + dflt=y + rp='I see a config.over file. Do you wish to load it?' + . UU/myread + case "$ans" in + n*) echo "OK, I'll ignore it.";; + *) . ./config.over + echo "Configuration override changes have been loaded." + ;; + esac +fi + +@if d_portable +: in case they want portability, strip down executable paths +?X: +?X: Strip down paths in located executables. For each file, e.g. vi, there +?X: is a $vi variable whose value is for instance '/usr/bin/vi'. By resetting +?X: $vi to 'vi', we rely on the PATH variable to locate the executable... +?X: In order to allow vi='/usr/bin/nvi' which will strip down to vi='nvi', +?X: we can't just say 'eval $file="\$file"', we have to recourse to sed. +?X: We don't use basename since it is less portable than sed. +?X: +case "$d_portable" in +"$define") + echo " " + echo "Stripping down executable paths..." >&4 + xsed=$sed + for file in $loclist $trylist; do + eval sfile="\$$file" + sfile=`echo $sfile | $xsed -e 's,.*/\(.*\),\1,'` + eval $file="$sfile" + done + ;; +esac + +@end +: create config.sh file +echo " " +echo "Creating config.sh..." >&4 +$spitshell <config.sh +$startsh +# +# This file was produced by running the Configure script. It holds all the +# definitions figured out by Configure. Should you modify one of these values, +# do not forget to propagate your changes by running "Configure -der". You may +# instead choose to run each of the .SH files by yourself, or "Configure -S". +# + +# Package name : $package +# Source directory : $src +# Configuration time: $cf_time +# Configured by : $cf_by +# Target system : $myuname + +EOT +?X: Command line options are saved by the Options.U unit in the +?X: temporary file UU/cmdline.opt +$test -f UU/cmdline.opt && $cat UU/cmdline.opt >> config.sh +$spitshell <>config.sh + diff --git a/mcon/U/Configdir.U b/mcon/U/Configdir.U new file mode 100644 index 0000000..1dfcf70 --- /dev/null +++ b/mcon/U/Configdir.U @@ -0,0 +1,28 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Configdir.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 14:58:36 ram +?RCS: patch61: have README explicitely mention the package name +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:49 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:Configdir: package +?MAKE: -pick add $@ %< +: create .config dir to save info across Configure sessions +test -d ../.config || mkdir ../.config +cat >../.config/README <&4 +?X: +?X: The symbol list is in alpha order for ease of maintenance... +?X: +?X: Lots of new symbols (mostly rummaged from gcc), courtesy of +?X: Jarkko Hietaniemi -- RAM, 06/06/94 +?X: +?X: If your symbol is mixed case, just add it as-is. +?X: All symbols will be transformed to both all-lower and all-upper. +?X: Also drop any leading/trailing underscores, the scan will try all those. +?X: +$cat <<'EOSH' > Cppsym.know +a29k ABI64 aegis AES_SOURCE AIX AIX32 AIX370 +AIX41 AIX42 AIX43 AIX_SOURCE aixpc ALL_SOURCE +alliant alpha am29000 AM29000 AMD64 amiga AMIGAOS AMIX +ansi ANSI_C_SOURCE apollo ardent ARM32 atarist att386 att3b +BeOS BIG_ENDIAN BIT_MSF bsd BSD bsd43 bsd4_2 bsd4_3 BSD4_3 bsd4_4 +BSD_4_3 BSD_4_4 BSD_NET2 BSD_TIME BSD_TYPES BSDCOMPAT bsdi +bull c cadmus clipper CMU COFF COMPILER_VERSION +concurrent convex cpu cray CRAY CRAYMPP ctix CX_UX +CYGWIN DGUX DGUX_SOURCE DJGPP dmert DOLPHIN DPX2 DSO +Dynix DynixPTX ELF encore EPI EXTENSIONS FAVOR_BSD +FILE_OFFSET_BITS FreeBSD GCC_NEW_VARARGS gcos gcx gimpel +GLIBC GLIBC_MINOR +GNU_SOURCE GNUC GNUC_MINOR GNU_LIBRARY GO32 gould GOULD_PN +H3050R H3050RX hbullx20 hcx host_mips +hp200 hp300 hp700 HP700 hp800 hp9000 +hp9000s200 hp9000s300 hp9000s400 hp9000s500 +hp9000s700 hp9000s800 hp9k8 hp_osf hppa hpux HPUX_SOURCE +i186 i286 i386 i486 i586 i686 i8086 i80960 i860 I960 +IA64 iAPX286 ibm ibm032 ibmesa IBMR2 ibmrt ILP32 ILP64 +INLINE_INTRINSICS INTRINSICS INT64 interdata is68k ksr1 +LANGUAGE_C LARGE_FILE_API LARGEFILE64_SOURCE +LARGEFILE_SOURCE LFS64_LARGEFILE LFS_LARGEFILE +Linux LITTLE_ENDIAN LONG64 LONG_DOUBLE LONG_LONG +LONGDOUBLE LONGLONG LP64 luna luna88k Lynx +M68000 m68k m88100 m88k M88KBCS_TARGET M_COFF +M_I186 M_I286 M_I386 M_I8086 M_I86 M_I86SM M_SYS3 +M_SYS5 M_SYSIII M_SYSV M_UNIX M_XENIX MACH machine MachTen +MATH_HAS_NO_SIDE_EFFECTS +mc300 mc500 mc68000 mc68010 mc68020 mc68030 mc68040 +mc68060 mc68k mc68k32 mc700 mc88000 mc88100 merlin +mert MiNT mips MIPS_FPSET MIPS_ISA MIPS_SIM MIPS_SZINT +MIPS_SZLONG MIPS_SZPTR MIPSEB MIPSEL MODERN_C motorola +mpeix MSDOS MTXINU MULTIMAX mvs MVS n16 ncl_el ncl_mr +NetBSD news1500 news1700 news1800 news1900 news3700 +news700 news800 news900 NeXT NLS nonstopux ns16000 ns32000 +ns32016 ns32332 ns32k nsc32000 +OCS88 OEMVS OpenBSD os OS2 OS390 osf OSF1 OSF_SOURCE +pa_risc PA_RISC1_1 PA_RISC2_0 PARAGON parisc +pc532 pdp11 PGC PIC plexus PORTAR posix +POSIX1B_SOURCE POSIX2_SOURCE POSIX4_SOURCE +POSIX_C_SOURCE POSIX_SOURCE POWER +PROTOTYPES PWB pyr QNX R3000 REENTRANT RES Rhapsody RISC6000 +riscix riscos RT S390 SA110 scs SCO sequent sgi SGI_SOURCE SH3 sinix +SIZE_INT SIZE_LONG SIZE_PTR SOCKET_SOURCE SOCKETS_SOURCE +sony sony_news sonyrisc sparc sparclite spectrum +stardent stdc STDC_EXT stratos sun sun3 sun386 +Sun386i svr3 svr4 SVR4_2 SVR4_SOURCE svr5 +SX system SYSTYPE_BSD SYSTYPE_BSD43 SYSTYPE_BSD44 +SYSTYPE_SVR4 SYSTYPE_SVR5 SYSTYPE_SYSV SYSV SYSV3 SYSV4 SYSV5 +sysV68 sysV88 Tek4132 Tek4300 titan +TM3200 TM5400 TM5600 +tower tower32 tower32_200 tower32_600 tower32_700 +tower32_800 tower32_850 tss +u370 u3b u3b2 u3b20 u3b200 u3b20d u3b5 +ultrix UMAXV UnicomPBB UnicomPBD UNICOS UNICOSMK +unix UNIX95 UNIX99 unixpc unos +USE_BSD USE_FILE_OFFSET64 USE_GNU USE_ISOC9X USE_LARGEFILE USE_LARGEFILE64 +USE_MISC USE_POSIX USE_POSIX199309 USE_POSIX199506 USE_POSIX2 +USE_REENTRANT USE_SVID USE_UNIX98 USE_XOPEN USE_XOPEN_EXTENDED +USGr4 USGr4_2 +Utek UTek UTS UWIN uxpm uxps vax venix VMESA vms xenix Xenix286 +XOPEN_SOURCE XOPEN_SOURCE_EXTENDED XPG2 XPG2_EXTENDED +XPG3 XPG3_EXTENDED XPG4 XPG4_EXTENDED +z8000 +EOSH +?X: Maybe put other stuff here too. +cat <>Cppsym.know +$osname +EOSH +./tr '[a-z]' '[A-Z]' < Cppsym.know > Cppsym.a +./tr '[A-Z]' '[a-z]' < Cppsym.know > Cppsym.b +$cat Cppsym.know > Cppsym.c +$cat Cppsym.a Cppsym.b Cppsym.c | $tr ' ' $trnl | $sort | $uniq > Cppsym.know +$rm -f Cppsym.a Cppsym.b Cppsym.c +cat < Cppsym +$startsh +if $test \$# -gt 0; then + echo \$* | $tr " " "$trnl" | ./Cppsym.try > Cppsym.got + if $test -s Cppsym.got; then + $rm -f Cppsym.got + exit 0 + fi + $rm -f Cppsym.got + exit 1 +else + $tr " " "$trnl" | ./Cppsym.try + exit 0 +fi +EOSH +chmod +x Cppsym +$eunicefix Cppsym +?X: The below awk script will die a horrible death if +?X: some of the tested symbols are not long ints. +?X: Also, we do not make difference between just defined and defined zero. +cat < Cppsym.try +$startsh +cat <<'EOCP' > try.c +#include +int main() { +EOCP +?X: The length($1) command guards against possible empty entries. +?X: The awk snippet is know to give heartburn to UNICOS/mk awk. +$awk \\ +EOSH +cat <<'EOSH' >> Cppsym.try +'length($1) > 0 { + printf "#ifdef %s\n#if %s+0\nprintf(\"%s=%%ld\\n\", (long)%s);\n#else\nprintf(\"%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1 + printf "#ifdef _%s\n#if _%s+0\nprintf(\"_%s=%%ld\\n\", (long)_%s);\n#else\nprintf(\"_%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1 + printf "#ifdef __%s\n#if __%s+0\nprintf(\"__%s=%%ld\\n\", (long)__%s);\n#else\nprintf(\"__%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1 + printf "#ifdef __%s__\n#if __%s__+0\nprintf(\"__%s__=%%ld\\n\", (long)__%s__);\n#else\nprintf(\"__%s__\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1 +}' >> try.c +echo 'return 0;}' >> try.c +EOSH +cat <> Cppsym.try +flags="$ccflags" +case "$osname-$gccversion" in +irix-) flags="\$flags -woff 1178" ;; +os2-*) flags="\$flags -Zlinker /PM:VIO" ;; +esac +$cc -o try $optimize \$flags $ldflags try.c $libs && $run ./try +EOSH +chmod +x Cppsym.try +$eunicefix Cppsym.try +./Cppsym < Cppsym.know > Cppsym.true +: now check the C compiler for additional symbols +?X: suggested by Jarkko Hietaniemi , thanks! +postprocess_cc_v='' +case "$osname" in +aix) postprocess_cc_v="|$tr , ' '" ;; +esac +$cat >ccsym <tmp.c <&1 $postprocess_cc_v\` +do + case "\$i" in + -D*) echo "\$i" | $sed 's/^-D//';; + -A*) $test "$gccversion" && echo "\$i" | $sed 's/^-A//' | $sed 's/\(.*\)(\(.*\))/\1=\2/';; + esac +done +$rm -f try.c +EOS +postprocess_cc_v='' +chmod +x ccsym +$eunicefix ccsym +./ccsym > ccsym1.raw +?X: AIX complains if $uniq is passed an empty file. ($sort apparently +?X: doesn't care.) --AD 14 July 1998 +if $test -s ccsym1.raw; then + $sort ccsym1.raw | $uniq >ccsym.raw +else + mv ccsym1.raw ccsym.raw +fi + +?X: canonicalize symbols for easier sort/uniq/comm usage: append =1 if no = sign +?X: the awk script must be on two lines for older awk programs, sigh! -- ADO +$awk '/\=/ { print $0; next } + { print $0"=1" }' ccsym.raw >ccsym.list +$awk '/\=/ { print $0; next } + { print $0"=1" }' Cppsym.true >ccsym.true +$comm -13 ccsym.true ccsym.list >ccsym.own +$comm -12 ccsym.true ccsym.list >ccsym.com +$comm -23 ccsym.true ccsym.list >ccsym.cpp +also='' +if $test -z ccsym.raw; then + echo "Your C compiler doesn't seem to define any symbols!" >&4 + echo " " + echo "However, your C preprocessor defines the following symbols:" + $cat Cppsym.true + ccsymbols='' + cppsymbols=`$cat Cppsym.true` + cppsymbols=`echo $cppsymbols` + cppccsymbols="$cppsymbols" +else + if $test -s ccsym.com; then + echo "Your C compiler and pre-processor define these symbols:" + $sed -e 's/\(..*\)=.*/\1/' ccsym.com + also='also ' + symbols='ones' + cppccsymbols=`$cat ccsym.com` + cppccsymbols=`echo $cppccsymbols` + $test "$silent" || sleep 1 + fi + if $test -s ccsym.cpp; then + $test "$also" && echo " " + echo "Your C pre-processor ${also}defines the following symbols:" + $sed -e 's/\(..*\)=.*/\1/' ccsym.cpp + also='further ' + cppsymbols=`$cat ccsym.cpp` + cppsymbols=`echo $cppsymbols` + $test "$silent" || sleep 1 + fi + if $test -s ccsym.own; then + $test "$also" && echo " " + echo "Your C compiler ${also}defines the following cpp symbols:" + $sed -e 's/\(..*\)=1/\1/' ccsym.own + $sed -e 's/\(..*\)=.*/\1/' ccsym.own | $uniq >>Cppsym.true + ccsymbols=`$cat ccsym.own` + ccsymbols=`echo $ccsymbols` + $test "$silent" || sleep 1 + fi +fi +$rm -f Cppsym.know Cppsym.true + diff --git a/mcon/U/Cross.U b/mcon/U/Cross.U new file mode 100644 index 0000000..feaef31 --- /dev/null +++ b/mcon/U/Cross.U @@ -0,0 +1,349 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Copyright (c) 2001 Jarkko Hietaniemi +?RCS: +?MAKE:run to from targetarch usecrosscompile: src awk cat grep test rm \ + echo sed mkdir cp touch chmod +?MAKE: -pick add $@ %< +?Y:TOP +?S:usecrosscompile: +?S: This variable conditionally defines the USE_CROSS_COMPILE symbol, +?S: and indicates that our package has been cross-compiled. +?S:. +?S:run: +?S: This variable contains the command used by Configure +?S: to copy and execute a cross-compiled executable in the +?S: target host. Useful and available only during the build. +?S: Empty string '' if not cross-compiling. +?S:. +?S:from: +?S: This variable contains the command used by Configure +?S: to copy files from the target host. Useful and available +?S: only during the build. +?S: The string ':' if not cross-compiling. +?S:. +?S:to: +?S: This variable contains the command used by Configure +?S: to copy to from the target host. Useful and available +?S: only during the build. +?S: The string ':' if not cross-compiling. +?S:. +?S:targetarch: +?S: If cross-compiling, this variable contains the target architecture. +?S: If not, this will be empty. +?S:. +?C:USE_CROSS_COMPILE: +?C: This symbol, if defined, indicates that the package is being +?C: cross-compiled. +?C:. +?C:CROSS_TARGET_ARCH: +?C: This symbol, if defined, indicates the target architecture +?C: the package has been cross-compiled to. +?C: Undefined if not a cross-compile. +?C:. +?H:?usecrosscompile:#ifndef USE_CROSS_COMPILE +?H:?usecrosscompile:#$usecrosscompile USE_CROSS_COMPILE /**/ +?H:?usecrosscompile:#define CROSS_TARGET_ARCH "$targetarch" /**/ +?H:?usecrosscompile:#endif +?H:. +?T:croak pwd exe f q i j cwd +?LINT:extern usecrosscompile +?LINT:extern cc +?LINT:extern usrinc +?LINT:change usrinc +?LINT:change ar +?LINT:change nm +?LINT:change ranlib +?LINT:extern targethost +?LINT:extern targetdir +?LINT:change targetdir +?LINT:extern targetuser +?LINT:change targetuser +?LINT:extern targetrun +?LINT:extern targetfrom +?LINT:extern targetto +?LINT:extern targetmkdir +?LINT:change targetrun +?LINT:change targetfrom +?LINT:change targetto +?LINT:change targetmkdir +?LINT:extern incpth +?LINT:extern libpth +?LINT:change incpth +?LINT:change libpth +?LINT:extern locincpth +?LINT:extern loclibpth +?LINT:change locincpth +?LINT:change loclibpth +: setup for possible cross-compilation +run='' +to=: +from=: +usecrosscompile='undef' +targetarch='' +case "$usecrosscompile" in +$define|true|[yY]*) +@if { test -d ../Cross } +?X: +?X: Cross-compilation is enabled when there is a 'Cross' directory found +?X: at the root of the package. This directory must contain the following +?X: entries for defining the cross-compilation process: +?X: +?X: FIXME FIXME +?X: WE MUST DISTINGUISH BETWEEN LOCAL cross-compiling AND REMOTE ONE +?X: ACTUALLY, REMOTE COMPILATION SHOULD BE CONFIGURED INTERACTIVELY +?X: IT WILL COPY ALL THE FILES FROM THE MANIFEST DOWN TO THE REMOTE DIR... +?X: (and copy things like 'mkdep', etc...) +?X: + $echo "Cross-compiling..." + croak='' + case "$cc" in + *-*-gcc) +?X: A cross-compiling gcc, probably. + targetarch=`$echo $cc|$sed 's/-gcc$//'` + ar=$targetarch-ar +?X: leave out ld, choosing it is more complex + nm=$targetarch-nm + ranlib=$targetarch-ranlib + $echo 'extern int foo;' > try.c + set X `$cc -v -E try.c 2>&1 | \ + $awk '/^#include &4 + for i in $*; do + j="`$echo $i|$sed 's,/include$,/lib,'`" + if $test -d $j; then + libpth="$libpth $j" + fi + done + libpth="`$echo $libpth|$sed 's/^ //'`" + echo "Guessing libpth '$libpth'." >&4 + fi + $rm -f try.c + ;; + esac + case "$targetarch" in + '') echo "Targetarch not defined." >&4; croak=y ;; + *) echo "Using targetarch $targetarch." >&4 ;; + esac + case "$incpth" in + '') echo "Incpth not defined." >&4; croak=y ;; + *) echo "Using incpth '$incpth'." >&4 ;; + esac + case "$libpth" in + '') echo "Libpth not defined." >&4; croak=y ;; + *) echo "Using libpth '$libpth'." >&4 ;; + esac + case "$usrinc" in + '') + for i in $incpth; do + if $test -f $i/errno.h -a -f $i/stdio.h -a -f $i/time.h; then + usrinc=$i + echo "Guessing usrinc $usrinc." >&4 + break + fi + done + case "$usrinc" in + '') echo "Usrinc not defined." >&4; croak=y ;; + esac + ;; + *) echo "Using usrinc $usrinc." >&4 ;; + esac + case "$targethost" in + '') echo "Targethost not defined." >&4; croak=y ;; + *) echo "Using targethost $targethost." >&4 + esac + locincpth=' ' + loclibpth=' ' + case "$croak" in + y) echo "Cannot continue, aborting." >&4; exit 1 ;; + esac + case "$src" in + /*) run=$src/Cross/run + targetmkdir=$src/Cross/mkdir + to=$src/Cross/to + from=$src/Cross/from + ;; + *) pwd=`$test -f ../Configure & cd ..; pwd` + run=$pwd/Cross/run + targetmkdir=$pwd/Cross/mkdir + to=$pwd/Cross/to + from=$pwd/Cross/from + ;; + esac + case "$targetrun" in + '') targetrun=ssh ;; + esac + case "$targetto" in + '') targetto=scp ;; + esac + case "$targetfrom" in + '') targetfrom=scp ;; + esac + run=$run-$targetrun + to=$to-$targetto + from=$from-$targetfrom + case "$targetdir" in + '') + targetdir=/tmp + echo "Guessing targetdir $targetdir." >&4 + ;; + esac + case "$targetuser" in + '') + targetuser=root + echo "Guessing targetuser $targetuser." >&4 + ;; + esac + case "$targetfrom" in + scp) q=-q ;; + *) q='' ;; + esac + case "$targetrun" in + ssh|rsh) + $cat >$run <&4 + exit 1 + ;; + esac + case "$targetmkdir" in + */Cross/mkdir) + $cat >$targetmkdir <&4 + exit 1 + ;; + esac + case "$targetto" in + scp|rcp) + $cat >$to <$to <&4 + exit 1 + ;; + esac + case "$targetfrom" in + scp|rcp) + $cat >$from <$from <&4 + exit 1 + ;; + esac + if $test ! -f $run; then + echo "Target 'run' script '$run' not found." >&4 + else + $chmod a+rx $run + fi + if $test ! -f $to; then + echo "Target 'to' script '$to' not found." >&4 + else + $chmod a+rx $to + fi + if $test ! -f $from; then + echo "Target 'from' script '$from' not found." >&4 + else + $chmod a+rx $from + fi + if $test ! -f $run -o ! -f $to -o ! -f $from; then + exit 1 + fi + $cat >&4 <&4 + exit 1 +@end + ;; +esac + diff --git a/mcon/U/Csym.U b/mcon/U/Csym.U new file mode 100644 index 0000000..e7c7c4b --- /dev/null +++ b/mcon/U/Csym.U @@ -0,0 +1,97 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Csym.U,v $ +?RCS: Revision 3.0.1.4 1995/07/25 13:36:29 ram +?RCS: patch56: re-arranged compile line to include ldflags before objects +?RCS: patch56: added quotes for OS/2 support +?RCS: +?RCS: Revision 3.0.1.3 1995/05/12 12:00:33 ram +?RCS: patch54: fixed C test program to bypasss gcc builtin type checks (ADO) +?RCS: +?RCS: Revision 3.0.1.2 1994/10/31 09:34:13 ram +?RCS: patch44: added Options to the MAKE line since it's no longer in Init.U +?RCS: +?RCS: Revision 3.0.1.1 1993/08/25 14:00:05 ram +?RCS: patch6: added ldflags as a conditional dependency and to compile line +?RCS: patch6: a final double quote was missing in csym variable after eval +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:50 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:Csym: Options contains libc libs runnm +cc +ccflags +ldflags rm +?MAKE: -pick add $@ %< +?LINT:define csym +?LINT:use libc +?S:csym: +?S: This shell variable is used internally by Configure to check +?S: wether a given C symbol is defined or not. A typical use is: +?S: set symbol result [-fva] [previous] +?S: eval $csym +?S: That will set result to 'true' if the function [-f], variable [-v] +?S: or array [-a] is defined, 'false' otherwise. If a previous value is +?S: given and the -r flag was provided on the command line, that value +?S: is reused without questioning. +?S:. +?V:csym +?T:tval tx tlook tf tdc tc +: is a C symbol defined? +csym='tlook=$1; +case "$3" in +-v) tf=libc.tmp; tc=""; tdc="";; +-a) tf=libc.tmp; tc="[0]"; tdc="[]";; +*) tlook="^$1\$"; tf=libc.list; tc=""; tdc="()";; +esac; +tx=yes; +case "$reuseval-$4" in +true-) ;; +true-*) tx=no; eval "tval=\$$4"; case "$tval" in "") tx=yes;; esac;; +esac; +case "$tx" in +yes) + case "$runnm" in + true) + if $contains $tlook $tf >/dev/null 2>&1; + then tval=true; + else tval=false; + fi;; + *) +?X: +?X: We use 'char' instead of 'int' to try to circumvent overzealous +?X: optimizing compilers using built-in prototypes for commonly used +?X: routines to complain when seeing a different external declaration. For +?X: instance, gcc 2.6.3 fails if we use 'int' and we attempt a test against +?X: memcpy() on machines where sizeof(int) == sizeof(char *) (the usual return +?X: type), the compiler assuming it's a built-in declaration given that the +?X: returned size matches. At least with 'char' we are safe! -- RAM, for ADO +?X: +?X: Let's thank GNU cc for making our lifes so easy! :-) +?X: (An alternative for the future would be to use our knowledge about gcc +?X: to force a -fno-builtin option in the compile test, in case the 'char' +?X: trick is obsoleted by future gcc releases). -- RAM +?X: +?X: Lastly, gcc 3.4 otimizes &missing == 0 away, so we use + 2 instead now. +?X: The GNU folks like to do weird things, don't they? -- RAM, 2004-06-05 +?X: + echo "extern char $1$tdc; int main() { return &$1$tc + 2; }" > t.c; + if $cc $ccflags $ldflags -o t t.c $libs >/dev/null 2>&1; + then tval=true; + else tval=false; + fi; + $rm -f t t.c;; + esac;; +*) + case "$tval" in + $define) tval=true;; + *) tval=false;; + esac;; +esac; +eval "$2=$tval"' + diff --git a/mcon/U/End.U b/mcon/U/End.U new file mode 100644 index 0000000..165b5af --- /dev/null +++ b/mcon/U/End.U @@ -0,0 +1,27 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: End.U,v $ +?RCS: Revision 3.0 1993/08/18 12:04:51 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit serves as the goal which forces make to choose all the units that +?X: ask questions. The $W on the ?MAKE: line is the list of all symbols wanted. +?X: To force any unit to be included, copy this unit to your private U directory +?X: and add the name of the unit desired to the ?MAKE: dependency line. +?X: +?MAKE:End: $W +?MAKE: -pick add $@ %< +?LINT:use $W +: end of configuration questions +echo " " +echo "End of configuration questions." + diff --git a/mcon/U/Extract.U b/mcon/U/Extract.U new file mode 100644 index 0000000..d01d324 --- /dev/null +++ b/mcon/U/Extract.U @@ -0,0 +1,105 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Extract.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 14:58:52 ram +?RCS: patch61: added support for src.U +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 15:51:46 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:52 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit produces a shell script which can be doted in order to extract +?X: .SH files with variable substitutions. +?X: +?X: When running Configure from a remote directory ($src is not '.'), +?X: then the files will be created in that directory, so beware! +?X: +?MAKE:Extract: Mkdirp src +?MAKE: -pick add $@ %< +?F:./extract +?T:CONFIG SRC dir file +: script used to extract .SH files with variable substitutions +cat >extract <>extract <<'EOS' +echo "Doing variable substitutions on .SH files..." +if test -f "$SRC/MANIFEST"; then + set x `awk '{print $1}' <$SRC/MANIFEST | grep '\.SH'` +else + echo "(Looking for .SH files under the source directory.)" + set x `(cd "$SRC"; find . -name "*.SH" -print)` +fi +shift +case $# in +0) set x `(cd "$SRC"; echo *.SH)`; shift;; +esac +if test ! -f "$SRC/$1"; then + shift +fi +for file in $*; do + case "$SRC" in + ".") + case "$file" in + */*) + dir=`expr X$file : 'X\(.*\)/'` + file=`expr X$file : 'X.*/\(.*\)'` + (cd $dir && . ./$file) + ;; + *) + . ./$file + ;; + esac + ;; + *) +?X: +?X: When running Configure remotely ($src is not '.'), we cannot source +?X: the files directly, since that would wrongly cause the extraction +?X: where the source lie instead of withing the current directory. Therefore, +?X: we need to 'sh src -> Options -> Extract +?X: The Begin.U unit now requires us before beginning to do anything +?X: interesting, to ensure proper semantics. -- RAM, 15/03/96 +?X: +?MAKE:Extractall: Extract Options +?MAKE: -pick wipe $@ %< +: extract files and exit if asked to do so +case "$extractsh" in +true) +?X: Undo the forced silent=true when -S was supplied, by probing realsilent +?X: which was set iff -s was also given. See Options.U for details. + case "$realsilent" in + true) ;; + *) exec 1>&4;; + esac + case "$config_sh" in + '') config_sh='config.sh';; + esac + echo " " + echo "Fetching answers from $config_sh..." + cd .. + . $config_sh + test "$override" && . ./optdef.sh + echo " " +?X: extract has to be run from the top directory, not within UU. + . UU/extract + rm -rf UU + echo "Extraction done." + exit 0 + ;; +esac + diff --git a/mcon/U/Filexp.U b/mcon/U/Filexp.U new file mode 100644 index 0000000..7602808 --- /dev/null +++ b/mcon/U/Filexp.U @@ -0,0 +1,69 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Filexp.U,v $ +?RCS: Revision 3.0.1.2 1994/10/29 15:52:53 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: patch36: added HOME to the ?T: line since metalint now checks ${HOME} +?RCS: +?RCS: Revision 3.0.1.1 1994/05/06 14:03:00 ram +?RCS: patch23: made sure error status from csh is propagated (WED) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:53 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit produces a shell script which will expand filenames beginning +?X: with tildes. The script is deleted at the end of Configure. +?X: +?MAKE:Filexp: startsh sed test expr eunicefix +?MAKE: -pick add $@ %< +?F:./filexp +?T:HOME LOGDIR dir me name failed +: set up shell script to do ~ expansion +cat >filexp <&2 + exit 1 + fi + case "\$1" in + */*) + echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\` + ;; + *) + echo \$dir + ;; + esac + fi + ;; +*) + echo \$1 + ;; +esac +EOSS +chmod +x filexp +$eunicefix filexp + diff --git a/mcon/U/Findhdr.U b/mcon/U/Findhdr.U new file mode 100644 index 0000000..50f7ba7 --- /dev/null +++ b/mcon/U/Findhdr.U @@ -0,0 +1,126 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Thomas Neumann +?RCS: +?RCS: $Log: Findhdr.U,v $ +?RCS: Revision 3.0.1.2 1994/10/29 15:53:08 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0.1.1 1994/05/06 14:03:56 ram +?RCS: patch23: cppminus must be after other cppflags, not before +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:54 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit produces a findhdr script which is used to locate the header +?X: files in $usrinc or other stranger places using cpp capabilities. The +?X: script is given an include file base name, like 'stdio.h' or 'sys/file.h' +?X: and it returns the full path of the include file and a zero status or an +?X: empty string with an error status if the file could not be located. +?X: +?MAKE:Findhdr: grep test tr rm +usrinc awk cat startsh \ + cppstdin cppminus +cppflags eunicefix osname +?MAKE: -pick add $@ %< +?LINT:define fieldn +?S:fieldn: +?S: This variable is used internally by Configure. It contains the position +?S: of the included file name in cpp output. That is to say, when cpp +?S: pre-processes a #include line, it replaces it by a # line which +?S: contains the original position in the input file and the full name of +?S: included file, between "quotes". +?S:. +?V:fieldn +?F:./findhdr !fieldn +?T:cline pos wanted name awkprg cppfilter testaccess status usrincdir +: determine filename position in cpp output +echo " " +echo "Computing filename position in cpp output for #include directives..." >&4 +echo '#include ' > foo.c +case "$osname" in +vos) + testaccess=-e +?X: VOS: path component separator is > + cppfilter="tr '\\\\>' '/' |" + ;; +*) + testaccess=-r + cppfilter='' + ;; +esac +$cat >fieldn </dev/null | \ +$grep '^[ ]*#.*stdio\.h' | \ +while read cline; do + pos=1 + set \$cline + while $test \$# -gt 0; do + if $test $testaccess \`echo \$1 | $tr -d '"'\`; then + echo "\$pos" + exit 0 + fi + shift + pos=\`expr \$pos + 1\` + done +done +EOF +chmod +x fieldn +fieldn=`./fieldn` +$rm -f foo.c fieldn +case $fieldn in +'') pos='???';; +1) pos=first;; +2) pos=second;; +3) pos=third;; +*) pos="${fieldn}th";; +esac +echo "Your cpp writes the filename in the $pos field of the line." + +?X: To locate a header file, we cannot simply check for $usrinc/file.h, since +?X: some machine have the headers in weird places and our only hope is that +?X: the C pre-processor will know how to find those headers. Thank you NexT! +: locate header file +$cat >findhdr <" > foo\$\$.c +$cppstdin $cppminus $cppflags < foo\$\$.c 2>/dev/null | \ +$cppfilter $grep "^[ ]*#.*\$wanted" | \ +while read cline; do + name=\`echo \$cline | $awk "\$awkprg" | $tr -d '"'\` + case "\$name" in + *[/\\\\]\$wanted) echo "\$name"; exit 1;; + *[\\\\/]\$wanted) echo "\$name"; exit 1;; + *) exit 2;; + esac +done +?X: status = 0: grep returned 0 lines, case statement not executed +?X: status = 1: headerfile found +?X: status = 2: while loop executed, no headerfile found +status=\$? +$rm -f foo\$\$.c +if test \$status -eq 1; then + exit 0 +fi +exit 1 +EOF +chmod +x findhdr +$eunicefix findhdr + diff --git a/mcon/U/Finish.U b/mcon/U/Finish.U new file mode 100644 index 0000000..2ed7bd9 --- /dev/null +++ b/mcon/U/Finish.U @@ -0,0 +1,141 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Finish.U,v $ +?RCS: Revision 3.0.1.6 1995/02/15 14:09:30 ram +?RCS: patch51: now clearer about how to edit config.sh at the prompt (WED) +?RCS: +?RCS: Revision 3.0.1.5 1994/10/29 15:53:14 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0.1.4 1994/05/06 14:19:37 ram +?RCS: patch23: added blank lines around 'End of Configure' +?RCS: +?RCS: Revision 3.0.1.3 1993/10/16 13:46:09 ram +?RCS: patch12: replaced Config_h by Magic_h in the dependency line +?RCS: +?RCS: Revision 3.0.1.2 1993/09/13 15:45:26 ram +?RCS: patch10: fixed shell evaluation w/o shell escape while in silent mode +?RCS: +?RCS: Revision 3.0.1.1 1993/08/30 08:55:59 ram +?RCS: patch8: prevents myread from blocking on empty answers, exceptionally +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:55 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit is the very last one in the Configure script. It runs all the +?X: SH files, which among other things produce config.h and (usually) Makefile. +?X: It offers to do a make depend if the Makefile contains that target. +?X: +?MAKE:Finish: Chk_MANI Extract Myread Oldsym Magic_h cat rm contains \ + test package make +?MAKE: -pick add $@ %< +?F:!config.sh +?T:pwd +: Finish up by extracting the .SH files +case "$alldone" in +exit) + $rm -rf UU + echo "Extraction done." + exit 0 + ;; +cont) + ;; +'') + dflt='' + nostick=true + $cat <&4 -c "$ans";; + esac + ;; +esac + +: if this fails, just run all the .SH files by hand +. ./config.sh + +?X: +?X: Turn silent mode off from now on (we want a verbose file extraction). +?X: This means we have to explicitely test for '$silent' from now on to +?X: strip off any verbose messages. +?X: +echo " " +exec 1>&4 +pwd=`pwd` +. ./UU/extract +cd "$pwd" + +if $contains '^depend:' [Mm]akefile >/dev/null 2>&1; then + dflt=y + case "$silent" in + true) ;; + *) + $cat < makedepend.out &" +It can take a while, so you might not want to run it right now. + +EOM + ;; + esac + rp="Run $make depend now?" + . UU/myread + case "$ans" in + y*) + $make depend && echo "Now you must run '$make'." + ;; + *) + echo "You must run '$make depend' then '$make'." + ;; + esac +elif test -f [Mm]akefile; then + echo " " + echo "Now you must run a $make." +else + echo "Configure done." +fi + +if $test -f Policy.sh; then + $cat <&4 +fi +?X: +?X: kit*isdone files are left over by shell archives built using the makedist +?X: script which comes from dist, while ark*isdone files are left over by +?X: the cshar archive maker. +?X: +$rm -f kit*isdone ark*isdone +$rm -rf UU + +: End of Configure + diff --git a/mcon/U/Getfile.U b/mcon/U/Getfile.U new file mode 100644 index 0000000..fe917ad --- /dev/null +++ b/mcon/U/Getfile.U @@ -0,0 +1,339 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Getfile.U,v $ +?RCS: Revision 3.0.1.7 1997/02/28 15:01:06 ram +?RCS: patch61: getfile script now begins with "startsh" +?RCS: +?RCS: Revision 3.0.1.6 1995/02/15 14:11:00 ram +?RCS: patch51: was not working if ~'s allowed with d_portable on (WED) +?RCS: +?RCS: Revision 3.0.1.5 1995/01/11 15:11:25 ram +?RCS: patch45: added support for escaping answers to skip various checks +?RCS: patch45: modified message issued after file expansion +?RCS: +?RCS: Revision 3.0.1.4 1994/10/29 15:53:19 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0.1.3 1994/05/06 14:23:36 ram +?RCS: patch23: getfile could be confused by file name in "locate" requests +?RCS: patch23: new 'p' directive to assume file is in people's path (WED) +?RCS: +?RCS: Revision 3.0.1.2 1994/01/24 14:01:31 ram +?RCS: patch16: added metalint hint on changed 'ans' variable +?RCS: +?RCS: Revision 3.0.1.1 1993/09/13 15:46:27 ram +?RCS: patch10: minor format problems and misspellings fixed +?RCS: patch10: now performs from package dir and not from UU subdir +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:56 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit produces a bit of shell code that must be dotted in in order +?X: to get a file name and make some sanity checks. Optionally, a ~name +?X: expansion is performed. +?X: +?X: To use this unit, $rp and $dflt must hold the question and the +?X: default answer, which will be passed as-is to the myread script. +?X: The $fn variable must hold the file type (f or d, for file/directory). +?X: If $gfpth is set to a list of space-separated list of directories, +?X: those are prefixes for the filename. Unless $gfpthkeep is set to 'y', +?X: gfpth is cleared on return from Getfile. +?X: +?X: If is is followed by a ~, then ~name substitution will occur. Upon return, +?X: $ans is set with the filename value. If a / is specified, then only a full +?X: path name is accepted (but ~ substitution occurs before, if needed). The +?X: expanded path name is returned in that case. +?X: +?X: If a + is specified, the existence checks are skipped. This usually means +?X: the file/directory is under the full control of the program. +?X: +?X: If the 'n' (none) type is used, then the user may answer none. +?X: The 'e' (expand) switch may be used to bypass d_portable, expanding ~name. +?X: +?X: If the 'l' (locate) type is used, then it must end with a ':' and then a +?X: file name. If the answer is a directory, the file name will be appended +?X: before testing for file existence. This is useful in locate-style +?X: questions like "where is the active file?". In that case, one should +?X: use: +?X: +?X: dflt='~news/lib' +?X: fn='l~:active' +?X: rp='Where is the active file?' +?X: . ./getfile +?X: active="$ans" +?X: +?X: If the 'p' (path) letter is specified along with 'l', then an answer +?X: without a leading / will be expected to be found in everyone's path. +?X: +?X: It is also possible to include a comma-separated list of items within +?X: parentheses to specify which items should be accepted as-is with no +?X: further checks. This is useful when for instance a full path is expected +?X: but the user may escape out via "magical" answers. +?X: +?X: If the answer to the question is 'none', then the existence checks are +?X: skipped and the empty string is returned. +?X: +?MAKE:Getfile: d_portable contains startsh Myread Filexp tr trnl +?MAKE: -pick add $@ %< +?V:ansexp:fn gfpth gfpthkeep +?F:./getfile +?T:tilde type what orig_rp orig_dflt fullpath already redo skip none_ok \ + value exp_file nopath_ok loc_file fp pf dir direxp +?LINT:change ans +?LINT:change gfpth +: now set up to get a file name +cat <getfile +$startsh +EOS +cat <<'EOSC' >>getfile +tilde='' +fullpath='' +already='' +skip='' +none_ok='' +exp_file='' +nopath_ok='' +orig_rp="$rp" +orig_dflt="$dflt" +case "$gfpth" in +'') gfpth='.' ;; +esac + +?X: Begin by stripping out any (...) grouping. +case "$fn" in +*\(*) + : getfile will accept an answer from the comma-separated list + : enclosed in parentheses even if it does not meet other criteria. + expr "$fn" : '.*(\(.*\)).*' | $tr ',' $trnl >getfile.ok + fn=`echo $fn | sed 's/(.*)//'` + ;; +esac + +?X: Catch up 'locate' requests early, so that we may strip the file name +?X: before looking at the one-letter commands, in case the file name contains +?X: one of them. Reported by Wayne Davison . +case "$fn" in +*:*) + loc_file=`expr $fn : '.*:\(.*\)'` + fn=`expr $fn : '\(.*\):.*'` + ;; +esac + +case "$fn" in +*~*) tilde=true;; +esac +case "$fn" in +*/*) fullpath=true;; +esac +case "$fn" in +*+*) skip=true;; +esac +case "$fn" in +*n*) none_ok=true;; +esac +case "$fn" in +*e*) exp_file=true;; +esac +case "$fn" in +*p*) nopath_ok=true;; +esac + +case "$fn" in +*f*) type='File';; +*d*) type='Directory';; +*l*) type='Locate';; +esac + +what="$type" +case "$what" in +Locate) what='File';; +esac + +case "$exp_file" in +'') + case "$d_portable" in + "$define") ;; + *) exp_file=true;; + esac + ;; +esac + +cd .. +while test "$type"; do + redo='' + rp="$orig_rp" + dflt="$orig_dflt" + case "$tilde" in + true) rp="$rp (~name ok)";; + esac + . UU/myread +?X: check for allowed escape sequence which may be accepted verbatim. + if test -f UU/getfile.ok && \ + $contains "^$ans\$" UU/getfile.ok >/dev/null 2>&1 + then + value="$ans" + ansexp="$ans" + break + fi + case "$ans" in + none) + value='' + ansexp='' + case "$none_ok" in + true) type='';; + esac + ;; + *) + case "$tilde" in + '') value="$ans" + ansexp="$ans";; + *) + value=`UU/filexp $ans` + case $? in + 0) + if test "$ans" != "$value"; then + echo "(That expands to $value on this system.)" + fi + ;; + *) value="$ans";; + esac + ansexp="$value" + case "$exp_file" in + '') value="$ans";; + esac + ;; + esac + case "$fullpath" in + true) +?X: Perform all the checks on ansexp and not value since when d_portable +?X: is defined, the original un-expanded answer which is stored in value +?X: would lead to "non-existent" error messages whilst ansexp has been +?X: properly expanded. -- Fixed by Jan.Djarv@sa.erisoft.se (Jan Djarv) +?X: Always expand ~user if '/' was requested + case "$ansexp" in + /*) value="$ansexp" ;; +?X: Allow for c:/some/path + [a-zA-Z]:/*) value="$ansexp" ;; + *) + redo=true + case "$already" in + true) + echo "I shall only accept a full path name, as in /bin/ls." >&4 + echo "Use a ! shell escape if you wish to check pathnames." >&4 + ;; + *) + echo "Please give a full path name, starting with slash." >&4 + case "$tilde" in + true) + echo "Note that using ~name is ok provided it expands well." >&4 + already=true + ;; + esac + esac + ;; + esac + ;; + esac + case "$redo" in + '') + case "$type" in + File) + for fp in $gfpth; do + if test "X$fp" = X.; then + pf="$ansexp" + else + pf="$fp/$ansexp" + fi + if test -f "$pf"; then + type='' + elif test -r "$pf" || (test -h "$pf") >/dev/null 2>&1 + then + echo "($value is not a plain file, but that's ok.)" + type='' + fi + if test X"$type" = X; then + value="$pf" + break + fi + done + ;; + Directory) + for fp in $gfpth; do + if test "X$fp" = X.; then + dir="$ans" + direxp="$ansexp" + else + dir="$fp/$ansexp" + direxp="$fp/$ansexp" + fi + if test -d "$direxp"; then + type='' + value="$dir" + break + fi + done + ;; + Locate) + if test -d "$ansexp"; then + echo "(Looking for $loc_file in directory $value.)" + value="$value/$loc_file" + ansexp="$ansexp/$loc_file" + fi + if test -f "$ansexp"; then + type='' + fi + case "$nopath_ok" in + true) case "$value" in + */*) ;; + *) echo "Assuming $value will be in people's path." + type='' + ;; + esac + ;; + esac + ;; + esac + + case "$skip" in + true) type=''; + esac + + case "$type" in + '') ;; + *) + if test "$fastread" = yes; then + dflt=y + else + dflt=n + fi + rp="$what $value doesn't exist. Use that name anyway?" + . UU/myread + dflt='' + case "$ans" in + y*) type='';; + *) echo " ";; + esac + ;; + esac + ;; + esac + ;; + esac +done +cd UU +ans="$value" +rp="$orig_rp" +dflt="$orig_dflt" +rm -f getfile.ok +test "X$gfpthkeep" != Xy && gfpth="" +EOSC + diff --git a/mcon/U/Guess.U b/mcon/U/Guess.U new file mode 100644 index 0000000..3459325 --- /dev/null +++ b/mcon/U/Guess.U @@ -0,0 +1,228 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Guess.U,v $ +?RCS: Revision 3.0.1.5 1995/07/25 13:37:14 ram +?RCS: patch56: now knows about OS/2 platforms +?RCS: +?RCS: Revision 3.0.1.4 1994/10/29 15:53:55 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: patch36: call ./xenix explicitely instead of relying on PATH +?RCS: +?RCS: Revision 3.0.1.3 1993/12/15 08:14:35 ram +?RCS: patch15: variable d_bsd was not always set properly +?RCS: +?RCS: Revision 3.0.1.2 1993/08/30 08:57:14 ram +?RCS: patch8: fixed comment which wrongly attributed the usrinc symbol +?RCS: patch8: no more ugly messages when no /usr/include/ctype.h +?RCS: +?RCS: Revision 3.0.1.1 1993/08/27 14:37:37 ram +?RCS: patch7: added support for OSF/1 machines +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:57 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit hazards some guesses as to what the general nature of the system +?X: is. The information it collects here is used primarily to establish default +?X: answers to other questions. +?X: +?MAKE:Guess d_eunice d_xenix d_bsd d_linux d_dos d_os2: cat test echo n c \ + contains rm tr Loc eunicefix +?MAKE: -pick add $@ %< +?S:d_eunice: +?S: This variable conditionally defines the symbols EUNICE_SYSTEM, which +?S: alerts the C program that it must deal with ideosyncracies of VMS. +?S:. +?S:d_xenix: +?S: This variable conditionally defines the symbol XENIX_SYSTEM, which alerts +?S: the C program that it runs under Xenix. +?S:. +?S:d_dos: +?S: This symbol conditionally defines the symbol DOS_SYSTEM when running on +?S: DOS with DJGPP or Cygwin. +?S:. +?S:d_os2: +?S: This symbol conditionally defines the symbol OS2_SYSTEM when running on +?S: an OS/2 system. +?S:. +?S:d_bsd: +?S: This symbol conditionally defines the symbol BSD_SYSTEM when running on a +?S: BSD system. +?S:. +?S:d_linux: +?S: This symbol conditionally defines the symbol LINUX_SYSTEM when running +?S: on a Linux system. +?S:. +?C:EUNICE_SYSTEM (EUNICE): +?C: This symbol, if defined, indicates that the program is being compiled +?C: under the EUNICE package under VMS. The program will need to handle +?C: things like files that don't go away the first time you unlink them, +?C: due to version numbering. It will also need to compensate for lack +?C: of a respectable link() command. +?C:. +?C:VMS_SYSTEM (VMS): +?C: This symbol, if defined, indicates that the program is running under +?C: VMS. It is currently only set in conjunction with the EUNICE symbol. +?C:. +?C:XENIX_SYSTEM (XENIX): +?C: This symbol, if defined, indicates that the program is running under +?C: Xenix (at least 3.0 ?). +?C:. +?C:DOS_SYSTEM: +?C: This symbol, if defined, indicates that the program is running under +?C: DOS with DJGPP. +?C:. +?C:OS2_SYSTEM: +?C: This symbol, if defined, indicates that the program is running under +?C: an OS/2 system. +?C:. +?C:BSD_SYSTEM: +?C: This symbol, if defined, indicates that the program is running under +?C: a BSD system. +?C:. +?C:LINUX_SYSTEM: +?C: This symbol, if defined, indicates that the program is running under +?C: a Linux system. +?C:. +?H:#$d_eunice EUNICE_SYSTEM /**/ +?H:#$d_eunice VMS_SYSTEM /**/ +?H:#$d_xenix XENIX_SYSTEM /**/ +?H:#$d_dos DOS_SYSTEM /**/ +?H:#$d_os2 OS2_SYSTEM /**/ +?H:#$d_bsd BSD_SYSTEM /**/ +?H:#$d_linux LINUX_SYSTEM /**/ +?H:. +?F:./bsd ./usg ./v7 ./osf1 ./eunice ./xenix ./venix ./dos ./os2 ./gnu ./linux +?T:xxx DJGPP MACHTYPE +: make some quick guesses about what we are up against +echo " " +$echo $n "Hmm... $c" +echo exit 1 >bsd +echo exit 1 >usg +echo exit 1 >v7 +echo exit 1 >osf1 +echo exit 1 >eunice +echo exit 1 >xenix +echo exit 1 >venix +echo exit 1 >os2 +echo exit 1 >gnu +echo exit 1 >linux +echo exit 1 >dos +d_bsd="$undef" +d_linux="$undef" +d_dos="$undef" +d_os2="$undef" +?X: +?X: Do not use 'usrinc', or we get a circular dependency. because +?X: usrinc is defined in usrinc.U, which relies on us... +?X: +$cat /usr/include/signal.h /usr/include/sys/signal.h >foo 2>/dev/null +if test -f /osf_boot || $contains 'OSF/1' /usr/include/ctype.h >/dev/null 2>&1 +then + echo "Looks kind of like an OSF/1 system, but we'll see..." + echo exit 0 >osf1 +elif test `echo abc | $tr a-z A-Z` = Abc ; then + xxx=`./loc addbib blurfl $pth` + if $test -f $xxx; then + echo "Looks kind of like a USG system with BSD features, but we'll see..." + echo exit 0 >bsd + echo exit 0 >usg + else + if $contains SIGTSTP foo >/dev/null 2>&1 ; then + echo "Looks kind of like an extended USG system, but we'll see..." + else + echo "Looks kind of like a USG system, but we'll see..." + fi + echo exit 0 >usg + fi +elif $contains SIGTSTP foo >/dev/null 2>&1 ; then + echo "Looks kind of like a BSD system, but we'll see..." + d_bsd="$define" + echo exit 0 >bsd +elif + $rm --version 2>/dev/null >foo; + $contains "Free Software Foundation" foo >/dev/null +then + xxx=`uname` + echo exit 0 >gnu + echo "Looks kind of like a GNU/$xxx system, but we'll see..." + if $test X$xxx = XLinux; then + d_linux="$define" + echo exit 0 >linux + fi +else + echo "Looks kind of like a Version 7 system, but we'll see..." + echo exit 0 >v7 +fi +case "$eunicefix" in +*unixtovms*) + $cat <<'EOI' +There is, however, a strange, musty smell in the air that reminds me of +something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit. +EOI + echo exit 0 >eunice + d_eunice="$define" +: it so happens the Eunice I know will not run shell scripts in Unix format + ;; +*) + echo " " + echo "Congratulations. You aren't running Eunice." + d_eunice="$undef" + ;; +esac +case "$p_" in +:) ;; +*) + $cat <<'EOI' +I have the feeling something is not exactly right, however...don't tell me... +EOI + if test -n "$DJGPP"; then + case "X${MACHTYPE:-nonesuchmach}" in + cygwin) echo "hah!... you're running under Cygwin!";; + *) echo "got it... you're running DOS with DJGPP!";; + esac + echo exit 0 >dos + d_dos="$define" + else + $cat <<'EOI' +lemme think...does HAL ring a bell?...no, of course, you're only running OS/2! +EOI + echo exit 0 >os2 + d_os2="$define" + fi + ;; +esac +if test -f /xenix; then + echo "Actually, this looks more like a XENIX system..." + echo exit 0 >xenix + d_xenix="$define" +else + echo " " + echo "It's not Xenix..." + d_xenix="$undef" +fi +chmod +x xenix +$eunicefix xenix +if test -f /venix; then + echo "Actually, this looks more like a VENIX system..." + echo exit 0 >venix +else + echo " " + if ./xenix; then + : null + else + echo "Nor is it Venix..." + fi +fi +chmod +x bsd usg v7 osf1 eunice xenix venix dos os2 gnu linux +$eunicefix bsd usg v7 osf1 eunice xenix venix dos os2 gnu linux +$rm -f foo + diff --git a/mcon/U/Head.U b/mcon/U/Head.U new file mode 100644 index 0000000..1ee0e6b --- /dev/null +++ b/mcon/U/Head.U @@ -0,0 +1,282 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Head.U,v $ +?RCS: Revision 3.0.1.9 1997/02/28 15:02:09 ram +?RCS: patch61: make sure we unset CDPATH for shells that support this +?RCS: patch61: improved Korn shell detection and handling +?RCS: +?RCS: Revision 3.0.1.8 1995/07/25 13:40:02 ram +?RCS: patch56: added SVR4-ish /opt directories to path list (ADO) +?RCS: patch56: OS/2 platforms are using another path separator +?RCS: +?RCS: Revision 3.0.1.7 1995/03/21 08:46:15 ram +?RCS: patch52: definition of paths wrongly added spurious ':' chars +?RCS: +?RCS: Revision 3.0.1.6 1994/10/29 15:54:19 ram +?RCS: patch36: make sure ENV is unset before calling /bin/ksh +?RCS: +?RCS: Revision 3.0.1.5 1994/08/29 16:03:44 ram +?RCS: patch32: now sets PATH only using existing directories +?RCS: +?RCS: Revision 3.0.1.4 1994/06/20 06:54:28 ram +?RCS: patch30: now computes its invocation name into 'me' +?RCS: patch30: symbol me is made visible to all units read-only +?RCS: +?RCS: Revision 3.0.1.3 1993/12/15 08:15:07 ram +?RCS: patch15: added /sbin:/usr/sbin:/usr/libexec in PATH for BSD/386 +?RCS: +?RCS: Revision 3.0.1.2 1993/11/10 17:32:35 ram +?RCS: patch14: ensure PATH is reset to '.' before testing for alias +?RCS: +?RCS: Revision 3.0.1.1 1993/08/27 14:38:07 ram +?RCS: patch7: not all 'test' programs support the -x option +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:58 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This is the very first unit in the Configure script. It is mostly just +?X: things to keep people from getting into a tizzy right off the bat. +?X: +?MAKE:Head: +?MAKE: -pick wipe $@ %< +?V:PATH p_ _exe me newsh +?T:argv Id p paths OS2_SHELL DJGPP +?T:inksh needksh avoidksh newsh changesh reason +?F:!* +?LINT:extern ENV CDPATH SHELL MACHTYPE +?LINT:change ENV CDPATH +?LINT:nocomment +#! /bin/sh +# +# If these # comments don't work, trim them. Don't worry about any other +# shell scripts, Configure will trim # comments from them for you. +# +# (If you are trying to port this package to a machine without sh, +# I would suggest you have a look at the prototypical config_h.SH file +# and edit it to reflect your system. Some packages may include samples +# of config.h for certain machines, so you might look for one of those.) +# +?X: +?X: NOTE THAT A CONFIGURE SCRIPT IS IN THE PUBLIC DOMAIN (whether or not +?X: the software which uses it is in the public domain). +?X: +# Yes, you may rip this off to use in other distribution packages. This +# script belongs to the public domain and cannot be copyrighted. +# +?X: +?X: WE ASK YOU NOT TO REMOVE OR ALTER THE FOLLOWING PARAGRAPH, PLEASE: +?X: +# Note: this Configure script was generated automatically. Rather than +# working with this copy of Configure, you may wish to get metaconfig. +# The dist package (which contains metaconfig) is available at +# http://sourceforge.net/projects/dist/ +?X: +?X: NOTA BENE: +?X: If you develop you own version of metaconfig based on this work, +?X: you have to add some comments telling that the script was generated +?X: by your version, not mine: It credits your work. +?X: + +# $Id$ +# +# Generated on [metaconfig PL] + +cat >c1$$ <c2$$ </dev/null` + test "$me" || me=$0 + ;; +esac + +?X: +?X: To be able to run under OS/2, we must detect that early enough to use +?X: the proper path separator, stored in $p_. It is : on UNIX and ; on +?X: DOSish systems such as OS/2. +?X: +: Proper separator for the PATH environment variable +p_=: +: On OS/2 this directory should exist if this is not floppy only system ":-]" +if test -d c:/. ; then + if test -n "$OS2_SHELL"; then + p_=\; + PATH=`cmd /c "echo %PATH%" | tr '\\\\' / ` +?X: That's a bug in ksh5.22 + OS2_SHELL=`cmd /c "echo %OS2_SHELL%" | tr '\\\\' / | tr '[A-Z]' '[a-z]'` + elif test -n "$DJGPP"; then + case "X${MACHTYPE:-nonesuchmach}" in + *cygwin) ;; + *) p_=\; ;; + esac + fi +fi + +?X: +?X: There are two schools of thoughts here. Some people correctly argue that +?X: the user has a better chance than we do of setting a reasonable PATH and +?X: others argue that Configure is the best place there is to set up a suitable +?X: PATH. Well, here we try to compromize by keeping the user's PATH and +?X: appending some directories which are known to work on some machine or the +?X: other. The rationale behind this being that a novice user might not have a +?X: proper environment variable set, and some directories like /etc (where +?X: chown is located on some BSD systems) may be missing--RAM. +?X: +?X: SVR4 adds an /opt directory for optional packages. Some sites use +?X: various permutations on /opt as opposed to /usr or /usr/local.-- ADO +?X: +?X: We only add directories that are not already in the PATH of the +?X: user and the directories must exist also. +?X: +: Proper PATH setting +paths='/bin /usr/bin /usr/local/bin /usr/ucb /usr/local /usr/lbin' +paths="$paths /opt/bin /opt/local/bin /opt/local /opt/lbin" +paths="$paths /usr/5bin /etc /usr/gnu/bin /usr/new /usr/new/bin /usr/nbin" +paths="$paths /opt/gnu/bin /opt/new /opt/new/bin /opt/nbin" +paths="$paths /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/ucb" +paths="$paths /bsd4.3/usr/bin /usr/bsd /bsd43/bin /usr/ccs/bin" +paths="$paths /etc /usr/lib /usr/ucblib /lib /usr/ccs/lib" +paths="$paths /sbin /usr/sbin /usr/libexec" +paths="$paths /system/gnu_library/bin" + +for p in $paths +do + case "$p_$PATH$p_" in + *$p_$p$p_*) ;; + *) test -d $p && PATH=$PATH$p_$p ;; + esac +done + +PATH=.$p_$PATH +export PATH + +: shall we be using ksh? +inksh='' +needksh='' +avoidksh='' +newsh=/bin/ksh +changesh='' +?X: Use (alias -x) and not (alias) since zsh and bash recognize the alias +?X: builtin but not the -x option which is typically ksh... +?X: We need to set up PATH before calling the "alias" built-in since some +?X: systems like HP-UX have a binary called /bin/alias. +if (PATH=.; alias -x) >/dev/null 2>&1; then + inksh=true +fi +?X: On HP-UX, large Configure scripts may exercise a bug in /bin/sh, use ksh +if test -f /hp-ux -a -f /bin/ksh; then + needksh='to avoid sh bug in "here document" expansion' +fi +?X: On AIX4, /bin/sh is really ksh and it causes problems, use sh +if test -d /usr/lpp -a -f /usr/bin/bsh -a -f /usr/bin/uname; then + if test X`/usr/bin/uname -v` = X4; then + avoidksh="to avoid AIX 4's /bin/sh" + newsh=/usr/bin/bsh + fi +fi +?X: On Digital UNIX, /bin/sh may start up buggy /bin/ksh, use sh +if test -f /osf_boot -a -f /usr/sbin/setld; then + if test X`/usr/bin/uname -s` = XOSF1; then + avoidksh="to avoid Digital UNIX' ksh" + newsh=/bin/sh +?X: if BIN_SH is set to 'xpg4', sh will start up ksh + unset BIN_SH + fi +fi +?X: If we are not in ksh and need it, then feed us back to it +case "$inksh/$needksh" in +/[a-z]*) +?X: Clear ENV to avoid any ~/.kshrc that could alias cd or whatever... +?X: Don't use "unset ENV", that is not portable enough + ENV='' + changesh=true + reason="$needksh" + ;; +esac +?X: If we are in ksh and must avoid it, then feed us back to a new shell +case "$inksh/$avoidksh" in +true/[a-z]*) + changesh=true + reason="$avoidksh" + ;; +esac +?X: Warn them if they use ksh on other systems, which are those where +?X: we don't need ksh nor want to avoid it explicitely, yet are using it. +case "$inksh/$needksh-$avoidksh-" in +true/--) + cat </dev/null` +case "$user" in +'') user=`whoami 2>&1`;; +esac +if $contains "^$user\$" ../.config/instruct >/dev/null 2>&1; then + firsttime=false + echo " " + rp='Would you like to see the instructions?' + dflt=n + . ./myread + case "$ans" in + [yY]*) ;; + *) needman=false;; + esac +fi +if $needman; then + cat < package should be installed. If you get +stuck on a question, you may use a ! shell escape to start a subshell or +execute a command. Many of the questions will have default answers in square +brackets; typing carriage return will give you the default. + +On some of the questions which ask for file or directory names you are allowed +to use the ~name construct to specify the login directory belonging to "name", +even if you don't have a shell which knows about that. Questions where this is +allowed will be marked "(~name ok)". + +EOH + rp='' + dflt='Type carriage return to continue' + . ./myread + cat <<'EOH' + +The prompter used in this script allows you to use shell variables and +backticks in your answers. You may use $1, $2, etc... to refer to the words +in the default answer, as if the default line was a set of arguments given to a +script shell. This means you may also use $* to repeat the whole default line, +so you do not have to re-type everything to add something to the default. + +Everytime there is a substitution, you will have to confirm. If there is an +error (e.g. an unmatched backtick), the default answer will remain unchanged +and you will be prompted again. + +If you are in a hurry, you may run 'Configure -d'. This will bypass nearly all +the questions and use the computed defaults (or the previous answers if there +was already a config.sh file). Type 'Configure -h' for a list of options. +You may also start interactively and then answer '& -d' at any prompt to turn +on the non-interactive behaviour for the remainder of the execution. + +EOH + . ./myread + cat <) know how I blew it. + +This installation script affects things in two ways: + +1) it may do direct variable substitutions on some of the files included + in this kit. +2) it builds a config.h file for inclusion in C programs. You may edit + any of these files as the need arises after running this script. + +If you make a mistake on a question, there is no easy way to back up to it +currently. The easiest thing to do is to edit config.sh and rerun all the SH +files. Configure will offer to let you do this before it runs the SH files. + +EOH +?X: In case they played with the prompter... + dflt='Type carriage return to continue' + . ./myread + case "$firsttime" in + true) echo $user >>../.config/instruct;; + esac +fi + diff --git a/mcon/U/Loc.U b/mcon/U/Loc.U new file mode 100644 index 0000000..bf8c056 --- /dev/null +++ b/mcon/U/Loc.U @@ -0,0 +1,381 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Loc.U,v $ +?RCS: Revision 3.0.1.10 1997/02/28 15:04:16 ram +?RCS: patch61: allow users to specify paths on the command line +?RCS: patch61: will now substitute cp for ln if not supported +?RCS: +?RCS: Revision 3.0.1.9 1995/09/25 09:11:24 ram +?RCS: patch59: commented the purpose of the #un-def directive +?RCS: patch59: abort Configure run when mandatory command is missing +?RCS: +?RCS: Revision 3.0.1.8 1995/07/25 13:40:40 ram +?RCS: patch56: now knows about OS/2 platforms +?RCS: +?RCS: Revision 3.0.1.7 1995/01/11 15:13:37 ram +?RCS: patch45: protected "sh -c" within backquotes for Linux and SGI +?RCS: patch45: added path lookup for the 'comm' program +?RCS: +?RCS: Revision 3.0.1.6 1994/10/29 15:56:14 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: patch36: be careful and guard against wildcard searching (ADO) +?RCS: +?RCS: Revision 3.0.1.5 1994/06/20 06:54:55 ram +?RCS: patch30: now locates find +?RCS: +?RCS: Revision 3.0.1.4 1994/05/13 15:18:15 ram +?RCS: patch27: added byacc to the trylist (ADO) +?RCS: patch27: lint lines reformatted (ADO) +?RCS: +?RCS: Revision 3.0.1.3 1994/01/24 14:01:44 ram +?RCS: patch16: added metalint hint on changed PATH variable +?RCS: +?RCS: Revision 3.0.1.2 1993/12/15 08:16:52 ram +?RCS: patch15: now set _test variable when test is built-in +?RCS: patch15: fixed rare cases where echo is not needed +?RCS: +?RCS: Revision 3.0.1.1 1993/09/13 15:47:13 ram +?RCS: patch10: test program not always in /bin/test (WAD) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:05 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit produces a shell script "loc" which can be used to find out +?X: where in a list of directories something is. It then uses loc to +?X: determine the location of commonly used programs. It leaves loc sitting +?X: around for other Configure units to use, but arranges for its demise +?X: at the end of Configure. +?X: +?X: To add a new program to find, add it both to the ?MAKE: line and to either +?X: the loclist or trylist variable. +?X: +?X: I put startsh at the end of the dependency list, in order to avoid the +?X: loading of the spitshell unit before the instructions. +?X: +?MAKE:Loc Mcc awk ar bash bison byacc cat chgrp chmod chown \ + comm compress cp cpio cpp csh date echo egrep emacs expr find flex \ + gmake gzip grep inews ksh less line lint ln lp lpr ls mail mailx \ + make mkdir more mv nm nroff perl pg pmake pr rm rmail sed sendmail \ + shar sleep smail sort submit tail tar tbl tee test touch tr troff \ + uname uniq uuname vi zcat zip: eunicefix n c startsh Instruct Warn +?MAKE: -pick weed $@ %< +?LINT: describe Mcc awk ar bash bison byacc cat chgrp chmod chown \ + comm compress cp cpio cpp csh date echo egrep emacs expr find flex \ + gmake gzip grep inews ksh less line lint ln lp lpr ls mail mailx \ + make mkdir more mv nm nroff perl pg pmake pr rm rmail sed sendmail \ + shar sleep smail sort submit tail tar tbl tee test touch tr troff \ + uname uniq uuname vi zcat zip +?V::pth loclist trylist +?F:./loc +?T:thisthing thing xxx dir file say DJGPP +?T:_test _grep _cp _gmake _egrep _ln _make dflt +?LINT: change PATH +: find out where common programs are +echo " " +echo "Locating common programs..." >&4 +cat <loc +$startsh +case \$# in +0) exit 1;; +esac +thing=\$1 +shift +dflt=\$1 +shift +for dir in \$*; do + case "\$thing" in + .) + if test -d \$dir/\$thing; then + echo \$dir + exit 0 + fi + ;; + *) +?X: Be careful in case thing includes wildcards that might expand to multiple +?X: files. Choose the last one. This happens when searching for shared +?X: libraries with version numbers. How to choose which one we want is +?X: probably an insoluble problem, in general. +?X: Some folks leave things like libc.so.orig around w/o read +?X: permission. A -r test would handle that, but since ./loc is +?X: also used to find executables (which are installed w/o read +?X: permission on SCO ODT 3.0, we can't include the -r test. + for thisthing in \$dir/\$thing; do + : just loop through to pick last item + done + if test -f \$thisthing; then + echo \$thisthing + exit 0 + elif test -f \$thisthing$_exe; then + echo \$thisthing + exit 0 + elif test -f \$dir/\$thing.exe; then + if test -n "$DJGPP"; then + echo \$dir/\$thing.exe + else + : on Eunice apparently + echo \$dir/\$thing + fi + exit 0 + fi + ;; + esac +done +echo \$dflt +exit 1 +EOSC +chmod +x loc +$eunicefix loc +loclist=" +?awk:awk +?cat:cat +?chgrp:chgrp +?chmod:chmod +?chown:chown +?comm:comm +?cp:cp +?echo:echo +?expr:expr +?find:find +?grep:grep +?ls:ls +?mkdir:mkdir +?mv:mv +?rm:rm +?sed:sed +?sleep:sleep +?sort:sort +?tail:tail +?touch:touch +?tr:tr +?uniq:uniq +" +trylist=" +?Mcc:Mcc +?ar:ar +?bash:bash +?bison:bison +?byacc:byacc +?compress:compress +?cpio:cpio +?cpp:cpp +?csh:csh +?date:date +?egrep:egrep +?emacs:emacs +?flex:flex +?gmake:gmake +?gzip:gzip +?inews:inews +?ksh:ksh +?less:less +?line:line +?lint:lint +?ln:ln +?lp:lp +?lpr:lpr +?mail:mail +?mailx:mailx +?make:make +?more:more +?nm:nm +?nroff:nroff +?perl:perl +?pg:pg +?pmake:pmake +?pr:pr +?rmail:rmail +?sendmail:sendmail +?shar:shar +?smail:smail +?submit:submit +?tar:tar +?tbl:tbl +?tee:tee +?test:test +?troff:troff +?uname:uname +?uuname:uuname +?vi:vi +?zcat:zcat +?zip:zip +" +?LINT: set awk ar bash bison byacc cat chgrp chmod chown \ + comm compress cp cpio cpp csh date echo emacs expr find flex \ + gmake gzip grep inews ksh less line lint lp lpr ls mail mailx \ + mkdir more mv nm nroff perl pg pmake pr rm rmail sed sendmail \ + shar sleep smail sort submit tail tar tbl tee touch tr troff \ + uname uniq uuname vi zcat zip +pth=`echo $PATH | sed -e "s/$p_/ /g"` +pth="$pth /lib /usr/lib" +for file in $loclist; do +?X: +?X: Allow them to -Dmake=pmake on the command line for instance... +?X: If the file is not fully qualified, as in -Dmake=pmake, then we +?X: look the for the specified command (pmake here). If they say +?X: -Dmake=/sbin/make for instance, then we make sure the file +?X: exists, or we die... +?X: + eval xxx=\$$file + case "$xxx" in + /*|?:[\\/]*) + if test -f "$xxx"; then + : ok + else + ./warn "no $xxx -- ignoring your setting for $file." + xxx=`./loc $file $file $pth` + fi + ;; + '') xxx=`./loc $file $file $pth`;; + *) xxx=`./loc $xxx $xxx $pth`;; + esac + eval $file=$xxx$_exe + eval _$file=$xxx + case "$xxx" in + /*) + echo $file is in $xxx. + ;; +?X: Under OS/2, we have PC-like paths + ?:[\\/]*) + echo $file is in $xxx. + ;; + *) + echo "I don't know where '$file' is, and my life depends on it." >&4 + echo "Go find a public domain implementation or fix your PATH setting!" >&4 + exit 1 + ;; + esac +done +echo " " +echo "Don't worry if any of the following aren't found..." +say=offhand +for file in $trylist; do +?X: Allow them to -Dmake=pmake on the command line for instance (see above) + eval xxx=\$$file + case "$xxx" in + /*|?:[\\/]*) + if test -f "$xxx"; then + : ok + else + ./warn "no $xxx -- ignoring your setting for $file." + xxx=`./loc $file $file $pth` + fi + ;; + '') xxx=`./loc $file $file $pth`;; + *) xxx=`./loc $xxx $xxx $pth`;; + esac + eval $file=$xxx$_exe + eval _$file=$xxx + case "$xxx" in + /*) + echo $file is in $xxx. + ;; +?X: Under OS/2, we have PC-like paths + ?:[\\/]*) + echo $file is in $xxx. + ;; + *) + echo "I don't see $file out there, $say." + say=either + ;; + esac +done +case "$egrep" in +egrep) + echo "Substituting grep for egrep." + egrep=$grep + _egrep=$_grep + ;; +esac +@if ln +case "$ln" in +ln) + echo "Substituting cp for ln." + ln=$cp + _ln=$_cp + ;; +esac +@end +@if make || gmake +case "$make" in +make) + case "$gmake" in + gmake) + echo "I can't find make or gmake, and my life depends on it." >&4 + echo "Go find a public domain implementation or fix your PATH setting!" >&4 + exit 1 + ;; + esac + ;; +esac +case "$gmake" in +gmake) ;; +*) # We can't have osname yet. + if test -f "/system/gnu_library/bin/ar.pm"; then # Stratus VOS + # Assume that gmake, if found, is definitely GNU make + # and prefer it over the system make. + echo "Substituting gmake for make." + make=$gmake + _make=$_gmake + fi + ;; +esac +@end +case "$test" in +test) + echo "Hopefully test is built into your sh." + ;; +*) + if `sh -c "PATH= test true" >/dev/null 2>&1`; then + echo "Using the test built into your sh." +?X: +?X: We need to set both test and _test, since Oldconfig.U will use the _test +?X: value to systematically restore computed paths, which may be wrong if +?X: we choose to load an old config.sh generated on another platform. +?X: + test=test + _test=test + fi + ;; +esac +?LINT:change n c +case "$echo" in +echo) + echo "Hopefully echo is built into your sh." + ;; +?X: For those rare cases where we don't need $echo... +'') ;; +*) + echo " " +echo "Checking compatibility between $echo and builtin echo (if any)..." >&4 + $echo $n "hi there$c" >foo1 + echo $n "hi there$c" >foo2 + if cmp foo1 foo2 >/dev/null 2>&1; then + echo "They are compatible. In fact, they may be identical." + else + case "$n" in + '-n') n='' c='\c';; + *) n='-n' c='';; + esac + cat <$c" + $echo "*" + fi + $rm -f foo1 foo2 + ;; +esac + diff --git a/mcon/U/Loc_sed.U b/mcon/U/Loc_sed.U new file mode 100644 index 0000000..f61a876 --- /dev/null +++ b/mcon/U/Loc_sed.U @@ -0,0 +1,33 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1996, Andy Dougherty +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?X: This is used in perl.c. +?MAKE:full_sed: sed +?MAKE: -pick add $@ %< +?S:full_sed: +?S: This variable contains the full pathname to 'sed', whether or +?S: not the user has specified 'portability'. This is only used +?S: in the compiled C program, and we assume that all systems which +?S: can share this executable will have the same full pathname to +?S: 'sed.' +?S:. +?X: Yes, I know about the C symbol PORTABLE, but I think sed +?X: is unlikely to move, and I'm too lazy to add all the +?X: #ifdef PORTABLE sections to the perl source. +?X: +?C:LOC_SED: +?C: This symbol holds the complete pathname to the sed program. +?C:. +?H:#define LOC_SED "$full_sed" /**/ +?H:. +: Store the full pathname to the sed program for use in the C program +full_sed=$sed + diff --git a/mcon/U/Magic_h.U b/mcon/U/Magic_h.U new file mode 100644 index 0000000..8e2556c --- /dev/null +++ b/mcon/U/Magic_h.U @@ -0,0 +1,43 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Magic_h.U,v $ +?RCS: Revision 3.0.1.2 1993/11/10 17:32:58 ram +?RCS: patch14: forgot to mention Id in the dependencies +?RCS: +?RCS: Revision 3.0.1.1 1993/10/16 13:46:59 ram +?RCS: patch12: created for ?M: lines support (magic symbols) +?RCS: +?X: +?X: This file ends up producing the confmagic.h include, which is used to +?X: automagically remap some C symbols via cpp redefinitions. +?X: +?X: The file ./Magic_h below contains all the ?M: lines extracted out of all +?X: the units. Metaconfig itself adds the final #endif statement. +?X: Note that this code isn't included into Configure, but must be shipped with. +?X: +?MAKE:Magic_h: Id Config_h +?MAKE: -pick cm_h_weed $@ %< +?MAKE: -pick cm_h_weed $@ ./Magic_h +?LINT:nocomment +/* + * This file was produced by running metaconfig and is intended to be included + * after config.h and after all the other needed includes have been dealt with. + * + * This file may be empty, and should not be edited. Rerun metaconfig instead. + * If you wish to get rid of this magic, remove this file and rerun metaconfig + * without the -M option. + * + * $Id$ + */ + +#ifndef _confmagic_h_ +#define _confmagic_h_ + diff --git a/mcon/U/MailAuthor.U b/mcon/U/MailAuthor.U new file mode 100644 index 0000000..61c226a --- /dev/null +++ b/mcon/U/MailAuthor.U @@ -0,0 +1,192 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Graham Stoney +?RCS: +?RCS: $Log: MailAuthor.U,v $ +?RCS: Revision 3.0.1.5 1997/02/28 15:04:41 ram +?RCS: patch61: added support for src.U +?RCS: +?RCS: Revision 3.0.1.4 1994/08/29 16:05:09 ram +?RCS: patch32: avoid message sending if they said no previously +?RCS: +?RCS: Revision 3.0.1.3 1993/10/16 13:47:30 ram +?RCS: patch12: now makes sure user-specified address is in Internet format +?RCS: +?RCS: Revision 3.0.1.2 1993/09/13 15:48:49 ram +?RCS: patch10: reverted to original intent by the Author himself +?RCS: +?RCS: Revision 3.0.1.1 1993/08/27 14:38:38 ram +?RCS: patch7: now prompts user for its e-mail address +?RCS: patch7: no longer silent when mail has been sent +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:06 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?RCS: +?X: +?X: This unit asks the user to please send a message to the author. +?X: To force inclusion of this unit, you must add it's name to the +?X: dependancies on the MAKE line in your private copy of End.U. +?X: This allows a smart mailagent program to automatically let users know +?X: when their package is out of date, and to allow users to be notified of +?X: any future patches. +?X: +?MAKE:MailAuthor mailpatches notifypatches usermail: test cat mailer \ + package Myread patchlevel baserev rm rsrc Oldconfig Configdir +?MAKE: -pick wipe $@ %< +?S:mailpatches: +?S: Indicates whether the user would like future patches to be mailed +?S: directly to them. +?S:. +?S:notifypatches: +?S: Indicates whether the user would like notification of future patches +?S: mailed to them. +?S:. +?S:usermail: +?S: This variable is used internally by Configure to keep track of the +?S: user e-mail address, where notifications or patches should be sent. +?S: A '-' value means the return address will be extracted by parsing +?S: the mail headers. +?S:. +?T:opt mailpatches notifypatches atsh status +: notify author that his package is used +if $test -f ../.config/mailauthor && + cmp $rsrc/patchlevel.h ../.config/mailauthor >/dev/null 2>&1 +then + status="say that you're using $package"; + case "$mailpatches" in + true) status='have patches mailed to you as they are issued';; + esac + case "$notifypatches" in + true) status='be notified when new patches are issued';; + esac + $cat <) mail to +$status. If you wish, you may modify +your previous request by sending a new mail with different options. + +EOM + rp='Should I send a status update to ?' + dflt=n +else + $cat <..." >&4 +?X: Bizarre hack here. We can't just put @SH in the hereis lines below, because +?X: metaconfig will interpret it as a command, and there's no quoting mechanism. +?X: Do it via a variable instead. + atsh='@SH' + $mailer </dev/null 2>&1 +Subject: Command +Precedence: junk +To: + +$atsh package $usermail $package $baserev $patchlevel$opt +EOM + $rm -f ../.config/mailauthor ../.config/nomail + cp $rsrc/patchlevel.h ../.config/mailauthor + ;; +*) + case "$dflt" in + "y") + echo "Oh well, maybe next time." + cp /dev/null ../.config/nomail + ;; + esac + ;; +esac + diff --git a/mcon/U/MailList.U b/mcon/U/MailList.U new file mode 100644 index 0000000..e9fb039 --- /dev/null +++ b/mcon/U/MailList.U @@ -0,0 +1,82 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Graham Stoney +?RCS: +?RCS: $Log: MailList.U,v $ +?RCS: Revision 3.0.1.1 1994/01/24 14:01:49 ram +?RCS: patch16: created +?RCS: +?RCS: +?X: +?X: This unit offers the user the option of subscribing to the mailing +?X: list. To force inclusion of this unit, you must add it's name to the +?X: dependancies on the MAKE line in your private copy of End.U. +?X: The address of the mailing list server must be set via a "list_request=..." +?X: entry in the .package file. This is usually done by running packinit and +?X: answering the proper questions. +?X: +?MAKE:MailList: cat mailer package Myread cf_name cf_email +?MAKE: -pick wipe $@ %< +?T:list_request list_sub list_unsub list_name +?X: +?X: The cf_name dependency is used through list_sub when the mailing list +?X: manager happens to be listserv, whereas cf_email is used whith majordomo +?X: or when the mailing list request address is scanned by a human. Since +?X: they do not appear within the unit itself, we need a lint hint. +?X: +?LINT:use cf_name cf_email +: offer to join the mailing list +list_request='<$list_request>' +list_sub="<$list_sub>" +list_unsub="<$list_unsub>" +list_name="<$list_name>" +$cat <&4 + $mailer $list_request </dev/null 2>&1 +Precedence: junk +To: $list_request + +$list_sub +EOM + ;; +[uU]*) echo "Sending mail to unsubscribe you from the $list_name list..." >&4 + $mailer $list_request </dev/null 2>&1 +Precedence: junk +To: $list_request + +$list_unsub +EOM + ;; +esac + diff --git a/mcon/U/Mkdirp.U b/mcon/U/Mkdirp.U new file mode 100644 index 0000000..bad6081 --- /dev/null +++ b/mcon/U/Mkdirp.U @@ -0,0 +1,51 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Extract.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 14:58:52 ram +?RCS: patch61: added support for src.U +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 15:51:46 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0 1993/08/18 12:04:52 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit produces a shell script which can launched to create a +?X: directory path like "mkdir -p" would do. +?X: +?MAKE:Mkdirp: eunicefix startsh +?MAKE: -pick add $@ %< +?F:./mkdirp +?T:name create file +: script used to emulate mkdir -p +cat >mkdirp <>mkdirp <<'EOS' +name=$1; +create=""; +while test $name; do + if test ! -d "$name"; then + create="$name $create" + name=`echo $name | sed -e "s|^[^/]*$||"` + name=`echo $name | sed -e "s|\(.*\)/.*|\1|"` + else + name="" + fi +done +for file in $create; do + mkdir $file +done +EOS +chmod +x mkdirp +$eunicefix mkdirp + diff --git a/mcon/U/Mksymlinks.U b/mcon/U/Mksymlinks.U new file mode 100644 index 0000000..92318a8 --- /dev/null +++ b/mcon/U/Mksymlinks.U @@ -0,0 +1,90 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Copyright (c) 2000, Jarkko Hietaniemi +?RCS: +?X: +?X: This unit allows the duplication of the source tree to the current +?X: directory via symbolic links. This must be requested explicitly +?X: by them issuing a -Dmksymlinks on the command line. +?X: +?MAKE:Mksymlinks: Mkdirp lns issymlink src rsrc pkgsrc +?MAKE: -pick add $@ %< +?F:!UU +?T: dir filename tmppwd filelist +?LINT:extern mksymlinks +@if {test -f ../MANIFEST} +: Duplicate the tree with symbolic links if -Dmksymlinks was supplied +case "$mksymlinks" in +$define|true|[yY]*) + echo " " + case "$src" in + ''|'.') echo "Cannot create symlinks in the original directory." >&4 + exit 1 + ;; + *) case "$lns:$issymlink" in + *"ln"*" -s:"*"test -"?) + echo "Creating the symbolic links..." >&4 + echo "(First creating the subdirectories...)" >&4 + cd .. + awk '{print $1}' $src/MANIFEST | grep / | sed 's:/[^/]*$::' | \ + sort -u | while true + do + read dir + test -z "$dir" && break + ./UU/mkdirp $dir 2>/dev/null + if test -d $dir; then + : ok + else + echo "Failed to create '$dir'. Aborting." >&4 + exit 1 + fi + done + echo "(Now creating the symlinks...)" >&4 + awk '{print $1}' $src/MANIFEST | while true; do + read filename + test -z "$filename" && break + if test -f $filename; then + if $issymlink $filename; then + rm -f $filename + fi + fi + if test -f $filename; then + echo "$filename already exists, not symlinking." + else +?X: Note that the following works because "$pkgsrc" is absolute + ln -s $pkgsrc/$filename $filename + fi + done +?X: Check that everything was correctly copied + echo "(Checking current directory...)" >&4 + cd UU + awk '$1 !~ /PACK[A-Z]+/ {print $1}' "$rsrc/MANIFEST" | \ + (split -l 50 2>/dev/null || split -50) + rm -f missing + tmppwd=`pwd` + for filelist in x??; do + (cd ..; ls `cat "$tmppwd/$filelist"` \ + >/dev/null 2>>"$tmppwd/missing") + done + if test -s missing; then + echo "Failed duplication of source tree. Aborting." >&4 + exit 1 + fi + ;; + *) echo "(I cannot figure out how to do symbolic links, ignoring!)" >&4 + ;; + esac + ;; + esac + ;; +esac + +@end diff --git a/mcon/U/Myinit.U b/mcon/U/Myinit.U new file mode 100644 index 0000000..0ab97f4 --- /dev/null +++ b/mcon/U/Myinit.U @@ -0,0 +1,26 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Myinit.U,v $ +?RCS: Revision 3.0.1.1 1994/10/31 09:47:29 ram +?RCS: patch44: leading comment states this unit comes before option processing +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:07 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: If you want to initialize any default values, copy this unit to your +?X: personal U directory and add the assignments to the end. This file +?X: is included after variables are initialized but before any old +?X: config.sh file is read in and before any Configure switch processing. +?X: +?MAKE:Myinit: Init +?MAKE: -pick add $@ %< +?LINT: nocomment diff --git a/mcon/U/Myread.U b/mcon/U/Myread.U new file mode 100644 index 0000000..330f503 --- /dev/null +++ b/mcon/U/Myread.U @@ -0,0 +1,199 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Myread.U,v $ +?RCS: Revision 3.0.1.6 1997/02/28 15:05:39 ram +?RCS: patch61: myread script now starts with a "startsh" +?RCS: patch61: miscellaneous fixes +?RCS: +?RCS: Revision 3.0.1.5 1995/01/11 15:14:22 ram +?RCS: patch45: added & escape allowing user to turn on -d from the prompt +?RCS: +?RCS: Revision 3.0.1.4 1994/10/31 09:48:04 ram +?RCS: patch44: added Options to the MAKE line since it's no longer in Init.U +?RCS: +?RCS: Revision 3.0.1.3 1994/10/29 15:56:20 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0.1.2 1993/08/30 08:57:59 ram +?RCS: patch8: added new visible 'nostick' symbol, mainly for Finish.U +?RCS: +?RCS: Revision 3.0.1.1 1993/08/27 14:39:20 ram +?RCS: patch7: now sticks to the question when no default and empty answer +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:08 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit produces a bit of shell code that must be dotted in in order +?X: to do a read. It allows for shell escapes, default assignment and +?X: parameter evaluation. +?X: +?X: To use this unit, $rp and $dflt must hold the question and the +?X: default answer. The question will be printed by the script itself. +?X: Neither $rp nor $dflt is altered by the script. +?X: +?X: The myread script will stick to the question if no default is proposed +?X: and the user answer is empty, which prevents mistakes. However, at the +?X: end of Configure, there is an exception to this rule (Finish.U) where we +?X: set nostick to a non-empty value to allow the Return key to play its role! +?X: +?MAKE:Myread: Options startsh n c trnl +?MAKE: -pick add $@ %< +?V:ans:dflt rp nostick +?F:./myread +?T:COLUMNS xxxm rp dflt answ aok myecho +?LINT:change fastread +?X: Some shells (Ultrix) do not understand ${COLUMNS:-80}, sigh! +: compute the number of columns on the terminal for proper question formatting +case "$COLUMNS" in +'') COLUMNS='80';; +esac + +: set up the echo used in my read +?X: +?X: This variable is intended to be eval'ed. It will echo the two +?X: variables $rp and $dflt (provided this latter has a non null value). +?X: It is mainly used by the myread script to echo the questions. +?X: +?X: The $n and $c below are substituted before Loc does its silly echo check +?X: so don't put a $ on the echo below so we get builtin, even if $echo is +?X: pointing to /bin/echo. +?X: +myecho="case \"\$xxxm\" in +'') echo $n \"\$rp $c\" >&4;; +*) case \"\$rp\" in + '') echo $n \"[\$xxxm] $c\";; + *) + if test \`echo \"\$rp [\$xxxm] \" | wc -c\` -ge $COLUMNS; then + echo \"\$rp\" >&4 + echo $n \"[\$xxxm] $c\" >&4 + else + echo $n \"\$rp [\$xxxm] $c\" >&4 + fi + ;; + esac;; +esac" + +: now set up to do reads with possible shell escape and default assignment +cat <myread +$startsh +?X: +?X: Save value of default -- do not alter original in case of eval +?X: +xxxm=\$dflt +$myecho +?X: +?X: If there is no default, then stop, regardless of the value in fastread. +?X: In silent mode, no new-line is to be echoed if the question is empty, +?X: since this is used to wait for the "return" key. +?X: +ans='!' +case "\$fastread" in +yes) case "\$dflt" in + '') ;; + *) ans=''; + case "\$silent-\$rp" in + true-) ;; + *) echo " " >&4;; + esac;; + esac;; +*) case "\$silent" in + true) case "\$rp" in + '') ans='';; + esac;; + esac;; +esac +while expr "X\$ans" : "X!" >/dev/null; do + read answ +?X: +?X: Run 'eval' on the answer, in order to do variable substitution, in case +?X: the user types $HOME or $WHATEVER. Variables must be evaluated now. +?X: Typing '\$HOME' won't currently prevent from substitution -- use '\\$HOME' +?X: The $1 .. $9 and $*, as well as $@, are available to refer to the +?X: default value. +?X: + set x \$xxxm + shift + aok=''; eval "ans=\\"\$answ\\"" && aok=y + case "\$answ" in +?X: +?X: Use "!" and not a plain ! because of a bug in BSD 4.4 shell +?X: (reported by Wayne Davison) +?X: We must handle the shell escapes before dealing with possible variable +?X: substitution, since the shell we're launching in that case will be able +?X: to do it as well as we can -- RAM, 15/03/96 +?X + "!") + sh 1>&4 + echo " " + $myecho + ;; + !*) + set x \`expr "X\$ans" : "X!\(.*\)\$"\` + shift + sh 1>&4 -c "\$*" + echo " " + $myecho + ;; + "\$ans") + case "\$ans" in +?X: +?X: Answers starting with & are hooks allowing to dynamically turn on/off +?X: some Configure options. That's for the future. -- RAM, 09/01/95 +?X: Today, we only recognize '& -d' to mean 'go on as if Configure -d, which +?X: is a hardwired behaviour compatible with our general scheme. +?X: + \\&*) + set x \`expr "X\$ans" : "X&\(.*\)\$"\` + shift + case "\$1" in + -d) + fastread=yes + echo "(OK, I'll run with -d after this question.)" >&4 + ;; + -*) + echo "*** Sorry, \$1 not supported yet." >&4 + ;; + esac + $myecho + ans=! + ;; + esac;; + *) + case "\$aok" in + y) + echo "*** Substitution done -- please confirm." + xxxm="\$ans" + ans=\`echo $n "\$ans$c" | tr '$trnl' ' '\` + xxxm="\$ans" + ans=! + ;; + *) + echo "*** Error -- try again." + ans=! + ;; + esac + $myecho + ;; + esac +?X: Stick in myread if no default answer and nothing was answered + case "\$ans\$xxxm\$nostick" in + '') + ans=! + $myecho + ;; + esac +done +case "\$ans" in +'') ans="\$xxxm";; +esac +EOSC + diff --git a/mcon/U/Nothing.U b/mcon/U/Nothing.U new file mode 100644 index 0000000..fe40801 --- /dev/null +++ b/mcon/U/Nothing.U @@ -0,0 +1,19 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Nothing.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:09 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: The purpose of this file is to supply an empty target for the private +?X: Makefile built by metaconfig to order the units. +?X: +?MAKE:Nothing: Head diff --git a/mcon/U/Null.U b/mcon/U/Null.U new file mode 100644 index 0000000..bb218b0 --- /dev/null +++ b/mcon/U/Null.U @@ -0,0 +1,20 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Null.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:10 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit ends up producing shell code to set all variables to ''. This +?X: probably isn't necessary, but I'm paranoid. About certain things. +?X: +?MAKE:Null: Head +?MAKE: -pick add.Null $@ %< diff --git a/mcon/U/Obsol_h.U b/mcon/U/Obsol_h.U new file mode 100644 index 0000000..1061aa9 --- /dev/null +++ b/mcon/U/Obsol_h.U @@ -0,0 +1,28 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Obsol_h.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:11 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This file is prepended to .MT/Obsol_h if that file is not empty. That file +?X: contains the necessary mappings of new symbols to obsolete ones. +?X: +?MAKE:Obsol_h: +?MAKE: -pick prepend $@ ./Obsol_h +?LINT:nocomment +/* + * The following symbols are obsolete. They are mapped to the the new + * symbols only to ease the transition process. The sources should be + * updated so as to use the new symbols only, as the support for these + * obsolete symbols may end without notice. + */ + diff --git a/mcon/U/Obsol_sh.U b/mcon/U/Obsol_sh.U new file mode 100644 index 0000000..0a976bf --- /dev/null +++ b/mcon/U/Obsol_sh.U @@ -0,0 +1,27 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Obsol_sh.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:11 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This file is prepended to .MT/Obsol_sh if that file is not empty. That file +?X: contains the necessary mappings of new symbols to obsolete ones. +?X: +?MAKE:Obsol_sh: +?MAKE: -pick prepend $@ ./Obsol_sh +?LINT:nocomment +# +# The following symbols are obsolete. They are mapped to the the new +# symbols only to ease the transition process. The sources should be +# updated so as to use the new symbols only, since supporting of those +# obsolete symbols may end without notice. +# diff --git a/mcon/U/Oldconfig.U b/mcon/U/Oldconfig.U new file mode 100644 index 0000000..9e079dd --- /dev/null +++ b/mcon/U/Oldconfig.U @@ -0,0 +1,687 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Oldconfig.U,v $ +?RCS: Revision 3.0.1.10 1997/02/28 15:06:39 ram +?RCS: patch61: added support for src.U +?RCS: patch61: new OSNAME define +?RCS: patch61: can now sense new OSes +?RCS: +?RCS: Revision 3.0.1.9 1995/07/25 13:40:51 ram +?RCS: patch56: now knows about OS/2 platforms +?RCS: +?RCS: Revision 3.0.1.8 1995/05/12 12:04:18 ram +?RCS: patch54: config.sh reload logic now knows about new -K switch +?RCS: patch54: cleaned up and extended osvers for DEC OSF/1 (ADO) +?RCS: patch54: added MachTen detection (ADO) +?RCS: +?RCS: Revision 3.0.1.7 1995/02/15 14:13:41 ram +?RCS: patch51: adapted osvers computation for AIX (ADO) +?RCS: +?RCS: Revision 3.0.1.6 1995/01/30 14:27:15 ram +?RCS: patch49: unit Options.U now exports file optdef.sh, not a variable +?RCS: patch49: update code for myuname changed (WED) +?RCS: +?RCS: Revision 3.0.1.5 1995/01/11 15:15:36 ram +?RCS: patch45: added quotes around the INITPROG variable (ADO) +?RCS: patch45: allows variable overriding after config file loading +?RCS: +?RCS: Revision 3.0.1.4 1994/10/29 15:57:05 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: patch36: merged with the version used for perl5's Configure (ADO) +?RCS: +?RCS: Revision 3.0.1.3 1994/05/06 14:24:17 ram +?RCS: patch23: added support for osf1 hints +?RCS: patch23: new support for solaris and i386 systems (ADO) +?RCS: +?RCS: Revision 3.0.1.2 1994/01/24 14:05:02 ram +?RCS: patch16: added post-processing on myuname for Xenix targets +?RCS: patch16: message proposing config.sh defaults made consistent +?RCS: +?RCS: Revision 3.0.1.1 1993/09/13 15:56:32 ram +?RCS: patch10: force use of config.sh when -d option is used (WAD) +?RCS: patch10: complain about non-existent hint files (WAD) +?RCS: patch10: added Options dependency for fastread variable +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:12 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit tries to remember what we did last time we ran Configure, mostly +?X: for the sake of setting defaults. +?X: +?MAKE:Oldconfig hint myuname osname osvers: Instruct Myread Checkcc \ + Mksymlinks Loc Options Tr src trnl ln uname sh awk sed test cat grep \ + rm lns tr n c contains targetarch +?MAKE: -pick wipe $@ %< +?S:myuname: +?S: The output of 'uname -a' if available, otherwise the hostname. On Xenix, +?S: pseudo variables assignments in the output are stripped, thank you. The +?S: whole thing is then lower-cased. +?S:. +?S:hint: +?S: Gives the type of hints used for previous answers. May be one of +?S: "default", "recommended" or "previous". +?S:. +?S:osname: +?S: This variable contains the operating system name (e.g. sunos, +?S: solaris, hpux, etc.). It can be useful later on for setting +?S: defaults. Any spaces are replaced with underscores. It is set +?S: to a null string if we can't figure it out. +?S:. +?S:osvers: +?S: This variable contains the operating system version (e.g. +?S: 4.1.3, 5.2, etc.). It is primarily used for helping select +?S: an appropriate hints file, but might be useful elsewhere for +?S: setting defaults. It is set to '' if we can't figure it out. +?S: We try to be flexible about how much of the version number +?S: to keep, e.g. if 4.1.1, 4.1.2, and 4.1.3 are essentially the +?S: same for this package, hints files might just be os_4.0 or +?S: os_4.1, etc., not keeping separate files for each little release. +?S:. +?C:OSNAME: +?C: This symbol contains the name of the operating system, as determined +?C: by Configure. You shouldn't rely on it too much; the specific +?C: feature tests from Configure are generally more reliable. +?C:. +?C:OSVERS: +?C: This symbol contains the version of the operating system, as determined +?C: by Configure. You shouldn't rely on it too much; the specific +?C: feature tests from Configure are generally more reliable. +?C:. +?H:#define OSNAME "$osname" /**/ +?H:#define OSVERS "$osvers" /**/ +?H:. +?F:!config.sh +?T:tmp tmp_n tmp_c tmp_sh file +?T:xxxxfile xxxfile xxfile xfile hintfile newmyuname +?T:tans _ isesix INITPROG DJGPP has_uname +?D:osname='' +?LINT:change n c sh +?LINT:extern hostarch +?LINT:change hostarch +: Determine the name of the machine +myuname=`$uname -a 2>/dev/null` +$test -z "$myuname" && myuname=`hostname 2>/dev/null` +?X: Special mention for Xenix, whose 'uname -a' gives us output like this: +?X: sysname=XENIX +?X: nodename=whatever +?X: release=2.3.2 .. etc... +?X: Therefore, we strip all this variable assignment junk and remove all the +?X: new lines to keep the myuname variable sane... --RAM +myuname=`echo $myuname | $sed -e 's/^[^=]*=//' -e 's/\///g' | \ + ./tr '[A-Z]' '[a-z]' | $tr $trnl ' '` +?X: Save the value we just computed to reset myuname after we get done here. +newmyuname="$myuname" +$test -f "$uname$_exe" && has_uname=y + +: Guessing of the OS name -- half the following guesses are probably wrong... +: If you have better tests or hints, please send them to the metaconfig +: authors and to +$test -f /irix && osname=irix +$test -f /xenix && osname=sco_xenix +$test -f /dynix && osname=dynix +$test -f /dnix && osname=dnix +$test -f /lynx.os && osname=lynxos +$test -f /unicos && osname=unicos && osvers=`$uname -r` +$test -f /unicosmk && osname=unicosmk && osvers=`$uname -r` +$test -f /unicosmk.ar && osname=unicosmk && osvers=`$uname -r` +$test -f /bin/mips && /bin/mips && osname=mips +$test -d /NextApps && set X `hostinfo | $grep 'NeXT Mach.*:' | \ + $sed -e 's/://' -e 's/\./_/'` && osname=next && osvers=$4 +$test -d /usr/apollo/bin && osname=apollo +$test -f /etc/saf/_sactab && osname=svr4 +$test -d /usr/include/minix && osname=minix +$test -f /system/gnu_library/bin/ar.pm && osname=vos +if $test -d /MachTen -o -d /MachTen_Folder; then +?X: MachTen uname -a output looks like +?X: xxx 4 0.0 Macintosh +?X: MachTen /sbin/version output looks like +?X: MachTen 4.0 Mon Aug 28 10:18:00 1995 +?X: MachTen 3.x had the 'version' command in /usr/etc/version. + osname=machten + if $test -x /sbin/version; then + osvers=`/sbin/version | $awk '{print $2}' | + $sed -e 's/[A-Za-z]$//'` + elif $test -x /usr/etc/version; then + osvers=`/usr/etc/version | $awk '{print $2}' | + $sed -e 's/[A-Za-z]$//'` + else + osvers="$2.$3" + fi +fi +$test -f /sys/posix.dll && + $test -f /usr/bin/what && + set X `/usr/bin/what /sys/posix.dll` && + $test "$3" = UWIN && + osname=uwin && + osvers="$5" +?X: If we have uname, we already computed a suitable uname -a output, correctly +?X: formatted for Xenix, and it lies in $myuname. +if $test "X$has_uname" != X; then + set X $myuname + shift + case "$5" in + fps*) osname=fps ;; + mips*) + case "$4" in + umips) osname=umips ;; + *) osname=mips ;; + esac;; + [23]100) osname=mips ;; + next*) osname=next ;; +?X: Interactive Unix. + i386*) + tmp=`/bin/uname -X 2>/dev/null|awk '/3\.2v[45]/{ print $(NF) }'` + if $test "$tmp" != "" -a "$3" = "3.2" -a -f '/etc/systemid'; then + osname='sco' + osvers=$tmp + elif $test -f /etc/kconfig; then + osname=isc + if $test "$lns" = "$ln -s"; then + osvers=4 + elif $contains _SYSV3 /usr/include/stdio.h > /dev/null 2>&1 ; then + osvers=3 + elif $contains _POSIX_SOURCE /usr/include/stdio.h > /dev/null 2>&1 ; then + osvers=2 + fi + fi + tmp='' + ;; +?X: MS-DOS djgpp uname -a output looks like: +?X: ms-dos xxx 6 22 pc +?X: $1 is the "dos flavor" (need not be "ms-dos"). +?X: $2 is the node name +?X: $3 and $4 are version/subversion +?X: $5 is always "pc", but that might not be unique to DJGPP. +?X: (e.g. Solaris_x86 has $5 = i86pc, which doesn't actually conflict, +?X: but it's close enought that I can easily imagine other vendors also +?X: using variants of pc* in $5.) +?X: The "DJGPP" environment variable is always set when djgpp is active. + pc*) + if $test -n "$DJGPP"; then + osname=dos + osvers=djgpp + fi + ;; + esac + case "$1" in + aix) osname=aix +?X: aix 4.1 uname -a output looks like +?X: AIX foo 1 4 000123456789 +?X: where $4 is the major release number and $3 is the (minor) version. +?X: More detail on the version is available with the oslevel command. +?X: in 3.2.x, it output a string (see case statements below). In 4.1, +?X: it puts out something like 4.1.1.0 + tmp=`( (oslevel) 2>/dev/null || echo "not found") 2>&1` + case "$tmp" in + 'not found') osvers="$4"."$3" ;; + '<3240'|'<>3240') osvers=3.2.0 ;; + '=3240'|'>3240'|'<3250'|'<>3250') osvers=3.2.4 ;; + '=3250'|'>3250') osvers=3.2.5 ;; + *) osvers=$tmp;; + esac + ;; + bsd386) osname=bsd386 + osvers=`$uname -r` + ;; + cygwin*) osname=cygwin + osvers="$3" + ;; + *dc.osx) osname=dcosx + osvers="$3" + ;; + dnix) osname=dnix + osvers="$3" + ;; + domainos) osname=apollo + osvers="$3" + ;; + dgux) osname=dgux + osvers="$3" + ;; +?X: uname -a returns +?X: DYNIX/ptx xxx 4.0 V4.1.2 i386 + dynixptx*) osname=dynixptx + osvers=`echo "$4"|sed 's/^v//'` + ;; + freebsd) osname=freebsd + osvers="$3" ;; + genix) osname=genix ;; +?X: HP-UX uname -a gives something like +?X: HP-UX foobar B.10.20 A 9000/735 2016483812 two-user license +?X: Preserve the full 10.20 string instead of the previous plain '10'. +?X: Thanks to Graham Barr. --AD 6/30/1998 + hp*) osname=hpux + osvers=`echo "$3" | $sed 's,.*\.\([0-9]*\.[0-9]*\),\1,'` + ;; + irix*) osname=irix + case "$3" in + 4*) osvers=4 ;; + 5*) osvers=5 ;; + *) osvers="$3" ;; + esac + ;; + linux) osname=linux + case "$3" in + *) osvers="$3" ;; + esac + ;; + MiNT) osname=mint + ;; + netbsd*) osname=netbsd + osvers="$3" + ;; + news-os) osvers="$3" + case "$3" in + 4*) osname=newsos4 ;; + *) osname=newsos ;; + esac + ;; + next*) osname=next ;; + nonstop-ux) osname=nonstopux ;; + openbsd) osname=openbsd + osvers="$3" + ;; + POSIX-BC | posix-bc ) osname=posix-bc + osvers="$3" + ;; + powerux | power_ux | powermax_os | powermaxos | \ + powerunix | power_unix) osname=powerux + osvers="$3" + ;; + qnx) osname=qnx + osvers="$4" + ;; + solaris) osname=solaris + case "$3" in + 5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;; + *) osvers="$3" ;; + esac + ;; + sunos) osname=sunos + case "$3" in + 5*) osname=solaris + osvers=`echo $3 | $sed 's/^5/2/g'` ;; + *) osvers="$3" ;; + esac + ;; + titanos) osname=titanos + case "$3" in + 1*) osvers=1 ;; + 2*) osvers=2 ;; + 3*) osvers=3 ;; + 4*) osvers=4 ;; + *) osvers="$3" ;; + esac + ;; + ultrix) osname=ultrix + osvers="$3" + ;; + osf1|mls+) case "$5" in + alpha) +?X: DEC OSF/1 myuname -a output looks like: osf1 xxxx t3.2 123.4 alpha +?X: where the version number can be something like [xvt]n.n + osname=dec_osf +?X: sizer knows the minor minor version: the letter + osvers=`sizer -v | awk '{print $3}' | \ + ./tr '[A-Z]' '[a-z]' | sed 's/^[xvt]//'` + case "$osvers" in + [1-9].[0-9]*) ;; + *) osvers=`echo "$3" | sed 's/^[xvt]//'` ;; + esac + ;; + hp*) osname=hp_osf1 ;; + mips) osname=mips_osf1 ;; +?X: hp and mips were unsupported Technology Releases -- ADO, 24/10/94 + esac + ;; + unixware) osname=svr5 + osvers="$4" + ;; + uts) osname=uts + osvers="$3" + ;; + vos) osvers="$3" + ;; + $2) case "$osname" in + *isc*) ;; + *freebsd*) ;; + svr*) + : svr4.x or possibly later + case "svr$3" in + ${osname}*) + osname=svr$3 + osvers=$4 + ;; + esac + case "$osname" in + svr4.0) + : Check for ESIX + if $test -f /stand/boot ; then + eval `$grep '^INITPROG=[a-z/0-9]*$' /stand/boot` + if $test -n "$INITPROG" -a -f "$INITPROG"; then + isesix=`strings -a $INITPROG | \ + $grep 'ESIX SYSTEM V/386 Release 4.0'` + if $test -n "$isesix"; then + osname=esix4 + fi + fi + fi + ;; + esac + ;; + *) if $test -f /etc/systemid; then + osname=sco + set `echo $3 | $sed 's/\./ /g'` $4 + if $test -f $src/hints/sco_$1_$2_$3.sh; then + osvers=$1.$2.$3 + elif $test -f $src/hints/sco_$1_$2.sh; then + osvers=$1.$2 + elif $test -f $src/hints/sco_$1.sh; then + osvers=$1 + fi + else + case "$osname" in + '') : Still unknown. Probably a generic Sys V. + osname="sysv" + osvers="$3" + ;; + esac + fi + ;; + esac + ;; + *) case "$osname" in + '') : Still unknown. Probably a generic BSD. + osname="$1" + osvers="$3" + ;; + esac + ;; + esac +else +?X: Try to identify sony's NEWS-OS (BSD unix) + if $test -f /vmunix -a -f $src/hints/news_os.sh; then + (what /vmunix | UU/tr '[A-Z]' '[a-z]') > UU/kernel.what 2>&1 + if $contains news-os UU/kernel.what >/dev/null 2>&1; then + osname=news_os + fi + $rm -f UU/kernel.what +?X: Maybe it's OS/2 or DOS or something similar + elif $test -d c:/.; then + set X $myuname + osname=os2 + osvers="$5" + fi +fi + +: Try to determine whether config.sh was made on this system +case "$config_sh" in +'') +?X: indentation wrong on purpose--RAM +dflt=n +case "$knowitall" in +'') + if test -f ../config.sh; then + if $contains myuname= ../config.sh >/dev/null 2>&1; then + eval "`$grep myuname= ../config.sh`" + fi + if test "X$myuname" = "X$newmyuname"; then + dflt=y + fi + fi + ;; +*) dflt=y;; +esac + +: Get old answers from config file if it was generated on the same system +hint=default +if $test -f ../config.sh; then + echo " " + rp="I see a config.sh file. Shall I use it to set the defaults?" + . ./myread + case "$ans" in + n*|N*) echo "OK, I'll ignore it." + mv ../config.sh ../config.sh.old + myuname="$newmyuname" + ;; + *) echo "Fetching default answers from your old config.sh file..." >&4 + tmp_n="$n" + tmp_c="$c" + tmp_sh="$sh" + . ../config.sh + cp ../config.sh . + n="$tmp_n" + c="$tmp_c" + hint=previous + ;; + esac +fi +?X: remember, case indentation is wrong--RAM +;; +*) + echo " " + echo "Fetching default answers from $config_sh..." >&4 + tmp_n="$n" + tmp_c="$c" + tmp_sh="$sh" + cd .. +?X: preserve symbolic links, if any + cp $config_sh config.sh 2>/dev/null + chmod +w config.sh + . ./config.sh + cd UU + cp ../config.sh . + n="$tmp_n" + c="$tmp_c" + hint=previous + ;; +esac +?X: Older versions did not always set $sh. +case "$sh" in +'') sh="$tmp_sh" ;; +esac +$test "$override" && . ./optdef.sh + +: Restore computed paths +for file in $loclist $trylist; do + eval $file="\$_$file" +done + +. ./checkcc +?X: Cross-compiling support +case "$targetarch" in +'') ;; +*) hostarch=$osname + osname=`echo $targetarch|sed 's,^[^-]*-,,'` + osvers='' + ;; +esac + +@if {test -d ../hints} +: Offer them some hints based on their OS +cd .. +?X: Since we are now at the root of the source tree, we must use $src +?X: to access the sources and not $rsrc. See src.U for details... +if $test ! -f config.sh; then + $cat <&4 + dflt='' + + : Now look for a hint file osname_osvers, unless one has been + : specified already. + case "$hintfile" in + ''|' ') + file=`echo "${osname}_${osvers}" | $sed -e 's%\.%_%g' -e 's%_$%%'` + : Also try without trailing minor version numbers. + xfile=`echo $file | $sed -e 's%_[^_]*$%%'` + xxfile=`echo $xfile | $sed -e 's%_[^_]*$%%'` + xxxfile=`echo $xxfile | $sed -e 's%_[^_]*$%%'` + xxxxfile=`echo $xxxfile | $sed -e 's%_[^_]*$%%'` + case "$file" in + '') dflt=none ;; + *) case "$osvers" in + '') dflt=$file + ;; + *) if $test -f $src/hints/$file.sh ; then + dflt=$file + elif $test -f $src/hints/$xfile.sh ; then + dflt=$xfile + elif $test -f $src/hints/$xxfile.sh ; then + dflt=$xxfile + elif $test -f $src/hints/$xxxfile.sh ; then + dflt=$xxxfile + elif $test -f $src/hints/$xxxxfile.sh ; then + dflt=$xxxxfile + elif $test -f "$src/hints/${osname}.sh" ; then + dflt="${osname}" + else + dflt=none + fi + ;; + esac + ;; + esac + if $test -f Policy.sh ; then + case "$dflt" in + *Policy*) ;; + none) dflt="Policy" ;; + *) dflt="Policy $dflt" ;; + esac + fi + ;; + *) + dflt=`echo $hintfile | $sed 's/\.sh$//'` + ;; + esac + + if $test -f Policy.sh ; then + $cat <> UU/config.sh + elif $test -f $src/hints/$file.sh; then + . $src/hints/$file.sh + $cat $src/hints/$file.sh >> UU/config.sh + elif $test X"$tans" = X -o X"$tans" = Xnone ; then + : nothing + else + : Give one chance to correct a possible typo. + echo "$file.sh does not exist" + dflt=$file + rp="hint to use instead?" + . UU/myread + for file in $ans; do + if $test -f "$src/hints/$file.sh"; then + . $src/hints/$file.sh + $cat $src/hints/$file.sh >> UU/config.sh + elif $test X$ans = X -o X$ans = Xnone ; then + : nothing + else + echo "$file.sh does not exist -- ignored." + fi + done + fi + done + + hint=recommended + : Remember our hint file for later. + if $test -f "$src/hints/$file.sh" ; then + hintfile="$file" + else + hintfile='' + fi +fi +cd UU +?X: From here on, we must use $rsrc instead of $src + +@end +: Process their -A options +. ./posthint.sh + +@if osname || osvers +: Ask them to confirm the OS name +cat << EOM + +Configure uses the operating system name and version to set some defaults. +The default value is probably right if the name rings a bell. Otherwise, +since spelling matters for me, either accept the default or answer "none" +to leave it blank. + +EOM +@end +@if osname +case "$osname" in + ''|' ') + case "$hintfile" in + ''|' '|none) dflt=none ;; + *) dflt=`echo $hintfile | $sed -e 's/\.sh$//' -e 's/_.*$//'` ;; + esac + ;; + *) dflt="$osname" ;; +esac +rp="Operating system name?" +. ./myread +case "$ans" in +none) osname='' ;; +*) osname=`echo "$ans" | $sed -e 's/[ ][ ]*/_/g' | ./tr '[A-Z]' '[a-z]'`;; +esac +@end +@if osvers +@if osname +echo " " +@end +case "$osvers" in + ''|' ') + case "$hintfile" in + ''|' '|none) dflt=none ;; + *) dflt=`echo $hintfile | $sed -e 's/\.sh$//' -e 's/^[^_]*//'` + dflt=`echo $dflt | $sed -e 's/^_//' -e 's/_/./g'` + case "$dflt" in + ''|' ') dflt=none ;; + esac + ;; + esac + ;; + *) dflt="$osvers" ;; +esac +rp="Operating system version?" +. ./myread +case "$ans" in +none) osvers='' ;; +*) osvers="$ans" ;; +esac + +@end diff --git a/mcon/U/Oldsym.U b/mcon/U/Oldsym.U new file mode 100644 index 0000000..8b11133 --- /dev/null +++ b/mcon/U/Oldsym.U @@ -0,0 +1,66 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Oldsym.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 15:06:58 ram +?RCS: patch61: added support for src.U +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:13 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit follows the creation of the config.sh file. It adds some +?X: special symbols: defines from patchlevel.h file if any and CONFIG, +?X: which is set to true. Then, we try to keep all the new symbols that +?X: may come from a hint file or a previous config.sh file. +?X: +?MAKE:Oldsym: Config_sh Options test hint src sed sort uniq +?MAKE: -pick add $@ %< +?T:CONFIG sym tmp +?F:!UU +: add special variables +$test -f $src/patchlevel.h && \ +awk '/^#define/ {printf "%s=%s\n",$2,$3}' $src/patchlevel.h >>config.sh +echo "CONFIG=true" >>config.sh + +: propagate old symbols +if $test -f UU/config.sh; then +?X: Make sure each symbol is unique in oldconfig.sh + UU/oldconfig.sh +?X: +?X: All the symbols that appear twice come only from config.sh (hence the +?X: two config.sh in the command line). These symbols will be removed by +?X: the uniq -u command. The oldsyms file thus contains all the symbols +?X: that did not appear in the produced config.sh (Larry Wall). +?X: +?X: Do not touch the -u flag of uniq. This means you too, Jarkko. +?X: + $sed -n 's/^\([a-zA-Z_0-9]*\)=.*/\1/p' \ + config.sh config.sh UU/oldconfig.sh |\ + $sort | $uniq -u >UU/oldsyms + set X `cat UU/oldsyms` + shift + case $# in + 0) ;; + *) + cat <>config.sh + for sym in `cat UU/oldsyms`; do + echo " Propagating $hint variable "'$'"$sym..." + eval 'tmp="$'"${sym}"'"' + echo "$tmp" | \ + sed -e "s/'/'\"'\"'/g" -e "s/^/$sym='/" -e "s/$/'/" >>config.sh + done + ;; + esac +fi + diff --git a/mcon/U/Options.U b/mcon/U/Options.U new file mode 100644 index 0000000..a38f565 --- /dev/null +++ b/mcon/U/Options.U @@ -0,0 +1,363 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Options.U,v $ +?RCS: Revision 3.0.1.7 1997/02/28 15:08:15 ram +?RCS: patch61: optdef.sh now starts with a "startsh" +?RCS: patch61: moved some code from Head.U +?RCS: +?RCS: Revision 3.0.1.6 1995/09/25 09:14:46 ram +?RCS: patch59: protected option parsing code against 'echo -*' option failure +?RCS: +?RCS: Revision 3.0.1.5 1995/05/12 12:04:52 ram +?RCS: patch54: added -K option for experts +?RCS: +?RCS: Revision 3.0.1.4 1995/01/30 14:27:52 ram +?RCS: patch49: this unit now exports file optdef.sh, not a variable +?RCS: +?RCS: Revision 3.0.1.3 1995/01/11 15:19:00 ram +?RCS: patch45: new -O option allowing -D and -U to override config.sh setttings +?RCS: patch45: file optdef.sh is no longer removed after sourcing +?RCS: +?RCS: Revision 3.0.1.2 1994/10/29 15:58:06 ram +?RCS: patch36: ensure option definition file is removed before appending +?RCS: patch36: protect variable definitions with spaces in them +?RCS: +?RCS: Revision 3.0.1.1 1994/06/20 06:55:44 ram +?RCS: patch30: now uses new me symbol to tag error messages +?RCS: patch30: new -D and -U options to define/undef symbols (JHI) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:14 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: Command line parsing. It is really important that the variables used here +?X: be not listed in the MAKE line, or they will be saved in config.sh and +?X: loading this file to fetch default answers would clobber the values set +?X: herein. +?X: +?MAKE:Options: startsh +?MAKE: -pick wipe $@ %< +?V:reuseval alldone error realsilent silent extractsh fastread \ + override knowitall: config_sh +?T:arg argn symbol config_arg0 config_args config_argc xxx yyy zzz uuu +?T:args_exp args_sep arg_exp +?F:!Configure +?F:./optdef.sh ./cmdline.opt ./posthint.sh ./cmdl.opt +: Save command line options in file UU/cmdline.opt for later use in +: generating config.sh. +?X: This temporary file will be read by Oldsym.U. I used a temporary +?X: file to preserve all sorts of potential command line quotes and +?X: also because we don't know in advance how many variables we'll +?X: need, so I can't actually declare them on the MAKE line. +?X: The config_args variable won't be quite correct if Configure is +?X: fed something like ./Configure -Dcc="gcc -B/usr/ccs/bin/" +?X: since the quotes are gone by the time we see them. You'd have to +?X: reconstruct the command line from the config_arg? lines, but since +?X: I don't imagine anyone actually having to do that, I'm not going +?X: to worry too much. +cat > cmdline.opt <>cmdline.opt < cmdl.opt +$arg +EOC + arg_exp=`cat cmdl.opt` + args_exp="$args_exp$args_sep'$arg_exp'" + argn=`expr $argn + 1` + args_sep=' ' +done +?X: args_exp is good for restarting self: eval "set X $args_exp"; shift; $0 "$@" +?X: used by hints/os2.sh in Perl, for instance +rm -f cmdl.opt + +: produce awk script to parse command line options +cat >options.awk <<'EOF' +BEGIN { + optstr = "A:dD:eEf:hKOrsSU:V"; # getopt-style specification + + len = length(optstr); + for (i = 1; i <= len; i++) { + c = substr(optstr, i, 1); +?X: some older awk's do not have the C ?: construct + if (i < len) a = substr(optstr, i + 1, 1); else a = ""; + if (a == ":") { + arg[c] = 1; + i++; + } + opt[c] = 1; + } +} +{ + expect = 0; + str = $0; + if (substr(str, 1, 1) != "-") { + printf("'%s'\n", str); + next; + } + len = length($0); + for (i = 2; i <= len; i++) { + c = substr(str, i, 1); + if (!opt[c]) { + printf("-%s\n", substr(str, i)); + next; + } + printf("-%s\n", c); + if (arg[c]) { + if (i < len) + printf("'%s'\n", substr(str, i + 1)); + else + expect = 1; + next; + } + } +} +END { + if (expect) + print "?"; +} +EOF + +: process the command line options +?X: Use "$@" to keep arguments with spaces in them from being split apart. +?X: For the same reason, awk will output quoted arguments and the final eval +?X: removes them and sets a proper $* array. An 'X' is prependend to each +?X: argument before being fed to echo to guard against 'echo -x', where -x +?X: would be understood as an echo option! It is removed before feeding awk. +set X `for arg in "$@"; do echo "X$arg"; done | + sed -e s/X// | awk -f options.awk` +eval "set $*" +shift +rm -f options.awk + +: set up default values +fastread='' +reuseval=false +config_sh='' +alldone='' +error='' +silent='' +extractsh='' +override='' +knowitall='' +rm -f optdef.sh posthint.sh +cat >optdef.sh <&4 redirection based on the value of the +?X: realsilent variable... -- RAM, 18/93/96 +?X: + +: option parsing +while test $# -gt 0; do + case "$1" in + -d) shift; fastread=yes;; + -e) shift; alldone=cont;; + -f) + shift + cd .. + if test -r "$1"; then + config_sh="$1" + else + echo "$me: cannot read config file $1." >&2 + error=true + fi + cd UU + shift;; + -h) shift; error=true;; + -r) shift; reuseval=true;; + -s) shift; silent=true; realsilent=true;; + -E) shift; alldone=exit;; + -K) shift; knowitall=true;; + -O) shift; override=true;; + -S) shift; silent=true; extractsh=true;; + -D) + shift + case "$1" in + *=) + echo "$me: use '-U symbol=', not '-D symbol='." >&2 + echo "$me: ignoring -D $1" >&2 + ;; + *=*) echo "$1" | \ + sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> optdef.sh;; + *) echo "$1='define'" >> optdef.sh;; + esac + shift + ;; + -U) + shift + case "$1" in + *=) echo "$1" >> optdef.sh;; + *=*) + echo "$me: use '-D symbol=val', not '-U symbol=val'." >&2 + echo "$me: ignoring -U $1" >&2 + ;; + *) echo "$1='undef'" >> optdef.sh;; + esac + shift + ;; + -A) + shift + xxx='' + yyy="$1" + zzz='' + uuu=undef + case "$yyy" in + *=*) zzz=`echo "$yyy"|sed 's!=.*!!'` + case "$zzz" in + *:*) zzz='' ;; + *) xxx=append + zzz=" "`echo "$yyy"|sed 's!^[^=]*=!!'` + yyy=`echo "$yyy"|sed 's!=.*!!'` ;; + esac + ;; + esac + case "$xxx" in + '') case "$yyy" in + *:*) xxx=`echo "$yyy"|sed 's!:.*!!'` + yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` + zzz=`echo "$yyy"|sed 's!^[^=]*=!!'` + yyy=`echo "$yyy"|sed 's!=.*!!'` ;; + *) xxx=`echo "$yyy"|sed 's!:.*!!'` + yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` ;; + esac + ;; + esac + case "$xxx" in + append) + echo "$yyy=\"\${$yyy}$zzz\"" >> posthint.sh ;; + clear) + echo "$yyy=''" >> posthint.sh ;; + define) + case "$zzz" in + '') zzz=define ;; + esac + echo "$yyy='$zzz'" >> posthint.sh ;; + eval) + echo "eval \"$yyy=$zzz\"" >> posthint.sh ;; + prepend) + echo "$yyy=\"$zzz\${$yyy}\"" >> posthint.sh ;; + undef) + case "$zzz" in + '') zzz="$uuu" ;; + esac + echo "$yyy=$zzz" >> posthint.sh ;; + *) echo "$me: unknown -A command '$xxx', ignoring -A $1" >&2 ;; + esac + shift + ;; + -V) echo "$me generated by metaconfig PL." >&2 + exit 0;; + --) break;; + -*) echo "$me: unknown option $1" >&2; shift; error=true;; + *) break;; + esac +done + +case "$error" in +true) + cat >&2 <&1 +case "$silent" in +true) exec 1>/dev/null;; +esac + +: run the defines and the undefines, if any, but leave the file out there... +touch optdef.sh +. ./optdef.sh +: create the posthint manipulation script and leave the file out there... +?X: this file will be perused by Oldconfig.U +touch posthint.sh + diff --git a/mcon/U/Prefixit.U b/mcon/U/Prefixit.U new file mode 100644 index 0000000..dae8dba --- /dev/null +++ b/mcon/U/Prefixit.U @@ -0,0 +1,68 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Prefixit.U,v $ +?RCS: Revision 3.0.1.1 1995/01/30 14:29:22 ram +?RCS: patch49: created +?RCS: +?X: +?X: Used as: "set dflt var dir; eval $prefixit" to set $dflt to be +?X: $prefix/dir by default, or the previous $var depending on certain +?X: conditions: +?X: - If the $oldprefix variable is empty, then $prefix holds the same +?X: value as on previous runs. Therefore, reuse $var if set, otherwise +?X: set $dflt to $prefix/dir. +?X: - If $oldprefix is not empty, then set $dflt to $prefix/dir if $var +?X: is empty (first run). Otherwise, if $var is $oldprefix/dir, then +?X: change it to $prefix/dir. If none of the above, reuse the old $var. +?X: +?X: When dir is omitted, the dflt variable is set to $var if prefix did not +?X: change, to an empty value otherwise. If dir=none, then a single space +?X: in var is kept as-is, even if the prefix changes. +?X: +?MAKE:Prefixit: prefix oldprefix +?MAKE: -pick add $@ %< +?LINT:define prefixit +?S:prefixit: +?S: This shell variable is used internally by Configure to reset +?S: the leading installation prefix correctly when it is changed. +?S: set dflt var [dir] +?S: eval $prefixit +?S: That will set $dflt to $var or $prefix/dir depending on the +?S: value of $var and $oldprefix. +?S:. +?V:prefixit +?T:tp +: set the prefixit variable, to compute a suitable default value +prefixit='case "$3" in +""|none) + case "$oldprefix" in + "") eval "$1=\"\$$2\"";; + *) + case "$3" in + "") eval "$1=";; + none) + eval "tp=\"\$$2\""; + case "$tp" in + ""|" ") eval "$1=\"\$$2\"";; + *) eval "$1=";; + esac;; + esac;; + esac;; +*) + eval "tp=\"$oldprefix-\$$2-\""; eval "tp=\"$tp\""; + case "$tp" in + --|/*--|\~*--) eval "$1=\"$prefix/$3\"";; + /*-$oldprefix/*|\~*-$oldprefix/*) + eval "$1=\`echo \$$2 | sed \"s,^$oldprefix,$prefix,\"\`";; + *) eval "$1=\"\$$2\"";; + esac;; +esac' + diff --git a/mcon/U/Prefixup.U b/mcon/U/Prefixup.U new file mode 100644 index 0000000..46b0b15 --- /dev/null +++ b/mcon/U/Prefixup.U @@ -0,0 +1,38 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Prefixup.U,v $ +?RCS: Revision 3.0.1.1 1995/01/30 14:30:40 ram +?RCS: patch49: created +?RCS: +?X: +?X: Used as: "set dflt; eval $prefixup" to set $dflt to be $prefix/dir +?X: instead of $prefixexp/dir, in case portability was involved somehow +?X: and $prefix uses ~name expansion. +?X: +?MAKE:Prefixup: prefix prefixexp +?MAKE: -pick add $@ %< +?LINT:define prefixup +?S:prefixup: +?S: This shell variable is used internally by Configure to reset +?S: the leading installation prefix correctly when $prefix uses +?S: ~name expansion. +?S: set dflt +?S: eval $prefixup +?S: That will set $dflt to $prefix/dir if it was $prefixexp/dir and +?S: $prefix differs from $prefixexp. +?S:. +?V:prefixup +: set the prefixup variable, to restore leading tilda escape +prefixup='case "$prefixexp" in +"$prefix") ;; +*) eval "$1=\`echo \$$1 | sed \"s,^$prefixexp,$prefix,\"\`";; +esac' + diff --git a/mcon/U/Rcs.U b/mcon/U/Rcs.U new file mode 100644 index 0000000..255fcb6 --- /dev/null +++ b/mcon/U/Rcs.U @@ -0,0 +1,34 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Rcs.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:15 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This is a unit that helps people who write SH scripts and keep them under +?X: RCS, but don't think to protect the $Log and other $Id keywords from +?X: variable substitution (or people like me who do not like to). +?X: +?MAKE:Author Date Header Id Locker Log RCSfile Revision Source State: Oldconfig +?MAKE: -pick weed $@ %< +?LINT:describe Author Date Header Id Locker Log RCSfile Revision Source State +: preserve RCS keywords in files with variable substitution, grrr +?Author:Author='$Author' +?Date:Date='$Date' +?Header:Header='$Header' +?Id:Id='$Id' +?$Locker' +?Log:Log='$Log' +?RCSfile:RCSfile='$RCSfile' +?Revision:Revision='$Revision' +?Source:Source='$Source' +?State:State='$State' + diff --git a/mcon/U/Setvar.U b/mcon/U/Setvar.U new file mode 100644 index 0000000..75b640c --- /dev/null +++ b/mcon/U/Setvar.U @@ -0,0 +1,50 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Setvar.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 15:58:28 ram +?RCS: patch36: call ./whoa explicitely instead of relying on PATH +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:16 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit produces a variable that is intended to be eval'ed in +?X: order to define/undefine a symbol. A consistency check is made +?X: regarding any previous value and a warning is issued if there +?X: is any discrepancy. +?X: +?X: To use it, say: +?X: val= +?X: set d_variable +?X: eval $setvar +?X: +?MAKE:Setvar: Whoa +?MAKE: -pick add $@ %< +?LINT:define setvar +?S:setvar: +?S: This shell variable is used internally by Configure to set a value +?S: to a given symbol that is defined or not. A typical use is: +?S: val= +?S: set d_variable +?S: eval $setvar +?S: That will print a message in case the $val value is not the same +?S: as the previous value of $d_variable. +?S:. +?V:setvar:val +?T:var was td tu +: function used to set '$1' to '$val' +setvar='var=$1; eval "was=\$$1"; td=$define; tu=$undef; +case "$val$was" in +$define$undef) . ./whoa; eval "$var=\$td";; +$undef$define) . ./whoa; eval "$var=\$tu";; +*) eval "$var=$val";; +esac' + diff --git a/mcon/U/Signal.U b/mcon/U/Signal.U new file mode 100644 index 0000000..6ac5eb8 --- /dev/null +++ b/mcon/U/Signal.U @@ -0,0 +1,271 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Signal.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 15:20:01 ram +?RCS: patch61: created +?RCS: +?X: +?X: This unit produces three files: +?X: +?X: 1- A signal.c file, which, when compiled and run, produces an output like: +?X: +?X: HUP 1 +?X: INT 2 +?X: QUIT 3 +?X: etc... +?X: +?X: 2- A signal.awk script to parse the output of signal.c, fill +?X: in gaps (up to NSIG) and move duplicates to the end. +?X: +?X: 3- A signal_cmd script to compile signal.c and run it +?X: through sort -n -k 2 | uniq | awk -f signal.awk. +?X: (we try also sort -n +1 since some old hosts don't grok sort -k) +?X: (This is called signal_cmd to avoid OS/2 confusion with +?X: signal.cmd vs. signal. +?X: The signal_cmd script also falls back on checking signals one at a +?X: time in case the signal.c program fails. On at least one version of +?X: Linux 2.1.x, the header file #define'd SIGRTMAX to a symbol that +?X: is not defined by the compiler/linker. :-(. Further, on that same +?X: version of Linux, the user had a defective C-shell that gave an +?X: incorrect list for kill -l, so the fall-back didn't work. +?X: +?X: This unit is then used by sig_name.U. +?X: +?MAKE:Signal: test tr rm awk cat grep startsh eunicefix sed sort uniq \ + Findhdr cppstdin +cppflags cppminus Compile trnl run +?MAKE: -pick add $@ %< +?X:all files declared as "public" since they're used from other units +?F:signal.c signal_cmd signal.lst signal signal.awk +?T: xx xxx xxxfiles +?LINT:use rm run +: Trace out the files included by signal.h, then look for SIGxxx names. +?X: Remove SIGARRAYSIZE used by HPUX. +?X: Remove SIGSTKSIZE used by Linux. +?X: Remove SIGSTKSZ used by Posix. +?X: Remove SIGTYP void lines used by OS2. +?X: Some cpps, like os390, dont give the file name anywhere +if [ "X$fieldn" = X ]; then + : Just make some guesses. We check them later. + xxx='/usr/include/signal.h /usr/include/sys/signal.h' +else + xxx=`echo '#include ' | + $cppstdin $cppminus $cppflags 2>/dev/null | + $grep '^[ ]*#.*include' | + $awk "{print \\$$fieldn}" | $sed 's!"!!g' | \ + $sed 's!\\\\\\\\!/!g' | $sort | $uniq` +fi +?X: Check this list of files to be sure we have parsed the cpp output ok. +?X: This will also avoid potentially non-existent files, such +?X: as ../foo/bar.h +xxxfiles='' +?X: Add /dev/null in case the $xxx list is empty. +for xx in $xxx /dev/null ; do + $test -f "$xx" && xxxfiles="$xxxfiles $xx" +done +?X: If we have found no files, at least try signal.h +case "$xxxfiles" in +'') xxxfiles=`./findhdr signal.h` ;; +esac +xxx=`awk ' +$1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $2 !~ /SIGARRAYSIZE/ && $2 !~ /SIGSTKSIZE/ && $2 !~ /SIGSTKSZ/ && $3 !~ /void/ { + print substr($2, 4, 20) +} +$1 == "#" && $2 ~ /^define$/ && $3 ~ /^SIG[A-Z0-9]*$/ && $3 !~ /SIGARRAYSIZE/ && $4 !~ /void/ { + print substr($3, 4, 20) +}' $xxxfiles` +: Append some common names just in case the awk scan failed. +xxx="$xxx ABRT ALRM BUS CANCEL CHLD CLD CONT DIL EMT FPE" +xxx="$xxx FREEZE HUP ILL INT IO IOT KILL LOST LWP PHONE" +xxx="$xxx PIPE POLL PROF PWR QUIT RTMAX RTMIN SEGV STKFLT STOP" +xxx="$xxx SYS TERM THAW TRAP TSTP TTIN TTOU URG USR1 USR2" +xxx="$xxx USR3 USR4 VTALRM WAITING WINCH WIND WINDOW XCPU XFSZ" + +: generate a few handy files for later +$cat > signal.c <<'EOCP' +#include +#include +#include +int main() { + +/* Strange style to avoid deeply-nested #if/#else/#endif */ +#ifndef NSIG +# ifdef _NSIG +# define NSIG (_NSIG) +# endif +#endif + +#ifndef NSIG +# ifdef SIGMAX +# define NSIG (SIGMAX+1) +# endif +#endif + +#ifndef NSIG +# ifdef SIG_MAX +# define NSIG (SIG_MAX+1) +# endif +#endif + +#ifndef NSIG +# ifdef MAXSIG +# define NSIG (MAXSIG+1) +# endif +#endif + +#ifndef NSIG +# ifdef MAX_SIG +# define NSIG (MAX_SIG+1) +# endif +#endif + +#ifndef NSIG +# ifdef SIGARRAYSIZE +# define NSIG (SIGARRAYSIZE+1) /* Not sure of the +1 */ +# endif +#endif + +#ifndef NSIG +# ifdef _sys_nsig +# define NSIG (_sys_nsig) /* Solaris 2.5 */ +# endif +#endif + +/* Default to some arbitrary number that's big enough to get most + of the common signals. +*/ +#ifndef NSIG +# define NSIG 50 +#endif + +printf("NSIG %d\n", NSIG); + +#ifndef JUST_NSIG + +EOCP + +echo $xxx | $tr ' ' $trnl | $sort | $uniq | $awk ' +{ + printf "#ifdef SIG"; printf $1; printf "\n" + printf "printf(\""; printf $1; printf " %%d\\n\",SIG"; + printf $1; printf ");\n" + printf "#endif\n" +} +END { + printf "#endif /* JUST_NSIG */\n"; + printf "exit(0);\n}\n"; +} +' >>signal.c +$cat >signal.awk <<'EOP' +BEGIN { ndups = 0 } +$1 ~ /^NSIG$/ { nsig = $2 } +($1 !~ /^NSIG$/) && (NF == 2) { + if ($2 > maxsig) { maxsig = $2 } + if (sig_name[$2]) { + dup_name[ndups] = $1 + dup_num[ndups] = $2 + ndups++ + } + else { + sig_name[$2] = $1 + sig_num[$2] = $2 + } +} +END { + if (nsig == 0) { + nsig = maxsig + 1 + } + printf("NSIG %d\n", nsig); + for (n = 1; n < nsig; n++) { + if (sig_name[n]) { + printf("%s %d\n", sig_name[n], sig_num[n]) + } + else { + printf("NUM%d %d\n", n, n) + } + } + for (n = 0; n < ndups; n++) { + printf("%s %d\n", dup_name[n], dup_num[n]) + } +} +EOP +$cat >signal_cmd <>signal_cmd <<'EOS' + +set signal +if eval $compile_ok; then + $run ./signal$_exe | ($sort -n -k 2 2>/dev/null || $sort -n +1) | \ + $uniq | $awk -f signal.awk >signal.lst +else + echo "(I can't seem be able to compile the whole test program)" >&4 + echo "(I'll try it in little pieces.)" >&4 + set signal -DJUST_NSIG + if eval $compile_ok; then + $run ./signal$_exe > signal.nsg + $cat signal.nsg + else + echo "I can't seem to figure out how many signals you have." >&4 + echo "Guessing 50." >&4 + echo 'NSIG 50' > signal.nsg + fi + : Now look at all the signal names, one at a time. + for xx in `echo $xxx | $tr ' ' $trnl | $sort | $uniq`; do + $cat > signal.c < +#include +#include +int main() { +printf("$xx %d\n", SIG${xx}); +return 0; +} +EOCP + set signal + if eval $compile; then + echo "SIG${xx} found." + $run ./signal$_exe >> signal.ls1 + else + echo "SIG${xx} NOT found." + fi + done + if $test -s signal.ls1; then + $cat signal.nsg signal.ls1 | + $sort -n | $uniq | $awk -f signal.awk >signal.lst + fi + +fi +if $test -s signal.lst; then + : +else + echo "(AAK! I can't compile the test programs -- Guessing)" >&4 + echo 'kill -l' >signal + set X `csh -f signal.lst +fi +$rm -f signal.c signal$_exe signal$_o signal.nsg signal.ls1 +EOS +chmod a+x signal_cmd +$eunicefix signal_cmd + diff --git a/mcon/U/Tr.U b/mcon/U/Tr.U new file mode 100644 index 0000000..a7320fe --- /dev/null +++ b/mcon/U/Tr.U @@ -0,0 +1,103 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Tr.U,v $ +?RCS: Revision 3.0.1.2 1994/10/29 18:00:54 ram +?RCS: patch43: forgot to quote $@ to protect against "evil" characters +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 15:58:35 ram +?RCS: patch36: created +?RCS: +?X: +?X: This unit produces a bit of shell code that must be dotted in in order +?X: to do a character translation. It catches translations to uppercase or +?X: to lowercase, and then invokes the real tr to perform the job. +?X: +?X: This unit is necessary on HP machines (HP strikes again!) with non-ascii +?X: ROMAN8-charset, where normal letters are not arranged in a row, so a-z +?X: covers not the whole alphabet but lots of special chars. This was reported +?X: by Andreas Sahlbach . +?X: +?X: Units performing a tr '[A-Z]' '[a-z]' or the other way round should include +?X: us in their dependency and use ./tr instead. +?X: +?MAKE:Tr: startsh tr eunicefix +?MAKE: -pick add $@ %< +?F:./tr +?T:up low LC_ALL +: see whether [:lower:] and [:upper:] are supported character classes +echo " " +case "`echo AbyZ | LC_ALL=C $tr '[:lower:]' '[:upper:]' 2>/dev/null`" in +ABYZ) + echo "Good, your tr supports [:lower:] and [:upper:] to convert case." >&4 + up='[:upper:]' + low='[:lower:]' + ;; +*) # There is a discontinuity in EBCDIC between 'I' and 'J' + # (0xc9 and 0xd1), therefore that is a nice testing point. + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | LC_ALL=C $tr '[I-J]' '[i-j]' 2>/dev/null`" in + ij) up='[A-Z]' + low='[a-z]' + ;; + esac + fi + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | LC_ALL=C $tr I-J i-j 2>/dev/null`" in + ij) up='A-Z' + low='a-z' + ;; + esac + fi + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | od -x 2>/dev/null`" in + *C9D1*|*c9d1*) + echo "Hey, this might be EBCDIC." >&4 + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | \ + LC_ALL=C $tr '[A-IJ-RS-Z]' '[a-ij-rs-z]' 2>/dev/null`" in + ij) up='[A-IJ-RS-Z]' + low='[a-ij-rs-z]' + ;; + esac + fi + if test "X$up" = X -o "X$low" = X; then + case "`echo IJ | LC_ALL=C $tr A-IJ-RS-Z a-ij-rs-z 2>/dev/null`" in + ij) up='A-IJ-RS-Z' + low='a-ij-rs-z' + ;; + esac + fi + ;; + esac + fi +esac +case "`echo IJ | LC_ALL=C $tr \"$up\" \"$low\" 2>/dev/null`" in +ij) + echo "Using $up and $low to convert case." >&4 + ;; +*) + echo "I don't know how to translate letters from upper to lower case." >&4 + echo "Your tr is not acting any way I know of." >&4 + exit 1 + ;; +esac +: set up the translation script tr, must be called with ./tr of course +cat >tr <warn <msg +else + cat >msg +fi +?X: Emit the warning, prefixing all lines with '*** ' +echo "*** WARNING:" >&4 +sed -e 's/^/*** /' &4 +echo "*** " >&4 +?X: Save the warning in the logs, which will be shown again at the end +cat msg >>config.msg +echo " " >>config.msg +rm -f msg +EOS +chmod +x warn +$eunicefix warn + diff --git a/mcon/U/Warn_v7EXT.U b/mcon/U/Warn_v7EXT.U new file mode 100644 index 0000000..d015400 --- /dev/null +++ b/mcon/U/Warn_v7EXT.U @@ -0,0 +1,34 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: Warn_v7EXT.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:01:42 ram +?RCS: patch36: call ./v7 explicitely instead of relying on PATH +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:17 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: This unit issues warnings to V7 sites that they are living dangerously. +?X: This unit needs to get mentioned in End.U to get included. +?X: +?MAKE:Warn_v7EXT: package Guess +?MAKE: -pick add $@ %< +: Warnings +if ./v7; then + cat <whoa +$startsh +EOS +cat <<'EOSC' >>whoa +dflt=y +echo " " +echo "*** WHOA THERE!!! ***" >&4 +echo " The $hint value for \$$var on this machine was \"$was\"!" >&4 +rp=" Keep the $hint value?" +. ./myread +case "$ans" in +y) td=$was; tu=$was;; +esac +EOSC + diff --git a/mcon/U/abortsig.U b/mcon/U/abortsig.U new file mode 100644 index 0000000..a13f30f --- /dev/null +++ b/mcon/U/abortsig.U @@ -0,0 +1,79 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: abortsig.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:02:19 ram +?RCS: patch36: call ./usg explicitely instead of relying on PATH +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:20 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:abortsig: Myread Oldconfig Guess cat +cc ccflags rm +?MAKE: -pick add $@ %< +?S:abortsig: +?S: This variable holds the name of the signal used by the abort() call. +?S:. +?C:ABORTSIG: +?C: This symbol holds the signal number (symbol) used by the abort() call. To +?C: actually define the signal symbol, should be included. +?C:. +?H:#define ABORTSIG $abortsig /**/ +?H:. +?T:signal +: which signal is sent by abort ? +echo " " +case "$abortsig" in +'') + echo "Checking to see which signal is sent to the process by abort()..." >&4 + echo "abort" > abort.sh + chmod +x abort.sh +?X: SIGABRT should replace SIGIOT on USG machines in a near future (1991). + for signal in SIGIOT SIGILL SIGABRT; do + case "$abortsig" in + '') $cat >abort.c < +caught() { exit(0); } +int main() +{ +#ifdef $signal + signal($signal, caught); +#endif + if (-1 == abort()) + exit(1); + exit(1); +} +EOP +?X: We have to use the abort.sh script otherwise sh behaves strangely on AIX. + if $cc $ccflags -o abort abort.c >/dev/null 2>&1; then + (./abort.sh) >/dev/null 2>&1 + case $? in + 0) abortsig="$signal";; + esac + fi + ;; + esac + done + ;; +esac +case "$abortsig" in +'') echo "(I wasn't able to compute the signal name--guessing)" + if ./usg; then + dflt="SIGIOT" + else + dflt="SIGILL" + fi;; +*) dflt="$abortsig" + ;; +esac +rp="Which signal does abort() send to the process (signal name)?" +. ./myread +abortsig="$ans" +$rm -f core abort.sh abort abort.c + diff --git a/mcon/U/active.U b/mcon/U/active.U new file mode 100644 index 0000000..3a1a65c --- /dev/null +++ b/mcon/U/active.U @@ -0,0 +1,50 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: active.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:21 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:active activeexp: newslib Oldconfig Getfile +?MAKE: -pick add $@ %< +?S:active: +?S: The name of the active file for the news system. This file contains +?S: the list of active newsgroups. The name may have ~ on the front. +?S: The variable myactive is the expanded form. +?S:. +?S:activeexp (myactive): +?S: This is the same as the active variable, but is filename expanded +?S: so that later Configure units can look at the active file if desired. +?S:. +?C:ACTIVE: +?C: The name of the active file for the news system. This file contains +?C: the list of active newsgroups. The name may have ~ on the front. +?C:. +?C:ACTIVE_EXP: +?C: This is the same as ACTIVE, but is filename expanded at configuration +?C: time, for programs that do not want to deal with it themselves. +?C:. +?H:#define ACTIVE "$active" /**/ +?H:#define ACTIVE_EXP "$activeexp" /**/ +?H:. +: locate active file +echo " " +case "$active" in +'') + dflt=$newslib/active + ;; +*) dflt="$active";; +esac +fn=l~:active +rp='Where is the active file?' +. ./getfile +active="$ans" +activeexp="$ansexp" + diff --git a/mcon/U/afs.U b/mcon/U/afs.U new file mode 100644 index 0000000..4cf024b --- /dev/null +++ b/mcon/U/afs.U @@ -0,0 +1,55 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: afs.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 15:23:06 ram +?RCS: patch61: can now explicitely tell Configure whether AFS is running +?RCS: +?RCS: Revision 3.0.1.1 1993/08/24 12:24:43 ram +?RCS: patch3: created +?RCS: +?MAKE:afs afsroot: test +?MAKE: -pick add $@ %< +?S:afs: +?S: This variable is set to 'true' if AFS (Andrew File System) is used +?S: on the system, 'false' otherwise. It is possible to override this +?S: with a hint value or command line option, but you'd better know +?S: what you are doing. +?S:. +?S:afsroot: +?S: This variable is by default set to '/afs'. In the unlikely case +?S: this is not the correct root, it is possible to override this with +?S: a hint value or command line option. This will be used in subsequent +?S: tests for AFSness in the configure and test process. +?S:. +: allow them to override the AFS root +case "$afsroot" in +'') afsroot=/afs ;; +*) afsroot=$afsroot ;; +esac + +: is AFS running? +echo " " +case "$afs" in +$define|true) afs=true ;; +$undef|false) afs=false ;; +*) if $test -d $afsroot; then + afs=true + else + afs=false + fi + ;; +esac +if $afs; then + echo "AFS may be running... I'll be extra cautious then..." >&4 +else + echo "AFS does not seem to be running..." >&4 +fi + diff --git a/mcon/U/alignbytes.U b/mcon/U/alignbytes.U new file mode 100644 index 0000000..f31ec80 --- /dev/null +++ b/mcon/U/alignbytes.U @@ -0,0 +1,64 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: alignbytes.U,v $ +?RCS: Revision 3.0.1.2 1994/10/29 16:02:28 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0.1.1 1994/05/06 14:25:20 ram +?RCS: patch23: avoid ALIGNBYTES, since it conflicts on NetBSD +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:23 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:alignbytes: Myread cat cc ccflags rm +?MAKE: -pick add $@ %< +?S:alignbytes: +?S: This variable holds the number of bytes required to align a +?S: double. Usual values are 2, 4 and 8. +?S:. +?X: This used to be called ALIGNBYTES, but that conflicts with +?X: in NetBSD. +?C:MEM_ALIGNBYTES (ALIGNBYTES): +?C: This symbol contains the number of bytes required to align a +?C: double. Usual values are 2, 4 and 8. +?C:. +?H:#define MEM_ALIGNBYTES $alignbytes /**/ +?H:. +?F:!try +: check for alignment requirements +echo " " +case "$alignbytes" in +'') echo "Checking alignment constraints..." >&4 + $cat >try.c <<'EOCP' +struct foobar { + char foo; + double bar; +} try; +int main() +{ + printf("%d\n", (char *)&try.bar - (char *)&try.foo); +} +EOCP + if $cc $ccflags try.c -o try >/dev/null 2>&1; then + dflt=`./try` + else + dflt='8' + echo "(I can't seem to compile the test program...)" + fi + ;; +*) dflt="$alignbytes" + ;; +esac +rp="Doubles must be aligned on a how-many-byte boundary?" +. ./myread +alignbytes="$ans" +$rm -f try.c try + diff --git a/mcon/U/archlib.U b/mcon/U/archlib.U new file mode 100644 index 0000000..d0c2b29 --- /dev/null +++ b/mcon/U/archlib.U @@ -0,0 +1,125 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: archlib.U,v $ +?RCS: Revision 3.0.1.5 1997/02/28 15:23:38 ram +?RCS: patch61: skip existence checks for archlib +?RCS: +?RCS: Revision 3.0.1.4 1995/09/25 09:15:18 ram +?RCS: patch59: unit is now forced to the top of Configure, if possible +?RCS: +?RCS: Revision 3.0.1.3 1995/02/15 14:14:14 ram +?RCS: patch51: architecture name is now computed by a separate unit +?RCS: +?RCS: Revision 3.0.1.2 1995/01/30 14:32:22 ram +?RCS: patch49: archname is now systematically recomputed +?RCS: patch49: can now handle installation prefix changes (from WED) +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:02:36 ram +?RCS: patch36: created by ADO +?RCS: +?MAKE:d_archlib archlib archlibexp installarchlib: archname afs spackage \ + cat Getfile Loc Oldconfig prefixexp privlib test Prefixit Prefixup +?MAKE: -pick add $@ %< +?Y:TOP +?S:d_archlib: +?S: This variable conditionally defines ARCHLIB to hold the pathname +?S: of architecture-dependent library files for $package. If +?S: $archlib is the same as $privlib, then this is set to undef. +?S:. +?S:archlib: +?S: This variable holds the name of the directory in which the user wants +?S: to put architecture-dependent public library files for $package. +?S: It is most often a local directory such as /usr/local/lib. +?S: Programs using this variable must be prepared to deal +?S: with filename expansion. +?S:. +?S:archlibexp: +?S: This variable is the same as the archlib variable, but is +?S: filename expanded at configuration time, for convenient use. +?S:. +?S:installarchlib: +?S: This variable is really the same as archlibexp but may differ on +?S: those systems using AFS. For extra portability, only this variable +?S: should be used in makefiles. +?S:. +?C:ARCHLIB: +?C: This variable, if defined, holds the name of the directory in +?C: which the user wants to put architecture-dependent public +?C: library files for $package. It is most often a local directory +?C: such as /usr/local/lib. Programs using this variable must be +?C: prepared to deal with filename expansion. If ARCHLIB is the +?C: same as PRIVLIB, it is not defined, since presumably the +?C: program already searches PRIVLIB. +?C:. +?C:ARCHLIB_EXP: +?C: This symbol contains the ~name expanded version of ARCHLIB, to be used +?C: in programs that are not prepared to deal with ~ expansion at run-time. +?C:. +?H:#$d_archlib ARCHLIB "$archlib" /**/ +?H:#$d_archlib ARCHLIB_EXP "$archlibexp" /**/ +?H:. +: determine where public architecture dependent libraries go +set archlib archlib +eval $prefixit +case "$archlib" in +'') + case "$privlib" in + '') + dflt=`./loc . "." $prefixexp/lib /usr/local/lib /usr/lib /lib` + set dflt + eval $prefixup + ;; + *) dflt="$privlib/$archname";; + esac + ;; +*) dflt="$archlib";; +esac +cat < tmparch 2>&1 ; then + tarch=`$sed -e 's/ *$//' -e 's/ /_/g' \ + -e 's/$/'"-$osname/" tmparch` + else + tarch="$osname" + fi + $rm -f tmparch +else + tarch="$osname" +fi +case "$myarchname" in +''|"$tarch") ;; +*) + echo "(Your architecture name used to be $myarchname.)" + archname='' + ;; +esac +case "$archname" in +'') dflt="$tarch";; +*) dflt="$archname";; +esac +rp='What is your architecture name' +. ./myread +archname="$ans" +myarchname="$tarch" + diff --git a/mcon/U/baserev.U b/mcon/U/baserev.U new file mode 100644 index 0000000..3fc675c --- /dev/null +++ b/mcon/U/baserev.U @@ -0,0 +1,22 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: baserev.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:24 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:baserev: Null +?MAKE: -pick wipe $@ %< +?S:baserev: +?S: The base revision level of this package, from the .package file. +?S:. +: set the base revision +baserev= + diff --git a/mcon/U/basicshell.U b/mcon/U/basicshell.U new file mode 100644 index 0000000..b5ccfbc --- /dev/null +++ b/mcon/U/basicshell.U @@ -0,0 +1,47 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: basicshell.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:25 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:basicshell: Getfile Oldconfig bash csh ksh sh +?MAKE: -pick add $@ %< +?S:basicshell: +?S: This variable contains the eventual value of the BASICSHELL symbol, +?S: which contains the full name of the basic script shell on this +?S: system. Usual values are /bin/sh, /bin/ksh, /bin/csh. +?S:. +?C:BASICSHELL: +?C: This symbol contains the full name of the basic script shell on this +?C: system. Usual values are /bin/sh, /bin/ksh, /bin/csh. +?C:. +?H:#define BASICSHELL "$basicshell" /**/ +?H:. +: find the most basic shell for scripts +echo " " +case "$basicshell" in +'') + case "$sh $bash $csh $ksh" in + */sh*) dflt="$sh" ;; + */ksh*) dflt="$ksh" ;; + */csh*) dflt="$csh" ;; + */bash*) dflt="$bash" ;; + *) dflt='/bin/sh' ;; + esac + ;; +*) + dflt="$basicshell";; +esac +fn=f +rp="Give the full path name of the most basic shell used on your system" +. ./getfile +basicshell=$ans + diff --git a/mcon/U/bin.U b/mcon/U/bin.U new file mode 100644 index 0000000..81c0a96 --- /dev/null +++ b/mcon/U/bin.U @@ -0,0 +1,88 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: bin.U,v $ +?RCS: Revision 3.0.1.4 1995/09/25 09:15:32 ram +?RCS: patch59: unit is now forced to the top of Configure, if possible +?RCS: +?RCS: Revision 3.0.1.3 1995/01/30 14:32:40 ram +?RCS: patch49: can now handle installation prefix changes (from WED) +?RCS: +?RCS: Revision 3.0.1.2 1994/08/29 16:05:28 ram +?RCS: patch32: now uses installation prefix +?RCS: +?RCS: Revision 3.0.1.1 1993/09/13 15:56:51 ram +?RCS: patch10: made prompting more explicit (WAD) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:26 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:bin binexp installbin: Prefixit Getfile Oldconfig afs cat test +?MAKE: -pick add $@ %< +?Y:TOP +?S:bin: +?S: This variable holds the name of the directory in which the user wants +?S: to put publicly executable images for the package in question. It +?S: is most often a local directory such as /usr/local/bin. Programs using +?S: this variable must be prepared to deal with ~name substitution. +?S:. +?S:binexp: +?S: This is the same as the bin variable, but is filename expanded at +?S: configuration time, for use in your makefiles. +?S:. +?S:installbin: +?S: This variable is the same as binexp unless AFS is running in which case +?S: the user is explicitely prompted for it. This variable should always +?S: be used in your makefiles for maximum portability. +?S:. +?C:BIN: +?C: This symbol holds the path of the bin directory where the package will +?C: be installed. Program must be prepared to deal with ~name substitution. +?C:. +?C:BIN_EXP: +?C: This symbol is the filename expanded version of the BIN symbol, for +?C: programs that do not want to deal with that at run-time. +?C:. +?H:#define BIN "$bin" /**/ +?H:#define BIN_EXP "$binexp" /**/ +?H:. +?D:bin='/usr/local/bin' +: determine where public executables go +echo " " +set dflt bin bin +eval $prefixit +fn=d~ +rp='Pathname where the public executables will reside?' +. ./getfile +if $test "X$ansexp" != "X$binexp"; then + installbin='' +fi +bin="$ans" +binexp="$ansexp" +if $afs; then + $cat <&4 + $cat >try.c <<'EOCP' +#include +?X: Standard C requires a macro CHAR_BIT in +#ifdef __STDC__ +#include +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif +#ifndef BITSPERBYTE +#define BITSPERBYTE CHAR_BIT +#endif +#else +?X: On non standard C, try with +#include +#ifndef BITSPERBYTE +#define BITSPERBYTE 8 +#endif +#endif +int main() +{ + printf("%d\n", BITSPERBYTE); +} +EOCP + if $cc $ccflags -o try try.c >/dev/null 2>&1 ; then + dflt=`./try` + else + dflt='8' + echo "(I can't seem to compile the test program. Guessing...)" + fi + ;; +*) + dflt="$bitpbyte" + ;; +esac +rp="What is the length of a byte (in bits)?" +. ./myread +bitpbyte="$ans" +$rm -f try.c try + diff --git a/mcon/U/byteorder.U b/mcon/U/byteorder.U new file mode 100644 index 0000000..a337080 --- /dev/null +++ b/mcon/U/byteorder.U @@ -0,0 +1,99 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: byteorder.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 15:24:55 ram +?RCS: patch61: no longer ask the user if the test runs ok +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:02:58 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:28 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:byteorder: cat Myread Oldconfig Loc +cc +ccflags rm +?MAKE: -pick add $@ %< +?S:byteorder: +?S: This variable holds the byte order. In the following, larger digits +?S: indicate more significance. The variable byteorder is either 4321 +?S: on a big-endian machine, or 1234 on a little-endian, or 87654321 +?S: on a Cray ... or 3412 with weird order ! +?S:. +?C:BYTEORDER: +?C: This symbol hold the hexadecimal constant defined in byteorder, +?C: i.e. 0x1234 or 0x4321, etc... +?C:. +?H:#define BYTEORDER 0x$byteorder /* large digits for MSB */ +?H:. +?T:xxx_prompt +?F:!try +: check for ordering of bytes in a long +case "$byteorder" in +'') + $cat <<'EOM' + +In the following, larger digits indicate more significance. A big-endian +machine like a Pyramid or a Motorola 680?0 chip will come out to 4321. A +little-endian machine like a Vax or an Intel 80?86 chip would be 1234. Other +machines may have weird orders like 3412. A Cray will report 87654321. If +the test program works the default is probably right. +I'm now running the test program... +EOM + $cat >try.c <<'EOCP' +#include +int main() +{ + int i; + union { + unsigned long l; + char c[sizeof(long)]; + } u; + + if (sizeof(long) > 4) + u.l = (0x08070605L << 32) | 0x04030201L; + else + u.l = 0x04030201L; + for (i = 0; i < sizeof(long); i++) + printf("%c", u.c[i]+'0'); + printf("\n"); + exit(0); +} +EOCP + xxx_prompt=y + if $cc $ccflags -o try try.c >/dev/null 2>&1 && ./try > /dev/null; then + dflt=`./try` + case "$dflt" in + [1-4][1-4][1-4][1-4]|12345678|87654321) + echo "(The test program ran ok.)" + echo "byteorder=$dflt" + xxx_prompt=n + ;; + ????|????????) echo "(The test program ran ok.)" ;; + *) echo "(The test program didn't run right for some reason.)" ;; + esac + else + dflt='4321' + cat <<'EOM' +(I can't seem to compile the test program. Guessing big-endian...) +EOM + fi + case "$xxx_prompt" in + y) + rp="What is the order of bytes in a long?" + . ./myread + byteorder="$ans" + ;; + *) byteorder=$dflt + ;; + esac + ;; +esac +$rm -f try.c try + diff --git a/mcon/U/cc.U b/mcon/U/cc.U new file mode 100644 index 0000000..15366ff --- /dev/null +++ b/mcon/U/cc.U @@ -0,0 +1,58 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: cc.U,v $ +?RCS: Revision 3.0.1.4 1995/05/12 12:06:47 ram +?RCS: patch54: may now abort Configure when cc does not work +?RCS: +?RCS: Revision 3.0.1.3 1995/01/11 15:20:11 ram +?RCS: patch45: changed gcc checking message to a more explicit one (WED) +?RCS: +?RCS: Revision 3.0.1.2 1994/10/29 16:04:29 ram +?RCS: patch36: detect gcc even when not called as 'gcc' (ADO) +?RCS: patch36: simplified gcc version checking (ADO) +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0.1.1 1994/05/06 14:26:06 ram +?RCS: patch23: added support for gcc version (ADO) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:30 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:cc: Myread Oldconfig Checkcc test +?MAKE: -pick add $@ %< +?S:cc: +?S: This variable holds the name of a command to execute a C compiler which +?S: can resolve multiple global references that happen to have the same +?S: name. Usual values are 'cc' and 'gcc'. +?S: Fervent ANSI compilers may be called 'c89'. AIX has xlc. +?S:. +?F:!cc.cbu +?D:cc='cc' +: Determine the C compiler to be used +echo " " +case "$cc" in +'') dflt=cc;; +*) dflt="$cc";; +esac +rp="Use which C compiler?" +. ./myread +cc="$ans" + +: See whether they have no cc but they do have gcc +. ./trygcc +?X: Look for a hint-file generated 'call-back-unit'. Now that the +?X: user has specified the compiler, we may need to set or change some +?X: other defaults. +if $test -f cc.cbu; then + . ./cc.cbu +fi +. ./checkcc + diff --git a/mcon/U/ccflags.U b/mcon/U/ccflags.U new file mode 100644 index 0000000..8e61474 --- /dev/null +++ b/mcon/U/ccflags.U @@ -0,0 +1,403 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: ccflags.U,v $ +?RCS: Revision 3.0.1.9 1997/02/28 15:27:07 ram +?RCS: patch61: removed support for NO_PROTOTYPE detection on SCO +?RCS: patch61: new locincpth variable +?RCS: patch61: added info on the "additional ld flags" question +?RCS: +?RCS: Revision 3.0.1.8 1995/07/25 13:48:54 ram +?RCS: patch56: re-arranged compile line to include ldflags before objects +?RCS: +?RCS: Revision 3.0.1.7 1995/05/12 12:08:33 ram +?RCS: patch54: now checks for cc/ccflags/ldflags coherency +?RCS: +?RCS: Revision 3.0.1.6 1994/10/29 16:07:02 ram +?RCS: patch36: gcc versionning no longer relies on the C compiler's name +?RCS: patch36: simplified check for gcc version checking (ADO) +?RCS: +?RCS: Revision 3.0.1.5 1994/08/29 16:06:35 ram +?RCS: patch32: propagate -posix flag from ccflags to ldflags +?RCS: +?RCS: Revision 3.0.1.4 1994/05/06 14:28:45 ram +?RCS: patch23: -fpcc-struct-return only needed in gcc 1.x (ADO) +?RCS: patch23: cppflags now computed on an option-by-option basis +?RCS: patch23: magically added cc flags now only done the first time +?RCS: +?RCS: Revision 3.0.1.3 1993/09/13 15:58:29 ram +?RCS: patch10: explicitely mention -DDEBUG just in case they need it (WAD) +?RCS: patch10: removed all the "tans" variable usage (WAD) +?RCS: +?RCS: Revision 3.0.1.2 1993/08/27 14:39:38 ram +?RCS: patch7: added support for OSF/1 machines +?RCS: +?RCS: Revision 3.0.1.1 1993/08/25 14:00:24 ram +?RCS: patch6: added defaults for cppflags, ccflags and ldflags +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:31 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:ccflags ldflags lkflags cppflags optimize locincpth: test cat \ + Myread Guess Options Oldconfig gccversion mips_type +usrinc \ + package contains rm +cc cppstdin cppminus cpprun cpplast libpth \ + loclibpth hint +?MAKE: -pick add $@ %< +?S:ccflags: +?S: This variable contains any additional C compiler flags desired by +?S: the user. It is up to the Makefile to use this. +?S:. +?S:cppflags: +?S: This variable holds the flags that will be passed to the C pre- +?S: processor. It is up to the Makefile to use it. +?S:. +?S:optimize: +?S: This variable contains any optimizer/debugger flag that should be used. +?S: It is up to the Makefile to use it. +?S:. +?S:ldflags: +?S: This variable contains any additional C loader flags desired by +?S: the user. It is up to the Makefile to use this. +?S:. +?S:lkflags: +?S: This variable contains any additional C partial linker flags desired by +?S: the user. It is up to the Makefile to use this. +?S:. +?S:locincpth: +?S: This variable contains a list of additional directories to be +?S: searched by the compiler. The appropriate -I directives will +?S: be added to ccflags. This is intended to simplify setting +?S: local directories from the Configure command line. +?S: It's not much, but it parallels the loclibpth stuff in libpth.U. +?S:. +?T:inctest thisincl xxx flag inclwanted ftry previous thislibdir +?F:!cpp.c +?D:cppflags='' +?D:ccflags='' +?D:ldflags='' +?D:optimize='' +?INIT:: Possible local include directories to search. +?INIT:: Set locincpth to "" in a hint file to defeat local include searches. +?INIT:locincpth="/usr/local/include /opt/local/include /usr/gnu/include" +?INIT:locincpth="$locincpth /opt/gnu/include /usr/GNU/include /opt/GNU/include" +?INIT:: +?INIT:: no include file wanted by default +?INIT:inclwanted='' +?INIT: +: determine optimize, if desired, or use for debug flag also +case "$optimize" in +' '|$undef) dflt='none';; +'') dflt='-O';; +*) dflt="$optimize";; +esac +$cat </dev/null 2>&1 + then + dflt="$dflt -posix" + fi + ;; + esac +?X: turn warnings on if they're using gcc + case "$gccversion" in + 1*|2*) dflt="$dflt -Wall";; +?X: starting with version 3, add "-W -Wall -Wformat=2" by default + *) dflt="$dflt -W -Wall -Wformat=2";; + esac + ;; +esac + +?X: In USG mode, a MIPS system may need some BSD includes +case "$mips_type" in +*BSD*|'') inclwanted="$locincpth $usrinc";; +*) inclwanted="$locincpth $inclwanted $usrinc/bsd";; +esac +for thisincl in $inclwanted; do + if $test -d $thisincl; then + if $test x$thisincl != x$usrinc; then + case "$dflt" in + *$thisincl*);; + *) dflt="$dflt -I$thisincl";; + esac + fi + fi +done + +?X: Include test function (header, symbol) +inctest='if $contains $2 $usrinc/$1 >/dev/null 2>&1; then + xxx=true; +elif $contains $2 $usrinc/sys/$1 >/dev/null 2>&1; then + xxx=true; +else + xxx=false; +fi; +if $xxx; then + case "$dflt" in + *$2*);; + *) dflt="$dflt -D$2";; + esac; +fi' + +?X: +?X: OSF/1 uses __LANGUAGE_C__ instead of LANGUAGE_C +?X: +if ./osf1; then + set signal.h __LANGUAGE_C__; eval $inctest +else + set signal.h LANGUAGE_C; eval $inctest +fi + +case "$hint" in +default|recommended) dflt="$ccflags $dflt" ;; +*) dflt="$ccflags";; +esac + +case "$dflt" in +''|' ') dflt=none;; +esac +$cat <&4 + set X $cppflags + shift + cppflags='' + $cat >cpp.c <<'EOM' +#define BLURFL foo + +BLURFL xx LFRULB +EOM +?X: +?X: For each cc flag, try it out with both cppstdin and cpprun, since the +?X: first is almost surely a cc wrapper. We have to try both in case +?X: of cc flags like '-Olimit 2900' that are actually two words... +?X: + previous='' + for flag in $* + do + case "$flag" in + -*) ftry="$flag";; + *) ftry="$previous $flag";; + esac + if $cppstdin -DLFRULB=bar $ftry $cppminus cpp1.out 2>/dev/null && \ + $cpprun -DLFRULB=bar $ftry $cpplast cpp2.out 2>/dev/null && \ + $contains 'foo.*xx.*bar' cpp1.out >/dev/null 2>&1 && \ + $contains 'foo.*xx.*bar' cpp2.out >/dev/null 2>&1 + then + cppflags="$cppflags $ftry" + previous='' + else + previous="$flag" + fi + done + set X $cppflags + shift + cppflags=${1+"$@"} + case "$cppflags" in + *-*) echo "They appear to be: $cppflags";; + esac + $rm -f cpp.c cpp?.out + ;; +esac + +: flags used in final linking phase +case "$ldflags" in +'') if ./venix; then + dflt='-i -z' + else + dflt='' + fi + case "$ccflags" in + *-posix*) dflt="$dflt -posix" ;; + esac + ;; +*) dflt="$ldflags";; +esac + +: Try to guess additional flags to pick up local libraries. +for thislibdir in $libpth; do + case " $loclibpth " in + *" $thislibdir "*) + case "$dflt " in + *"-L$thislibdir "*) ;; + *) dflt="$dflt -L$thislibdir" ;; + esac + ;; + esac +done + +case "$dflt" in +'') dflt='none' ;; +*) set X $dflt; shift; dflt="$@";; +esac + +$cat <&4 +?X: Strip extra blanks in case some of the following variables are empty +set X $cc $optimize $ccflags $ldflags -o try try.c +shift +$cat >try.msg < try.c <<'EOF' +#include +int main() { exit(0); } +EOF +dflt=y +?X: Use "sh -c" to avoid error messages tagged with leading "Configure:". +?X: We need to try the resulting executable, because cc might yield a 0 status +?X: even when ld failed, in which case the executable will not run properly, +?X: if its x bit is set at all... +if sh -c "$cc $optimize $ccflags $ldflags -o try try.c" >>try.msg 2>&1; then + if sh -c './try' >>try.msg 2>&1; then + dflt=n + else + echo "The program compiled OK, but exited with status $?." >>try.msg + rp="You have a problem. Shall I abort Configure" + dflt=y + fi +else + echo "I can't compile the test program." >>try.msg + rp="You have a BIG problem. Shall I abort Configure" + dflt=y +fi +case "$dflt" in +y) + $cat try.msg >&4 +?X: using -K will prevent default aborting--maybe they're cross compiling? + case "$knowitall" in + '') + echo "(The supplied flags might be incorrect with this C compiler.)" + ;; + *) dflt=n;; + esac + echo " " + . ./myread + case "$ans" in + n*|N*) ;; + *) echo "Ok. Stopping Configure." >&4 + exit 1 + ;; + esac + ;; +n) echo "OK, that should do.";; +esac +$rm -f try try.* core + diff --git a/mcon/U/cf_email.U b/mcon/U/cf_email.U new file mode 100644 index 0000000..caad32e --- /dev/null +++ b/mcon/U/cf_email.U @@ -0,0 +1,58 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: cf_email.U,v $ +?RCS: Revision 3.0.1.1 1994/01/24 14:05:06 ram +?RCS: patch16: created +?RCS: +?RCS: +?MAKE:cf_email: cat cf_by myhostname mydomain Oldconfig Myread +?MAKE: -pick add $@ %< +?S:cf_email: +?S: Electronic mail address of the person who ran Configure. This can be +?S: used by units that require the user's e-mail, like MailList.U. +?S:. +?T:cont +: determine the e-mail address of the user who is running us +$cat < +?RCS: +?RCS: $Log: cf_name.U,v $ +?RCS: Revision 3.0.1.2 1994/05/06 14:29:36 ram +?RCS: patch23: fixed user name computation from /etc/passwd in bsd systems +?RCS: +?RCS: Revision 3.0.1.1 1994/01/24 14:05:11 ram +?RCS: patch16: created +?RCS: +?RCS: +?MAKE:+cf_name: cf_by passcat Filexp nametype cat test +?MAKE: -pick add $@ %< +?S:cf_name: +?S: Full name of the person who ran the Configure script and answered the +?S: questions. This can be used by units that require the user's full name. +?S: This variable is for internal use only. +?S:. +?T:xxx fn NAME +: figure out their full name +case "$NAME" in +'') case "$nametype" in + other) + fn=`./filexp ~/.fullname` + xxx=usg + $test -f $fn && xxx=other + ;; + *) + xxx="$nametype" + ;; + esac + + case "$xxx" in + bsd) + cf_name=`$passcat | grep "^$cf_by:" | \ + sed -e 's/^[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):.*/\1/' \ + -e 's/,.*//'` + ;; + usg) + cf_name=`$passcat | grep "^$cf_by:" | \ + sed -e 's/^[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):.*/\1/' \ + -e 's/[^-]*-\(.*\)(.*)/\1/'` + ;; + *) + cf_name=`$cat $fn` + ;; + esac + ;; +*) + cf_name="$NAME" + ;; +esac +?X: +?X: In the original unit, Graham asked for the user name, in case the above +?X: code was unable to figure it out correctly. Since now cf_name has been +?X: made an internal variable only (i.e. it is not saved in config.sh), letting +?X: the user override the computed default each time would be a pain. +?X: Therefore, I have decided to trust the above code to get it right, and for +?X: those rare cases where it will fail, too bad :-) --RAM. +?X: +echo " " +echo "Pleased to meet you, $cf_name." + diff --git a/mcon/U/cf_who.U b/mcon/U/cf_who.U new file mode 100644 index 0000000..2643d24 --- /dev/null +++ b/mcon/U/cf_who.U @@ -0,0 +1,62 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: cf_who.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 15:28:50 ram +?RCS: patch61: new computation method avoiding use of temporary file +?RCS: +?RCS: Revision 3.0.1.1 1994/05/06 14:42:34 ram +?RCS: patch23: login name now computed the hard way +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:32 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: Oldconfig dependency is there to ensure computation occurs after old values +?X: from config.sh have been loaded, so that we can supersede them. +?X: +?MAKE:cf_time cf_by: date Oldconfig +?MAKE: -pick add $@ %< +?S:cf_time: +?S: Holds the output of the "date" command when the configuration file was +?S: produced. This is used to tag both config.sh and config_h.SH. +?S:. +?S:cf_by: +?S: Login name of the person who ran the Configure script and answered the +?S: questions. This is used to tag both config.sh and config_h.SH. +?S:. +?LINT:change LC_ALL LANGUAGE +: who configured the system +?X: Ensure English date -- Jarkko Hietaniemi +cf_time=`LC_ALL=C; LANGUAGE=C; export LC_ALL; export LANGUAGE; $date 2>&1` +?X: +?X: Leave a white space between first two '(' for ksh. The sub-shell is needed +?X: on some machines to avoid the error message when logname is not found; e.g. +?X: on SUN-OS 3.2, (logname || whoami) would not execute whoami if logname was +?X: not found. Sigh! +?X: +?X: Convex had a broken logname executable which returned a non-zero status, +?X: and that broke the previous: +?X: cf_by=`( (logname) 2>/dev/null || whoami) 2>&1` +?X: Switch to emergency mode... -- RAM, 19/04/94 +?X: +?X: Parens needed to avoid error message if the program does not exist. +?X: Uses case instead of $test so it can be put before $test is defined. +?X: Don't redirect to a file because on Ultrix (under script?) logname +?X: outputs a blank line first. This method will apparently work. +cf_by=`(logname) 2>/dev/null` +case "$cf_by" in +"") + cf_by=`(whoami) 2>/dev/null` + case "$cf_by" in + "") cf_by=unknown ;; + esac ;; +esac + diff --git a/mcon/U/charorder.U b/mcon/U/charorder.U new file mode 100644 index 0000000..8ed5428 --- /dev/null +++ b/mcon/U/charorder.U @@ -0,0 +1,143 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: charorder.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:07:08 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:33 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:chorder_int chorder_short chorder_long: Myread cat +cc +ccflags rm +?MAKE: -pick add $@ %< +?S:chorder_short (d_cos d_bos): +?S: Holds the value describing the byte ordering of characters in a short. +?S: On a Big-Endian machine, that would be "c0c1". +?S:. +?S:chorder_int (charoder): +?S: Holds the value describing the byte ordering of characters in an int. +?S: For instance, on a Big-Endian machine, this would be: "c0c1c2c3". +?S:. +?S:chorder_long (d_col d_bol): +?S: Holds the value describing the byte ordering of characters in a long. +?S: On a 64 bits Big-Endian machine, that would yield: "c0c1c2c3c4c5c6c7". +?S:. +?C:CHAR_ORDER_SHORT: +?C: Holds the byte ordering of characters in a short. It's a string +?C: value like "c0c1" on a Big-Endian machine. +?C:. +?C:CHAR_ORDER_INT: +?C: Holds the byte ordering of characters in an int. It's a string +?C: value like "c0c1c2c3" on a Big-Endian machine. +?C:. +?C:CHAR_ORDER_LONG: +?C: Holds the byte ordering of characters in a long. It's a string +?C: value like "c0c1c2c3c4c5c6c7" on a 64 bits Big-Endian machine. +?C:. +?H:#define CHAR_ORDER_SHORT "$chorder_short" /* byte order in a short */ +?H:#define CHAR_ORDER_INT "$chorder_int" /* byte order in an int */ +?H:#define CHAR_ORDER_LONG "$chorder_long" /* byte order in a long */ +?H:. +?F:!byteorder +: check for character ordering +echo " " +echo "Checking out byte order..." >&4 +$cat >byteorder.c <<'EOCP' +#include + +main(argc, argv) + int argc; + char *argv[]; { + int i; + int max; + union { + short u_s; + int u_i; + long u_l; + char u_c[sizeof(long)]; + } u; + switch (argv[1][0]) { + case 'l': + u.u_l = 0L; + /* HMS: ASSERT: sizeof(long) < 10. */ + for(i = 0; i < sizeof(long); ++i) { + u.u_l *= 0x100L; + u.u_l += (0xc0 + i); + } + max = sizeof(long); + break; + case 's': + u.u_s = 0; + /* HMS: ASSERT: sizeof(short) < 10. */ + for(i = 0; i < sizeof(short); ++i) { + u.u_s *= 0x100L; + u.u_s += (0xc0 + i); + } + max = sizeof(short); + break; + case 'i': + u.u_i = 0; + /* RAM: ASSERT: sizeof(int) < 10. */ + for(i = 0; i < sizeof(int); ++i) { + u.u_l *= 0x100L; + u.u_l += (0xc0 + i); + } + max = sizeof(int); + break; + default: + max = 0; + break; + } + for(i = 0; i < max; i++) { + printf("%x", u.u_c[i] & 0x00FF); + } + printf("\n"); + exit(0); +} +EOCP +if $cc $ccflags -o byteorder byteorder.c >/dev/null 2>&1 ; then + : null statement +@if chorder_short + chorder_short=`./byteorder s` +@end +@if chorder_int + chorder_int=`./byteorder i` +@end +@if chorder_long + chorder_long=`./byteorder l` +@end +else + $cat <&4 + $cat >try.c <<'EOCP' +#include +int main() +{ + printf("%d\n", sizeof(char)); +} +EOCP + if $cc $ccflags -o try try.c >/dev/null 2>&1 ; then + dflt=`./try` + else + dflt='1' + echo "(I can't seem to compile the test program. Guessing...)" + fi + ;; +*) + dflt="$charsize" + ;; +esac +rp="What is the size of a character (in bytes)?" +. ./myread +charsize="$ans" +$rm -f try.c try + diff --git a/mcon/U/contains.U b/mcon/U/contains.U new file mode 100644 index 0000000..fcfd216 --- /dev/null +++ b/mcon/U/contains.U @@ -0,0 +1,43 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: contains.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:35 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:contains: Nothing +?MAKE: -pick add $@ %< +?S:contains: +?S: This variable holds the command to do a grep with a proper return +?S: status. On most sane systems it is simply "grep". On insane systems +?S: it is a grep followed by a cat followed by a test. This variable +?S: is primarily for the use of other Configure units. +?S:. +: Some greps do not return status, grrr. +echo "grimblepritz" >grimble +if grep blurfldyick grimble >/dev/null 2>&1 ; then + contains=contains +elif grep grimblepritz grimble >/dev/null 2>&1 ; then + contains=grep +else + contains=contains +fi +rm -f grimble +: the following should work in any shell +case "$contains" in +contains*) + echo " " + echo "AGH! Grep doesn't return a status. Attempting remedial action." + cat >contains <<'EOSS' +grep "$1" "$2" >.greptmp && cat .greptmp && test -s .greptmp +EOSS +chmod +x contains +esac + diff --git a/mcon/U/cpp_stuff.U b/mcon/U/cpp_stuff.U new file mode 100644 index 0000000..2473ef2 --- /dev/null +++ b/mcon/U/cpp_stuff.U @@ -0,0 +1,157 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: cpp_stuff.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 15:30:48 ram +?RCS: patch61: added cute quoting trick for wild stringify support +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:08:24 ram +?RCS: patch36: now uses cppstdin instead of plain cpp for consistency (ADO) +?RCS: patch36: remove temporary files when done +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:36 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:cpp_stuff cpp_quote: cat contains cppstdin cppflags cppminus rm Warn \ + package +?MAKE: -pick add $@ %< +?S:cpp_stuff: +?S: This variable contains an identification of the catenation mechanism +?S: used by the C preprocessor. +?S:. +?S:cpp_quote: +?S: This variable is set to either '"' or '' depending on whether the +?S: pre-processor pre-dates ANSI or not. It is used in the production of +?S: the SQuoTe() and EQuoTe() macros, and was introduced to overcome a bug +?S: in gcc 3.x whereby the pre-processor complained loudly about the +?S: unterminated strings. +?S:. +?C:CAT2: +?C: This macro catenates 2 tokens together. +?C:. +?C:CAT3: +?C: This macro catenates 3 tokens together. +?C:. +?C:CAT4: +?C: This macro catenates 4 tokens together. +?C:. +?C:CAT5: +?C: This macro catenates 5 tokens together. +?C:. +?C:STRINGIFY: +?C: This macro surrounds its token with double quotes. +?C:. +?C:SCAT2: +?C: This macro catenates 2 tokens together and stringifies the result. +?C:. +?C:SCAT3: +?C: This macro catenates 3 tokens together and stringifies the result. +?C:. +?C:SCAT4: +?C: This macro catenates 4 tokens together and stringifies the result. +?C:. +?C:SCAT5: +?C: This macro catenates 5 tokens together and stringifies the result. +?C:. +?H:?%<:#if $cpp_stuff == 1 +?H:?CAT2:#define CAT2(a,b)a/**/b +?H:?CAT3:#define CAT3(a,b,c)a/**/b/**/c +?H:?CAT4:#define CAT4(a,b,c,d)a/**/b/**/c/**/d +?H:?CAT5:#define CAT5(a,b,c,d,e)a/**/b/**/c/**/d/**/e +?H:?STRINGIFY:#define STRINGIFY(a)"a" +?H:?%<:#define SQuoTe(a)${cpp_quote}a +?H:?%<:#define EQuoTe(a)a${cpp_quote} +?H:?SCAT2:#define SCAT2(a,b)EQuoTe(SQuoTe(a)b) +?H:?SCAT3:#define SCAT3(a,b,c)EQuoTe(SQuoTe(a)b/**/c) +?H:?SCAT4:#define SCAT4(a,b,c,d)EQuoTe(SQuoTe(a)b/**/c/**/d) +?H:?SCAT5:#define SCAT5(a,b,c,d,e)EQuoTe(SQuoTe(a)b/**/c/**/d/**/e) +?H:?%<:#endif +?H:?%<:#if $cpp_stuff == 42 +?X: The additional level of indirection enables these macros to be +?X: used as arguments to other macros. See K&R 2nd ed., page 231. +?H:?%<:#define CaTiFy(a,b) a ## b +?H:?%<:#define CAT2(a,b) CaTiFy(a,b) +?H:?CAT3:#define CAT3(a,b,c) CAT2(CaTiFy(a,b),c) +?H:?CAT4:#define CAT4(a,b,c,d) CAT2(CaTiFy(a,b), CaTiFy(c,d)) +?H:?CAT5:#define CAT5(a,b,c,d,e) CAT2(CAT2(CaTiFy(a,b), CaTiFy(c,d)), e) +?H:?%<:#define StGiFy(a)# a +?H:?STRINGIFY:#define STRINGIFY(a)StGiFy(a) +?H:?SCAT2:#define SCAT2(a,b)StGiFy(a) StGiFy(b) +?H:?SCAT3:#define SCAT3(a,b,c)StGiFy(a) StGiFy(b) StGiFy(c) +?H:?SCAT4:#define SCAT4(a,b,c,d)StGiFy(a) StGiFy(b) StGiFy(c) StGiFy(d) +?H:?SCAT5:#define SCAT5(a,b,c,d,e)StGiFy(a) StGiFy(b) StGiFy(c) StGiFy(d) StGiFy(e) +?H:?%<:#endif +?H:?%<:#if $cpp_stuff != 1 && $cpp_stuff != 42 +?H:?%<:#include "Bletch: How does this C preprocessor catenate tokens?" +?H:?%<:#endif +?H:. +?W:%<:CAT2 CAT3 CAT4 CAT5 STRINGIFY SCAT2 SCAT3 SCAT4 SCAT5 +?F:!cpp_stuff.c +?LINT:known StGiFy EQuoTe SQuoTe CaTiFy +: how do we catenate cpp tokens here? +echo " " +echo "Checking to see how your cpp does stuff like catenate tokens..." >&4 +cpp_quote='' +$cat >cpp_stuff.c <<'EOCP' +#define RCAT(a,b)a/**/b +#define ACAT(a,b)a ## b +RCAT(Rei,ser) +ACAT(Cir,cus) +EOCP +$cppstdin $cppflags $cppminus cpp_stuff.out 2>&1 +if $contains 'Circus' cpp_stuff.out >/dev/null 2>&1; then + echo "Oh! Smells like ANSI's been here." + echo "We can catify or stringify, separately or together!" + cpp_stuff=42 +elif $contains 'Reiser' cpp_stuff.out >/dev/null 2>&1; then + echo "Ah, yes! The good old days!" + cpp_stuff=1 + $cat >cpp_stuff.c <<'EOCP' +#define SQuoTe(a)"a +#define EQuoTe(a)a" +#define CAT2(a,b)EQuoTe(SQuoTe(a)b) +CAT2(Vic,tory) +EOCP + $cppstdin $cppflags $cppminus cpp_stuff.out 2>&1 + if $contains '"Victory"' cpp_stuff.out >/dev/null 2>&1; then + echo "I'll resort to a cute trick to also be able to stringify." + cpp_quote='"' + else + $cat <&4 +$cat >foo.c <<'EOF' +#define A(x) x +#define B(y) y +A(a)B(b) +EOF +if $cpp foo.c >foo.cpp; $contains ab foo.cpp >/dev/null 2>&1; then + echo "Plain '$cpp' works just fine." + cpp_trad="$cpp" +elif $cpp -traditional foo.c >foo.cpp; \ + $contains ab foo.cpp >/dev/null 2>&1; then + echo "We'll use '$cpp -traditional' to get proper semantics." + cpp_trad="$cpp -traditional" +else + echo "I don't know how to get traditional semantics with '$cpp'." >&4 + cpp_trad="$cpp" +fi +$rm -f foo.c foo.cpp + diff --git a/mcon/U/cppfilecom.U b/mcon/U/cppfilecom.U new file mode 100644 index 0000000..d796ce8 --- /dev/null +++ b/mcon/U/cppfilecom.U @@ -0,0 +1,204 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Orginal Author: Graham Stoney +?RCS: +?RCS: $Log: cppfilecom.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:37 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:cppfilecom cppstdinflags d_cppignhdrs d_cppcanstdin: \ + contains package test Myread Oldconfig Loc Setvar cpp cc cat rm +?MAKE: -pick add $@ %< +?S:cppfilecom: +?S: This variable contains the first part of the string which will invoke +?S: the C preprocessor a file and produce to standard output, preserving +?S: comments. Typical value of "cc -E -C" or "/lib/cpp -C". +?S:. +?S:cppstdinflags: +?S: This variable contains any flags necessary to get cppfilecom to read +?S: from the standard input. +?S:. +?S:d_cppignhdrs: +?S: This symbol conditionally defines CPP_IGN_HDRS if CPP_FILE_COM ignores +?S: *.h files. +?S:. +?S:d_cppcanstdin: +?S: This symbol conditionally defines CPP_CAN_STDIN if CPP_FILE_COM can +?S: read standard input directly. +?S:. +?C:CPP_FILE_COM (CPPFILECOM): +?C: This symbol contains the first part of the string which will invoke +?C: the C preprocessor a file and produce to standard output, preserving +?C: comments. Typical value of "cc -E -C" or "/lib/cpp -C". +?C:. +?C:CPP_STDIN_FLAGS (CPPSTDINFLAGS): +?C: This variable contains any flags necessary to get CPP_FILE_COM to +?C: read from the standard input. +?C:. +?C:CPP_IGN_HDRS (CPPIGNHDRS): +?C: This symbol is defined if CPP_FILE_COM ignores *.h files. +?C:. +?C:CPP_CAN_STDIN (CPPCANSTDIN): +?C: This symbol is defined if CPP_FILE_COM can read standard input +?C: directly. +?C:. +?H:#define CPP_FILE_COM "$cppfilecom" +?H:#define CPP_STDIN_FLAGS "$cppstdinflags" +?H:#$d_cppignhdrs CPP_IGN_HDRS /* does CPP ignore .h files? */ +?H:#$d_cppcanstdin CPP_CAN_STDIN /* can CPP read stdin directly? */ +?H:. +?T:cont +?F:!testcpp.c !testcpp.h !testcpp.out +?LINT:set d_cppcanstdin d_cppignhdrs +?LINT:usefile testcpp.c testcpp.out +: see how we invoke the C preprocessor +$cat <testcpp.c +#define ABC abc +#define XYZ xyz +ABC.XYZ +/* comment */ +EOT +: +if $test "X$cppfilecom" != "X" && \ + $cppfilecom testcpp.c testcpp.out 2>/dev/null && \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 +then + echo "You used to use $cppfilecom so we'll use that again." +elif echo 'Maybe "'$cc' -E -C" will work...' && \ + $cc -E -C testcpp.c testcpp.out 2>/dev/null && \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 +then + echo "It works!" + cppfilecom="$cc -E -C" +elif echo 'Nope...maybe "'"$cc"' -P -C" will work...' && \ + $cc -P -C testcpp.c testcpp.out 2>/dev/null && \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 +then + echo "Yup, that does." + cppfilecom="$cc -P -C" +elif echo 'No such luck, maybe "'"$cpp"' -C" will work...' && \ + $cpp -C testcpp.c testcpp.out 2>/dev/null && \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 +then + echo "Yup, it does." + cppfilecom="$cpp -C" +else + cppfilecom='' + $cat <<'EOM' +I can't find a C preprocessor that will preserve comments. Please name one. +EOM +fi +: +dflt="$cppfilecom" +cont=true +while $test "$cont" ; do + echo " " + rp="How should $package run your preprocessor preserving comments?" + . ./myread + cppfilecom="$ans" + $cppfilecom testcpp.c >testcpp.out 2>&1 + if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 + then + echo "OK, that will do." + cont='' + else + echo "Sorry, I can't get that to work." + fi +done + +@if CPP_IGN_HDRS || d_cppignhdrs +: Now see if it ignores header files. +cp testcpp.c testcpp.h +$cppfilecom testcpp.h >testcpp.out 2>&1 +if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 +then + echo "Terrific; it processes .h files passed on the command line too." + val="$undef" +else + echo "It ignores .h files on the command line; pity." + val="$define" +fi +set d_cppignhdrs +eval $setvar + +@end +@if CPP_STDIN_FLAGS || CPP_CAN_STDIN || cppstdinflags || d_cppcanstdin +: Now see how to send stdin to it. +echo " " +cp testcpp.c testcpp.h +$cppfilecom testcpp.out 2>&1 +if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 +then + echo "Great; and it will read stdin if passed no arguments." + val="$define" + cppstdinflags='' +else + $cppfilecom - testcpp.out 2>&1 + if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 + then + echo "Great; and it can read stdin by passing it '-'." + val="$define" + cppstdinflags='-' + else + $cat <testcpp.out 2>&1 + if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \ + $contains comment testcpp.out >/dev/null 2>&1 + then + echo "Good; that works fine." + val="$define" + cppstdinflags="$ans" + else + echo "Sorry, I couldn't get that to work." + fi + fi + done + fi +fi +set d_cppcanstdin +eval $setvar + +@end +: cleanup cpp test files anyway +$rm -f testcpp.* + diff --git a/mcon/U/cppstdin.U b/mcon/U/cppstdin.U new file mode 100644 index 0000000..85d556d --- /dev/null +++ b/mcon/U/cppstdin.U @@ -0,0 +1,249 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: cppstdin.U,v $ +?RCS: Revision 3.0.1.4 1994/10/29 16:08:34 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0.1.3 1994/01/24 14:05:38 ram +?RCS: patch16: comment for CPPLAST was missing +?RCS: +?RCS: Revision 3.0.1.2 1993/12/15 08:18:58 ram +?RCS: patch15: new variables cpprun and cpplast, guaranteed wrapper-free +?RCS: patch15: cppstdin now tries to use cc, even at the cost of a wrapper +?RCS: +?RCS: Revision 3.0.1.1 1993/08/25 14:00:53 ram +?RCS: patch6: remove wrapper when not actually used +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:38 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:cppstdin cppminus cpprun cpplast: contains test Myread Oldconfig Loc \ + cpp +cc rm hint osname gccversion startsh eunicefix +?MAKE: -pick add $@ %< +?S:cppstdin: +?S: This variable contains the command which will invoke the C +?S: preprocessor on standard input and put the output to stdout. +?S: It is primarily used by other Configure units that ask about +?S: preprocessor symbols. +?S:. +?S:cppminus: +?S: This variable contains the second part of the string which will invoke +?S: the C preprocessor on the standard input and produce to standard +?S: output. This variable will have the value "-" if cppstdin needs +?S: a minus to specify standard input, otherwise the value is "". +?S:. +?S:cpprun: +?S: This variable contains the command which will invoke a C preprocessor +?S: on standard input and put the output to stdout. It is guaranteed not +?S: to be a wrapper and may be a null string if no preprocessor can be +?S: made directly available. This preprocessor might be different from the +?S: one used by the C compiler. Don't forget to append cpplast after the +?S: preprocessor options. +?S:. +?S:cpplast: +?S: This variable has the same functionality as cppminus, only it applies to +?S: cpprun and not cppstdin. +?S:. +?C:CPPSTDIN: +?C: This symbol contains the first part of the string which will invoke +?C: the C preprocessor on the standard input and produce to standard +?C: output. Typical value of "cc -E" or "/lib/cpp", but it can also +?C: call a wrapper. See CPPRUN. +?C:. +?C:CPPMINUS: +?C: This symbol contains the second part of the string which will invoke +?C: the C preprocessor on the standard input and produce to standard +?C: output. This symbol will have the value "-" if CPPSTDIN needs a minus +?C: to specify standard input, otherwise the value is "". +?C:. +?C:CPPRUN: +?C: This symbol contains the string which will invoke a C preprocessor on +?C: the standard input and produce to standard output. It needs to end +?C: with CPPLAST, after all other preprocessor flags have been specified. +?C: The main difference with CPPSTDIN is that this program will never be a +?C: pointer to a shell wrapper, i.e. it will be empty if no preprocessor is +?C: available directly to the user. Note that it may well be different from +?C: the preprocessor used to compile the C program. +?C:. +?C:CPPLAST: +?C: This symbol is intended to be used along with CPPRUN in the same manner +?C: symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "". +?C:. +?H:#define CPPSTDIN "$cppstdin" +?H:#define CPPMINUS "$cppminus" +?H:#define CPPRUN "$cpprun" +?H:#define CPPLAST "$cpplast" +?H:. +?F:cppstdin !testcpp.out !testcpp.c +?T:wrapper x_cpp x_minus ok +: see how we invoke the C preprocessor +echo " " +echo "Now, how can we feed standard input to your C preprocessor..." >&4 +cat <<'EOT' >testcpp.c +#define ABC abc +#define XYZ xyz +ABC.XYZ +EOT +cd .. +if $test ! -f cppstdin; then + echo "$startsh" >cppstdin +if $test "X$osname" = "Xaix" -a "X$gccversion" = X; then +?X: AIX cc -E doesn't show the absolute headerfile +?X: locations but we'll cheat by using the -M flag. + echo 'cat >.$$.c; rm -f .$$.u; '"$cc"' ${1+"$@"} -M -c .$$.c 2>/dev/null; \ + test -s .$$.u && \ + awk '"'"'$2 ~ /\.h$/ { print "# 0 \""$2"\"" }'"'"' .$$.u; \ + rm -f .$$.o .$$.u; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >> cppstdin +else + echo 'cat >.$$.c; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >>cppstdin +fi; else + echo "Keeping your $hint cppstdin wrapper." +fi +chmod 755 cppstdin +$eunicefix cppstdin +wrapper=`pwd`/cppstdin +ok='false' +cd UU + +?X: +?X: We'll run the cpp tests again if we don't have any valid C preprocessor +?X: yet or don't know how to proceed without a wrapper (in which case cpprun +?X: is empty and that's really annoying...) +?X: +if $test "X$cppstdin" != "X" && \ + $cppstdin $cppminus testcpp.out 2>&1 && \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 +then + echo "You used to use $cppstdin $cppminus so we'll use that again." + case "$cpprun" in + '') echo "But let's see if we can live without a wrapper..." ;; + *) + if $cpprun $cpplast testcpp.out 2>&1 && \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 + then + echo "(And we'll use $cpprun $cpplast to preprocess directly.)" + ok='true' + else + echo "(However, $cpprun $cpplast does not work, let's see...)" + fi + ;; + esac +else + case "$cppstdin" in + '') ;; + *) + echo "Good old $cppstdin $cppminus does not seem to be of any help..." + ;; + esac +fi + +if $ok; then + : nothing +elif echo 'Maybe "'"$cc"' -E" will work...'; \ + $cc -E testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "Yup, it does." + x_cpp="$cc -E" + x_minus=''; +elif echo 'Nope...maybe "'"$cc"' -E -" will work...'; \ + $cc -E - testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "Yup, it does." + x_cpp="$cc -E" + x_minus='-'; +elif echo 'Nope...maybe "'"$cc"' -P" will work...'; \ + $cc -P testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "Yipee, that works!" + x_cpp="$cc -P" + x_minus=''; +elif echo 'Nope...maybe "'"$cc"' -P -" will work...'; \ + $cc -P - testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "At long last!" + x_cpp="$cc -P" + x_minus='-'; +elif echo 'No such luck, maybe "'$cpp'" will work...'; \ + $cpp testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "It works!" + x_cpp="$cpp" + x_minus=''; +elif echo 'Nixed again...maybe "'$cpp' -" will work...'; \ + $cpp - testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "Hooray, it works! I was beginning to wonder." + x_cpp="$cpp" + x_minus='-'; +elif echo 'Uh-uh. Time to get fancy. Trying a wrapper...'; \ + $wrapper testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + x_cpp="$wrapper" + x_minus='' + echo "Eureka!" +else + dflt='' + rp="No dice. I can't find a C preprocessor. Name one:" + . ./myread + x_cpp="$ans" + x_minus='' + $x_cpp testcpp.out 2>&1 + if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then + echo "OK, that will do." >&4 + else +echo "Sorry, I can't get that to work. Go find one and rerun Configure." >&4 + exit 1 + fi +fi + +case "$ok" in +false) + cppstdin="$x_cpp" + cppminus="$x_minus" + cpprun="$x_cpp" + cpplast="$x_minus" +?X: +?X: If /lib/cpp is used, try using a wrapper to increase our chances to have +?X: the C compiler and our $cppstdin agree on the same symbols... However, +?X: since cpprun is guaranteed not to be a wrapper, we must clear it if the +?X: only preprocessor we found was a wrapper, with all our luck... +?X: + set X $x_cpp + shift + case "$1" in + "$cpp") + echo "Perhaps can we force $cc -E using a wrapper..." + if $wrapper testcpp.out 2>&1; \ + $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 + then + echo "Yup, we can." + cppstdin="$wrapper" + cppminus=''; + else + echo "Nope, we'll have to live without it..." + fi + ;; + esac + case "$cpprun" in + "$wrapper") + cpprun='' + cpplast='' + ;; + esac + ;; +esac + +case "$cppstdin" in +"$wrapper"|'cppstdin') ;; +*) $rm -f $wrapper;; +esac +$rm -f testcpp.c testcpp.out + diff --git a/mcon/U/d_NOFILE.U b/mcon/U/d_NOFILE.U new file mode 100644 index 0000000..7685cd1 --- /dev/null +++ b/mcon/U/d_NOFILE.U @@ -0,0 +1,189 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_NOFILE.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:08:38 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:39 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:nofile d_gettblsz tablesize: Myread Guess cat +cc +ccflags +libs \ + test rm Csym +?MAKE: -pick add $@ %< +?S:nofile: +?S: This variable contains the number of file descriptors available to the +?S: process. +?S:. +?S:d_gettblsz: +?S: This variable conditionally handles remapping of the getdtablesize() +?S: subroutine to ulimit(4,0), or the NOFILE manifest constant. +?S:. +?S:tablesize: +?S: This variable contains either the 'NOFILE' constant or 'ulimit(4, 0L)' +?S: and is used as the remapped value for the getdtablesize() macro. +?S:. +?C:getdtablesize: +?C: This catches use of the getdtablesize() subroutine, and remaps it +?C: to either ulimit(4,0) or NOFILE, if getdtablesize() isn't available. +?C:. +?C:VAL_NOFILE: +?C: This symbol contains the number of file descriptors available to the +?C: process, as determined at configuration time. Unless a static constant +?C: is needed, you should rely on getdtablesize() to obtain that number. +?C:. +?H:#$d_gettblsz getdtablesize() $tablesize /**/ +?H:#define VAL_NOFILE $nofile /* Number of file descriptors */ +?H:. +?F:!nofile +?T:d_ulimit4 val +: see if getdtablesize exists +echo " " +?X: Revert logical value (d_gettblsz is undef iff getdtablesize is present) +case "$d_gettblsz" in +$define) d_gettblsz="$undef";; +$undef) d_gettblsz="$define";; +esac +if set getdtablesize val -f d_gettblsz; eval $csym; $val; then + echo 'getdtablesize() found.' >&4 + d_gettblsz="$undef" + tablesize='' +@if VAL_NOFILE || nofile + $cat >nofile.c <<'EOCP' +#include +int main() +{ + printf("%d\n", getdtablesize()); +} +EOCP + nofile='' + if $cc $ccflags -o nofile nofile.c $libs >/dev/null 2>&1; then + nofile=`./nofile 2>/dev/null` + fi + if $test "$nofile"; then + echo "(You have $nofile file descriptors available per process.)" + else + nofile='20' + if ./bsd; then + nofile='64' + fi + echo "(Hmm... Let's say you have $nofile file descriptors available.)" + fi +@end +else + echo 'getdtablesize() NOT found...' >&4 + if set ulimit val -f; eval $csym; $val; then + echo 'Maybe ulimit(4,0) will work...' + $cat >nofile.c <<'EOCP' +#include +#ifdef GETPARAM_H +#include +#endif +int main() +{ + printf("%d %d\n", +#ifdef NOFILE + NOFILE, +#else + 0, +#endif + ulimit(4,0)); + exit(0); +} +EOCP + if $cc $ccflags -DGETPARAM_H -o nofile nofile.c $libs >/dev/null 2>&1 \ + || $cc $ccflags -o nofile nofile.c $libs >/dev/null 2>&1 ; then + set `./nofile` + d_gettblsz=$1 + d_ulimit4=$2 + if $test "$d_ulimit4" -lt 0; then + echo "Your ulimit() call doesn't tell me what I want to know." + echo "We'll just use NOFILE in this case." + nofile=$d_gettblsz + d_gettblsz="$define" + tablesize='NOFILE' + else + if $test "$d_gettblsz" -gt 0; then + echo "Your system defines NOFILE to be $d_gettblsz, and" >&4 + else + echo "I had trouble getting NOFILE from your system, but" >&4 + fi +echo "ulimit returns $d_ulimit4 as the number of available file descriptors." >&4 + dflt='y'; + echo " " + rp='Should I use ulimit to get the number of available file descriptors?' + . ./myread + case "$ans" in + y*) + nofile=$d_ulimit4 + d_gettblsz="$define" + tablesize='ulimit(4, 0L)' + echo "Using ulimit(4,0)." + ;; + *) + nofile=$d_gettblsz + d_gettblsz="$define" + tablesize='NOFILE' + echo "Using NOFILE." + ;; + esac + fi + else + echo "Strange, I couldn't get my test program to compile." + echo "We'll just use NOFILE in this case." + d_gettblsz="$define" + tablesize='NOFILE' + nofile='' + fi + else + echo 'Using NOFILE instead.' + d_gettblsz="$define" + tablesize='NOFILE' + nofile='' + fi +fi +@if VAL_NOFILE || nofile +case "$nofile" in +'') + $cat >nofile.c <<'EOCP' +#include +#ifdef GETPARAM_H +#include +#endif +int main() +{ + printf("%d\n", +#ifdef NOFILE + NOFILE, +#else + 0, +#endif + ); + exit(0); +} +EOCP + if $cc $ccflags -DGETPARAM_H -o nofile nofile.c $libs >/dev/null 2>&1 \ + || $cc $ccflags -o nofile nofile.c $libs >/dev/null 2>&1 ; then + nofile=`./nofile 2>/dev/null` + fi + if $test "$nofile"; then + echo "(You have $nofile file descriptors available per process.)" + else + nofile='20' + if ./bsd; then + nofile='64' + fi + echo "(Hmm... Let's say you have $nofile file descriptors available.)" + fi + ;; +esac +@end +$rm -f nofile* + diff --git a/mcon/U/d_NeWS.U b/mcon/U/d_NeWS.U new file mode 100644 index 0000000..29d1539 --- /dev/null +++ b/mcon/U/d_NeWS.U @@ -0,0 +1,101 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_NeWS.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:39 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_news d_news0 d_newshome d_textcan: test rm Myread Getfile +?MAKE: -pick add $@ %< +?S:d_news: +?S: Set if running NeWS 1.1 +?S:. +?S:d_news0: +?S: Set if running NeWS 1.0 +?S:. +?S:d_newshome: +?S: Path to the top directory of the NeWS structure. +?S:. +?S:d_textcan: +?S: Path to where the textcan.ps stuff is... +?S:. +?C:HAS_NEWS1_1 (NEWS1_1): +?C: This symbol defined if running NeWS 1.1. +?C:. +?C:HAS_NEWS1_0 (NEWS1_0): +?C: This symbol defined if running NeWS 1.0. +?C:. +?C:TEXTCAN: +?C: Tells path to where the textcan.ps stuff is... +?C:. +?H:#$d_news HAS_NEWS1_1 /**/ +?H:#$d_news0 HAS_NEWS1_0 /**/ +?H:#define TEXTCAN $d_textcan /**/ +?H:. +?INIT:: default path for NeWS +?INIT:d_newshome="/usr/NeWS" +?INIT: +: Check to see what version of NeWS is being run? +cd .. +echo " " +echo "Now for the interesting stuff... Lets see what kind of NeWS" +echo "they grow round here...." +echo " " +dflt='y' +if $test -d $d_newshome; then + d_newshome=`(cd $d_newshome ; /bin/pwd)` + echo "Ah...found myself a NeWS in $d_newshome..." + dflt='y' + rp="Is this the NeWS you want your children to grow up with?" + . UU/myread +fi +while $test $ans = "n"; do +dflt=$d_newshome +fn=d +rp="Path to NeWS you want:" +. UU/getfile +d_newshome=$ans + +echo " " +if $test ! -d $d_newshome/lib; then + echo "ARG! No lib directory in $d_newshome!!!" + : heavy medicine. I wonder what the disease is... + $rm -f kit*isdone + $rm -rf UU + : bye bye + set -t; echo "Sorry... no NeWS is bad news..." +fi + +if $test -r $d_newshome/lib/NeWS/colors.ps ; then + echo 'Ahh... your running NeWS 1.1! Boy... that makes stuff easy....' + echo " " + d_news="$define" + d_news0="$undef" + if $test -r $d_newshome/lib/NeWS/textcan.ps; then + d_textcan=$d_newshome/lib/NeWS + echo "The textcan.ps stuff seems to be in : $d_textcan" + else + d_textcan=$d_newshome/clientsrc/client/nterm + if $test ! -r $d_textcan/textcan.ps; then + d_news="$undef" + d_news0="$define" + echo 'Hmm... must have been fooled... gotta be NeWS 1.1 beta!' + else + echo "The textcan.ps stuff seems to be in : $d_textcan" + fi + fi +else + echo 'snif... snif... I smell the dilapidated smell of NeWS 1.0..' + echo 'Some things will not work under NeWS 1.0...' + d_news="$undef" + d_news0="$define" +fi +cd UU + diff --git a/mcon/U/d_PORTAR.U b/mcon/U/d_PORTAR.U new file mode 100644 index 0000000..55251c7 --- /dev/null +++ b/mcon/U/d_PORTAR.U @@ -0,0 +1,79 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_PORTAR.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:08:42 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:40 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_PORTAR: cat +cc rm Setvar +?MAKE: -pick add $@ %< +?S:d_PORTAR: +?S: This variable conditionally handles definition of PORTAR, +?S: a creation of greater minds than I can imagine. +?S:. +?C:PORTAR: +?C: This manifest constant must be defined to 1 for some implementations +?C: of ar.h to get the portable ar most everybody uses. +?C:. +?L:ar_fmag: +?L:ARFMAG: +?L:SARMAG: +?H:#$d_PORTAR PORTAR 1 /**/ +?H:. +?F:!portar +?LINT:set d_PORTAR +: see if we need to define PORTAR +echo " " +echo 'Checking to see if we need to define PORTAR for portable archives...' >&4 +$cat >portar.c <<'EOCP' +#include +int main() { + char *arfmag = ARFMAG; + int sarmag = SARMAG; + struct ar_hdr arh; + + strncpy(arh.ar_fmag, arfmag, 2); + +#ifdef PORTAR + printf("D\n"); +#else + printf("U\n"); +#endif + exit(0);} +EOCP +if $cc -o portar portar.c >/dev/null 2>&1 || \ + $cc -DPORTAR=1 -o portar portar.c >/dev/null 2>&1 ; then + case "`./portar`" in + D) + val="$define" + echo "We'll be defining PORTAR for you." + ;; + U) + val="$undef" + echo "We don't seem to need PORTAR defined here." + ;; + *) + val="$define" + echo "(My test program gave me an unexpected value!)" + echo "I'll just define PORTAR to be sure." + ;; + esac +else + echo "(Strange, I couldn't get my test program to compile.)" + echo "We'll just define PORTAR in this case." + val="$define" +fi +set d_PORTAR +eval $setvar +$rm -f portar* + diff --git a/mcon/U/d_SHM_MAC.U b/mcon/U/d_SHM_MAC.U new file mode 100644 index 0000000..f8e87aa --- /dev/null +++ b/mcon/U/d_SHM_MAC.U @@ -0,0 +1,141 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_SHM_MAC.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:41 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_SHM_MAC d_SHM_PRM d_SHM_SEG d_SHM_IMMU: cat d_shm test rm +cc +ccflags +?MAKE: -pick add $@ %< +?S:d_SHM_MAC: +?S: Sometimes, the SHMLBA manifest needs sys/sysmacros.h, usually for +?S: the ctob() macro. +?S:. +?S:d_SHM_PRM: +?S: Sometimes, the SHMLBA manifest needs sys/param.h, usually for the +?S: NBPC constant. +?S:. +?S:d_SHM_SEG: +?S: Sometimes, the SHMLBA manifest needs sys/seg.h, usually for the +?S: SNUMSHFT constant. +?S:. +?S:d_SHM_IMMU: +?S: Sometimes, the SHMLBA manifest needs sys/immu.h, usually for the +?S: stob() macro. +?S:. +?C:SHMLBA_WANTS_SYSMACROS: +?C: This value tells us to include because SHMLBA +?C: needs something from there, probably the ctob() macro. +?C:. +?C:SHMLBA_WANTS_PARAM: +?C: This value tells us to include because SHMLBA needs +?C: something from there, probably the NBPC constant. +?C:. +?C:SHMLBA_WANTS_SEG: +?C: This value tells us to include because SHMLBA needs +?C: something from there, probably the SNUMSHFT constant. +?C:. +?C:SHMLBA_WANTS_IMMU: +?C: This value tells us to include because SHMLBA needs +?C: something from there, probably the stob() macro. (tower_600 only?) +?C:. +?H:#$d_SHM_MAC SHMLBA_WANTS_SYSMACROS /* SHMLBA wants ctob()? */ +?H:#$d_SHM_PRM SHMLBA_WANTS_PARAM /* SHMLBA wants NBPC? */ +?H:#$d_SHM_SEG SHMLBA_WANTS_SEG /* SHMLBA wants SNUMSHFT? */ +?H:#$d_SHM_IMMU SHMLBA_WANTS_IMMU /* SHMLBA wants stob()? */ +?H:. +?T:flags D_sys_immu D_sys_seg D_sys_sysmacros D_sys_param +: check for SHMLBA braindamage +d_SHM_MAC="$undef" +d_SHM_PRM="$undef" +d_SHM_SEG="$undef" +d_SHM_IMMU="$undef" +if $test "$d_shm" = "$define" ; then + echo " " + $cat >&4 <shm_mac.c <<'EOCP' +#include +#include +#include +#ifdef I_SYS_IMMU +#include +#endif +#ifdef I_SYS_SYSMACROS +#include +#endif +#ifdef I_SYS_PARAM +#include +#endif +#ifdef I_SYS_SEG +#include +#endif + +int main() { + int foo = SHMLBA ; + } +EOCP + flags='xxx' + for D_sys_immu in '' '-DI_SYS_IMMU'; do + for D_sys_seg in '' '-DI_SYS_SEG'; do + for D_sys_sysmacros in '' '-DI_SYS_SYSMACROS'; do + for D_sys_param in '' '-DI_SYS_PARAM'; do + case "$flags" in + 'xxx') + case "$D_sys_immu$D_sys_param$D_sys_sysmacros$D_sys_seg" in + '') + echo "Trying it normally..." + ;; + *) + echo "Trying $D_sys_immu $D_sys_param $D_sys_sysmacros $D_sys_seg" + ;; + esac + if $cc $ccflags \ + $D_sys_immu $D_sys_param $D_sys_sysmacros $D_sys_seg \ + -o shm_mac shm_mac.c >/dev/null 2>&1 ; then + set X $D_sys_immu $D_sys_param $D_sys_sysmacros $D_sys_seg + shift + flags="$*" + echo "Succeeded with $flags" + fi + ;; + esac + done + done + done + done + case "$flags" in + xxx) + echo "I don't know how to keep SHMLBA happy. Good luck!" + ;; + esac + case "$flags" in + *I_SYS_PARAM*) d_SHM_PRM="$define";; + esac + case "$flags" in + *I_SYS_SYSMACROS*) d_SHM_MAC="$define";; + esac + case "$flags" in + *I_SYS_SEG*) d_SHM_SEG="$define";; + esac + case "$flags" in + *I_SYS_IMMU*) d_SHM_IMMU="$define";; + esac +fi +$rm -f shm_mac* + diff --git a/mcon/U/d_access.U b/mcon/U/d_access.U new file mode 100644 index 0000000..2e1db7d --- /dev/null +++ b/mcon/U/d_access.U @@ -0,0 +1,74 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_access.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:42 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_access: test +cc cat +cppflags h_fcntl h_sysfile rm Inlibc Findhdr +?MAKE: -pick add $@ %< +?S:d_access: +?S: This variable conditionally defines HAS_ACCESS if the access() system +?S: call is available to check for access permissions using real IDs. +?S:. +?C:HAS_ACCESS: +?C: This manifest constant lets the C program know that the access() +?C: system call is available to check for accessibility using real UID/GID. +?C: (always present on UNIX.) +?C:. +?H:#$d_access HAS_ACCESS /**/ +?H:. +?W:%<:R_OK W_OK X_OK F_OK +?LINT:set d_access +?LINT:change h_fcntl h_sysfile +: access call always available on UNIX +set access d_access +eval $inlibc + +: locate the flags for 'access()' +case "$d_access" in +"$define") + echo " " + $cat >access.c <<'EOCP' +#include +#ifdef I_FCNTL +#include +#endif +#ifdef I_SYS_FILE +#include +#endif +#ifdef I_UNISTD +#include +#endif +int main() { + exit(R_OK); +} +EOCP + : check sys/file.h first, no particular reason here + if $test `./findhdr sys/file.h` && \ + $cc -o access $cppflags -DI_SYS_FILE access.c >/dev/null 2>&1 ; then + h_sysfile=true; + echo " defines the *_OK access constants." >&4 + elif $test `./findhdr fcntl.h` && \ + $cc -o access $cppflags -DI_FCNTL access.c >/dev/null 2>&1 ; then + h_fcntl=true; + echo " defines the *_OK access constants." >&4 +@if I_UNISTD + elif $test `./findhdr unistd.h` && \ + $cc -o access $cppflags -DI_UNISTD access.c >/dev/null 2>&1 ; then + echo " defines the *_OK access constants." >&4 +@end + else + echo "I can't find the four *_OK access constants--I'll use mine." >&4 + fi + ;; +esac +$rm -f access* + diff --git a/mcon/U/d_alarm.U b/mcon/U/d_alarm.U new file mode 100644 index 0000000..589d125 --- /dev/null +++ b/mcon/U/d_alarm.U @@ -0,0 +1,33 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_alarm.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:06:58 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_alarm: Inlibc +?MAKE: -pick add $@ %< +?S:d_alarm: +?S: This variable conditionally defines the HAS_ALARM symbol, which +?S: indicates to the C program that the alarm() routine is available. +?S:. +?C:HAS_ALARM : +?C: This symbol, if defined, indicates that the alarm routine is +?C: available. +?C:. +?H:#$d_alarm HAS_ALARM /**/ +?H:. +?LINT:set d_alarm +: see if alarm exists +set alarm d_alarm +eval $inlibc + diff --git a/mcon/U/d_attribut.U b/mcon/U/d_attribut.U new file mode 100644 index 0000000..8ff5422 --- /dev/null +++ b/mcon/U/d_attribut.U @@ -0,0 +1,64 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_attribut.U,v $ +?RCS: Revision 3.0.1.3 1995/01/30 14:33:45 ram +?RCS: patch49: test C program now includes (WED) +?RCS: +?RCS: Revision 3.0.1.2 1995/01/11 15:25:47 ram +?RCS: patch45: fixed typo in the d_attribut variable (ADO) +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:08:55 ram +?RCS: patch36: created by ADO +?RCS: +?MAKE:d_attribut: Myread Oldconfig cat cc ccflags rm Setvar contains +?MAKE: -pick add $@ %< +?S:d_attribut (d_attrib): +?S: This variable conditionally defines HASATTRIBUTE, which +?S: indicates the C compiler can check for function attributes, +?S: such as printf formats. +?S:. +?C:HASATTRIBUTE ~ %< (GNUC_ATTRIBUTE_CHECK): +?C: This symbol indicates the C compiler can check for function attributes, +?C: such as printf formats. This is normally only supported by GNU cc. +?C:. +?H:?%<:#$d_attribut HASATTRIBUTE /**/ +?H:?%<:#ifndef HASATTRIBUTE +?H:?%<:#define __attribute__(_arg_) +?H:?%<:#endif +?H:. +?W:%<:__attribute__ +?LINT:set d_attribut +?LINT:known __attribute__ +: Look for GNU-cc style attribute checking +echo " " +echo "Checking whether your compiler can handle __attribute__ ..." >&4 +$cat >attrib.c <<'EOCP' +#include +void croak (char* pat,...) __attribute__((format(printf,1,2),noreturn)); +EOCP +if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then + if $contains 'warning' attrib.out >/dev/null 2>&1; then + echo "Your C compiler doesn't fully support __attribute__." + val="$undef" + else + echo "Your C compiler supports __attribute__." + val="$define" + fi +else + echo "Your C compiler doesn't seem to understand __attribute__ at all." + val="$undef" +fi +set d_attribut +eval $setvar +$rm -f attrib* + diff --git a/mcon/U/d_bcmp.U b/mcon/U/d_bcmp.U new file mode 100644 index 0000000..ae2e4bd --- /dev/null +++ b/mcon/U/d_bcmp.U @@ -0,0 +1,44 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_bcmp.U,v $ +?RCS: Revision 3.0.1.2 1993/10/16 13:47:52 ram +?RCS: patch12: added magic support for bcmp() +?RCS: +?RCS: Revision 3.0.1.1 1993/09/13 16:00:44 ram +?RCS: patch10: now only defines HAS_BCMP, no macro remap on memcmp (WAD) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:42 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_bcmp: Inlibc +?MAKE: -pick add $@ %< +?S:d_bcmp: +?S: This variable conditionally defines the HAS_BCMP symbol if +?S: the bcmp() routine is available to compare strings. +?S:. +?C:HAS_BCMP: +?C: This symbol is defined if the bcmp() routine is available to +?C: compare blocks of memory. +?C:. +?H:#$d_bcmp HAS_BCMP /**/ +?H:. +?M:bcmp: HAS_BCMP +?M:#ifndef HAS_BCMP +?M:#ifndef bcmp +?M:#define bcmp(s,d,l) memcmp((s),(d),(l)) +?M:#endif +?M:#endif +?M:. +?LINT:set d_bcmp +: see if bcmp exists +set bcmp d_bcmp +eval $inlibc + diff --git a/mcon/U/d_bcopy.U b/mcon/U/d_bcopy.U new file mode 100644 index 0000000..2ae3ad8 --- /dev/null +++ b/mcon/U/d_bcopy.U @@ -0,0 +1,44 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_bcopy.U,v $ +?RCS: Revision 3.0.1.2 1993/10/16 13:48:04 ram +?RCS: patch12: added magic support for bcopy() +?RCS: +?RCS: Revision 3.0.1.1 1993/09/13 16:01:11 ram +?RCS: patch10: now only defines HAS_BCOPY, no macro remap on memcpy (WAD) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:44 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_bcopy: Inlibc +?MAKE: -pick add $@ %< +?S:d_bcopy: +?S: This variable conditionally defines the HAS_BCOPY symbol if +?S: the bcopy() routine is available to copy strings. +?S:. +?C:HAS_BCOPY: +?C: This symbol is defined if the bcopy() routine is available to +?C: copy blocks of memory. +?C:. +?H:#$d_bcopy HAS_BCOPY /**/ +?H:. +?M:bcopy: HAS_BCOPY +?M:#ifndef HAS_BCOPY +?M:#ifndef bcopy +?M:#define bcopy(s,d,l) memcpy((d),(s),(l)) +?M:#endif +?M:#endif +?M:. +?LINT:set d_bcopy +: see if bcopy exists +set bcopy d_bcopy +eval $inlibc + diff --git a/mcon/U/d_brokstat.U b/mcon/U/d_brokstat.U new file mode 100644 index 0000000..a330dba --- /dev/null +++ b/mcon/U/d_brokstat.U @@ -0,0 +1,75 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_brokstat.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 15:30:53 ram +?RCS: patch61: created +?RCS: +?MAKE:d_brokstat: cat contains cppstdin cppminus +cppflags rm Setvar +?MAKE: -pick add $@ %< +?S:d_brokstat: +?S: This variable conditionally defines STAT_MACROS_BROKEN if some +?S: of the S_IS*() macros from give false positive on +?S: regular files. +?S:. +?C:STAT_MACROS_BROKEN: +?C: This symbol, if defined, indicates that the S_IS*() stat macros +?C: such as S_ISBLK() give false positive and are thus unusable. +?C: Your best bet is then to supply your own set. +?C:. +?H:#$d_brokstat STAT_MACROS_BROKEN /**/ +?H:. +?F:!try.c !try +?LINT:set d_brokstat +?LINT:usefile try +?X: This test inspired by autoconf -- RAM, 28/02/97 +: are stat macros sane? +echo " " +echo "Checking whether your stat() macros are broken..." +$cat >try.c <<'EOC' +#include +#include + +#if defined(S_ISBLK) && defined(S_IFDIR) +#if S_ISBLK(S_IFDIR) +Broken +#endif +#endif + +#if defined(S_ISBLK) && defined(S_IFCHR) +#if S_ISBLK(S_IFCHR) +Broken +#endif +#endif + +#if defined(S_ISLNK) && defined(S_IFREG) +#if S_ISLNK(S_IFREG) +Broken. +#endif +#endif + +#if defined(S_ISSOCK) && defined(S_IFREG) +#if S_ISSOCK(S_IFREG) +Broken. +#endif +#endif +EOC +$cppstdin $cppflags $cppminus /dev/null >try +if $contains Broken try >/dev/null 2>&1; then + echo "Alas, they are. I'll use my own macro set then." >&4 + val="$define" +else + echo "Nope, working just fine." >&4 + val="$undef" +fi +$rm -f try try.c +set d_brokstat +eval $setvar + diff --git a/mcon/U/d_bsdjmp.U b/mcon/U/d_bsdjmp.U new file mode 100644 index 0000000..da2f496 --- /dev/null +++ b/mcon/U/d_bsdjmp.U @@ -0,0 +1,86 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_bsdjmp.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 15:31:10 ram +?RCS: patch61: added ?F: metalint hint +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:09:09 ram +?RCS: patch36: call ./usg explicitely instead of relying on PATH +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:45 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_bsdjmp: Guess Setvar cat +cc libs rm +?MAKE: -pick add $@ %< +?S:d_bsdjmp: +?S: This variable conditionally defines USE_BSDJMP if BSD _setjmp and +?S: _longjmp routines are available to do non-local gotos without saving +?S: or restoring the signal mask flag. +?S:. +?C:USE_BSDJMP (BSDJMP): +?C: This symbol, if defined, indicates that the BSD _setjmp and _longjmp +?C: routines are available to do non-local gotos wihtout saving or restoring +?C: the signal mask flag. +?C:. +?H:#$d_bsdjmp USE_BSDJMP /**/ +?H:. +?F:!set +?LINT:set d_bsdjmp +: see if _setjmp and _longjmp exists +?X: We can't check for these symbols with Inlibc because of the leading "_" +echo " " +case "$d_bsdjmp" in +'') + $cat >set.c < +jmp_buf env; +int set = 1; +int main() +{ + if (_setjmp(env)) + exit(set); + set = 0; + _longjmp(env, 1); + exit(1); +} +EOP + if $cc -o set set.c $libs >/dev/null 2>&1; then + if ./set >/dev/null 2>&1; then + echo "Good! You have BSD _setjmp and _longjmp routines." >&4 + val="$define" + else + $cat <&4 + else + cat <&4;; + $undef) echo "You do not have _setjmp and _longjmp, but that's fine." >&4;; + esac + ;; +esac +set d_bsdjmp +eval $setvar +$rm -f set.c set + diff --git a/mcon/U/d_byacc.U b/mcon/U/d_byacc.U new file mode 100644 index 0000000..aa02d79 --- /dev/null +++ b/mcon/U/d_byacc.U @@ -0,0 +1,33 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1996, Andy Dougherty +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_byacc.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 15:31:14 ram +?RCS: patch61: created +?RCS: +?MAKE:d_byacc: byacc Setvar +?MAKE: -pick add $@ %< +?S:d_byacc: +?S: This variable indicates whether byacc is available. +?S: If the user has specified 'portability', then Makefile.SH +?S: sees $byacc='byacc' whether or not the user actually has +?S: byacc. This variable allows us to determine in a makefile +?S: if we really have byacc. +?S:. +?LINT:set d_byacc +: Check if we really have byacc +case "$byacc" in +''|'byacc') val="$undef" ;; +*) val="$define" ;; +esac +set d_byacc +eval $setvar + diff --git a/mcon/U/d_bzero.U b/mcon/U/d_bzero.U new file mode 100644 index 0000000..6c7d87b --- /dev/null +++ b/mcon/U/d_bzero.U @@ -0,0 +1,44 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_bzero.U,v $ +?RCS: Revision 3.0.1.2 1993/10/16 13:48:15 ram +?RCS: patch12: added magic support for bzero() +?RCS: +?RCS: Revision 3.0.1.1 1993/09/13 16:01:33 ram +?RCS: patch10: now only defines HAS_BZERO, no macro remap on memset (WAD) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:46 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_bzero: Inlibc +?MAKE: -pick add $@ %< +?S:d_bzero: +?S: This variable conditionally defines the HAS_BZERO symbol if +?S: the bzero() routine is available to set memory to 0. +?S:. +?C:HAS_BZERO: +?C: This symbol is defined if the bzero() routine is available to +?C: set a memory block to 0. +?C:. +?H:#$d_bzero HAS_BZERO /**/ +?H:. +?M:bzero: HAS_BZERO +?M:#ifndef HAS_BZERO +?M:#ifndef bzero +?M:#define bzero(s,l) memset((s),0,(l)) +?M:#endif +?M:#endif +?M:. +?LINT:set d_bzero +: see if bzero exists +set bzero d_bzero +eval $inlibc + diff --git a/mcon/U/d_casti32.U b/mcon/U/d_casti32.U new file mode 100644 index 0000000..7d24f08 --- /dev/null +++ b/mcon/U/d_casti32.U @@ -0,0 +1,87 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_casti32.U,v $ +?RCS: Revision 3.0.1.3 1995/05/12 12:10:45 ram +?RCS: patch54: made sure cc and ccflags are conditional dependencies +?RCS: +?RCS: Revision 3.0.1.2 1994/10/29 16:09:37 ram +?RCS: patch36: declare signal handler correctly (ADO) +?RCS: +?RCS: Revision 3.0.1.1 1994/08/29 16:07:06 ram +?RCS: patch32: created by ADO +?RCS: +?X: +?X: Can the compiler cast large floats to 32-bit integers? +?X: +?MAKE:d_casti32: cat +cc +ccflags rm intsize Setvar test signal_t +?MAKE: -pick add $@ %< +?S:d_casti32: +?S: This variable conditionally defines CASTI32, which indicates +?S: whether the C compiler can cast large floats to 32-bit ints. +?S:. +?C:CASTI32: +?C: This symbol is defined if the C compiler can cast negative +?C: or large floating point numbers to 32-bit ints. +?C:. +?T:xxx yyy +?H:#$d_casti32 CASTI32 /**/ +?H:. +?F:!try +?LINT:set d_casti32 +: check for ability to cast large floats to 32-bit ints. +echo " " +echo 'Checking whether your C compiler can cast large floats to int32.' >&4 +if $test "$intsize" -eq 4; then + xxx=int +else + xxx=long +fi +$cat >try.c < +#include +$signal_t blech() { exit(3); } +int main() +{ + $xxx i32; + double f; + int result = 0; + signal(SIGFPE, blech); + + f = (double) 0x7fffffff; + f = 10 * f; + i32 = ($xxx) f; + + if (i32 != ($xxx) f) + result |= 1; + exit(result); +} +EOCP +if $cc $ccflags -o try try.c >/dev/null 2>&1; then + ./try + yyy=$? +else + echo "(I can't seem to compile the test program--assuming it can't)" + yyy=1 +fi +case "$yyy" in +0) val="$define" + echo "Yup, it can." + ;; +*) val="$undef" + echo "Nope, it can't." + ;; +esac +set d_casti32 +eval $setvar +$rm -f try try.* + diff --git a/mcon/U/d_castneg.U b/mcon/U/d_castneg.U new file mode 100644 index 0000000..ce879df --- /dev/null +++ b/mcon/U/d_castneg.U @@ -0,0 +1,143 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_castneg.U,v $ +?RCS: Revision 3.0.1.2 1995/05/12 12:11:21 ram +?RCS: patch54: made sure cc and ccflags are conditional dependencies +?RCS: patch54: added improved test case for Interactive Unix +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:10:50 ram +?RCS: patch36: don't forget to tell user about compilation failures (ADO) +?RCS: patch36: declare signal handler correctly using 'signal_t' (ADO) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:47 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?X: +?X: Can the compiler cast negative / odd floats to unsigned values. +?X: +?MAKE:d_castneg castflags: cat +cc +ccflags rm Setvar signal_t +?MAKE: -pick add $@ %< +?S:d_castneg: +?S: This variable conditionally defines CASTNEG, which indicates +?S: wether the C compiler can cast negative float to unsigned. +?S:. +?S:castflags: +?S: This variable contains a flag that precise difficulties the +?S: compiler has casting odd floating values to unsigned long: +?S: 0 = ok +?S: 1 = couldn't cast < 0 +?S: 2 = couldn't cast >= 0x80000000 +?S: 4 = couldn't cast in argument expression list +?S:. +?C:CASTNEGFLOAT: +?C: This symbol is defined if the C compiler can cast negative +?C: numbers to unsigned longs, ints and shorts. +?C:. +?C:CASTFLAGS: +?C: This symbol contains flags that say what difficulties the compiler +?C: has casting odd floating values to unsigned long: +?C: 0 = ok +?C: 1 = couldn't cast < 0 +?C: 2 = couldn't cast >= 0x80000000 +?C: 4 = couldn't cast in argument expression list +?C:. +?H:#$d_castneg CASTNEGFLOAT /**/ +?H:#define CASTFLAGS $castflags /**/ +?H:. +?F:!try +?LINT:set d_castneg +: check for ability to cast negative floats to unsigned +echo " " +echo 'Checking whether your C compiler can cast negative float to unsigned.' >&4 +$cat >try.c < +#include +$signal_t blech() { exit(7); } +$signal_t blech_in_list() { exit(4); } +unsigned long dummy_long(p) unsigned long p; { return p; } +unsigned int dummy_int(p) unsigned int p; { return p; } +unsigned short dummy_short(p) unsigned short p; { return p; } +int main() +{ + double f = -123.; + unsigned long along; + unsigned int aint; + unsigned short ashort; + int result = 0; + + signal(SIGFPE, blech); + along = (unsigned long)f; + aint = (unsigned int)f; + ashort = (unsigned short)f; + if (along != (unsigned long)-123) + result |= 1; + if (aint != (unsigned int)-123) + result |= 1; + if (ashort != (unsigned short)-123) + result |= 1; + f = (double)0x40000000; + f = f + f; + along = 0; + along = (unsigned long)f; + if (along != 0x80000000) + result |= 2; + f -= 1.; + along = 0; + along = (unsigned long)f; + if (along != 0x7fffffff) + result |= 1; + f += 2.; + along = 0; + along = (unsigned long)f; + if (along != 0x80000001) + result |= 2; + if (result) + exit(result); +?X: +?X: The following is a test for Interactive Unix Version 4.1, which +?X: has an 'improved' compiler which can correctly cast negative +?X: floats in expression lists, but apparently not in argument lists. +?X: Contributed by Winfried Koenig +?X: + signal(SIGFPE, blech_in_list); + f = 123.; + along = dummy_long((unsigned long)f); + aint = dummy_int((unsigned int)f); + ashort = dummy_short((unsigned short)f); + if (along != (unsigned long)123) + result |= 4; + if (aint != (unsigned int)123) + result |= 4; + if (ashort != (unsigned short)123) + result |= 4; + exit(result); + +} +EOCP +if $cc $ccflags -o try try.c >/dev/null 2>&1; then + ./try + castflags=$? +else + echo "(I can't seem to compile the test program--assuming it can't)" + castflags=7 +fi +case "$castflags" in +0) val="$define" + echo "Yup, it can." + ;; +*) val="$undef" + echo "Nope, it can't." + ;; +esac +set d_castneg +eval $setvar +$rm -f try.* + diff --git a/mcon/U/d_cbrt.U b/mcon/U/d_cbrt.U new file mode 100644 index 0000000..11f8baa --- /dev/null +++ b/mcon/U/d_cbrt.U @@ -0,0 +1,32 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_cbrt.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:48 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_cbrt: Inlibc +?MAKE: -pick add $@ %< +?S:d_cbrt: +?S: This variable conditionally defines the CBRT symbol, which +?S: indicates to the C program that the cbrt() (cube root) function +?S: is available. +?S:. +?C:HAS_CBRT (CBRT): +?C: This symbol, if defined, indicates that the cbrt() (cube root) +?C: function is available. +?C:. +?H:#$d_cbrt HAS_CBRT /**/ +?H:. +?LINT:set d_cbrt +: see if cbrt exists +set cbrt d_cbrt +eval $inlibc + diff --git a/mcon/U/d_charsprf.U b/mcon/U/d_charsprf.U new file mode 100644 index 0000000..c7d5522 --- /dev/null +++ b/mcon/U/d_charsprf.U @@ -0,0 +1,52 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_charsprf.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:49 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_charsprf: cat rm +cc Setvar +?MAKE: -pick add $@ %< +?S:d_charsprf: +?S: This variable conditionally defines CHARSPRINTF if this system +?S: declares "char *sprintf()" in stdio.h. The trend seems to be to +?S: declare it as "int sprintf()". +?S:. +?C:CHARSPRINTF: +?C: This symbol is defined if this system declares "char *sprintf()" in +?C: stdio.h. The trend seems to be to declare it as "int sprintf()". It +?C: is up to the package author to declare sprintf correctly based on the +?C: symbol. +?C:. +?H:#$d_charsprf CHARSPRINTF /**/ +?H:. +?F:!ucbsprf.c !ucbsprf +?LINT:set d_charsprf +: see if sprintf is declared as int or pointer to char +echo " " +$cat >ucbsprf.c <<'EOF' +int main() +{ + int sprintf(); + char buf[10]; + exit((unsigned long)sprintf(buf,"%s","foo") > 10L); +} +EOF +if $cc -o ucbsprf ucbsprf.c >/dev/null 2>&1 && ./ucbsprf; then + echo "Your sprintf() returns (int)." >&4 + val="$undef" +else + echo "Your sprintf() returns (char*)." >&4 + val="$define" +fi +set d_charsprf +eval $setvar +$rm -f ucbsprf* + diff --git a/mcon/U/d_chown.U b/mcon/U/d_chown.U new file mode 100644 index 0000000..c0fff39 --- /dev/null +++ b/mcon/U/d_chown.U @@ -0,0 +1,33 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_chown.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:07:14 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_chown: Inlibc +?MAKE: -pick add $@ %< +?S:d_chown: +?S: This variable conditionally defines the HAS_CHOWN symbol, which +?S: indicates to the C program that the chown() routine is available. +?S:. +?C:HAS_CHOWN : +?C: This symbol, if defined, indicates that the chown routine is +?C: available. +?C:. +?H:#$d_chown HAS_CHOWN /**/ +?H:. +?LINT:set d_chown +: see if chown exists +set chown d_chown +eval $inlibc + diff --git a/mcon/U/d_chroot.U b/mcon/U/d_chroot.U new file mode 100644 index 0000000..c31ef3c --- /dev/null +++ b/mcon/U/d_chroot.U @@ -0,0 +1,33 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_chroot.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:07:17 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_chroot: Inlibc +?MAKE: -pick add $@ %< +?S:d_chroot: +?S: This variable conditionally defines the HAS_CHROOT symbol, which +?S: indicates to the C program that the chroot() routine is available. +?S:. +?C:HAS_CHROOT : +?C: This symbol, if defined, indicates that the chroot routine is +?C: available. +?C:. +?H:#$d_chroot HAS_CHROOT /**/ +?H:. +?LINT:set d_chroot +: see if chroot exists +set chroot d_chroot +eval $inlibc + diff --git a/mcon/U/d_chsize.U b/mcon/U/d_chsize.U new file mode 100644 index 0000000..236effb --- /dev/null +++ b/mcon/U/d_chsize.U @@ -0,0 +1,32 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_chsize.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:50 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_chsize: Inlibc +?MAKE: -pick add $@ %< +?S:d_chsize: +?S: This variable conditionally defines the CHSIZE symbol, which +?S: indicates to the C program that the chsize() routine is available +?S: to truncate files. You might need a -lx to get this routine. +?S:. +?C:HAS_CHSIZE (CHSIZE): +?C: This symbol, if defined, indicates that the chsize routine is available +?C: to truncate files. You might need a -lx to get this routine. +?C:. +?H:#$d_chsize HAS_CHSIZE /**/ +?H:. +?LINT:set d_chsize +: see if chsize exists +set chsize d_chsize +eval $inlibc + diff --git a/mcon/U/d_ckeypad.U b/mcon/U/d_ckeypad.U new file mode 100644 index 0000000..0430877 --- /dev/null +++ b/mcon/U/d_ckeypad.U @@ -0,0 +1,54 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_ckeypad.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:50 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_ckeypad: cat cc termlib Setvar +?MAKE: -pick add $@ %< +?S:d_ckeypad: +?S: This variable controls the definition of HAS_CURSES_KEYPAD, +?S: which tells the application that the keypad() curses function +?S: is available. +?S:. +?C:HAS_CURSES_KEYPAD: +?C: This symbol indicates the availability of the keypad() function +?C: of the curses library. +?C:. +?H:#$d_ckeypad HAS_CURSES_KEYPAD /**/ +?H:. +?LINT:set d_ckeypad +: check for the "keypad()" function in the curses library +echo " " +case "$termlib" in +'') + echo "You don't have a curses library, so I won't waste time looking" >&4 + echo "to see if has the keypad() function." >&4 +*) +echo "Checking the curses library ($termlib) for the keypad() function..." >&4 + $cat >c_keypad.c <<'EOCP' +#include +int main() { + keypad(stdscr, TRUE); + exit(0); +} +EOCP + if $cc c_keypad.c >c_keypad.out 2>&1 ; then + val=$define + echo "It appears to have the keypad() function." + else + val=$undef + echo "Your curses library doesn't appear to have the keypad() function." + fi +esac +set d_ckeypad +eval $setvar + diff --git a/mcon/U/d_closedir.U b/mcon/U/d_closedir.U new file mode 100644 index 0000000..071f242 --- /dev/null +++ b/mcon/U/d_closedir.U @@ -0,0 +1,107 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_closedir.U,v $ +?RCS: Revision 3.0.1.3 1997/02/28 15:31:26 ram +?RCS: patch61: added ?F: metalint hint +?RCS: +?RCS: Revision 3.0.1.2 1994/10/29 16:11:18 ram +?RCS: patch36: added 'ldflags' to the test compile line (ADO) +?RCS: +?RCS: Revision 3.0.1.1 1994/08/29 16:07:21 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_closedir d_void_closedir: Inlibc i_dirent i_sysdir i_sysndir \ + cc ccflags ldflags libs Setvar rm +?MAKE: -pick add $@ %< +?S:d_closedir: +?S: This variable conditionally defines HAS_CLOSEDIR if closedir() is +?S: available. +?S:. +?C:HAS_CLOSEDIR: +?C: This symbol, if defined, indicates that the closedir() routine is +?C: available. +?C:. +?H:#$d_closedir HAS_CLOSEDIR /**/ +?H:. +?S:d_void_closedir: +?S: This variable conditionally defines VOID_CLOSEDIR if closedir() +?S: does not return a value. +?S:. +?C:VOID_CLOSEDIR: +?C: This symbol, if defined, indicates that the closedir() routine +?C: does not return a value. +?C:. +?H:#$d_void_closedir VOID_CLOSEDIR /**/ +?H:. +?F:!closedir +?LINT:set d_closedir d_void_closedir +: see if closedir exists +set closedir d_closedir +eval $inlibc + +@if VOID_CLOSEDIR || d_void_closedir +?X: The following contortions are designed so we can call closedir() +?X: and check whether it returns a value. The contortions are designed +?X: to portably pick up the correct directory header, for those +?X: systems that support various mutually incompatible directory functions. +?X: This is from perl5's perl.h +case "$d_closedir" in +"$define") + echo " " + echo "Checking whether closedir() returns a status..." >&4 + cat > closedir.c < +#if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */ +#include +#endif +#else +#ifdef I_SYS_NDIR +#include +#else +#ifdef I_SYS_DIR +#ifdef hp9000s500 +#include /* may be wrong in the future */ +#else +#include +#endif +#endif +#endif +#endif +int main() { return closedir(opendir(".")); } +EOM + if $cc $ccflags $ldflags -o closedir closedir.c $libs > /dev/null 2>&1; then + if ./closedir > /dev/null 2>&1 ; then + echo "Yes, it does." + val="$undef" + else + echo "No, it doesn't." + val="$define" + fi + else + echo "(I can't seem to compile the test program--assuming it doesn't)" + val="$define" + fi + ;; +*) + val="$undef"; + ;; +esac +set d_void_closedir +eval $setvar +$rm -f closedir* +@end diff --git a/mcon/U/d_const.U b/mcon/U/d_const.U new file mode 100644 index 0000000..4801d09 --- /dev/null +++ b/mcon/U/d_const.U @@ -0,0 +1,66 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_const.U,v $ +?RCS: Revision 3.0.1.1 1993/11/10 17:33:41 ram +?RCS: patch14: stronger const check with added typedef for MIPS cc +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:51 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_const: cat rm cc ccflags Setvar +?MAKE: -pick add $@ %< +?S:d_const: +?S: This variable conditionally defines the HASCONST symbol, which +?S: indicates to the C program that this C compiler knows about the +?S: const type. +?S:. +?C:HASCONST ~ %<: +?C: This symbol, if defined, indicates that this C compiler knows about +?C: the const type. There is no need to actually test for that symbol +?C: within your programs. The mere use of the "const" keyword will +?C: trigger the necessary tests. +?C:. +?H:?%<:#$d_const HASCONST /**/ +?H:?%<:#ifndef HASCONST +?H:?%<:#define const +?H:?%<:#endif +?H:. +?W:%<:const +?F:const.c const.o +?LINT:set d_const +?LINT:known const +: check for const keyword +echo " " +echo 'Checking to see if your C compiler knows about "const"...' >&4 +$cat >const.c <<'EOCP' +?X: mmcg@bruce.cs.monash.edu.au reports that: +?X: The MIPS cc compiler (V2.10) on a dec 5000 running Ultrix 4.2A +?X: pretends to understand `const' but doesn't - it'll also fail to +?X: handle typedefs properly if they're declared const. To guard +?X: against this, boost up the test by using an explicit typedef... +typedef struct spug { int drokk; } spug; +int main() +{ + const char *foo; + const spug y; +} +EOCP +if $cc -c $ccflags const.c >/dev/null 2>&1 ; then + val="$define" + echo "Yup, it does." +else + val="$undef" + echo "Nope, it doesn't." +fi +set d_const +eval $setvar +$rm -f const.c const.o + diff --git a/mcon/U/d_crypt.U b/mcon/U/d_crypt.U new file mode 100644 index 0000000..84906e6 --- /dev/null +++ b/mcon/U/d_crypt.U @@ -0,0 +1,76 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_crypt.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 15:31:47 ram +?RCS: patch61: replaced .a with $_a all over the place +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:52 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_crypt cryptlib: Loc test xlibpth libpth Csym Setvar _a Inlibc +?MAKE: -pick add $@ %< +?S:d_crypt: +?S: This variable conditionally defines the CRYPT symbol, which +?S: indicates to the C program that the crypt() routine is available +?S: to encrypt passwords and the like. +?S:. +?S:cryptlib: +?S: This variable holds -lcrypt or the path to a libcrypt.a archive if +?S: the crypt() function is not defined in the standard C library. It is +?S: up to the Makefile to use this. +?S:. +?C:HAS_CRYPT (CRYPT): +?C: This symbol, if defined, indicates that the crypt routine is available +?C: to encrypt passwords and the like. +?C:. +?H:#$d_crypt HAS_CRYPT /**/ +?H:. +?LINT:set d_crypt +?T:val +: see if crypt exists +echo " " +set crypt d_crypt +eval $inlibc +case "$d_crypt" in +$define) cryptlib='' ;; +*) if set crypt val -f d_crypt; eval $csym; $val; then + echo 'crypt() found.' >&4 + val="$define" + cryptlib='' + else + cryptlib=`./loc Slibcrypt$_a "" $xlibpth` + if $test -z "$cryptlib"; then + cryptlib=`./loc Mlibcrypt$_a "" $xlibpth` + else + cryptlib=-lcrypt + fi + if $test -z "$cryptlib"; then + cryptlib=`./loc Llibcrypt$_a "" $xlibpth` + else + cryptlib=-lcrypt + fi + if $test -z "$cryptlib"; then + cryptlib=`./loc libcrypt$_a "" $libpth` + else + cryptlib=-lcrypt + fi + if $test -z "$cryptlib"; then + echo 'crypt() NOT found.' >&4 + val="$undef" + else + val="$define" + fi + fi + set d_crypt + eval $setvar + ;; +esac + diff --git a/mcon/U/d_csh.U b/mcon/U/d_csh.U new file mode 100644 index 0000000..c0a792e --- /dev/null +++ b/mcon/U/d_csh.U @@ -0,0 +1,62 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_csh.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 15:32:18 ram +?RCS: patch61: added full_csh to preserve the full path even when portable +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:53 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_csh full_csh: csh Setvar +?MAKE: -pick add $@ %< +?S:d_csh: +?S: This variable conditionally defines the CSH symbol, which +?S: indicates to the C program that the C-shell exists. +?S:. +?S:full_csh: +?S: This variable contains the full pathname to 'csh', whether or +?S: not the user has specified 'portability'. This is only used +?S: in the compiled C program, and we assume that all systems which +?S: can share this executable will have the same full pathname to +?S: 'csh.' +?S:. +?C:HAS_CSH: +?C: This symbol, if defined, indicates that the C-shell exists. +?C:. +?C:CSH: +?C: This symbol, if defined, contains the full pathname of csh. +?C:. +?X: Previously, I just did $d_csh CSH "$full_csh", but that caused +?X: problems on VMS where the config.sh extraction program changes +?X: $undef to a real cpp undef, and they then had #undef CSH "" +?X: which the compiler didn't like. It's easy to work around this, +?X: so I did. --AD 3/1998. +?X: And we don't want to define CSH if !HAS_CSH, but we don't want +?X: those lines in config.h if they don't need CSH, so protect with ?CSH +?X: and not ?%<. --RAM, 15/02/2004 +?H:?%<:#$d_csh HAS_CSH /**/ +?H:?CSH:#ifdef HAS_CSH +?H:?CSH:#define CSH "$full_csh" /**/ +?H:?CSH:#endif +?H:. +?LINT:set d_csh +: get csh whereabouts +case "$csh" in +'csh') val="$undef" ;; +*) val="$define" ;; +esac +set d_csh +eval $setvar +: Respect a hint or command line value for full_csh. +case "$full_csh" in +'') full_csh=$csh ;; +esac + diff --git a/mcon/U/d_ctermid.U b/mcon/U/d_ctermid.U new file mode 100644 index 0000000..5f1f7ee --- /dev/null +++ b/mcon/U/d_ctermid.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_ctermid.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:54 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_ctermid: Inlibc +?MAKE: -pick add $@ %< +?S:d_ctermid: +?S: This variable conditionally defines CTERMID if ctermid() is +?S: available to generate filename for terminal. +?S:. +?C:HAS_CTERMID (CTERMID): +?C: This symbol, if defined, indicates that the ctermid routine is +?C: available to generate filename for terminal. +?C:. +?H:#$d_ctermid HAS_CTERMID /**/ +?H:. +?LINT:set d_ctermid +: see if ctermid exists +set ctermid d_ctermid +eval $inlibc + diff --git a/mcon/U/d_cuserid.U b/mcon/U/d_cuserid.U new file mode 100644 index 0000000..a6d46c5 --- /dev/null +++ b/mcon/U/d_cuserid.U @@ -0,0 +1,34 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_cuserid.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:07:25 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_cuserid: Inlibc +?MAKE: -pick add $@ %< +?S:d_cuserid: +?S: This variable conditionally defines the HAS_CUSERID symbol, which +?S: indicates to the C program that the cuserid() routine is available +?S: to get character login names. +?S:. +?C:HAS_CUSERID : +?C: This symbol, if defined, indicates that the cuserid routine is +?C: available to get character login names. +?C:. +?H:#$d_cuserid HAS_CUSERID /**/ +?H:. +?LINT:set d_cuserid +: see if cuserid exists +set cuserid d_cuserid +eval $inlibc + diff --git a/mcon/U/d_dbl_dig.U b/mcon/U/d_dbl_dig.U new file mode 100644 index 0000000..aa53e73 --- /dev/null +++ b/mcon/U/d_dbl_dig.U @@ -0,0 +1,61 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_dbl_dig.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:07:28 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_dbl_dig: Myread contains cat rm Setvar i_limits i_float \ + cppstdin cppflags cppminus +?MAKE: -pick add $@ %< +?S:d_dbl_dig: +?S: This variable conditionally defines d_dbl_dig if this system's +?S: header files provide DBL_DIG, which is the number of significant +?S: digits in a double precision number. +?S:. +?C:HAS_DBL_DIG: +?C: This symbol, if defined, indicates that this system's +?C: or defines the symbol DBL_DIG, which is the number +?C: of significant digits in a double precision number. If this +?C: symbol is not defined, a guess of 15 is usually pretty good. +?C:. +?H:#$d_dbl_dig HAS_DBL_DIG /* */ +?H:. +?F:!dbl_dig.c +?LINT:set d_dbl_dig +: See if number of significant digits in a double precision number is known +echo " " +$cat >dbl_dig.c < +#endif +#ifdef I_FLOAT +#include +#endif +#ifdef DBL_DIG +printf("Contains DBL_DIG"); +#endif +EOM +$cppstdin $cppflags $cppminus < dbl_dig.c >dbl_dig.E 2>/dev/null +if $contains 'DBL_DIG' dbl_dig.E >/dev/null 2>&1; then + echo "DBL_DIG found." >&4 + val="$define" +else + echo "DBL_DIG NOT found." >&4 + val="$undef" +fi +$rm -f dbl_dig.? +set d_dbl_dig +eval $setvar + diff --git a/mcon/U/d_debugging.U b/mcon/U/d_debugging.U new file mode 100644 index 0000000..fabe096 --- /dev/null +++ b/mcon/U/d_debugging.U @@ -0,0 +1,42 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?MAKE:d_debugging: Myread Setvar spackage cat +?MAKE: -pick add $@ %< +?S:d_debugging: +?S: This variable conditionally defines the DEBUGGING symbol. +?S:. +?C:DEBUGGING: +?C: This symbol, when defined, activates extra debugging. +?C:. +?H:#$d_debugging DEBUGGING +?H:. +?LINT:set d_debugging +: see whether debugging should be turned on +$cat < +?RCS: +?RCS: $Log: d_difftime.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:07:31 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_difftime: Inlibc +?MAKE: -pick add $@ %< +?S:d_difftime: +?S: This variable conditionally defines the HAS_DIFFTIME symbol, which +?S: indicates to the C program that the difftime() routine is available. +?S:. +?C:HAS_DIFFTIME : +?C: This symbol, if defined, indicates that the difftime routine is +?C: available. +?C:. +?H:#$d_difftime HAS_DIFFTIME /**/ +?H:. +?LINT:set d_difftime +: see if difftime exists +set difftime d_difftime +eval $inlibc + diff --git a/mcon/U/d_dlerror.U b/mcon/U/d_dlerror.U new file mode 100644 index 0000000..a3bb995 --- /dev/null +++ b/mcon/U/d_dlerror.U @@ -0,0 +1,46 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_dlerror.U,v $ +?RCS: Revision 3.0.1.2 1995/07/25 13:52:49 ram +?RCS: patch56: force compile-link test since symbol might lie in crt0.o (ADO) +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:11:23 ram +?RCS: patch36: created by ADO +?RCS: +?MAKE:d_dlerror: Inlibc runnm +?MAKE: -pick add $@ %< +?S:d_dlerror: +?S: This variable conditionally defines the HAS_DLERROR symbol, which +?S: indicates to the C program that the dlerror() routine is available. +?S:. +?C:HAS_DLERROR : +?C: This symbol, if defined, indicates that the dlerror routine is +?C: available to return a string describing the last error that +?C: occurred from a call to dlopen(), dlclose() or dlsym(). +?C:. +?H:#$d_dlerror HAS_DLERROR /**/ +?H:. +?T: xxx_runnm +?LINT:set d_dlerror +?X: We don't permanently change runnm, but we do temporarily. +?LINT: change runnm +: see if dlerror exists +?X: On NetBSD and FreeBSD, dlerror might be available, but it is in +?X: /usr/lib/crt0.o, not in any of the libraries. Therefore, do not +?X: use the nm extraction, but use a real compile and link test instead. +xxx_runnm="$runnm" +runnm=false +set dlerror d_dlerror +eval $inlibc +runnm="$xxx_runnm" + diff --git a/mcon/U/d_dlopen.U b/mcon/U/d_dlopen.U new file mode 100644 index 0000000..ad62c53 --- /dev/null +++ b/mcon/U/d_dlopen.U @@ -0,0 +1,45 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_dlopen.U,v $ +?RCS: Revision 3.0.1.2 1995/07/25 13:52:56 ram +?RCS: patch56: force compile-link test since symbol might lie in crt0.o (ADO) +?RCS: +?RCS: Revision 3.0.1.1 1994/08/29 16:07:34 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_dlopen: Inlibc runnm +?MAKE: -pick add $@ %< +?S:d_dlopen: +?S: This variable conditionally defines the HAS_DLOPEN symbol, which +?S: indicates to the C program that the dlopen() routine is available. +?S:. +?C:HAS_DLOPEN : +?C: This symbol, if defined, indicates that the dlopen routine is +?C: available. +?C:. +?H:#$d_dlopen HAS_DLOPEN /**/ +?H:. +?T: xxx_runnm +?LINT:set d_dlopen +?X: We don't permanently change runnm, but we do temporarily. +?LINT: change runnm +: see if dlopen exists +?X: On NetBSD and FreeBSD, dlopen is available, but it is in +?X: /usr/lib/crt0.o, not in any of the libraries. Therefore, do not +?X: use the nm extraction, but use a real compile and link test instead. +xxx_runnm="$runnm" +runnm=false +set dlopen d_dlopen +eval $inlibc +runnm="$xxx_runnm" + diff --git a/mcon/U/d_dosuid.U b/mcon/U/d_dosuid.U new file mode 100644 index 0000000..a584e1a --- /dev/null +++ b/mcon/U/d_dosuid.U @@ -0,0 +1,169 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Tye McQueen added safe setuid script checks. +?RCS: +?RCS: $Log: d_dosuid.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 15:33:03 ram +?RCS: patch61: moved unit to TOP via a ?Y: layout directive +?RCS: patch61: tell them /dev/fd is not about floppy disks +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:12:08 ram +?RCS: patch36: added checks for secure setuid scripts (Tye McQueen) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:55 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_dosuid d_suidsafe: cat contains ls rm test Myread Setvar \ + Oldconfig Guess package hint +?MAKE: -pick add $@ %< +?S:d_suidsafe: +?S: This variable conditionally defines SETUID_SCRIPTS_ARE_SECURE_NOW +?S: if setuid scripts can be secure. This test looks in /dev/fd/. +?S:. +?S:d_dosuid: +?S: This variable conditionally defines the symbol DOSUID, which +?S: tells the C program that it should insert setuid emulation code +?S: on hosts which have setuid #! scripts disabled. +?S:. +?C:SETUID_SCRIPTS_ARE_SECURE_NOW: +?C: This symbol, if defined, indicates that the bug that prevents +?C: setuid scripts from being secure is not present in this kernel. +?C:. +?C:DOSUID: +?C: This symbol, if defined, indicates that the C program should +?C: check the script that it is executing for setuid/setgid bits, and +?C: attempt to emulate setuid/setgid on systems that have disabled +?C: setuid #! scripts because the kernel can't do it securely. +?C: It is up to the package designer to make sure that this emulation +?C: is done securely. Among other things, it should do an fstat on +?C: the script it just opened to make sure it really is a setuid/setgid +?C: script, it should make sure the arguments passed correspond exactly +?C: to the argument on the #! line, and it should not trust any +?C: subprocesses to which it must pass the filename rather than the +?C: file descriptor of the script to be executed. +?C:. +?H:#$d_suidsafe SETUID_SCRIPTS_ARE_SECURE_NOW /**/ +?H:#$d_dosuid DOSUID /**/ +?H:. +?Y:TOP +?F:!reflect +?LINT: set d_suidsafe +?LINT: set d_dosuid +: see if setuid scripts can be secure +$cat <reflect + chmod +x,u+s reflect + ./reflect >flect 2>&1 + if $contains "/dev/fd" flect >/dev/null; then + echo "Congratulations, your kernel has secure setuid scripts!" >&4 + val="$define" + else + $cat <&4 + dflt=n;; + "$undef") + echo "Well, the $hint value is *not* secure." >&4 + dflt=n;; + *) echo "Well, the $hint value *is* secure." >&4 + dflt=y;; + esac + ;; + *) + $rm -f reflect flect + echo "#!$ls" >reflect + chmod +x,u+s reflect + echo >flect + chmod a+w flect + echo '"su" will (probably) prompt you for '"$ans's password." + su $ans -c './reflect >flect' + if $contains "/dev/fd" flect >/dev/null; then + echo "Okay, it looks like setuid scripts are secure." >&4 + dflt=y + else + echo "I don't think setuid scripts are secure." >&4 + dflt=n + fi + ;; + esac + rp='Does your kernel have *secure* setuid scripts?' + . ./myread + case "$ans" in + [yY]*) val="$define";; + *) val="$undef";; + esac + fi +else + echo "I don't think setuid scripts are secure (no /dev/fd directory)." >&4 + echo "(That's for file descriptors, not floppy disks.)" + val="$undef" +fi +set d_suidsafe +eval $setvar + +$rm -f reflect flect + +: now see if they want to do setuid emulation +echo " " +val="$undef" +case "$d_suidsafe" in +"$define") + val="$undef" + echo "No need to emulate SUID scripts since they are secure here." >& 4 + ;; +*) + $cat < +?RCS: +?RCS: $Log: d_drem.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:12:14 ram +?RCS: patch36: created by ADO +?RCS: +?MAKE:d_drem: Inlibc +?MAKE: -pick add $@ %< +?S:d_drem: +?S: This variable conditionally defines the HAS_DREM symbol, which +?S: indicates to the C program that the drem() routine is available. +?S:. +?C:HAS_DREM : +?C: This symbol, if defined, indicates that the drem routine is +?C: available. This routine is roughly the same as fmod, i.e. it +?C: computes the remainder r=x-n*y, where n=rint(x/y), whereas fmod +?C: uses n=trunc(x/y). +?C:. +?H:#$d_drem HAS_DREM /**/ +?H:. +?LINT:set d_drem +: see if drem exists +set drem d_drem +eval $inlibc + diff --git a/mcon/U/d_dup2.U b/mcon/U/d_dup2.U new file mode 100644 index 0000000..070bfaa --- /dev/null +++ b/mcon/U/d_dup2.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_dup2.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:56 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_dup2: Inlibc +?MAKE: -pick add $@ %< +?S:d_dup2: +?S: This variable conditionally defines HAS_DUP2 if dup2() is +?S: available to duplicate file descriptors. +?S:. +?C:HAS_DUP2 (DUP2): +?C: This symbol, if defined, indicates that the dup2 routine is +?C: available to duplicate file descriptors. +?C:. +?H:#$d_dup2 HAS_DUP2 /**/ +?H:. +?LINT:set d_dup2 +: see if dup2 exists +set dup2 d_dup2 +eval $inlibc + diff --git a/mcon/U/d_eofpipe.U b/mcon/U/d_eofpipe.U new file mode 100644 index 0000000..86b30a5 --- /dev/null +++ b/mcon/U/d_eofpipe.U @@ -0,0 +1,93 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_eofpipe.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:12:40 ram +?RCS: patch36: call ./bsd explicitely instead of relying on PATH +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:57 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_eofpipe: cat +cc +ccflags +libs rm Oldconfig Guess echo n c +?MAKE: -pick add $@ %< +?S:d_eofpipe: +?S: This variable conditionally defines the EOFPIPE symbol, which +?S: indicates to the C program that select will correctly detect the EOF +?S: condition when pipe is closed from the other end. +?S:. +?C:EOFPIPE: +?C: This symbol, if defined, indicates that EOF condition will be detected +?C: by the reader of the pipe when it is closed by the writing process. +?C: That is, a select() call on that file descriptor will not block when +?C: only an EOF remains (typical behaviour for BSD systems). +?C:. +?H:#$d_eofpipe EOFPIPE /**/ +?H:. +?F:!mpipe +: see if pipe correctly gives the EOF condition +echo " " +case "$d_eofpipe" in +'') + echo "Let's see if your pipes return EOF to select() upon closing..." >&4 + $cat >pipe.c <<'EOP' +int main() +{ + int pd[2]; + int mask; + + pipe(pd); + if (0 == fork()) { + close(pd[0]); + close(pd[1]); + exit(0); + } + + close(pd[1]); + mask = 1 << pd[0]; + alarm(2); + select(32, &mask, (int *) 0, (int *) 0, (char *) 0); + if (0 == read(pd[0], &mask, 1)) + exit(0); + + exit(1); +} +EOP + if $cc $ccflags -o pipe pipe.c $libs >/dev/null 2>&1; then +?X: Use a script to avoid the possible 'alarm call' message + echo "./pipe || exit 1" > mpipe + chmod +x mpipe + ./mpipe >/dev/null 2>&1 + case $? in + 0) d_eofpipe="$define";; + *) d_eofpipe="$undef";; + esac + else + echo "(The test program did not compile correctly -- Guessing.)" + if ./bsd; then + d_eofpipe="$define" + else + d_eofpipe="$undef" + fi + fi + case "$d_eofpipe" in + "$define") echo "Yes, they do.";; + *) echo "No, they don't! (sigh)";; + esac + ;; +*) + $echo $n "Your pipes $c" + case "$d_eofpipe" in + "$define") echo "allow select() to see EOF upon closing.";; + *) echo "won't let select() see EOF on closing.";; + esac + ;; +esac +$rm -f *pipe* core + diff --git a/mcon/U/d_euc2jis.U b/mcon/U/d_euc2jis.U new file mode 100644 index 0000000..a80406d --- /dev/null +++ b/mcon/U/d_euc2jis.U @@ -0,0 +1,32 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_euc2jis.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:58 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_euc2jis: Inlibc +?MAKE: -pick add $@ %< +?S:d_euc2jis: +?S: This variable conditionally defines the HAS_EUC2JIS symbol, which +?S: indicates to the C program that the euc2jis() routine is available +?S: to convert EUC to JIS. +?S:. +?C:HAS_EUC2JIS: +?C: This symbol, if defined, indicates that the euc2jis routine is +?C: available to convert EUC to JIS. +?C:. +?H:#$d_euc2jis HAS_EUC2JIS /**/ +?H:. +?LINT:set d_euc2jis +: see if euc2jis exists +set euc2jis d_euc2jis +eval $inlibc + diff --git a/mcon/U/d_fchmod.U b/mcon/U/d_fchmod.U new file mode 100644 index 0000000..1939d78 --- /dev/null +++ b/mcon/U/d_fchmod.U @@ -0,0 +1,32 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_fchmod.U,v $ +?RCS: Revision 3.0 1993/08/18 12:05:59 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_fchmod: Inlibc +?MAKE: -pick add $@ %< +?S:d_fchmod: +?S: This variable conditionally defines the HAS_FCHMOD symbol, which +?S: indicates to the C program that the fchmod() routine is available +?S: to change mode of opened files. +?S:. +?C:HAS_FCHMOD (FCHMOD): +?C: This symbol, if defined, indicates that the fchmod routine is available +?C: to change mode of opened files. If unavailable, use chmod(). +?C:. +?H:#$d_fchmod HAS_FCHMOD /**/ +?H:. +?LINT:set d_fchmod +: see if fchmod exists +set fchmod d_fchmod +eval $inlibc + diff --git a/mcon/U/d_fchown.U b/mcon/U/d_fchown.U new file mode 100644 index 0000000..0efbbe2 --- /dev/null +++ b/mcon/U/d_fchown.U @@ -0,0 +1,32 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_fchown.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:01 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_fchown: Inlibc +?MAKE: -pick add $@ %< +?S:d_fchown: +?S: This variable conditionally defines the HAS_FCHOWN symbol, which +?S: indicates to the C program that the fchown() routine is available +?S: to change ownership of opened files. +?S:. +?C:HAS_FCHOWN (FCHOWN): +?C: This symbol, if defined, indicates that the fchown routine is available +?C: to change ownership of opened files. If unavailable, use chown(). +?C:. +?H:#$d_fchown HAS_FCHOWN /**/ +?H:. +?LINT:set d_fchown +: see if fchown exists +set fchown d_fchown +eval $inlibc + diff --git a/mcon/U/d_fcntl.U b/mcon/U/d_fcntl.U new file mode 100644 index 0000000..24ea9b2 --- /dev/null +++ b/mcon/U/d_fcntl.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_fcntl.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:01 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_fcntl: Inlibc +?MAKE: -pick add $@ %< +?S:d_fcntl: +?S: This variable conditionally defines the HAS_FCNTL symbol, and indicates +?S: whether the fcntl() function exists +?S:. +?C:HAS_FCNTL: +?C: This symbol, if defined, indicates to the C program that +?C: the fcntl() function exists. +?C:. +?H:#$d_fcntl HAS_FCNTL /**/ +?H:. +?LINT:set d_fcntl +: see if this is an fcntl system +set fcntl d_fcntl +eval $inlibc + diff --git a/mcon/U/d_fd_set.U b/mcon/U/d_fd_set.U new file mode 100644 index 0000000..8e13de2 --- /dev/null +++ b/mcon/U/d_fd_set.U @@ -0,0 +1,138 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_fd_set.U,v $ +?RCS: Revision 3.0.1.3 1997/02/28 15:33:16 ram +?RCS: patch61: added ?F: metalint hint +?RCS: +?RCS: Revision 3.0.1.2 1994/06/20 06:57:23 ram +?RCS: patch30: extended scope for fd_set checks (ADO) +?RCS: +?RCS: Revision 3.0.1.1 1994/01/24 14:06:27 ram +?RCS: patch16: comments for HAS_FD_* symbols were not consistent +?RCS: +?RCS: Revision 3.0 1993/08/18 12:06:02 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_fd_set d_fd_macros d_fds_bits: cat +cc +ccflags rm Oldconfig \ + d_socket i_systime i_sysselct +?MAKE: -pick add $@ %< +?S:d_fd_set: +?S: This variable contains the eventual value of the HAS_FD_SET symbol, +?S: which indicates if your C compiler knows about the fd_set typedef. +?S:. +?S:d_fd_macros: +?S: This variable contains the eventual value of the HAS_FD_MACROS symbol, +?S: which indicates if your C compiler knows about the macros which +?S: manipulate an fd_set. +?S:. +?S:d_fds_bits: +?S: This variable contains the eventual value of the HAS_FDS_BITS symbol, +?S: which indicates if your fd_set typedef contains the fds_bits member. +?S: If you have an fd_set typedef, but the dweebs who installed it did +?S: a half-fast job and neglected to provide the macros to manipulate +?S: an fd_set, HAS_FDS_BITS will let us know how to fix the gaffe. +?S:. +?C:HAS_FD_SET: +?C: This symbol, when defined, indicates presence of the fd_set typedef +?C: in +?C:. +?C:HAS_FD_MACROS: +?C: This symbol, when defined, indicates presence of the macros used to +?C: manipulate an fd_set. +?C:. +?C:HAS_FDS_BITS: +?C: This symbol, when defined, indicates presence of the fds_bits member in +?C: fd_set. This knowledge is useful if fd_set is available but the macros +?C: aren't. +?C:. +?H:#$d_fd_set HAS_FD_SET /**/ +?H:#$d_fd_macros HAS_FD_MACROS /**/ +?H:#$d_fds_bits HAS_FDS_BITS /**/ +?H:. +?F:!fd_set +: check for fd_set items +$cat <, which is included (perhaps) +?X: by . We won't force people to include +?X: because it might introduce other +?X: incompatibilities. +$cat >fd_set.c < +#ifdef HAS_SOCKET +#include /* Might include */ +#endif +#ifdef I_SYS_TIME +#include +#endif +#ifdef I_SYS_SELECT +#include +#endif +int main() { + fd_set fds; + +#ifdef TRYBITS + if(fds.fds_bits); +#endif + +#if defined(FD_SET) && defined(FD_CLR) && defined(FD_ISSET) && defined(FD_ZERO) + exit(0); +#else + exit(1); +#endif +} +EOCP +if $cc $ccflags -DTRYBITS -o fd_set fd_set.c >fd_set.out 2>&1 ; then + d_fds_bits="$define" + d_fd_set="$define" + echo "Well, your system knows about the normal fd_set typedef..." >&4 + if ./fd_set; then + echo "and you have the normal fd_set macros (just as I'd expect)." >&4 + d_fd_macros="$define" + else + $cat >&4 <<'EOM' +but not the normal fd_set macros! Gaaack! I'll have to cover for you. +EOM + d_fd_macros="$undef" + fi +else + $cat <<'EOM' +Hmm, your compiler has some difficulty with fd_set. Checking further... +EOM + if $cc $ccflags -o fd_set fd_set.c >fd_set.out 2>&1 ; then + d_fds_bits="$undef" + d_fd_set="$define" + echo "Well, your system has some sort of fd_set available..." >&4 + if ./fd_set; then + echo "and you have the normal fd_set macros." >&4 + d_fd_macros="$define" + else + $cat <<'EOM' +but not the normal fd_set macros! Gross! More work for me... +EOM + d_fd_macros="$undef" + fi + else + echo "Well, you got zip. That's OK, I can roll my own fd_set stuff." >&4 + d_fd_set="$undef" + d_fds_bits="$undef" + d_fd_macros="$undef" + fi +fi +$rm -f fd_set* + + diff --git a/mcon/U/d_ffs.U b/mcon/U/d_ffs.U new file mode 100644 index 0000000..cda3896 --- /dev/null +++ b/mcon/U/d_ffs.U @@ -0,0 +1,33 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_ffs.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:03 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_ffs: Inlibc +?MAKE: -pick add $@ %< +?S:d_ffs: +?S: This variable conditionally defines the HAS_FFS symbol, which +?S: indicates to the C program that the ffs() routine is available +?S: to find the first bit which is set in its integer argument. +?S:. +?C:HAS_FFS: +?C: This symbol, if defined, indicates that the ffs routine is available +?C: to find the first bit set in its argument. If it's not available, +?C: roll your own. +?C:. +?H:#$d_ffs HAS_FFS /**/ +?H:. +?LINT:set d_ffs +: see if ffs exists +set ffs d_ffs +eval $inlibc + diff --git a/mcon/U/d_fgetpos.U b/mcon/U/d_fgetpos.U new file mode 100644 index 0000000..8553f96 --- /dev/null +++ b/mcon/U/d_fgetpos.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_fgetpos.U,v $ +?RCS: Revision 3.0.1.1 1994/06/20 06:57:33 ram +?RCS: patch30: created +?RCS: +?MAKE:d_fgetpos: Inlibc +?MAKE: -pick add $@ %< +?S:d_fgetpos: +?S: This variable conditionally defines HAS_FGETPOS if fgetpos() is +?S: available to get the file position indicator. +?S:. +?C:HAS_FGETPOS: +?C: This symbol, if defined, indicates that the fgetpos routine is +?C: available to get the file position indicator, similar to ftell(). +?C:. +?H:#$d_fgetpos HAS_FGETPOS /**/ +?H:. +?LINT:set d_fgetpos +: see if fgetpos exists +set fgetpos d_fgetpos +eval $inlibc + diff --git a/mcon/U/d_flexfnam.U b/mcon/U/d_flexfnam.U new file mode 100644 index 0000000..0f53a0b --- /dev/null +++ b/mcon/U/d_flexfnam.U @@ -0,0 +1,77 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_flexfnam.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:04 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_flexfnam: cat rm test Setvar +?MAKE: -pick add $@ %< +?S:d_flexfnam: +?S: This variable conditionally defines the FLEXFILENAMES symbol, which +?S: indicates that the system supports filenames longer than 14 characters. +?S:. +?C:FLEXFILENAMES: +?C: This symbol, if defined, indicates that the system supports filenames +?C: longer than 14 characters. +?C:. +?H:#$d_flexfnam FLEXFILENAMES /**/ +?H:. +?T:first second +?LINT:set d_flexfnam +: see if we can have long filenames +echo " " +?X: +?X: We have to test in both /tmp and . because of NFS (remote server may allow +?X: long filenames while the local filesystem cannot support them). If at least +?X: one of those file systems cannot support long filenames, then we assume the +?X: whole system can't. +?X: +rmlist="$rmlist /tmp/cf$$" +$test -d /tmp/cf$$ || mkdir /tmp/cf$$ +first=123456789abcdef +second=/tmp/cf$$/$first +$rm -f $first $second +if (echo hi >$first) 2>/dev/null; then + if $test -f 123456789abcde; then + echo 'You cannot have filenames longer than 14 characters. Sigh.' >&4 + val="$undef" + else + if (echo hi >$second) 2>/dev/null; then + if $test -f /tmp/cf$$/123456789abcde; then + $cat <<'EOM' +That's peculiar... You can have filenames longer than 14 characters, but only +on some of the filesystems. Maybe you are using NFS. Anyway, to avoid problems +I shall consider your system cannot support long filenames at all. +EOM + val="$undef" + else + echo 'You can have filenames longer than 14 characters.' >&4 + val="$define" + fi + else + $cat <<'EOM' +How confusing! Some of your filesystems are sane enough to allow filenames +longer than 14 characters but some others like /tmp can't even think about them. +So, for now on, I shall assume your kernel does not allow them at all. +EOM + val="$undef" + fi + fi +else + $cat <<'EOM' +You can't have filenames longer than 14 chars. You can't even think about them! +EOM + val="$undef" +fi +set d_flexfnam +eval $setvar +$rm -rf /tmp/cf$$ 123456789abcde* + diff --git a/mcon/U/d_flock.U b/mcon/U/d_flock.U new file mode 100644 index 0000000..c3252e3 --- /dev/null +++ b/mcon/U/d_flock.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_flock.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:05 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_flock: Inlibc +?MAKE: -pick add $@ %< +?S:d_flock: +?S: This variable conditionally defines HAS_FLOCK if flock() is +?S: available to do file locking. +?S:. +?C:HAS_FLOCK (FLOCK): +?C: This symbol, if defined, indicates that the flock routine is +?C: available to do file locking. +?C:. +?H:#$d_flock HAS_FLOCK /**/ +?H:. +?LINT:set d_flock +: see if flock exists +set flock d_flock +eval $inlibc + diff --git a/mcon/U/d_fmod.U b/mcon/U/d_fmod.U new file mode 100644 index 0000000..bad72e7 --- /dev/null +++ b/mcon/U/d_fmod.U @@ -0,0 +1,34 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_fmod.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:12:46 ram +?RCS: patch36: created by ADO +?RCS: +?MAKE:d_fmod: Inlibc +?MAKE: -pick add $@ %< +?S:d_fmod: +?S: This variable conditionally defines the HAS_FMOD symbol, which +?S: indicates to the C program that the fmod() routine is available. +?S: See also d_drem for the drem() routine which does roughly the same. +?S:. +?C:HAS_FMOD : +?C: This symbol, if defined, indicates that the fmod routine is +?C: available to compute the remainder r=x-n*y where n=trunc(x/y). +?C:. +?H:#$d_fmod HAS_FMOD /**/ +?H:. +?LINT:set d_fmod +: see if fmod exists +set fmod d_fmod +eval $inlibc + diff --git a/mcon/U/d_fork.U b/mcon/U/d_fork.U new file mode 100644 index 0000000..796aee3 --- /dev/null +++ b/mcon/U/d_fork.U @@ -0,0 +1,33 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_fork.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:07:38 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_fork: Inlibc +?MAKE: -pick add $@ %< +?S:d_fork: +?S: This variable conditionally defines the HAS_FORK symbol, which +?S: indicates to the C program that the fork() routine is available. +?S:. +?C:HAS_FORK : +?C: This symbol, if defined, indicates that the fork routine is +?C: available. +?C:. +?H:#$d_fork HAS_FORK /**/ +?H:. +?LINT:set d_fork +: see if fork exists +set fork d_fork +eval $inlibc + diff --git a/mcon/U/d_fsetpos.U b/mcon/U/d_fsetpos.U new file mode 100644 index 0000000..ce3d195 --- /dev/null +++ b/mcon/U/d_fsetpos.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_fsetpos.U,v $ +?RCS: Revision 3.0.1.1 1994/06/20 06:57:38 ram +?RCS: patch30: created +?RCS: +?MAKE:d_fsetpos: Inlibc +?MAKE: -pick add $@ %< +?S:d_fsetpos: +?S: This variable conditionally defines HAS_FSETPOS if fsetpos() is +?S: available to set the file position indicator. +?S:. +?C:HAS_FSETPOS: +?C: This symbol, if defined, indicates that the fsetpos routine is +?C: available to set the file position indicator, similar to fseek(). +?C:. +?H:#$d_fsetpos HAS_FSETPOS /**/ +?H:. +?LINT:set d_fsetpos +: see if fsetpos exists +set fsetpos d_fsetpos +eval $inlibc + diff --git a/mcon/U/d_ftime.U b/mcon/U/d_ftime.U new file mode 100644 index 0000000..0e41cc7 --- /dev/null +++ b/mcon/U/d_ftime.U @@ -0,0 +1,78 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_ftime.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:06 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_ftime d_gettimeod: Inlibc Setvar +?MAKE: -pick add $@ %< +?S:d_ftime: +?S: This variable conditionally defines the HAS_FTIME symbol, which indicates +?S: that the ftime() routine exists. The ftime() routine is basically +?S: a sub-second accuracy clock. +?S:. +?S:d_gettimeod: +?S: This variable conditionally defines the HAS_GETTIMEOFDAY symbol, which +?S: indicates that the gettimeofday() system call exists (to obtain a +?S: sub-second accuracy clock). You should probably include . +?S:. +?C:HAS_FTIME (FTIMER): +?C: This symbol, if defined, indicates that the ftime() routine exists. +?C: It is basically a sub-second accuracy clock, but is less accurate +?C: than gettimeofday(2) anyway. The type "Timeval" should be used to +?C: refer to "struct timeb". +?C:. +?C:HAS_GETTIMEOFDAY (GETTIMEOFDAY): +?C: This symbol, if defined, indicates that the gettimeofday() system +?C: call is available for a sub-second accuracy clock. Usually, the file +?C: needs to be included (see I_SYS_RESOURCE). +?C: The type "Timeval" should be used to refer to "struct timeval". +?C:. +?H:#$d_ftime HAS_FTIME /**/ +?H:#$d_gettimeod HAS_GETTIMEOFDAY /**/ +?H:?%<:@if HAS_FTIME +?H:?%<:#ifdef HAS_FTIME +?H:?%<:#define Timeval struct timeb /* Structure used by ftime() */ +?H:?%<:#endif +?H:?%<:@end +?H:?%<:@if HAS_GETTIMEOFDAY +?H:?%<:#ifdef HAS_GETTIMEOFDAY +?H:?%<:#define Timeval struct timeval /* Structure used by gettimeofday() */ +?H:?%<:#endif +?H:?%<:@end +?H:. +?X:FIXME +?X:?I:?d_ftime:i_systimeb +?X:?I:?d_gettimeod:i_sysresrc +?LINT:set d_gettimeod d_ftime +?LINT:known Timeval +: see if gettimeofday or ftime exists +?X: +?X: Give priority to gettimeofday(2) because timing is more accurate +?X: +set gettimeofday d_gettimeod +eval $inlibc +case "$d_gettimeod" in +"$undef") + set ftime d_ftime + eval $inlibc + ;; +*) + val="$undef"; set d_ftime; eval $setvar + ;; +esac +case "$d_gettimeod$d_ftime" in +"$undef$undef") + echo " " + echo 'No ftime() nor gettimeofday() -- timing may be less accurate.' >&4 + ;; +esac + diff --git a/mcon/U/d_ftrncate.U b/mcon/U/d_ftrncate.U new file mode 100644 index 0000000..29202b2 --- /dev/null +++ b/mcon/U/d_ftrncate.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_ftrncate.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:07 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_ftrncate: Inlibc +?MAKE: -pick add $@ %< +?S:d_ftrncate (d_ftruncate): +?S: This variable conditionally defines the HAS_FTRUNCATE symbol, which +?S: indicates to the C program that the ftruncate() subroutine exists. +?S:. +?C:HAS_FTRUNCATE: +?C: This symbol, if defined, indicates that the ftruncate() subroutine +?C: exists. +?C:. +?H:#$d_ftrncate HAS_FTRUNCATE /**/ +?H:. +?LINT:set d_ftrncate +: see if ftruncate exists +set ftruncate d_ftrncate +eval $inlibc + diff --git a/mcon/U/d_gconvert.U b/mcon/U/d_gconvert.U new file mode 100644 index 0000000..367da20 --- /dev/null +++ b/mcon/U/d_gconvert.U @@ -0,0 +1,147 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_gconvert.U,v $ +?RCS: Revision 3.0.1.3 1997/02/28 15:33:38 ram +?RCS: patch61: integrated new unit from perl5 +?RCS: +?RCS: Revision 3.0.1.2 1995/07/25 13:55:59 ram +?RCS: patch56: improved comments about the Gconvert macro (ADO) +?RCS: patch56: force compile-link test since it may exist but be unusable (ADO) +?RCS: +?RCS: Revision 3.0.1.1 1994/10/29 16:12:51 ram +?RCS: patch36: created by ADO +?RCS: +?MAKE:d_Gconvert: cat cc ccflags ldflags libs Inlibc rm _o +?MAKE: -pick add $@ %< +?S:d_Gconvert: +?S: This variable holds what Gconvert is defined as to convert +?S: floating point numbers into strings. It could be 'gconvert' +?S: or a more complex macro emulating gconvert with gcvt() or sprintf. +?S:. +?C:Gconvert: +?C: This preprocessor macro is defined to convert a floating point +?C: number to a string without a trailing decimal point. This +?C: emulates the behavior of sprintf("%g"), but is sometimes much more +?C: efficient. If gconvert() is not available, but gcvt() drops the +?C: trailing decimal point, then gcvt() is used. If all else fails, +?C: a macro using sprintf("%g") is used. Arguments for the Gconvert +?C: macro are: value, number of digits, whether trailing zeros should +?C: be retained, and the output buffer. +?C: Possible values are: +?C: d_Gconvert='gconvert((x),(n),(t),(b))' +?C: d_Gconvert='gcvt((x),(n),(b))' +?C: d_Gconvert='sprintf((b),"%.*g",(n),(x))' +?C: The last two assume trailing zeros should not be kept. +?C:. +?H:#define Gconvert(x,n,t,b) $d_Gconvert +?H:. +?T: xxx_list xxx_convert +?F:!try +?X: +: Check how to convert floats to strings. +echo " " +echo "Checking for an efficient way to convert floats to strings." +?X: We want to be sure to drop trailing decimal points (perl5 +?X: needs this). +$cat >try.c <<'EOP' +#ifdef TRY_gconvert +#define Gconvert(x,n,t,b) gconvert((x),(n),(t),(b)) +char *myname = "gconvert"; +#endif +#ifdef TRY_gcvt +#define Gconvert(x,n,t,b) gcvt((x),(n),(b)) +char *myname = "gcvt"; +#endif +#ifdef TRY_sprintf +#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x)) +char *myname = "sprintf"; +#endif + +#include + +int +checkit(expect, got) +char *expect; +char *got; +{ + if (strcmp(expect, got)) { + printf("%s oddity: Expected %s, got %s\n", + myname, expect, got); + exit(1); + } +} + +int +int main() +{ + char buf[64]; + buf[63] = '\0'; + + /* This must be 1st test on (which?) platform */ + /* Alan Burlison */ + Gconvert(0.1, 8, 0, buf); + checkit("0.1", buf); + + Gconvert(1.0, 8, 0, buf); + checkit("1", buf); + + Gconvert(0.0, 8, 0, buf); + checkit("0", buf); + + Gconvert(-1.0, 8, 0, buf); + checkit("-1", buf); + + /* Some Linux gcvt's give 1.e+5 here. */ + Gconvert(100000.0, 8, 0, buf); + checkit("100000", buf); + + /* Some Linux gcvt's give -1.e+5 here. */ + Gconvert(-100000.0, 8, 0, buf); + checkit("-100000", buf); + + exit(0); +} +EOP +?X: List of order in which to search for functions. +?X: Usual order of efficiency is gconvert gcvt sprintf +?X: Respect a previous or hinted value. +case "$d_Gconvert" in +gconvert*) xxx_list='gconvert gcvt sprintf' ;; +gcvt*) xxx_list='gcvt gconvert sprintf' ;; +sprintf*) xxx_list='sprintf gconvert gcvt' ;; +*) xxx_list='gconvert gcvt sprintf' ;; +esac + +for xxx_convert in $xxx_list; do + echo "Trying $xxx_convert" + $rm -f try try$_o + if $cc $ccflags -DTRY_$xxx_convert $ldflags -o try \ + try.c $libs > /dev/null 2>&1 ; then + echo "$xxx_convert" found. >&4 + if ./try; then + echo "I'll use $xxx_convert to convert floats into a string." >&4 + break; + else + echo "...But $xxx_convert didn't work as I expected." + fi + else + echo "$xxx_convert NOT found." >&4 + fi +done + +case "$xxx_convert" in +gconvert) d_Gconvert='gconvert((x),(n),(t),(b))' ;; +gcvt) d_Gconvert='gcvt((x),(n),(b))' ;; +*) d_Gconvert='sprintf((b),"%.*g",(n),(x))' ;; +esac + diff --git a/mcon/U/d_getgrps.U b/mcon/U/d_getgrps.U new file mode 100644 index 0000000..0cd16ea --- /dev/null +++ b/mcon/U/d_getgrps.U @@ -0,0 +1,33 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getgrps.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:08 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_getgrps: Inlibc +?MAKE: -pick add $@ %< +?S:d_getgrps: +?S: This variable conditionally defines the HAS_GETGROUPS symbol, which +?S: indicates to the C program that the getgroups() routine is available +?S: to get the list of process groups. +?S:. +?C:HAS_GETGROUPS (GETGROUPS): +?C: This symbol, if defined, indicates that the getgroups() routine is +?C: available to get the list of process groups. If unavailable, multiple +?C: groups are probably not supported. +?C:. +?H:#$d_getgrps HAS_GETGROUPS /**/ +?H:. +?LINT:set d_getgrps +: see if getgroups exists +set getgroups d_getgrps +eval $inlibc + diff --git a/mcon/U/d_gethbynm.U b/mcon/U/d_gethbynm.U new file mode 100644 index 0000000..a7040ed --- /dev/null +++ b/mcon/U/d_gethbynm.U @@ -0,0 +1,32 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_gethbynm.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:08 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_gethbynm: Inlibc +?MAKE: -pick add $@ %< +?S:d_gethbynm (d_gethhstby): +?S: This variable conditionally defines the HAS_GETHOSTBYNAME symbol, which +?S: indicates to the C program that the gethostbyname() routine is available +?S: to lookup host names in some data base or other. +?S:. +?C:HAS_GETHOSTBYNAME (GETHOSTBYNAME): +?C: This symbol, if defined, indicates that the gethostbyname() routine is +?C: available to lookup host names in some data base or other. +?C:. +?H:#$d_gethbynm HAS_GETHOSTBYNAME /**/ +?H:. +?LINT:set d_gethbynm +: see if gethostbyname exists +set gethostbyname d_gethbynm +eval $inlibc + diff --git a/mcon/U/d_gethent.U b/mcon/U/d_gethent.U new file mode 100644 index 0000000..fa1427f --- /dev/null +++ b/mcon/U/d_gethent.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_gethent.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:09 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_gethent: Inlibc +?MAKE: -pick add $@ %< +?S:d_gethent: +?S: This variable conditionally defines HAS_GETHOSTENT if gethostent() is +?S: available to dup file descriptors. +?S:. +?C:HAS_GETHOSTENT (GETHOSTENT): +?C: This symbol, if defined, indicates that the gethostent routine is +?C: available to lookup host names in some data base or other. +?C:. +?H:#$d_gethent HAS_GETHOSTENT /**/ +?H:. +?LINT:set d_gethent +: see if gethostent exists +set gethostent d_gethent +eval $inlibc + diff --git a/mcon/U/d_gethid.U b/mcon/U/d_gethid.U new file mode 100644 index 0000000..d19c9f8 --- /dev/null +++ b/mcon/U/d_gethid.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_gethid.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:10 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_gethid: Inlibc +?MAKE: -pick add $@ %< +?S:d_gethid: +?S: This variable conditionally defines HAS_GETHOSTID if gethostid() is +?S: available to get the host id. +?S:. +?C:HAS_GETHOSTID (GETHOSTID): +?C: This symbol, if defined, indicates that the gethostid system call is +?C: available to get the host id. +?C:. +?H:#$d_gethid HAS_GETHOSTID /**/ +?H:. +?LINT:set d_gethid +: see if gethid exists +set gethostid d_gethid +eval $inlibc + diff --git a/mcon/U/d_gethname.U b/mcon/U/d_gethname.U new file mode 100644 index 0000000..8ce181f --- /dev/null +++ b/mcon/U/d_gethname.U @@ -0,0 +1,287 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_gethname.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:13:00 ram +?RCS: patch36: call ./xenix explicitely instead of relying on PATH +?RCS: +?RCS: Revision 3.0 1993/08/18 12:06:11 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_gethname d_uname d_phostname aphostname: phostname cat \ + myhostname package d_portable Loc echo n c +i_whoami +usrinc \ + Myread Guess Oldconfig Csym +?MAKE: -pick add $@ %< +?S:d_gethname: +?S: This variable conditionally defines the HAS_GETHOSTNAME symbol, which +?S: indicates to the C program that the gethostname() routine may be +?S: used to derive the host name. +?S:. +?S:d_uname: +?S: This variable conditionally defines the HAS_UNAME symbol, which +?S: indicates to the C program that the uname() routine may be +?S: used to derive the host name. +?S:. +?S:d_phostname: +?S: This variable conditionally defines the PHOSTNAME symbol, which +?S: contains the shell command which, when fed to popen(), may be +?S: used to derive the host name. +?S:. +?S:aphostname: +?S: Thie variable contains the command which can be used to compute the +?S: host name. The command is fully qualified by its absolute path, to make +?S: it safe when used by a process with super-user privileges. +?S:. +?C:HAS_GETHOSTNAME (GETHOSTNAME): +?C: This symbol, if defined, indicates that the C program may use the +?C: gethostname() routine to derive the host name. See also HAS_UNAME +?C: and PHOSTNAME. +?C:. +?C:HAS_UNAME (UNAME): +?C: This symbol, if defined, indicates that the C program may use the +?C: uname() routine to derive the host name. See also HAS_GETHOSTNAME +?C: and PHOSTNAME. +?C:. +?C:PHOSTNAME: +?C: This symbol, if defined, indicates that the C program may use the +?C: contents of PHOSTNAME as a command to feed to the popen() routine +?C: to derive the host name. See also HAS_GETHOSTNAME and HAS_UNAME. +?C: Note that the command uses a fully qualified path, so that it is safe +?C: even if used by a process with super-user privileges. +?C:. +?H:#$d_gethname HAS_GETHOSTNAME /**/ +?H:#$d_uname HAS_UNAME /**/ +?H:#$d_phostname PHOSTNAME "$aphostname" /* How to get the host name */ +?H:. +?T:file val call +?LINT:change i_whoami +: see how we will look up host name +echo " " +if false; then + : dummy stub to allow use of elif +@if HAS_GETHOSTNAME +elif set gethostname val -f d_gethname; eval $csym; $val; then + echo 'gethostname() found.' >&4 + d_gethname="$define" + call=gethostname +@end +@if HAS_UNAME +elif set uname val -f d_uname; eval $csym; $val; then + if ./xenix; then + $cat <<'EOM' +uname() was found, but you're running xenix, and older versions of xenix +have a broken uname(). If you don't really know whether your xenix is old +enough to have a broken system call, use the default answer. + +EOM + dflt=y + case "$d_uname" in + "$define") dflt=n;; + esac + rp='Is your uname() broken?' + . ./myread + case "$ans" in + n*) d_uname="$define"; call=uname;; + esac + else + echo 'uname() found.' >&4 + d_uname="$define" + call=uname + fi +@end +fi +case "$d_gethname" in +'') d_gethname="$undef";; +esac +case "$d_uname" in +'') d_uname="$undef";; +esac +@if PHOSTNAME || MYHOSTNAME +case "$d_uname$d_gethname" in +*define*) + dflt=n + cat <&4;; +@ end + esac;; +esac +@elsif PHOSTNAME +case "$d_uname$d_gethname" in +*define*) ;; +*) + case "$phostname" in + '') +@ if WHOAMI + case "$i_whoami" in + "$define") + $cat <&4;; + esac;; +@ else + echo "There will be no way for $package to get your hostname." >&4;; +@ end + *) + echo "I'll use 'popen("'"'$aphostname'", "r")'"' to get your hostname." >&4 + ;; + esac;; +esac +@elsif MYHOSTNAME +case "$d_uname$d_gethname" in +*define*) ;; +*) +@ if WHOAMI + case "$i_whoami" in + "$define") + dflt=y + $cat <&4;; + esac;; +@ else + echo 'Hardwiring "'$myhostname'".' >&4;; +@ end +esac +@end +case "$d_phostname" in +'') d_phostname="$undef";; +esac + diff --git a/mcon/U/d_getlogin.U b/mcon/U/d_getlogin.U new file mode 100644 index 0000000..abb9dd5 --- /dev/null +++ b/mcon/U/d_getlogin.U @@ -0,0 +1,34 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_getlogin.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:07:41 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_getlogin: Inlibc +?MAKE: -pick add $@ %< +?S:d_getlogin: +?S: This variable conditionally defines the HAS_GETLOGIN symbol, which +?S: indicates to the C program that the getlogin() routine is available +?S: to get the login name. +?S:. +?C:HAS_GETLOGIN : +?C: This symbol, if defined, indicates that the getlogin routine is +?C: available to get the login name. +?C:. +?H:#$d_getlogin HAS_GETLOGIN /**/ +?H:. +?LINT:set d_getlogin +: see if getlogin exists +set getlogin d_getlogin +eval $inlibc + diff --git a/mcon/U/d_getopt.U b/mcon/U/d_getopt.U new file mode 100644 index 0000000..c5438b4 --- /dev/null +++ b/mcon/U/d_getopt.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getopt.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:13 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_getopt: Inlibc +?MAKE: -pick add $@ %< +?S:d_getopt: +?S: This variable conditionally defines the HAS_GETOPT symbol, which +?S: indicates that the getopt() routine exists. The getopt() routine +?S: parses command line options in a standard fashion. +?S:. +?C:HAS_GETOPT (GETOPT): +?C: This symbol, if defined, indicates that the getopt() routine exists. +?C:. +?H:#$d_getopt HAS_GETOPT /**/ +?H:. +?LINT:set d_getopt +: see if getopt exists +set getopt d_getopt +eval $inlibc + diff --git a/mcon/U/d_getpagsz.U b/mcon/U/d_getpagsz.U new file mode 100644 index 0000000..6083653 --- /dev/null +++ b/mcon/U/d_getpagsz.U @@ -0,0 +1,104 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getpagsz.U,v $ +?RCS: Revision 3.0.1.1 1994/10/29 16:13:10 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0 1993/08/18 12:06:14 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_getpagsz pagesize: Oldconfig Myread Inlibc cat contains +cc +ccflags \ + libs rm Findhdr +?MAKE: -pick add $@ %< +?S:d_getpagsz: +?S: This variable conditionally defines HAS_GETPAGESIZE if getpagesize() +?S: is available to get the system page size. +?S:. +?S:pagesize (pagsize): +?S: This variable holds the size in bytes of a system page. +?S:. +?C:HAS_GETPAGESIZE (GETPAGESIZE): +?C: This symbol, if defined, indicates that the getpagesize system call +?C: is available to get system page size, which is the granularity of +?C: many memory management calls. +?C:. +?X: Don't name it PAGESIZE, this is sometimes used by +?C:PAGESIZE_VALUE (PAGSIZE): +?C: This symbol holds the size in bytes of a system page (obtained via +?C: the getpagesize() system call at configuration time or asked to the +?C: user if the system call is not available). +?C:. +?H:#$d_getpagsz HAS_GETPAGESIZE /**/ +?H:#define PAGESIZE_VALUE $pagesize /* System page size, in bytes */ +?H:. +?F:!page +?T:guess +?LINT:set d_getpagsz +: see if getpagesize exists +set getpagesize d_getpagsz +eval $inlibc + +@if pagesize || PAGESIZE_VALUE +: determine the system page size +echo " " +guess=' (OK to guess)' +case "$pagesize" in +'') + $cat >page.c <&4 + dflt='4096' + case "$d_getpagsz" in + "$define") + if $cc $ccflags -o page page.c $libs >/dev/null 2>&1; then + dflt=`./page` + guess='' + else + echo "(I can't seem to compile the test program--guessing)" + fi + ;; + *) + if $cc $ccflags -o page page.c $libs -lPW >/dev/null 2>&1; then + dflt=`./page` + guess='' + echo "(For your eyes only: I used the getpagesize() from -lPW.)" + else + if $contains PAGESIZE `./findhdr sys/param.h` >/dev/null 2>&1; then + $cat >page.c < +int main() +{ + printf("%d\n", PAGESIZE); +} +EOP + if $cc $ccflags -o page page.c $libs >/dev/null 2>&1; then + dflt=`./page` + guess='' + echo "(Using value of PAGESIZE found in .)" + fi + fi + fi + ;; + esac + ;; +*) dflt="$pagesize"; guess='';; +esac +rp="What is the system page size, in bytes$guess?" +. ./myread +pagesize=$ans +$rm -f page.c page + +@end diff --git a/mcon/U/d_getpgid.U b/mcon/U/d_getpgid.U new file mode 100644 index 0000000..de6a1a7 --- /dev/null +++ b/mcon/U/d_getpgid.U @@ -0,0 +1,34 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1996, Andy Dougherty +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getpgid.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 15:33:44 ram +?RCS: patch61: created +?RCS: +?MAKE:d_getpgid: Inlibc +?MAKE: -pick add $@ %< +?S:d_getpgid: +?S: This variable conditionally defines the HAS_GETPGID symbol, which +?S: indicates to the C program that the getpgid(pid) function +?S: is available to get the process group id. +?S:. +?C:HAS_GETPGID: +?C: This symbol, if defined, indicates to the C program that +?C: the getpgid(pid) function is available to get the +?C: process group id. +?C:. +?H:#$d_getpgid HAS_GETPGID /**/ +?H:. +?LINT:set d_getpgid +: see if getpgid exists +set getpgid d_getpgid +eval $inlibc + diff --git a/mcon/U/d_getpgrp.U b/mcon/U/d_getpgrp.U new file mode 100644 index 0000000..bc5f5d2 --- /dev/null +++ b/mcon/U/d_getpgrp.U @@ -0,0 +1,108 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getpgrp.U,v $ +?RCS: Revision 3.0.1.1 1997/02/28 15:34:28 ram +?RCS: patch61: new USE_BSD_GETPGRP to detect the getpgrp() flavour +?RCS: +?RCS: Revision 3.0 1993/08/18 12:06:15 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_getpgrp d_bsdgetpgrp: Guess Inlibc Setvar cat rm \ + +cc +ccflags +ldflags +libs i_unistd +?MAKE: -pick add $@ %< +?S:d_getpgrp: +?S: This variable conditionally defines HAS_GETPGRP if getpgrp() is +?S: available to get the current process group. +?S:. +?S:d_bsdgetpgrp: +?S: This variable conditionally defines USE_BSD_GETPGRP if +?S: getpgrp needs one arguments whereas USG one needs none. +?S:. +?C:HAS_GETPGRP (GETPGRP): +?C: This symbol, if defined, indicates that the getpgrp routine is +?C: available to get the current process group. +?C:. +?C:USE_BSD_GETPGRP: +?C: This symbol, if defined, indicates that getpgrp needs one +?C: arguments whereas USG one needs none. +?C:. +?H:#$d_getpgrp HAS_GETPGRP /**/ +?H:#$d_bsdgetpgrp USE_BSD_GETPGRP /**/ +?H:. +?F:!set !set.c +?T:xxx +?LINT:set d_getpgrp d_bsdgetpgrp +: see if getpgrp exists +set getpgrp d_getpgrp +eval $inlibc + +@if USE_BSD_GETPGRP || d_bsdgetpgrp +case "$d_getpgrp" in +"$define") + echo " " + echo "Checking to see which flavor of getpgrp is in use..." + $cat >set.c < +#ifdef I_UNISTD +# include +#endif +int main() +{ + if (getuid() == 0) { + printf("(I see you are running Configure as super-user...)\n"); + setuid(1); + } +#ifdef TRY_BSD_PGRP + if (getpgrp(1) == 0) + exit(0); +#else + if (getpgrp() > 0) + exit(0); +#endif + exit(1); +} +EOP + if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 + && ./set + then + echo "You have to use getpgrp(pid) instead of getpgrp()." >&4 + val="$define" + elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then + echo "You have to use getpgrp() instead of getpgrp(pid)." >&4 + val="$undef" + else + echo "I can't seem to compile and run the test program." + if ./usg; then + xxx="a USG one, i.e. you use getpgrp()." + else + # SVR4 systems can appear rather BSD-ish. + case "$i_unistd" in + $undef) + xxx="a BSD one, i.e. you use getpgrp(pid)." + val="$define" + ;; + $define) + xxx="probably a USG one, i.e. you use getpgrp()." + val="$undef" + ;; + esac + fi + echo "Assuming your getpgrp is $xxx" >&4 + fi + ;; +*) val="$undef";; +esac +set d_bsdgetpgrp +eval $setvar +$rm -f set set.c +@end + diff --git a/mcon/U/d_getpgrp2.U b/mcon/U/d_getpgrp2.U new file mode 100644 index 0000000..3aa5e1d --- /dev/null +++ b/mcon/U/d_getpgrp2.U @@ -0,0 +1,32 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getpgrp2.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:15 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_getpgrp2: Inlibc +?MAKE: -pick add $@ %< +?S:d_getpgrp2: +?S: This variable conditionally defines the HAS_GETPGRP2 symbol, which +?S: indicates to the C program that the getpgrp2() (as in DG/UX) routine +?S: is available to get the current process group. +?S:. +?C:HAS_GETPGRP2 (GETPGRP2): +?C: This symbol, if defined, indicates that the getpgrp2() (as in DG/UX) +?C: routine is available to get the current process group. +?C:. +?H:#$d_getpgrp2 HAS_GETPGRP2 /**/ +?H:. +?LINT:set d_getpgrp2 +: see if getpgrp2 exists +set getpgrp2 d_getpgrp2 +eval $inlibc + diff --git a/mcon/U/d_getppid.U b/mcon/U/d_getppid.U new file mode 100644 index 0000000..6754924 --- /dev/null +++ b/mcon/U/d_getppid.U @@ -0,0 +1,34 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_getppid.U,v $ +?RCS: Revision 3.0.1.1 1994/08/29 16:07:45 ram +?RCS: patch32: created by ADO +?RCS: +?MAKE:d_getppid: Inlibc +?MAKE: -pick add $@ %< +?S:d_getppid: +?S: This variable conditionally defines the HAS_GETPPID symbol, which +?S: indicates to the C program that the getppid() routine is available +?S: to get the parent process ID. +?S:. +?C:HAS_GETPPID : +?C: This symbol, if defined, indicates that the getppid routine is +?C: available to get the parent process ID. +?C:. +?H:#$d_getppid HAS_GETPPID /**/ +?H:. +?LINT:set d_getppid +: see if getppid exists +set getppid d_getppid +eval $inlibc + diff --git a/mcon/U/d_getprior.U b/mcon/U/d_getprior.U new file mode 100644 index 0000000..0397f1c --- /dev/null +++ b/mcon/U/d_getprior.U @@ -0,0 +1,31 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getprior.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:16 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_getprior: Inlibc +?MAKE: -pick add $@ %< +?S:d_getprior: +?S: This variable conditionally defines HAS_GETPRIORITY if getpriority() +?S: is available to get a process's priority. +?S:. +?C:HAS_GETPRIORITY (GETPRIORITY): +?C: This symbol, if defined, indicates that the getpriority routine is +?C: available to get a process's priority. +?C:. +?H:#$d_getprior HAS_GETPRIORITY /**/ +?H:. +: see if getpriority exists +?LINT:set d_getprior +set getpriority d_getprior +eval $inlibc + diff --git a/mcon/U/d_getpwent.U b/mcon/U/d_getpwent.U new file mode 100644 index 0000000..fbec685 --- /dev/null +++ b/mcon/U/d_getpwent.U @@ -0,0 +1,40 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getpwent.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:17 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_getpwent: Csym Setvar +?MAKE: -pick add $@ %< +?S:d_getpwent: +?S: This variable conditionally defines the HAS_GETPWENT symbol, which +?S: indicates to the C program that it should use the getpwent() +?S: routine instead of the getpw() routine. +?S:. +?C:HAS_GETPWENT (GETPWENT): +?C: This symbol, if defined, indicates that the getpwent() routine +?C: should be used instead of the getpw() routine. +?C:. +?H:#$d_getpwent HAS_GETPWENT /**/ +?H:. +?LINT:set d_getpwent +: see if there is a getpwent +echo " " +if set getpwent val -f d_getpwent; eval $csym; $val; then + echo "getpwent() found." >&4 + val="$define" +else + echo "No getpwent() found -- will use getpw() instead." >&4 + val="$undef" +fi +set d_getpwent +eval $setvar + diff --git a/mcon/U/d_getwd.U b/mcon/U/d_getwd.U new file mode 100644 index 0000000..987e93b --- /dev/null +++ b/mcon/U/d_getwd.U @@ -0,0 +1,41 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_getwd.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:18 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_getwd: Csym Setvar +?MAKE: -pick add $@ %< +?S:d_getwd: +?S: This variable conditionally defines HAS_GETWD if getwd() is +?S: available to get working directory. If not, you should +?S: probably use getcwd(). +?S:. +?C:HAS_GETWD (GETWD): +?C: This symbol, if defined, indicates that the getwd routine is +?C: available to get working directory. If not, you should +?C: probably use getcwd(). +?C:. +?H:#$d_getwd HAS_GETWD /**/ +?H:. +?LINT:set d_getwd +: see if getwd exists +echo " " +if set getwd val -f d_getwd; eval $csym; $val; then + echo 'getwd() found.' >&4 + val="$define" +else + echo 'getwd() not found. Assuming getcwd() exists.' >&4 + val="$undef" +fi +set d_getwd +eval $setvar + diff --git a/mcon/U/d_gnulibc.U b/mcon/U/d_gnulibc.U new file mode 100644 index 0000000..ead5dfa --- /dev/null +++ b/mcon/U/d_gnulibc.U @@ -0,0 +1,98 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1996,1998 Andy Dougherty +?RCS: Copyright (c) 1996, Sven Verdoolaege +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?MAKE:d_gnulibc gnulibc_version: Myread Oldconfig Setvar rm \ + cat Compile run +?MAKE: -pick add $@ %< +?S:d_gnulibc: +?S: Defined if we're dealing with the GNU C Library. +?S:. +?S:gnulibc_version: +?S: This variable contains the version number of the GNU C library. +?S: It is usually something like '2.2.5'. It is a plain '' if this +?S: is not the GNU C library, or if the version is unknown. +?S:. +?C:HAS_GNULIBC ~ %<: +?C: This symbol, if defined, indicates to the C program that +?C: the GNU C library is being used. A better check is to use +?C: the __GLIBC__ and __GLIBC_MINOR__ symbols supplied with glibc. +?C:. +?H:?%<:#$d_gnulibc HAS_GNULIBC /**/ +?H:?%<:#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE) +?H:?%<:#define _GNU_SOURCE +?H:?%<:#endif +?H:. +?F:!glibc.ver !try.c !try +?LINT: set d_gnulibc +?LINT: usefile try.c +?LINT: known _GNU_SOURCE +?X: gnulibc can be executed by calling __libc_main(). +?X: Ulrich Drepper doesn't think any other libc does that, +?X: but we check if it says 'GNU C Library' to be sure. +?X: +?X: Alas, as of 3/1998 glibc 2.0.7 reportedly isn't going to +?X: have __libc_main() anymore. :-(. Fortunately, all released +?X: versions of glibc 2.x.x _do_ have CPP variables. For 2.0.6, +?X: they are: +?X: #define __GLIBC__ 2 +?X: #define__GLIBC_MINOR__ 0. +?X: (The '6' isn't available :-(. +?X: glibc2.1 will also have +?X: extern const char * __gnu_get_libc_release(void); +?X: extern const char * __gnu_get_libc_version(void); +?X: functions. --thanks to Andreas Jaeger. --AD 6/1998. +?X: Although the exact format isn't documented, __gnu_get_libc_version() +?X: returns a simple string '2.1.3' in glibc 2.1.3. +?X: +: determine whether we are using a GNU C library +echo " " +echo "Checking for GNU C Library..." >&4 +cat >try.c <<'EOCP' +/* Find out version of GNU C library. __GLIBC__ and __GLIBC_MINOR__ + alone are insufficient to distinguish different versions, such as + 2.0.6 and 2.0.7. The function gnu_get_libc_version() appeared in + libc version 2.1.0. A. Dougherty, June 3, 2002. +*/ +#include +int main(void) +{ +#ifdef __GLIBC__ +# ifdef __GLIBC_MINOR__ +# if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1 +# include + printf("%s\n", gnu_get_libc_version()); +# else + printf("%d.%d\n", __GLIBC__, __GLIBC_MINOR__); +# endif +# else + printf("%d\n", __GLIBC__); +# endif + return 0; +#else + return 1; +#endif +} +EOCP +set try +if eval $compile_ok && $run ./try > glibc.ver; then + val="$define" + gnulibc_version=`$cat glibc.ver` + echo "You are using the GNU C Library version $gnulibc_version" +else + val="$undef" + gnulibc_version='' + echo "You are not using the GNU C Library" +fi +$rm -f try try.* glibc.ver +set d_gnulibc +eval $setvar + diff --git a/mcon/U/d_group.U b/mcon/U/d_group.U new file mode 100644 index 0000000..af841a7 --- /dev/null +++ b/mcon/U/d_group.U @@ -0,0 +1,23 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: Original Author: Andy Dougherty +?RCS: +?RCS: $Log: d_group.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 15:34:52 ram +?RCS: patch61: useless unit dropped. +?RCS: +?RCS: Revision 3.0.1.1 1994/08/29 16:07:48 ram +?RCS: patch32: created by ADO +?RCS: +?X: +?X: Useless unit dropped. +?X: +?LINT:empty diff --git a/mcon/U/d_havetlib.U b/mcon/U/d_havetlib.U new file mode 100644 index 0000000..b564e65 --- /dev/null +++ b/mcon/U/d_havetlib.U @@ -0,0 +1,125 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_havetlib.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 15:36:31 ram +?RCS: patch61: replaced .a with $_a all over the place +?RCS: patch61: likewise for .o replaced by $_o +?RCS: +?RCS: Revision 3.0.1.1 1994/05/06 14:44:06 ram +?RCS: patch23: added AIX support to accept shared lib stub as termlib (WED) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:06:19 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_havetlib termlib: cat contains Myread Loc Filexp Oldconfig libpth \ + test uname _a _o +?MAKE: -pick add $@ %< +?S:d_havetlib: +?S: This variable conditionally defines the HAS_TERMLIB symbol, which +?S: indicates to the C program that termlib-style routines are available. +?S:. +?S:termlib: +?S: This variable contains the argument to pass to the loader to get +?S: termlib-style routines. It is up to the Makefile.SH to make sure +?S: the value gets to the right command. Note that on many systems the +?S: termlib routines are emulated by the curses or terminfo library. +?S:. +?C:HAS_TERMLIB (HAVETERMLIB): +?C: This symbol, when defined, indicates that termlib-style routines +?C: are available. There is nothing to include. +?C:. +?H:#$d_havetlib HAS_TERMLIB /**/ +?H:. +?T:xxx +: where do we get termlib routines from +echo " " +xxx=`./loc libcurses$_a x $libpth` +case "$xxx" in +/*) + ar t $xxx >grimble + if $contains tputs$_o grimble >/dev/null 2>&1; then + termlib='-lcurses' + d_havetlib="$define" + echo "Terminfo library found." >&4 + elif $test "x`$uname 2>/dev/null`" = xAIX; then + # Ok, do the AIX shr.o fun thing + /usr/ccs/bin/nm -en $xxx 2>/dev/null >grimble + if $contains '^tputs .*|extern|' grimble >/dev/null 2>&1; then + termlib='-lcurses' + d_havetlib="$define" + echo "AIX Terminfo library found." >&4 + else + xxx=x + fi + else + xxx=x + fi + rm -f grimble + ;; +esac +case "$xxx" in +x) + xxx=`./loc libtermlib$_a x $libpth` + case "$xxx" in + /usr/lib*|/lib*) + termlib='-ltermlib' + d_havetlib="$define" + echo "Termlib library found." >&4 + ;; + /*) + termlib="$xxx" + d_havetlib="$define" + echo "Termlib library found." >&4 + ;; + *) + xxx=`./loc libtermcap$_a x $libpth` + case "$xxx" in + /usr/lib*|/lib*) + termlib='-ltermcap' + d_havetlib="$define" + echo "Termcap library found." >&4 + ;; + /*) + termlib="$xxx" + d_havetlib="$define" + echo "Termcap library found." >&4 + ;; + *) + case "$termlib" in + '') + dflt=y +rp="Your system appears to NOT have termlib-style routines. Is this true?" + . ./myread + case "$ans" in + n*|f*) d_havetlib="$define" + $cat <<'EOM' +Then where are the termlib-style routines kept? Specify either -llibname +or a full pathname (~name ok). + +EOM + dflt='' + rp='Specify termlib path:' + . ./myread + termlib=`./filexp $ans` + ;; + *) + d_havetlib="$undef" + termlib='' + echo "You will have to play around with term.c then." >&4 + ;; + esac + echo " ";; + *) echo "You said termlib was $termlib before." >&4;; + esac;; + esac;; + esac;; +esac + diff --git a/mcon/U/d_hidnet.U b/mcon/U/d_hidnet.U new file mode 100644 index 0000000..ce952f4 --- /dev/null +++ b/mcon/U/d_hidnet.U @@ -0,0 +1,68 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: d_hidnet.U,v $ +?RCS: Revision 3.0 1993/08/18 12:06:20 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_hidnet hiddennet: cat sed myhostname mydomain Myread Oldconfig +?MAKE: -pick add $@ %< +?S:d_hidnet: +?S: This variable conditionally defines the symbol HIDDEN_NET, which +?S: tells the C program that it should pretend it is on a different +?S: host for purposes of advertising a mailing address. +?S:. +?S:hiddennet: +?S: This variable contains the value eventually given to the symbol +?S: HIDDEN_NET, if d_hidnet defines it. If defined, it's the name +?S: of the host which serves as the mail server for a network that +?S: is invisible to the outside world. +?S:. +?C:HIDDEN_NET (HIDDENNET): +?C: This symbol, if defined, contains the host name that you want to +?C: advertise to the outside world. This name can be different from +?C: your actual host name, as long as the machine you specify knows +?C: how to forward mail to you. +?C:. +?H:#$d_hidnet HIDDEN_NET "$hiddennet" /**/ +?H:. +: now get the host name to advertise as our mailing address +case "$hiddennet" in +'') dflt=n;; +*) dflt=y;; +esac +$cat <

exp: Oldconfig Getfile +?MAKE: -pick add $@ %< +?S:: +?S: Where files are located. The name may have ~ on the front. +?S:. +?S:exp: +?S: This is the same as the variable, but is filename expanded +?S: so that later Configure units can look at the directory if desired. +?S:. +?C:<%DIR>: +?C: The directory where files are located. The name may have ~ on +?C: the front so the C program must be prepared to do ~ expansion. +?C:. +?C:<%DIR>_EXP: +?C: The same as , but ~name expantion has been done by Configure. +?C:. +?H:#define <%DIR> "$" /**/ +?H:#define <%DIR>_EXP "$exp" /**/ +?H:. +: locate directory +echo " " +case "$" in +'') + dflt= + ;; +*) dflt="$";; +esac +fn=d~ +rp='Where is the directory?' +. getfile +="$ans" +exp="$ansexp" + diff --git a/mcon/files/file.U b/mcon/files/file.U new file mode 100644 index 0000000..962bea5 --- /dev/null +++ b/mcon/files/file.U @@ -0,0 +1,47 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: file.U,v $ +?RCS: Revision 3.0 1993/08/18 12:10:06 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE: exp: Oldconfig Getfile +?MAKE: -pick add $@ %< +?S:: +?S: The name of the file. The name may have ~ on the front. +?S:. +?S:exp: +?S: This is the same as the variable, but is filename expanded +?S: so that later Configure units can look at the file if desired. +?S:. +?C:<%FILE>: +?C: The name of the file. The name may have ~ on the front so the +?C: program must be prepared to do filename expansion. +?C:. +?C:<%FILE>_EXP: +?C: The same as but ~name expansion has been done by Configure. +?C:. +?H:#define <%FILE> "$" /**/ +?H:#define <%FILE>_EXP "$exp" /**/ +?H:. +: locate file +echo " " +case "$" in +'') + dflt= + ;; +*) dflt="$";; +esac +fn=f~ +rp='Where is the file?' +. getfile +="$ans" +exp="$ansexp" + diff --git a/mcon/files/i_include.U b/mcon/files/i_include.U new file mode 100644 index 0000000..8abd462 --- /dev/null +++ b/mcon/files/i_include.U @@ -0,0 +1,32 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: i_include.U,v $ +?RCS: Revision 3.0 1993/08/18 12:10:07 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:i_: Inhdr +?MAKE: -pick add $@ %< +?S:i_: +?S: This variable conditionally defines the I_<%INCLUDE> symbol, which +?S: indicates to the C program that <.h> exists and should +?S: be included. +?S:. +?C:I_<%INCLUDE>: +?C: This symbol, if defined, indicates that <.h> exists and should +?C: be included. +?C:. +?H:#$i_ I_<%INCLUDE> /**/ +?H:. +?LINT:set i_ +: see if .h is available +set .h i_ +eval $inhdr + diff --git a/mcon/files/keyword.U b/mcon/files/keyword.U new file mode 100644 index 0000000..c94a5c7 --- /dev/null +++ b/mcon/files/keyword.U @@ -0,0 +1,54 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: keyword.U,v $ +?RCS: Revision 3.0 1993/08/18 12:10:08 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_const: cat cc ccflags Setvar +?MAKE: -pick add $@ %< +?S:d_: +?S: This variable conditionally defines the HASCONST symbol, which +?S: indicates to the C program that this C compiler knows about the +?S: type. +?S:. +?C:HAS<%KEY> ~ %<: +?C: This symbol, if defined, indicates that this C compiler knows about +?C: the type. There is no need to actually test for that symbol +?C: within your programs. The mere use of the "" keyword will +?C: trigger the necessary tests. +?C:. +?H:?%<:#$d_ HAS<%KEY> /**/ +?H:?%<:#ifndef HAS<%KEY> +?H:?%<:#define +?H:?%<:#endif +?H:. +?W:%<: +?LINT:set d_ +?LINT:known +: check for keyword +echo " " +echo 'Checking to see if your C compiler knows about ""...' +$cat >.c <<'EOCP' +main() +{ + char *foo; +} +EOCP +if $cc -c $ccflags .c >/dev/null 2>&1 ; then + val="$define" + echo "Yup, it does." +else + val="$undef" + echo "Nope, it doesn't." +fi +set d_ +eval $setvar + diff --git a/mcon/files/locate.U b/mcon/files/locate.U new file mode 100644 index 0000000..3793062 --- /dev/null +++ b/mcon/files/locate.U @@ -0,0 +1,47 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: locate.U,v $ +?RCS: Revision 3.0 1993/08/18 12:10:08 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE: exp: Oldconfig Getfile +?MAKE: -pick add $@ %< +?S:: +?S: The name of the file. The name may have ~ on the front. +?S:. +?S:exp: +?S: This is the same as the variable, but is filename expanded +?S: so that later Configure units can look at the file if desired. +?S:. +?C:<%FILE>: +?C: The name of the file. The name may have ~ on the front so the +?C: program must be prepared to do filename expansion. +?C:. +?C:<%FILE>_EXP: +?C: The same as but ~name expansion has been done by Configure. +?C:. +?H:#define <%FILE> "$" /**/ +?H:#define <%FILE>_EXP "$exp" /**/ +?H:. +: locate file +echo " " +case "$" in +'') + dflt= + ;; +*) dflt="$";; +esac +fn=l~: +rp='Where is the file?' +. getfile +="$ans" +exp="$ansexp" + diff --git a/mcon/files/question.U b/mcon/files/question.U new file mode 100644 index 0000000..56e38b5 --- /dev/null +++ b/mcon/files/question.U @@ -0,0 +1,58 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: question.U,v $ +?RCS: Revision 3.0 1993/08/18 12:10:09 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:d_scorfl: cat Myread Oldconfig nametype Setvar +?MAKE: -pick add $@ %< +?S:d_scorfl: +?S: This variable conditionally defines the SCOREFULL symbol, which +?S: indicates to the C program that any scoreboard kept by the program +?S: should be kept on the basis of the user's full name as opposed to +?S: the user's login name. +?S:. +?C:SCOREFULL: +?C: This symbol, if defined, indicates that any scoreboard kept by the +?C: program should be kept on the basis of the user's full name as opposed +?C: to the user's login name. If the user can change his full name he +?C: can enter multiple scores if this is defined. +?C:. +?H:#$d_scorfl SCOREFULL /**/ +?H:. +?LINT:set d_scorfl +: see how they want the scoreboard kept +case "$d_scorfl" in +"$define") dflt=y ;; +*) dflt=n ;; +esac +case "$nametype" in +other) val="$undef" ;; +*) + $cat <<'EOM' + +The scoreboard can be kept with one score per login name, or one score per full +name. If users can change their full name, or if there is more than one person +on your system with the same full name, you should keep the score by login name +(the full name is still printed). + +EOM + rp='Do you want the scoreboard kept by full name?' + . myread + case "$ans" in + y*) val="$define" ;; + *) val="$undef" ;; + esac + ;; +esac +set d_scorfl +eval $setvar + diff --git a/mcon/files/rcshead.U b/mcon/files/rcshead.U new file mode 100644 index 0000000..67a14df --- /dev/null +++ b/mcon/files/rcshead.U @@ -0,0 +1,15 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: rcshead.U,v $ +?RCS: Revision 3.0 1993/08/18 12:10:10 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: + diff --git a/mcon/files/shell.U b/mcon/files/shell.U new file mode 100644 index 0000000..5949b9d --- /dev/null +++ b/mcon/files/shell.U @@ -0,0 +1,68 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: shell.U,v $ +?RCS: Revision 3.0 1993/08/18 12:10:10 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:cc: cat contains sysman +large Mcc Myread Guess Oldconfig Loc +?MAKE: -pick add $@ %< +?DEF:cc=cc +?S:cc: +?S: This variable holds the name of a command to execute a C compiler which +?S: can resolve multiple global references that happen to have the same +?S: name. Usual values are "cc", "Mcc", "cc -M", and "gcc". +?S:. +: see if we need a special compiler +echo " " +if usg; then + case "$cc" in + '') case "$Mcc" in + /*) dflt='Mcc';; + *) case "$large" in + -M*) dflt='cc';; + *) if $contains '\-M' $sysman/cc.1 >/dev/null 2>&1 ; then + if $contains '\-M' $sysman/cpp.1 >/dev/null 2>&1; then + dflt='cc' + else + dflt='cc -M' + fi + else + dflt='cc' + fi;; + esac;; + esac;; + *) dflt="$cc";; + esac + $cat <<'EOM' +On some systems the default C compiler will not resolve multiple global +references that happen to have the same name. On some such systems the "Mcc" +command may be used to force these to be resolved. On other systems a "cc -M" +command is required. (Note that the -M flag on other systems indicates a +memory model to use!) If you have the Gnu C compiler, you might wish to use +that instead. + +EOM + rp="What command will force resolution on this system?" + . myread + cc="$ans" +else + case "$cc" in + '') dflt=cc;; + *) dflt="$cc";; + esac + rp="Use which C compiler?" + . myread + cc="$ans" +fi +case "$cc" in +gcc*) cpp=`loc gcc-cpp $cpp $pth`;; +esac + diff --git a/mcon/files/type.U b/mcon/files/type.U new file mode 100644 index 0000000..583b29a --- /dev/null +++ b/mcon/files/type.U @@ -0,0 +1,47 @@ +?RCS: $Id$ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic Licence, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic Licence; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: type.U,v $ +?RCS: Revision 3.0 1993/08/18 12:10:11 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:uidtype: Myread Oldconfig contains usrinc +?MAKE: -pick add $@ %< +?S:uidtype: +?S: This variable defines UIDTYPE to be something like uid_t, int, +?S: ushort, or whatever type is used to declare user ids in the kernel. +?S:. +?C:Uid_t (UIDTYPE): +?C: This symbol holds the type used to declare user ids in the kernel. +?C: It can be int, ushort, uid_t, etc... It may be necessary to include +?C: to get any typedef'ed information. +?C:. +?H:#define Uid_t $uidtype /* UID type */ +?H:. +: see what type uids are declared as in the kernel +case "$uidtype" in +'') + if $contains 'uid_t;' $usrinc/sys/types.h >/dev/null 2>&1 ; then + dflt='uid_t'; + else + set `grep '_ruid;' $usrinc/sys/user.h 2>/dev/null` unsigned short + case $1 in + unsigned) dflt="$1 $2" ;; + *) dflt="$1" ;; + esac + fi + ;; +*) dflt="$uidtype";; +esac +echo " " +rp="What type are user ids on this system declared as?" +. myread +uidtype="$ans" + diff --git a/mcon/makegloss.SH b/mcon/makegloss.SH new file mode 100755 index 0000000..991a214 --- /dev/null +++ b/mcon/makegloss.SH @@ -0,0 +1,217 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting mcon/makegloss (with variable substitutions)" +$spitshell >makegloss <>makegloss <<'!NO!SUBS!' +# $Id$ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# Original Author: Larry Wall +# +# $Log: makegloss.SH,v $ +# Revision 3.0.1.3 1994/01/24 14:17:49 ram +# patch16: now understands internal-use only defined variables +# +# Revision 3.0.1.2 1993/10/16 13:50:39 ram +# patch12: updated to support new ?M: lines +# +# Revision 3.0.1.1 1993/08/19 06:42:21 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:12 ram +# Baseline for dist 3.0 netwide release. +# + +open(G,">Glossary") || die "Can't create Glossary.\n"; +print G +'[This Glossary is automatically generated from the Unit files. Do not edit +this file or your changes will be lost. Edit the appropriate Unit instead.] + +This file contains a listing of all the C preprocessor symbols and shell +variables whose value can be determined by a Configure script. For the +most part, any symbol in UPPERCASE is a C preprocessor symbol, and +will be defined in config.h. Symbols in lowercase are shell variables, +and are defined in config.sh. + +If you write your shell scripts and C programs in terms of these symbols, +metaconfig can automatically build you a Configure script that will determine +the value of those symbols. See the README file for a description of how +to use metaconfig. + +In the following listing, the Unit: line indicates the name of the unit +where this symbol is defined, and the Wants: line indicates what other +symbols must be determined in order to figure out the value of this one. +If there is an "(Also defines ...)" entry, it indicates what other symbols +are defined by the Unit other than the one corresponding to the unit name. + +Variable of the form d_* either have the value "define" or "/*define", and +control whether some C preprocessor symbol gets defined or not. + +'; + +@ARGV = ; +while (<>) { + if (/^\?[\w\-]+:/) { # We may have found a control line + # Long lines may be escaped with a final backslash + $_ .= &complete_line if s/\\\s*$//; + } + if (/^\?MAKE:.*:/) { + ($also, $wants) = /^\?MAKE:\s*(.*):\s*(.*)/; + ($unit = $ARGV) =~ s|.*/(.*)\.U$|$1|; + @Also = split(/ /, $also); + $also = ''; + $internal = ''; + foreach (@Also) { + if (s/^\+//) { + $internal .= "$_ "; + } else { + $also .= "$_ "; + } + } + $also =~ s/$unit\s//; + chop($also); + chop($internal); + @Wants = split(/ /, $wants); + $wants = ''; + $option = ''; + foreach (@Wants) { + if (s/^\+//) { + $option .= "$_ "; + } else { + $wants .= "$_ "; + } + } + chop($option); + chop($wants); + $head = ''; + $_ = "Unit: $unit"; + $_ .= " (Also defines $also)" if $also; + $_ .= " (With private $internal)" if $internal; + $head .= &format($_); + if ($wants) { + $_ = "Wants: $wants"; + $head .= &format($_); + } + if ($option) { + $_ = "Optional: $option"; + $head .= &format($_); + } + $head .= "\n"; + } + + # Example of expression matched by the following pattern: + # ?C:symbol ~ alias (obsolete list): + # The main symbol (optionally aliased) can be followed by a list of + # obsolete symbols (the list is space separated). + + if (/^\?[CS]:(\w+)(\s*~\s*\S+)?\s*(\(.*\))?:\s*$/) { + $sym = $1; + $obsoleted = $3; + push(@syms, $sym); + $header{$sym} .= $head; + if ($obsoleted =~ s/^\((.*)\)$/$1/) { + @obsoleted = split(' ', $obsoleted); + foreach $obs (@obsoleted) { + push(@syms, $obs); + $header{$obs} = "\tObsoleted by $sym.\n\n"; + } + } + } + elsif (s/^\?[CS]://) { # Must be inside definition + if (/^\.$/) { # Closing line + $def{$sym} .= "\n"; + $sym = ''; + } + else { + s/^(\t| ? ? ? ? ? ? ?)//; + $def{$sym} .= "\t" . $_; + } + } + elsif (/^\?M:(\w+):\s*([\w\s]*)\n$/) { # Magic mapping introduction + $sym = $1; + $cdep = $2; + push(@syms, $sym); + $cdep =~ s/^\s*//; + $cdep = ", needs: $cdep" if $cdep ne ''; + $header{$sym} = "\tMagic symbol$cdep\n" . $head; + } + elsif (s/^\?M://) { # Must be a magic mapping definition + if (/^\.$/) { # Closing line + $def{$sym} .= "\n"; + $sym = ''; + } else { + $def{$sym} .= "\t" . $_; + } + } +} + +foreach $sym (sort @syms) { + print G "$sym:\n"; + print G $header{$sym}; + print G $def{$sym}; +} +close G; + +# Format $_ to fit in 80 columns (70 + size of tabs) +# Long lines are split, and the all but the first are indented +# by two leading spaces. The whole thing is then indented by +# one tab. +sub format { + local($tmp); + local($head) = ''; + local($_) = shift(@_); + while (length($_) > 70) { + $tmp = substr($_,0,70); + $tmp =~ s/^(.*) .*/$1/; + $head .= "\t$tmp\n"; + $_ = ' ' . substr($_,length($tmp),9999); + } + $head .= "\t$_\n"; +} + +# The first line was escaped with a final \ character. Every following line +# is to be appended to it (until we found a real \n not escaped). Note that +# the leading spaces of the continuation line are removed, so any space should +# be added before the former \ if needed. +sub complete_line { + local($_); + local($read) = ''; # Concatenation of all the continuation lines found + while (<>) { + s/^\s+//; # Remove leading spaces + if (s/\\\s*$//) { # Still followed by a continuation line + $read .= $_; + } else { # We've reached the end of the continuation + return $read . $_; + } + } +} + +!NO!SUBS! +chmod 755 makegloss +$eunicefix makegloss diff --git a/mcon/man/Jmakefile b/mcon/man/Jmakefile new file mode 100644 index 0000000..737f8c9 --- /dev/null +++ b/mcon/man/Jmakefile @@ -0,0 +1,24 @@ +/* + * Jmakefile for metaconfig manual pages + */ + +;# $Id: Jmakefile,v 3.0 1993/08/18 12:10:13 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0 1993/08/18 12:10:13 ram +;# Baseline for dist 3.0 netwide release. +;# + +>L /* I expect to fix this with a |append command */ + +MPAGES = metaconfig.$(L) metalint.$(L) metaxref.$(L) + +ComplexShellManualTarget($(MPAGES)) diff --git a/mcon/man/Makefile.SH b/mcon/man/Makefile.SH new file mode 100755 index 0000000..f146784 --- /dev/null +++ b/mcon/man/Makefile.SH @@ -0,0 +1,167 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL44] +: $X-Id: Jmake.tmpl,v 3.0.1.1 1993/08/20 07:36:36 ram Exp ram $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=mcon/man +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.1 1994/10/29 15:46:30 ram Exp ram $ + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0 1993/08/18 12:10:13 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0 1993/08/18 12:10:13 ram +# Baseline for dist 3.0 netwide release. +# + +MPAGES = metaconfig.$(L) metalint.$(L) metaxref.$(L) + +all:: $(MPAGES) + +local_realclean:: + $(RM) $(MPAGES) + +install.man:: + @if test "$(MANSRC)"; then \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for file in $(MPAGES); do \ + (set -x; $(INSTALL) -c -m 444 $$file $(MANSRC)); \ + done; \ + else exit 0; fi + +deinstall.man:: + @if test "$(MANSRC)"; then \ + case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for file in $(MPAGES); do \ + (set -x; $(RM) $(MANSRC)/$$file); \ + done; \ + else exit 0; fi + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +install:: + @echo "install in $(CURRENT) done." + +deinstall:: + @echo "deinstall in $(CURRENT) done." + +install.man:: + @echo "install.man in $(CURRENT) done." + +deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/mcon/man/mconfig.SH b/mcon/man/mconfig.SH new file mode 100755 index 0000000..059091b --- /dev/null +++ b/mcon/man/mconfig.SH @@ -0,0 +1,2103 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting mcon/man/metaconfig.$manext (with variable substitutions)" +$rm -f metaconfig.$manext +$spitshell >metaconfig.$manext < macro substitution +''' +''' Revision 3.0.1.5 1993/10/16 13:51:50 ram +''' patch12: new option -M to activate ?M: lines +''' patch12: documents new ?M: lines format +''' patch12: new internal Makefile command cm_h_weed for ?M: support +''' patch12: documents usage for new confmagic.h file +''' +''' Revision 3.0.1.4 1993/09/09 11:50:35 ram +''' patch9: lots of typo fixes and abusive variable substitution problems +''' +''' Revision 3.0.1.3 1993/08/30 08:53:51 ram +''' patch8: wrongly stated that patchlevel.h should not be part of MANIFEST.new +''' +''' Revision 3.0.1.2 1993/08/24 12:13:32 ram +''' patch3: typo fixes +''' +''' Revision 3.0.1.1 1993/08/19 06:42:23 ram +''' patch1: leading config.sh searching was not aborting properly +''' +''' Revision 3.0 1993/08/18 12:10:14 ram +''' Baseline for dist 3.0 netwide release. +''' +''' +.de Ex \" Start of Example +.sp +.in +5 +.nf +.. +.de Ef \" End of Example +.sp +.in -5 +.fi +.. +.SH NAME +metaconfig \- a Configure script generator +.SH SYNOPSIS +.B metaconfig +[ \-\fBdhkmostvwGMV\fR ] +[ \-\fBL \fIdir\fR ] +.SH DESCRIPTION +.I Metaconfig +is a program that generates Configure scripts. If you don't know what a +Configure script is, please skip to the \fBTUTORIAL\fR section of this +manual page. If you want a full (formal) description of the way to +use \fImetaconfig\fR and its units, please look at the \fBREFERENCE\fR +section. The following is a quick introduction and reference for +knowledgeable users. +.PP +.B Metaconfig +operates from set of +.I units +which define everything that metaconfig knows about portability. +Each unit is self-contained, and does not have to be registered anywhere +other than by inclusion in either the public U directory or your private +U directory. +If the dist package (of which metaconfig is a part) is installed in LIB, +then the public U directory is LIB/dist/mcon/U. On this machine, the +LIB directory is $privlibexp. +Your private U directory, if you have one, +is in the top level directory of your package. +Before you can run \fImetaconfig\fR you must do a several things: +.IP \(bu 5 +Create a .package file in the package's top level directory by running +\fIpackinit\fR. +This program will ask you about your package and remember what you tell +it so that all the dist programs can be smart. +.IP \(bu +Consult the Glossary (in LIB/dist/mcon) and write your shell scripts and +C programs in terms of the symbols that metaconfig knows how to define. +You don't need to tell metaconfig which symbols you used, since metaconfig +will figure that out for you. +.IP \(bu +Generate any .SH scripts needed to write Makefiles or shell scripts that +will depend on values defined by Configure. +There is a program called \fImakeSH\fR that will help you convert a plain +script into a script.SH template; some editing will still need to be performed +on the resulting .SH file to move the variable configuration part in the +top part of the script (see inline comments generated by \fImakeSH\fR within +your .SH file). +.IP \(bu +Create a MANIFEST.new file in your top level directory that lists all the +files in your package. This file will remain private and will not be +part of the final distribution. +The filename should be the first field on each line. +After some whitespace you can add a short comment describing your file. +Only source files should be listed in there. The special file +\fIpatchlevel.h\fR (which is handled and maintained by the patching tools -- +see \fIpat\fR(1)) should be part of the MANIFEST.new file, but may be +silently ignored by some tools. As a rule of +thumb, only files maintained by RCS should be listed in there, +the \fIpatchlevel.h\fR file being one important exception. +.IP \(bu +Optionally, you may wish to create a MANIFEST file, which will be an +exported version of your MANIFEST.new. That file must be made part of +the release, i.e. listed in both your MANIFEST.new and MANIFEST itself. +One of the \fImetaconfig\fR units knows about this file and will force +Configure to perform a release check, ensuring all the files listed +there are part of the distribution. The MANIFEST and MANIFEST.new +files should be distinct, not links. +.IP \(bu +Copy any .U files that you want to modify to your private U directory. +Any .U files in your private U directory will be used in preference to +the one in the public U directory. +For example, one way to force inclusion of any unit is to copy the End.U +file to your .U directory and add the name of the unit you want as +a dependency on the end of the ?MAKE: line. +Certain units can ONLY be forced in this way, namely those of the form +Warn_*.U and Chk_*.U. +You can also customize certain default Configure variables by copying +Myinit.U to your package's private U directory and setting the variables in +that unit. +.PP +Now you are ready to run \fImetaconfig\fR. That will create a \fIConfigure\fR +file, and optionally a \fIconfig_h.SH\fR file (if your sources make any use +of C symbols). +The generated files will automatically be added to your MANIFEST.new +if necessary. Do not forget to update your MANIFEST file though. +.PP +In order to create new units, do the following: +.IP \(bu 5 +Copy a similar unit to a new .U file. +The name you choose should be the name of a variable generated by the unit, +although this is only a convenience for you, not a requirement. +It should be 12 or less characters to prevent filename chopping. +Actually, it should probably be 10 or less so that those who want to use RCS +can have a .U,v on the end without chopping. +Metaconfig uses the case of the first letter to determine if any variable is +actually produced by this unit, so don't Capitalize your unit +name if it is supposed to produce a shell variable. +.IP \(bu +Edit the new .U file to do what you want. +The first ?MAKE: line indicates the dependencies; before the final list +colon all the variables this unit defines, and after the final colon +all the variables (or other units) on which this unit depends. +It is very important that these lists be accurate. If a dependency is +optional and a default value can be used, you should prefix the dependency +with a '+' sign. The corresponding unit will not be loaded to compute the +symbol, unless really required by another unit. +.IP \(bu +To the extent possible, parameterize your unit based on shell +variable defined on ?INIT: lines. +This will move the variable definitions up to the Init.U unit, +where they can be overridden by definitions in Myinit.U, which is +included after Init.U. +.IP \(bu +Add the definition of any C symbols desired as ?H: lines. +A line beginning with ?H:?%<: in the .U file will be added to the eventual +config.h file if and only if metaconfig decides that this unit is needed. +The %< stands for the unit's name, which happens to be the name of +the file too (without .U) if you followed the convention. +Always put a comment on each ?H: line in case one of the variable +substitutions earlier on the line starts a comment without finishing it. +Any shell variable starting with d_ may do this, so beware. +If you ommit the ?%<:, then metaconfig will try to intuit the symbol whose +definition is needed prior any inclusion in config.h. +.IP \(bu +Add glossary definitions as ?S: lines for shell variables and ?C: +lines for C preprocessor variables. +See a current unit for examples. +It is VERY important to start each entry with a left justified symbol +name, and end each entry with a ?C:. or ?S:. line. The algorithm +that translates C preprocessor symbol entries for the Glossary into +comments for config.h depends on this. +.IP \(bu +Make sure the order of all your ? lines is right. The correct order is: +.sp +.RS +10 +.PD 0 +.TP 15 +?RCS: and ?X: +basically just comments +.TP +?MAKE: +metaconfig dependencies +.TP +?Y: +unit layout directive +.TP +?S: +glossary shell definitions +.TP +?C: +glossary C definitions +.TP +?H: +config.h definitions +.TP +?M: +confmagic.h definitions +.TP +?W: +wanted symbols +.TP +?V: +visible symbols +.TP +?F: +files created by this unit +.TP +?T: +temporary shell symbols used +.TP +?D: +optional dependencies default value +.TP +?O: +used to mark obsolete units +.TP +?LINT: +metalint hints +.TP +?INIT: +shell symbols initializations +.PD +.RE +.PP +Here is an example to show the ordering of the lines and the various +formats allowed: +.Ex +?RCS: \$RCS-Id\$ +?RCS: Copyright information +?RCS: \$RCS-Log\$ +?X: +?X: A contrived example +?X: +?MAKE:d_one two: three +four Five +?MAKE: -pick add \$@ %< +?Y:DEFAULT +?S:d_one: +?S: First shell symbol, conditionally defines ONE. +?S:. +?S:two: +?S: Second shell symbol, value for TWO. +?S:. +?C:ONE: +?C: First C symbol. +?C:. +?C:TWO: +?C: Second C symbol. +?C:. +?H:#\$d_one ONE /**/ +?H:#define TWO "\$two" +?H:#\$d_one ONE_TWO "\$two" +?H:. +?M:flip: HAS_FLIP +?M:#ifndef HAS_FLIP +?M:#define flip(x) flop(x) +?M:#endif +?M:. +?W:%<:one_two +?V:p_one p_two:p_three +?F:file ./ftest !tmp +?T:tmp var +?D:two='undef' +?LINT:change three +?INIT:two_init='2' +: shell code implementing the unit follows +p_one='one' +p_two='two' +p_three="$three" +.Ef +Let me state it one more time: the above unit definition is a \fIfake\fR +one to only show the different possibilities. Such a unit would serve +little purpose anyway... Some more advanced features are not described +here. Please refer to the \fBREFERENCE\fR section for more complete +information. +.IP \(bu +Put the unit into the public or private U directory as appropriate. +.IP \(bu +Rerun \fImetaconfig\fR. +.IP \(bu +Send your unit to ram@acri.fr (Raphael Manfredi) for inclusion +in the master copy, if you think it's of general interest. +.PP +In order to add a new program to be located: +.IP \(bu +Edit Loc.U, and add the name of the program both to the ?MAKE: line +(between the two colons) and to either loclist or trylist (depending +on whether the program is mandatory or not). +.IP \(bu +Rerun metaconfig. +.IP \(bu +Send your unit to me for inclusion in the master copy, if you think it's +of general interest. +.PP +Notes for writing .U files: +.IP * 5 +Always use "rm -f" because there are systems where rm is interactive by +default. +.IP * +Do not use "set -- ..." because '--' does not work with every shell. Use +"set x ...; shift". +.IP * +Do not use "unset ENV" since unset is not fully portable. Say "ENV=''" +instead. +.IP * +Always use echo " " (with a space) because of Eunice systems. +.IP * +Only use \fBtest\fR with \-r, \-w, \-f or \-d since those are the only +portable switches. In particular, avoid "test -x". +.IP * +Use only programs that came with V7, so that you know everyone has them. +.IP * +Use \$\&contains when you want to grep conditionally, since not all +greps return a reasonable status. +Be sure to redirect the output to /dev/null, by using '>/dev/null 2>&1'. +.IP * +Use "if test" rather than "if [...]" since not every sh knows the +latter construct. +.IP * +Use the myread script for inputs so that they can do shell escapes +and default evaluation. The general form is +.Ex +case "\$grimble" in +\&'') dflt=452;; +*) dflt="\$grimble";; +esac +rp='How many grimbles do you have?' +\&. ./myread +grimble="\$ans" +.Ef +.IP * +Use the getfile script when asking for a file pathname in order to +have optional ~name expansion and sanity checks. See the Getfile.U +unit for a full decription. +.IP * +Always put a +.Ex + \$startsh +.Ef +at the top of every generated script that is going to be launched +or sourced by \fIConfigure\fR. +.IP * +Never assume common UNIX-isms like the fact that an object file ends +with a \fI.o\fR and that a library name ends with \fI.a\fR. +Use the \fI\$_o\fR and \fI\$_a\fR variables instead (see Unix.U). +.IP * +When doing a compile-link-execute test, always write it like this: +.Ex +\$\&cc \$\&ccflags \$\&ldflags try.c -o try \$\&libs +.Ef +because some systems require that linking flags be specified before +the compiled target (with the exception of trailing linking libraries). +.IP * +Issue important messages on file descriptor #4, by using '>&4' to redirect +output. Only those messages will appear when the \fB\-s\fR switch is +given to \fIConfigure\fR on the command line (silent mode). +.IP * +Always try to determine whether a feature is present in the most +specific way--don't say "if bsd" when you can grep libc. There +are many hybrid systems out there, and each feature should stand +or fall by itself. +.IP * +Always try to determine whether a feature is present in the most +general way, so that other packages can use your unit. +.IP * +When in doubt, set a default and ask. Don't assume anything. +.IP * +If you think the user is wrong, allow for the fact that he may be right. +For instance, he could be running Configure on a different system than +he is going to use the final product on. +.PP +Metaconfig reserves the following names in your directory, and if you use such +a name it may get clobbered or have other unforeseen effects: +.Ex +.MT/* +Configure +Wanted +Obsolete +configure +config_h.SH +confmagic.h +U/* +MANIFEST.new +.Ef +Additionally, Configure may clobber these names in the directory it is run in: +.Ex +UU/* +config.sh +config.h +.Ef +''' +''' O p t i o n s +''' +.SH OPTIONS +The following options are recognized by \fImetaconfig\fR: +.TP 15 +.B \-d +Turn on debug mode. Not really useful unless you are debugging \fImetaconfig\fR +itself. +.TP +.B \-h +Print help message and exit. +.TP +.B \-k +Keep temporary directory, so that you may examine the working files used +by \fImetaconfig\fR to build your \fIConfigure\fR script. Useful only when +debugging the units. +.TP +.B \-m +Assume lots of memory and swap space. This will speed up symbol lookup in +source files by a significant amount of time, at the expense of memory +consumption... +.TP +.B \-o +Map obsolete symbols on new ones. Use this switch if you still have some +obsolete symbols in your source code and do not want (or cannot) remove +them for now. The obsolete symbols are otherwise ignored, although that +will give you a warning from \fImetaconfig\fR. +.TP +.B \-s +Turn silent mode on. +.TP +.B \-t +Trace symbols as they are found. +.TP +.B \-v +Turn verbose mode on. +.TP +.B \-w +Assume Wanted file is up-to-date. This will skip the time and memory +consuming phase of source code scanning, looking for known symbols. +Use it only when you know your source file have not changed with respect +to the pool of \fImetaconfig\fR symbols used. +.TP +.B \-G +Also provide a GNU \fIconfigure\fR-like front end to the generated +.I Configure +script, to be included in the distribution as well. This is only +a wrapper around the +.I Configure +script naturally, but it lets people familiar with the GNU tool to +not be lost when facing a new distribution. +.TP +\fB\-L\fI dir\fR +Override default library location. Normally only useful for metaconfig +maintainers to locally use the units being developped instead of the +publicly available ones. The \fIdir\fR specified is the one containing the +units \fIU\fR directory. +.TP +.B \-M +Allow production of a \fIconfmagic.h\fR file to automagically remap some +well-known symbols to some other alternative, like \fIbcopy\fR() being +remapped transparently to \fImemcpy()\fR when not available. This option +is turned on automatically when a \fIconfmagic.h\fR file exists in the +top-level directory. Simply remove that file if you wish to disable this +option permanently. +.TP +.B \-V +Print version number and exit. +''' +''' T u t o r i a l +''' +.SH TUTORIAL +This (long) section is an introduction to \fImetaconfig\fR, in which we will +learn all the basics. If you already know how to use \fImetaconfig\fR, you +may safely skip to the next section. +''' +.SS Overview +.PP +Usually when you want to get some source package to compile on a given +platform you have to edit the main Makefile (assuming there is one!), +choose a C compiler, make sure you have the proper libraries, and then +fire the \fImake\fR command. If the package is reasonably well written, it +will compile (without a warning being an option :-). In itself, the last +sentence is a real performance, since given the variety of UNIX platforms +available today and the diversity of flavours, that means the author of the +package has gone into deep trouble to figure out the right choices given +some standard trial, guessing and messing around with system includes and +types. +.PP +However, despite all his talent, the author cannot possibly know that +some system has a broken system call, or that some sytem structure lacks +one otherwise standard field, or simply wheter a given include file exists +or not. And I'm not considering the implicit assumptions, like the type +returned by the \fImalloc()\fR function or the presence of the \fIrename()\fR +system call to name a few. But that knowledge is necessary to achieve real +portability. +.PP +Now let's not abuse ourselves. Using that information requires greater +skills, yet it can lead to more portable programs since it is then +written in a system-independant fashion and relies only on the fact that +some assumption is true or false on a particular system, each assumption +being unrelated with each other. That is to say, we do not say: We're on +a BSD system or we are on a USG system. That's too fuzzy anyway nowadays. +No, we want to say to the source code: this system does not have the +.I rename() +system call and \fImalloc()\fR returns a \fI(void *)\fR +value. +.PP +Metaconfig is a tool that will let you do just that, with the additional +benefit of not having to hand-edit the Makefile if all goes well. By +running \fImetaconfig\fR, you create a shell script named \fIConfigure\fR. +Lots of efforts have been devoted to the Configure script internals to ensure +it will run on 99% of the existing shells available as of this writing. +Configure will probe the target system, asking questions when in doubt and +gather all the answers in one single shell file, which in turn can be used +to automatically generate configured Makefiles and C include files. +.PP +There is only a limited (but quite large) set of symbols available for your +shell scripts and C programs. They are all documented in the Glossary file. +All you need to do is learn about them and start using them to address +portability and configuration problems. Then, by running \fImetaconfig\fR, +a suitable Configure script will be generated for your package. +.PP +The Configure script is built out several units (more than 300), each +unit being responsible for defining a small number of shell and/or C +symbols. Units are assembled together at the final stage, honoring +the dependency graph (one unit may need the result of several other +units which are then placed before in the script). +''' +.SS Symbols +.PP +Symbols are the most important thing in the \fImetaconfig\fR world. They +are the smallest recognized entity, usually a word, and can be granted +a value at the end of the Configure execution. For instance, the C +pre-processor symbol \fIHAS_RENAME\fR is a \fImetaconfig\fR symbol that is +guranteed to be defined if, and only if, the \fIrename()\fR system call +is present. Likewise, the \fI\$\&ranlib\fR shell variable will be set to +either ':' or 'ranlib' depending on whether the call to the \fIranlib\fR +program is needed to order a library file. How this works is not important +for now, what is important is to understand that those symbols are given +a \fIlife\fR (i.e. a value) upon \fIConfigure\fR execution. +.PP +Using symbols is relatively straightforward. In a C source file, you simply +use the symbol value, as a pre-processor directive (for instance an: \fI#ifdef +HAS_RENAME\fR) or, if the symbol value is a string, directly as you would use +a macro in C. And in a shell file or a Makefile, you may reference a shell +symbol directly. +.PP +Actually, I'm lying, because that's not completely as magic as the previous +paragraph could sound. In a C file, you need to include the Configure-produced +\fIconfig.h\fR file, and you must wrap your shell script or Makefile in a .SH +file and you may reference the shell symbol only in the variable +substitution part of that .SH file. More on this later. +''' +.SS Source Files +.PP +Symbols may only appear in a limited set of source files, because +\fImetaconfig\fR will only scan those when looking for known symbols, trying +to figure out which units it will need. You may use C symbols in C source +files, i.e. files with a \fI.c\fR, \fI.h\fR, \fI.y\fR or \fI.l\fR extension, +and shell symbols are looked for only in .SH files. +.PP +In order to get the value of a symbol, a C file needs to include the special +\fIconfig.h\fR file, which is produced by \fIConfigure\fR when C symbols +are present. And .SH files are run through a shell, producing a new file. +However, in the top section of the .SH file, the special \fIconfig.sh\fR +file (also produced by running \fIConfigure\fR) is sourced, and variable +substitutions apply. Actually, \fIconfig.h\fR is produced by running the +\fImetaconfig\fR-produced \fIconfig_h.SH\fR file, again using variable +substitution. So we're going to look at that a little more closely since +this is the heart of the whole \fIconfiguration\fR scheme... +''' +.SS Variable Substitution +.PP +There is shell construct called \fIhere document\fR which enables a +command to take an input specified within the script itself. That +input is interpreted by the shell as a double-quoted string or a +single quoted string depending on the form of the here document +specification. +.PP +To specify a here document, the '<<' token is used, followed by a single +identifier. From then on, the remaining script lines form the input for +the command, until the here document is found on a line by itself. +Shell substitution (including shell variable substitutions) is done +unless the identifier is surrounded by single quotes. For instance: +.Ex +var='first' +tar='second' +echo "--> first here document:" +cat < second here document:" +cat <<'EOM' +echo \$var +echo \$\&tar +EOM +echo "--> end." +.Ef +will produce, when run through a shell: +.Ex +--> first here document: +var='first' +tar='second' +--> second here document: +echo \$var +echo \$\&tar +--> end. +.Ef +The first here document has its content interpreted whilst the second +one is output as-is. Both are useful in a .SH script, as we are about to see. +''' +.SS Using .SH Scripts +.PP +A .SH script is usually produced by running the \fIMakeSH\fR script other +an existing file, transforming \fIfile\fR into a \fIfile.SH\fR. Let's take +a single example. Here is a little script (let's call it \fIintsize\fR) +which prints a single message, the size of the \fBint\fR datatype in C. +Unfortunately, it has the value hardwired in it, thusly: +.Ex +#!/bin/sh +intsize='4' +echo "On this machine, the int type is \$\&intsize bytes" +.Ef +Let's run \fImakeSH\fR on it by typing '\fImakeSH intsize\fR'. We get a single +\fIintsize.SH\fR file that looks like this: +.Ex +case \$CONFIG in +\&'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . \$TOP/config.sh + ;; +esac +: This forces SH files to create target in same directory as SH file. +: This is so that make depend always knows where to find SH derivatives. +case "\$0" in +*/*) cd \`expr X\$0 : 'X\\\\(.*\\\\)/'\` ;; +esac +echo "Extracting intsize (with variable substitutions)" +: This section of the file will have variable substitutions done on it. +: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!. +: Protect any dollar signs and backticks that you do not want interpreted +: by putting a backslash in front. You may delete these comments. +\$spitshell >intsize <>intsize <<'!NO!SUBS!' +intsize='4' +echo "On this machine, the int type is \$\&intsize bytes" +\&!NO!SUBS! +chmod 755 intsize +\$\&eunicefix intsize +.Ef +The first part of this script (in the \fIcase\fR statement) is trying to +locate the \fIconfig.sh\fR file, in order to source it. The \fI\$CONFIG\fR +variable is false by default, by true when \fIconfig.sh\fR has been sourced +already (which would be the case if this file was executed from within +\fIConfigure\fR itself, but let's not confuse the issue here). +.PP +Once the \fIconfig.sh\fR file has been sources, all the shell symbols +defined by \fIConfigure\fR are set. We know reach a second case statement, +used to change the current directory should a path be used to +reach this program (for instance if we said '\fIsh ../scripts/intsize.SH\fR', +we would first run '\fIcd ../scripts\fR' before continuing). If you do not +understand this, don't worry about it. +.PP +Here comes the intersting stuff. This script uses the \fI\$spitshell\fR +variable, and it's not something we know about...yet. If you look through +the Glossary file, you will see that this is a variable known by +\fImetaconfig\fR. If you make this file part of your distribution (by including +it in the MANIFEST.new file, we'll come back to that later on) and run +\fImetaconfig\fR, then the \fIConfigure\fR script will determine a suitable +value for this variable and it will be set in \fIconfig.sh\fR. Same goes for +\fI\$startsh\fR and the mysterious \fI\$\&eunicefix\fR at the end. On a +reasonable system, the relevant part of \fIconfig.sh\fR would look like this: +.Ex +spitshell='cat' +startsh='#!/bin/sh' +eunicefix=':' +.Ef +Ah! We're getting there. Now it looks familiar. We're facing a single +\fIcat\fR command whose input comes from a variable-interpolated here +document and whose output is redirected to \fIintsize\fR. The value +will be that of \fI\$startsh\fR, i.e. '#!/bin/sh'. Fine so far. +.PP +Then we reach the second here document expansion, to get the remaining of +the script. This time, the here document symbol is surrounded by single +quotes so the contents will be appended verbatim to the \fIintsize\fR file. +So, by running '\fIsh intsize.SH\fR', we get the following output: +.Ex +Extracting intsize (with variable substitutions) +.Ef +and by looking at the produced intsize file, we see: +.Ex +#!/bin/sh +intsize='4' +echo "On this machine, the int type is \$\&intsize bytes" +.Ef +which is exactly what we had at the beginning. So far, it's a no-operation +procedure... But, how marvelous! It so happens (pure coincidence, trust me!), +that \fImetaconfig\fR knows about the \fI$\&intsize\fR shell symbol. By moving +the initialization of intsize to the variable-interpolated area of the .SH +script and initializing it with the \fIConfigure\fR-computed value, +and removing the now useless comments added by \fImakeSH\fR, we get: +.Ex +case \$CONFIG in +\&'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . \$TOP/config.sh + ;; +esac +case "\$0" in +*/*) cd \`expr X\$0 : 'X\\\\(.*\\\\)/'\` ;; +esac +echo "Extracting intsize (with variable substitutions)" +\$\&spitshell >intsize <>intsize <<'!NO!SUBS!' +echo "On this machine, the int type is \$\&intsize bytes" +\&!NO!SUBS! +chmod 755 intsize +\$\&eunicefix intsize +.Ef +Of course, running this script through a shell will again output the same +script. But if we run \fIConfigure\fR on a machine where an \fBint\fR is +stored as a 64 bits quantity, \fIconfig.sh\fR will set \fIintsize\fR to +8 and the \fIintsize\fR script will bear the right value and print: +.Ex +On this machine, the int type is 8 bytes +.Ef +which is correct. Congratulations! We have just configured a shell script!! +''' +.SS Producing config.h +.PP +We can now have a look at the way \fIconfig.h\fR is produced out of +\fIconfig_h.SH\fR. We know that running \fIConfigure\fR produces a +\fIconfig.sh\fR script (how exactly this is done is not strictly +relevant here, but for the curious, it's another here document +substitution within \fIConfigure\fR itself). The \fIconfig_h.SH\fR +itself is built by \fImetaconfig\fR at the same time \fIConfigure\fR +is, provided you make use of at least one C symbol within your sources. +.PP +Let's have a look at some random \fIconfig_h.SH\fR file to see what +really happens: +.Ex +case \$CONFIG in +\&'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . \$TOP/config.sh + ;; +esac +case "\$0" in +*/*) cd \`expr X\$0 : 'X\\\\(.*\\\\)/'\` ;; +esac +echo "Extracting config.h (with variable substitutions)" +sed <config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!' +/* + * This file was produced by running the config_h.SH script, which + * gets its values from config.sh, which is generally produced by + * running Configure. + * + * Feel free to modify any of this as the need arises. Note, however, + * that running config.h.SH again will wipe out any changes you've made. + * For a more permanent change edit config.sh and rerun config.h.SH. + */ + +/* Configuration time: \$\&cf_time + * Configured by: \$\&cf_by + * Target system: \$\&myuname + */ + +#ifndef _config_h_ +#define _config_h_ + +/* bcopy: + * This symbol is maped to memcpy if the bcopy() routine is not + * available to copy strings. + */ +/* HAS_BCOPY: + * This symbol is defined if the bcopy() routine is available to + * copy blocks of memory. You should not use this symbol under + * normal circumstances and use bcopy() directly instead, which + * will get mapped to memcpy() if bcopy is not available. + */ +#\$\&d_bcopy HAS_BCOPY /**/ +#ifndef HAS_BCOPY +#ifdef bcopy +#un-def bcopy +#endif +#define bcopy(s,d,l) memcpy((d),(s),(l)) /* mapped to memcpy */ +#endif + +/* HAS_DUP2: + * This symbol, if defined, indicates that the dup2 routine is + * available to duplicate file descriptors. + */ +#\$\&d_dup2 HAS_DUP2 /**/ + +/* I_STRING: + * This symbol, if defined, indicates to the C program that it should + * include (USG systems) instead of (BSD systems). + */ +#\$\&i_string I_STRING /**/ + +#endif +\&!GROK!THIS! +.Ef +At the top of the file, we recognize the standard .SH construct that we +have already studied in detail. Next comes the extraction of the file +itself, via a here document with variable substitutions. However, here +we do not use a plain \fIcat\fR but a \fIsed\fR instead, since we need +to do some further editing on-the-fly. We'll see why later on, so let's +forget about it right now. +.PP +We now reach the leading comment, and the file is tagged with the +configuration time, the target system, etc... (those variables coming +from the sourced \fIconfig.sh\fR file have been set up by \fIConfigure\fR). +That comment header is followed by a '#ifndef' protection to guard against +multiple inclusions of this file. Then comes the heart of the file... +.PP +It helps to know that \fI\$d_*\fR and \fI\$i_*\fR variables are set to +either '\fIdefine\fR' or '\fIundef\fR' by \fIConfigure\fR, depending on +wether a function or an include file is present on the system or not. +That means the: +.Ex +#\$\&d_bcopy HAS_BCOPY /**/ +.Ef +line will be expanded to either: +.Ex +#define HAS_BCOPY /**/ +.Ef +if the \$\&d_bcopy variable is set to 'define' or: +.Ex +#undef HAS_BCOPY /**/ +.Ef +if \$\&d_bcopy was set to 'undef', because the feature was not there. However, +that's not what gets written in the \fIconfig.h\fR file because of the +\fIsed\fR filter we have already seen, which will transform the second form +into: +.Ex +/*#define HAS_BCOPY /**/ +.Ef +That's a handy form for later editing of \fIconfig.h\fR because you only need +to remove the leading '/*' if you want to override \fIConfigure\fR's choice. +Likewise, you may add a single '/*' at the beginning of a '#define' line +to avoid the definition of a particular symbol. This is why each symbol +definition is protected by a trailing '/**/', to close the leading +comment opened by '/*' (comments are not nested in C). +.PP +Now transforming '#undef' into '/*#define' is nice, but if we want to actually +write a '#undef', we're stuck... unless we write it as '#un-def' and let +\fIsed\fR fix that to '#undef' while producing \fIconfig.h\fR, which is what +is actually done here. +.PP +The same kind of reasoning applies to those two lines: +.Ex +#\$\&d_dup2 HAS_DUP2 /**/ +#\$\&i_string I_STRING /**/ +.Ef +and assuming \fIconfig.sh\fR defines: +.Ex +d_dup2='define' +i_string='undef' +.Ef +we'll get in the produced \fIconfig.h\fR: +.Ex +#define HAS_DUP2 /**/ +/*#define I_STRING /**/ +.Ef +Clear as running water? Good! +.PP +Now it should be obvious that by including \fIconfig.h\fR in all your +C source files, you get to know what \fIConfigure\fR has guessed on +your system. In effect, by using those symbols, you are writing +configured C code, since \fImetaconfig\fR will know that you need +those symbols and will generate a suitable \fIconfig_h.SH\fR file as +well as all the necessary code in \fIConfigure\fR to compute a +proper value for them (by assigning values to associated shell variables). +''' +.SS Running Metaconfig +.PP +Let's focus on the \fImetaconfig\fR program for a while to understand how +it uses its units and your source code to produce all the needed configuration +files. If you intend to write new units, you should have a good understanding +of the whole scheme. +.PP +Assuming your MANIFEST.new file is properly set and lists all the source +files you wish to configure, and that you have run \fIpackint\fR in your +root source directory to create a \fI.package\fR file, you may run +\fImetaconfig\fR and you'll get the following: +.Ex +\$ metaconfig +Locating units... +Extracting dependency lists from 312 units... +Extracting filenames (*.[chyl] and *.SH) from MANIFEST.new... +Building a Wanted file... +.in +2 +Scanning .[chyl] files for symbols... +Scanning .SH files for symbols... +.in -2 +Computing optimal dependency graph... +.in +2 +Building private make file... +Determining loadable units... +Updating make file... +.in -2 +Determining the correct order for the units... +Creating Configure... +Done. +.Ef +The first phase looks for all the units files (ending with .U) in the public +directory first, then in your private one. If you copy a public file in your +private U directory (i.e. a directory named U at the top level of your package), +it will override the public version. Once it has a list of all the available +units, it parses them and extracts all the ?MAKE: lines to know about the +dependencies and the known shell symbols. It also focuses on the ?H: lines to +learn about the C symbols and which shell symbols needs to be computed to get +a proper value for that C symbol (so we have another level of dependencies +here). +.PP +Next, the proper filenames are extracted from the MANIFEST.new files and a +\fIWanted\fR file is built: that file lists all the C symbols and the shell +symbols needed for that package. We first scan the C-type files for C symbols, +then propagate the dependencies to their associated shell symbols (gathered +from ?H: lines). Next .SH files are scanned and finally all the shell symbols +are known. +.PP +A temporary Makefile is built and metaconfig tries to \fImake\fR all the shell +symbols to see what commands (listed on the second ?MAKE: lines) are +executed, and thus which units are really needed. Optional units not otherwise +required are removed and a second Makefile is generated. This time, we know +about all the units and their respective orders, optional units having been +removed and default values computed for their shell symbols. The \fIConfigure\fR +script can then be generated, along with \fIconfig_h.SH\fR. We're done. +''' +.SS Conventions +.PP +Proper conventions needs to be followed to make the whole process sound. +There is a case convention for units and a variable naming convention. +.PP +All units should have their first letter lower-cased, unless they are +special units. By special, we mean they do not really define new +shell variables that can be used by the user in his .SH files, but rather +units producing scripts or shell variables that are to be used internally +by the \fIConfigure\fR script. Typical examples are the \fIInit.U\fR +file which is the main variable initialization, or \fIMyread.U\fR which +produces the \fImyread\fR script used almost everywhere in \fIConfigure\fR +when a question is to be asked to the user. +.PP +Non-special units then subdivise in two distinct groups: units defining +variables associated to a C symbol and units defining shell variables of +their own. The first group is further divided in variables related to +include files (their name begin with \fIi_\fR) and variables related to +other definitions (name starting with \fId_\fR). The second group have +names standing for itself, for instance \fIcc.U\fR defines the \fI\$\&cc\fR +shell variable whose value is the C compiler to be used. +.PP +Special units sometimes reserve themselves some pre-defined variable and +return "results" in other well-known variables. For instance, the \fImyread\fR +script produced by Myread.U expects the prompt in \fI\$rp\fR, the default +answer in \fI\$dflt\fR and places the user answer in \fI\$ans\fR. This is +not documented in this manual page: you have to go and look at the unit +itself to understand which variables are used and how the unit is to be +used. +''' +.SS Using The Glossary +.PP +The Glossary file is automatically produced by the \fImakegloss\fR script, +which extracts the information from ?S:, ?C: and ?MAKE: lines and reformats +them into an alphabetically sorted glossary. +It is important to read the Glossary to know about the symbols you are +allowed to use. However, the Glossary will not tell you how to use them. +Usually, that's up to you. +.PP +One day, you will probably write your own units and you will know enough +about \fImetaconfig\fR to do so quickly and efficiently. However, never +forget to properly document your work in the ?S: and ?C: lines, or other +people will not be able to reuse it. Remember about the time where you +had only the Glossary and this manual page to get started. +''' +.SS Conclusion +.PP +Now that you know the \fImetaconfig\fR basics, you should read the +\fIDESCRIPTION\fR section, then skip to the \fIREFERENCE\fR section +to learn about all the gory details such as the allowed syntax for +unit control lines (lines starting with a '?') or the distinct MAKE +commands you are allowed to use. +.SH REFERENCE +This section documents the internals of \fImetaconfig\fR, basically the +unit syntax, the special units you should know about and the hint files. +''' +.SS General Unit Syntax +.PP +A metaconfig unit is divided into two distinct parts. The header section +(lines starting with '?') and a shell section (code to be included in +the \fIConfigure\fR script). It is possible to add '?X:' comments anywhere +within the unit, but the other '?' lines (also called \fIcontrol lines\fR) +have a strict ordering policy. +.PP +If a control line is too long, it +is possible to use a continuation by escaping the final new-line with a +backslash and continuing on the next line (which should then be indented by +spaces or tabs). +.PP +The following is a formal description of each of the control lines. Unless +stated otherwise, the order of this presentation is the order to be used +within the unit. +.TP 5 +?RCS: \fIfree text\fR +To be used for RCS comments, at the top of the unit. +.TP +?X: \fIany text\fR +General purpose comments. May appear anywhere in the unit but must be left +justfied. For RCS comments, please use the ?RCS: comment form. +.TP +?MAKE:\fIsymbol list\fR: \fIdependency list\fR [\fI+optional\fR] +This is the first dependency line. The first \fIsymbol list\fR should list +all the symbols built by this unit (i.e. whose value is computed by the +shell section of the unit). Symbols should be space separated. If a defined +symbol is for internal use only and should not appear in the generated +\fIconfig.sh\fR file, then it should be preceded by a '+' (not to be confused +with optional dependencies defined hereafter). +The second part of the list (after the middle ':') is the unit dependency. +It should list all the needed special units, as well as all the symbols +used by the shell implementation. If a symbol is nedded but its configuration +value is not critical, it can be preceded by a '+', in which case it is +called a conditional dependency: its corresponding unit will be loaded if, +and only if, that symbol is otherwise really wanted; otherwise the default +value will be used. +.TP +?MAKE:\fItab\fR \fIcommand\fR +There can be one or more command lines following the initial dependency lines. +Those commands will be executed when the unit is wanted to load them into +\fIConfigure\fR. See the paragraph about make commands for more information. +Note that the leading \fItab\fR character is required before the \fIcommand\fR. +.TP +?Y:\fIlayout\fR +Declare a layout directive for this unit. That directive may be one of the +strings \fItop\fR, \fIdefault\fR or \fIbottom\fR (case does not matter, +recommended style is to spell them out uppercased). If omitted, \fIdefault\fR +is assumed. +.sp +This directive is only required if you wish to force a unit at the top or +the bottom of the generated \fIConfigure\fR script, as unit dependencies +permit it. Important questions may thus be forced at the beginning. Within +the same layout class, units are sorted alphabetically with two special +cases for d_* and i_* units, forced respectively at the top and bottom of +their classes (but these should belong to the default class). +.sp +It you force at the top a unit whose dependencies require all the other +unit to precede it, you achieve nothing interesting. Therefore, that directive +should really be used to increase the priority of some interactive units +that do not depend on many other user-visible symbols, like path-related +questions. +.TP +?S:\fIsymbol_name\fR [(\fIobsolete symbol list\fR)]: +Introduces a shell symbol. This first line names the symbol, optionally +followed by a list enclosed between parenthesis and giving the obsolete +equivalent. Those obsolete symbols will be remapped to the new +\fIsymbol_name\fR if the \fB\-o\fR option is given to \fImetaconfig\fR. +.TP +?S:\fIany text, for Glossary\fR +Basically a comment describing the shell symbol, which will be extracted +by \fImakegloss\fR into the Glossary file. +.TP +?S:. +Closes the shell symbol comment. +.TP +?C:\fIsymbol_name\fR [~ \fIalias\fR] [(\fIobsolete symbol list\fR)]: +Introduces a new C symbol. The \fIalias\fR name is the name under which +the C symbol will be controlled, i.e. if the \fIalias\fR symbol is wanted, +then that C symbol will be written in the \fIconfig_h.SH\fR file. Usually, +the alias is just '%<' (stands for the unit's name) and there is also +a ?W: line mapping a C symbol to the \fIalias\fR. Also the relevant parts +of the ?H: lines are explicitely protected by a '?%<' condition. See +the symbol aliasing paragraph for more details. +The remaining of the line is the optional \fIobsolete symbol list\fR, +which lists old equivalents for the new \fIsymbol_name\fR. +.TP +?C:\fIany text, for Glossary and config_h.SH\fR +Basically a comment describing the C symbol, which will be extracted +by \fImakegloss\fR into the Glossary file and by \fImetaconfig\fR into +the \fIconfig_h.SH\fR file if the symbol is wanted (or if its alias is +wanted when symbol aliasing is used). +.TP +?C:. +Closes the C symbol comment. +.TP +?H:?\fIsymbol\fR:\fIconfig_h.SH stuff\fR +This is the general inclusion request into \fIconfig_h.SH\fR. The line is +only written when the guarding \fIsymbol\fR is really wanted. This general +form is needed when C symbol aliasing was used. Otherwise, if you use one +of the other "standard" forms, the guarding is automatically done by +\fImetaconfig\fR itself. +.TP +?H:#\fI\$d_var VAR\fR "\fI\$var\fR" +Conditionally defines the \fIVAR\fR C symbol into \fI\$var\fR when \fI$d_var\fR +is set to '\fIdefine\fR'. Implies a '?\fIVAR\fR:' guarding condition, and +\fImetaconfig\fR automatically links \fIVAR\fR to its two shell variable +dependencies (i.e. both \fI\$d_var\fR and \fI\$var\fR will be flagged as +\fIwanted\fR if \fIVAR\fR is used in C sources). +.TP +?H:#define \fIVAR\fR [\fIoptional text\fR] +Always defines the \fIVAR\fR C symbol to some value. Implies a '?\fIVAR\fR:' +guarding condition. An automatic shell dependency is made to the unit itself. +.TP +?H:#define \fIVAR(x,y,z)\fR \fI\$var\fR +Always defines the macro \fIVAR\fR to be the value of the \fI\$var\fR variable. +It is up to the unit to ensure \fI\$var\fR holds a sensible value. An +automatic dependency between the C macro \fIVAR\fR and the shell variable +is established, and the whole line is guarded by an implicit '?\fIVAR\fR:'. +.TP +?H:#\fI\$d_var VAR\fR +Conditionally defines \fIVAR\fR if \fI\$d_var\fR is set to '\fIdefine\fR'. +Implies a '?\fIVAR\fR:' guarding condition. An automatic shell dependency is +generated towards \fI\$d_war\fR. +.TP +?H:#define \fIVAR\fR "\fI\$var\fR" +Assigns a configured value to the \fIVAR\fR C symbol. Implies a '?\fIVAR\fR:' +gurading condition. An automatic shell dependency is generated to link +\fIVAR\fR and \fI\$var\fR. +.TP +?H:. +Closes the \fIconfig_h.SH\fR inclusion requests. +.TP +?M:\fIC symbol\fR: \fIC dependencies\fR +Introduces magic definition concerning the C symbol, for \fIconfmagic.h\fR, +and defines the guarding symbol for the remaining ?M: definitions. This +line silently implies '?W:%<:\fIC symbol\fR', i.e. the unit will be loaded +into Configure if the C symbol appears within the C sources, whether magic +is used or not. The C dependencies are activated when magic is used, in order +to force their definition in \fIconfig_h.SH\fR. However, if magic is \fBnot\fR +used but the C symbol appears in the source without the needed C dependencies, +you will be warned every time the Wanted file is built, since it may be a +portability issue (and also because the unit is unconditionally loaded into +Configure whenever the C symbol is used, regardless of the other ?C: lines +from the unit). +.TP +?M:\fIcpp defs\fR +Defines the magic cpp mapping to be introduced in confmagic.h whenever the +concerned symbol is used. There is an implicit '?\fIsym\fR' guarding where +\fIsym\fR is the symbol name defined by the leading ?M: line. +.TP +?M:. +Closes the \fIconfmagic.h\fR inclusion request. +.TP +?W:\fIshell symbol list\fR:\fIC symbol list\fR +Ties up the destiny of the shell symbols with that of the C symbols: if any +of the C symbols listed is wanted, then all the shell symbols are marked +as wanted. Useful to force inclusion of a unit (shell symbol list set to +\&'%<') when the presence of some C symbol is detected. The shell symbol list +may be left empty, to benefit from the side effect of C symbol location +within the builtin pre-processor (symbol being \fIdefined\fR for that +pre-processor if located in the source). To look for patterns with a space +in them, you need to quote the C symbols within simple quotes, as in +\&'struct timezone'. +.TP +?V:\fIread-only symbols\fR:\fIread-write symbols\fR +This is a \fImetalint\fR hint and should be used only in special units +exporting some shell variables. The variables before the middle ':' +are exported read-only (changing them will issue a warning), while +other symbols may be freely read and changed. +.TP +?F:\fIfiles created\fR +This line serves two purposes: it is a \fImetalint\fR hint, and also +a placeholder for future \fIjmake\fR use. It must list three kind of files: +the temporary one which are created for a test, the private UU ones created +in the UU directory for later perusal, and the public ones left in the +root directory of the package. Temporary files must be listed with a +preceding '!' character (meaning "no! they're not re-used later!"), private +UU files should be preceded by a './' (meaning: to use them, say \fI./file\fR, +not just \fIfile\fR), and public ones should be named as-is. +.TP +?T:\fIshell temporaries\fR +Another \fImetalint\fR hint. This line lists all the shell variables used +as temporaries within the shell section of this unit. +.TP +?D:\fIsymbol\fR='\fIvalue\fR' +Initialization value for symbols used as conditional dependencies. If no +?D: line is found, then a null value is used instead. The \fImetalint\fR +program will warn you if a symbol is used at least once as a conditional +dependency and does not have a proper ?D: initialization. It's a good +practice to add those lines even for a null initialization since it +emphasizes on the possibly optional nature of a symbol. +.TP +?O:\fIany message you want\fR +This directive indicates that this unit is obsolete as a whole. Whenever +usage of any of its symbols is made (or indirect usage via dependencies), +the message is output on the screen (on stderr). You can put one ore more +lines, in which case each line will be printed, in order. +.TP +?LINT:\fImetalint hints\fR +See the \fImetalint\fR manual page for an explaination of the distinct +hints that can be used. +.TP +?INIT:\fIinitialization code\fR +The initialization code specified by this line will be loaded at the top +of the \fIConfigure\fR script provided the unit is needed. +''' +.SS C Symbol Aliasing +.PP +Sometimes it is not possible to rely on \fImetaconfig\fR's own default +selection for \fIconfig_h.SH\fR comments and C symbol definition. That's +where aliasing comes into play. Since it's rather tricky to explain, we'll +study an example to understand the underlying mechanism. +.PP +The d_const.U unit tries to determine whether or not your C compiler +known about the \fIconst\fR keyword. If it doesn't we want to remap +that keyword to a null string, in order to let the program compile. +Moreover, we want to automatically trigger the test when the \fIconst\fR +word is used. +.PP +Here are the relevant parts of the d_const.U unit: +.Ex +?MAKE:d_const: cat cc ccflags Setvar +?MAKE: -pick add \$@ %< +?S:d_const: +?S: This variable conditionally defines the HASCONST symbol, which +?S: indicates to the C program that this C compiler knows about the +?S: const type. +?S:. +?C:HASCONST ~ %<: +?C: This symbol, if defined, indicates that this C compiler knows about +?C: the const type. There is no need to actually test for that symbol +?C: within your programs. The mere use of the "const" keyword will +?C: trigger the necessary tests. +?C:. +?H:?%<:#$\&d_const HASCONST /**/ +?H:?%<:#ifndef HASCONST +?H:?%<:#define const +?H:?%<:#endif +?H:. +?W:%<:const +?LINT:set d_const +?LINT:known const +: check for const keyword +echo " " +echo 'Checking to see if your C compiler knows about "const"...' >&4 +$cat >const.c <<'EOCP' +main() +{ + const char *foo; +} +EOCP +if $\&cc -c $\&ccflags const.c >/dev/null 2>&1 ; then + val="$\&define" + echo "Yup, it does." +else + val="$\&undef" + echo "Nope, it doesn't." +fi +set d_const +eval $\&setvar +.Ef +First we notice the use of a ?W: line, which basically says: "This unit +is wanted when the \fIconst\fR keyword is used in a C file.". In order +to conditionally remap \fIconst\fR to a null string in \fIconfig.h\fR, +I chose to conditionally define \fIHASCONST\fR via \fI\$\&d_const\fR. +.PP +However, this raises a problem, because the \fIHASCONST\fR symbol is not +going to be used in the sources, only the \fIconst\fR token is. And the +?H: line defining \fIHASCONST\fR is implicitely guarded by '?HASCONST'. +Therefore, we must add the explicit '?%<' constraint to tell \fImetaconfig\fR +that those lines should be included in \fIconfig_h.SH\fR whenever the +\&'%<' symbol gets wanted (%< refers to the unit's name, here \fId_const\fR). +.PP +That's almost perfect, because the ?W: line will want \fId_const\fR whenever +\fIconst\fR is used, then the ?H: lines will get included in the +\fIconfig_h.SH\fR file. However, the leading comment (?C: lines) attached to +\fIHASCONST\fR is itself also guarded via \fIHASCONST\fR, i.e. it has an +implicit '?HASCONST' constraint. Hence the need for \fIaliasing\fR the +\fIHASCONST\fR symbol to '%<'. +.PP +The remaining part of the unit (the shell part) is really straightforward. +It simply tries to compile a sample C program using the \fIconst\fR keyword. +If it can, then it will define \fI\$\&d_const\fR via the \fI\$\&setvar\fR +fonction (defined by the \fISetvar.U\fR unit). See the paragraph about +special units for more details. +''' +.SS Make Commands +.PP +On the ?MAKE: command line, you may write a shell command to be executed as-is +or a special \fI-pick\fR command which is trapped by \fImetaconfig\fR and +parsed to see what should be done. The leading '-' is only there to prevent +\fImake\fR from failing when the command returns a non-zero status -- it's +not really needed since we use '\fImake -n\fR' to resolve the dependencies, +but I advise you to keep it in case it becomes mandatory in future versions. +The syntax of the \fIpick\fR command is: +.Ex +-pick \fIcmd\fR \$@ \fItarget_file\fR +.Ef +where \fI\$@\fR is the standard macro within Makefiles standing for the current +target (the name of the unit being built, with the final .U extension stripped). +The \fIcmd\fR part is the actual \fImetaconfig\fR command to be run, and the +\fItarget_file\fR is yet another parameter, whose interpretation depends on +the \fIcmd\fR itself. It also has its final .U extension stripped and normally +refers to a unit file, unless it start with './' in which case it references +one of the \fImetaconfig\fR control files in the '\fI.MT\fR directory. +.PP +The available commands are: +.TP 10 +add +Adds the \fItarget_file\fR to \fIConfigure\fR. +.TP +add.Config_sh +Fills in that part of \fIConfigure\fR producing the \fIconfig.sh\fR file. +Only used variables are added, conditional ones (from conditional dependencies) +are skipped. +.TP +add.Null +Adds the section initializing all the shell variables used to an empty string. +.TP +c_h_weed +Produces the \fIconfig_h.SH\fR file. Only the necessary lines are printed. +.TP +cm_h_weed +Produces the \fIconfmagic.h\fR file. Only the necessary lines are printed. +This command is only enabled when the \fB\-M\fR switch is given, or when a +\fIconfmagic.h\fR file already exists. +.TP +close.Config_sh +Adds the final 'EOT' symbol on a line by itself to end the here document +construct producing the \fIconfig.sh\fR file. +.TP +prepend +Prepends the content of the target to the \fItarget_file\fR if that file is +not empty. +.TP +weed +Adds the unit to \fIConfigure\fR like the \fIadd\fR command, but make some +additional tests to remove the '?\fIsymbol\fR' and '%\fIsymbol\fR' lines +from the \fItarget_file\fR if the symbol is not wanted or conditionally +wanted. The '%' form is only used internally by \fImetaconfig\fR while +producing its own .U files in the '\fI.MT\fR' directory. +.TP +wipe +Same as \fIadd\fR really, but performs an additional macro substitution. +The available macros are described in the \fIHardwired Macros\fR paragraph. +.PP +As a side note, \fImetaconfig\fR generates a \fI-cond\fR command internally +to deal with conditional dependencies. You should not use it by yourself, +but you will see it if scanning the generated \fIMakefile\fR in the \fI.MT\fR +directory. +''' +.SS Hardwired Macros +.PP +The following macros are recognized by the \fIwipe\fR command and subsituted +before inclusion in \fIConfigure\fR: +.TP 10 + +The base revision number of the package, derived from \fI.package\fR. +.TP + +The current date. +.TP + +The e-mail address of the maintainer of this package, derived from +your \fI.package\fR. +.TP + +The name of the package, as derived from your \fI.package\fR file. +.TP + +The patch level of the \fImetaconfig\fR program. +.TP + +The version number of the \fImetaconfig\fR program. +.PP +Those macros are mainly used to identify the \fImetaconfig\fR version that +generated a particular \fIConfigure\fR script and for which package it +was done. The e-mail address of the maintainer is hardwired in the leading +instructions that \fIConfigure\fR prints when starting. +.PP +Recent \fImetaconfig\fR versions understand a much more general syntax +of the form: +.Ex + <\$variable> +.Ef +which is replaced at Configure-generation time by the value of \fIvariable\fR +taken from your \fI.package\fR file. Eventually, the old hardwired macro +format will disappear, and <\$baserev> will replace in all the +supplied units. +''' +.SS Special Units +.PP +The following special units are used to factorize code and provide higher +level functionalities. They either produce a shell script that can be +sourced or a shell variable that can be \fIeval\fR'ed. Parameter passing +is done via well-know variables, either named or anonymous like \$1, \$2, +etc... (which can be easily set via the shell \fIset\fR operator). +When \fIConfigure\fR executes, it creates and goes into a \fIUU\fR directory, +so every produced script lies in there and does not interfere with the +files from your package. +.PP +Here are the sepcial units that you should know about, and the way to use +them. +.TP 5 +Cppsym.U +This unit produces a shell script called \fICppsym\fR, which can be used +to determine whether any symbol in a list is defined by the C preprocessor +or C compiler you have specified. +It can determine the status of any symbol, though the symbols in \fI$al\fR +(attribute list) are more easily determined. +.TP +Csym.U +This sets the \$csym shell variable, used internally by \fIConfigure\fR to +check whether a given C symbol is defined or not. A typical use is: +.Ex +set symbol result [-fva] [previous] +eval \$\&csym +.Ef +That will set the \fIresult\fR variable to 'true' if the +function [-f], +variable [-v] or +array [-a] +is defined, 'false' otherwise. If a previous value is given and the \fB\-r\fR +switch was provided to \fIConfigure\fR (see the \fIConfigure Options\fR +paragraph), then that value is re-used without questioning. +.sp +The way this computation is done depends on the answer the user gives to +the question \fIConfigure\fR will ask about whether it should perform an +.I nm +extraction or not. If the exctraction was performed, the unit simply looks +through the symbol list, otherwise it performs a compile-link test, unless +.B \-r +was given to reuse the previously computed value, naturally... +.TP +End.U +By copying this unit into your private \fIU\fR directory and appending +dependencies on the ?MAKE: line, you can force a given unit to be loaded +into \fIConfigure\fR even if it is not otherwise wanted. Some units may +only be forced into \fIConfigure\fR that way. +.TP +Filexp.U +This unit produces a shell script \fIfilexp\fR which will expand filenames +beginning with tildes. A typical use is: +.Ex +exp_name=\`./filexp \$name\` +.Ef +to assign the expanded file name in \fIexp_name\fR. +.TP +Findhdr.U +This unit produces a \fIfindhdr\fR script which is used to locate the +header files in \fI$\&usrinc\fR or other stranger places using cpp capabilities. +The script is given an include file base name like 'stdio.h' or 'sys/file.h' +and it returns the full path of the inlcude file and a zero status if found, +or an empty string and a non-zero status if the file could not be located. +.TP +Getfile.U +This unit produces a bit of shell code that must be sourced in order to get +a file name and make some sanity checks. Optionally, a ~name expansion is +performed. +.sp +To use this unit, \fI\$rp\fR and \fI\$dflt\fR must hold the question and the +default answer, which will be passed as-is to the \fImyread\fR script +(see forthcoming \fIMyread.U\fR). The \fI\$fn\fR variable controls the +operation and the result is returned into \fI\$ans\fR. +.sp +To locate a file or directory, put 'f' or 'd' in \fI$fn\fR. If a '~' appears, +then ~name substitution is allowed. If a '/' appears, only absolute pathnames +are accepted and ~name subsitutions are always expanded before returning. +If '+' is specified, existence checks are skipped. If 'n' +appears within \fI\$fn\fR, then the user is allowed to answer 'none'. +.sp +Usually, unless you asked for portability, ~name substitution occurs when +requested. However, there are some times you wish to bypass portability and +force the substitution. You may use the 'e' letter (expand) to do that. +.sp +If the special 'l' (locate) type is used, then the \fI\$fn\fR variable must +end with a ':', followed by a file basename. If the answer is a directory, +the file basename will be appended before testing for file existence. This +is useful in locate-style questions like this: +.Ex +dflt='~news/lib' +: no need to specify 'd' or 'f' when 'l' is used +fn='l~:active' +rp='Where is the active file?' +\&. ./getfile +active="\$ans" +.Ef +.sp +Additionally, the 'p' (path) letter may be used in conjunction with 'l' to +tell \fIgetfile\fR that an answer without a '/' in it should be accepted, +assuming that it will be in everyone's PATH at the time this value will be +needed. +.sp +Also useful is the possibility to specify a list of answers that should be +accepted verbatim, bypassing all the checks. This list must be within +parenthesis and items must be comma separated, with no interleaving spaces. +Don't forget to quote the resulting string since parenthesis are meaningful +to the shell. For instance: +.Ex +dflt='/bin/install' +fn='/fe~(install,./install)' +rp='Use which install program?' +\&. ./getfile +install="\$ans" +.Ef +would let the user only specify fully qualified paths referring to existing +files, but still allow the special "install" and "./install" answers as-is +(assuming of course something will deal with them specially later on in the +chain since they do not conform with the general expected frame). +.sp +If the answer to the question is 'none', then the existence checks are skipped +and the empty string is returned. Note that since \fIgetfile\fR calls +\fImyread\fR internally, all the features available with \fImyread\fR apply +here to. +.sp +If a completely expanded value is needed (for instance in a Makefile), you +may use the \fI\$ansexp\fR variable which is always set up properly +by \fIgetfile\fR +as the expanded version of \fI\$ans\fR. Of course, it will not expand ~name if +you did not allow that in the first place in the \fI\$fn\fR variable. +.TP +Inhdr.U +This unit produces the \fI\$inhdr\fR shell variable, used internally by +\fIConfigure\fR to check whether a set of headers exist or not. A typical +use is: +.Ex +set header i_header [ header2 i_header2 ... ] +eval \$\&inhdr +.Ef +That will print a message, saying whether the header was found or not and +set the \fIi_header\fR variable accordingly. If more than one header +is specified and the first header is not found, we try the next one, until +the list is empty or one is found. +.TP +Inlibc.U +This unit produces the \fI\$inlibc\fR shell variable, used internally +by \fIConfigure\fR to check whether a given C function is defined or not. +A typical use is: +.Ex +set function d_func +eval \$\&inlibc +.Ef +That will print a message, saying whether the function was found or not +and set \fI\$d_func\fR accordingly. Internally, it used the \fI\$\&csym\fR +routine. +.TP +Loc.U +This important unit produces a shell script \fIloc\fR which can be used +to find out where in a list of directories a given file lies. The first +argument specifies the file to be located, the second argument is what +will be returned if the search fails, and the reamining arguments are a +list of directories where the file is to be searched. For instance: +.Ex +dflt=\`./loc sendmail.cf X /usr/lib /var/adm/sendmail /lib\` +.Ef +would set \fI\$dflt\fR to \fIX\fR if no \fIsendmail.cf\fR file was found +under the listed directories, or something like \fI/usr/lib/sendmail.cf\fR +on some systems. See also \fIGetfile.U\fR. +.TP +MailAuthor.U +This unit needs to be included on the ?MAKE: line of your own private End.U +to make it into \fIConfigure\fR. It offers the user to register himself to +the author, optionally being notified when new patches arrive or receiving +them automatically when issued. You need to install \fImailagent\fR to do +this (at least version 3.0). +.TP +MailList.U +This unit needs to be included on the ?MAKE: line of your own private End.U +to make it into \fIConfigure\fR. It offers the user to subscribe or +unsubscribe to a mailing list where discussion related to the package are +taking place. You need to run \fIpackinit\fR and answer the mailing list +related questions to set up the proper variables in your \fI.package\fR +before this unit may become operational. +.TP +Myinit.U +Copy this unit into your private \fIU\fR directory to add your own default +values to some internal variables. This unit is loaded into \fIConfigure\fR +after all the default initializations have been done. +.TP +Myread.U +This unit produces the \fImyread\fR shell script that must be sourced in +order to do a read. It allows shell escapes, default assignment and +parameter evaluation, as documented in the Instruct.U unit. It also allows +dynamic setting of the \fB\-d\fR option, which will be used for the remaining +of the script execution. +.sp +To use this unit, \fI\$rp\fR must hold the question and \fI\$dflt\fR should +contain the default answer. The question will be printed by the script +itself, and the result is returned in the \fI\$ans\fR variable. +.sp +Here is a typical usage: +.Ex +dflt='y' +rp='Question?' +\&. ./myread +value="\$ans" +.Ef +See the unit itself for more information. +.TP +Oldconfig.U +This unit must be part of your dependency ?MAKE: line when some of your +units tries to reuse an old symbol value. This unit is responsible for +getting the old answers from \fIconfig.sh\fR or providing useful hints +when running on a given platform for the first time. See the \fIConfigure +Hints\fR paragraph for more information about hints. +.TP +Prefixit.U +The purpose of this unit is to detect changes in the installation prefix +directory to recompute automatically suitable defaults from previous answers. +It relies on the value of the \fI\$oldprefix\fR variable which holds the +previous prefix directory when it changed, and is empty otherwise. For instance, +if the prefix was changed from \fI/opt\fR to \fI/usr/local\fR, then the +previous binary installation directory will be changed from \fI/opt/bin\fR +to \fI/usr/local/bin\fR, or will remain unchanged if it was, say, \fI/bin\fR. +.sp +You need to call \fBset\fR before issuing an \fBeval\fR on \fI\$prefixit\fR, +such as: +.Ex +set dflt var [dir] +eval \$prefixit +.Ef +which would set \fI\$dflt\fR to \fI\$var\fR or \fI\$prefix/dir\fR depending +on whether the prefix remained the same or not. If \fIdir\fR is the +string \fInone\fR, a single space value in \fI\$dflt\fR is kept as-is, even +when the prefix changes. If \fIdir\fR is omitted, then \fI\$dflt\fR is set +to an empty string if the prefix changed, to \fI\$var\fR otherwise. +.TP +Prefixup.U +The intent of thit unit is similar to that of Prefixit.U, i.e. it helps +fixing the default string to accomodate prefix changes. However, the shell +variable \fI\$prefixup\fR, when evaluated, will only restore ~name expansions, +should prefix use such an escape mechanism. Use it as: +.Ex +set dflt +eval \$prefixup +.Ef +before prompting via \fIgetfile\fR for instance. If the prefix does not +make use of ~name expanstion, then the above will be a no-op on the \fI$dflt\fR +variable, naturally. +.TP +Typedef.U +This unit produces the \fI\$typedef\fR shell variable, used internally by +\fIConfigure\fR to check whether a typedef exists or not. A typical +use is: +.Ex +set typedef val_t default [ includes ] +eval \$\&typedef +.Ef +This will set the variable \fIval_t\fR to the value of \fIdefault\fR if the +typedef was not found among the listed include files, or to \fItypedef\fR +if found. If no include files are specified, the unit looks +in \fI\fR only. If you specifiy some includes, only those are +looked at. +.TP +Unix.U +The purpose of this unit is to define some of the most common UNIX-isms +via variables which can be altered from the command line or via proper +hint files. In particular, \fI\$_exe\fR, \fI\$_o\fR and \fI\$_a\fR +are set. All the units should refer to \fI\$_o\fR and not to \fI.o\fR +directly. The '.' is part of these variables. +.TP +Setvar.U +This unit produces the \fI$setvar\fR variable, which is used internally +by \fIConfigure\fR to set a \fIdefine\fR/\fRundef\fR value to a given symbol, +emitting a warning when it suddenly changes from a previous value. For instance: +.Ex +val="\$\&define" +set d_variable +eval \$\&setvar +.Ef +If the previous \fI\$d_variable\fR value was non-null and \fI\$val\fR is +different, a "whoa" warning is issued. +.TP +Whoa.U +This unit produces the \fIwhoa\fR script, which emits a warning when the +\fIvalue\fR in variable whose name is \fI\$var\fR is not the same as +its old previous value held in \fI\$was\fR. Upon return, \fI\$td\fR and +\fI\$tu\fR hold the proper value to \fIdefine\fR or \fIundef\fR the variable. +See examples in \fIInlibc.U\fR. +''' +.SS Builtin Pre-processor +.PP +Each unit to be included in \fIConfigure\fR is ran through a built-in +pre-processor. Pre-processor statements are introduced by the '@' character +('#' is the shell comment character). It functions merely as the C +pre-processor does but allows for shell and perl escapes. Here are the +available functions: +.TP 10 +@if \fIexpression\fR +If \fIexpression\fR is true, continue loading code until @end, @elsif or @else. +.TP +@elsif \fIexpression\fR +Alternative choice. If \fIexpression\fR is true, continue loading code until +@end, another @elsif or @else. +.TP +@else +Default code to be loaded if the @if \fIexpression\fR was false and none +of the optional @elsif matched. Load until @end. +.TP +@end +Close the conditional loading statement opened by @if. +.TP +@define \fIsymbol\fR +Tells the pre-processor that \fIsymbol\fR is defined from now on. +.PP +The conditional \fIexpression\fR can include symbol names (value is +true if symbol is wanted or defined via \fI@define\fR or shell/perl +escapes. Those atoms can be combined using the traditional boolean +operators '!' for negation, '&&' for logical and, and '||' for logical +or. +.PP +Text enclosed within single brackets is a shell test, while text between +double brakets is a perl test. Namely the expressions: +.Ex +{ \fIshell text\fR } +{{ \fIperl text\fR }} +.Ef +are translated into: +.Ex +if \fIshell text\fR >/dev/null 2>&1; then exit 0; else exit 1; fi +if (\fIperl text\fR) {exit 0;} else {exit 1;} +.Ef +and the exit status is used in the standard way to get a boolean value, +i.e. 0 is true and everything else is false. Note that only simple +conditions can be expressed in perl, until some complex code can be +loaded within \fImetaconfig\fR and executed. +.PP +The built-in pre-processor can be used to finely tune some units +(see \fId_gethname.U\fR for a complex example) depending on the symbols +actually used by the program or the files present in the distribution. +For instance, the \fIOldconfig.U\fR uses a test like: +.Ex +@if {test -d ../hints} +.Ef +and \fIConfigure\fR will contain hint-dependent code only if there is +a \fIhints\fR directory in the package's top level directory. Note that +tests are ran from within the '\fI.MT\fR' directory, hence the needed +\&'../' in the test. +.PP +The pre-processor can also be used to avoid putting useless code when +a symbol is not defined. Units defining more than one symbol can be +protected that way (since the unit is loaded as a whole) by gathering +symbol-dependent code within an @if/@end pair. For instance: +.Ex +@if I_TIME || I_SYS_TIME || I_SYS_TIME_KERNEL +need_time_h='true' +@else +need_time_h='false' +@end +.Ef +will test whether the source code makes any use of one of the three +symbols that control the \fItime.h\fR or \fIsys/time.h\fR inclusion +and define the shell symbol accordingly. That gives \fIConfigure\fR +a feedback on what the sources need and avoid the drawback of having +fixed frozen units. +.PP +Via the '?W:' lines, you can get intersting combinations. For instance, +the \fIi_time.U\fR unit needs to know whether the C sources make any +use of the \fIstruct timezone\fR type. Therefore, the line: +.Ex +?W::timezone +.Ef +is used for its side-effect of defining the symbol \fItimezone\fR for +the pre-processor. The unit code can then say: +.Ex +@if timezone +for s_timezone in '-DS_TIMEZONE' ''; do +@else +s_timezone='' +@end + +\&... code using s_timezone ... + +@if timezone +done +@end +.Ef +and have an extra loop trying two successive values for the \fIs_timezone\fR +variable, but only if needed. +''' +.SS Obsolete Symbols +.PP +Obsolete symbols are preserved to ease the transition with older +.I metaconfig +units. Unless the \fB\-o\fR switch is passed to \fImetaconfig\fR they will +be ignored. However, an \fIObsolete\fR file will be generated, telling you +which files are making use of those obsolete symbols and what are the new +symbols to be used. +.PP +The lifetime for obsolete symbols is one full revision, i.e. they will +be removed when the next base revision is issued (patch upgrades do not +count of course). Therefore, it is wise to translate your sources and +start using the new symbols as soon as possible. +''' +.SS Configure Hints +.PP +It may happen that the internal configuration logic makes the wrong choices. +For instance, on some platform, the \fIvfork()\fR system call is present but +broken, so it should not be used. It is not possible to include that knowledge +in the units themselves, because that might be a temporary problem which the +vendor will eventually fix, or something that was introduced by a new OS +upgrade. +.PP +Anyway, for all those tiny little problems that are too system-specific, +\fImetaconfig\fR provides hint files support. To use it, you need to create +a \fIhints\fR directory in the package's top level directory, and have it +when you run \fImetaconfig\fR. That will load the hint-related part from +\fIOldconfig.U\fR. +.PP +From then on, you may pre-set some of the shell variables \fIConfigure\fR uses +in an OS-specific .sh file. There is code in \fIOldconfig.U\fR that tries +to guess which hint files are needed by computing a standard name based +on the system OS name, the kernel name, the release number, etc... Since +this information is likely to change rapidly, I'm not documenting it here. +You have to reverse engineer the code from \fIOldconfig.U\fR. +.PP +When you first release your package, your hints file directory should be empty. +If the users of your package complain that they have problem with +\fIConfigure\fR defaults on a particular system, you have to see whether this +is a platform-specific problem or a general one. In the former case, it's +time to introduce a new hint file, while in the latter, the corresponding +unit should be revised. +.PP +For instance, SGI systems are known to have a broken \fIvfork()\fR system +call, as of this writing. And the corresponding hint file name is \fIsgi.sh\fR. +So all you need to do is create a \fIhints/sgi.sh\fR file in which you write: +.Ex +d_vfork="\$\&define" +.Ef +which will always remap \fIvfork\fR on \fIfork\fR (see \fId_vfork.U\fR). When +running on SGI systems for the first time, \fIConfigure\fR will detect that +there is an \fIhints/sgi.sh\fR file, and that we are on an IRIX machine +(the kernel name is often /irix), therefore it will propose \fIsgi\fR as a +possible hint. +If the user accepts it, and since the \fI\$\&d_vfork\fR value is modified +via the \fI$\&setvar\fR call, a \fIwhoa!\fR will be emitted to warn that we +are about to override the value computed by \fIConfigure\fR. +.PP +Note that you don't have to provide \fIall\fR the hints known by +\fIOldconfig.U\fR. If a hint file is missing, it will not be proposed as a +possible choice. The heuristic tests ran to compute the possible hint +candidates are flaky. If you have new values or different tests, please send +them to me... +''' +.SS Overriding Choices +.PP +If you create a \fIconfig.over\fR file in the top level directory, +\fIConfigure\fR will ask you if you wish to load it to override the default +values. This is done prior creation of the \fIconfig.sh\fR file, so it gives +you a chance to patch the values stored in there. +.PP +This is distinct from the hints approach in that it is a local file, which +the user is free to create for his own usage. You should not provide such +a file yourself, but let the user know about this possibility. +''' +.SS Configure Options +.PP +The \fIConfigure\fR script may be called with some options specified on the +command line, to slightly modify its behaviour. Here are the allowed options: +.TP 10 +.B \-d +Use defaults for all answers. +.TP +.B \-e +Go on without questioning past the production of \fIconfig.sh\fR. +.TP +.B \-f \fIfile\fR +Use the specified file as a default configuration. If this switch is not +used, the configuration is taken from \fIconfig.sh\fR, when present. +.TP +.B \-h +Print help message and exit. +.TP +.B \-r +Reuse C symbols value if possible. This will skip the costly \fInm\fR +symbol extraction. If used the first time (with no previous configuration +file), \fIConfigure\fR will try to compile and link a small program in order +to know about the presence of a symbol, or absence thereof. +.TP +.B \-s +Silent mode. Only strings printed on file descriptor #4 will be seen on +the screen (that's the important messages). It's not possible to completely +turn off any output, but you may use '\fIConfigure -ders >/dev/null 2>&1\fR' +to have a full batch run with no output and no user interaction required. +.TP +.B \-D\fI symbol=value\fR +Pre-defines \fIsymbol\fR to bear the specified \fIvalue\fR. It is also +possible to use '\fB-D\fI symbol\fR' which will use a default value +of 'define'. +.TP +.B \-E +Stop at the end of the configuration questions, after having produced +a \fIconfig.sh\fR. This will not perform any '\fImake depend\fR' or .SH files +extraction. +.TP +.B \-K +Knowledgeable user. When you use this option, you know what you are +doing and therefore the \fIconfig.sh\fR file will always be handled as if it +was intended to be re-used, even though it might have been generated on +an alien system. It also prevents aborting when \fIConfigure\fR detects +an unusable C compiler or a wrong set of C flags. +Further shortcuts might be turned on by this option as well in the future. +This option is documented in the \fIConfigure\fR usage message, to remind +us about its existence, but the given description is hoped to be cryptic +enough. :-) +.TP +.B \-O +Allow values specified via a \fB\-D\fR or \fB\-U\fR to override settings from +any loaded configuration file. This is not the default behaviour since the +overriding will not be propagated to variables derived from those you are +presently altering. Naturally, without \fB-O\fR, the setting is only +done when no configuration file is loaded, which is safe since derivative +variables have not been computed yet... +.TP +.B \-S +Perform variable substitution on all the .SH files. You can combine it with the +\fB\-f\fR switch to propagate any configuration you like. +.TP +.B \-U\fI symbol=\fR +Pre-sets \fIsymbol\fR to bear an empty value. It is also +possible to use '\fB-U\fI symbol\fR' which will set \fIsymbol\fR to 'undef'. +.TP +.B \-V +Print the version number of the \fImetaconfig\fR that generated this +.I Configure +script and exit. +''' +.SS Running Environment +Upon starting, \fIConfigure\fR creates a local \fIUU\fR directory and runs +from there. The directory is removed when Configure ends, but this means +you must run the script from a place where you can write, i.e. not from +a read-only file system. +.PP +You can run \fIConfigure\fR remotely though, as in: +.Ex + ../package/Configure +.Ef +to configure sources that are not present locally. All the generated files +will be put in the directory where you're running the script from. This magic +is done thanks to the src.U unit, which is setting the \fI\$src\fR +and \fI\$rsrc\fR variables to point to the package sources. That path is +full or relative, depending on whether \fIConfigure\fR was invoked via a +full or relative path. +.PP +From within the \fIUU\fR subdirectory, you can use \fI\$rsrc\fR to access the +source files (units referring to source files link hints shall always use +this mechanism and not assume the file is present in the parent directory). +All the Makefiles should use the \$src variable as a pointer to the sources +from the top of the build directory (where \fIConfigure\fR is run), either +directly or via a VPATH setting. +.PP +When running \fIConfigure\fR remotely, the .SH files are extracted in the +build directory, not in the source tree. However, it requires some kind of +a \fImake\fR support to be able to compile things in a build directory whilst +the sources lie elsewhere. +''' +.SS Using Magic Redefinitions +.PP +By making use of the \fB\-M\fR switch, some magic remappings may take place +within a \fIconfmagic.h\fR file. That file needs to be included after +\fIconfig.h\fR, of course, but also after all the other needed include files. +Namely: +.Ex +#include "config.h" +\&... +\&... \fIother inclusions\fR ... +\&... +#include "confmagic.h" +.Ef +Typically, \fIconfmagic.h\fR will attempt to remap \fIbcopy()\fR +on \fImemcpy()\fR if no \fIbcopy()\fR is available locally, or transform +\fIvfork\fR into \fIfork\fR when necessary, hence making it useless to +bother about the \fIHAS_VFORK\fR symbol. +.PP +This configuration magic is documented in the Glossary file. +''' +.SS Unit Templates +.PP +There is a set of unit templates in the \fImetaconfig\fR source directory, +which are intended to be used by a (not yet written) program to quickly +produce new units for various kind of situations. No documentation for this +unfinished project, but I thought I would mention it in the manual page in +case you wish to do it yourself and then contribute it... +.SH AUTHORS +Larry Wall for version 2.0. +.br +Harlan Stenn for important unit extensions. +.br +Raphael Manfredi . +.br +Many other contributors for the +\fImetaconfig\fR units. See the credit file for a list. +.SH FILES +.TP 10 +.PD 0 +LIB/dist/mcon/U/*.U +Public unit files +.TP +U/*.U +Private unit files +.TP +LIB/dist/mcon/Glossary +Glossary file, describing all the metaconfig symbols. +.TP +Obsolete +Lists all the obsolete symbols used by the sources. +.TP +Wanted +Lists all the wanted symbols. +.PD +.sp +.in +5 +where LIB is $privlibexp. +.in -5 +.SH BUGS +Units are sometimes included unnecessarily if one of its symbols is +accidentally mentioned, e.g. in a comment. +Better too many units than too few, however. +.SH "SEE ALSO" +pat($manext), makeSH($manext), makedist($manext), metalint($manext) +!GROK!THIS! +chmod 444 metaconfig.$manext diff --git a/mcon/man/mlint.SH b/mcon/man/mlint.SH new file mode 100755 index 0000000..65259d7 --- /dev/null +++ b/mcon/man/mlint.SH @@ -0,0 +1,559 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting mcon/man/metalint.$manext (with variable substitutions)" +$rm -f metalint.$manext +$spitshell >metalint.$manext <' unless +the whole string is quoted. This message is suppressed by a ?LINT: nocomment +hint. +.TP +"missing space after ':' to make it a comment." +A line starting by ':' is interpreted by the shell but will be ignored. There +must be a space after the ':' though, or the shell will try to execute an +unknown command... +.TP +"found unquoted meta-character > on comment line." +A line starting by ':' is interpreted by the shell but will be ignored. +This means that meaningful meta-characters such as '(' or '>' must be +quoted or escaped with a leading backslash. +.TP +"found dangling quote on ':' comment line." +An unclosed single or double quote was spotted on a ':' comment line. +Since those lines are interpreted by the shell, albeit ignored, all quotes +must match perfectly. +.TP +"not ending with a blank line." +Since all units are gathered together to form one big script, it is recommended +(hence enforced by \fImetalint\fR) that every unit file end with an empty line. +.TP +"last line not ending with a new-line character." +This is merely intended to users whose editor does not always append a +new-line at the end of text files. Should not happen when you use \fIvi\fR. +.TP +"symbol '\$xxx' was not described." +The shell symbol defined by this unit was not documented. Use the \fIdescribe\fR +lint hint to suppress this message. +.TP +"C symbol 'XXX' was not described." +The C symbol defined by this unit was not documented. Use the \fIknown\fR lint +hint to suppress this message. +.TP +"C symbol 'XXX' was not defined by any ?H: line." +A C symbol was advertised by never defined, hence it cannot appear in the +\fIconfig.h\fR file and is therefore useless... +.TP +"variable '\$xxx' should have been set." +A variable listed on the make line as made by the unit was not set by the +shell code body. Use the \fIset\fR lint hint to suppress this message in +pathological cases. +.TP +"unused dependency variable '\$xxx'." +Apparently no usage is made from a shell variable. Use the \fIchange\fR or +\fIuse\fR lint hints (depending on the situation) to suppress this message. +.TP +"unused conditional variable '\$xxx'. +Apparently no usage is made from this conditional dependency. The \fIchange\fR +or \fIuse\fR lint hints can be used to suppress this message. +.TP +"unused temporary variable '\$xxx'." +A variable declared as temporary in a ?T: line is not used. The \fIuse\fR lint +hint will fool \fImetalint\fR into thinking it's indeed used. +.TP +"unknown control sequence '?XXX:'." +Attempt to use an unknown control sequence. +.TP +"unknown LINT request '$xxx' ignored." +An unknown ?LINT: tag was used. All such tags must be spelled out in lowercase. +.TP +"symbol '\$xxx' has no default value." +A symbol used as a conditional dependency in some unit has no default value +set by a ?D: line. +.TP +"stale ?MAKE: dependency 'xxx'." +Unit lists a symbol as a dependency, but that symbol is otherwise unknown, i.e. +never appears as made by any other unit. +.TP +"symbol '\$xxx' missing from ?MAKE." +A symbol used or defined was not listed as a dependency in the ?MAKE: line. +.TP +"missing xxx from ?MAKE for visible '\$yyy'." +A symbol defined as visible by a special unit is used, but that special unit +is not part of the dependency line. +.TP +"stale ?M: dependency 'xxx'." +Magic line lists a C symbol as a dependency but that symbol is not known +by any unit. +.TP +"unknown symbol '\$xxx'." +I have no idea about what this symbol is. If the variable is externally +define, this warning can be suppresed via a proper ?LINT: extern. +.TP +"read-only symbol '\$xxx' is set." +A symbol that should be read-only is set by the unit's shell code body. +.TP +"obsolete symbol 'xxx' is used." +An obsolete symbol is used in the unit's shell code. +.TP +"undeclared symbol '\$xxx' is set." +The unit tries to set a shell variable which has not been otherwise declared +as made or as a temporary variable, or whatever. +.TP +"unclosed ?H: section." +The ?H: section was not terminated by a single '?H:.' line before +the body of the unit or the start of another ?C: section. +.TP +"C symbol 'xxx' is defined in the following units:" +The C symbol is defined in more that one unit. Offending units are listed. +.TP +"Shell symbol 'xxx' is defined in the following units:" +A shell symbol is defined in more than one unit. Offending units folllow. +.TP +"Shell symbol 'xxx' is altogether:" +A shell symbol is defined by some units, obsoleted by others and used as +a temporary. +.TP +"Shell symbol 'xxx' is both defined and obsoleted:" +Self explainatory. +.TP +"Shell symbol 'xxx' is both defined and used as temporary:" +Self explainatory. +.TP +"Shell symbol 'xxx' obsoleted also used as temporary:" +Self explainatory. +.TP +"definition of '\$xxx' not closed by '?S:.'." +Self explainatory. +.TP +"definition of 'XXX' not closed by '?C:.'." +Self explainatory. +.TP +"magic definition of 'xxx' not closed by '?M:.'." +Self explainatory. +.TP +"variable '\$xxx' is defined externally." +A variable defined externally (i.e. in another unit) is used, without proper +dependency information. Use the \fIextern\fR lint hint to suppress this message. +.TP +"file 'xxx' was not created." +A file listed as a private UU file is not created by the special unit. +Creation is detected by seing an explicit shell redirection to the file, +not by an implicit creation (such as a C compilation would for instance). +All special units should create only shell scripts explicitely anyway so this +message cannot be suppressed via a lint hint. +.TP +"local file 'xxx' may override the one set by 'unit.U'." +You are attempting to create a local file, but the special unit creates one +bearing the exact same name and should it be loaded before +within \fIConfigure\fR, you would override that file. Change the name of your +local file. +.TP +"unused temporary file 'xxx'. +The file was declared on the ?F: line but does not appear to be used +anywhere. +.TP +"mis-used temporary file 'xxx'. +A local temporary file has been declared on the ?F: line and is used in +a way that may not be the proper one. Indeed, all such local files should +be called with an explicit relative path, to avoid PATH lookups which could +get you another file. +.TP +"you might not always get file 'xxx' from 'unit.U'." +You seem to be calling the specified file, but not by using an explicit +relative pathname. Relying on the PATH to find this file is not safe. +To fix this problem, call your file using somthing like \fI./xxx\fR. +.TP +"missing Unit from ?MAKE for private file 'xxx'." +You are using a private UU file without listing the special unit that +produces it in your dependency line. Add the unit to your dependency list. +.TP +"unknown private file 'xxx'." +The file does not appear on any ?F: line; however it should. +.TP +"File 'xxx' is defined in the following units:" +The listed units cannot seem to agree on who is defining the file. +.TP +"empty here-document name discouraged." +You should refrain from using empty names for here documents, as +.I metalint +will not monitor those. +.TP +"unclosed here-document xxx started line x." +The opened here-document at line x was never closed in this unit. +This generally mean that when the unit is used, the generated script will +not work! +.TP +"spurious 'LINT xxx' directive." +You have inserted a ?LINT: directive that is not used to shut-up warnings. +.TP +"Cycle found for:" +There is a dependency cycle found for the symbols listed. Only the symbols +involved in the cycle are listed. +.TP +"Cycle involves:" +An exerpt of the dependencies where the cycle was found is listed. This may +involve far more symbols than the previous message, because \fImetalint\fR +actually rescans the rules to emphasize the cycle and stops whenever it has +found one, i.e. it does not try to minimize it (the cycle is found using +another algorithm, which unfortunately cannot spit it out but only say +for sure there is one). +.SH REFERENCE +.I Metalint +uses the following control lines, which are otherwise ignored by +\fImetaconfig\fR: +.TP 5 +?V:\fIread-only symbols\fR:\fIread-write symbols\fR +This line should be used only in special units. It lists all the shell +variable defined by the unit which should not be used directly as dependencies +by other units: they must include this special unit in their dependency list +if they make use of any of the symbols described here. Those can be viewed +as exported symbols which you inherit from when depending from the unit. +Symbols may be exported read-only or read-write. +.TP +?F:\fIfiles created\fR +This line serves two purposes: it is a \fImetalint\fR hint, and also +a placeholder for future \fIjmake\fR use. It must list three kind of files: +the temporary one which are created for a test, the private UU ones created +in the UU directory for later perusal, and the public ones left in the +root directory of the package. Temporary files must be listed with a +preceding '!' character (meaning "no! they're not re-used later!"), private +UU files should be preceded by a './' (meaning: to use them, say \fI./file\fR, +not just \fIfile\fR), and public ones should be named as-is. +.TP +?T:\fIshell temporaries\fR +This line should list all the shell variables used as temporaries within +the unit's body. This line should be kept accurate, and prevents you from +writing a unit defining a symbol which would be used as a scratch variable +in another unit... +.TP +?LINT:\fIkeyword\fR \fIsymbol_list\fR +Specifies a lint hint. The following keywords are available: +.RS +10 +.TP 15 +.PD 0 +.I change +shell variable ok to be changed +.TP +.I create +persistent file ok to be created by non-special unit +.TP +.I define +shell variables listed are defined in this unit +.TP +.I describe +listed shell variables are described by ?S: +.TP +.I extern +variable known to be externally defined +.TP +.I empty +unit file is empty and kept only as a placeholder. +.TP +.I known +listed C variables are described +.TP +.I nocomment +unit file is special and may miss a leading ': description' line. +.TP +.I nothere +listed names are not here documents (e.g. "1 << foo" in a C program) +.TP +.I set +listed variables are set +.TP +.I use +variables listed are used by this unit +.TP +.I unclosed +listed names of here-documents are not closed in this unit +.TP +.I usefile +listed file is used (do not prepend name with '!' for temporary ones) +.PD +.RS -10 +.SH AUTHORS +Harlan Stenn wrote the first version, based on +Larry Wall's \fImetaconfig\fR from dist 2.0. +.br +Raphael Manfredi rewrote it from scratch for +3.0 with a few enhancements. +.SH FILES +.TP 10 +.PD 0 +LIB/dist/mcon/U/*.U +Public unit files +.TP +U/*.U +Private unit files +.PD +.sp +.in +5 +where LIB is $privlibexp. +.in -5 +.SH BUGS +Maybe. +.SH "SEE ALSO" +metaconfig($manext), metaxref($manext) +!GROK!THIS! +chmod 444 metalint.$manext diff --git a/mcon/man/mxref.SH b/mcon/man/mxref.SH new file mode 100755 index 0000000..b0dbbad --- /dev/null +++ b/mcon/man/mxref.SH @@ -0,0 +1,133 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting mcon/man/metaxref.$manext (with variable substitutions)" +$rm -f metaxref.$manext +$spitshell >metaxref.$manext < +.SH FILES +.TP 10 +.PD 0 +LIB/dist/mcon/U/*.U +Public unit files. +.TP +U/*.U +Private unit files +.TP +I.fui +Lists information sorted by file, unit and item. +.TP +I.uif +Lists information sorted by unit, item and file. +.TP +Obsolete +Lists all the obsolete symbols used by the sources. +.PD +.sp +.in +5 +where LIB is $privlibexp. +.in -5 +.SH BUGS +Metaxref will list among the wanted items all those magic symbols defined +within units on the ?M: lines. Those are relevant only when metaconfig is +invoked with the \fB\-M\fR option. +.SH "SEE ALSO" +metaconfig($manext), metalint($manext) +!GROK!THIS! +chmod 444 metaxref.$manext diff --git a/mcon/mconfig.SH b/mcon/mconfig.SH new file mode 100755 index 0000000..8fb6095 --- /dev/null +++ b/mcon/mconfig.SH @@ -0,0 +1,182 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting mcon/mconfig (with variable substitutions)" +cat >mconfig < +# Key Contributor: Harlan Stenn +# +# $Log: mconfig.SH,v $ +# Revision 3.0.1.5 1995/07/25 14:19:05 ram +# patch56: new -G option +# +# Revision 3.0.1.4 1994/06/20 07:11:04 ram +# patch30: new -L option to override public library path for testing +# +# Revision 3.0.1.3 1994/01/24 14:20:53 ram +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.2 1993/10/16 13:53:10 ram +# patch12: new -M option for magic symbols and confmagic.h production +# +# Revision 3.0.1.1 1993/08/19 06:42:26 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:17 ram +# Baseline for dist 3.0 netwide release. +# + +# Perload ON + +\$MC = '$privlib'; +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +\$grep = '$grep'; +!GROK!THIS! + +$spitshell >>mconfig <<'!NO!SUBS!' +chop($date = `date`); +&profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts("dhkmostvwGMVL:"); + +$MC = $opt_L if $opt_L; # May override public library path +$MC = &tilda_expand($MC); # ~name expansion +chop($WD = `pwd`); # Working directory +chdir $MC || die "Can't chdir to $MC: $!\n"; +chop($MC = `pwd`); # Real metaconfig lib path (no symbolic links) +chdir $WD || die "Can't chdir back to $WD: $!\n"; + +++$opt_k if $opt_d; +++$opt_M if -f 'confmagic.h'; # Force -M if confmagic.h already there + +if ($opt_V) { + print STDERR "metaconfig $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +unlink 'Wanted' unless $opt_w; # Wanted rebuilt if no -w +unlink 'Obsolete' unless $opt_w; # Obsolete file rebuilt if no -w +&readpackage; # Merely get the package's name +&init; # Various initializations +`mkdir .MT 2>&1` unless -d '.MT'; # For private temporary files + +&locate_units; # Fill in @ARGV with a unit list +&extract_dependencies; # Extract dependencies from units +&extract_filenames; # Extract files to be scanned for +&build_wanted; # Build a list of wanted symbols in file Wanted +&build_makefile; # To do the transitive closure of dependencies +&solve_dependencies; # Now run the makefile to close dependency graph +&create_configure; # Create the Configure script and related files +&cosmetic_update; # Update the manifests + +if ($opt_k) { + print "Leaving subdirectory .MT unremoved so you can peruse it.\n" + unless $opt_s; +} else { + `rm -rf .MT 2>&1`; +} +print "Done.\n" unless $opt_s; + +# General initializations +sub init { + &init_except; # Token which have upper-cased letters + &init_keep; # The keep status for built-in interpreter + &init_priority; # Priorities for diadic operators + &init_constants; # Define global constants + &init_depend; # The %Depend array records control line handling +} + +sub init_constants { + $NEWMANI = 'MANIFEST.new'; # List of files to be scanned + $MANI = 'MANIFEST'; # For manifake +} + +# Record the exceptions -- almost all symbols but these are lower case +# We also use three symbols from Unix.U for default file suffixes. +sub init_except { + $Except{'Author'}++; + $Except{'Date'}++; + $Except{'Header'}++; + $Except{'Id'}++; + $Except{'Locker'}++; + $Except{'Log'}++; + $Except{'RCSfile'}++; + $Except{'Revision'}++; + $Except{'Source'}++; + $Except{'State'}++; + $Except{'_a'}++; + $Except{'_o'}++; + $Except{'_exe'}++; +} + +# Print out metaconfig's usage and exits +sub usage { + print STDERR <<'EOH'; +Usage: metaconfig [-dhkmostvwGMV] [-L dir] + -d : debug mode. + -h : print this help message and exits. + -k : keep temporary directory. + -m : assume lots of memory and swap space. + -o : maps obsolete symbols on new ones. + -s : silent mode. + -t : trace symbols as they are found. + -v : verbose mode. + -w : trust Wanted file as being up-to-date. + -G : also provide a GNU configure-like front end. + -L : specify main units repository. + -M : activate production of confmagic.h. + -V : print version number and exits. +EOH + exit 1; +} + +!NO!SUBS! +$grep -v '^;#' pl/locate.pl >>mconfig +$grep -v '^;#' pl/common.pl >>mconfig +$grep -v '^;#' pl/depend.pl >>mconfig +$grep -v '^;#' pl/init.pl >>mconfig +$grep -v '^;#' pl/extract.pl >>mconfig +$grep -v '^;#' pl/files.pl >>mconfig +$grep -v '^;#' pl/wanted.pl >>mconfig +$grep -v '^;#' pl/obsolete.pl >>mconfig +$grep -v '^;#' pl/makefile.pl >>mconfig +$grep -v '^;#' pl/order.pl >>mconfig +$grep -v '^;#' pl/configure.pl >>mconfig +$grep -v '^;#' pl/cosmetic.pl >>mconfig +$grep -v '^;#' pl/eval.pl >>mconfig +$grep -v '^;#' ../pl/package.pl >>mconfig +$grep -v '^;#' ../pl/manifake.pl >>mconfig +$grep -v '^;#' ../pl/tilde.pl >>mconfig +$grep -v '^;#' ../pl/profile.pl >>mconfig +chmod +x mconfig +$eunicefix mconfig diff --git a/mcon/mlint.SH b/mcon/mlint.SH new file mode 100755 index 0000000..7f1f550 --- /dev/null +++ b/mcon/mlint.SH @@ -0,0 +1,136 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting mcon/mlint (with variable substitutions)" +cat >mlint < +# +# $Log: mlint.SH,v $ +# Revision 3.0.1.3 1994/05/06 15:20:42 ram +# patch23: added -L switch to override public unit repository path +# +# Revision 3.0.1.2 1994/01/24 14:21:00 ram +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.1 1993/08/19 06:42:27 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:17 ram +# Baseline for dist 3.0 netwide release. +# + +# Perload ON + +\$MC = '$privlib'; +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +\$grep = '$grep'; +!GROK!THIS! + +$spitshell >>mlint <<'!NO!SUBS!' +&profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts("hklVL:"); + +if ($opt_V) { + print STDERR "metalint $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +chop($date = `date`); +$MC = $opt_L if $opt_L; # May override library path +$MC = &tilda_expand($MC); # ~name expansion +chop($WD = `pwd`); # Working directory +chdir $MC || die "Can't chdir to $MC: $!\n"; +chop($MC = `pwd`); # Real metalint lib path (no symbolic links) +chdir $WD || die "Can't chdir back to $WD: $!\n"; + +&init; # Various initializations +`mkdir .MT 2>&1` unless -d '.MT'; # For private temporary files + +&locate_units; # Fill in @ARGV with a unit list +&extract_dependencies; # Extract dependencies from units +&sanity_checks; # Perform sanity checks + +if ($opt_k) { + print "Leaving subdirectory .MT unremoved so you can peruse it.\n" + unless $opt_s; +} else { + `rm -rf .MT 2>&1`; +} +print "Done.\n" unless $opt_s; + +# General initializations +sub init { + &init_except; # Token which have upper-cased letters + &init_depend; # The %Depend array records control line handling +} + +# Record the exceptions -- all symbols but these are lower case +sub init_except { + $Except{'Author'}++; + $Except{'Date'}++; + $Except{'Header'}++; + $Except{'Id'}++; + $Except{'Locker'}++; + $Except{'Log'}++; + $Except{'RCSfile'}++; + $Except{'Revision'}++; + $Except{'Source'}++; + $Except{'State'}++; +} + +# Print out metalint's usage and exits +sub usage { + print STDERR <>mlint +$grep -v '^;#' pl/lint.pl >>mlint +$grep -v '^;#' pl/init.pl >>mlint +$grep -v '^;#' pl/extract.pl >>mlint +$grep -v '^;#' pl/obsolete.pl >>mlint +$grep -v '^;#' pl/tsort.pl >>mlint +$grep -v '^;#' ../pl/tilde.pl >>mlint +$grep -v '^;#' ../pl/profile.pl >>mlint +chmod +x mlint +$eunicefix mlint diff --git a/mcon/mxref.SH b/mcon/mxref.SH new file mode 100755 index 0000000..06206ee --- /dev/null +++ b/mcon/mxref.SH @@ -0,0 +1,146 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting mcon/mxref (with variable substitutions)" +cat >mxref < +# +# $Log: mxref.SH,v $ +# Revision 3.0.1.3 1997/02/28 16:30:49 ram +# patch61: new -L option to match metaconfig and metalint +# +# Revision 3.0.1.2 1994/01/24 14:21:04 ram +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.1 1993/08/19 06:42:27 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:18 ram +# Baseline for dist 3.0 netwide release. +# + +# Perload ON + +\$MC = '$privlib'; +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +\$grep = '$grep'; +!GROK!THIS! + +$spitshell >>mxref <<'!NO!SUBS!' +&profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts("df:hkmsVL:"); + +chop($date = `date`); +chop($WD = `pwd`); # Working directory +$MC = $opt_L if $opt_L; # May override library path +$MC = &tilda_expand($MC); # ~name expansion +chdir $MC || die "Can't chdir to $MC: $!\n"; +chop($MC = `pwd`); # Real metaxref lib path (no symbolic links) +chdir $WD || die "Can't chdir back to $WD: $!\n"; + +if ($opt_V) { + print STDERR "metaxref $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$NEWMANI = $opt_f || 'MANIFEST.new'; + +&init; # Various initializations +`mkdir .MT 2>&1` unless -d '.MT'; # For private temporary files +unlink 'Obsolete'; # Obsolete file rebuilt + +&locate_units; # Fill in @ARGV with a unit list +&extract_dependencies; # Extract dependencies from units +&extract_filenames; # Get source files from MANIFEST.new +&build_xref; # Parse files, build I.* output + +if ($opt_k) { + print "Leaving subdirectory .MT unremoved so you can peruse it.\n" + unless $opt_s; +} else { + `rm -rf .MT 2>&1`; +} +print "Done.\n" unless $opt_s; + +# General initializations +sub init { + &init_except; # Token which have upper-cased letters + &init_depend; # The %Depend array records control line handling +} + +# Record the exceptions -- all symbols but these are lower case +sub init_except { + $Except{'Author'}++; + $Except{'Date'}++; + $Except{'Header'}++; + $Except{'Id'}++; + $Except{'Locker'}++; + $Except{'Log'}++; + $Except{'RCSfile'}++; + $Except{'Revision'}++; + $Except{'Source'}++; + $Except{'State'}++; +} + +# Print out metaxref's usage and exits +sub usage { + print STDERR <>mxref +$grep -v '^;#' pl/common.pl >>mxref +$grep -v '^;#' pl/xref.pl >>mxref +$grep -v '^;#' pl/files.pl >>mxref +$grep -v '^;#' pl/init.pl >>mxref +$grep -v '^;#' pl/extract.pl >>mxref +$grep -v '^;#' pl/obsolete.pl >>mxref +$grep -v '^;#' pl/xwant.pl >>mxref +$grep -v '^;#' pl/gensym.pl >>mxref +$grep -v '^;#' ../pl/manifake.pl >>mxref +$grep -v '^;#' ../pl/tilde.pl >>mxref +$grep -v '^;#' ../pl/profile.pl >>mxref +chmod +x mxref +$eunicefix mxref diff --git a/mcon/pl/common.pl b/mcon/pl/common.pl new file mode 100644 index 0000000..0d1ea5a --- /dev/null +++ b/mcon/pl/common.pl @@ -0,0 +1,289 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: common.pl,v $ +;# Revision 3.0.1.4 1994/10/29 16:35:01 ram +;# patch36: metaconfig and metaxref ignore ?F: lines from now on +;# +;# Revision 3.0.1.3 1994/05/13 15:29:04 ram +;# patch27: now understands macro definitions in ?H: lines +;# +;# Revision 3.0.1.2 1994/01/24 14:22:54 ram +;# patch16: can now define "internal use only" variables on ?MAKE: lines +;# +;# Revision 3.0.1.1 1993/10/16 13:53:29 ram +;# patch12: added support for ?M: lines and confmagic.h production +;# +;# Revision 3.0 1993/08/18 12:10:19 ram +;# Baseline for dist 3.0 netwide release. +;# +;# The list of all available units is held in @ARGV. We shall parse them and +;# extract the dependencies. A lot of global data structures are filled in +;# during this phase. +;# +;# The following two H tables are used to record each know symbol (i.e. a +;# symbol known by at least one unit), and also how many times this symbol is +;# found in the sources. If an entry for a given key is positive, then the +;# associated symbol (i.e. the key) is wanted and it will be written in the +;# Wanted file. +;# %shmaster{'$sym'} records how many times '$sym' is found in a .SH file +;# %cmaster{'SYM'} records how many times 'SYM' is found in a .c file +;# %cwanted{'SYM'} records the set of necessary shell symbols needed for SYM +;# %mwanted{'sym'} is set of C symbols needed when sym is found in .c file +;# +;# This data structure records the initializations which are requires at the +;# beginning of a Configure script. The initialization only occurs when the +;# symbol is needed. Those symbols will appear in the produced config.sh file, +;# hence the name of "master" symbols. +;# @Master records shell configuration symbols which will appear in config.sh +;# +;# The @Cond array records the conditional shell symbols, i.e. those whose +;# value may be defaulted. They will appear in the initialization section of +;# the Configure script with the default value if they are not otherwise used +;# but Configure needs a suitable value internally. +;# @Cond records symbols which are flagged as conditional in the dependencies +;# %hasdefault{'sym'} is true when the conditional 'sym' has a default value +;# +;# The %Obsolete array records the obsolecence for units or symbols. The key +;# ends with .U for units, otherwise it is a symbol. Unit's obsolescence is +;# flagged with a ?O: line (the line being the message which will be issued +;# when the unit is used) while symbol obsolecence is indicated on the leading +;# ?C: or ?S: line, between parenthesis. In that case, the value stored is the +;# new symbol which should be used insted. +;# %Obsolete{'unit.U'} is a message to be printed when obsolete unit is used +;# %Obsolete{'sym'} is the symbol to be used in place of the obsoleted 'sym' +;# +;# The $dependencies variable is used to record the dependencies extracted +;# from the units (?MAKE: line). +;# +;# During the dependency extraction. some files are produced in the .MT dir. +;# Init.U records the initialization wanted +;# Config_h.U records the informations which could go in config.h.SH +;# Extern.U records the libraries and includes wanted by each symbol +;# +;# This file is shared by both metaconfig and metaxref +;# +# Initialize the extraction process by setting some variables. +# We return a string to be eval to do more customized initializations. +sub init_extraction { + open(INIT, ">$WD/.MT/Init.U") || + die "Can't create .MT/Init.U\n"; + open(CONF_H, ">$WD/.MT/Config_h.U") || + die "Can't create .MT/Config_h.U\n"; + open(EXTERN, ">$WD/.MT/Extern.U") || + die "Can't create .MT/Extern.U\n"; + open(MAGIC_H, ">$WD/.MT/Magic_h.U") || + die "Can't create .MT/Magic_h.U\n"; + + $c_symbol = ''; # Current symbol seen in ?C: lines + $s_symbol = ''; # Current symbol seen in ?S: lines + $m_symbol = ''; # Current symbol seen in ?M: lines + $heredoc = ''; # Last "here" document symbol seen + $heredoc_nosubst = 0; # True for <<'EOM' here docs + $condlist = ''; # List of conditional symbols + $defined = ''; # List of defined symbols in the unit + $body = ''; # No procedure to handle body + $ending = ''; # No procedure to clean-up +} + +# End the extraction process +sub end_extraction { + close EXTERN; # External dependencies (libraries, includes...) + close CONF_H; # C symbol definition template + close INIT; # Required initializations + close MAGIC; # Magic C symbol redefinition templates + + print $dependencies if $opt_v; # Print extracted dependencies +} + +# Process the ?MAKE: line +sub p_make { + local($_) = @_; + local(@ary); # Locally defined symbols + local(@dep); # Dependencies + if (/^[\w+ ]*:/) { # Main dependency rule + s|^\s*||; # Remove leading spaces + chop; + s/:(.*)//; + @dep = split(' ', $1); # Dependencies + @ary = split(' '); # Locally defined symbols + foreach $sym (@ary) { + # Symbols starting with a '+' are meant for internal use only. + next if $sym =~ s/^\+//; + # Only sumbols starting with a lowercase letter are to + # appear in config.sh, excepted the ones listed in Except. + if ($sym =~ /^[_a-z]/ || $Except{$sym}) { + $shmaster{"\$$sym"} = undef; + push(@Master,"?$unit:$sym=''\n"); # Initializations + } + } + $condlist = ''; # List of conditional symbols + local($sym); # Symbol copy, avoid @dep alteration + foreach $dep (@dep) { + if ($dep =~ /^\+[A-Za-z]/) { + ($sym = $dep) =~ s|^\+||; + $condlist .= "$sym "; + push(@Cond, $sym) unless $condseen{$sym}; + $condseen{$sym}++; # Conditionally wanted + } + } + # Append to already existing dependencies. The 'defined' variable + # is set for &write_out, used to implement ?L: and ?I: canvas. It is + # reset each time a new unit is parsed. + # NB: leading '+' for defined symbols (internal use only) have been + # removed at this point, but conditional dependencies still bear it. + $defined = join(' ', @ary); # Symbols defined by this unit + $dependencies .= $defined . ':' . join(' ', @dep) . "\n"; + $dependencies .= " -cond $condlist\n" if $condlist; + } else { + $dependencies .= $_; # Building rules + } +} + +# Process the ?O: line +sub p_obsolete { + local($_) = @_; + $Obsolete{"$unit.U"} .= $_; # Message(s) to print if unit is used +} + +# Process the ?S: lines +sub p_shell { + local($_) = @_; + unless ($s_symbol) { + if (/^(\w+).*:/) { + $s_symbol = $1; + print " ?S: $s_symbol\n" if $opt_d; + } else { + warn "\"$file\", line $.: syntax error in ?S: construct.\n"; + $s_symbol = $unit; + return; + } + # Deal with obsolete symbol list (enclosed between parenthesis) + &record_obsolete("\$$_") if /\(/; + } + m|^\.\s*$| && ($s_symbol = ''); # End of comment +} + +# Process the ?C: lines +sub p_c { + local($_) = @_; + unless ($c_symbol) { + if (s/^(\w+)\s*~\s*(\S+)\s*(.*):/$1 $3:/) { + # The ~ operator aliases the main C symbol to another symbol which + # is to be used instead for definition in config.h. That is to say, + # the line '?C:SYM ~ other:' would look for symbol 'other' instead, + # and the documentation for symbol SYM would only be included in + # config.h if 'other' were actually wanted. + $c_symbol = $2; # Alias for definition in config.h + print " ?C: $1 ~ $c_symbol\n" if $opt_d; + } elsif (/^(\w+).*:/) { + # Default behaviour. Include in config.h if symbol is needed. + $c_symbol = $1; + print " ?C: $c_symbol\n" if $opt_d; + } else { + warn "\"$file\", line $.: syntax error in ?C: construct.\n"; + $c_symbol = $unit; + return; + } + # Deal with obsolete symbol list (enclosed between parenthesis) and + # make sure that list do not appear in config.h.SH by removing it. + &record_obsolete("$_") if /\(/; + s/\s*\(.*\)//; # Get rid of obsolete symbol list + } + s|^(\w+)\s*|?$c_symbol:/* $1| || # Start of comment + (s|^\.\s*$|?$c_symbol: */\n| && ($c_symbol = '', 1)) || # End of comment + s|^(.*)|?$c_symbol: *$1|; # Middle of comment + &p_config("$_"); # Add comments to config.h.SH +} + +# Process the ?H: lines +sub p_config { + local($_) = @_; + local($constraint); # Constraint to be used for inclusion + ++$old_version if s/^\?%1://; # Old version + if (s/^\?(\w+)://) { # Remove leading '?var:' + $constraint = $1; # Constraint is leading '?var' + } else { + $constraint = ''; # No constraint + } + if (/^#.*\$/) { # Look only for cpp lines + if (m|^#\$(\w+)\s+(\w+).*\$(\w+)|) { + # Case: #$d_var VAR "$var" + $constraint = $2 unless $constraint; + print " ?H: ($constraint) #\$$1 $2 \"\$$3\"\n" if $opt_d; + $cmaster{$2} = undef; + $cwanted{$2} = "$1\n$3"; + } elsif (m|^#define\s+(\w+)\((.*)\)\s+\$(\w+)|) { + # Case: #define VAR(x) $var + $constraint = $1 unless $constraint; + print " ?H: ($constraint) #define $1($2) \$$3\n" if $opt_d; + $cmaster{$1} = undef; + $cwanted{$1} = $3; + } elsif (m|^#\$define\s+(\w+)|) { + # Case: #$define VAR + $constraint = $1 unless $constraint; + print " ?H: ($constraint) #define $1\n" if $opt_d; + $cmaster{$1} = undef; + $cwanted{$1} = "define\n$unit"; + } elsif (m|^#\$(\w+)\s+(\w+)|) { + # Case: #$d_var VAR + $constraint = $2 unless $constraint; + print " ?H: ($constraint) #\$$1 $2\n" if $opt_d; + $cmaster{$2} = undef; + $cwanted{$2} = $1; + } elsif (m|^#define\s+(\w+).*\$(\w+)|) { + # Case: #define VAR "$var" + $constraint = $1 unless $constraint; + print " ?H: ($constraint) #define $1 \"\$$2\"\n" if $opt_d; + $cmaster{$1} = undef; + $cwanted{$1} = $2; + } else { + $constraint = $unit unless $constraint; + print " ?H: ($constraint) $_" if $opt_d; + } + } else { + print " ?H: ($constraint) $_" if $opt_d; + } + # If not a single ?H:. line, add the leading constraint + s/^\.// || s/^/?$constraint:/; + print CONF_H; +} + +# Process the ?M: lines +sub p_magic { + local($_) = @_; + unless ($m_symbol) { + if (/^(\w+):\s*([\w\s]*)\n$/) { + # A '?M:sym:' line implies a '?W:%<:sym' since we'll need to know + # about the wantedness of sym later on when building confmagic.h. + # Buf is sym is wanted, then the C symbol dependencies have to + # be triggered. That is done by introducing sym in the mwanted + # array, known by the Wanted file construction process... + $m_symbol = $1; + print " ?M: $m_symbol\n" if $opt_d; + $mwanted{$m_symbol} = $2; # Record C dependencies + &p_wanted("$unit:$m_symbol"); # Build fake ?W: line + } else { + warn "\"$file\", line $.: syntax error in ?M: construct.\n"; + } + return; + } + (s/^\.\s*$/?$m_symbol:\n/ && ($m_symbol = '', 1)) || # End of block + s/^/?$m_symbol:/; + print MAGIC_H; # Definition goes to confmagic.h + print " ?M: $_" if $opt_d; +} + +sub p_ignore {} # Ignore comment line +sub p_lint {} # Ignore lint directives +sub p_visible {} # No visible checking in metaconfig +sub p_temp {} # No temporary variable control +sub p_file {} # Ignore produced file directives (for now) + diff --git a/mcon/pl/configure.pl b/mcon/pl/configure.pl new file mode 100644 index 0000000..f78925f --- /dev/null +++ b/mcon/pl/configure.pl @@ -0,0 +1,245 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: configure.pl,v $ +;# Revision 3.0.1.5 1995/01/30 14:47:15 ram +;# patch49: removed old "do name()" routine call constructs +;# +;# Revision 3.0.1.4 1995/01/11 15:40:02 ram +;# patch45: now allows @if statements for the add.Config_sh unit inclusion +;# +;# Revision 3.0.1.3 1994/05/06 15:21:23 ram +;# patch23: cleaned up the 'prepend' command +;# +;# Revision 3.0.1.2 1994/01/24 14:23:21 ram +;# patch16: new general <\$variable> macro substitutions in wiped units +;# +;# Revision 3.0.1.1 1993/10/16 13:54:02 ram +;# patch12: added support for ?M: lines and confmagic.h production +;# patch12: new Makefile command cm_h_weed +;# +;# Revision 3.0 1993/08/18 12:10:20 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# This file is the heart of metaconfig. We generate a Configure script using +;# the informations gathered in the @cmdwanted array. A unit is expected to have +;# its path written in the %Unit array (indexing is done with the unit's name +;# without the .U extension). +;# +;# The units are run through a built-in interpreter before being written to +;# the Configure script. +;# +# Create the Configure script +sub create_configure { + print "Creating Configure...\n" unless $opt_s; + open(CONFIGURE,">Configure") || die "Can't create Configure: $!\n"; + open(CONF_H,">config_h.SH") || die "Can't create config_h.SH: $!\n"; + if ($opt_M) { + open(MAGIC_H,">confmagic.h") || die "Can't create confmagic.h: $!\n"; + } + + chdir('.MT') || die "Can't cd to .MT: $!\n"; + for (@cmdwanted) { + &process_command($_); # Run the makefile command + } + chdir($WD) || die "Can't cd back to $WD\n"; + close CONFIGURE; + print CONF_H "#endif\n"; # Close the opened #ifdef (see Config_h.U) + print CONF_H "!GROK!THIS!\n"; + close CONF_H; + if ($opt_M) { + print MAGIC_H "#endif\n"; # Close the opened #ifdef (see Magic_h.U) + close MAGIC_H; + } + `chmod +x Configure`; +} + +# Process a Makefile 'pick' command +sub process_command { + local($cmd, $target, $unit_name) = split(' ', $_[0]); + local($name) = $unit_name . '.U'; # Restore missing .U + local($file) = $name; # Where unit is located + unless ($file =~ m|^\./|) { # Unit produced earlier by metaconfig + $file = $Unit{$unit_name}; # Fetch unit from U directory + } + if (defined $Obsolete{$name}) { # Signal use of an obsolete unit + warn "\tObsolete unit $name is used:\n"; + local(@msg) = split(/\n/, $Obsolete{$name}); + foreach $msg (@msg) { + warn "\t $msg\n"; + } + } + die "Can't open $file.\n" unless open(UNIT, $file); + print "\t$cmd $file\n" if $opt_v; + &init_interp; # Initializes the interpreter + + # The 'add' command adds the unit to Configure. + if ($cmd eq 'add') { + while () { + print CONFIGURE unless &skipped || !&interpret($_); + } + } + + # The 'weed' command adds the unit to Configure, but + # makes some tests for the lines starting with '?' or '%'. + # These lines are kept only if the symbol is wanted. + elsif ($cmd eq 'weed') { + while () { + if (/^\?(\w+):/) { + s/^\?\w+:// if $symwanted{$1}; + } + if (/^%(\w+):/) { + s/^%\w+:// if $condwanted{$1}; + } + print CONFIGURE unless &skipped || !&interpret($_); + } + } + + # The 'wipe' command adds the unit to Configure, but + # also substitues some hardwired macros. + elsif ($cmd eq 'wipe') { + while () { + s//$package/g; + s//$maintloc/g; + s//$version/g; # This is metaconfig's version + s//$patchlevel/g; # And patchlevel information + s//$date/g; + s//$baserev/g; + s/<\$(\w+)>/eval("\$$1")/ge; # <$var> -> $var substitution + print CONFIGURE unless &skipped || !&interpret($_); + } + } + + # The 'add.Null' command adds empty initializations + # to Configure for all the shell variable used. + elsif ($cmd eq 'add.Null') { + for (sort @Master) { + if (/^\?(\w+):/) { + s/^\?\w+:// if $symwanted{$1}; + } + print CONFIGURE unless &skipped; + } + for (sort @Cond) { + print CONFIGURE "$_=''\n" + unless $symwanted{$_} || $hasdefault{$_}; + } + while () { + print CONFIGURE unless &skipped || !&interpret($_); + } + print CONFIGURE "CONFIG=''\n\n"; + } + + # The 'add.Config_sh' command fills in the production of + # the config.sh script within Configure. Only the used + # variable are added, the conditional ones are skipped. + elsif ($cmd eq 'add.Config_sh') { + while () { + print CONFIGURE unless &skipped || !&interpret($_); + } + for (sort @Master) { + if (/^\?(\w+):/) { + # Can't use $shmaster, because config.sh must + # also contain some internal defaults used by + # Configure (e.g. nm_opt, libc, etc...). + s/^\?\w+:// if $symwanted{$1}; + } + s/^(\w+)=''/$1='\$$1'/; + print CONFIGURE unless &skipped; + } + } + + # The 'close.Config_sh' command adds the final EOT line at + # the end of the here-document construct which produces the + # config.sh file within Configure. + elsif ($cmd eq 'close.Config_sh') { + print CONFIGURE "EOT\n\n"; # Ends up file + } + + # The 'c_h_weed' command produces the config_h.SH file. + # Only the necessary lines are kept. If no conditional line is + # ever printed, then the file is useless and will be removed. + elsif ($cmd eq 'c_h_weed') { + $printed = 0; + while () { + if (/^\?(\w+):/) { + s/^\?\w+:// if $cmaster{$1} || $symwanted{$1}; + } + unless (&skipped || !&interpret($_)) { + if (/^$/) { + print CONF_H "\n" if $printed; + $printed = 0; + } else { + print CONF_H; + ++$printed; + } + } + } + } + + # The 'cm_h_weed' command produces the confmagic.h file. + # Only the necessary lines are kept. If no conditional line is + # ever printed, then the file is useless and will be removed. + elsif ($cmd eq 'cm_h_weed') { + if ($opt_M) { + $printed = 0; + while () { + if (/^\?(\w+):/) { + s/^\?\w+:// if $cmaster{$1} || $symwanted{$1}; + } + unless (&skipped || !&interpret($_)) { + if (/^$/) { + print MAGIC_H "\n" if $printed; + $printed = 0; + } else { + print MAGIC_H; + ++$printed; + } + } + } + } + } + + # The 'prepend' command will add the content of the target to + # the current file (held in $file, the one which UNIT refers to), + # if the file is not empty. + elsif ($cmd eq 'prepend') { + if (-s $file) { + open(PREPEND, ">.prepend") || + die "Can't create .MT/.prepend.\n"; + open(TARGET, $Unit{$target}) || + die "Can't open $Unit{$target}.\n"; + while () { + print PREPEND unless &skipped; + } + print PREPEND ; # Now add original file contents + close PREPEND; + close TARGET; + rename('.prepend', $file) || + die "Can't rename .prepend into $file.\n"; + } + } + + # Command not found + else { + die "Unrecognized command from Makefile: $cmd\n"; + } + &check_state; # Make sure there are no pending statements + close UNIT; +} + +# Skip lines starting with ? or %, including all the following continuation +# lines, if any. Return 0 if the line was not to be skipped, 1 otherwise. +sub skipped { + return 0 unless /^\?|^%/; + &complete_line(UNIT) if /\\\s*$/; # Swallow continuation lines + 1; +} + diff --git a/mcon/pl/cosmetic.pl b/mcon/pl/cosmetic.pl new file mode 100644 index 0000000..bfb9575 --- /dev/null +++ b/mcon/pl/cosmetic.pl @@ -0,0 +1,114 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: cosmetic.pl,v $ +;# Revision 3.0.1.3 1995/07/25 14:19:16 ram +;# patch56: added support for new -G option +;# +;# Revision 3.0.1.2 1995/01/30 14:47:52 ram +;# patch49: forgot to localize the spaces variable +;# +;# Revision 3.0.1.1 1993/11/10 17:39:10 ram +;# patch14: now also adds confmagic.h if not in MANIFEST.new already +;# patch14: new functions mani_add and mani_remove to factorize code +;# +;# Revision 3.0 1993/08/18 12:10:20 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +# Update the MANIFEST.new file if necessary +sub cosmetic_update { + # Check for an "empty" config_h.SH (2 blank lines only). This test relies + # on the actual text held in Config_h.U. If the unit is modified, then the + # following might need adjustments. + local($blank_lines) = 0; + local($spaces) = 0; + open(CONF_H, 'config_h.SH') || die "Can't open config_h.SH\n"; + while() { + ++$blank_lines if /^$/; + } + unlink 'config_h.SH' unless $blank_lines > 3; + + open(NEWMANI,$NEWMANI); + $_ = ; + /(\S+\s+)\S+/ && ($spaces = length($1)); # Spaces wanted + close NEWMANI; + $spaces = 29 if ($spaces < 12); # Default value + open(NEWMANI,$NEWMANI); + $/ = "\001"; # Swallow the whole file + $_ = ; + $/ = "\n"; + close NEWMANI; + + $* = 1; # Multi-line matching + + &mani_add('Configure', 'Portability tool', $spaces) unless /^Configure\b/; + &mani_add('config_h.SH', 'Produces config.h', $spaces) + unless /^config_h\.SH\b/ || !-f 'config_h.SH'; + &mani_add('confmagic.h', 'Magic symbol remapping', $spaces) + if $opt_M && !/^confmagic\.h\b/; + + &mani_remove('config_h.SH') if /^config_h\.SH\b/ && !-f 'config_h.SH'; + &mani_remove('confmagic.h') if /^confmagic.h\b/ && !$opt_M; + + if ($opt_G) { # Want a GNU-like configure wrapper + &add_configure; + &mani_add('configure', 'GNU configure-like wrapper', $spaces) + if !/^configure\s/ && -f 'configure'; + } else { + &mani_remove('configure') if /^configure\s/ && !-f 'configure'; + } + + $* = 0; +} + +# Add file to MANIFEST.new, with properly indented comment +sub mani_add { + local($file, $comment, $spaces) = @_; + print "Adding $file to your $NEWMANI file...\n" unless $opt_s; + open(NEWMANI, ">>$NEWMANI") || warn "Can't add $file to $NEWMANI: $!\n"; + local($blank) = ' ' x ($spaces - length($file)); + print NEWMANI "${file}${blank}${comment}\n"; + close NEWMANI; +} + +# Remove file from MANIFEST.new +sub mani_remove { + local($file) = @_; + print "Removing $file from $NEWMANI...\n" unless $opt_s; + unless (open(NEWMANI, ">$NEWMANI.x")) { + warn "Can't create backup $NEWMANI copy: $!\n"; + return; + } + unless (open(OLDMANI, $NEWMANI)) { + warn "Can't open $NEWMANI: $!\n"; + return; + } + local($_); + while () { + print NEWMANI unless /^$file\b/ + } + close OLDMANI; + close NEWMANI; + rename("$NEWMANI.x", $NEWMANI) || + warn "Couldn't restore $NEWMANI from $NEWMANI.x\n"; +} + +# Copy GNU-like configure wrapper to the package root directory +sub add_configure { + if (-f "$MC/configure") { + print "Copying GNU configure-like front end...\n" unless $opt_s; + system "cp $MC/configure ./configure"; + `chmod +x configure`; + } else { + warn "Can't locate $MC/configure: $!\n"; + } +} + diff --git a/mcon/pl/depend.pl b/mcon/pl/depend.pl new file mode 100644 index 0000000..fc88f1a --- /dev/null +++ b/mcon/pl/depend.pl @@ -0,0 +1,138 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: depend.pl,v $ +;# Revision 3.0.1.3 1995/09/25 09:18:56 ram +;# patch59: new ?Y: directive to change unit layout +;# +;# Revision 3.0.1.2 1994/10/29 16:35:23 ram +;# patch36: added various escapes in strings for perl5 support +;# +;# Revision 3.0.1.1 1993/10/16 13:54:35 ram +;# patch12: added minimal support for ?P: lines (not ready yet) +;# +;# Revision 3.0 1993/08/18 12:10:21 ram +;# Baseline for dist 3.0 netwide release. +;# +;# Metaconfig-dependent part of the dependency extraction. +;# +# Process the ?W: lines +sub p_wanted { + # Syntax is ?W:: + local($active) = $_[0] =~ /^([^:]*):/; # Symbols to activate + local($look_symbols) = $_[0] =~ /:(.*)/; # When those are used + local(@syms) = split(/ /, $look_symbols); # Keep original spacing info + $active =~ s/\s+/\n/g; # One symbol per line + + # Concatenate quoted strings, so saying something like 'two words' will + # be introduced as one single symbol "two words". + local(@symbols); # Concatenated symbols to look for + local($concat) = ''; # Concatenation buffer + foreach (@syms) { + if (s/^\'//) { + $concat = $_; + } elsif (s/\'$//) { + push(@symbols, $concat . ' ' . $_); + $concat = ''; + } else { + push(@symbols, $_) unless $concat; + $concat .= ' ' . $_ if $concat; + } + } + + # Now record symbols in master and wanted tables + foreach (@symbols) { + $cmaster{$_} = undef; # Asks for look-up in C files + $cwanted{$_} = "$active" if $active; # Shell symbols to activate + } +} + +# Process the ?INIT: lines +sub p_init { + local($_) = @_; + print INIT "?$unit:", $_; # Wanted only if unit is loaded +} + +# Process the ?D: lines +sub p_default { + local($_) = @_; + s/^([A-Za-z_]+)=(.*)/\@if !$1\n%$1:$1=$2\n\@define $1\n\@end/ + && ($hasdefault{$1}++, print INIT $_); +} + +# Process the ?P: lines +sub p_public { + local($_) = @_; + local($csym); # C symbol(s) we're trying to look at + local($nosym); # List of symbol(s) which mustn't be wanted + local($cfile); # Name of file implementing csym (no .ext) + ($csym, $nosym, $cfile) = /([^()]+)\s*(\(.*\))\s*:\s*(\S+)/; + unless ($csym eq '' || $cfile eq '') { + # Add dependencies for each C symbol, of the form: + # -pick public + # and the file will be added to config.c whenever sym is wanted and + # none of the notdef symbols is wanted. + foreach $sym (split(' ', $csym)) { + $dependencies .= "\t-pick public $sym $cfile $nosym\n"; + } + } +} + +# Process the ?Y: lines +# Valid layouts are for now are: top, bottom, default. +# +# NOTA BENE: +# This routine relies on the $defined variable, a global variable set +# during the ?MAKE: processing, which lists all the defined symbols in +# the unit (the optional leading '+' for internal symbols has been removed +# if present). +# +# The routine fills up a %Layout table, indexed by symbol, yielding the +# layout imposed to this unit. That table will then be used later on when +# we sort wanted symbols for the Makefile. +sub p_layout { + local($_) = @_; + local($layout) = /^\s*(\w+)/; + $layout =~ tr/A-Z/a-z/; # Case is not significant for layouts + unless (defined $Lcmp{$layout}) { + warn "\"$file\", line $.: unknown layout directive '$layout'.\n"; + return; + } + foreach $sym (split(' ', $defined)) { + $Layout{$sym} = $Lcmp{$layout}; + } +} + +# Process the ?L: lines +# There should not be any '-l' in front of the library name +sub p_library { + &write_out("L:$_"); +} + +# Process the ?I: lines +sub p_include { + &write_out("I:$_"); +} + +# Write out line in file Extern.U. The information recorded there has the +# following prototypical format: +# ?symbol:L:inet bsd +# If 'symbol' is wanted, then 'inet bsd' will be added to $libswanted. +sub write_out { + local($_) = @_; + local($target) = $defined; # By default, applies to defined symbols + $target = $1 if s/^(.*)://; # List is qualified "?L:target:symbols" + local(@target) = split(' ', $target); + chop; + foreach $key (@target) { + print EXTERN "?$key:$_\n"; # EXTERN file defined in xref.pl + } +} + diff --git a/mcon/pl/eval.pl b/mcon/pl/eval.pl new file mode 100644 index 0000000..c4c1d76 --- /dev/null +++ b/mcon/pl/eval.pl @@ -0,0 +1,300 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: eval.pl,v $ +;# Revision 3.0.1.1 1995/01/30 14:48:37 ram +;# patch49: removed old "do name()" routine call constructs +;# +;# Revision 3.0 1993/08/18 12:10:22 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# The built-in interpreter +;# +package interpreter; + +# States used by our interpeter -- in sync with @Keep +sub main'init_keep { + # Status in which we keep lines -- $Keep[$status] + @Keep = (0, 1, 1, 0, 1); + + # Available status ($status) + $SKIP = 0; + $IF = 1; + $ELSE = 2; + $NOT = 3; + $OUT = 4; +} + +# Priorities for operators -- magic numbers :-) +sub main'init_priority { + $Priority{'&&'} = 4; + $Priority{'||'} = 3; +} + +# Initializes the state stack of the interpreter +sub main'init_interp { + @state = (); + push(@state, $OUT); +} + +# Print error messages -- asssumes $unit and $. correctly set. +sub error { + warn "\"$main'file\", line $.: @_.\n"; +} + +# If some states are still in the stack, warn the user +sub main'check_state { + &error("one statement pending") if $#state == 1; + &error("$#state statements pending") if $#state > 1; +} + +# Add a value on the stack, modified by all the monadic operators. +# We use the locals @val and @mono from eval_expr. +sub push_val { + local($val) = shift(@_); + while ($#mono >= 0) { + # Cheat... the only monadic operator is '!'. + pop(@mono); + $val = !$val; + } + push(@val, $val); +} + +# Execute a stacked operation, leave result in stack. +# We use the locals @val and @op from eval_expr. +# If the value stack holds only one operand, do nothing. +sub execute { + return unless $#val > 0; + local($op) = pop(@op); + local($val1) = pop(@val); + local($val2) = pop(@val); + push(@val, eval("$val1 $op $val2") ? 1: 0); +} + +# Given an operator, either we add it in the stack @op, because its +# priority is lower than the one on top of the stack, or we first execute +# the stacked operations until we reach the end of stack or an operand +# whose priority is lower than ours. +# We use the locals @val and @op from eval_expr. +sub update_stack { + local($op) = shift(@_); # Operator + if (!$Priority{$op}) { + &error("illegal operator $op"); + return; + } else { + if ($#val < 0) { + &error("missing first operand for '$op' (diadic operator)"); + return; + } + # Because of the special behaviour of do-SUBR with the while modifier, + # I'm using a while-BLOCK construct. I consider this to be a bug of perl + # 4.0 PL19, although it is clearly documented in the man page. + while ( + $Priority{$op[$#op]} > $Priority{$op} # Higher priority op + && $#val > 0 # At least 2 values + ) { + &execute; # Execute an higher priority stacked operation + } + push(@op, $op); # Everything at higher priority has been executed + } +} + +# This is the heart of our little interpreter. Here, we evaluate +# a logical expression and return its value. +sub eval_expr { + local(*expr) = shift(@_); # Expression to parse + local(@val) = (); # Stack of values + local(@op) = (); # Stack of diadic operators + local(@mono) =(); # Stack of monadic operators + local($tmp); + $_ = $expr; + while (1) { + s/^\s+//; # Remove spaces between words + # The '(' construct + if (s/^\(//) { + &push_val(&eval_expr(*_)); + # A final '\' indicates an end of line + &error("missing final parenthesis") if !s/^\\//; + } + # Found a ')' or end of line + elsif (/^\)/ || /^$/) { + s/^\)/\\/; # Signals: left parenthesis found + $expr = $_; # Remove interpreted stuff + &execute() while $#val > 0; # Executed stacked operations + while ($#op >= 0) { + $_ = pop(@op); + &error("missing second operand for '$_' (diadic operator)"); + } + return $val[0]; + } + # A perl statement '{{' + elsif (s/^\{\{//) { + if (s/^(.*)\}\}//) { + &push_val((system + ('perl','-e', "if ($1) {exit 0;} else {exit 1;}" + ))? 0 : 1); + } else { + &error("incomplete perl statement"); + } + } + # A shell statement '{' + elsif (s/^\{//) { + if (s/^(.*)\}//) { + &push_val((system + ("if $1 >/dev/null 2>&1; then exit 0; else exit 1; fi" + ))? 0 : 1); + } else { + &error("incomplete shell statement"); + } + } + # Operator '||' and '&&' + elsif (s/^(\|\||&&)//) { + $tmp = $1; # Save for perl5 (Dataloaded update_stack) + &update_stack($tmp); + } + # Unary operator '!' + elsif (s/^!//) { + push(@mono,'!'); + } + # Everything else is a test for a defined value + elsif (s/^([\?%]?\w+)//) { + $tmp = $1; + # Test for wanted + if ($tmp =~ s/^\?//) { + &push_val(($main'symwanted{$tmp})? 1 : 0); + } + # Test for conditionally wanted + elsif ($tmp =~ s/^%//) { + &push_val(($main'condwanted{$tmp})? 1 : 0); + } + # Default: test for definition (see op @define) + else { + &push_val(( + $main'symwanted{$tmp} || + $main'cmaster{$tmp} || + $main'userdef{$tmp}) ? 1 : 0); + } + } + # An error occured -- we did not recognize the expression + else { + s/^([^\s\(\)\{\|&!]+)//; # Skip until next meaningful char + } + } +} + +# Given an expression in a '@' command, returns a boolean which is +# the result of the evaluation. Evaluate is collecting all the lines +# in the expression into a single string, and then calls eval_expr to +# really evaluate it. +sub evaluate { + local($val); # Value returned + local($expr) = ""; # Expression to be parsed + chop; + while (s/\\$//) { # While end of line escaped + $expr .= $_; + $_ = ; # Fetch next line + unless ($_) { + &error("EOF in expression"); + last; + } + chop; + } + $expr .= $_; + while ($expr ne '') { + $val = &eval_expr(*expr); # Expression will be modified + # We return from eval_expr either when a closing parenthisis + # is found, or when the expression has been fully analysed. + &error("extra closing parenthesis ignored") if $expr ne ''; + } + $val; +} + +# Given a line, we search for commands (lines starting with '@'). +# If there is no command in the line, then we return the boolean state. +# Otherwise, the command is analysed and a new state is computed. +# The returned value of interpret is 1 if the line is to be printed. +sub main'interpret { + local($value); + local($status) = $state[$#state]; # Current status + if (s|^\s*@\s*(\w+)\s*(.*)|$2|) { + local($cmd) = $1; + $cmd =~ y/A-Z/a-z/; # Canonicalize to lower case + # The 'define' command + if ($cmd eq 'define') { + chop; + $userdef{$_}++ if $Keep[$status]; + return 0; + } + # The 'if' command + elsif ($cmd eq 'if') { + # We always evaluate, in order to find possible errors + $value = &evaluate($_); + if (!$Keep[$status]) { + # We have to skip until next 'end' + push(@state, $SKIP); # Record structure + return 0; + } + if ($value) { # True + push(@state, $IF); + return 0; + } else { # False + push(@state, $NOT); + return 0; + } + } + # The 'else' command + elsif ($cmd eq 'else') { + &error("expression after 'else' ignored") if /\S/; + $state[$#state] = $SKIP if $state[$#state] == $IF; + return 0 if $state[$#state] == $SKIP; + if ($state[$#state] == $OUT) { + &error("unexpected 'else'"); + return 0; + } + $state[$#state] = $ELSE; + return 0; + } + # The 'elsif' command + elsif ($cmd eq 'elsif') { + # We always evaluate, in order to find possible errors + $value = &evaluate($_); + $state[$#state] = $SKIP if $state[$#state] == $IF; + return 0 if $state[$#state] == $SKIP; + if ($state[$#state] == $OUT) { + &error("unexpected 'elsif'"); + return 0; + } + if ($value) { # True + $state[$#state] = $IF; + return 0; + } else { # False + $state[$#state] = $NOT; + return 0; + } + } + # The 'end' command + elsif ($cmd eq 'end') { + &error("expression after 'end' ignored") if /\S/; + pop(@state); + &error("unexpected 'end'") if $#state < 0; + return 0; + } + # Unknown command + else { + &error("unknown command '$cmd'"); + return 0; + } + } + $Keep[$status]; +} + +package main; + diff --git a/mcon/pl/extract.pl b/mcon/pl/extract.pl new file mode 100644 index 0000000..385b751 --- /dev/null +++ b/mcon/pl/extract.pl @@ -0,0 +1,109 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: extract.pl,v $ +;# Revision 3.0.1.1 1994/05/06 15:21:43 ram +;# patch23: now saves the last unit line value for metalint +;# +;# Revision 3.0 1993/08/18 12:10:22 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# This is the heart of the dependency extractor. Each control line is +;# processed. The dependencies are stored in $dependencies. +;# +# Extract dependencies from units held in @ARGV +sub extract_dependencies { + local($proc); # Procedure used to handle a ctrl line + local($file); # Current file scanned + local($dir, $unit); # Directory and unit's name + local($old_version) = 0; # True when old-version unit detected + local($mc) = "$MC/U"; # Public metaconfig directory + local($line); # Last processed line for metalint + + printf "Extracting dependency lists from %d units...\n", $#ARGV+1 + unless $opt_s; + + chdir $WD; # Back to working directory + &init_extraction; # Initialize extraction files + $dependencies = ' ' x (50 * @ARGV); # Pre-extend + $dependencies = ''; + + # We do not want to use the <> construct here, because we need the + # name of the opened files (to get the unit's name) and we want to + # reset the line number for each files, and do some pre-processing. + + file: while ($file = shift(@ARGV)) { + close FILE; # Reset line number + $old_version = 0; # True if unit is an old version + if (open(FILE, $file)) { + ($dir, $unit) = ('', $file) + unless ($dir, $unit) = ($file =~ m|(.*)/(.*)|); + $unit =~ s|\.U$||; # Remove extension + } else { + warn("Can't open $file.\n"); + } + # If unit is in the standard public directory, keep only the unit name + $file = "$unit.U" if $dir eq $mc; + print "$dir/$unit.U:\n" if $opt_d; + line: while () { + $line = $_; # Save last processed unit line + if (s/^\?([\w\-]+)://) { # We may have found a control line + $proc = $Depend{$1}; # Look for a procedure to handle it + unless ($proc) { # Unknown control line + $proc = $1; # p_unknown expects symbol in '$proc' + eval '&p_unknown'; # Signal error (metalint only) + next line; # And go on next line + } + # Long lines may be escaped with a final backslash + $_ .= &complete_line(FILE) if s/\\\s*$//; + # Run macros substitutions + s/%)); + next file; + } + } + } continue { + warn(" Warning: $file is a pre-3.0 version.\n") if $old_version; + &$ending($line) if $ending; # Post-processing for metalint + } + + &end_extraction; # End the extraction process +} + +# The first line was escaped with a final \ character. Every following line +# is to be appended to it (until we found a real \n not escaped). Note that +# the leading spaces of the continuation line are removed, so any space should +# be added before the former \ if needed. +sub complete_line { + local($file) = @_; # File where lines come from + local($_); + local($read) = ''; # Concatenation of all the continuation lines found + while (<$file>) { + s/^\s+//; # Remove leading spaces + if (s/\\\s*$//) { # Still followed by a continuation line + $read .= $_; + } else { # We've reached the end of the continuation + return $read . $_; + } + } +} + diff --git a/mcon/pl/files.pl b/mcon/pl/files.pl new file mode 100644 index 0000000..9e6bd08 --- /dev/null +++ b/mcon/pl/files.pl @@ -0,0 +1,109 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: files.pl,v $ +;# Revision 3.0.1.2 1994/10/29 16:35:48 ram +;# patch36: added user-defined file extension support for lookups +;# +;# Revision 3.0.1.1 1993/10/16 13:54:55 ram +;# patch12: now skip confmagic.h when -M option is used +;# +;# Revision 3.0 1993/08/18 12:10:23 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# These two arrays record the file names of the files which may (or may not) +;# contain shell or C symbols known by metaconfig. +;# @SHlist records the .SH files +;# @clist records the C-like files (i.e. .[chyl]) +;# +;# The extensions are actually computed dynamically from the definitions held +;# in the $cext and $shext variables from .package so that people can add new +;# extensions to their packages. For instance, perl5 adds .xs files holding +;# some C symbols. +;# +# Extract filenames from manifest +sub extract_filenames { + &build_filext; # Construct &is_cfile and &is_shfile + print "Extracting filenames (C and SH files) from $NEWMANI...\n" + unless $opt_s; + open(NEWMANI,$NEWMANI) || die "Can't open $NEWMANI.\n"; + local($file); + while () { + ($file) = split(' '); + next if $file eq 'config_h.SH'; # skip config_h.SH + next if $file eq 'Configure'; # also skip Configure + next if $file eq 'confmagic.h' && $opt_M; + push(@SHlist, $file) if &is_shfile($file); + push(@clist, $file) if &is_cfile($file); + } +} + +# Construct two file identifiers based on the file suffix: one for C files, +# and one for SH files (using the $cext and $shext variables) defined in +# the .package file. +# The &is_cfile and &is_shfile routine may then be called to known whether +# a given file is a candidate for holding C or SH symbols. +sub build_filext { + &build_extfun('is_cfile', $cext, '.c .h .y .l'); + &build_extfun('is_shfile', $shext, '.SH'); +} + +# Build routine $name to identify extensions listed in $exts, ensuring +# that $minimum is at least matched (both to be backward compatible with +# older .package and because it is really the minimum requirred). +sub build_extfun { + local($name, $exts, $minimum) = @_; + local(@single); # Single letter dot extensions (may be grouped) + local(@others); # Other extensions + local(%seen); # Avoid duplicate extensions + foreach $ext (split(' ', "$exts $minimum")) { + next if $seen{$ext}++; + if ($ext =~ s/^\.(\w)$/$1/) { + push(@single, $ext); + } else { + # Convert into perl's regexp + $ext =~ s/\./\\./g; # Escape . + $ext =~ s/\?/./g; # ? turns into . + $ext =~ s/\*/.*/g; # * turns into .* + push(@others, $ext); + } + } + local($fn) = &q(< 1; + + # Reset those once for every unit + # (assuming there is only one depend line) + $h_section = 0; # 0 = no ?H: yet, 1 = in ?H:, 2 = ?H:. seen + $h_section_warned = 0; # Whether we warned about terminated ?H: section + $wiped_unit = 0; # Whether macros like " will be wiped + undef %condseen; + undef %depseen; + undef %defseen; + undef %tempseen; + undef %symset; + undef %symused; + undef %csym; + undef %ssym; + undef %hcsym; + undef %hssym; + undef %lintuse; + undef %lintuse_used; + undef %lintseen; + undef %lintchange; + undef %lintchange_used; + undef %lintextern; + undef %lintcreated; + undef %fileseen; + undef %lintseen_used; + undef %filetmp; + undef %filecreated; + undef %linthere; + undef %lintnothere; + undef %lintfused; + undef %lintsdesc; + undef %lintsdesc_used; + undef %lintcdesc; + undef %lintcdesc_used; + undef %lintset; + undef %lintset_used; + + s|^\s*||; # Remove leading spaces + chop; + s/:(.*)//; + @dep = split(' ', $1); # Dependencies + @ary = split(' '); # Locally defined symbols + local($nowarn); # True when +Special is seen + foreach $sym (@ary) { + # Ignore "internal use only" symbols as far as metalint goes. + # Actually, we record the presence of a '+' in front of a special + # unit name and use that as a hint to suppress the presence of that + # special unit in the defined symbol section. + $nowarn = ($sym =~ s/^\+//); + + # We record for each shell symbol the list of units which claim to make + # it, so as to report duplicates. + if ($sym =~ /^[_a-z]/ || $Except{$sym}) { + $shmaster{"\$$sym"} .= "$unit "; + ++$defseen{$sym}; + } else { + warn "$where: special unit '$sym' should not be listed as made.\n" + unless $sym eq $unit || $nowarn; + } + } + # Record dependencies for later perusal + push(@make, join(' ', @ary) . ':' . join(' ', @dep)); + foreach $sym (@dep) { + if ($sym =~ /^\+[_A-Za-z]/) { + $sym =~ s|^\+||; + ++$condseen{$sym}; # Conditional symbol wanted + ++$condsym{$sym}; # %condsym has a greater lifetime + } else { + ++$depseen{$sym}; # Full dependency + } + + # Each 'wanted' special unit (i.e. one starting with a capital letter) + # is remembered, so as to prevent exported symbols from being reported + # as "undefined". For instance, Myread exports $dflt, $ans and $rp. + $shspecial{$unit} .= "$sym " if substr($sym, 0, 1) =~ /^[A-Z]/; + + # Record all known dependencies (special or not) for this unit + $shdepend{$unit} .= "$sym "; + + # Remember where wanted symbol is defined, so that we can report + # stale dependencies later on (i.e. dependencies which refer to non- + # existent symbols). + $symdep{$sym} .= "$unit "; # This symbol is wanted here + } + # Make sure we do not want a symbol twice, nor do we want it once as a full + # dependency and once as a conditional dependency. + foreach $sym (@dep) { + if ($sym =~ /^\+[_A-Za-z]/) { + $sym =~ s|^\+||; + warn "$where: '+$sym' is listed $condseen{$sym} times.\n" + if $condseen{$sym} > 1; + $condseen{$sym} = 1 if $condseen{$sym}; # Avoid multiple messages + } else { + warn "$where: '$sym' is listed $depseen{$sym} times.\n" + if $depseen{$sym} > 1; + $depseen{$sym} = 1 if $depseen{$sym}; # Avoid multiple messages + } + warn "$where: '$sym' listed as both conditional and full dependency.\n" + if $condseen{$sym} && $depseen{$sym}; + } + # Make sure every unit "inherits" from the symbols exported by 'Init'. + $shspecial{$unit} .= 'Init ' unless $shspecial{$unit} =~ /Init\b/; +} + +# Process the ?O: line +sub p_obsolete { + local($_) = @_; + chop; + $Obsolete{"$unit.U"} = $_; # Message to print if unit is used +} + +# Process the ?S: lines +sub p_shell { + local($_) = @_; + local($where) = "\"$file\", line $. (?S:)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + if (/^(\w+)\s*(\(.*\))*\s*:/) { + &check_last_declaration; + $s_symbol = $1; + print " ?S: $s_symbol\n" if $opt_d; + # Make sure we do not define symbol twice and that the symbol is indeed + # listed in the ?MAKE: line. + warn "$where: duplicate description for variable '\$$s_symbol'.\n" + if $ssym{$s_symbol}++; + unless ($defseen{$s_symbol}) { + warn "$where: variable '\$$s_symbol' is not listed " . + "on ?MAKE: line.\n" unless $lintseen{$s_symbol}; + $lintseen_used{$s_symbol}++ if $lintseen{$s_symbol}; + } + # Deal with obsolete symbol list (enclosed between parenthesis) + &record_obsolete("\$$_") if /\(/; + } else { + unless ($s_symbol) { + warn "$where: syntax error in ?S: construct.\n"; + return; + } + } + + m|^\.\s*$| && ($s_symbol = ''); # End of comment +} + +# Process the ?C: lines +sub p_c { + local($_) = @_; + local($where) = "\"$file\", line $. (?C:)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + # The previous ?H: section, if present, must have been closed + if ($h_section && $h_section != 2) { + warn "$where: unclosed ?H: section.\n"; + } + $h_section = 0; + if (s/^(\w+)\s*~\s*(\S+)\s*(.*):/$1 $3:/) { + &check_last_declaration; + $c_symbol = $2; # Alias for definition in config.h + # Record symbol definition for further duplicate spotting + $cmaster{$1} .= "$unit " unless $csym{$1}; + print " ?C: $1 ~ $c_symbol\n" if $opt_d; + # Make sure we do not define symbol twice + warn "$where: duplicate description for symbol '$1'.\n" + if $csym{$1}++; + # Deal with obsolete symbol list (enclosed between parenthesis) + &record_obsolete("$_") if /\(/; + } elsif (/^(\w+)\s*(\(.*\))*\s*:/) { + &check_last_declaration; + $c_symbol = $1; + # Record symbol definition for further duplicate spotting + $cmaster{$c_symbol} .= "$unit " unless $csym{$c_symbol}; + print " ?C: $c_symbol\n" if $opt_d; + # Make sure we do not define symbol twice + warn "$where: duplicate description for symbol '$c_symbol'.\n" + if $csym{$c_symbol}++; + # Deal with obsolete symbol list (enclosed between parenthesis) + &record_obsolete("$_") if /\(/; + } else { + unless ($c_symbol) { + warn "$where: syntax error in ?C: construct.\n"; + return; + } + } + + s|^(\w+)|?$c_symbol:/* $1| || # Start of comment + (s|^\.\s*$|?$c_symbol: */\n| && ($c_symbol = '', 1)) || # End of comment + s|^(.*)|?$c_symbol: *$1|; # Middle of comment +} + +# Process the ?H: lines +sub p_config { + local($_) = @_; + local($where) = "\"$file\", line $. (?H)" unless $where; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + unless ($h_section){ # Entering ?H: section + $h_section = 1; + $h_section_warned = 0; + } + if ($h_section == 2) { + warn "$where: section was already terminated by '?H:.'.\n" + unless $h_section_warned++; + return; + } + if ($_ eq ".\n") { + $h_section = 2; # Marks terminated ?H: section + return; + } + (my $constraint) = m/^\?(\w+):/; + s/^\?\w+://; # Remove leading '?var:' constraint + if (m|^#\$(\w+)\s+(\w+).*\$(\w+)|) { + # Case: #$d_var VAR "$var" + warn "$where: symbol '$2' was already defined.\n" if $hcsym{$2}++; + &check_definition("$1"); + &check_definition("$3"); + } elsif (m|^#define\s+(\w+)\((.*)\)\s+\$(\w+)|) { + # Case: #define VAR(x) $var + warn "$where: symbol '$1' was already defined.\n" if $hcsym{$1}++; + &check_definition("$3"); + } elsif (m|^#\$define\s+(\w+)|) { + # Case: #$define VAR + warn "$where: symbol '$1' was already defined.\n" if $hcsym{$1}++; + } elsif (m|^#\$(\w+)\s+(\w+)|) { + # Case: #$d_var VAR + warn "$where: symbol '$2' was already defined.\n" if $hcsym{$2}++; + &check_definition("$1"); + } elsif (m|^#define\s+(\w+).*\$(\w+)|) { + # Case: #define VAR "$var" + warn "$where: symbol '$1' was already defined.\n" if $hcsym{$1}++; + &check_definition("$2"); + } elsif (m|^#define\s+(\w+)|) { + # Case: #define VAR + $hcsym{$1}++; # Multiple occurrences may be legitimate + } else { + if (/^#/) { + warn "$where: uncommon cpp line should be protected with '?%<:'.\n" + if $constraint eq ''; + } elsif (!/^\@(if|elsif|else|end)\b/) { + warn "$where: line should not be listed here but in '?C:'.\n"; + } + } + + # Ensure the constraint is either %< (unit base name) or a known symbol. + if ($constraint ne '' && $constraint ne $unit) { + warn "$where: constraint '$constraint' is an unknown symbol.\n" + unless $csym{$constraint} || $ssym{$constraint}; + } +} + +# Process the ?M: lines +sub p_magic { + local($_) = @_; + local($where) = "\"$file\", line $. (?M)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + if (/^(\w+):\s*([\w\s]*)\n$/) { + &check_last_declaration; + $m_symbol = $1; + $msym{$1} = "$unit"; # p_wanted ensure we do not define symbol twice + $mdep{$1} = $2; # Save C symbol dependencies + &p_wanted("$unit:$m_symbol"); + } else { + unless ($m_symbol) { + warn "$where: syntax error in ?M: construct.\n"; + return; + } + } + m|^\.\s*$| && ($m_symbol = ''); # End of comment +} + +# Process the ?INIT: lines +sub p_init { + local($_) = @_; + local($where) = "\"$file\", line $. (?INIT)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + &p_body($_, 1); # Pass it along as a body line (leading ?INIT: removed) +} + +# Process the ?D: lines +sub p_default { + local($_) = @_; + local($where) = "\"$file\", line $. (?D)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + local($sym) = /^(\w+)=/; + $hasdefault{$sym}++; + unless ($defseen{$sym}) { + warn "$where: variable '\$$sym' is not listed " . + "on ?MAKE: line.\n" unless $lintseen{$sym}; + $lintseen_used{$sym}++ if $lintseen{$sym}; + } + s/^\w+=//; # So that p_body does not consider variable as being set + &p_body($_, 1); # Pass it along as a body line (leading ?D: + var removed) +} + +# Process the ?V: lines +sub p_visible { + local($where) = "\"$file\", line $. (?V)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + + # A visible symbol can freely be manipulated by any unit which includes the + # current unit in its dependencies. Symbols before ':' may be only used for + # reading while symbols after ':' may be used for both reading and writing. + # The array %shvisible records symbols as keys. Read-only symbols have a + # leading '$' while read-write symbols are recorded as-is. + + unless (substr($unit, 0, 1) =~ /^[A-Z]/) { + warn "$where: visible declaration in non-special unit ignored.\n"; + return; + } + local($read_only) = $_[0] =~ /^([^:]*):?/; + local($read_write) = $_[0] =~ /:(.*)/; + local(@rsym) = split(' ', $read_only); + local(@rwsym) = split(' ', $read_write); + local($w); + foreach (@rsym) { # Read only symbols + warn "$where: wanted variable '\$$_' made visible.\n" if &wanted($_); + warn "$where: defined variable '\$$_' made visible.\n" + if &defined($_) && !$lintseen{$_}; + $w = $shvisible{"\$$_"}; + warn "$where: variable '\$$_' already made visible by unit $w.\n" if $w; + $w = $shvisible{$_}; + warn "$where: variable '\$$_' already read-write visible in $w.\n" if $w; + $shvisible{"\$$_"} = $unit unless $w; + } + foreach (@rwsym) { # Read/write symbols + warn "$where: wanted variable '\$$_' made visible.\n" if &wanted($_); + warn "$where: defined variable '\$$_' made visible.\n" + if &defined($_) && !$lintseen{$_}; + $w = $shvisible{$_}; + warn "$where: variable '\$$_' already made visible by unit $w.\n" if $w; + $w = $shvisible{"\$$_"}; + warn "$where: variable '\$$_' already read-only visible in $w.\n" if $w; + $shvisible{$_} = $unit unless $w; + } +} + +# Process the ?W: lines +sub p_wanted { + local($where) = "\"$file\", line $. (?W)" unless $where; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + # Somehow, we should check that none of the symbols to activate are stale + # ones, i.e. they all finally resolve to some known target -- FIXME + local($active) = $_[0] =~ /^([^:]*):/; # Symbols to activate + local($look_symbols) = $_[0] =~ /:(.*)/; # When those are used + local(@symbols) = split(' ', $look_symbols); + # A "?W:symbol" line asks metaconfig to define 'symbol' in the wanted file + # as a C target iff that word is found within the sources. This is mainly + # intended for the built-in interpreter to check for definedness. + local($w); + foreach (@symbols) { + warn "$where: variable '\$$_' already wanted.\n" if &wanted($_); + warn "$where: variable '\$$_' also locally defined.\n" if &defined($_); + $w = $cwanted{$_}; + if ($msym{$_} ne '') { + warn "$where: symbol '$_' already listed on a ?M: line in '$w'.\n" + if $w; + } else { + warn "$where: variable '\$$_' already listed on a ?W: line in '$w'.\n" + if $w; + } + $cwanted{$_} = $unit unless $w; + } +} + +# Process the ?Y: lines +sub p_layout { + local($where) = "\"$file\", line $. (?Y)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + local($_) = @_; + chop; + s/^\s+//; + tr/A-Z/a-z/; # Layouts are record in lowercase + warn "$where: unknown layout directive '$_'.\n" + unless defined $Lcmp{$_}; +} + +# Process the ?P: lines +sub p_public { + # FIXME +} + +# Process the ?L: lines +sub p_library { + # There should not be any '-l' in front of the library name + # FIXME +} + +# Process the ?I: lines +sub p_include { + # FIXME +} + +# Process the ?T: lines +sub p_temp { + local($where) = "\"$file\", line $. (?T:)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + local($_) = @_; + local(@sym) = split(' ', $_); + foreach $sym (@sym) { + warn "$where: temporary symbol '\$$sym' multiply declared.\n" + if $tempseen{$sym}++ == 1; + $tempmaster{$sym} .= "$unit " if $tempseen{$sym} == 1; + } +} + +# Process the ?F: lines +sub p_file { + local($where) = "\"$file\", line $. (?F:)"; + warn "$where: directive should come after ?MAKE declarations.\n" + unless $makeseen{$unit}; + local($_) = @_; + local(@files) = split(' ', $_); + local($uufile); # Name of file produced in the UU directory + local($tmpfile); # Name of a temporary file + # We care only about UU files, i.e. files produced in the UU directory + # and which are identified by the convention ./filename. Files !filename + # are not produced, i.e. they are temporary or externally provided. + # The %prodfile table records all the files produced, so we may detect + # inconsistencies between units, while %filemaster records the (first) unit + # defining a given UU file to make sure that (special) unit is named in the + # dependency line when that UU file if used. Duplicates will be caught in + # the sanity check phase thanks to %prodfile. + # Temporary files are recorded in %filesetin, so that we may later compare + # the list with the UU files to detect possible overwrites. + my $is_special = substr($unit, 0, 1) =~ /^[A-Z]/; + foreach $file (@files) { + warn "$where: produced file '$file' multiply declared.\n" + if $fileseen{$file}++ == 1; + if (($tmpfile = $file) =~ s/^!//) { + $filetmp{$tmpfile} = 'x '; + $filesetin{$tmpfile} .= "$unit " if $fileseen{$file} == 1; + next; # Is not a UU file for sure, so skip + } + $prodfile{$file} .= "$unit " if $fileseen{$file} == 1; + ($uufile = $file) =~ s|^\./(\S+)$|$1|; + next if $file eq $uufile; # Don't care about non-UU files + unless ($is_special || $lintcreated{$uufile}) { + warn "$where: UU file '$uufile' in non-special unit ignored.\n"; + delete $lintcreated{$uufile}; # Detect spurious LINT + next; + } + delete $lintcreated{$uufile} if !$is_special; # Detect spurious LINT + $filemaster{$uufile} = $unit unless defined $filemaster{$uufile}; + $filecreated{$uufile} = 'a'; # Will be automagically incremented + } +} + +# Process the ?LINT: lines +sub p_lint { + local($_) = @_; + local(@sym); + local($where) = "\"$file\", line $. (?LINT:)"; + s/^\s+//; # Strip leading spaces + unless ($makeseen{$unit}) { + warn "$where: directive should come after ?MAKE declarations.\n" + unless m/^empty/; + } + if (s/^set//) { # Listed variables are set + @sym = split(' ', $_); # Spurious ones will be flagged + foreach (@sym) { + $lintset{$_}++; # Shell variable set + } + } elsif (s/^desc\w+//) { # Listed shell variables are described + @sym = split(' ', $_); # Spurious ones will be flagged + foreach (@sym) { + $lintsdesc{$_}++; # Shell variable described + } + } elsif (s/^creat\w+//) { # Listed created files in regular units + @sym = split(' ', $_); + foreach (@sym) { + $lintcreated{$_}++; # Persistent UU file created + } + } elsif (s/^known//) { # Listed C variables are described + @sym = split(' ', $_); # Spurious ones will be flagged + foreach (@sym) { + $lintcdesc{$_}++; # C symbol described + } + } elsif (s/^change//) { # Shell variable ok to be changed + @sym = split(' ', $_); # Spurious ones will be flagged + foreach (@sym) { + $lintchange{$_}++; # Do not complain if changed + } + } elsif (s/^extern//) { # Variables known to be externally defined + @sym = split(' ', $_); + foreach (@sym) { + $lintextern{$_}++; # Do not complain if used in a ?H: line + } + } elsif (s/^usefile//) { # Files marked as being used + @sym = split(' ', $_); + foreach (@sym) { + $lintfused{$_}++; + } + } elsif (s/^use//) { # Variables declared as used by unit + @sym = split(' ', $_); # Spurious ones will be flagged + foreach (@sym) { + $lintuse{$_}++; # Do not complain if on ?MAKE and not used + } + } elsif (s/^def\w+//) { # Listed variables are defined + @sym = split(' ', $_); # Spurious ones will be flagged + foreach (@sym) { + $lintseen{$_}++; # Shell variable defined in this unit + } + } elsif (m/^empty/) { # Empty unit file + $lintempty{$unit}++; + } elsif (m/^unclosed/) { # Unclosed here-documents + @sym = split(' ', $_); + foreach (@sym) { + $linthere{$_}++; + } + } elsif (s/^nothere//) { # Not a here-document name + @sym = split(' ', $_); + foreach (@sym) { + $lintnothere{$_}++; + } + } elsif (s/^nocomment//) { # OK if leading unit ': comment' missing + $lintnocomment{$unit}++; + } else { + local($where) = "\"$file\", line $." unless $where; + local($word) = /^(\w+)/; + warn "$where: unknown LINT request '$word' ignored.\n"; + } +} + +# Process the body of the unit +sub p_body { + return unless $makeseen{$unit}; + local($_, $special) = @_; + local($where) = "\"$file\", line $." unless $where; + # Ensure there is no control line in the body of the unit + local($control) = /^\?([\w\-]+):/; + local($known) = $control ? $Depend{$control} : ""; + warn "$where: control sequence '?$control:' ignored within body.\n" + if $known && !/^\?X:|^\?LINT:/; + if (s/^\?LINT://) { # ?LINT directives allowed within body + $_ .= &complete_line(FILE) if s/\\\s*$//; + &p_lint($_); + } + return if $known; + # First non-special line should be a ': description' line + unless ($special || /^\?/ || /^@/) { + warn "$where: first body line should be a general ': description'.\n" + unless $past_first_line++ || $lintnocomment{$unit} || /^:\s+\w+/; + } + # Ensure ': comment' lines do not hold any meta-character + # We assume ":)" introduces a case statement. + if (/^\s*:/ && !/^\s*:\)/) { + warn "$where: missing space after ':' to make it a comment.\n" + unless /^\s*:\s/; + s/\\.//g; # simplistic ignoring of "escaped" chars + s/".*?"//g; + s/'.*?'//g; + if ($wiped_unit) { + s/<\$\w+>//g; + foreach my $wipe (@wiping) { + s/<$wipe>//g; + } + } + warn "$where: found unquoted meta-character $1 on comment line.\n" + while s/([`()<>;&\{\}\|])//g; + warn "$where: found dangling quote on ':' comment line.\n" if /['"]/; + return; + } + # Ingnore interpreted lines and their continuations + if ($last_interpreted) { + return if /\\$/; # Still part of the interpreted line + $last_interpreted = 0; # End of interpreted lines + return; # This line was the last interpreted + } + # Look for interpreted lines and ignore them + if (/^@/) { + $last_interpreted = /\\$/; # Set flag if line is continued + return; # And skip this line + } + # Detect ending of "here" documents + if ($heredoc ne '' && $_ eq "$heredoc\n") { + $heredoc = ''; # Close here-document + $heredoc_nosubst = 0; + return; + } + # Detect beginning of "here" document + my $began_here = 0; + if ($heredoc eq '') { + if (/<<\s*''/) { + # Discourage it, because we're not processing those... + warn "$where: empty here-document name discouraged.\n"; + } elsif (/<<\s*'([^']+)'/ && !$lintnothere{$1}) { + $heredoc = $1; + $heredoc_nosubst = 1; + $began_here++; + } elsif (/<<\s*(\S+)/ && !$lintnothere{$1}) { + $heredoc = $1; + $began_here++; + } + # Continue, as we need to look for possible ">file" on the same line + # as a possible here document, as in "cat <file". + } else { + return if $heredoc_nosubst; # Completely opaque to interpretation + } + $heredoc_line = $. if $began_here; + + # If we've just entered a here document and we're generating a file + # that is exported by the unit, then we need to monitor the variables + # used to make sure there's no missing dependency. + $heredoc_nosubst = 0 + if $began_here && />>?\s*(\S+)/ && $filemaster{$1} eq $unit; + + # From now on, do all substitutes with ':' since it would be dangerous + # to remove things plain and simple. It could yields false matches + # afterwards... + + my $check_vars = 1; + $chek_vars = 0 if $heredoc_nosubst && !$began_here; + + # Record any attempt made to set a shell variable + local($sym); + while ($check_vars && s/(\W?)(\w+)=/$1:/) { + my $before = $1; + $sym = $2; + next unless $before eq '' || $before =~ /["'` \t]/; + next if $sym =~ /^\d+/; # Ignore $1 and friends + $symset{$sym}++; # Shell variable set + # Not part of a $cc -DWHATEVER line and not made nor temporary + unless ($sym =~ /^D/ || &defined($sym)) { + if (&wanted($sym)) { + warn "$where: variable '\$$sym' is changed.\n" + unless $lintchange{$sym}; + $lintchange_used{$sym}++ if $lintchange{$sym}; + } else { + # Record that the variable is set but not listed locally. + if ($shset{$unit} !~ /\b$sym\b/) { + $shset{$unit} .= "$sym " unless $lintchange{$sym}; + $lintchange_used{$sym}++ if $lintchange{$sym}; + } + } + } + } + # Now look at the shell variables used: can be $var or ${var} + local($var); + local($line) = $_; + while ($check_vars && s/\$\{?(\w+)\}?/$1/) { + $var = $1; + next if $var =~ /^\d+/; # Ignore $1 and friends + # Record variable as undeclared but do not issue a message right now. + # That variable could be exported via ?V: (as $dflt in Myread) or be + # defined by a special unit (like $inlibc by unit Inlibc). + $shunknown{$unit} .= "$var " unless + $lintextern{$var} || &declared($var) || + $shunknown{$unit} =~ /\b$var\b/; + $shused{$unit} .= "\$$var " unless $shused{$unit} =~ /\$$var\b/; + } + + return if $heredoc ne '' && !$began_here; # Still in here-document + + # Now look at private files used by the unit (./file or ..../UU/file) + # We look at things like '. ./myread' and `./loc ...` as well as "< file" + local($file); + $_ = $line; + s/<\S+?>//g; # would set-off our >file or >file + while (s!>>?\s*([^\$/`\s;]+)\s*!: !) { + $file = $1; + next if $file =~ /&\d+/; # skip >&4 and friends + $filecreated{$file}++; + } + # Look for mentions of known temporary files to avoid complaining + # that they were not used. + while (s!\s+(\S+)!!) { + $file = $1; + $filetmp{$file} .= ' used' + if defined $filetmp{$file} && $filetmp{$file} !~ /\bused/; + } +} + +# Called at the end of each unit +sub p_end { + local($last) = @_; # Last processed line + local($where) = "\"$file\""; + + # The ?H: section, if present, must have been closed + if ($h_section && $h_section != 2) { + warn "$where: unclosed ?H: section.\n"; + } + $h_section = 0; # For next unit, which may be empty + + # All opened here-documents must be closed. + if ($heredoc ne '') { + my $q = $heredoc_nosubst ? "'" : ""; + warn "$where: unclosed here-document $q$heredoc$q " . + "started line $heredoc_line.\n" + unless $linthere{$heredoc}; + } + + # Reinitialize for next unit. + $heredoc = ''; + $heredoc_nosubst = 0; + $past_first_line = 0; + $last_interpreted = 0; + + unless ($makeseen{$unit}) { + warn "$where: no ?MAKE: line describing dependencies.\n" + unless $lintempty{$unit}; + return; + } + + # Each unit should end with a blank line. Unfortunately, some units + # may also end with an '@end' request and have the blank line above it. + # Currently, we do not have enough information to correctly diagnose + # whether it is valid or not so just skip it. + # Same thing for U/Obsol_sh.U which ends with a shell comment. + + warn "$where: not ending with a blank line.\n" unless + $last =~ /^\s*$/ || $last =~ /^\@end/ || $last =~ /^#|\?/; + + # For EMACS users. It would be fatal to the Configure script... + warn "$where: last line not ending with a new-line character.\n" + unless $last =~ /\n$/; + + # Make sure every shell symbol described in ?MAKE had a description + foreach $sym (sort keys %defseen) { + unless ($ssym{$sym}) { + warn "$where: symbol '\$$sym' was not described.\n" + unless $lintsdesc{$sym}; + $lintsdesc_used{$sym}++ if $lintsdesc{$sym}; + } + } + # Ensure all the C symbols defined by ?H: lines have a description + foreach $sym (sort keys %hcsym) { + unless ($csym{$sym}) { + warn "$where: C symbol '$sym' was not described.\n" + unless $lintcdesc{$sym}; + $lintcdesc_used{$sym}++ if $lintcdesc{$sym}; + } + } + # Ensure all the C symbols described by ?C: lines are defined in ?H: + foreach $sym (sort keys %csym) { + warn "$where: C symbol '$sym' was not defined by any ?H: line.\n" + unless $hcsym{$sym}; + } + # Make sure each defined symbol was set, unless it starts with an + # upper-case letter in which case it is not a "true" shell symbol. + # I don't care about the special symbols defined in %Except as I know + # they are handled correctly. + foreach $sym (sort keys %defseen) { + unless ($symset{$sym} || substr($sym, 0, 1) =~ /^[A-Z]/) { + warn "$where: variable '\$$sym' should have been set.\n" + unless $lintset{$sym}; + $lintset_used{$sym}++ if $lintset{$sym}; + } + } + # Make sure every non-special unit declared as wanted is indeed needed + foreach $sym (sort keys %depseen) { + if ($shused{$unit} !~ /\$$sym\b/ && substr($sym, 0, 1) !~ /^[A-Z]/) { + warn "$where: unused dependency variable '\$$sym'.\n" unless + $lintchange{$sym} || $lintuse{$sym}; + $lintchange_used{$sym}++ if $lintchange{$sym}; + $lintuse_used{$sym}++ if $lintuse{$sym}; + } + } + # Idem for conditionally wanted symbols + foreach $sym (sort keys %condseen) { + if ($shused{$unit} !~ /\$$sym\b/ && substr($sym, 0, 1) !~ /^[A-Z]/) { + warn "$where: unused conditional variable '\$$sym'.\n" unless + $lintchange{$sym} || $lintuse{$sym}; + $lintchange_used{$sym}++ if $lintchange{$sym}; + $lintuse_used{$sym}++ if $lintuse{$sym}; + } + } + # Idem for temporary symbols + foreach $sym (sort keys %tempseen) { + if ($shused{$unit} !~ /\$$sym\b/ && !$symset{$sym}) { + warn "$where: unused temporary variable '\$$sym'.\n" unless + $lintuse{$sym}; + $lintuse_used{$sym}++ if $lintuse{$sym}; + } + } + # Idem for local files + foreach $file (sort keys %filetmp) { + warn "$where: mis-used temporary file '$file'.\n" if + $filetmp{$file} =~ /\bmisused/; + warn "$where: unused temporary file '$file'.\n" unless + $lintfused{$file} || + $filetmp{$file} =~ /\bused/ || $filetmp{$file} =~ /\bmisused/; + } + # Make sure each private file listed as created on ?F: is really created. + # When found, a private UU file is entered in the %filecreated array + # with value 'a'. Each time a file creation occurs in the unit, an + # increment is done on that value. Since 'a'++ -> 'b', a numeric value + # in %filecreated means a non-local file, which is skipped. An 'a' means + # the file was not created... + local($value); + foreach $file (sort keys %filecreated) { + $value = $filecreated{$file}; + next if $value > 0; # Skip non UU-files. + warn "$where: file '$file' was not created.\n" if $value eq 'a'; + } + # Check whether some of the LINT directives were useful + foreach my $sym (sort keys %lintcreated) { + warn "$where: spurious 'LINT create $sym' directive.\n"; + } + foreach my $sym (sort keys %lintuse) { + warn "$where: spurious 'LINT use $sym' directive.\n" + unless $lintuse_used{$sym}; + } + foreach my $sym (sort keys %lintchange) { + warn "$where: spurious 'LINT change $sym' directive.\n" + unless $lintchange_used{$sym}; + } + foreach my $sym (sort keys %lintseen) { + warn "$where: spurious 'LINT define $sym' directive.\n" + unless $lintseen_used{$sym}; + } + foreach my $sym (sort keys %lintsdesc) { + warn "$where: spurious 'LINT describe $sym' directive.\n" + unless $lintsdesc_used{$sym}; + } + foreach my $sym (sort keys %lintcdesc) { + warn "$where: spurious 'LINT known $sym' directive.\n" + unless $lintcdesc_used{$sym}; + } + foreach my $sym (sort keys %lintset) { + warn "$where: spurious 'LINT set $sym' directive.\n" + unless $lintset_used{$sym}; + } +} + +# An unknown control line sequence was found (held in $proc) +sub p_unknown { + warn "\"$file\", line $.: unknown control sequence '?$proc:'.\n"; +} + +# Run sanity checks, to make sure every conditional symbol has a suitable +# default value. Also ensure every symbol was defined once. +sub sanity_checks { + print "Sanity checks...\n"; + local($key, $value); + local($w); + local(%message); # Record messages on a per-unit basis + local(%said); # Avoid duplicate messages + # Warn about symbols ever used in conditional dependency with no default + while (($key, $value) = each(%condsym)) { + unless ($hasdefault{$key}) { + $w = (split(' ', $shmaster{"\$$key"}))[0]; + $message{$w} .= "#$key "; + } + } + # Warn about any undeclared variables. They are all listed in %shunknown, + # being the values while the unit where they appear is the key. If the + # symbol is defined by any of the special units included or made visible, + # then no warning is issued. + local($defined); # True if symbol is defined in one unit + local($where); # List of units where symbol is defined + local($myself); # The name of the current unit if itself special + local($visible); # Symbol made visible via a ?V: line + foreach $unit (sort keys %shunknown) { + foreach $sym (split(' ', $shunknown{$unit})) { + $defined = 0; + $where = $shmaster{"\$$sym"}; + $defined = 1 if $tempmaster{"\$$sym"} =~ /$unit\b/; + $myself = substr($unit, 0, 1) =~ /^[A-Z]/ ? $unit : ''; + # Symbol has to be either defined within one of the special units + # listed in the dependencies or exported via a ?V: line. + unless ($defined) { + $defined = &visible($sym, $unit); + $spneeded{$unit}++ if $defined; + } + $message{$unit} .= "\$$sym " unless $defined; + } + } + + # Warn about any undeclared files. Files used in one unit are all within + # the %fileused table, indexed by unit. If a file is used, it must either + # be in the unit that declared it (relying on %filemaster for that) or + # the unit listed in %filemaster must be part of our dependency. + %said = (); + foreach $unit (sort keys %fileused) { + foreach $file (split(' ', $fileused{$unit})) { + $defined = 0; + $where = $filemaster{$file}; # Where file is created + $defined = 1 if $unit eq $where; # We're in the unit defining it + # Private UU files may be only be created by special units + foreach $special (split(' ', $shspecial{$unit})) { + last if $defined; + $defined = 1 if $where eq $special; + } + # Exceptions to above rule possible via a ?LINT:create hint, + # so parse all known dependencies for the unit... + foreach $depend (split(' ', $shdepend{$unit})) { + last if $defined; + $defined = 1 if $where eq $depend; + } + $message{$unit} .= "\@$file " unless + $defined || $said{"$unit/$file"}++; # Unknown file + } + } + undef %fileused; + + # Warn about any misused files, kept in %filemisused + foreach $unit (sort keys %filemisused) { + foreach $file (split(' ', $filemisused{$unit})) { + next unless defined $filemaster{$file}; # Skip non UU-files + $message{$unit} .= "\@\@$file "; # Misused file + } + } + undef %filemisused; + + # Warn about temporary files which could be created and inadvertently + # override a private UU file (listed in %filemaster). + foreach $tmpfile (keys %filesetin) { + next unless defined $filemaster{$tmpfile}; + $where = $filemaster{$tmpfile}; + foreach $unit (split(' ', $filesetin{$tmpfile})) { + $message{$unit} .= "\@\@\@$where:$tmpfile "; + } + } + undef %filesetin; + + # Warn about any set variable which was not listed. + foreach $unit (sort keys %shset) { + symbol: foreach $sym (split(' ', $shset{$unit})) { + next if $shvisible{$sym}; + $defined = 0; + # Symbol has to be either defined within one of the special units + # listed in the dependencies or exported read-write via a ?V: line. + # If symbol is exported read-only, report the attempt to set it. + $where = $shmaster{"\$$sym"}; + study $where; + foreach $special (split(' ', $shspecial{$unit})) { + $defined = 1 if $where =~ /\b$special\b/; + last if $defined; + } + $visible = 0; + $defined = $visible = &visible($sym, $unit) unless $defined; + if ($visible && $shvisible{"\$$sym"} ne '') { + # We are allowed to set a read-only symbol in the unit which + # declared it... + next symbol if $shvisible{"\$$sym"} eq $unit; + $message{$unit} .= "\&$sym "; # Read-only symbol set + next symbol; + } + $message{$unit} .= "$sym " unless $defined; + } + } + # Warn about any obsolete variable which may be used + foreach $unit (sort keys %shused) { + foreach $sym (split(' ', $shused{$unit})) { + $message{$unit} .= "!$sym " if $Obsolete{$sym} ne ''; + } + } + + # Warn about stale dependencies, and prepare successor and predecessor + # tables for later topological sort. + + local($targets, $deps); + local(%Succ); # Successors + local(%Prec); # Predecessors + + # Split dependencies and build successors array. + foreach $make (@make) { + ($targets, $deps) = $make =~ m|(.*):\s*(.*)|; + $deps =~ s/\+(\w)/$1/g; # Remove conditional targets + foreach $target (split(' ', $targets)) { + $Succ{$target} .= $deps . ' '; + } + } + + # Special setup for the End target, which normally has a $W dependency for + # wanted symbols. In order to detect all the possible cycles, we forge a + # huge dependency by making ALL the regular symbols (i.e. those whose first + # letter is not uppercased) wanted. + + local($allwant) = ''; + { + local($sym, $val); + while (($sym, $val) = each %shmaster) { + $sym =~ s/^\$//; + $allwant .= "$sym " if $val ne ''; + } + } + + $Succ{'End'} =~ s/\$W/$allwant/; + + # Initialize precursors, and spot symbols impossible to 'make', i.e. those + # symbols listed in the successors and with no 'make' target. The data + # structures %Prec and %Succ will also be used by the cycle lookup code, + # in other words, the topological sort. + foreach $target (keys %Succ) { + $Prec{$target} += 0; # Ensure key is recorded without disturbing. + foreach $succ (split(' ', $Succ{$target})) { + $Prec{$succ}++; # Successor has one more precursor + unless (defined $Succ{$succ} || $said{$succ}++) { + foreach $unit (split(' ', $symdep{$succ})) { + $message{$unit} .= "?$succ "; # Stale ?MAKE: dependency + } + } + } + } + undef %symdep; + + # Check all ?M: dependencies to spot stale ones + %said = (); + while (($key, $value) = each(%msym)) { + next if $value eq ''; # Value is unit name where ?M: occurred + foreach $sym (split(' ', $mdep{$key})) { # Loop on C dependencies + next if $cmaster{$sym} || $said{$sym}; + $message{$value} .= "??$sym "; # Stale ?M: dependency + $said{$sym}++; + } + } + + undef %said; + undef %mdep; + undef %msym; + + # Now actually emit all the warnings + local($uv); # Unit defining visible symbol or private file + local($w); # Were we are signaling an error + foreach $unit (sort keys %message) { + undef %said; + $w = "\"$unit.U\""; + foreach (split(' ', $message{$unit})) { + if (s/^#//) { + warn "$w: symbol '\$$_' has no default value.\n"; + } elsif (s/^\?\?//) { + warn "$w: stale ?M: dependency '$_'.\n"; + } elsif (s/^\?//) { + warn "$w: stale ?MAKE: dependency '$_'.\n"; + } elsif (s/^\$//) { + if ($shmaster{"\$$_"} ne '') { + warn "$w: symbol '\$$_' missing from ?MAKE.\n"; + } elsif (($uv = $shvisible{$_}) ne '') { + warn "$w: missing $uv from ?MAKE for visible '\$$_'.\n"; + } elsif (($uv = $shvisible{"\$$_"}) ne '') { + warn "$w: missing $uv from ?MAKE for visible '\$$_'.\n"; + } else { + warn "\"$unit.U\": unknown symbol '\$$_'.\n"; + } + ++$said{$_}; + } elsif (s/^\&//) { + warn "\"$unit.U\": read-only symbol '\$$_' is set.\n"; + ++$said{$_}; + } elsif (s/^!//) { + warn "\"$unit.U\": obsolete symbol '$_' is used.\n"; + ++$said{$_}; + } elsif (s/^\@\@\@//) { + $uv = '?'; # To spot format errors + s/^(\w+):// && ($uv = $1); + warn "$w: local file '$_' may override the one set by $uv.U.\n"; + } elsif (s/^\@\@//) { + $uv = $filemaster{$_}; + warn "$w: you might not always get file '$_' from $uv.U.\n"; + } elsif (s/^\@//) { + if ($uv = $filemaster{$_}) { + warn "$w: missing $uv from ?MAKE for private file '$_'.\n"; + } else { + warn "$w: unknown private file '$_'.\n"; + } + ++$said{"\@$_"}; + } else { + warn "\"$unit.U\": undeclared symbol '\$$_' is set.\n" + unless $said{$_}; + } + } + } + + # Memory cleanup + undef %message; + undef %said; + undef %shused; + undef %shset; + undef %shspecial; + undef %shvisible; + undef %filemaster; + + # Spot multiply defined C symbols + foreach $sym (keys %cmaster) { + @sym = split(' ', $cmaster{$sym}); + if (@sym > 1) { + warn "C symbol '$sym' is defined in the following units:\n"; + foreach (@sym) { + print STDERR "\t$_.U\n"; + } + } + } + undef %cmaster; # Memory cleanup + + # Warn about multiply defined symbols. There are three kind of symbols: + # target symbols, obsolete symbols and temporary symbols. + # For each of these sets, we make sure the intersection with the other sets + # is empty. Besides, we make sure target symbols are only defined once. + + local(@sym); + foreach $sym (keys %shmaster) { + @sym = split(' ', $shmaster{$sym}); + if (@sym > 1) { + warn "Shell symbol '$sym' is defined in the following units:\n"; + foreach (@sym) { + print STDERR "\t$_.U\n"; + } + } + $message{$sym} .= 'so ' if $Obsolete{$sym}; + $message{$sym} .= 'st ' if $tempmaster{$sym}; + } + foreach $sym (keys %tempmaster) { + $message{$sym} .= 'ot ' if $Obsolete{$sym}; + } + local($_); + while (($sym, $_) = each %message) { + if (/so/) { + if (/ot/) { + warn "Shell symbol '$sym' is altogether:\n"; + @sym = split(' ', $shmaster{$sym}); + @sym = grep(s/$/.U/, @sym); + print STDERR "...defined in: ", join(', ', @sym), "\n"; + print STDERR "...obsoleted by $Obsolete{$sym}.\n"; + @sym = split(' ', $tempmaster{$sym}); + @sym = grep(s/$/.U/, @sym); + print STDERR "...used as temporary in:", join(', ', @sym), "\n"; + } else { + warn "Shell symbol '$sym' is both defined and obsoleted:\n"; + @sym = split(' ', $shmaster{$sym}); + @sym = grep(s/$/.U/, @sym); + print STDERR "...defined in: ", join(', ', @sym), "\n"; + print STDERR "...obsoleted by $Obsolete{$sym}.\n"; + } + } elsif (/st/) { # Cannot be ot as it would imply so + warn "Shell symbol '$sym' is both defined and used as temporary:\n"; + @sym = split(' ', $shmaster{$sym}); + @sym = grep(s/$/.U/, @sym); + print STDERR "...defined in: ", join(', ', @sym), "\n"; + @sym = split(' ', $tempmaster{$sym}); + @sym = grep(s/$/.U/, @sym); + print STDERR "...used as temporary in:", join(', ', @sym), "\n"; + } elsif (/ot/) { + warn "Shell symbol '$sym' obsoleted also used as temporary:\n"; + print STDERR "...obsoleted by $Obsolete{$sym}.\n"; + @sym = split(' ', $tempmaster{$sym}); + @sym = grep(s/$/.U/, @sym); + print STDERR "...used as temporary in:", join(', ', @sym), "\n"; + } + } + + # Spot multiply defined files, either private or public ones + foreach $file (keys %prodfile) { + @sym = split(' ', $prodfile{$file}); + if (@sym > 1) { + warn "File '$file' is defined in the following units:\n"; + foreach (@sym) { + print STDERR "\t$_\n"; + } + } + } + undef %prodfile; + + + # Memory cleanup (we still need %shmaster for tsort) + undef %message; + undef %tempmaster; + undef %Obsolete; + + # Make sure there is no dependency cycle + print "Looking for dependency cycles...\n"; + &tsort(*Succ, *Prec); # Destroys info from %Prec +} + +# Make sure last declaration ended correctly with a ?S:. or ?C:. line. +# The variable '$where' was correctly positionned by the calling routine. +sub check_last_declaration { + warn "$where: definition of '\$$s_symbol' not closed by '?S:.'.\n" + if $s_symbol ne ''; + warn "$where: definition of '$c_symbol' not closed by '?C:.'.\n" + if $c_symbol ne ''; + warn "$where: magic definition of '$m_symbol' not closed by '?M:.'.\n" + if $m_symbol ne ''; + $s_symbol = $c_symbol = $m_symbol = ''; +} + +# Make sure the variable is mentionned on the ?MAKE line, if possible in the +# definition section. +# The variable '$where' was correctly positionned by the calling routine. +sub check_definition { + local($var) = @_; + warn "$where: variable '\$$var' not even listed on ?MAKE: line.\n" + unless $defseen{$var} || $condseen{$var} || $depseen{$var}; + warn "$where: variable '\$$var' is defined externally.\n" + if !$lintextern{$var} && !$defseen{$var} && &wanted($var); +} + +# Is symbol declared somewhere? +sub declared { + &defined($_[0]) || &wanted($_[0]); +} + +# Is symbol defined by unit? +sub defined { + $tempseen{$_[0]} || $defseen{$_[0]} || $lintseen{$_[0]}; +} + +# Is symbol wanted by unit? +sub wanted { + $depseen{$_[0]} || $condseen{$_[0]}; +} + +# Is symbol visible from the unit? +# Locate visible symbols throughout the special units. Each unit having +# some special dependencies (special units wanted) have an entry in the +# %shspecial array, listing all those special dependencies. And each +# symbol made visible by ONE special unit has an entry in the %shvisible +# array. +sub visible { + local($symbol, $unit) = @_; + local(%explored); # Special units we've already explored + &explore($symbol, $unit); # Perform recursive search +} + +# Recursively explore the dependencies to locate a visible symbol +sub explore { + local($symbol, $unit) = @_; + # If unit was already explored, we know it has not been found by following + # that path. + return 0 if defined $explored{$unit}; + $explored{$unit} = 0; # Assume nothing found in this unit + local($specials) = $shspecial{$unit}; + # Don't waste any time if unit does not have any special units listed + # in its dependencies. + return 0 unless $specials; + foreach $special (split(' ', $specials)) { + return 1 if ( + $shvisible{"\$$symbol"} eq $unit || + $shvisible{$symbol} eq $unit || + &explore($symbol, $special) + ); + } + 0; +} + diff --git a/mcon/pl/locate.pl b/mcon/pl/locate.pl new file mode 100644 index 0000000..ea7d03f --- /dev/null +++ b/mcon/pl/locate.pl @@ -0,0 +1,153 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: locate.pl,v $ +;# Revision 3.0.1.1 1994/10/29 16:36:52 ram +;# patch36: misspelled a 'closedir' as a 'close' statement +;# +;# Revision 3.0 1993/08/18 12:10:25 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# Locate units and put them in the @ARGV array, for later perusal. We first +;# look in the private U directory, then in the public U library. In each U +;# directory, units may be gathered in clusters (directories). These clusters +;# should not have a name ending with .U, as those will never be stat()'ed. +;# +;# NB: Currently, the clusters are only a practical way of grouping a set of +;# closely related units. There must not be any name conflicts. +;# +;# The following variables are used: +;# $WD is assumed to be the working directory (where the process was spawned) +;# $MC is the location of metaconfig's public library +;# @ARGV is the list of all the units full path +;# %Unit maps an unit name (without final .U) to a path +;# @myUlist lists the user's units, which will be appended at the end of @ARGV +;# %myUseen lists the user's units which overwrite public ones +;# +package locate; + +# Locate the units and push their path in @ARGV (sorted alphabetically) +sub main'locate_units { + print "Locating units...\n" unless $main'opt_s; + local(*WD) = *main'WD; # Current working directory + local(*MC) = *main'MC; # Public metaconfig library + undef %myUlist; # Records private units paths + undef %myUseen; # Records private/public conflicts + &private_units; # Locate private units in @myUlist + &public_units; # Locate public units in @ARGV + @ARGV = sort @ARGV; # Sort it alphabetically + push(@ARGV, sort @myUlist); # Append user's units sorted + &dump_list if $main'opt_v; # Dump the list of units +} + +# Dump the list of units on stdout +sub dump_list { + print "\t"; + $, = "\n\t"; + print @ARGV; + $, = ''; + print "\n"; +} + +# Scan private units +sub private_units { + return unless -d 'U'; # Nothing to be done if no 'U' entry + local(*ARGV) = *myUlist; # Really fill in @myUlist + local($MC) = $WD; # We are really in the working directory + &units_path("U"); # Locate units in the U directory + local($unit_name); # Unit's name (without .U) + local(@kept); # Array of kept units + # Loop over the units and remove duplicates (the first one seen is the one + # we keep). Also set the %myUseen H table to record private units seen. + foreach (@ARGV) { + ($unit_name) = m|^.*/(.*)\.U$|; # Get unit's name from path + next if $myUseen{$unit_name}; # Already recorded + $myUseen{$unit_name} = 1; # Record pirvate unit + push(@kept, $_); # Keep this unit + } + @ARGV = @kept; +} + +# Scan public units +sub public_units { + chdir($MC) || die "Can't find directory $MC.\n"; + &units_path("U"); # Locate units in public U directory + chdir($WD) || die "Can't go back to directory $WD.\n"; + local($path); # Relative path from $WD + local($unit_name); # Unit's name (without .U) + local(*Unit) = *main'Unit; # Unit is a global from main package + local(@kept); # Units kept + local(%warned); # Units which have already issued a message + # Loop over all the units and keep only the ones that were not found in + # the user's U directory. As it is possible two or more units with the same + # name be found in + foreach (@ARGV) { + ($unit_name) = m|^.*/(.*)\.U$|; # Get unit's name from path + next if $warned{$unit_name}; # We have already seen this unit + $warned{$unit_name} = 1; # Remember we have warned the user + if ($myUseen{$unit_name}) { # User already has a private unit + $path = $Unit{$unit_name}; # Extract user's unit path + next if $path eq $_; # Same path, we must be in mcon/ + $path =~ s|^$WD/||o; # Weed out leading working dir path + print " Your private $path overrides the public one.\n" + unless $main'opt_s; + } else { + push(@kept, $_); # We may keep this one + } + } + @ARGV = @kept; +} + +# Recursively locate units in the directory. Each file ending with .U has to be +# a unit. Others are stat()'ed, and if they are a directory, they are also +# scanned through. The $MC and @ARGV variable are dynamically set by the caller. +sub units_path { + local($dir) = @_; # Directory where units are to be found + local(@contents); # Contents of the directory + local($unit_name); # Unit's name, without final .U + local($path); # Full path of a unit + local(*Unit) = *main'Unit; # Unit is a global from main package + unless (opendir(DIR, $dir)) { + warn("Cannot open directory $dir.\n"); + return; + } + print "Locating in $MC/$dir...\n" if $main'opt_v; + @contents = readdir DIR; # Slurp the whole thing + closedir DIR; # And close dir, ready for recursion + foreach (@contents) { + next if $_ eq '.' || $_ eq '..'; + if (/\.U$/) { # A unit, definitely + ($unit_name) = /^(.*)\.U$/; + $path = "$MC/$dir/$_"; # Full path of unit + push(@ARGV, $path); # Record its path + if (defined $Unit{$unit_name}) { # Already seen this unit + if ($main'opt_v) { + ($path) = $Unit{$unit_name} =~ m|^(.*)/.*|; + print " We've already seen $unit_name.U in $path.\n"; + } + } else { + $Unit{$unit_name} = $path; # Map name to path + } + next; + } + # We have found a file which does not look like a unit. If it is a + # directory, then scan it. Otherwise skip the file. + unless (-d "$dir/$_") { + print " Skipping file $_ in $dir.\n" if $main'opt_v; + next; + } + &units_path("$dir/$_"); + print "Back to $MC/$dir...\n" if $main'opt_v; + } +} + +package main; + diff --git a/mcon/pl/makefile.pl b/mcon/pl/makefile.pl new file mode 100644 index 0000000..290c995 --- /dev/null +++ b/mcon/pl/makefile.pl @@ -0,0 +1,176 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: makefile.pl,v $ +;# Revision 3.0.1.1 1995/09/25 09:19:42 ram +;# patch59: symbols are now sorted according to the ?Y: layout directive +;# +;# Revision 3.0 1993/08/18 12:10:26 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# Given a list of wanted symbols in the Wanted file, produce a Makefile which +;# will compute the transitive closure of dependencies for us and give the +;# correct layout order in the Configure script. Because some conditional +;# symbols could indeed be truly wanted symbols, we build the makefile in two +;# passes. The first one will give us the complete list of units to be loaded, +;# while the second will determine the correct order. +;# +;# The external $saved_dependencies records the original dependencies we got +;# from the units' ?MAKE: lines while $dependencies is tampered with. +;# +;# Note that when the -w option is supplied, the sources are not parsed. +;# However, the config.h.SH file would be empty, because its building +;# relies on values in cmaster and shmaster arrays. It is okay for values +;# in shmaster, because they are true wanted symbols. The cmaster keys +;# have also been written, but with a leading '>' (because they are +;# not true targets for Makefile). We thus extract all these keys and +;# set the cmaster array accordingly. +;# +;# Obsolete symbols, if any found, are also part of the Wanted file, written on +;# a line starting with a '!', eventually followed by a '>' if the obsolete +;# symbol is a C one. +;# +;# These three data structures record wanted things like commands or symbols. +;# %symwanted{'sym'} is true when the symbol is wanted (transitive closure) +;# %condwanted{'sym'} when the default value of a symbol is requested +;# $wanted records the set of wanted shell symbols (as opposed to C ones) +;# +# Build the private makefile we use to compute the transitive closure of the +# previously determined dependencies. +sub build_makefile { + print "Computing optimal dependency graph...\n" unless $opt_s; + chdir('.MT') || die "Can't chdir to .MT\n"; + local($wanted); # Wanted shell symbols + &build_private; # Build a first makefile from dependencies + &compute_loadable; # Compute loadable units + &update_makefile; # Update makefile using feedback from first pass + chdir($WD) || die "Can't chdir back to $WD\n"; + # Free memory by removing useless data structures + undef $dependencies; + undef $saved_dependencies; +} + +# First pass: build a private makefile from the extracted dependency, changing +# conditional units to truly wanted ones if the symbol is used, removing the +# dependency otherwise. The original dependencies are saved. +sub build_private { + print " Building private make file...\n" unless $opt_s; + open(WANTED,"../Wanted") || die "Can't reopen Wanted.\n"; + $wanted = ' ' x 2000; # Pre-extend string + $wanted = ''; + while () { + chop; + next if /^!/; # Skip obsolete symbols + if (s/^>//) { + $cmaster{$_}++; + } else { + $wanted .= "$_ "; + } + } + close WANTED; + + # The wanted symbols are sorted so that d_* (checking for C library symbol) + # come first and i_* (checking for includes) comes at the end. Grouping the + # d_* symbols together has good chances of improving the locality of the + # other questions and i_* symbols must come last since some depend on h_* + # values which prevent incompatible headers inclusions. + $wanted = join(' ', sort symbols split(' ', $wanted)); + + # Now generate the first makefile, which will be used to determine which + # symbols we really need, so that conditional dependencies may be solved. + open(MAKEFILE,">Makefile") || die "Can't create .MT/Makefile.\n"; + print MAKEFILE "SHELL = /bin/sh\n"; + print MAKEFILE "W = $wanted\n"; + $saved_dependencies = $dependencies; + $* = 1; + foreach $sym (@Cond) { + if ($symwanted{$sym}) { + $dependencies =~ s/\+($sym\s)/$1/g; + } else { + $dependencies =~ s/\+$sym(\s)/$1/g; + } + } + $* = 0; + print MAKEFILE $dependencies; + close MAKEFILE; +} + +# Ordering for symbols. Give higher priority to d_* ones and lower to i_* ones. +# If any layout priority is defined in %Layout, it is used to order the +# symbols. +sub symbols { + local($r) = $Layout{$a} <=> $Layout{$b}; + return $r if $r; + # If we come here, both symbols have the same layout priority. + if ($a =~ /^d_/) { + return -1 unless $b =~ /^d_/; + } elsif ($b =~ /^d_/) { + return 1; + } elsif ($a =~ /^i_/) { + return 1 unless $b =~ /^i_/; + } elsif ($b =~ /^i_/) { + return -1; + } + $a cmp $b; +} + +# Run the makefile produced in the first pass to find the whole set of units we +# have to load, filling in the %symwanted and %condwanted structures. +sub compute_loadable { + print " Determining loadable units...\n" unless $opt_s; + open(MAKE, "make -n |") || die "Can't run make"; + while () { + s|^\s+||; # Some make print tabs before command + if (/^pick/) { + print "\t$_" if $opt_v; + ($pick,$cmd,$symbol,$unit) = split(' '); + $symwanted{$symbol}++; + $symwanted{$unit}++; + } elsif (/^cond/) { + print "\t$_" if $opt_v; + ($pick,@symbol) = split(' '); + for (@symbol) { + $condwanted{$_}++; # Default value is requested + } + } + } + close MAKE; +} + +# Now that we know all the desirable symbols, we have to rebuild +# another makefile, in order to have the units in a more optimal +# way. +# Actually, if we have both ?MAKE:a:+b and ?MAKE:d:b and 'd' is +# wanted; then 'b' will be loaded. However, 'b' is a conditional +# dependency for 'a', and it would be better if 'b' were loaded +# before 'a' is, though this is not necessary. +# It is hard to know that 'b' will be loaded *before* the first make. + +# Back to the original dependencies, make loadable units truly wanted ones and +# remove optional ones. +sub update_makefile { + print " Updating make file...\n" unless $opt_s; + open(MAKEFILE,">Makefile") || die "Can't create .MT/Makefile.\n"; + print MAKEFILE "SHELL = /bin/sh\n"; + print MAKEFILE "W = $wanted\n"; + $* = 1; + foreach $sym (@Cond) { + if ($symwanted{$sym}) { + $saved_dependencies =~ s/\+($sym\s)/$1/g; + } else { + $saved_dependencies =~ s/\+$sym(\s)/$1/g; + } + } + $* = 0; + print MAKEFILE $saved_dependencies; + close MAKEFILE; +} + diff --git a/mcon/pl/obsolete.pl b/mcon/pl/obsolete.pl new file mode 100644 index 0000000..ba9a601 --- /dev/null +++ b/mcon/pl/obsolete.pl @@ -0,0 +1,103 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: obsolete.pl,v $ +;# Revision 3.0.1.1 1995/01/30 14:49:22 ram +;# patch49: random clean-up in &record_obsolete +;# +;# Revision 3.0 1993/08/18 12:10:27 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# Deal with obsolete symbols. They are recorded in the %Obsolete array. +;# Optionally, the obsolete symbols may be remaped onto the new ones (option +;# -o), which enables smooth evolution from 2.0. +;# +# Record obsolete symbols association (new versus old), that is to say for a +# given old symbol, $Obsolete{'old'} = new symbol to be used. A '$' is prepended +# for all shell variables +sub record_obsolete { + local($_) = @_; + local(@obsoleted); # List of obsolete symbols + local($symbol); # New symbol which must be used + local($dollar) = s/^\$// ? '$':''; # The '$' or a null string + # Syntax for obsolete symbols specification is + # list of symbols (obsolete ones): + if (/^(\w+)\s*\((.*)\)\s*:$/) { + $symbol = "$dollar$1"; + @obsoleted = split(' ', $2); # List of obsolete symbols + } else { + if (/^(\w+)\s*\((.*):$/) { + warn "\"$file\", line $.: final ')' before ':' missing.\n"; + $symbol = "$dollar$1"; + @obsoleted = split(' ', $2); + } else { + warn "\"$file\", line $.: syntax error.\n"; + return; + } + } + foreach $val (@obsoleted) { + $_ = $dollar . $val; + if (defined $Obsolete{$_}) { + warn "\"$file\", line $.: '$_' already obsoleted by '$Obsolete{$_}'.\n"; + } else { + $Obsolete{$_} = $symbol; # Record (old, new) tuple + } + } +} + +# Dump obsolete symbols used in file 'Obsolete'. Also write Obsol_h.U and +# Obsol_sh.U to record old versus new mappings if the -o option was used. +sub dump_obsolete { + unless (-f 'Obsolete') { + open(OBSOLETE, ">Obsolete") || die "Can't create Obsolete.\n"; + } + open(OBSOL_H, ">.MT/Obsol_h.U") || die "Can't create .MT/Obsol_h.U.\n"; + open(OBSOL_SH, ">.MT/Obsol_sh.U") || die "Can't create .MT/Obsol_sh.U.\n"; + local($file); # File where obsolete symbol was found + local($old); # Name of this old symbol + local($new); # Value of the new symbol to be used + # Leave a blank line at the top so that anny added ^L will stand on a line + # by itself (the formatting process adds a ^L when a new page is needed). + format OBSOLETE_TOP = + + File | Old symbol | New symbol +-----------------------------------+----------------------+--------------------- +. + format OBSOLETE = +@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | @<<<<<<<<<<<<<<<<<<< | @<<<<<<<<<<<<<<<<<<< +$file, $old, $new +. + local(%seen); + foreach $key (sort keys %ofound) { + ($file, $old, $new) = ($key =~ /^(\S+)\s+(\S+)\s+(\S+)/); + write(OBSOLETE) unless $file eq 'XXX'; + next unless $opt_o; # Obsolete mapping done only with -o + next if $seen{$old}++; # Already remapped, thank you + if ($new =~ s/^\$//) { # We found an obsolete shell symbol + $old =~ s/^\$//; + print OBSOL_SH "$old=\"\$$new\"\n"; + } else { # We found an obsolete C symbol + print OBSOL_H "#ifdef $new\n"; + print OBSOL_H "#define $old $new\n"; + print OBSOL_H "#endif\n\n"; + } + } + close OBSOLETE; + close OBSOL_H; + close OBSOL_SH; + if (-s 'Obsolete') { + print "*** Obsolete symbols found -- see file 'Obsolete' for a list.\n"; + } else { + unlink 'Obsolete'; + } + undef %ofound; # Not needed any more +} + diff --git a/mcon/pl/order.pl b/mcon/pl/order.pl new file mode 100644 index 0000000..e6ef35a --- /dev/null +++ b/mcon/pl/order.pl @@ -0,0 +1,42 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: order.pl,v $ +;# Revision 3.0 1993/08/18 12:10:28 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# The @cmdwanted array records the output of the makefile (pick commands only). +;# The shell commands are executed right away. +;# @cmdwanted records the output of the make process (solving dependencies) +# Solve dependencies by saving the 'pick' command in @cmdwanted +sub solve_dependencies { + local(%unitseen); # Record already picked units (avoid duplicates) + print "Determining the correct order for the units...\n" unless $opt_s; + chdir('.MT') || die "Can't chdir to .MT: $!.\n"; + open(MAKE, "make -n |") || die "Can't run make"; + while () { + s|^\s+||; # Some make print tabs before command + print "\t$_" if $opt_v; + if (/^pick/) { + ($pick,$cmd,$symbol,$unit) = split(' '); + push(@cmdwanted,"$cmd $symbol $unit") + unless $unitseen{"$cmd:$unit"}++; + } elsif (/^cond/) { + # Ignore conditional symbol request + } else { + chop; + system; + } + } + chdir($WD) || die "Can't chdir to $WD: $!.\n"; + close MAKE; +} + diff --git a/mcon/pl/tsort.pl b/mcon/pl/tsort.pl new file mode 100644 index 0000000..4d56fae --- /dev/null +++ b/mcon/pl/tsort.pl @@ -0,0 +1,166 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: tsort.pl,v $ +;# Revision 3.0 1993/08/18 12:10:28 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# The topological sort is performed using the following algorithm: +;# +;# We have a list of successors for each item; makefile dependencies of +;# the form 'a b: c d' means successors(a) = successors(b) = { c, d }. +;# From that input, we derive a number of precursors for each item. +;# In our simple example above, c and d both have two precursors and +;# a and b have none. Items with no precursors are called outsiders +;# and are left in a pool. The sort is then initiated and will continue +;# until all the items have been sorted or a cycle is found... +;# +;# Outsiders are ready to be sorted; since the topological sort is a partial +;# order, an external criterion is needed to choose one item among the ones +;# in the pool. That item is assigned a number, and the number of precursors +;# for the remaining items is updated (by following the successors of the +;# sorted item and decrementing the value for each successor). Among those, +;# if any item reaches a precursor count of zero, it becomes an outsider. +;# +;# The algorithm ends when the outsider pool is empty. If it becomes empty and +;# some items remain unsorted, then there is one or more cycles among them. +;# One way to outline that cycle first extract all those items whose precursor +;# count is minimal then visit their dependency graph to find the cycle, +;# extract only those items belonging to the cycle into the outsiders set and +;# resume the main processing stream. +;# +# +# Topological sort of Makefile dependencies with cycle enhancing. +# + +package tsort; + +# Perform the topological sort of the items and outline cycles. +sub main'tsort { + local(*Succ, *Prec) = @_; # Tables of succesors and predecessors + local(@Out); # The outsider set + local(@keys); # Current active precursors + local($item); # Item to sort + + for (@keys = keys %Prec; @keys || @Out; @keys = keys %Prec) { + &resync; # Resynchronize outsiders + if (@Out == 0) { # Cycle detected + &extract_cycle(*Prec, *Succ); + next; + } + $item = shift(@Out); # Sort current item (don't care which one) + &sort($item); # Update internal structures + } +} + +# Resynchronize the outsiders stack (those items that have no more precursors). +# If the outsiders stack becomes empty, then there is a cycle. +sub resync { + foreach $target (keys %Prec) { + if ($Prec{$target} == 0) { + delete $Prec{$target}; # We're done with this item + push(@Out, $target); # Ready to be sorted + } + } +} + +# Sort item +sub sort { + local($item) = @_; + print "(ok) $item\n" if $main'opt_d && !$Cycle; + print "(fx) $item\n" if $main'opt_d && $Cycle; + foreach $succ (split(' ', $Succ{$item})) { + # The test for definedness is necessary, since when a cycle is found, + # one item is forced out of %Prec. If we had the guarantee of no + # cycle, the the test would not be necessary and no decrementation + # could go past 0. + $Prec{$succ}-- if defined $Prec{$succ}; + } +} + +# Extract cycle... We look through the %Prec array and find all those items +# with the same lowest value. Those are a cycle, so we dump them, and make +# them new outsiders by resetting their count to 0. +sub extract_cycle { + local(*Prec, *Succ) = @_; + local($item) = (&sort_by_value(*Prec))[0]; + local($min) = $Prec{$item}; # Minimum value + local($key, $value); + local(%candidate); # Superset of the cycle we found + warn " Cycle found for:\n"; + $Cycle++; + while (($key, $value) = each %Prec) { + $candidate{$key}++ if $value == $min; + } + local(%state); # State of visited nodes (1 = cycle, -1 = dead) + local($CYCLE) = 1; # Possible member of a cycle + local($DEAD) = -1; # Dead end, no cycling possible + foreach $key (keys %candidate) { + last if $CYCLE == &visit($key, $Succ{$key}); + } + while (($key, $value) = each %candidate) { + next unless $state{$key} == $CYCLE; + $Prec{$key} = 0; # Members of cycle are new outsiders + warn "\t(#$Cycle) $key\n"; + } + local(%involved); # Items involved in the cycle... + while (($key, $value) = each %state) { + $involved{$key}++ if $state{$key} == $CYCLE; + } + &outline_cycle(*Succ, *involved); +} + +sub outline_cycle { + local(*Succ, *member) = @_; + local($key, $value); + local($depends); + local($unit); + warn " Cycle involves:\n"; + while (($key, $value) = each %Succ) { + next unless $member{$key}; + $depends = ''; + foreach $item (split(' ', $value)) { + $depends .= "$item " if $member{$item}; + } + $unit = $main'shmaster{"\$$key"}; + $unit =~ s/\s+$//; + $unit = '?' if $unit eq ''; + warn "\t($unit) $key: $depends\n"; + } +} + +# Visit a tree node, following all its successors, until we find a cycle. +# Return $CYCLE if the exploration of the node leaded to a cycle, $DEAD +# otherwise. +sub visit { + local($node, $children) = @_; # A node and its children + # If we have already visited the node, return the status value attached + # to it. + return $state{$node} if $state{$node}; + $state{$node} = $CYCLE; # Assume member of cycle + local($all_dead) = 1; # Set to 0 if at least one cycle found + foreach $child (split(' ', $children)) { + $all_dead = 0 if $CYCLE == &visit($child, $Succ{$child}); + } + $state{$node} = $DEAD if $all_dead; + $state{$node}; +} + +# Sort associative array by value +sub sort_by_value { + local(*x) = @_; + sub _by_value { $x{$a} <=> $x{$b}; } + sort _by_value keys %x; +} + +package main; + +1; diff --git a/mcon/pl/wanted.pl b/mcon/pl/wanted.pl new file mode 100644 index 0000000..20d218c --- /dev/null +++ b/mcon/pl/wanted.pl @@ -0,0 +1,263 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: wanted.pl,v $ +;# Revision 3.0.1.2 1995/01/11 15:42:37 ram +;# patch45: added % in front of hash table names for perl5's each() (ADO) +;# patch45: tell users about possible extra file-extension lookups +;# +;# Revision 3.0.1.1 1993/10/16 13:56:05 ram +;# patch12: modified to handle ?M: lines +;# patch12: added warning when magic symbols used without proper config +;# +;# Revision 3.0 1993/08/18 12:10:29 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# These two arrays record the file names of the files which may (or may not) +;# contain shell or C symbols known by metaconfig. +;# @SHlist records the .SH files +;# @clist records the C-like files (i.e. .[chyl]) +;# +;# These files are scanned in turn to see how many symbols known by metaconfig +;# they have. Those symbols are gathered in a Wanted file. As C symbols are +;# not true targets for the forthcoming Makefile, a ">" sign is prepended. +;# Finally, the obsolete symbols are preceded by a "!". +;# +;# When obsolete symbols are found, they are dumped in file 'Obsolete'. Two +;# files are created anyway in the .MT directory. Obsol_h.U and Obsol_sh.U which +;# respectively list the obsoleted symbols (C and shell ones). +;# Obsol_h.U records obsolete C symbols +;# Obsol_sh.U records obsolete shell symbols +;# +;# The manifake() routine has to be provided externally. +;# +# Build a wanted file from the files held in @SHlist and @clist arrays +sub build_wanted { + # If wanted file is already there, parse it to map obsolete if -o option + # was used. Otherwise, build a new one. + if (-f 'Wanted') { + &map_obsolete if $opt_o; # Build Obsol*.U files + &dump_obsolete; # Dump obsolete symbols if any + return; + } + &parse_files; +} + +sub parse_files { + print "Building a Wanted file...\n" unless $opt_s; + open(WANTED,"| sort | uniq >Wanted") || die "Can't create Wanted.\n"; + unless (-f $NEWMANI) { + &manifake; + die "No $NEWMANI--can't build a Wanted file.\n" unless -f $NEWMANI; + } + + local($search); # Where to-be-evaled script is held + local($_) = ' ' x 50000 if $opt_m; # Pre-extend pattern search space + local(%visited); # Records visited files + local(%lastfound); # Where last occurence of key was + + # Now we are a little clever, and build a loop to eval so that we don't + # have to recompile our patterns on every file. We also use "study" since + # we are searching the same string for many different things. Hauls! + + if (@clist) { + local($others) = $cext ? " $cext" : ''; + print " Scanning .[chyl]$others files for symbols...\n" + unless $opt_s; + $search = ' ' x (40 * (@cmaster + @ocmaster)); # Pre-extend + $search = "while (<>) {study;\n"; # Init loop over ARGV + foreach $key (keys(%cmaster)) { + $search .= "&cmaster('$key') if /\\b$key\\b/;\n"; + } + foreach $key (grep(!/^\$/, keys %Obsolete)) { + $search .= "&ofound('$key') if /\\b$key\\b/;\n"; + } + $search .= "}\n"; # terminate loop + print $search if $opt_d; + @ARGV = @clist; + # Swallow each file as a whole, if memory is available + undef $/ if $opt_m; + eval $search; + eval ''; + $/ = "\n"; + while (($key,$value) = each(%cmaster)) { + print WANTED $cwanted{$key}, "\n", ">$key", "\n" if $value; + } + } + + # If they don't use magic but use magically guarded symbols without + # their corresponding C symbol dependency, warn them, since they might + # not know about that portability issue. + + if (@clist && !$opt_M) { + local($nused); # list of non-used symbols + local($warning) = 0; # true when one warning issued + foreach $cmag (keys %mwanted) { # loop over all used magic symbols + next unless $cmaster{$cmag}; + $nused = ''; + foreach $cdep (split(' ', $mwanted{$cmag})) { + $nused .= " $cdep" unless $cmaster{$cdep}; + } + $nused =~ s/^ //; + $nused = "one of " . $nused if $nused =~ s/ /, /g; + if ($nused ne '') { + print " Warning: $cmag is used without $nused.\n"; + $warning++; + } + } + if ($warning) { + local($those) = $warning == 1 ? 'that' : 'those'; + local($s) = $warning == 1 ? '' : 's'; + print "Note: $those previous warning$s may be suppressed by -M.\n"; + } + } + + # Cannot remove $cmaster as it is used later on when building Configure + undef @clist; + undef %cwanted; + undef %mwanted; + %visited = (); + %lastfound = (); + + if (@SHlist) { + local($others) = $shext ? " $shext" : ''; + print " Scanning .SH$others files for symbols...\n" unless $opt_s; + $search = ' ' x (40 * (@shmaster + @oshmaster)); # Pre-extend + $search = "while (<>) {study;\n"; + # All the keys already have a leading '$' + foreach $key (keys(%shmaster)) { + $search .= "&shmaster('$key') if /\\$key\\b/;\n"; + } + foreach $key (grep (/^\$/, keys %Obsolete)) { + $search .= "&ofound('$key') if /\\$key\\b/;\n"; + } + $search .= "}\n"; + print $search if $opt_d; + @ARGV = @SHlist; + # Swallow each file as a whole, if memory is available + undef $/ if $opt_m; + eval $search; + eval ''; + $/ = "\n"; + while (($key,$value) = each(%shmaster)) { + if ($value) { + $key =~ s/^\$//; + print WANTED $key, "\n"; + } + } + } + + # Obsolete symbols, if any, are written in the Wanted file preceded by a + # '!' character. In case -w is used, we'll thus be able to correctly build + # the Obsol_h.U and Obsol_sh.U files. + + &add_obsolete; # Add obsolete symbols in Wanted file + + close WANTED; + + # If obsolete symbols where found, write an Obsolete file which lists where + # each of them appear and the new symbol to be used. Also write Obsol_h.U + # and Obsol_sh.U in .MT for later perusal. + + &dump_obsolete; # Dump obsolete symbols if any + + die "No desirable symbols found--aborting.\n" unless -s 'Wanted'; + + # Clean-up memory by freeing useless data structures + undef @SHlist; + undef %shmaster; +} + +# This routine records matches of C master keys +sub cmaster { + local($key) = @_; + $cmaster{$key}++; # This symbol is wanted + return unless $opt_t || $opt_M; # Return if neither -t nor -M + if ($opt_t && + $lastfound{$key} ne $ARGV # Never mentionned for this file ? + ) { + $visited{$ARGV}++ || print $ARGV,":\n"; + print "\t$key\n"; + $lastfound{$key} = $ARGV; + } + if ($opt_M && + defined($mwanted{$key}) # Found a ?M: symbol + ) { + foreach $csym (split(' ', $mwanted{$key})) { + $cmaster{$csym}++; # Activate C symbol dependencies + } + } +} + +# This routine records matches of obsolete keys (C or shell) +sub ofound { + local($key) = @_; + local($_) = $Obsolete{$key}; # Value of new symbol + $ofound{"$ARGV $key $_"}++; # Record obsolete match + $cmaster{$_}++ unless /^\$/; # A C hit + $shmaster{$_}++ if /^\$/; # Or a shell one + return unless $opt_t; # Continue if trace option on + if ($lastfound{$key} ne $ARGV) { # Never mentionned for this file ? + $visited{$ARGV}++ || print $ARGV,":\n"; + print "\t$key (obsolete, use $_)\n"; + $lastfound{$key} = $ARGV; + } +} + +# This routine records matches of shell master keys +sub shmaster { + local($key) = @_; + $shmaster{$key}++; # This symbol is wanted + return unless $opt_t; # Continue if trace option on + if ($lastfound{$key} ne $ARGV) { # Never mentionned for this file ? + $visited{$ARGV}++ || print $ARGV,":\n"; + print "\t$key\n"; + $lastfound{$key} = $ARGV; + } +} + +# Write obsolete symbols into the Wanted file for later perusal by -w. +sub add_obsolete { + local($file); # File where obsolete symbol was found + local($old); # Name of this old symbol + local($new); # Value of the new symbol to be used + foreach $key (sort keys %ofound) { + ($file, $old, $new) = ($key =~ /^(\S+)\s+(\S+)\s+(\S+)/); + if ($new =~ s/^\$//) { # We found an obsolete shell symbol + print WANTED "!$old\n"; + } else { # We found an obsolete C symbol + print WANTED "!>$old\n"; + } + } +} + +# Map obsolete symbols from Wanted file into %Obsolete and call dump_obsolete +# to actually build the Obsol_sh.U and Obsol_h.U files. Those will be needed +# during the Configure building phase to actually do the remaping. +# The obsolete symbols found are entered in the %ofound array, tagged as from +# file 'XXX', which is specially recognized by dump_obsolete. +sub map_obsolete { + open(WANTED, 'Wanted') || die "Can't open Wanted file.\n"; + local($new); # New symbol to be used instead of obsolete one + while () { + chop; + next unless s/^!//; # Skip non-obsolete symbols + if (s/^>//) { # C symbol + $new = $Obsolete{$_}; # Fetch new symbol + $ofound{"XXX $_ $new"}++; # Record obsolete match (XXX = no file) + } else { # Shell symbol + $new = $Obsolete{"\$$_"}; # Fetch new symbol + $ofound{"XXX \$$_ $new"}++; # Record obsolete match (XXX = no file) + } + } + close WANTED; +} + diff --git a/mcon/pl/xref.pl b/mcon/pl/xref.pl new file mode 100644 index 0000000..02f4164 --- /dev/null +++ b/mcon/pl/xref.pl @@ -0,0 +1,67 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: xref.pl,v $ +;# Revision 3.0.1.2 1995/09/25 09:20:05 ram +;# patch59: added empty p_layout stub for new ?Y: directives +;# +;# Revision 3.0.1.1 1993/10/16 13:56:23 ram +;# patch12: declared p_public for ?P: lines +;# +;# Revision 3.0 1993/08/18 12:10:31 ram +;# Baseline for dist 3.0 netwide release. +;# +;# Metaxref-dependent part of the dependency extranction. +;# +# Process the ?W: lines +sub p_wanted { + # Syntax is ?W:: + local($active) = $_[0] =~ /^([^:]*):/; # Symbols to activate + local($look_symbols) = $_[0] =~ /:(.*)/; # When those are used + local(@syms) = split(/ /, $look_symbols); # Keep original spacing info + $active =~ s/\s+/\n/g; # One symbol per line + + # Concatenate quoted strings, so saying something like 'two words' will + # be introduced as one single symbol "two words". + local(@symbols); # Concatenated symbols to look for + local($concat) = ''; # Concatenation buffer + foreach (@syms) { + if (s/^\'//) { + $concat = $_; + } elsif (s/\'$//) { + push(@symbols, $concat . ' ' . $_); + $concat = ''; + } else { + push(@symbols, $_) unless $concat; + $concat .= ' ' . $_ if $concat; + } + } + + local($fake); # Fake unique shell symbol to reparent C symbol + + # Now record symbols in master and wanted tables + foreach (@symbols) { + $cmaster{$_} = undef; # Asks for look-up in C files + # Make a fake C symbol and associate that with the wanted symbol + # so that later we know were it comes from + $fake = &gensym; + $cwanted{$_} = "$fake"; # Attached to this symbol + push(@Master, "?$unit:$fake=''"); # Fake initialization + } +} + +# Ingnore the following: +sub p_init {} +sub p_default {} +sub p_library {} +sub p_include {} +sub p_public {} +sub p_layout {} + diff --git a/mcon/pl/xwant.pl b/mcon/pl/xwant.pl new file mode 100644 index 0000000..31508eb --- /dev/null +++ b/mcon/pl/xwant.pl @@ -0,0 +1,149 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: xwant.pl,v $ +;# Revision 3.0 1993/08/18 12:10:32 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# These two arrays record the file names of the files which may (or may not) +;# contain shell or C symbols known by metaconfig. +;# @SHlist records the .SH files +;# @clist records the C-like files (i.e. .[chyl]) +;# +# Parse files and build cross references +sub build_xref { + print "Building cross-reference files...\n" unless $opt_s; + unless (-f $NEWMANI) { + &manifake; + die "No $NEWMANI--don't know who to scan.\n" unless -f $NEWMANI; + } + + open(FUI, "|sort | uniq >I.fui") || die "Can't create I.fui.\n"; + open(UIF, "|sort | uniq >I.uif") || die "Can't create I.uif.\n"; + + local($search); # Where to-be-evaled script is held + local($_) = ' ' x 50000 if $opt_m; # Pre-extend pattern search space + local(%visited); # Records visited files + local(%lastfound); # Where last occurence of key was + + # Map shell symbol names to units by reverse engineering the @Master array + # which records all the known shell symbols and the units where they + # are defined. + foreach $init (@Master) { + $init =~ /^\?(.*):(.*)=''/ && ($shwanted{"\$$2"} = $1); + } + + # Now we are a little clever, and build a loop to eval so that we don't + # have to recompile our patterns on every file. We also use "study" since + # we are searching the same string for many different things. Hauls! + + if (@clist) { + print " Scanning .[chyl] files for symbols...\n" unless $opt_s; + $search = ' ' x (40 * (@cmaster + @ocmaster)); # Pre-extend + $search = "while (<>) {study;\n"; # Init loop over ARGV + foreach $key (keys(cmaster)) { + $search .= "\$cmaster{'$key'} .= \"\$ARGV#\" if /\\b$key\\b/;\n"; + } + foreach $key (grep(!/^\$/, keys %Obsolete)) { + $search .= "&ofound('$key') if /\\b$key\\b/;\n"; + } + $search .= "}\n"; # terminate loop + print $search if $opt_d; + @ARGV = @clist; + # Swallow each file as a whole, if memory is available + undef $/ if $opt_m; + eval $search; + eval ''; + $/ = "\n"; + while (($key,$value) = each(cmaster)) { + next if $value eq ''; + foreach $file (sort(split(/#/, $value))) { + next if $file eq ''; + # %cwanted may contain value separated by \n -- take last one + @sym = split(/\n/, $cwanted{$key}); + $sym = pop(@sym); + $shell = "\$$sym"; + print FUI + pack("A35", $file), + pack("A20", "$shwanted{$shell}.U"), + $key, "\n"; + print UIF + pack("A20", "$shwanted{$shell}.U"), + pack("A25", $key), + $file, "\n"; + } + } + } + + undef @clist; + undef %cwanted; + undef %cmaster; # We're not building Configure, we may delete this + %visited = (); + %lastfound = (); + + if (@SHlist) { + print " Scanning .SH files for symbols...\n" unless $opt_s; + $search = ' ' x (40 * (@shmaster + @oshmaster)); # Pre-extend + $search = "while (<>) {study;\n"; + # All the keys already have a leading '$' + foreach $key (keys(shmaster)) { + $search .= "\$shmaster{'$key'} .= \"\$ARGV#\" if /\\$key\\b/;\n"; + } + foreach $key (grep (/^\$/, keys %Obsolete)) { + $search .= "&ofound('$key') if /\\$key\\b/;\n"; + } + $search .= "}\n"; + print $search if $opt_d; + @ARGV = @SHlist; + # Swallow each file as a whole, if memory is available + undef $/ if $opt_m; + eval $search; + eval ''; + $/ = "\n"; + while (($key,$value) = each(shmaster)) { + next if $value eq ''; + foreach $file (sort(split(/#/, $value))) { + next if $file eq ''; + print FUI + pack("A35", $file), + pack("A20", "$shwanted{$key}.U"), + $key, "\n"; + print UIF + pack("A20", "$shwanted{$key}.U"), + pack("A25", $key), + $file, "\n"; + } + } + } + + close FUI; + close UIF; + + # If obsolete symbols where found, write an Obsolete file which lists where + # each of them appear and the new symbol to be used. Also write Obsol_h.U + # and Obsol_sh.U in .MT for later perusal. + + &dump_obsolete; # Dump obsolete symbols if any + + # Clean-up memory by freeing useless data structures + undef @SHlist; + undef %shmaster; +} + +# This routine records matches of obsolete keys (C or shell) +sub ofound { + local($key) = @_; + local($_) = $Obsolete{$key}; # Value of new symbol + $ofound{"$ARGV $key $_"}++; # Record obsolete match + $cmaster{$_} .= "$ARGV#" unless /^\$/; # A C hit + $shmaster{$_} .= "$ARGV#" if /^\$/; # Or a shell one +} + diff --git a/pat/Jmakefile b/pat/Jmakefile new file mode 100644 index 0000000..3edf094 --- /dev/null +++ b/pat/Jmakefile @@ -0,0 +1,68 @@ +/* + * Jmakefile for patching tools. + */ + +;# $Id: Jmakefile,v 3.0.1.3 1995/07/24 09:57:21 ram Exp ram $ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: Jmakefile,v $ +;# Revision 3.0.1.3 1995/07/24 09:57:21 ram +;# patch56: was missing an entry for the patlog program +;# +;# Revision 3.0.1.2 1994/01/24 13:42:48 ram +;# patch16: added dependency generation stage +;# +;# Revision 3.0.1.1 1993/08/24 12:09:05 ram +;# patch3: added patnotify and patsnap +;# +;# Revision 3.0 1993/08/18 12:10:32 ram +;# Baseline for dist 3.0 netwide release. +;# + +/* BASE is used to give the extensions for pat* files. Usually, '//' can be + * used to specify a null expansion pattern, but some of those new smart cpp + * now think it's a up-to-end-of-line comment--why do they do that to us? + */ +BASE = /^^/ cil base diff make clean col name ftp send \ + index post notify snap log + +/* PAT is derived from BASE and is the list of all the files to produce */ +PAT = \ +|expand f!$(BASE)! + pat!f \ +-expand \\ + +NoManPages() /* There is a single man page for all tools */ +SimpleShellScriptTarget($(PAT)) + +>SCRIPTDIR /* Grrr... I have to find a nicer way!! */ +>MANSRC /* Idem!! */ + +InstallMultipleFlags($(PAT),$(SCRIPTDIR),-m 555) +InstallManPage(pat,$(MANSRC)) + +PATSH = \ +|expand f!$(PAT)! + !f.SH \ +-expand \\ + +>SED +>RM +>MKDEP + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(PATSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + diff --git a/pat/Makefile.SH b/pat/Makefile.SH new file mode 100755 index 0000000..8424f98 --- /dev/null +++ b/pat/Makefile.SH @@ -0,0 +1,269 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile [jmake 3.0 PL55] +: $X-Id: Jmake.tmpl,v 3.0.1.2 1995/01/11 14:50:21 ram Exp ram $ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=pat +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules,v 3.0.1.3 1995/03/21 08:35:28 ram Exp ram $ +######################################################################## +# Force 'make depend' to be performed first -- do not edit + +.FORCE_DEPEND:: + +all:: .FORCE_DEPEND + +######################################################################## +# Start of Jmakefile + +# $X-Id: Jmakefile,v 3.0.1.3 1995/07/24 09:57:21 ram Exp ram $ +# +# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +# +# You may redistribute only under the terms of the Artistic Licence, +# as specified in the README file that comes with the distribution. +# You may reuse parts of this distribution only within the terms of +# that same Artistic Licence; a copy of which may be found at the root +# of the source tree for dist 4.0. +# +# $X-Log: Jmakefile,v $ +# Revision 3.0.1.3 1995/07/24 09:57:21 ram +# patch56: was missing an entry for the patlog program +# +# Revision 3.0.1.2 1994/01/24 13:42:48 ram +# patch16: added dependency generation stage +# +# Revision 3.0.1.1 1993/08/24 12:09:05 ram +# patch3: added patnotify and patsnap +# +# Revision 3.0 1993/08/18 12:10:32 ram +# Baseline for dist 3.0 netwide release. +# + +BASE = // cil base diff make clean col name ftp send \ + index post notify snap log + +PAT = \ + pat \ + patcil \ + patbase \ + patdiff \ + patmake \ + patclean \ + patcol \ + patname \ + patftp \ + patsend \ + patindex \ + patpost \ + patnotify \ + patsnap \ + patlog + +all:: $(PAT) + +local_realclean:: + $(RM) $(PAT) + +pat: pat.SH + /bin/sh pat.SH + +patcil: patcil.SH + /bin/sh patcil.SH + +patbase: patbase.SH + /bin/sh patbase.SH + +patdiff: patdiff.SH + /bin/sh patdiff.SH + +patmake: patmake.SH + /bin/sh patmake.SH + +patclean: patclean.SH + /bin/sh patclean.SH + +patcol: patcol.SH + /bin/sh patcol.SH + +patname: patname.SH + /bin/sh patname.SH + +patftp: patftp.SH + /bin/sh patftp.SH + +patsend: patsend.SH + /bin/sh patsend.SH + +patindex: patindex.SH + /bin/sh patindex.SH + +patpost: patpost.SH + /bin/sh patpost.SH + +patnotify: patnotify.SH + /bin/sh patnotify.SH + +patsnap: patsnap.SH + /bin/sh patsnap.SH + +patlog: patlog.SH + /bin/sh patlog.SH + + +install:: $(PAT) + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in $(PAT); do \ + (set -x; $(INSTALL) -c -m 555 $$i $(SCRIPTDIR)); \ + done + +deinstall:: + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in $(PAT); do \ + (set -x; $(RM) $(SCRIPTDIR)/$$i); \ + done + +install.man:: pat.man + $(INSTALL) -c -m 444 pat.man $(MANSRC)/pat.$(L) + +deinstall.man:: + $(RM) $(MANSRC)/pat.$(L) + +PATSH = \ + pat.SH \ + patcil.SH \ + patbase.SH \ + patdiff.SH \ + patmake.SH \ + patclean.SH \ + patcol.SH \ + patname.SH \ + patftp.SH \ + patsend.SH \ + patindex.SH \ + patpost.SH \ + patnotify.SH \ + patsnap.SH \ + patlog.SH + +depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + grep '^\$$grep' $(PATSH) | \ + $(SED) -e "s/^.*' \([^ ]*\) >>\([^ ]*\)/\2: \1/" \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + +######################################################################## +# Common rules for all Makefiles -- do not edit + +emptyrule:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + $(RM) core *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; exit 0; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.[ch] + $(CTAGS) -xw *.[ch] > tags + +local_clobber:: + $(RM) tags + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +install:: + @echo "install in $(CURRENT) done." + +deinstall:: + @echo "deinstall in $(CURRENT) done." + +install.man:: + @echo "install.man in $(CURRENT) done." + +deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." +Makefiles:: + +Makefiles.SH:: + +######################################################################## +# Dependencies generated by make depend +# DO NOT DELETE THIS LINE -- make depend relies on it + +# Put nothing here or make depend will gobble it up +.FORCE_DEPEND:: + @echo "You must run 'make depend' in $(TOP) first."; exit 1 +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile + diff --git a/pat/README b/pat/README new file mode 100644 index 0000000..20e15ec --- /dev/null +++ b/pat/README @@ -0,0 +1,120 @@ +This is the root directory for pat tools. + +This directory contains an automatic patch generator. You must have RCS +to use this. You must also have run packinit in the top level directory +of your package to create a .package file. + +When you've modified a file in your package, the pat program is used to +control the whole process. The other programs can be called by hand, but +usually needn't be. Run pat from the top level directory of your package. + +The pat, patcil, patdiff, and patbase programs take a list of filenames as +arguments. Alternately, a -a means all files listed in MANIFEST. + +Patcil will create an RCS directory if necessary. However, it may not check in +things which require special initializaton properly. For example, if you +want to check in a shell script, you'd better make your RCS directory yourself +and then say + + rcs -i -c'# ' blurfl.xsh + +before running pat or patcil. Otherwise the RCS log may not be commented +properly. Unless of course you are using a standard extension (like .c for +a C file) or have placed the proper comments in front of the $Log marker +within the file itself--patcil will then correctly guess the type of +comment required. + +Patdiff will create a bugs directory in your top level directory, and will want +to find a patchlevel.h file in that same directory. Everything is done from +that top level directory--don't put any patchlevel.h or bugs directories in +your subdirectories. Each subdirectory has its own RCS directory though. + +Patpost, patsend and patftp may be used to post to Usenet, mail to someone, +or copy patches to your ftp directory. They take a destination and a list +of patches to process. + +Those pat tools are an hopefully enhanced version of the tools that +came with Larry Wall's dist 2.0. There are however a few new scripts: + + - patclean, which checks in the mods and removes the working files. + - patcol, which restores the files removed by a patclean. + - patname, which sets a symbolic version number. + +Here is the way I am using the pat tools... + +First, I set up a MANIFEST.new file. If you are converting an existing +distribution to use dist, the manifake script will convert a MANIFEST +into a MANIFEST.new (removing the possible archive number column). + +Then I run packinit to modify the version number and set up things +correctly. The package is then ready to be placed under pat control. +I make sure the file patchlevel.h is correctly set and I run: + + patcil -f -a -s + touch patchlevel.h + find . -name "*~" -exec /bin/rm -f {} \; -print + +There is a prototypical patchlevel.h file in this directory, so you +might want to have a look at it. + +[If you are planning on using the mailagent to send the patches (and sort +your mail -- that's its primary goal now), the you must make sure +the patchelevel.h file is locatated in the root directory of your package. +The mailagent program is available separately, and was posted on the +comp.sources.misc newsgroup] + +Now everything is ready. The distribution is frozen, the bugs directory +has been created. I issue a makedist -v to create the distribution kits. +Eventually I set up the mailagent so that people can request for the +distribution automatically. If I want to create a directory containing +the lattest sources (to be able to `kit' them to someone using the kit +program -- posted to comp.sources.unix), I use: + + makedist -c -@ + +for instance, for dist 2.9 at PL26 + + makedist -c dist-2.9@26 + +which I can then send to people directly with kit (which is NOT part +of this release). + +As I receive patches or find some bugs, I edit the files and make the +modifications. When I want to issue an official patch, I run: + + pat -n + +and one or more patches are issued. You can compress the patches in the +bugs subdirectory, since the mailpatch program knows about that. Also +patindex will correctly uncompress them. + +When I need to clean up the distribution directory, I use: + + patclean -a + +which checks in every changes and removes the working files. The whole +set of working files can then be restored by: + + patcol -a + +Sometimes, I made a couple of modification and I don't want to issue +a patch right now. I then run: + + patcil -a + +which checks in the changes. You can run this as many times as you want, +because patcil will skip unchanged file and remembers the last time you +issued a patch. + +If you are still using RCS 4.3, be sure you use makedist and not your +own shell archiver, as the $Locker symbol has an annoying expansion +which makes patch to fail when applyed. I'm not sure this was correctly +fixed with RCS 5.5 as I am not using it yet for various reasons. + +In any case, if you are using the copyright expansion feature (i.e. the +stuffing of the COPYRIGHT token surrounded by '@' -- can't do it here +or it will get expanded...), then you must use makedist to make sure +the copyright is properly written in all your files. Distributing files +with an un-expanded COPYRIGHT token in them would be a disaster, since +the patching system will also expand them before building a patch and +some of your hunks may not apply correctly. diff --git a/pat/pat.SH b/pat/pat.SH new file mode 100755 index 0000000..6b7d52d --- /dev/null +++ b/pat/pat.SH @@ -0,0 +1,154 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/pat (with variable substitutions)" +cat >pat < +# +# $Log: pat.SH,v $ +# Revision 3.0.1.5 1994/10/29 16:37:53 ram +# patch36: now unlinks all the files created by patlog in bugs +# +# Revision 3.0.1.4 1994/01/24 14:29:17 ram +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.3 1993/08/25 14:04:35 ram +# patch6: removal of patch temporary files did not work with gaps +# +# Revision 3.0.1.2 1993/08/24 12:14:39 ram +# patch3: now removes older patch temporary files within bugs +# +# Revision 3.0.1.1 1993/08/19 06:42:31 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:36 ram +# Baseline for dist 3.0 netwide release. +# + +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +!GROK!THIS! +cat >>pat <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("ahmnV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +&readpackage; + +if (-f 'patchlevel.h') { + open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; + while () { + $bnum = $1 if /^#define\s+PATCHLEVEL\s+(\d+)/; + } + die "$progname: malformed patchlevel.h file.\n" if $bnum eq ''; + ++$bnum; +} else { + $bnum=1; +} + +if ($opt_n) { + &newer; # Look for files newer than patchlevel.h +} elsif ($opt_a) { + open(MANI,"MANIFEST.new") || die "No MANIFEST.new found.\n"; + @ARGV = (); + while () { + s|^\./||; + next if m|^patchlevel.h|; # This file is built by hand + chop; + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MANI; +} elsif ($opt_m) { + open(MODS,"bugs/.mods$bnum") || die "$progname: no modification found.\n"; + @ARGV = (); + while () { + next if m|^patchlevel.h$|; # This file is built by hand + chop; + ($_) = split(' '); + push(@ARGV,$_); + } + close MODS; +} + +# Remove older patch temporary files + +@patlist = &patseq($bnum - 1); +foreach $cpat (@patlist) { + unlink ; + unlink ; +} + +# Since we're about to launch other pat exectuables, disable ~/.dist_profile +# to protect them if they added some weird switches we don't need... + +$ENV{'DIST'} = '/dev/null'; # Disable ~/.dist_profile + +system 'perl', '-S', 'patcil', '-p', @ARGV; + +# Update MANIFEST if necessary, then patcil it. + +if (-f 'MANIFEST' && `diff MANIFEST.new MANIFEST 2>/dev/null` ne '') { + system 'cp', 'MANIFEST.new', 'MANIFEST'; + system 'perl', '-S', 'patcil', '-p', 'MANIFEST'; + push(@ARGV, 'MANIFEST'); +} + +system 'perl', '-S', 'patdiff', @ARGV; +system 'perl', '-S', 'patmake'; + +sub usage { + print STDERR "Usage: $progname [-ahmnV] [filelist]\n"; + print STDERR " -a : all the files in MANIFEST.new\n"; + print STDERR " -h : print this message and exit\n"; + print STDERR " -m : all the modified files (which have been patciled)\n"; + print STDERR " -n : all the files newer than patchlevel.h\n"; + print STDERR " -V : print version number and exit\n"; + exit 1; +} + +!NO!SUBS! +$grep -v '^;#' ../pl/newer.pl >>pat +$grep -v '^;#' ../pl/package.pl >>pat +$grep -v '^;#' ../pl/patseq.pl >>pat +$grep -v '^;#' ../pl/tilde.pl >>pat +$grep -v '^;#' ../pl/profile.pl >>pat +chmod +x pat +$eunicefix pat diff --git a/pat/pat.man b/pat/pat.man new file mode 100644 index 0000000..2d46a8c --- /dev/null +++ b/pat/pat.man @@ -0,0 +1,513 @@ +.rn '' }` +''' $Id: pat.man,v 3.0.1.7 1997/02/28 16:32:45 ram Exp ram $ +''' +''' Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +''' +''' You may redistribute only under the terms of the Artistic Licence, +''' as specified in the README file that comes with the distribution. +''' You may reuse parts of this distribution only within the terms of +''' that same Artistic Licence; a copy of which may be found at the root +''' of the source tree for dist 4.0. +''' +''' $Log: pat.man,v $ +''' Revision 3.0.1.7 1997/02/28 16:32:45 ram +''' patch61: documents contents of the message sent by patnotify +''' +''' Revision 3.0.1.6 1995/09/25 09:20:41 ram +''' patch59: new -i option for patsend to add extra instructions +''' +''' Revision 3.0.1.5 1995/05/12 12:25:28 ram +''' patch54: updated my e-mail address +''' +''' Revision 3.0.1.4 1994/10/29 16:38:31 ram +''' patch36: documents new patlog script and the files it uses +''' patch36: the RCS layer section has been extended slightly +''' +''' Revision 3.0.1.3 1993/08/27 14:40:19 ram +''' patch7: random cleanup +''' +''' Revision 3.0.1.2 1993/08/25 14:05:02 ram +''' patch6: new -q option for patsend and patnotify +''' +''' Revision 3.0.1.1 1993/08/24 12:15:42 ram +''' patch3: added patnotify and patsnap +''' patch3: patcol has a new -S option +''' patch3: the users file built by mailagent is now listed under FILES +''' +''' Revision 3.0 1993/08/18 12:10:37 ram +''' Baseline for dist 3.0 netwide release. +''' +.de Sh +.br +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' +.ie n \{\ +.tr \(*W-\*(Tr +.ds -- \(*W- +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +.ds L' ' +.ds R' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds L' ` +.ds R' ' +'br\} +.TH PAT 1 ram +.SH NAME +pat \- patch generator tools +.SH SYNOPSIS +.B pat +[ +.B \-ahmnV +] [ +.I filelist +] +.br +.B patcil +[ +.B \-abfhnpqsV +] [ +.I filelist +] +.br +.B patdiff +[ +.B \-ahnV +] [ +.I filelist +] +.br +.B patbase +[ +.B \-ahV +] [ +.I filelist +] +.br +.B patlog +[ +.B \-hnruV +] +.br +.B patmake +[ +.B \-hV +] +.br +.B patsend +[ +.B \-hiquV +] [ +.I patchlist +] [ +.I recipients +] +.br +.B patnotify +[ +.B \-hquV +] [ +.I recipients +] +.br +.B patpost +[ +.B \-hrV +] +.I patchlist +.I newsgroups +.br +.B patftp +[ +.B \-hV +] [ +.I patchlist +] +.br +.B patname +[ +.B \-ahnmV +] +.B \-v +.I version +[ +.I filelist +] +.br +.B patsnap +[ +.B \-ahV +] [ +.B \-o +.I snapshot +] [ +.I filelist +] +.br +.B patcol +[ +.B \-achnmsCV +] [ +.B \-d +.I directory +] [ +.B \-f +.I mani +] [ +.B \-S +.I snap +] [ +.I filelist +] +.br +.B patclean +[ +.B \-ahnmV +] [ +.I filelist +] +.br +.B patindex +.SH DESCRIPTION +.I Pat +and its associated programs generate patches for any package that has been +stored under RCS. +These programs hide many of the details of RCS that get in your way when +constructing and maintaining a package. +All you need to do to create a new patch is to edit your files, run pat, +and furnish some descriptions to RCS and in the generated patch file. +Details such as how to initialize a new RCS file, what the comment string should +be, how create a new branch, +how to deal with subdirectories, how to do diffs and how to +organize the patch file are handled automatically. +.PP +Before using any of the pat programs you must initialize your package by +running packinit in the top-level directory of your package. +This produces a .package file that all of the dist programs make use of. +.PP +In any of the programs that want a filelist, if you specify +.B \-a +instead, +all files in MANIFEST.new will be processed. +In any of the programs that want a patchlist, a null patchlist means the +current patch. +You may use hyphens, commas and spaces to delimit patch numbers. +If the right side of a hyphen is the null string, the current patchlevel +is assumed as the maximum value. All the programs invoked with \fB\-h\fR +will print a small usage message with the meaning of each available options. +The \fB\-V\fR option gives the current version number. +.PP +Pat itself is a wrapper program that calls patcil, patdiff, and patmake. +Usually you can just invoke pat and ignore all the others. +Pat will update the MANIFEST file, if necessary (it will be an +exact copy of the MANIFEST.new file, provided that a MANIFEST already +existed), eventually calling patcil on it. +.PP +If you specify +.B \-n +instead of a filelist, pat will find all files that are +newer than patchlevel.h, put you into an editor to trim down the list, +then use that file list. +If every file of the list is removed, \fIpat\fR will be aborted. +.PP +.I Patcil +is used to do a ci -l on any listed files. +(It is assumed that you always want to keep your files checked out.) +In addition to the +.B \-a +switch, there is a +.B \-b +switch which does a quick checkin of +a set of files. +Instead of calling rcs on each file, it calls rcs on the whole list of +files. +This is useful for checking in a trunk revision. +When you are checking in a new trunk revision you might also want to use +the +.B \-s +flag which will strip out old RCS Log entries from the previous revision +so that you can start over fresh. +You probably should also use a +.B \-f +which is passed through to the ci to force unchanged files to be checked in. +To check in a new trunk revision, I say +.nf + + patcil -s -f -a + +.fi +.PP +Patcil will ask for the log entry instead of letting ci do it, and has a little +prompter built in that lets you manipulate the message in various ways. +Type h for a listing of what you can do. +One of the nicest things is that you can pop up into an editor, optionally +with a diff listing of the changes since the last patch, in case you've +forgotten what you changed. +If you type a CR as the first thing, it includes the +previous log message. +Exit the prompter with a CR. +.PP +There are two different ways to use patcil. +You can either call patcil yourself, or let pat call it for you. +It doesn't matter how many times you call patcil before running pat, since +patdiff knows what the last patch base is to compare with. +Patcil can be called in any of your directories; the other programs must +be called in your top-level directory (or in bugs, when meaningful). +.PP +When you are creating a new file at a given patchlevel, you must patcil it +with the +.B \-p +option. Otherwise, it will simply be checked-in as +a new trunk revision. The name of the file will be added to the MANIFEST.new +if it does not already appear in it. If the name is found along with a +description, that description will be passed through to rcs to properly +initialize the RCS file. +.PP +.I Patbase +can be used to reset the patch base to the current version when +you've scrapped the previous patch sequence and are making a new distribution +kit. +What it really does is an rcs -Nlastpat:REV, where REV is the current +revision. +If patdiff blows up and you want to set the patch base back to some previous +version, you have to call rcs -Nlastpat:REV yourself. +.PP +.I Patdiff +actually does the diffs that go into the patch, comparing whatever +version -Nlastpat points to with the most recently checked in version. +It then updates -Nlastpat to point to the current version. +It leaves the diff sitting in the bugs subdirectory for patmake to pick up. +It can either use rcsdiff, or a diff command of your choice specified when +you run packinit, in case your diff is better than rcsdiff. +.PP +.I Patlog +is invoked by \fIpatmake\fR usually, to update the \fIChangeLog\fR file +(or whatever name that file has been given when you ran \fIpackinit\fR). +It will gather log messages and launch an editor for you to make the +necessary updates. +If you have configured your package to also include RCS logs +in the \fIChangeLog\fR, another editor session will be launched for those +too. Finally, a final log is built as a candidate entry for \fIChangeLog\fR, +which you may also modify as you wish. +.PP +When you don't have configured a \fIChangeLog\fR file, \fIpatlog\fR will only +gather the information it needs to pass on to \fIpatmake\fR and will exit. +If you wish to call it yourself, you must do that after a least one +sucessfull \fIpatdiff\fR run. I recommend using the \fB\-n\fR option the +first time, and then use the \fB\-u\fR option along with \fB\-n\fR on +subsequent runs to recreate files only when needed. The \fB\-r\fR option +(which supersedes \fB\-u\fR) prevents \fIpatlog\fR from recreating an +existing file, even if it is out of date. +.PP +.I Patlog +will call \fIpatcil\fR and \fIpatdiff\fR on your \fIChangeLog\fR file +(after having stuffed the candidate log entry you edited at the top of the +file), unless prevented to do so by the \fB\-n\fR option. This means the +issued patch will update \fIChangeLog\fR with current patch information, as +you would expect it. +.PP +.I Patmake +combines all the pieces of the patch into one file and invokes +an editor so you can add the subject and description. +It throws all your log messages in as Subjects and as Description, under +the assumption +that it's easier to delete what you don't want than to remember everything +you did. +You'll also want to expand each item in the Description so they don't just +repeat the Subject lines. If you have a \fIChangeLog\fR file, this must have +been done already, or your \fIChangeLog\fR will not accurately represent +what is described in the patch, given that it has already been updated +when \fIpatmake\fR puts together all the pieces (see the note +about \fIpatlog\fR above). +.PP +Big patches will be split in order to keep size of each patch to a reasonable +size. This is handled automatically, so you don't have to bother with it. +The priority of each patch is merely intuited by \fIpatmake\fR, given the +assumption that small changes have a great priority. +.PP +Patsend, patpost and patftp are used to distribute your patches to the world. +.I Patsend +mails a set of patches to a set of recipients. The \fB\-u\fR switch adds all +the currently registered users who have asked for patches to be mailed to +them, as well as the recipients specified while running \fIpackinit\fR. +The \fB\-i\fR switch includes information with the patch about how the user +may deregister themselves so they do not receive future patches automatically; +this is also the default when the \fB\-u\fR switch is used. +.I Patpost +posts a set of patches to a set of newsgroups. +.I Patftp +merely copies the patch into your public ftp directory. +.PP +.I Patnotify +simply notifies users that a new patch has been released so that +they can retrieve it by themselves from an archive site or via e-mail if they +are interested. The \fB\-u\fR switch can be used to include all the currently +registered users who have asked for such a notification. The message includes +the patch priority and description, as well as instructions on how to +automatically request the patch (which will work only if you +have \fImailagent\fR installed). +.PP +Both \fIpatsend\fR and \fIpatnotify\fR let you edit the address list before +actually sending anything, unless you add the \fB\-q\fR option. +.PP +.I Patname +can be used to tag a set of files with a symbolic name (specified with +\fB\-v\fR). This will set the name for the most recent revision of each +file. +.PP +.I Patsnap +will get a snapshot of your release by creating a SNAPSHOT file (name can be +changed via \fB\-o\fR) listing the file names and the latest RCS revision +number for that file. Such snapshots can be used to identify the release +at some random patchlevel and then later be able to retrieve it by feeding +the snapshot file to \fIpatcol\fR. +.PP +.I Patcol +will check out a locked version of a file, eventually in an alternate +directory (specified with \fB\-d\fR, thus mirroring the distribution tree). +All the files which have no RCS counterpart (e.g. patchlevel.h) will be +simply copied by patcol. This is used by makedist to fake the distribution +before making the kits. By default, patcol will not do the copyright expansion +processing, but clients like \fImakedist\fR force it by using its \fB\-C\fR +option. Alternatively, you may force copying of the checked-out version +into a directory by using the \fB\-c\fR switch in conjunction with \fB\-d\fR +(or that former switch is simply ignored). +.PP +.I Patcol +can also take its file list from a SNAPSHOT file via the \fB\-S\fR switch, in +which case it will check out the files using the RCS version specified by the +snapshot file, such as one created by \fIpatsnap\fR. You may instead specify +\fB-a\fR, \fB\-m\fR or \fB\-n\fR to respectively use all the files in +MANIFEST.new, all the modified files (the one which have been \fIpatcil\fRed), +or all the files newer than \fIpatchlevel.h\fR. +.PP +.I Patclean +will remove the working files after having checked in all the +changes. You may restores your working files by using patcol. +.PP +.I Patindex +may be used from the top level directory or within the \fIbugs\fR directory. +It will list all the patches and their \fISubject:\fR lines. This program +knows about compressed patches and will decompress them while producing +the listing. +''' +''' R C S L a y e r +''' +.SH RCS LAYER +This section describes the RCS layer, in case something in the tools breaks, +so that you may fix your RCS files and restart the operation. +.PP +All the patch tools get the main RCS trunk revision number out of your +\&\fI.package\fR files, say it's 2.5. Then, at the time you ran \fIpackinit\fR, +you have chosen a branch for patches, usually number 1, which means all your +modifications will be stored on the 2.5.1 RCS branch. The tools will create +the branch for you when the time comes. +.PP +Each last released revision is tagged with an RCS \fIlastpat\fR symbol. When +the patch is built by \fIpatdiff\fR, the lattest version on the 2.5.1 branch +is compared with the one tagged as \fIlastpat\fR. This is why you may safely +issue more than one \fIpatcil\fR beffore issuing the patch and still have +it all worked out. Of course \fIpatdiff\fR will move the \fIlastpat\fR +tag to the lattest branch revision after processing a given file. +.PP +All the log messages and the modified files are kept in your \fIbugs\fR +directory, in hidden files (name starting with a dot). Those logs will be +collected when the patch is issued and the modified files are used by +\&\fIpat\fR's \fB\-m\fR switch. +.PP +.I Patdiff +collects its patch hunks under the \fIbugs\fR directory, in files +terminating with a \fI.nn\fR extension, where \fInn\fR represents the +current patch level + 1. (Which is going to be the next patchlevel when the +patch will be made by \fIpatmake\fR, unless it is too big to fit in one +file). +.PP +.I Patlog +prepares a set of files for \fIpatmake\fR: the \fI.clog\fR file collects +the information that will go under the Description: section within the +patch, and \fI.xlog\fR ones collect the \fIChangeLog\fR candidate entry. +Finally, \fI.rlog\fR files store the RCS information that is to be included +in the \fIChangeLog\fR, if requested. Note that the topmost three lines +are garbage and are ignored by all the tools handling those files. +.PP +In order to start up a new baseline (i.e. to change the RCS trunk revision +number), you need to rerun \fIpackinit\fR and change that number. Then issue +a new \fIpatcil\fR, probably with the \fB\-s\fR, \fB\-a\fR and \fB\-f\fR +options... +.SH FILES +.PD 0 +.TP 15 +bugs/*.[0-9]+ +Diffs for each file, gathered by \fIpatmake\fR to create a patch +.TP +bugs/patch* +Issued patches (can be compressed with \fIcompress\fR only) +.TP +bugs/.clog[0-9]+ +Description to be filled into the patch (or the first part if the patch is +split into several parts). +.TP +bugs/.logs[0-9]+ +Log messages for that patch +.TP +bugs/.mods[0-9]+ +Files modified in that patch (checked in with \fIpatcil\fR) +.TP +bugs/.pri[0-9]+ +The priority of the next patch, computed +by \fIpatlog\fR for \fIpatmake\fR's perusal. +.TP +bugs/.rlog[0-9]+ +The RCS logs computed by \fIpatlog\fR. +.TP +bugs/.subj[0-9]+ +The Subject: lines for the next patch, computed +by \fIpatlog\fR for \fIpatmake\fR's perusal. +.TP +bugs/.xlog[0-9]+ +The candidate entry for \fIChangeLog\fR. +.TP +users +File filled in by \fImailagent\fR's "@SH package" command, normally +issued by Configure, recording some of the users who kindly registered +themselves. +.PD +.SH ENVIRONMENT +.PD 0 +.TP 15 +PAGER +Which pager to use in patcil (overrides default) +.TP +EDITOR +What editor should be used (overrides default) +.TP +VISUAL +Same role as EDITOR but this one is checked first +.PD +.SH SEE ALSO +makedist(1), metaconfig(1). +.SH BUGS +Most of this should be built into RCS. +.SH AUTHORS +Larry Wall (version 2.0). +.br +Raphael Manfredi . +.rn }` '' diff --git a/pat/patbase.SH b/pat/patbase.SH new file mode 100755 index 0000000..d5d67ad --- /dev/null +++ b/pat/patbase.SH @@ -0,0 +1,122 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patbase (with variable substitutions)" +cat >patbase < +# +# $Log: patbase.SH,v $ +# Revision 3.0.1.3 1994/01/24 14:29:24 ram +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.2 1993/08/24 12:15:58 ram +# patch3: random cleanup +# +# Revision 3.0.1.1 1993/08/19 06:42:32 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:38 ram +# Baseline for dist 3.0 netwide release. +# + +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +!GROK!THIS! +cat >>patbase <<'!NO!SUBS!' + +$progname = &profile; # My name + +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("ahV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +&readpackage; + +$RCSEXT = ',v' unless $RCSEXT; +$TOPDIR = ''; # We are at the top-level directory + +if ($opt_a) { + open(MANI,"MANIFEST.new") || die "No MANIFEST.new found.\n"; + @ARGV = (); + while () { + chop; + s|^\./||; + next if m|^patchlevel.h|; # Special file + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MANI; +} + +foreach $file (@ARGV) { + $files = &rcsargs($file); + @files = split(' ',$files); + $revs=0; + $rlog = `rlog -r$baserev -r$revbranch $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + if (!$revs) { + print "$progname: $file has never been checked in--checking in...\n"; + system 'perl', '-S', 'patcil', $file; + } + elsif ($revs == 1) { + print "Last revision for $file is $baserev.\n"; + system 'rcs', "-Nlastpat:$baserev", @files; + } + else { + ($lastrev) = ($rlog =~ /revision $revbranch\.(\d+)/); + print "Last revision for $file is $revbranch.$lastrev.\n"; + system 'rcs', "-Nlastpat:$revbranch.$lastrev", @files; + } +} + +sub usage { + print STDERR "Usage: $progname [-ahV] [filelist]\n"; + print STDERR " -a : all the files in MANIFEST.new\n"; + print STDERR " -h : print this message and exit\n"; + print STDERR " -V : print version number and exit\n"; + exit 1; +} + +!NO!SUBS! +$grep -v '^;#' ../pl/package.pl >>patbase +$grep -v '^;#' ../pl/rcsargs.pl >>patbase +$grep -v '^;#' ../pl/comment.pl >>patbase +$grep -v '^;#' ../pl/tilde.pl >>patbase +$grep -v '^;#' ../pl/profile.pl >>patbase +chmod +x patbase +$eunicefix patbase diff --git a/pat/patchlevel.h b/pat/patchlevel.h new file mode 100644 index 0000000..66b289a --- /dev/null +++ b/pat/patchlevel.h @@ -0,0 +1,34 @@ +/* + * This is a prototypical patchlevel.h file. Only the line defining + * the PATCHLEVEL symbol is taken into account when patching, so be + * sure to make changes to this file ONLY when you start a new release + * and, of course, before running patcil... + * + * This file must appear in your MANIFEST.new, but it will never be + * checked in by the pat tools. It is automatically updated when a new + * patch is issued. + * + * When using the '-n' option in some pat* scripts, this file is + * taken as a timestamp. So it is best to avoid manual editing unless + * you know what you are doing. + */ + +/* + * $Id$ + * + * Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi + * + * You may redistribute only under the terms of the Artistic Licence, + * as specified in the README file that comes with the distribution. + * You may reuse parts of this distribution only within the terms of + * that same Artistic Licence; a copy of which may be found at the root + * of the source tree for dist 4.0. + * + * $Log: patchlevel.h,v $ + * Revision 3.0 1993/08/18 12:10:39 ram + * Baseline for dist 3.0 netwide release. + * + */ + +#define VERSION 3.0 /* For instance */ +#define PATCHLEVEL 0 /* This line is a mandatory */ diff --git a/pat/patcil.SH b/pat/patcil.SH new file mode 100755 index 0000000..6e181d3 --- /dev/null +++ b/pat/patcil.SH @@ -0,0 +1,541 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patcil (with variable substitutions)" +$cat >patcil < +# +# $Log: patcil.SH,v $ +# Revision 3.0.1.4 1994/10/29 16:42:12 ram +# patch36: now honors the VISUAL and EDITOR environment variables +# patch36: newer RCS programs chop trailing spaces in log messages +# patch36: separated V/E and v/e commands +# patch36: new 'v' command to edit the file being patcil'ed +# patch36: added hook for 'V' command (not implemented yet) +# +# Revision 3.0.1.3 1994/01/24 14:30:04 ram +# patch16: now prefix error messages with program's name +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.2 1993/08/25 14:05:35 ram +# patch6: moved geteditor to ../pl/editor.pl +# +# Revision 3.0.1.1 1993/08/19 06:42:33 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:40 ram +# Baseline for dist 3.0 netwide release. +# + +\$defeditor = '$defeditor'; +\$pager = '$pager'; +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +!GROK!THIS! +cat >>patcil <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("abfhnpqsV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$RCSEXT = ',v' unless $RCSEXT; +$PAGER = $ENV{'PAGER'} || "$pager"; +$EDITOR = &geteditor; + +system 'mkdir', 'RCS' unless -d 'RCS'; + +chop($pwd = `pwd`) unless -f '.package'; +until (-f '.package') { + die "$progname: no .package file! Run packinit.\n" unless $pwd; + chdir '..' || die "Can't cd .."; + $pwd =~ s|(.*)/(.*)|$1|; + $prefix = $2 . '/' . $prefix; +} +if ($prefix) { + for (@ARGV) { + s/^/$prefix/ unless m|^[-/]|; + } +} + +# We now are at the top level + +&readpackage; + +if (-f 'patchlevel.h') { + open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; + while () { + $bnum = $1 if /^#define\s+PATCHLEVEL\s+(\d+)/; + } + die "$progname: malformed patchlevel.h file.\n" if $bnum eq ''; + ++$bnum; +} else { + $bnum=1; +} + +system 'mkdir', 'bugs' unless -d 'bugs'; +open(LOGS,">>bugs/.logs$bnum"); # Remember logs for patmake +open(MODS,">>bugs/.mods$bnum"); # Remember modified files + +push(@sw,'-q') if $opt_q; +push(@sw,'-f') if $opt_f; + +if ($opt_a) { + open(MANI,"MANIFEST.new") || die "$progname: can't read MANIFEST.new: $!\n"; + @ARGV = (); + while () { + chop; + s|^\./||; + next if m|^patchlevel.h|; # Special file + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MANI; +} elsif ($opt_n) { + &newer; +} + +@filelist = @ARGV; + +sub CLEANUP { + print "$progname: Warning: restore $ARGV\n"; + exit 1; +} + +if ($opt_s) { + open(TTY,">/dev/tty"); + select(TTY); + $| = 1; + select(stdout); + $SIG{'INT'} = 'CLEANUP'; + while (<>) { + if (/^(.*)\$Log[:\$]/) { + $comment = $1; + $comment =~ s/\s+$//; # Newer RCS chop spaces on emtpy lines + $len = length($comment); + print; + $lastnl = 1; + logline: while (<>) { + $c = substr($_,0,$len); + last logline unless $c eq $comment; + $_ = substr($_,$len,999); + if ($lastnl) { + unless (/^\s*Revision\s+\d/) { + $_ = $comment . $_; + last logline; + } + $lastnl = 0; + } else { + $lastnl = 1 if /^\s*$/; + } + } + } + } + continue { + print; + if ($ARGV ne $oldargv) { + print TTY "$progname: stripping $ARGV...\n"; + $oldargv = $ARGV; + } + } + $SIG{'INT'} = 'DEFAULT'; + close TTY; +} + +if ($opt_b) { + $flist = &rcsargs(@filelist); + @flist=split(' ',$flist); + system 'rcs', '-u', @flist; + system 'rcs', "-l$revbranch", @flist; + system 'ci', '-l', "-r$revbranch", @sw, @flist; + exit 0; +} + +open(MANI,"MANIFEST.new") || die "$progname: can't open MANIFEST.new: $!\n"; +while () { + # Find how many spaces the user wants before comments + $space || /(\S+\s+)\S+/ && ($space = length($1)); + ($file,$file_comment) = m|(\S+)\s+(.*)|; + $inmani{$file} = 1; # File is listed in MANIFEST + $comment{$file} = $file_comment; # Save comments +} +close MANI; +$space = 29 unless $space; # Default value + +file: foreach $file (@filelist) { + $files = &rcsargs($file); + @files = split(' ',$files); + $file = $files[1] if $file =~ /\.$RCSEXT$/; + unless ($inmani{$file}) { + print "$file does not appear to be in your MANIFEST.new--add? [y] "; + $ans = ; + if ($ans !~ /^n/i) { + print "MANIFEST.new comment? "; + $file_comment = ; + chop($file_comment); + $spacenum = $space - length($file); + $blank = " "; + $blank = " " x $spacenum unless $spacenum < 1; + `echo '${file}${blank}$file_comment' >>MANIFEST.new`; + if (-f 'MANIFEST') { + print "(Also adding file to your MANIFEST)\n"; + # Add a (new) at the end, so the two manifests will + # differ and thus manifest will get patched correctly. + `echo '${file}${blank}$file_comment (new)' >>MANIFEST`; + print MODS "MANIFEST\n"; + } + } else { + $file_comment = ""; # No file, no comment + } + } + $is_first = 0; # Suppose this is not the first cil + $revs = 0; # Makes revs a numeric variable + $rlog = `rlog -r$baserev -r$revbranch $files 2>&1`; + ($total) = ($rlog =~ /total revisions: (\d+)/); + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + $comment = &rcscomment($file); + if (!$revs) { + if ($total) { + if ($rlog !~ /locks:\s*;/) { + system 'rcs', '-u', @files; # unlock branch + } + # New trunck revision + system 'rcs', '-l', @files; # lock trunk + } + else { + $file_comment = $comment{$file} if $inmani{$file}; + if ($comment ne '') { + &feed($file_comment, 'rcs', '-i', "-c$comment", @files); + } else { + &feed($file_comment, 'rcs', '-i', @files); + } + } + if ($opt_p) { # check in null as trunk revision + rename($file, "$file.xxx"); + `cp /dev/null $file` unless -f $file; + &cil_col("empty\n", $baserev); + system 'rcs', "-Nlastpat:$baserev", @files; + rename("$file.xxx", $file); + $mess = &getlog($file); + next file if $mess eq 'nope'; + system 'rcs', '-u', @files; # Unlock trunck + &feed($mess, 'ci', "-l$revbranch", @sw, @files) unless $?; + } else { + $is_first = 1; # This is the first cil + $mess = &getlog($file); + next file if $mess eq 'nope'; + &cil_col($mess, $baserev); + system 'rcs', "-Nlastpat:$baserev", @files; + } + } else { + if (!$opt_f) { + if ($revs == 1) { + $delta = `rcsdiff -r$baserev $files 2>/dev/null`; + } else { + $delta = `rcsdiff -r$revbranch $files 2>/dev/null`; + } + if ($delta eq '') { # No change in file + print "$progname: no changes in $file since last patcil.\n"; + next; # Skip file + } + } + if ($revs == 1) { + $mess = &getlog($file); + next file if $mess eq 'nope'; + &cil_cil($mess, $revbranch); + } else { + $mess = &getlog($file); + next file if $mess eq 'nope'; + &cil_col($mess, $revbranch); + } + } +} + +# Used for the first revisions on a branch +sub cil_cil { + local($mess) = shift(@_); + local($rev) = shift(@_); + if (&feed($mess, 'ci', @sw, "-l$rev", @files)) { + print "$progname: unlocking and trying again...\n"; + system 'rcs', '-u', @files; + &feed($mess, 'ci', @sw, "-l$rev", @files) unless $?; + } +} + +# Run a ci -l on the file. If this fails, try to lock the file first. +# If this fails again, try again with a separate checkout. +sub cil_col { + local($mess) = shift(@_); + local($rev) = shift(@_); + if (&feed($mess, 'ci', @sw, "-l$rev", @files)) { + print "$progname: locking and trying again...\n"; + if ($rev =~ /\d+\.\d+\.\d+/) { + system 'rcs', "-l$rev", @files; # Lock branch + } else { + system 'rcs', '-l', @files; # Lock trunck + } + if (&feed($mess, 'ci', @sw, "-l$rev", @files)) { + print "$progname: trying again with separate checkout...\n"; + if (&feed($mess, 'ci', @sw, "-r$rev", @files)) { + system 'rcs', "-u$rev", @files unless $?; + system 'co', "-l$rev", @files unless $?; + } else { + print "$progname: sorry, giving up...\n"; + } + } + } +} + +sub feed { + local($mess) = shift(@_); + open(FORK,"|-") || exec @_; + print FORK $mess; + close FORK; + $?; +} + +sub getlog { + local($file) = @_; + local($mess) = ''; + local($prefix) = "patch$bnum: "; + local($prompt) = $comment; + local($len); + $prompt = '>> ' unless $prompt; + $prefix = '' if $is_first; + print "Type log message for $file (finish with ., CR for previous):\n"; + try: for (;;) { + line: for (print "$prompt$prefix";;print "$prompt$prefix") { + if ($always) { + print "\n"; + $line = ''; + } else { + $line = ; + } + if ($line =~ /^\.?$/) { + if ($mess) { + last line; + } else { + $line = 'p'; + } + } + if ($line =~ /^[h?]$/) { + print " +CR or . Terminate log message. +! Start command in a subshell. +D Print out diff listing since last patch. +N Give name of the current file. +E Call editor for log message with a diff listing. +V Call editor for file with a context diff added to HISTORY. +X Extract HISTORY and append it to current log message. +a Always use this message. +d Print out diff listing since last patcil. +f Forget message I have so far. +h or ? This help message. +l List what I have so far. +n Forget this file; go to next file if any. +p Append previous message. +r Print out the rlog for this file. +e Call editor for log message. +v Call editor for file. +x Toggle patch# prefix. + +"; + next line; + } + if ($line =~ /^!(.*)$/) { + $_ = $1; + $_ = ($ENV{'SHELL'} || "/bin/sh") if $1 eq ''; + system $_; + next line; + } + if ($line =~ /^E$/) { + $mess .= "\n" . `rcsdiff -c -rlastpat $files`; + } + if ($line =~ /^e$/) { + $mess = &edit($mess); + next line; + } + if ($line =~ /^V$/) { + ######## FIXME ######### + # Will do something like: + # &add_history($file, `rcsdiff -c -rlastpat $files`); + # HISTORY + # Extract or add this. Create it if not already there. + # $Log + # $EndLog <<-- stops HISTORY and COPYRIGHT lookup + ######################## + print "HISTORY processing not implemented yet.\n"; + print "(You have to use 'E' to get old 'V' processing).\n"; + next line; + } + if ($line =~ /^v$/) { + system $EDITOR, $file; + next line; + } + if ($line =~ /^r$/) { + system "rlog $files | $PAGER"; + next line; + } + if ($line =~ /^D$/) { + if ($revs == 0) { + print "Sorry. There is no revision for this file yet.\n"; + } else { + system "rcsdiff -c -rlastpat $files | $PAGER"; + } + next line; + } + if ($line =~ /^d$/) { + if ($revs == 0) { + print "Sorry. There is no revision for this file yet.\n"; + } + elsif ($revs == 1) { + system "rcsdiff -c -r$baserev $files | $PAGER"; + } else { + system "rcsdiff -c -r$revbranch $files | $PAGER"; + } + next line; + } + if ($line =~ /^N$/) { + print "Typing log message for $file.\n"; + next line; + } + if ($line =~ /^f$/) { + $mess = ''; + next line; + } + if ($line =~ /^a$/) { + $always++ if $mess || $prevmess; + next line; + } + if ($line =~ /^n$/) { + $mess = 'nope'; + last line; + } + if ($line =~ /^l$/) { + foreach $line (split(/\n/,$mess)) { + print $prompt,$line,"\n"; + } + next line; + } + if ($line =~ /^p$/) { + $mess .= $prevmess; + foreach $line (split(/\n/,$prevmess)) { + print $prompt,$line,"\n"; + } + next line; + } + if ($line =~ /^X$/) { + foreach $line (split(/\n/, &xtract_history($file))) { + $mess .= $prompt . $line . "\n"; + print $prompt,$line,"\n"; + } + next line; + } + if ($line =~ /^x$/) { + $prefix = $prefix ? '' : "patch$bnum: "; + next line; + } + $mess .= $prefix . $line; + $len = length($comment . $prefix . $line); + if ($len > 80) { + print "(Warning: last line longer than 80 chars)\n"; + } elsif ($len > 72) { # In case of vi with line numbers + print "(Warning: last line longer than 72 chars)\n"; + } + if (length($mess) > 511) { + print "You'll have to trim to less than 512 chars...\n"; + sleep(3); + $mess = &edit($mess); + } + } + $mess = $prevmess if $mess eq ''; + if (!$mess) { + print "No previous message, try again.\n"; + next try; + } + if (length($mess) > 511) { + print "Sorry, that's too long; RCS won't take it. Try again...\n"; + next try; + } + last try; + } + unless ($is_first) { + print LOGS $mess unless $mess eq 'nope'; + print MODS "$file\n"; + } + $prevmess = $mess unless $mess eq 'nope'; + $mess; # Returned value +} + +sub edit { + local($text) = join("\n", @_); + open(TMP,">/tmp/cil$$") || die "Can't create /tmp/cil$$"; + print TMP $text; + close TMP; + system $EDITOR, "/tmp/cil$$"; + $text = `cat /tmp/cil$$`; + unlink "/tmp/cil$$"; + $text; +} + +sub usage { + print STDERR <>patcil +$grep -v '^;#' ../pl/package.pl >>patcil +$grep -v '^;#' ../pl/rcsargs.pl >>patcil +$grep -v '^;#' ../pl/comment.pl >>patcil +$grep -v '^;#' ../pl/editor.pl >>patcil +$grep -v '^;#' ../pl/tilde.pl >>patcil +$grep -v '^;#' ../pl/profile.pl >>patcil +chmod +x patcil +$eunicefix patcil diff --git a/pat/patclean.SH b/pat/patclean.SH new file mode 100755 index 0000000..8c5f522 --- /dev/null +++ b/pat/patclean.SH @@ -0,0 +1,185 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patclean (with variable substitutions)" +cat >patclean <>patclean <<'!NO!SUBS!' + +$RCSEXT = ',v' unless $RCSEXT; + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("ahnmV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$RCSEXT = ',v' unless $RCSEXT; +$ENV{'DIST'} = '/dev/null'; # Disable ~/.dist_profile + +chop($pwd = `pwd`) unless -f '.package'; +until (-f '.package') { + die "$progname: no .package file! Run packinit.\n" unless $pwd; + chdir '..' || die "$progname: can't cd ..: $!\n"; + $pwd =~ s|(.*)/(.*)|$1|; + $prefix = $2 . '/' . $prefix; +} +if ($prefix) { + for (@ARGV) { + s/^/$prefix/ unless m|^[-/]|; + } +} + +# We now are at the top level + +&readpackage; + +if ($opt_n) { + &newer; # Look for files newer than patchlevel.h +} elsif ($opt_a) { + open(MANI,"MANIFEST.new") || die "$progname: can't read MANIFEST.new: $!\n"; + @ARGV = (); + while () { + s|^\./||; + next if m|^patchlevel.h|; # This file is built by hand + chop; + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MANI; +} elsif ($opt_m) { + open(MODS,"bugs/.mods$bnum") || die "$progname: no modification found.\n"; + @ARGV = (); + while () { + next if m|^patchlevel.h$|; # This file is built by hand + chop; + ($_) = split(' '); + push(@ARGV,$_); + } + close MODS; +} + +# Set a temporary file for check outs +$TMPFILE = "/tmp/cl$$.tmp"; + +# Now loop over each file specified, doing a 'rcsclean' +foreach $file (@ARGV) { + if (-f $file) { + $files = &rcsargs($file); + @files = split(' ', $files); + $rlog = `rlog -rlastpat- $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + if (!$revs) { + print "$progname: $file has never been checked in--checking in...\n"; + system 'perl', '-S', 'patcil', '-p', $file; + $revs = 2; # At least null trunk + new fresh revision + } + # Look whether there is a branch + if ($revs == 1) { + $rlog = `rlog -r$revbranch $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + $revs++; # add the base revision + } + # We must only give the name of the RCS revision file, i.e. $files[1] + if ($revs == 1) { + system "co -q -p$baserev $files[1] > $TMPFILE"; + } else { + system "co -q -p$revbranch $files[1] > $TMPFILE"; + } + if ($? == 0) { + system 'cmp', '-s', $file, $TMPFILE; + if ($? == 0) { + unlink $file; + print "$progname: $file removed.\n"; + } else { + # Check in file and make sure all was ok + system 'perl', '-S', 'patcil', '-p', $file; + system "co -q -p$revbranch $files[1] > $TMPFILE"; + if ($? == 0) { + system 'cmp', '-s', $file, $TMPFILE; + if ($? == 0) { + unlink $file; + print "$progname: $file removed.\n"; + } else { + print "$progname: $file NOT removed.\n"; + } + } else { + print "$progname: could not check out--$file NOT removed.\n"; + } + } + } else { + print "$progname: no revision--$file NOT removed.\n"; + } + } +} + +unlink "$TMPFILE"; + +sub usage { + print STDERR <>patclean +$grep -v '^;#' ../pl/package.pl >>patclean +$grep -v '^;#' ../pl/rcsargs.pl >>patclean +$grep -v '^;#' ../pl/tilde.pl >>patclean +$grep -v '^;#' ../pl/profile.pl >>patclean +chmod +x patclean +$eunicefix patclean diff --git a/pat/patcol.SH b/pat/patcol.SH new file mode 100755 index 0000000..15fcc6f --- /dev/null +++ b/pat/patcol.SH @@ -0,0 +1,235 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patcol (with variable substitutions)" +cat >patcol <>patcol <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("acd:f:hnmsCRS:V"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$RCSEXT = ',v' unless $RCSEXT; +$NEWMANI = 'MANIFEST.new' unless $NEWMANI = $opt_f; + +chop($pwd = `pwd`) unless -f '.package'; +until (-f '.package') { + die "$progname: no .package file! Run packinit.\n" unless $pwd; + chdir '..' || die "$progname: can't cd ..: $!"; + $pwd =~ s|(.*)/(.*)|$1|; + $prefix = $2 . '/' . $prefix; +} +if ($prefix) { + for (@ARGV) { + s/^/$prefix/ unless m|^[-/]|; + } +} + +# We now are at the top level + +&readpackage; +undef $opt_C unless -f $copyright; +©right'init($copyright) if $opt_C; +&makedir($opt_d) if $opt_d; + +undef $opt_c unless $opt_d; # Disable -c if not -d +undef $opt_R unless $opt_d; # Disable -R if not -d +push(@sw, '-q') if $opt_s; # Let RCS work quietly + +if ($opt_n) { + &newer; # Look for files newer than patchlevel.h +} elsif ($opt_a) { + open(MANI, $NEWMANI) || die "No $NEWMANI found.\n"; + @ARGV = (); + while () { + s|^\./||; + next if m|^patchlevel.h| && !$opt_d; # This file is built by hand + chop; + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MANI; +} elsif ($opt_m) { + open(MODS,"bugs/.mods$bnum") || die "$progname: no modification found.\n"; + @ARGV = (); + while () { + next if m|^patchlevel.h$|; # This file is built by hand + chop; + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MODS; +} elsif ($opt_S) { + &readsnapshot($opt_S); + foreach $file (sort keys %Snap) { + push(@ARGV, $file); + } +} + +# Now loop over each file specified, doing a 'co -l' +foreach $file (@ARGV) { + if ($opt_c && -f $file) { + ©_file($file, $opt_d); + next; + } + # Continue only if file does not exist or option -d was used. + if (! -f $file || $opt_d) { + $files = &rcsargs($file); + @files = split(' ', $files); + if ($opt_S && ($rev = $Snap{$file}) ne '') { # Use snapshot file + &col($rev); + next; + } + $rlog = `rlog -rlastpat- $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + if (!$revs) { + if ($opt_d) { + ©_file($file, $opt_d); + } else { + print STDERR "$progname: $file has never been checked in\n"; + } + } else { + # Look whether there is a branch + if ($revs == 1) { + $rlog = `rlog -r$revbranch $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + $revs++; # add the base revision (trunk) + } + if ($revs == 1) { + &col($baserev); + } else { + &col($revbranch); + } + } + + } +} + +# Run co -l on @files, unlock file if it fails and retry. +# If '-d' option was used, we check out in the specified +# directory, after having made all the necessary directories +# in the path name (which should be relative to the top). +sub col { + local($rev) = shift; # Revision to be checked out. + if (! $opt_d) { + if (system 'co', "-l$rev", @sw, @files) { + print "$progname: unlocking and trying again...\n" unless $opt_s; + system 'rcs', '-u', @sw, @files; + system 'co', "-l$rev", @sw, @files unless $?; + } + } else { + local($name) = $files[0]; # First element is file name + $_ = $name; + s|(.*)/.*|\1| && &makedir("$opt_d/$_"); + if ($opt_C) { + ©right'expand("co -p @sw -r$rev $files[1]", "$opt_d/$name"); + } else { + system "co -p -r$rev @sw $files[1] > $opt_d/$name"; + } + system 'perl', '-pi', '-e', 's|Lock[e]r:.*\$|\$|;', "$opt_d/$name" + if $opt_R; + # If RCS file has x bits set, add them on new file + -x $files[1] && chmod(0755, "$opt_d/$name"); + } +} + +# Copy file into directory, eventually performing copyright expansion... +sub copy_file { + local($file, $dir) = @_; + local($base) = $file =~ m|^(.*)/.*|; + &makedir("$dir/$base"); + if ($opt_C) { + ©right'expand("cat $file", "$dir/$file"); + } else { + system 'cp', "$file", "$dir/$file"; + } + system 'perl', '-pi', '-e', 's|Lock[e]r:.*\$|\$|;', "$dir/$file" if $opt_R; + -x $file && chmod(0755, "$dir/$file"); + print "$progname: $file has been copied\n" unless $opt_s; +} + +sub usage { + print STDERR <>patcol +$grep -v '^;#' ../pl/package.pl >>patcol +$grep -v '^;#' ../pl/rcsargs.pl >>patcol +$grep -v '^;#' ../pl/copyright.pl >>patcol +$grep -v '^;#' ../pl/makedir.pl >>patcol +$grep -v '^;#' ../pl/snapshot.pl >>patcol +$grep -v '^;#' ../pl/tilde.pl >>patcol +$grep -v '^;#' ../pl/profile.pl >>patcol +chmod +x patcol +$eunicefix patcol diff --git a/pat/patdiff.SH b/pat/patdiff.SH new file mode 100755 index 0000000..33ba90c --- /dev/null +++ b/pat/patdiff.SH @@ -0,0 +1,236 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patdiff (with variable substitutions)" +cat >patdiff < +# +# $Log: patdiff.SH,v $ +# Revision 3.0.1.2 1994/01/24 14:30:36 ram +# patch16: now prefix error messages with program's name +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.1 1993/08/19 06:42:35 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:43 ram +# Baseline for dist 3.0 netwide release. +# + +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +!GROK!THIS! +cat >>patdiff <<'!NO!SUBS!' + +$RCSEXT = ',v' unless $RCSEXT; +$TOPDIR = ''; # We are at top-level directory + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("ahnV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +&readpackage; +©right'init($copyright) if -f $copyright; + +system 'mkdir', 'bugs' unless -d 'bugs'; + +if (-f 'patchlevel.h') { + open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; + while () { + $bnum = $1 if /^#define\s+PATCHLEVEL\s+(\d+)/; + } + die "$progname: malformed patchlevel.h file.\n" if $bnum eq ''; + ++$bnum; +} else { + $bnum=1; +} + +if ($opt_a) { + open(MANI,"MANIFEST.new") || die "$progname: can't read MANIFEST.new: $!\n"; + @ARGV = (); + while () { + chop; + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MANI; +} + +foreach $file (@ARGV) { + next if ($file =~ /^patchlevel.h$/); # Skip patchlevel.h + if (! -f $file) { + print "$progname: $file not found.\n"; + next; + } + $files = &rcsargs($file); + @files = split(' ',$files); + $new=''; + $revs=0; + $rlog = `rlog -rlastpat- $files 2>&1`; + ($lastpat) = ($rlog =~ /lastpat: ([\d.]+)/); + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + if (!$revs) { + print "$progname: no cil has been done on $file.\n" ;; + } elsif ($revs == 1) { + ($base) = ($rlog =~ /.*\nrevision\s+(\S+)/); + ($a,$b,$c,$d) = split(/\./,$base); + if ($d ne '') { + if (!$opt_n) { + print + "$progname: no changes in $file since last patch. (Did you cil it?)\n"; + next; # Skip file with no changes + } else { + $new='foo'; + } + } else { + $revs=0; + $rlog = `rlog -r$revbranch- $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + if (!$revs) { + print + "$progname: no changes in $file since base version. (Did you cil it?)\n"; + next; # Skip file with no changes + } else { + ($new) = ($rlog =~ /\nrevision\s*(\d+\.\d+\.\d+\.\d+)/); + } + } + } else { + ($new) = ($rlog =~ /\nrevision\s*(\d+\.\d+\.\d+\.\d+)/); + } + if ($new ne '') { + ($fname = $file) =~ s|.*/||; + $fname = substr($fname, 0, 11); # For filsystems with short names + open(PATCH,">>bugs/$fname.$bnum") || die "Can't make patch"; + print PATCH "\nIndex: $file\n"; + open(CO,"co -p -rlastpat $files 2>/dev/null |"); + while () { + if (/\$Header/ || /\$Id/) { + print PATCH "Prereq: $lastpat\n"; + last; + } + } + close CO; + if (!$opt_n) { + if ($mydiff eq '') { + open(DIFF,"rcsdiff -c -rlastpat -r$new $files |") || + die "$progname: can't fork rcsdiff: $!\n"; + while () { + if ($. == 1) {s|\*\*\* \S+ |*** $file.old |;} + if ($. == 2) {s|--- \S+ |--- $file |;} + s|Lock[e]r:.*\$|\$|; # Use [e] to make it safe on itself + print PATCH; + } + close DIFF; + system 'rcs', "-Nlastpat:$new", @files; + } else { + ©right'expand("co -p -rlastpat $file", "/tmp/pdo$$"); + ©right'expand("co -p -r$new $file", "/tmp/pdn$$"); + open(DIFF, "$mydiff /tmp/pdo$$ /tmp/pdn$$ |") || + die "Can't run $mydiff"; + while () { # Contextual or unified diff + if ($. == 1) { + s|\*\*\* \S+ |*** $file.old | || + s|--- \S+ |--- $file.old |; + } + if ($. == 2) { + s|--- \S+ |--- $file | || + s|\+\+\+ \S+ |+++ $file |; + } + s|Lock[e]r:.*\$|\$|; # Remove locker mark + print PATCH; + } + close DIFF; + system 'rcs', "-Nlastpat:$new", @files; + unlink "/tmp/pdn$$", "/tmp/pdo$$"; + } + } else { + if ($mydiff eq '') { + open(DIFF,"rcsdiff -c -rlastpat $files |") || + die "Can't run rcsdiff"; + while () { + if ($. == 1) {s|\*\*\* \S+ |*** $file.old |;} + if ($. == 2) {s|--- \S+ |--- $file |;} + s|Lock[e]r:.*\$|\$|; # Remove locker mark + print PATCH; + } + close DIFF; + } else { + system "co -p -rlastpat $files >/tmp/pdo$$"; + system "cp $file /tmp/pdn$$"; + open(DIFF, "$mydiff /tmp/pdo$$ /tmp/pdn$$ |") || + die "$progname: can't fork $mydiff: $!\n"; + while () { + # Contextual or unified diff + if ($. == 1) { + s|\*\*\* \S+ |*** $file.old |; + s|--- \S+ |--- $file.old |; + } + if ($. == 2) { + s|--- \S+ |--- $file |; + s|\+\+\+ \S+ |+++ $file |; + } + s|Lock[e]r:.*\$|\$|; # Remove locker mark + print PATCH; + } + close DIFF; + unlink "/tmp/pdn$$", "/tmp/pdo$$"; + } + } + } +} + +sub usage { + print STDERR <>patdiff +$grep -v '^;#' ../pl/rcsargs.pl >>patdiff +$grep -v '^;#' ../pl/copyright.pl >>patdiff +$grep -v '^;#' ../pl/tilde.pl >>patdiff +$grep -v '^;#' ../pl/profile.pl >>patdiff +chmod +x patdiff +$eunicefix patdiff diff --git a/pat/patftp.SH b/pat/patftp.SH new file mode 100755 index 0000000..c35aad6 --- /dev/null +++ b/pat/patftp.SH @@ -0,0 +1,118 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patftp (with variable substitutions)" +cat >patftp < +# +# $Log: patftp.SH,v $ +# Revision 3.0.1.3 1994/01/24 14:30:43 ram +# patch16: now prefix error messages with program's name +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.2 1993/08/24 12:16:57 ram +# patch3: removed useless orgname variable +# +# Revision 3.0.1.1 1993/08/19 06:42:36 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:44 ram +# Baseline for dist 3.0 netwide release. +# + +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +!GROK!THIS! +cat >>patftp <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts("hV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$RCSEXT = ',v' unless $RCSEXT; +chdir '..' if -d '../bugs'; + +&readpackage; + +if ($#ARGV < 0) { + open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; + while () { + $argv = $1 if /^#define\s+PATCHLEVEL\s+(\d+)/; + } + close PL; + die "$progname: malformed patchlevel.h file.\n" if $argv eq ''; + @ARGV = $argv; +} else { + for (@ARGV) { + s/^patch//; + } + $argv = &rangeargs(@ARGV); + @ARGV = split(' ',$argv); +} + +if ($#ARGV < 0) { + print STDERR "$progname: no patches specified.\n"; + &usage; +} elsif ($#ARGV) { + print "$progname: copying $package $baserev patches $argv to $ftpdir...\n"; +} else { + print "$progname: copying $package $baserev patch $argv to $ftpdir...\n"; +} + +chdir 'bugs' || die "$progname: can't cd to bugs: $!\n"; + +until ($#ARGV < 0) { + $patnum = shift; + `cp patch$patnum $ftpdir`; +} + +sub usage { + print STDERR <>patftp +$grep -v '^;#' ../pl/rangeargs.pl >>patftp +$grep -v '^;#' ../pl/tilde.pl >>patftp +$grep -v '^;#' ../pl/profile.pl >>patftp +chmod +x patftp +$eunicefix patftp diff --git a/pat/patindex.SH b/pat/patindex.SH new file mode 100755 index 0000000..83e175b --- /dev/null +++ b/pat/patindex.SH @@ -0,0 +1,66 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patindex (with variable substitutions)" +$spitshell >patindex < +# +# $Log: patindex.SH,v $ +# Revision 3.0.1.1 1993/08/19 06:42:37 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:44 ram +# Baseline for dist 3.0 netwide release. +# + +zcat='$zcat' +test='$test' +sed='$sed' +grep='$grep' + +!GROK!THIS! +$spitshell >>patindex <<'!NO!SUBS!' +if test -d bugs; then + cd bugs +fi +for i in patch? patch??; do + if $test -f $i; then + echo "=== $i ===" + $grep '^Subject: ' $i | $sed 's/^patch\(.*\):Subject/\1/' + fi +done +for i in patch?.Z patch??.Z; do + if $test -f $i; then + name=`echo $i | $sed "s|\.Z$||"` + echo "=== $name ===" + $zcat $i | $grep '^Subject: ' | $sed 's/^patch\(.*\):Subject/\1/' + fi +done +!NO!SUBS! +chmod 755 patindex +$eunicefix patindex diff --git a/pat/patlog.SH b/pat/patlog.SH new file mode 100755 index 0000000..eb3fdfa --- /dev/null +++ b/pat/patlog.SH @@ -0,0 +1,390 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patlog (with variable substitutions)" +cat >patlog <>patlog <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts("hnruV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +&readpackage; + +if (-f 'patchlevel.h') { + open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; + while () { + if (/^#define\s+PATCHLEVEL\s+(\d+)/) { + $last = $1; + $patchline = $.; # Record PATCHLEVEL line + } + } + die "$progname: malformed patchlevel.h file.\n" if $last eq ''; + $bnum = $last + 1; +} +else { + $patchline = 1; + $bnum = 1; + $last = ''; +} + +chdir 'bugs' if -d 'bugs'; + +die "$progname: patch #$bnum already exists.\n" if -f "patch$bnum"; + +@patlist=<*.$bnum>; +die "$progname: no diff files for patch #$bnum.\n" if + $patlist[0] =~ /^\*/ || $patlist[0] eq ''; + +# Set up a proper editor, for later perusal +$editor = $ENV{'VISUAL'}; +$editor = $ENV{'EDITOR'} unless $editor; +$editor = $defeditor unless $editor; +$editor = 'vi' unless $editor; + +# The following used to be done in patmake. Only we do not really need to +# compute the subject lines for the generated patch here, we do it nonetheless +# to avoid code duplication in patmake. + +if (-s ".logs$bnum") { + $logs = ''; + open(LOGS,".logs$bnum"); + while () { + unless ($logseen{$_}) { + $logs .= $_; + $logseen{$_}++; + $logsnum++; # One more log + } + } + close LOGS; + $* = 1; + $subj = $logs; + $logs =~ s/^patch\d+:\s*/\t/g; + $logs =~ s/\n/\n\n/g; + $subj =~ s/^patch\d+:\s*/Subject: /g; + $* = 0; +} else { + $subj = "Subject: \n"; +} + +# Try to guess the priority of the patch +if (-s ".mods$bnum") { + open(MODS, ".mods$bnum"); + while () { + chop; + unless ($fileseen{$_}) { + $fileseen{$_}++; + $modsnum++; # One more modified file + } + } + close MODS; +} +$modsnum++ unless $modsnum; # Avoid divisions by zero +$mean = $logsnum / $modsnum; +if ($mean > 0.7 && $mean < 1.3) { + $priority = "MEDIUM"; +} elsif ($mean <= 0.7) { + $priority = "HIGH"; # Small changes +} else { + $priority = "LOW"; # Big changes +} + +# Save priority for patmake +open(PRIORITY, ">.pri$bnum") || die "$progname: can't create .pri$bnum: $!\n"; +print PRIORITY $priority, "\n"; +close PRIORITY; + +# Save subject lines for patmake +open(SUBJECTS, ">.subj$bnum") || die "$progname: can't create .subj$bnum: $!\n"; +print SUBJECTS $subj; +close SUBJECTS; + +# +# Generate description file, then edit it so that the user may fixup things. +# + +unless (($opt_r && -f ".clog$bnum") || ($opt_u && &uptodate(".clog$bnum"))) { + open(CHANGES, ">.clog$bnum") || + die "$progname: can't create .clog$bnum: $!\n"; + print CHANGES <.rlog$bnum") || + die "$progname: can't create .rlog$bnum: $!\n"; + print RCS <.xlog$bnum") || die "$progname: can't create .xlog$bnum: $!\n"; + print LOG <\n\n"; + print LOG ". Description:\n\n"; + &addlog(".clog$bnum"); + if ($changercs) { + print LOG ". Files changed:\n\n"; + &addlog(".rlog$bnum"); + } + close LOG; +} +system $editor, ".xlog$bnum"; +exit(0) if $opt_n; + +# +# Changelog file update, checking in and diff computation. +# + +print "$progname: updating $changelog...\n"; + +chdir('..') || die "$progname: can't go back to ..: $!\n"; +if (-f $changelog) { + rename($changelog, "$changelog.bak") || + die "$progname: can't rename $changelog into $changelog.bak: $!\n"; +} + +open(LOG, ">$changelog") || die "$progname: can't create $changelog: $!\n"; +&addlog("bugs/.xlog$bnum"); +if (-f "$changelog.bak") { + open(OLOG, "$changelog.bak") || + die "$progname: can't open $changelog.bak: $!\n"; + print LOG while ; + close OLOG; +} +close LOG; + +print "$progname: checking in $changelog and computing diff...\n"; + +# It is safe to run a patcil and a patdiff now, since the Changelog file has +# been updated anyway: any log done while checking that file in will not +# appear in the patch log nor the Changelog. + +system 'perl', '-S', 'patcil', '-p', $changelog; +system 'perl', '-S', 'patdiff', $changelog; + +exit 0; # All done. + +# Returns true if .clog and .rlog (it it exists) are newer than .xlog. +sub newertmp { + return 1 unless -f ".xlog$bnum"; # To force regeneration + return 1 if &newer(".clog$bnum", ".xlog$bnum") || + (!$changercs || &newer(".rlog$bnum", ".xlog$bnum")); + 0; +} + +# Returns true if $file is newer than the reference file $ref. +sub newer { + local($file, $ref) = @_; + (stat($file))[9] >= (stat($ref))[9]; +} + +# Retursn true if $file is up-to-date with respect to .logs and .mods. +sub uptodate { + local($file) = @_; + return 0 unless -f $file; # Cannot be up-to-date if missing + &newer($file, ".logs$bnum") && &newer($file, ".mods$bnum"); +} + +# Add file to the LOG descriptor, skipping the first three lines of that file. +sub addlog { + local($file) = @_; + open(FILE, $file) || die "$progname: can't reopen $file: $!\n"; + $_ = ; $_ = ; $_ = ; + print LOG while ; + close FILE; +} + +# Build RCS logs, for each file listed in the %fileseen array, into %rcslog. +# Common RCS log messages are grouped under the same entry. +sub buildlogs { + local($log); + local(@files); + local($first); + local(%invertedlog); + foreach $file (keys %fileseen) { + $log = &rcslog($file); + next if $log eq ''; + $invertedlog{$log} .= "$file "; + } + foreach $log (keys %invertedlog) { + @files = split(' ', $invertedlog{$log}); + $first = (sort @files)[0]; + $rcslog{$first} = join(', ', @files) . ': ' . $log; + } +} + +# Grab log for a given file by parsing its $Log section. Only comments +# relevant to the patch are kept. This relies on the presence of the patchxx: +# leading string in front of each comment. +# If not sufficient (because people don't use patchxx prefixes), then we'll +# need a more sophisticated algorithm parsing revisions lines to see where we +# left of at the last patch. +sub rcslog { + local($file) = @_; + open(FILE, "../$file") || warn "$me: can't open $file: $!\n"; + local($_); + local($comment, $len); + local($pcomment) = "patch$bnum:"; + local($plen) = length($pcomment); + local($c); + local($lastnl) = 1; + local($kept); # Relevant part of the RCS comment which is kept + file: while () { + if (/^(.*)\$Log[:\$]/) { + $comment = $1; + $comment =~ s/\s+$//; # Newer RCS chop spaces on emtpy lines + $len = length($comment); + while () { + $c = substr($_, 0, $len); + last file unless $c eq $comment; + $_ = substr($_, $len, 9_999); + if ($lastnl) { + last file unless /^\s*Revision\s+\d/; + $lastnl = 0; + } elsif (/^\s*$/) { + $lastnl = 1; + } else { + s/^\s*//; # Older RCS will have space here + $c = substr($_, 0, $plen); + last file unless $c eq $pcomment; + # Comment for that patch is kept after space cleanup + $_ = substr($_, $plen, 9_999); + s/^\s*//; + s/\s*$//; + $_ .= '.' unless /\.$/; + s/^(.)/\U$1/; # Ensure upper-cased to start sentence + s/^/ / if $kept; + $kept .= $_; # Will be reformatted later on + } + } + } + } + close FILE; + $kept; +} + +# Format line to fit in 80 columns (70 + 8 for the added leading tabs). +# Rudimentary parsing to break lines after a , or a space. +sub format { + local($_) = @_; + local($tmp); + local($msg); + while (length($_) > 70) { + $tmp = substr($_, 0, 70); + $tmp =~ s/^(.*)([,\s]).*/$1/; + $msg .= "\t$tmp" . ($2 eq ',' ? ',' : '') . "\n"; + $_ = substr($_, length($tmp), 9_999); + $_ =~ s/^\s+//; + } + $msg .= "\t$_\n"; + $msg; +} + +sub usage { + print STDERR <>patlog +$grep -v '^;#' ../pl/tilde.pl >>patlog +$grep -v '^;#' ../pl/profile.pl >>patlog +chmod +x patlog +$eunicefix patlog diff --git a/pat/patmake.SH b/pat/patmake.SH new file mode 100755 index 0000000..0ff82fd --- /dev/null +++ b/pat/patmake.SH @@ -0,0 +1,413 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patmake (with variable substitutions)" +cat >patmake < +# Contribution by: Graham Stoney +# +# $Log: patmake.SH,v $ +# Revision 3.0.1.5 1995/09/25 09:21:19 ram +# patch59: now calls patsend with -i to add more instructions +# +# Revision 3.0.1.4 1994/10/29 16:43:09 ram +# patch36: a lot of setup is now performed by patlog +# patch36: added various escapes in strings for perl5 support +# +# Revision 3.0.1.3 1994/01/24 14:30:55 ram +# patch16: now prefix error messages with program's name +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.2 1993/08/24 12:18:59 ram +# patch3: now asks for patch mailing/posting after all patches edited +# patch3: patch release notification is done via new patnotify +# patch3: random cleanup, removed old RCS logs +# +# Revision 3.0.1.1 1993/08/19 06:42:38 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:45 ram +# Baseline for dist 3.0 netwide release. +# + +\$defeditor='$defeditor'; +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +\$mailer = '$mailer'; +!GROK!THIS! +cat >>patmake <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts("hV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +&readpackage; +&readusers; + +$FILEOVERHEAD = 40; # Name of files, Index, Prereq +$MAXPATSIZE = 50000; # Maximum allowed size for a patch +$PATOVERHEAD = 2500; # Litterature +$FIRST_PAT = 3000; # Give space for first patch (descriptions) + +if (-f 'patchlevel.h') { + open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; + while () { + if (/^#define\s+PATCHLEVEL\s+(\d+)/) { + $last = $1; + $patchline = $.; # Record PATCHLEVEL line + } + } + die "$progname: malformed patchlevel.h file.\n" if $last eq ''; + $bnum = $last + 1; +} +else { + $patchline = 1; + $bnum = 1; + $last = ''; +} + +@ARGV = <[Mm]akefile*>; +$mf = ''; +if ($#ARGV > 0) { + while (<>) { + $mf .= $_ if /^[a-z.]+\s*:/; # Rules in makefile + } +} +$* = 1; +$after = ''; +$after .= "\t\tConfigure -ders\n" if -f 'Configure'; +$after .= "\t\tmake depend\n" if $mf =~ /^depend:/; +$after .= "\t\tmake\n" if $mf; +$after .= "\t\tmake test\n" if $mf =~ /^test:/; +$after .= "\t\tmake install\n" if $mf =~ /^install:/; +$after .= "\t\tmake install.man\n" if $mf =~ /^install\.man:/; +$* = 0; + +chdir 'bugs' if -d 'bugs'; +die "$progname: patch #$bnum already exists.\n" if -f "patch$bnum"; + +@patlist=<*.$bnum>; +die "$progname: no diff files for patch #$bnum.\n" if + $patlist[0] =~ /^\*/ || $patlist[0] eq ''; + +# Whether they asked for a changelog file or not, call patlog. +# This will create at least the .pri and .subj and .clog files that we need. +# If a changelog file is needed, it will update it and create the necessary +# patch before we go on and put all those patches together. +# Note that we make use of the '-r' option, in case they have already +# run patlog themselves and made the necessary adjustments. Since -r supersedes +# -u, it's safe to allow ~/.dist_profile processing anyway. + +chdir '..' if -d '../bugs'; +system 'perl', '-S', 'patlog', '-r'; # Must be called from top-level dir +chdir 'bugs' if -d 'bugs'; + +@patlist=<*.$bnum>; # Reget it, in case Changes.xx appeared due to patlog + +# Look for size of each diff file +for (@patlist) { + ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($_); + $size{$_} = $size; +} + +# Sort the array, biggest sizes first +sub revnum { $size{$a} < $size{$b} ? 1 : $size{$a} > $size{$b} ? -1 : 0; } +@patlist = sort revnum @patlist; + +# Put files in a patch +for (@patlist) { + $i=1; + # Find the patch in which the current file can go + # Divide size by 15 to count the 3 spaces added in front of each line + while (($newtot = int($tot[$i] + $size{$_} + $size{$_}/15 + $FILEOVERHEAD)) > + $MAXPATSIZE-$PATOVERHEAD-($i == 1 ? $FIRST_PAT : 0) && $tot[$i]) { + $i++; + } + # Adding $_ to patch $i giving $newtot bytes + $tot[$i] = $newtot; # Update size of kit $i + $list[$i] .= " $_"; # Add file to the kit $i +} + +$numpat = $#list; # Number of patches to generate + +if ($numpat > 1) { + print "$progname: Warning: generating $numpat patches.\n"; + sleep(1); +} + +$hah = " (hah!)" if $bnum == 1; +$patbase = $bnum; # First patch generated + +open(PRIORITY, ".pri$bnum"); +chop($priority = ); +close PRIORITY; +$priority = 'LOW' unless $priority; + +for ($i = 1; $i <= $numpat; $i++) { # For all patches... + open(PATCH,">patch$bnum") || die "Can't create patch #$bnum"; + chop($date=`date`); + print PATCH +"System: $package version $baserev +Patch #: $bnum +"; + print PATCH "Priority: $priority\n" unless $priority eq ''; + # Print subjects only for first patch + if ($i == 1) { + open(SUBJECTS, ".subj$bnum"); + print PATCH while ; + close SUBJECTS; + } else { + print PATCH "Subject: patch #$patbase, continued\n"; + } + print PATCH +"Date: $date +From: $maintname <$maintloc> + +Description: +"; + # Print description and repeat-by only for first patch + if ($i == 1) { + open(LOGS, ".clog$bnum"); + $_ = ; $_ = ; $_ = ; # Skip first three lines + print PATCH while ; + close LOGS; + print PATCH "Repeat-By: \n"; + } else { + print PATCH "\tSee patch #$patbase.\n\n"; + } + print PATCH +" +Fix: From rn, say \"| patch -p -N -d DIR\", where DIR is your $package source + directory. Outside of rn, say \"cd DIR; patch -p -N + +"; + if ($mailagent ne 'false') { + print PATCH +" If you send a mail message of the following form it will greatly speed + processing: + + Subject: Command + \@SH mailpatch PATH $package $baserev LIST + ^ note the c + + where PATH is a return path FROM ME TO YOU either in Internet notation, + or in bang notation from some well-known host, and LIST is the number + of one or more patches you need, separated by spaces, commas, and/or + hyphens. Saying 35- says everything from 35 to the end. + + To get some more detailed instructions, send me the following mail: + + Subject: Command + \@SH mailhelp PATH + +"; + } + if ($ftpsite) { + print PATCH +" You can also get the patches via anonymous FTP from + $ftpsite. +"; + } + # Print patchlevel at the top of each patch + print PATCH " +Index: patchlevel.h +"; + if ($last eq '') { + `echo "#define PATCHLEVEL 1" >patchlevel.h`; + `cp /dev/null patchlevel.h.null`; + print PATCH `diff -c patchlevel.h.null patchlevel.h`; + unlink 'patchlevel.h', 'patchlevel.h.null'; + } + else { + print PATCH +"Prereq: $last +${patchline}c${patchline} +< #define PATCHLEVEL $last +--- +> #define PATCHLEVEL $bnum +"; + } + $last = $bnum; # Update last patch + push(@patset, $bnum); # Record set of generated patch(es) + + @ARGV = split(' ', $list[$i]); + while (<>) { print PATCH; } + print PATCH "\n*** End of Patch $bnum ***\n"; + close PATCH; + + # Update patchlevel.h file + $editor = $ENV{'VISUAL'}; + $editor = $ENV{'EDITOR'} unless $editor; + $editor = $defeditor unless $editor; + $editor = 'vi' unless $editor; + system $editor, "patch$bnum"; + if (-s "patch$bnum") { + system 'chmod', '-w', "patch$bnum"; # Protect newly created patch + chdir '..'; + `echo "#define PATCHLEVEL 0" >patchlevel.h` unless -f 'patchlevel.h'; + open(PL,"patchlevel.h") || + die "$progname: can't open patchlevel.h: $!\n"; + open(PLN,">patchlevel.h+") || + die "$progname: can't create new patchlevel.h: $!\n"; + while () { + if (/^#define\s+PATCHLEVEL\s+(\d+)/) { + $bnum = $1; + $bnum++; # Update patch level + print PLN "#define PATCHLEVEL $bnum\n"; + } else { + print PLN; # Simply copy other lines + } + } + close PLN; + close PL; + `mv -f patchlevel.h+ patchlevel.h`; + die "$progname: malformed patchlevel.h file.\n" if $bnum eq ''; + } else { + unlink "patch$bnum"; + die "$progname: aborted.\n"; + } + + chdir 'bugs' || die "$progname: cannot cd to bugs: $!\n"; + + # Find priority for next patch in loop + $priority=''; + open(PATCH, "patch$bnum") || die "Cannot re-open patch #$bnum !\n"; + while () { + /^Priority:\s*(\S+)\s*$/ && ($priority = $1); + } + close PATCH; + + $bnum++; # For next patch in loop +} + +utime time, time, 'patchlevel.h'; # Reset timestamp on patchlevel + +if (@patset == 1) { + $bnum = pop(@patset); + $patch = "patch #$bnum"; +} else { + $bmin = shift(@patset); + $bmax = pop(@patset); + $bnum = "$bmin-$bmax"; + $patch = "patches #$bmin thru #$bmax"; +} + +# Post generated patches +if ($newsgroups) { + print "\nDo you wish to post $patch to $newsgroups? [y] "; + $ans = ; + system 'patpost', $bnum unless $ans =~ /^n/i; +} + +# Mail generated patches +if ($recipients) { + print "\n"; + if (0 == ($recipients =~ tr/ //)) { + print "Do you wish to send $patch to $recipients? [y] "; + } else { + print "The following people are on the recipient list:\n\n"; + foreach $addr (split(' ', $recipients)) { + print "\t$addr\n"; + } + print "\nDo you wish to send $patch to them? [y] "; + } + $ans = ; + system 'patsend', '-i', $bnum, $recipients unless $ans =~ /^n/i; +} + +# Copy patches to FTP directory +if ($ftpdir) { + print "\nDo you wish to copy $patch to $ftpdir? [y] "; + $ans = ; + system 'patftp', $bnum unless $ans =~ /^n/i; +} + +# Notify people about it. +if ($notify) { + print "\n"; + if (0 == ($notify =~ tr/ //)) { + print "Do you wish to notify $notify? [y] "; + } else { + print "The following people are on the notify list:\n\n"; + foreach $addr (split(' ', $notify)) { + print "\t$addr\n"; + } + print "\nDo you wish to notify them? [y] "; + } + $ans = ; + system 'patnotify', $notify unless $ans =~ /^n/i; +} + +sub usage { + print STDERR <>patmake +$grep -v '^;#' ../pl/users.pl >>patmake +$grep -v '^;#' ../pl/tilde.pl >>patmake +$grep -v '^;#' ../pl/profile.pl >>patmake +chmod +x patmake +$eunicefix patmake diff --git a/pat/patname.SH b/pat/patname.SH new file mode 100755 index 0000000..9397329 --- /dev/null +++ b/pat/patname.SH @@ -0,0 +1,175 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patname (with variable substitutions)" +cat >patname <>patname <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage() unless &Getopts("ahnmv:V"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$RCSEXT = ',v' unless $RCSEXT; +$ENV{'DIST'} = '/dev/null'; # Disable ~/.dist_profile + +chop($pwd = `pwd`) unless -f '.package'; +until (-f '.package') { + die "$progname: no .package file! Run packinit.\n" unless $pwd; + chdir '..' || die "$progname: can't cd ..: $!\n"; + $pwd =~ s|(.*)/(.*)|$1|; + $prefix = $2 . '/' . $prefix; +} +if ($prefix) { + for (@ARGV) { + s/^/$prefix/ unless m|^[-/]|; + } +} + +# We now are at the top level + +&readpackage; + +unless ($opt_v) { + print STDERR "$progname: version number must be specified using -v.\n"; + &usage; +} + +if ($opt_n) { + &newer; # Look for files newer than patchlevel.h +} elsif ($opt_a) { + open(MANI,"MANIFEST.new") || die "$progname: can't read MANIFEST.new: $!\n"; + @ARGV = (); + while () { + s|^\./||; + next if m|^patchlevel.h|; # This file is built by hand + chop; + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MANI; +} elsif ($opt_m) { + open(MODS,"bugs/.mods$bnum") || die "$progname: no modification found.\n"; + @ARGV = (); + while () { + next if m|^patchlevel.h$|; # This file is built by hand + chop; + ($_) = split(' '); + push(@ARGV,$_); + } + close MODS; +} + +# Now loop over each file specified, doing a 'rcsfreeze' +foreach $file (@ARGV) { + $files = &rcsargs($file); + @files = split(' ', $files); + $rlog = `rlog -rlastpat- $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + if (!$revs) { + print "$progname: $file has never been checked in--checking in...\n"; + system 'perl', '-S', 'patcil', '-p', $file; + $revs = 2; # At least null trunk + new fresh revision + } + # Look whether there is a branch + if ($revs == 1) { + $rlog = `rlog -r$revbranch $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + $revs++; # add the base revision + } + # If working file exists, make sure latest version was checked in + if (-f $file) { + if ($revs == 1) { + $delta = `rcsdiff -r$baserev $files 2>/dev/null`; + } else { + $delta = `rcsdiff -r$revbranch $files 2>/dev/null`; + } + if ($delta ne '') { + # File changed; check it in. + system 'perl', '-S', 'patcil', '-p', $file; + if ($revs > 1) { + # Have to re-run rlog after a new ci + $rlog = `rlog -r$revbranch $files 2>&1`; + } + } + } + # Now assign symbolic revision number + if ($revs == 1) { + system 'rcs', "-N$opt_v:$baserev", @files; + } else { + ($lastrev) = ($rlog =~ /revision $revbranch\.(\d+)/); + system 'rcs', "-N$opt_v:$revbranch.$lastrev", @files; + } +} + +sub usage { + print STDERR <>patname +$grep -v '^;#' ../pl/package.pl >>patname +$grep -v '^;#' ../pl/rcsargs.pl >>patname +$grep -v '^;#' ../pl/tilde.pl >>patname +$grep -v '^;#' ../pl/profile.pl >>patname +chmod +x patname +$eunicefix patname diff --git a/pat/patnotify.SH b/pat/patnotify.SH new file mode 100755 index 0000000..1ee93f6 --- /dev/null +++ b/pat/patnotify.SH @@ -0,0 +1,232 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patnotify (with variable substitutions)" +cat >patnotify <>patnotify <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts("hquV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +chdir '..' if -d '../bugs'; + +&readpackage; +&readusers if $opt_u; + +$dest = join(' ', @ARGV); +$dest .= " $notify" if $opt_u; + +&usage unless $dest; + +# Offer to edit the address list unless -q +unless ($opt_q) { + select((select(STDOUT), $| = 1)[0]); + print "Do you wish to edit the address list? [y] "; + $ans = ; + unless ($ans =~ /^n/i) { + @to = split(' ', $dest); + &listedit(*to); + $dest = join(' ', @to); + } +} + +if (-f 'patchlevel.h') { + open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; + while () { + if (/^#define\s+PATCHLEVEL\s+(\d+)/) { + $last = $1; + } + } + die "$progname: malformed patchlevel.h file.\n" if $last eq ''; +} else { + die "$progname: no patchlevel.h.\n"; +} + +@patches = &patseq($last); # Compute patches sequence +$lastpat = pop(@patches); + +warn "$progname: missing last .logs and .mods files\n" if $lastpat eq ''; + +$missing = $last - $lastpat + 1; +$these = $missing == 1 ? 'this' : 'these'; +$patches = $missing == 1 ? 'patch' : 'patches'; +$through = $missing == 1 ? $lastpat : "$lastpat thru " . ($lastpat+$missing-1); +$have = $missing == 1 ? 'has' : 'have'; +$patlist = "$lastpat-"; # They'll get everything up to the end + +($Patches = $patches) =~ s/^p/P/; +$opt = ($mailer =~ /sendmail/) ? '-odq' : ''; + +chdir 'bugs' || die "$progname: can't cd to bugs: $!\n"; + +# Find out priority of last patch set +$priority = 'UNKNOWN'; +open(PATCH, "patch$lastpat") || + die "$progname: can't open patch #$lastpat: $!\n"; +while () { + /^Priority:\s*(\S+)\s*$/ && ($priority = $1); +} +close PATCH; + +# Look for the .clog description and prepare the patch description +# for inclusion in the notification, so that they can figure out whether +# they really need that patch set. + +if (-f ".clog$lastpat") { + open(LOGS, ".clog$lastpat") || + die "$progname: can't open .clog$lastpat: $!\n"; + $_ = . . ; # Skip first three lines + $clog = ''; + while () { + $clog .= $_; + } + close LOGS; +} else { + warn "$progname: missing last .clog file in bugs directory\n"; +} + +print "$progname: sending notification of $missing new $patches to $dest...\n"; + +fork && exit; + +# I hate broken mailers! Bust it up into smaller groups of people... +@dest = split(' ', $dest); +while (@smalldest = splice(@dest, 0, 50)) { + $to = join(', ', @smalldest); # Sensible To: for sendmail + $smalldest = join(' ', @smalldest); + + open(MAILER, "|$mailer $opt $smalldest") || + die "$progname: can't fork $mailer: $!\n"; + print MAILER +"To: $to +Subject: $Patches $through for $package version $baserev $have been released. +Precedence: bulk +X-Mailer: dist [version $version PL$patchlevel] + +This is just a quick note to let you know that $package version $baserev +has been recently upgraded and that $patches $through $have been released. + +If you are actively using $package, I strongly suggest you upgrade by +applying $these $patches, whose priority is $priority. + +You can fetch $these $patches automatically by sending me the following mail: + + Subject: Command + \@SH mailpatch - $package $baserev $patlist + ^ note the c + +And if you wish to have future patches mailed directly to you, you can add: + + \@SH package - $package $baserev - mailpatches + +If you are not interested in receiving any information about future patches, +please send me the following mail: + + Subject: Command + \@SH package - $package $baserev +"; + print MAILER +" +Following is the $patches description: + +$clog" if $clog; + print MAILER +" +-- $progname speaking for $maintname <$maintloc>. +"; + close MAILER; +} + +sub usage { + print STDERR <>patnotify +$grep -v '^;#' ../pl/users.pl >>patnotify +$grep -v '^;#' ../pl/patseq.pl >>patnotify +$grep -v '^;#' ../pl/editor.pl >>patnotify +$grep -v '^;#' ../pl/listedit.pl >>patnotify +$grep -v '^;#' ../pl/tilde.pl >>patnotify +$grep -v '^;#' ../pl/profile.pl >>patnotify +chmod +x patnotify +$eunicefix patnotify diff --git a/pat/patpost.SH b/pat/patpost.SH new file mode 100755 index 0000000..7a8ec54 --- /dev/null +++ b/pat/patpost.SH @@ -0,0 +1,179 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patpost (with variable substitutions)" +cat >patpost < +# +# $Log: patpost.SH,v $ +# Revision 3.0.1.4 1995/05/12 12:25:58 ram +# patch54: added explicit From: header line pointing to the maintainer +# +# Revision 3.0.1.3 1994/01/24 14:32:09 ram +# patch16: now prefix error messages with program's name +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.2 1993/08/24 12:19:48 ram +# patch3: added ~name expansion for orgname +# patch3: random cleanup +# +# Revision 3.0.1.1 1993/08/19 06:42:41 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:47 ram +# Baseline for dist 3.0 netwide release. +# + +\$inews='${inews-/usr/lib/news/inews}'; +\$orgname='$orgname'; +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +!GROK!THIS! + +cat >>patpost <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("hrV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +$RCSEXT = ',v' unless $RCSEXT; +if ($inews eq 'inews') { + $inews = '/usr/lib/news/inews' if -f '/usr/lib/news/inews'; +} + +chdir '..' if -d '../bugs'; + +&readpackage; + +$orgname = &tilda_expand($orgname); +chop($orgname = `cat $orgname`) if $orgname =~ m|^/|; + +if ($opt_r) { + $repost = ' (REPOST)'; +} + +while ($_ = shift) { + if (/^(patch)?[1-9][\d\-]*$/) { + s/^patch//; + push(@argv,$_); + } else { + push(@newsgroups,$_); + } +} +$newsgroups = join(',',@newsgroups) unless $#newsgroups < 0; +&usage unless $newsgroups; + +@ARGV = @argv; +open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; +while () { + $maxnum = $1 if /^#define\s+PATCHLEVEL\s+(\d+)/; +} +close PL; +die "$progname: malformed patchlevel.h file.\n" if $maxnum eq ''; + +if ($#ARGV < 0) { + @patseq = &patseq($maxnum); + $lastpat = pop(@patseq); + $argv = &rangeargs("$lastpat-$maxnum"); +} +else { + $argv = &rangeargs(@ARGV); +} + +@ARGV = split(' ',$argv); +$argv =~ s/ $//; + +if ($#ARGV < 0) { + print STDERR "$progname: no patches specified.\n"; + &usage; +} elsif ($#ARGV) { + print + "$progname: posting $package $baserev patches $argv to $newsgroups...\n"; +} else { + print + "$progname: posting $package $baserev patch $argv to $newsgroups...\n"; +} + +chdir 'bugs' || die "$progname: can't cd to bugs: $!\n"; + +fork && exit; + +until ($#ARGV < 0) { + $patnum = shift; + open(PATCH,"patch$patnum") || + die "$progname: can't open patch$patnum: $!\n"; + open(XHEAD,"|$inews -h") || die "$progname: can't fork $inews: $!\n"; + print XHEAD +"From: $maintloc ($maintname) +Newsgroups: $newsgroups +Subject: $package $baserev patch #$patnum$repost +Summary: This is an official patch for $package $baserev. Please apply it. +Expires: +References: +Sender: +Distribution: +Organization: $orgname +Keywords: + +"; + while () { + print XHEAD; + } + close PATCH; + close XHEAD; + die "$progname: could not post patch$patnum.\n" if $?; +} + +sub usage { + print STDERR <>patpost +$grep -v '^;#' ../pl/rangeargs.pl >>patpost +$grep -v '^;#' ../pl/patseq.pl >>patpost +$grep -v '^;#' ../pl/tilde.pl >>patpost +$grep -v '^;#' ../pl/profile.pl >>patpost +chmod +x patpost +$eunicefix patpost diff --git a/pat/patsend.SH b/pat/patsend.SH new file mode 100755 index 0000000..61797be --- /dev/null +++ b/pat/patsend.SH @@ -0,0 +1,218 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patsend (with variable substitutions)" +cat >patsend < +# +# $Log: patsend.SH,v $ +# Revision 3.0.1.6 1995/09/25 09:22:02 ram +# patch59: new -i option to add more instructions for end-users +# +# Revision 3.0.1.5 1994/01/24 14:32:46 ram +# patch16: now prefix error messages with program's name +# patch16: don't feed mailer with more than 50 addresses at a time +# patch16: added ~/.dist_profile awareness +# +# Revision 3.0.1.4 1993/08/25 14:08:01 ram +# patch6: now asks for recipient list edition by default +# patch6: new -q option to suppress that +# +# Revision 3.0.1.3 1993/08/24 12:21:59 ram +# patch3: new -u option +# patch3: added Precedence and X-Mailer headers in mail message +# patch3: added ~name expansion for orgname +# +# Revision 3.0.1.2 1993/08/19 07:10:19 ram +# patch3: was not correctly writing the To: header field +# +# Revision 3.0.1.1 1993/08/19 06:42:42 ram +# patch1: leading config.sh searching was not aborting properly +# +# Revision 3.0 1993/08/18 12:10:49 ram +# Baseline for dist 3.0 netwide release. +# + +\$orgname='$orgname'; +\$mailer='$mailer'; +\$version = '$VERSION'; +\$patchlevel = '$PATCHLEVEL'; +!GROK!THIS! +cat >>patsend <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless &Getopts("hiquV"); + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +chdir '..' if -d '../bugs'; + +&readpackage; +&readusers if $opt_u; + +$orgname = &tilda_expand($orgname); +chop($orgname = `cat $orgname`) if $orgname =~ m|^/|; + +while ($_ = shift) { + if (/^(patch)?[1-9][\d,-]*$/) { + s/^patch//; + push(@argv,$_); + } else { + push(@dest,$_); + } +} +$dest = join(' ',@dest); +$dest .= " $recipients" if $opt_u; +&usage unless $dest; + +# Offer to edit the address list unless -q +unless ($opt_q) { + select((select(STDOUT), $| = 1)[0]); + print "Do you wish to edit the address list? [y] "; + $ans = ; + unless ($ans =~ /^n/i) { + @to = split(' ', $dest); + &listedit(*to); + $dest = join(' ', @to); + } +} + +$to = join(', ', split(' ', $dest)); +@ARGV = @argv; + +open(PL,"patchlevel.h") || die "$progname: can't open patchlevel.h: $!\n"; +while () { + $maxnum = $1 if /^#define\s+PATCHLEVEL\s+(\d+)/; +} +close PL; +die "$progname: malformed patchlevel.h file.\n" if $maxnum eq ''; + +if ($#ARGV < 0) { + @patseq = &patseq($maxnum); + $lastpat = pop(@patseq); + $argv = &rangeargs("$lastpat-$maxnum"); +} else { + $argv = &rangeargs(@ARGV); +} + +@ARGV = split(' ',$argv); +$argv =~ s/ $//; + +if ($#ARGV < 0) { + print STDERR "$progname: no patches specified.\n"; + &usage; +} elsif ($#ARGV) { + print "$progname: sending $package $baserev patches $argv to $dest...\n"; +} else { + print "$progname: sending $package $baserev patch $argv to $dest...\n"; +} + +chdir 'bugs' || die "$progname: can't cd to bugs: $!\n"; + +fork && exit; + +$opt = '-odq' if $mailer =~ /sendmail/; + +until ($#ARGV < 0) { + $patnum = shift; + + # I hate broken mailers! Bust it up into smaller groups of people... + @dest = split(' ', $dest); + while (@smalldest = splice(@dest, 0, 50)) { + $to = join(', ', @smalldest); # Sensible To: for sendmail + $smalldest = join(' ', @smalldest); + + open(MAILER, "|$mailer $opt $smalldest") || + die "$progname: can't fork $mailer: $!\n"; + print MAILER +"To: $to +Subject: $package $baserev patch #$patnum +Precedence: bulk +X-Mailer: dist [version $version PL$patchlevel] +Organization: $orgname + +"; + print MAILER +"$package version $baserev has been recently upgraded with the following patch, +which is being mailed directly to you as you requested when running Configure. + +If you are not interested in having future patches mailed directly to you, +please send me the following mail: + + Subject: Command + \@SH package - $package $baserev + +-- $progname speaking for $maintname <$maintloc>. + +" if ($opt_i || $opt_u); + print MAILER +"[The latest patch for $package version $baserev is #$maxnum.] + +"; + open(PATCH,"patch$patnum") || + die "$progname: can't open patch$patnum: $!\n"; + while () { + print MAILER; + } + close PATCH; + close MAILER; + die "$progname: could not mail patch$patnum.\n" if $?; + } +} + +sub usage { + print STDERR <>patsend +$grep -v '^;#' ../pl/rangeargs.pl >>patsend +$grep -v '^;#' ../pl/users.pl >>patsend +$grep -v '^;#' ../pl/patseq.pl >>patsend +$grep -v '^;#' ../pl/tilde.pl >>patsend +$grep -v '^;#' ../pl/editor.pl >>patsend +$grep -v '^;#' ../pl/listedit.pl >>patsend +$grep -v '^;#' ../pl/profile.pl >>patsend +chmod +x patsend +$eunicefix patsend diff --git a/pat/patsnap.SH b/pat/patsnap.SH new file mode 100755 index 0000000..a5e8754 --- /dev/null +++ b/pat/patsnap.SH @@ -0,0 +1,124 @@ +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pat/patsnap (with variable substitutions)" +cat >patsnap <>patsnap <<'!NO!SUBS!' + +$progname = &profile; # Read ~/.dist_profile +require 'getopts.pl'; +&usage unless $#ARGV >= 0; +&usage unless &Getopts("aho:V"); + +$SNAPSHOT = 'SNAPSHOT'; # Default snapshot file name + +if ($opt_V) { + print STDERR "$progname $version PL$patchlevel\n"; + exit 0; +} elsif ($opt_h) { + &usage; +} + +&readpackage; + +$RCSEXT = ',v' unless $RCSEXT; +$TOPDIR = ''; # We are at the top-level directory +$SNAPSHOT = $opt_o if $opt_o; + +if ($opt_a) { + open(MANI,"MANIFEST.new") || die "$progname: can't read MANIFEST.new: $!\n"; + @ARGV = (); + while () { + chop; + s|^\./||; + next if m|^patchlevel.h|; # Special file + ($_) = split(' '); + next if -d; + push(@ARGV,$_); + } + close MANI; +} + +open(SNAPSHOT, ">$SNAPSHOT") || die "$progname: can't create $SNAPSHOT: $!\n"; + +foreach $file (@ARGV) { + $files = &rcsargs($file); + @files = split(' ',$files); + $revs=0; + $rlog = `rlog -r$baserev -r$revbranch $files 2>&1`; + ($revs) = ($rlog =~ /selected revisions: (\d+)/); + if (!$revs) { + print "$progname: $file has never been checked in--skipping\n"; + next; + } + elsif ($revs == 1) { + print "$progname: last revision for $file is $baserev.\n"; + print SNAPSHOT "$file\t$baserev\n"; + } + else { + ($lastrev) = ($rlog =~ /revision $revbranch\.(\d+)/); + print "$progname: last revision for $file is $revbranch.$lastrev.\n"; + print SNAPSHOT "$file\t$revbranch.$lastrev\n"; + } +} + +close SNAPSHOT; + +sub usage { + print STDERR <>patsnap +$grep -v '^;#' ../pl/rcsargs.pl >>patsnap +$grep -v '^;#' ../pl/comment.pl >>patsnap +$grep -v '^;#' ../pl/tilde.pl >>patsnap +$grep -v '^;#' ../pl/profile.pl >>patsnap +chmod +x patsnap +$eunicefix patsnap diff --git a/patchlevel.h b/patchlevel.h new file mode 100644 index 0000000..98a391c --- /dev/null +++ b/patchlevel.h @@ -0,0 +1,4 @@ +/* dist-3.0 - 18 Aug 1993 */ + +#define VERSION 3.0 +#define PATCHLEVEL 70 diff --git a/pl/comment.pl b/pl/comment.pl new file mode 100644 index 0000000..2059466 --- /dev/null +++ b/pl/comment.pl @@ -0,0 +1,46 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: comment.pl,v $ +;# Revision 3.0 1993/08/18 12:10:50 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +sub rcscomment { + local($file) = @_; + local($comment) = ''; + open(FILE,$file); + while () { + if (/^(.*)\$Log[:\$]/) { # They know better than us (hopefully) + $comment = $1; + last; + } + } + close FILE; + unless ($comment) { + if ($file =~ /\.SH$|[Mm]akefile/) { # Makefile template + $comment = '# '; + } elsif ($file =~ /\.U$/) { # Metaconfig unit + $comment = '?RCS: '; + } elsif ($file =~ /\.man$/) { # Manual page + $comment = "''' "; + } elsif ($file =~ /\.\d\w?$/) { # Manual page + $comment = "''' "; + } elsif ($file =~ /\.[chyl]$/) { # C source + $comment = " * "; + } elsif ($file =~ /\.e$/) { # Eiffel source + $comment = "-- "; + } elsif ($file =~ /\.pl$/) { # Perl library + $comment = ";# "; + } + } + $comment; +} + diff --git a/pl/copyright.pl b/pl/copyright.pl new file mode 100644 index 0000000..5216048 --- /dev/null +++ b/pl/copyright.pl @@ -0,0 +1,71 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: copyright.pl,v $ +;# Revision 3.0 1993/08/18 12:10:51 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +;# Copyright expansion. The @COPYRIGHT@ symbol is expanded the first time +;# it is seen in a file, and before the $Log RCS marker is reached. The +;# automaton needs to be reset for each file. +;# +package copyright; + +# Read in copyright file +sub init { + local($file) = @_; # Copyright file + undef @copyright; + open(COPYRIGHT, $file) || die "Can't open $file: $!\n"; + chop(@copyright = ); + close COPYRIGHT; +} + +# Reset the automaton for a new file. +sub reset { + $copyright_seen = @copyright ? 0 : 1; + $marker_seen = 0; +} + +# Filter file, line by line, and expand the copyright string. The @COPYRIGHT@ +# symbol may be preceded by some random comment. A leader can be defined and +# will be pre-pended to all the input lines. +sub filter { + local($line, $leader) = @_; # Leader is optional + return $leader . $line if $copyright_seen || $marker_seen; + $marker_seen = 1 if $line =~ /\$Log[:\$]/; + $copyright_seen = 1 if $line =~ /\@COPYRIGHT\@/; + return $leader . $line unless $copyright_seen; + local($comment, $trailer) = $line =~ /^(.*)\@COPYRIGHT\@\s*(.*)/; + $comment = $leader . $comment; + $comment . join("\n$comment", @copyright) . "\n"; +} + +# Filter output of $cmd redirected into $file by expanding copyright, if any. +sub expand { + local($cmd, $file) = @_; + if (@copyright) { + open(CMD,"$cmd|") || die "Can't start '$cmd': $!\n"; + open(OUT, ">$file") || die "Can't create $file: $!\n"; + &reset; + local($_); + while () { + print OUT &filter($_); + } + close OUT; + close CMD; + } else { + system "$cmd > $file"; + die "Command '$cmd' failed!" if $?; + } +} + +package main; + diff --git a/pl/editor.pl b/pl/editor.pl new file mode 100644 index 0000000..4c59cc4 --- /dev/null +++ b/pl/editor.pl @@ -0,0 +1,23 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: editor.pl,v $ +;# Revision 3.0.1.1 1993/08/25 14:08:07 ram +;# patch6: created +;# +# Compute suitable editor name +sub geteditor { + local($editor) = $ENV{'VISUAL'}; + $editor = $ENV{'EDITOR'} unless $editor; + $editor = $defeditor unless $editor; + $editor = 'vi' unless $editor; + $editor; +} + diff --git a/pl/fullname.pl b/pl/fullname.pl new file mode 100644 index 0000000..3305d10 --- /dev/null +++ b/pl/fullname.pl @@ -0,0 +1,49 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: fullname.pl,v $ +;# Revision 3.0 1993/08/18 12:10:52 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +sub getfullname { + local($logname) = @_; + local($foo,$bar); + if ($ENV{'NAME'}) { + $ENV{'NAME'}; + } else { + open(PASSWD,'/etc/passwd') || die "Can't open /etc/passwd"; + while () { + /(\w+):/; + last if $1 eq $logname; + } + close PASSWD; + local($login,$passwd,$uid,$gid,$gcos,$home,$shell) = split(/:/); + if (-f "$home/.fullname") { + open(FN,"$home/.fullname"); + chop($foo = ); + close FN; + $foo; + } elsif ($nametype eq 'bsd') { + $gcos =~ s/[,;].*//; + if ($gcos =~ /&/) { # oh crud + ($foo,$bar) = ($logname =~ /(.)(.*)/); + $foo =~ y/a-z/A-Z/; + $gcos =~ s/&/$foo$bar/; + } + $gcos; + } else { + $gcos =~ s/[(].*//; + $gcos =~ s/.*-//; + $gcos; + } + } +} + diff --git a/pl/listedit.pl b/pl/listedit.pl new file mode 100644 index 0000000..4eb5c81 --- /dev/null +++ b/pl/listedit.pl @@ -0,0 +1,36 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: listedit.pl,v $ +;# Revision 3.0.1.2 1993/08/27 14:40:57 ram +;# patch7: forgot to unlink temporary file +;# +;# Revision 3.0.1.1 1993/08/25 14:08:12 ram +;# patch6: created +;# +;# Requires geteditor.pl +;# +# Allow user to inplace-edit a list of items held in an array +sub listedit { + local(*list) = @_; + local($tmp) = "/tmp/dist.$$"; + local($editor) = &geteditor; + open(TMP, ">$tmp") || die "Can't create $tmp: $!\n"; + foreach $item (@list) { + print TMP $item, "\n"; + } + close TMP; + system "$editor $tmp"; + open(TMP, "$tmp") || die "Can't reopen $tmp: $!\n"; + chop(@list = ); + close TMP; + unlink $tmp; +} + diff --git a/pl/logname.pl b/pl/logname.pl new file mode 100644 index 0000000..70e3a03 --- /dev/null +++ b/pl/logname.pl @@ -0,0 +1,24 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: logname.pl,v $ +;# Revision 3.0 1993/08/18 12:10:53 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +sub getlogname { + local($logname) = $ENV{'USER'}; + $logname = $ENV{'LOGNAME'} unless $logname; + chop($logname = `who am i`) unless $logname; + $logname =~ s/\s.*//; + $logname =~ s/.*!//; + $logname; +} + diff --git a/pl/makedir.pl b/pl/makedir.pl new file mode 100644 index 0000000..a358deb --- /dev/null +++ b/pl/makedir.pl @@ -0,0 +1,29 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: makedir.pl,v $ +;# Revision 3.0 1993/08/18 12:10:54 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +# Make directories for files +# E.g, for /usr/lib/perl/foo, it will check for all the +# directories /usr, /usr/lib, /usr/lib/perl and make +# them if they do not exist. +sub makedir { + local($_) = shift; + local($dir) = $_; + if (!-d && $_ ne '') { + # Make dirname first + do makedir($_) if s|(.*)/.*|\1|; + mkdir($dir, 0700) if ! -d $dir; + } +} + diff --git a/pl/manifake.pl b/pl/manifake.pl new file mode 100644 index 0000000..1096adf --- /dev/null +++ b/pl/manifake.pl @@ -0,0 +1,42 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: manifake.pl,v $ +;# Revision 3.0 1993/08/18 12:10:55 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +sub manifake { + # make MANIFEST and MANIFEST.new say the same thing + if (! -f $NEWMANI) { + if (-f $MANI) { + open(IN,$MANI) || die "Can't open $MANI"; + open(OUT,">$NEWMANI") || die "Can't create $NEWMANI"; + while () { + if (/---/) { + # Everything until now was a header... + close OUT; + open(OUT,">$NEWMANI") || + die "Can't recreate $NEWMANI"; + next; + } + s/^\s*(\S+\s+)[0-9]*\s*(.*)/$1$2/; + print OUT; + print OUT "\n" unless /\n$/; # If no description + } + close IN; + close OUT; + } + else { +die "You need to make a $NEWMANI file, with names and descriptions.\n"; + } + } +} + diff --git a/pl/newer.pl b/pl/newer.pl new file mode 100644 index 0000000..21839d2 --- /dev/null +++ b/pl/newer.pl @@ -0,0 +1,78 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: newer.pl,v $ +;# Revision 3.0.1.2 1994/01/24 14:33:48 ram +;# patch16: now also aborts when .newer file holds a single new-line +;# +;# Revision 3.0.1.1 1993/09/09 11:51:07 ram +;# patch9: now skips the 'users' file when computing newest file list +;# +;# Revision 3.0 1993/08/18 12:10:56 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +sub newer { + open(FIND, "find . -type f -newer patchlevel.h -print | sort |") || + die "Can't run find.\n"; + open(NEWER,">.newer") || die "Can't create .newer.\n"; + open(MANI,"MANIFEST.new"); + while () { + ($name,$foo) = split; + $mani{$name} = 1; + } + close MANI; + while () { + s|^\./||; + chop; + next if m|^MANIFEST|; + next if m|^PACKLIST$|; + if (!$mani{$_}) { + next if m|^MANIFEST.new$|; + next if m|^Changes$|; + next if m|^Wanted$|; + next if m|^.package$|; + next if m|^bugs|; + next if m|^users$|; + next if m|^UU/|; + next if m|^RCS/|; + next if m|/RCS/|; + next if m|^config.sh$|; + next if m|/config.sh$|; + next if m|^make.out$|; + next if m|/make.out$|; + next if m|^all$|; + next if m|/all$|; + next if m|^core$|; + next if m|/core$|; + next if m|^toto|; + next if m|/toto|; + next if m|^\.|; + next if m|/\.|; + next if m|\.o$|; + next if m|\.old$|; + next if m|\.orig$|; + next if m|~$|; + next if $mani{$_ . ".SH"}; + next if m|(.*)\.c$| && $mani{$1 . ".y"}; + next if m|(.*)\.c$| && $mani{$1 . ".l"}; + next if (-x $_ && !m|^Configure$|); + } + print NEWER $_,"\n"; + } + close FIND; + close NEWER; + print "Please remove unwanted files...\n"; + sleep(2); + system '${EDITOR-vi} .newer'; + die "Aborted.\n" unless -s '.newer' > 1; + @ARGV = split(' ',`cat .newer`); +} + diff --git a/pl/package.pl b/pl/package.pl new file mode 100644 index 0000000..ba52e1a --- /dev/null +++ b/pl/package.pl @@ -0,0 +1,40 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: package.pl,v $ +;# Revision 3.0 1993/08/18 12:10:57 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +sub readpackage { + if (! -f '.package') { + if ( + -f '../.package' || + -f '../../.package' || + -f '../../../.package' || + -f '../../../../.package' + ) { + die "Run in top level directory only.\n"; + } else { + die "No .package file! Run packinit.\n"; + } + } + open(PACKAGE,'.package'); + while () { + next if /^:/; + next if /^#/; + if (($var,$val) = /^\s*(\w+)=(.*)/) { + $val = "\"$val\"" unless $val =~ /^['"]/; + eval "\$$var = $val;"; + } + } + close PACKAGE; +} + diff --git a/pl/patseq.pl b/pl/patseq.pl new file mode 100644 index 0000000..6647695 --- /dev/null +++ b/pl/patseq.pl @@ -0,0 +1,27 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: patseq.pl,v $ +;# Revision 3.0.1.1 1993/08/24 12:22:14 ram +;# patch3: created +;# +;# +# Compute patch sequence by scanning the bugs directory and looking for +# .logs and/or .mods files to determine what was the last issued patch series. +sub patseq { + local($cur) = @_; # Current patch level + local(@seq); # Issued patch sequence + local($i); + for ($i = 1; $i <= $cur; $i++) { + push(@seq, $i) if -f "bugs/.logs$i" || -f "bugs/.mods$i"; + } + @seq; +} + diff --git a/pl/profile.pl b/pl/profile.pl new file mode 100644 index 0000000..5a588ff --- /dev/null +++ b/pl/profile.pl @@ -0,0 +1,73 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: profile.pl,v $ +;# Revision 3.0.1.1 1994/01/24 14:33:53 ram +;# patch16: created +;# +;# +;# Dist profile management (works like MH and its ~/.mh_profile): +;# - Profile name is held in the environment variable DIST. If not defined, +;# use ~/.dist_profile by default. +;# - Each line in the profile not starting with a '#' (comment line) should +;# have the following format: +;# progname: additional command line options +;# The profile is parsed once when the command is launched and profile +;# options are added at the beginning of the @ARGV array. +;# +;# Per-program configuration values may be also be added. For instance, +;# program foo may pay attention to a profile component 'bar', which may be +;# set via: +;# foo-bar: value +;# i.e. the program name is followed by a '-', followed by the profile +;# component. +;# +;# Uses &tilda_expand to perform ~name substitution. +;# Requires shellwords.pl to properly quote shell words (perl library). +;# +# Set up profile components into %Profile, add any profile-supplied options +# into @ARGV and return the command invocation name. +sub profile { + local($profile) = &tilda_expand($ENV{'DIST'} || '~/.dist_profile'); + local($me) = $0; # Command name + $me =~ s|.*/(.*)|$1|; # Keep only base name + return $me unless -s $profile; + local(*PROFILE); # Local file descriptor + local($options) = ''; # Options we get back from profile + unless (open(PROFILE, $profile)) { + warn "$me: cannot open $profile: $!\n"; + return; + } + local($_); + local($component); + while () { + next if /^\s*#/; # Skip comments + next unless /^$me/o; + if (s/^$me://o) { # progname: options + chop; + $options .= $_; # Merge options if more than one line + } + elsif (s/^$me-([^:]+)://o) { # progname-component: value + $component = $1; + chop; + s/^\s+//; # Trim leading and trailing spaces + s/\s+$//; + $Profile{$component} = $_; + } + } + close PROFILE; + return unless $options; + require 'shellwords.pl'; + local(@opts); + eval '@opts = &shellwords($options)'; # Protect against mismatched quotes + unshift(@ARGV, @opts); + return $me; # Return our invocation name +} + diff --git a/pl/rangeargs.pl b/pl/rangeargs.pl new file mode 100644 index 0000000..9212f84 --- /dev/null +++ b/pl/rangeargs.pl @@ -0,0 +1,48 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: rangeargs.pl,v $ +;# Revision 3.0 1993/08/18 12:10:58 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +sub rangeargs { + local($result) = ''; + local($min,$max,$_); + open(PL,"patchlevel.h") || die "Can't open patchlevel.h\n"; + while () { + $maxspec = $1 if /^#define\s+PATCHLEVEL\s+(\d+)/; + } + close PL; + die "Malformed patchlevel.h file.\n" if $maxspec eq ''; + while ($#_ >= 0) { + $_ = shift(@_); + while (/^\s*\d/) { + s/^\s*(\d+)//; + $min = $1; + if (s/^,//) { + $max = $min; + } elsif (s/^-(\d*)//) { + $max = $1; + if ($max == 0 && $maxspec) { + $max = $maxspec; + } + s/^[^,],?//; + } else { + $max = $min; + } + for ($i = $min; $i <= $max; ++$i) { + $result .= $i . ' '; + } + } + } + $result; +} + diff --git a/pl/rcsargs.pl b/pl/rcsargs.pl new file mode 100644 index 0000000..8fdeab1 --- /dev/null +++ b/pl/rcsargs.pl @@ -0,0 +1,60 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: rcsargs.pl,v $ +;# Revision 3.0 1993/08/18 12:11:01 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +sub rcsargs { + local($result) = ''; + local($_); + while ($_ = shift(@_)) { + if ($_ =~ /^-/) { + $result .= $_ . ' '; + } elsif ($#_ >= 0 && do equiv($_,$_[0])) { + $result .= $_ . ' ' . $_[0] . ' '; + shift(@_); + } else { + $result .= $_ . ' ' . do other($_) . ' '; + } + } + $result; +} + +sub equiv { + local($s1, $s2) = @_; + $s1 =~ s|.*/||; + $s2 =~ s|.*/||; + if ($s1 eq $s2) { + 0; + } elsif ($s1 =~ s/$RCSEXT$// || $s2 =~ s/$RCSEXT$//) { + $s1 eq $s2; + } else { + 0; + } +} + +sub other { + local($s1) = @_; + ($dir,$file) = ('./',$s1) unless local($dir,$file) = ($s1 =~ m|(.*/)(.*)|); + $dir = $TOPDIR . $dir if -d $TOPDIR . "$dir/RCS"; + local($wasrcs) = ($file =~ s/$RCSEXT$//); + if ($wasrcs) { + `mkdir $dir` unless -d $dir; + $dir =~ s|RCS/||; + } else { + $dir .= 'RCS/'; + `mkdir $dir` unless -d $dir; + $file .= $RCSEXT; + } + "$dir$file"; +} + diff --git a/pl/snapshot.pl b/pl/snapshot.pl new file mode 100644 index 0000000..8eb40d9 --- /dev/null +++ b/pl/snapshot.pl @@ -0,0 +1,28 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: snapshot.pl,v $ +;# Revision 3.0.1.1 1993/08/24 12:22:34 ram +;# patch3: created +;# +# Read snapshot file and build %Snap, indexed by file name -> RCS revision +sub readsnapshot { + local($snap) = @_; + open(SNAP, $snap) || warn "Can't open $snap: $!\n"; + local($_); + local($file, $rev); + while () { + next if /^#/; + ($file, $rev) = split; + $Snap{$file} = "$rev"; + } + close SNAP; +} + diff --git a/pl/tilde.pl b/pl/tilde.pl new file mode 100644 index 0000000..0890ffb --- /dev/null +++ b/pl/tilde.pl @@ -0,0 +1,25 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# $Log: tilde.pl,v $ +;# Revision 3.0 1993/08/18 12:11:01 ram +;# Baseline for dist 3.0 netwide release. +;# +;# +# Perform ~name expansion ala ksh... +# (banish csh from your vocabulary ;-) +sub tilda_expand { + local($path) = @_; + return $path unless $path =~ /^~/; + $path =~ s:^~([^/]+):(getpwnam($1))[$[+7]:e; # ~name + $path =~ s:^~:$ENV{'HOME'} || (getpwuid($<))[$[+7]:e; # ~ + $path; +} + diff --git a/pl/users.pl b/pl/users.pl new file mode 100644 index 0000000..807e0dc --- /dev/null +++ b/pl/users.pl @@ -0,0 +1,48 @@ +;# $Id$ +;# +;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +;# +;# You may redistribute only under the terms of the Artistic Licence, +;# as specified in the README file that comes with the distribution. +;# You may reuse parts of this distribution only within the terms of +;# that same Artistic Licence; a copy of which may be found at the root +;# of the source tree for dist 4.0. +;# +;# Original Author: Graham Stoney +;# +;# $Log: users.pl,v $ +;# Revision 3.0.1.2 1993/11/10 17:41:37 ram +;# patch14: adapted users file format to new @SH package command +;# +;# Revision 3.0.1.1 1993/08/24 12:23:19 ram +;# patch3: added some comments about the users file format +;# patch3: random cleanup +;# +;# Revision 3.0 1993/08/18 12:11:02 ram +;# Baseline for dist 3.0 netwide release. +;# +;# The users file, as built by mailagent upon reception of an '@SH package' +;# command contains a list of e-mail addresses, prefixed by a single letter. +;# Users tagged with 'U' or 'L' are plain users, those with 'M' wish to +;# receive issued patches by e-mail while 'N' users simply want to be notified +;# when a new patch is released; +;# +sub readusers { + return unless open(USERS, 'users'); + local($_); + local($status, $name, $pl); + while () { + next if /^#/; + chop if /\n$/; # Emacs may leave final line without \n + ($status, $pl, $name) = split; + # Handle oldstyle two-field user file format (PL13 and before) + $name = $pl unless defined $name; + if ($status eq 'M') { + $recipients = $recipients ? "$recipients $name" : $name; + } elsif ($status eq 'N') { + $notify = $notify ? "$notify $name" : $name; + } + } + close USERS; +} + -- cgit v1.2.3