n62@np1.hep.nl (Klamer Schutte) (03/29/89)
This program extracts dependencies for a makefile. Its is a shell script and thus not to fast under MINIX. It is only tested under MINIX-ST; but i don't see any reason it shouldn't work on a PC. The programs date echo grep mv rm sed sort test and uniq are used; for grep & sed at least the minix-st version has to be patched. These patches do i send simultanious. See the program as a exercise in sed programming for me; those who know how to program sed will not find it very valuable; but those who don't will! Please mail any bugs to me: it is still in beta-test phase Klamer Schutte --> n62@nikhefh.hep.nl <--preferred-- schutte@thoff.uucp {backbone}!mcvax!nikhefh!n62 !mcvax!uva!thoff!schutte (.signature at end) PS When tabs doesn't make it through: in the .sed files is used [ ]; this is a '[', a space, a tab and a ']'. ---------------------------------------------------------------------------- echo x - mkmf.1 sed '/^X/s///' > mkmf.1 << 'Shar_Of_mkmf.1_Eof' XMKMF(1) MKMF(1) X X XNAME X X mkmf - make a makefile X X XSYNTAX X X mkmf files X X XDESCRIPTION X X mkmf extracts depencies from C source files based on information X retrieved from the #include statements in the files. X The output, meant to be part of a Makefile is written to stdout. X X Any comments (C style) or embedded newlines escaped by \ are X ignored X X The following two forms of include syntax are supported: X X - When the filename is inside double qoutation (#include "fnm") the X filename is assumed to be either an absolute pathname or a X pathname valid at the time of running make. X X - When the filename is in brackets (#include <fnm>) the filename X is assumed relative to a system include directory. X In the makefile the variable $(SYSINCL) must be set to this X directory. X X Included files in "" are recursively searched for other included X files; a check is made to prevent looping. X XFILES X X /tmp/mkmf[0-3] X XSEE ALSO X X make(1), cc(1) X X "Make - A Program for Maintaining Computer Programs" X in some UNIX(*) tutorials X XAUTHOR X X Klamer Schutte -- n62@nikhefh.hep.nl X XBUGS X X The name promesses too much: The program only makes the dependencies X and not as some other mkmf a complete makefile X XSTATUS & DISCLAIMER X X No responsibility is taken for the program or for its results. X X mkmf and its associated files are not public domain; the current X release can be freely used and distributed when and only when X 1 Nobody except me (Klamer Schutte) claims to be the author. X 2 It is not sold or part of a package sold. X 3 Its usage will make me responsible for any of its results. X X(*) UNIX is a trademark of AT&T Bell Laboraties. X X X X X X XMINIX manual - Commands 29 march 1989 1 Shar_Of_mkmf.1_Eof echo x - mkmf sed '/^X/s///' > mkmf << 'Shar_Of_mkmf_Eof' X#!/bin/sh X# mkmf : make dependencies for a makefile X# Klamer Schutte 3/'89 Xmkmf="mkmf V1.1" Xscript1="/lib/mkmf/mkmf1.sed" Xscript2="/lib/mkmf/mkmf2.sed" Xecho "# dependecies for $@" Xecho -n "# extracted by $mkmf on " Xdate X# for all files in the command line Xfor i in $@ Xdo X sed -n -f $script1 $i > /tmp/mkmf0 X # as a side effect is the file /tmp/mkmf1 produced X while test -s /tmp/mkmf1 X do X mv /tmp/mkmf1 /tmp/mkmf2 X ( while read file X do X # extract include files from the included files X sed -n -f $script1 $file >> /tmp/mkmf0 X # make /tmp/mkmf3 exist and have zero length X echo -n > /tmp/mkmf3 X ( while read file2 X do X # if $file2 not already in /tmp/mkmf0 process the file X grep -s "^$file2\$" /tmp/mkmf0 || \ X echo $file2 >> /tmp/mkmf3 X done X ) < /tmp/mkmf1 X done X ) < /tmp/mkmf2 X # one file only have to be processed once X sort /tmp/mkmf3 | uniq > /tmp/mkmf1 X done X echo "$i:" > /tmp/mkmf2 X sort /tmp/mkmf0 | uniq >> /tmp/mkmf2 X sed -f $script2 /tmp/mkmf2 Xdone Xrm -f /tmp/mkmf[0123] X Shar_Of_mkmf_Eof echo x - mkmf1.sed sed '/^X/s///' > mkmf1.sed << 'Shar_Of_mkmf1.sed_Eof' X# mkmf1.sed Klamer Schutte 3/89 X: start X# check for \ \n X/\\$/!b no_esc XN Xs/\\\n// Xb start X# OK, no \ \n X: no_esc X# delete any occurance of @ Xs/@/ /g X# make */ one character ( @ ) Xs/\*\//@/g X# delete a comment Xs/\/\*[^@]*@//g X# only end of a comment ? X/@/{ Xs/^/ERROR\: only the end of a comment seen/w /dev/tty Xs/^[^s]seen// Xs/@/ /g X} X# only start of a comment ? X/\/\*/!b no_com X# delete garbage following comment start Xs/\/\*.*$/\/\*/ XN X# check on error condition X/\/\*$/{ Xs/.*/ERROR\: Comment not terminated/w /dev/tty Xq X} Xb start X: no_com X# do the work now X/^#[ ]*include[ ]*"\([^"]*\)"[ ]*$/{ Xs//\1/p Xw /tmp/mkmf1 X} Xs/^#[ ]*include[ ]*<\([^>]*\)>[ ]*$/\$(SYSINCL)\/\1/p X# check on error condition Xs/^#[ ]*include/@/p Xs/@.*/ERROR\: Illegal include statement/w /dev/tty X Shar_Of_mkmf1.sed_Eof echo x - mkmf2.sed sed '/^X/s///' > mkmf2.sed << 'Shar_Of_mkmf2.sed_Eof' X# mkmf2.sed Klamer Schutte 3/89 X# first echo an empty line X/:$/i\ X Xs/\.c\:$/\.o:/ X: start Xs/\([^\\]\)\(\n\)/\1 \\\2 / XN X/[^\\]\n/b start Shar_Of_mkmf2.sed_Eof exit 0 -- ________________________________________________________________________________ Klamer Schutte mcvax!nikhefh!n62 n62@nikhefh.hep.nl