+VERSION = 0
+PATCHLEVEL = 7
+SUBLEVEL = 48
+EXTRAVERSION =
-# Makefile for comedi
-
-VERS1 = 0
-VERS2 = 7
-VERS3 = 47
-
-INSTALLDIR=/usr
-
-ifndef LINUXDIR
-LINUXDIR = /usr/src/linux
-endif
-
-# define the following if you want to compile using RTL
-# headers that aren't in the default location
-#RTLDIR = /d/ds/cvs/rtlinux
-
-# define the following if you want to compile using RTAI
-# headers that aren't in the default location
-#RTAIDIR = /home/ds/cvs/rtai
-
-# define the following if you want to compile using PCMCIA
-# headers
-#PCMCIADIR = /d/ds/stuff/pcmcia-cs-3.1.15
-
-TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
-
-.EXPORT_ALL_VARIABLES:
-
-CFLAGS = -Wall -O2 -Wstrict-prototypes
-CFLAGS += -D__KERNEL__ -I $(LINUXDIR)/include -I $(TOPDIR)/include -I .
-CFLAGS += -D__MODBUILD__
-
-CONFIG_SHELL := sh
-
-include $(LINUXDIR)/.config
-ifdef PCMCIADIR
-CONFIG_PCMCIA=y
-endif
-
-ifeq (.config,$(wildcard .config))
-include .config
-include .uts_version
-all2: modules comedi_config
-else
-all2: config
-endif
-
-ifeq ($(CONFIG_SMP),y)
-CFLAGS += -D__SMP__
-endif
-
-ifeq ($(CONFIG_COMEDI_RTL),y)
-ifdef RTLDIR
-CFLAGS += -I $(RTLDIR)/include
-else
-CFLAGS += -I /usr/include/rtlinux
-endif
-CFLAGS += -D__RTL__
-endif
-
-ifeq ($(CONFIG_COMEDI_RTAI),y)
-ifdef RTAIDIR
-CFLAGS += -I $(RTAIDIR)/include
-else
-CFLAGS += -I /usr/include/rtai
-endif
-endif
-
-ifdef PCMCIADIR
-CFLAGS += -I $(PCMCIADIR)/include
-endif
+PROJECT = COMEDI
+project = comedi
SUBDIRS := comedi
-DOCFILES= README INSTALL drivers `find doc -type f`
-
-comedi_config: dummy
- $(MAKE) -C comedi_config
-
-config: dummy
- scripts/Configure
-
-install: dummy
-ifeq (/lib/modules/${UTS_VERSION},$(wildcard /lib/modules/${UTS_VERSION}))
- install -d /lib/modules/${UTS_VERSION}/misc
- install modules/*.o /lib/modules/${UTS_VERSION}/misc
- /sbin/depmod -a ${UTS_VERSION}
-else
- # ***
- # *** Could not install comedi.o into /lib/modules/${UTS_VERSION}/misc
- # *** Please install by hand.
- # ***
-endif
-# install -m 755 comedi_config/comedi_config ${INSTALLDIR}/sbin
-# install -d ${INSTALLDIR}/include
-# (cd include;install -m 644 comedi.h ${INSTALLDIR}/include)
-# install man/comedi.7 ${INSTALLDIR}/man/man7
-# install man/comedi_config.8 ${INSTALLDIR}/man/man8
-# install -d ${INSTALLDIR}/doc/comedi
-# install ${DOCFILES} ${INSTALLDIR}/doc/comedi
-
-lpr: dummy
- find . -name '*.[chs]'|xargs enscript -2r -pit.ps
-
-dev: dummy
- -rm /dev/comedi*
- /bin/mknod /dev/comedi0 c 98 0
- /bin/mknod /dev/comedi1 c 98 1
- /bin/mknod /dev/comedi2 c 98 2
- /bin/mknod /dev/comedi3 c 98 3
- chown root.root /dev/comedi*
- chmod 666 /dev/comedi*
-
-
-MODFLAGS += -DMODULE
-ifeq ($(CONFIG_MODVERSIONS),y)
-MODFLAGS += -DMODVERSIONS -include $(LINUXDIR)/include/linux/modversions.h
-endif
-
-
-modules: $(patsubst %, _mod_%, $(SUBDIRS))
-
-$(patsubst %, _mod_%, $(SUBDIRS)) : dummy
- -mkdir modules
- $(MAKE) -C $(patsubst _mod_%, %, $@) CFLAGS="$(CFLAGS) $(MODFLAGS)" MAKING_MODULES=1 modules
-
-clean:
- rm -f core `find . -name '*.[oas]'`
- rm -f core `find . -name '.*.flags' -print`
- rm -f comedi/range.h comedi/mk_range comedi/range.def
- rm -f comedi_config/comedi_config
-
-distclean: clean
- rm -f .depend `find . -name .depend -print`
- rm -f core `find . \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
- -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
- -o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -print` TAGS
- -rm -rf modules
- rm -f .config .uts_version include/config.h
-
-include $(TOPDIR)/Rules.make
-
+include ./Makefile.modbuild
-dummy:
--- /dev/null
+
+-include .sourcedirs
+
+# Makefile for modbuild
+
+# define the following if you want to compile using PCMCIA
+# headers
+# PCMCIADIR = /home/ds/stuff/pcmcia-cs-3.1.15
+
+ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
+
+.EXPORT_ALL_VARIABLES:
+CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
+ else if [ -x /bin/bash ]; then echo /bin/bash; \
+ else echo sh; fi ; fi)
+TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
+
+HPATH = $(TOPDIR)/include
+FINDHPATH = $(HPATH)/$(project)
+
+HOSTCC =gcc
+HOSTCFLAGS =-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+
+CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+# use '-fno-strict-aliasing', but only if the compiler can take it
+CFLAGS += $(shell if $(CC) -fno-strict-aliasing -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-fno-strict-aliasing"; fi)
+#CFLAGS += -include $(TOPDIR)/include/modbuild/config.h
+CFLAGS += -D__KERNEL__ -I $(TOPDIR)/include -I $(LINUXDIR)/include -I .
+CFLAGS += -D__MODBUILD__
+
+CONFIG_SHELL := sh
+
+PROJECTRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
+
+-include $(LINUXDIR)/.config
+ifdef PCMCIADIR
+CONFIG_PCMCIA=m
+endif
+
+ifeq (.config,$(wildcard .config))
+include .config
+include .uts_version
+ifeq (.depend,$(wildcard .depend))
+include .depend
+all2: modules
+else
+all2: depend
+endif
+else
+all2: config
+endif
+
+ifeq ($(CONFIG_SMP),y)
+CFLAGS += -D__SMP__
+endif
+
+ifdef PCMCIADIR
+CFLAGS += -I $(PCMCIADIR)/include
+endif
+
+
+-include arch/$(ARCH)/Makefile
+-include arch/Makefile.noarch
+
+config: dummy
+ scripts/Configure
+
+install: dummy
+ mkdir -p ${MOD_INSTALL_PATH}/lib/modules/${UTS_VERSION}/misc
+ install -d ${MOD_INSTALL_PATH}/lib/modules/${UTS_VERSION}/misc
+ install modules/*.o ${MOD_INSTALL_PATH}/lib/modules/${UTS_VERSION}/misc
+ #/sbin/depmod -a ${UTS_VERSION}
+
+
+MODFLAGS += -DMODULE
+ifeq ($(CONFIG_MODVERSIONS),y)
+MODFLAGS += -DMODVERSIONS -include $(LINUXDIR)/include/linux/modversions.h
+endif
+
+
+modules: $(patsubst %, _mod_%, $(SUBDIRS))
+
+$(patsubst %, _mod_%, $(SUBDIRS)) : dummy
+ -mkdir modules
+ $(MAKE) -C $(patsubst _mod_%, %, $@) CFLAGS="$(CFLAGS) $(MODFLAGS)" MAKING_MODULES=1 modules
+
+dep-files: scripts/mkdep archdep include/$(project)/version.h new-genksyms
+# scripts/mkdep init/*.c >.depend
+ echo >.depend
+ scripts/mkdep `find $(FINDHPATH) -follow -name \*.h ! -name modversions.h -print` > .hdepend
+# set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i fastdep ;done
+# let this be made through the fastdep rule in Rules.make
+ $(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS)) _FASTDEP_ALL_SUB_DIRS="$(SUBDIRS)"
+
+include/$(project)/version.h: ./Makefile
+ @echo \#define $(PROJECT)_RELEASE \"$(PROJECTRELEASE)\" > .ver
+ @echo \#define $(PROJECT)_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver
+ @echo '#define $(PROJECT)_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >>.ver
+ @mv -f .ver $@
+
+
+MODVERFILE :=
+
+new-genksyms:
+
+depend dep: dep-files $(MODVERFILE)
+
+clean:
+ rm -f core `find . -name '*.[oas]'`
+ rm -f core `find . -name '.*.flags' -print`
+
+distclean: clean
+ rm -f .depend `find . -name .depend -print`
+ rm -f core `find . \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
+ -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
+ -o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -print` TAGS
+ -rm -rf modules
+ rm -f .config .uts_version include/modbuild/config.h .config.old
+ rm -f scripts/mkdep
+ rm -f .sourcedirs
+
+include $(TOPDIR)/Rules.make
+
+
+dummy:
+
+#
+# This generates dependencies for the .h files.
+#
+
+scripts/mkdep: scripts/mkdep.c
+ $(HOSTCC) $(HOSTCFLAGS) -o scripts/mkdep scripts/mkdep.c
+
+scripts/split-include: scripts/split-include.c
+ $(HOSTCC) $(HOSTCFLAGS) -o scripts/split-include scripts/split-include.c
+
--- /dev/null
+/*
+ * Originally by Linus Torvalds.
+ * Smart CONFIG_* processing by Werner Almesberger, Michael Chastain.
+ *
+ * Usage: mkdep file ...
+ *
+ * Read source files and output makefile dependency lines for them.
+ * I make simple dependency lines for #include <*.h> and #include "*.h".
+ * I also find instances of CONFIG_FOO and generate dependencies
+ * like include/config/foo.h.
+ *
+ * 1 August 1999, Michael Elizabeth Chastain, <mec@shout.net>
+ * - Keith Owens reported a bug in smart config processing. There used
+ * to be an optimization for "#define CONFIG_FOO ... #ifdef CONFIG_FOO",
+ * so that the file would not depend on CONFIG_FOO because the file defines
+ * this symbol itself. But this optimization is bogus! Consider this code:
+ * "#if 0 \n #define CONFIG_FOO \n #endif ... #ifdef CONFIG_FOO". Here
+ * the definition is inactivated, but I still used it. It turns out this
+ * actually happens a few times in the kernel source. The simple way to
+ * fix this problem is to remove this particular optimization.
+ */
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+
+
+char __depname[512] = "\n\t@touch ";
+#define depname (__depname+9)
+int hasdep;
+
+struct path_struct {
+ int len;
+ char buffer[256-sizeof(int)];
+} path_array[2] = {
+ { 0, "" },
+ { 0, "" }
+};
+
+
+
+/*
+ * This records all the configuration options seen.
+ * In perl this would be a hash, but here it's a long string
+ * of values separated by newlines. This is simple and
+ * extremely fast.
+ */
+char * str_config = NULL;
+int size_config = 0;
+int len_config = 0;
+
+
+
+/*
+ * Grow the configuration string to a desired length.
+ * Usually the first growth is plenty.
+ */
+void grow_config(int len)
+{
+ if (str_config == NULL) {
+ len_config = 0;
+ size_config = 4096;
+ str_config = malloc(4096);
+ if (str_config == NULL)
+ { perror("malloc"); exit(1); }
+ }
+
+ while (len_config + len > size_config) {
+ str_config = realloc(str_config, size_config *= 2);
+ if (str_config == NULL)
+ { perror("malloc config"); exit(1); }
+ }
+}
+
+
+
+/*
+ * Lookup a value in the configuration string.
+ */
+int is_defined_config(const char * name, int len)
+{
+ const char * pconfig;
+ const char * plast = str_config + len_config - len;
+ for ( pconfig = str_config + 1; pconfig < plast; pconfig++ ) {
+ if (pconfig[ -1] == '\n'
+ && pconfig[len] == '\n'
+ && !memcmp(pconfig, name, len))
+ return 1;
+ }
+ return 0;
+}
+
+
+
+/*
+ * Add a new value to the configuration string.
+ */
+void define_config(const char * name, int len)
+{
+ grow_config(len + 1);
+
+ memcpy(str_config+len_config, name, len);
+ len_config += len;
+ str_config[len_config++] = '\n';
+}
+
+
+
+/*
+ * Clear the set of configuration strings.
+ */
+void clear_config(void)
+{
+ len_config = 0;
+ define_config("", 0);
+}
+
+
+
+/*
+ * This records all the precious .h filenames. No need for a hash,
+ * it's a long string of values enclosed in tab and newline.
+ */
+char * str_precious = NULL;
+int size_precious = 0;
+int len_precious = 0;
+
+
+
+/*
+ * Grow the precious string to a desired length.
+ * Usually the first growth is plenty.
+ */
+void grow_precious(int len)
+{
+ if (str_precious == NULL) {
+ len_precious = 0;
+ size_precious = 4096;
+ str_precious = malloc(4096);
+ if (str_precious == NULL)
+ { perror("malloc precious"); exit(1); }
+ }
+
+ while (len_precious + len > size_precious) {
+ str_precious = realloc(str_precious, size_precious *= 2);
+ if (str_precious == NULL)
+ { perror("malloc"); exit(1); }
+ }
+}
+
+
+
+/*
+ * Add a new value to the precious string.
+ */
+void define_precious(const char * filename)
+{
+ int len = strlen(filename);
+ grow_precious(len + 4);
+ *(str_precious+len_precious++) = '\t';
+ memcpy(str_precious+len_precious, filename, len);
+ len_precious += len;
+ memcpy(str_precious+len_precious, " \\\n", 3);
+ len_precious += 3;
+}
+
+
+
+/*
+ * Handle an #include line.
+ */
+void handle_include(int type, const char * name, int len)
+{
+ struct path_struct *path = path_array+type;
+
+ if (len == 14 && !memcmp(name, "linux/config.h", len))
+ return;
+
+ if (len >= 7 && !memcmp(name, "config/", 7))
+ define_config(name+7, len-7-2);
+
+ memcpy(path->buffer+path->len, name, len);
+ path->buffer[path->len+len] = '\0';
+ if (access(path->buffer, F_OK) != 0)
+ return;
+
+ if (!hasdep) {
+ hasdep = 1;
+ printf("%s:", depname);
+ }
+ printf(" \\\n %s", path->buffer);
+}
+
+
+
+/*
+ * Record the use of a CONFIG_* word.
+ */
+void use_config(const char * name, int len)
+{
+ char *pc;
+ int i;
+
+ pc = path_array[0].buffer + path_array[0].len;
+ memcpy(pc, "config/", 7);
+ pc += 7;
+
+ for (i = 0; i < len; i++) {
+ char c = name[i];
+ if (isupper(c)) c = tolower(c);
+ if (c == '_') c = '/';
+ pc[i] = c;
+ }
+ pc[len] = '\0';
+
+ if (is_defined_config(pc, len))
+ return;
+
+ define_config(pc, len);
+
+ if (!hasdep) {
+ hasdep = 1;
+ printf("%s: ", depname);
+ }
+ printf(" \\\n $(wildcard %s.h)", path_array[0].buffer);
+}
+
+
+
+/*
+ * Macros for stunningly fast map-based character access.
+ * __buf is a register which holds the current word of the input.
+ * Thus, there is one memory access per sizeof(unsigned long) characters.
+ */
+
+#if defined(__alpha__) || defined(__i386__) || defined(__ia64__) || defined(__MIPSEL__) \
+ || defined(__arm__)
+#define LE_MACHINE
+#endif
+
+#ifdef LE_MACHINE
+#define next_byte(x) (x >>= 8)
+#define current ((unsigned char) __buf)
+#else
+#define next_byte(x) (x <<= 8)
+#define current (__buf >> 8*(sizeof(unsigned long)-1))
+#endif
+
+#define GETNEXT { \
+ next_byte(__buf); \
+ if ((unsigned long) next % sizeof(unsigned long) == 0) { \
+ if (next >= end) \
+ break; \
+ __buf = * (unsigned long *) next; \
+ } \
+ next++; \
+}
+
+/*
+ * State machine macros.
+ */
+#define CASE(c,label) if (current == c) goto label
+#define NOTCASE(c,label) if (current != c) goto label
+
+/*
+ * Yet another state machine speedup.
+ */
+#define MAX2(a,b) ((a)>(b)?(a):(b))
+#define MIN2(a,b) ((a)<(b)?(a):(b))
+#define MAX6(a,b,c,d,e,f) (MAX2(a,MAX2(b,MAX2(c,MAX2(d,MAX2(e,f))))))
+#define MIN6(a,b,c,d,e,f) (MIN2(a,MIN2(b,MIN2(c,MIN2(d,MIN2(e,f))))))
+
+
+
+/*
+ * The state machine looks for (approximately) these Perl regular expressions:
+ *
+ * m|\/\*.*?\*\/|
+ * m|'.*?'|
+ * m|".*?"|
+ * m|#\s*include\s*"(.*?)"|
+ * m|#\s*include\s*<(.*?>"|
+ * m|#\s*(?define|undef)\s*CONFIG_(\w*)|
+ * m|(?!\w)CONFIG_|
+ * m|__SMP__|
+ *
+ * About 98% of the CPU time is spent here, and most of that is in
+ * the 'start' paragraph. Because the current characters are
+ * in a register, the start loop usually eats 4 or 8 characters
+ * per memory read. The MAX6 and MIN6 tests dispose of most
+ * input characters with 1 or 2 comparisons.
+ */
+void state_machine(const char * map, const char * end)
+{
+ const char * next = map;
+ const char * map_dot;
+ unsigned long __buf = 0;
+
+ for (;;) {
+start:
+ GETNEXT
+__start:
+ if (current > MAX6('/','\'','"','#','C','_')) goto start;
+ if (current < MIN6('/','\'','"','#','C','_')) goto start;
+ CASE('/', slash);
+ CASE('\'', squote);
+ CASE('"', dquote);
+ CASE('#', pound);
+ CASE('C', cee);
+ CASE('_', underscore);
+ goto start;
+
+/* / */
+slash:
+ GETNEXT
+ NOTCASE('*', __start);
+slash_star_dot_star:
+ GETNEXT
+__slash_star_dot_star:
+ NOTCASE('*', slash_star_dot_star);
+ GETNEXT
+ NOTCASE('/', __slash_star_dot_star);
+ goto start;
+
+/* '.*?' */
+squote:
+ GETNEXT
+ CASE('\'', start);
+ NOTCASE('\\', squote);
+ GETNEXT
+ goto squote;
+
+/* ".*?" */
+dquote:
+ GETNEXT
+ CASE('"', start);
+ NOTCASE('\\', dquote);
+ GETNEXT
+ goto dquote;
+
+/* #\s* */
+pound:
+ GETNEXT
+ CASE(' ', pound);
+ CASE('\t', pound);
+ CASE('i', pound_i);
+ CASE('d', pound_d);
+ CASE('u', pound_u);
+ goto __start;
+
+/* #\s*i */
+pound_i:
+ GETNEXT NOTCASE('n', __start);
+ GETNEXT NOTCASE('c', __start);
+ GETNEXT NOTCASE('l', __start);
+ GETNEXT NOTCASE('u', __start);
+ GETNEXT NOTCASE('d', __start);
+ GETNEXT NOTCASE('e', __start);
+ goto pound_include;
+
+/* #\s*include\s* */
+pound_include:
+ GETNEXT
+ CASE(' ', pound_include);
+ CASE('\t', pound_include);
+ map_dot = next;
+ CASE('"', pound_include_dquote);
+ CASE('<', pound_include_langle);
+ goto __start;
+
+/* #\s*include\s*"(.*)" */
+pound_include_dquote:
+ GETNEXT
+ CASE('\n', start);
+ NOTCASE('"', pound_include_dquote);
+ handle_include(1, map_dot, next - map_dot - 1);
+ goto start;
+
+/* #\s*include\s*<(.*)> */
+pound_include_langle:
+ GETNEXT
+ CASE('\n', start);
+ NOTCASE('>', pound_include_langle);
+ handle_include(0, map_dot, next - map_dot - 1);
+ goto start;
+
+/* #\s*d */
+pound_d:
+ GETNEXT NOTCASE('e', __start);
+ GETNEXT NOTCASE('f', __start);
+ GETNEXT NOTCASE('i', __start);
+ GETNEXT NOTCASE('n', __start);
+ GETNEXT NOTCASE('e', __start);
+ goto pound_define_undef;
+
+/* #\s*u */
+pound_u:
+ GETNEXT NOTCASE('n', __start);
+ GETNEXT NOTCASE('d', __start);
+ GETNEXT NOTCASE('e', __start);
+ GETNEXT NOTCASE('f', __start);
+ goto pound_define_undef;
+
+/*
+ * #\s*(define|undef)\s*CONFIG_(\w*)
+ *
+ * this does not define the word, because it could be inside another
+ * conditional (#if 0). But I do parse the word so that this instance
+ * does not count as a use. -- mec
+ */
+pound_define_undef:
+ GETNEXT
+ CASE(' ', pound_define_undef);
+ CASE('\t', pound_define_undef);
+
+ NOTCASE('C', __start);
+ GETNEXT NOTCASE('O', __start);
+ GETNEXT NOTCASE('N', __start);
+ GETNEXT NOTCASE('F', __start);
+ GETNEXT NOTCASE('I', __start);
+ GETNEXT NOTCASE('G', __start);
+ GETNEXT NOTCASE('_', __start);
+
+ map_dot = next;
+pound_define_undef_CONFIG_word:
+ GETNEXT
+ if (isalnum(current) || current == '_')
+ goto pound_define_undef_CONFIG_word;
+ goto __start;
+
+/* \<CONFIG_(\w*) */
+cee:
+ if (next >= map+2 && (isalnum(next[-2]) || next[-2] == '_'))
+ goto start;
+ GETNEXT NOTCASE('O', __start);
+ GETNEXT NOTCASE('N', __start);
+ GETNEXT NOTCASE('F', __start);
+ GETNEXT NOTCASE('I', __start);
+ GETNEXT NOTCASE('G', __start);
+ GETNEXT NOTCASE('_', __start);
+
+ map_dot = next;
+cee_CONFIG_word:
+ GETNEXT
+ if (isalnum(current) || current == '_')
+ goto cee_CONFIG_word;
+ use_config(map_dot, next - map_dot - 1);
+ goto __start;
+
+/* __SMP__ */
+underscore:
+ GETNEXT NOTCASE('_', __start);
+ GETNEXT NOTCASE('S', __start);
+ GETNEXT NOTCASE('M', __start);
+ GETNEXT NOTCASE('P', __start);
+ GETNEXT NOTCASE('_', __start);
+ GETNEXT NOTCASE('_', __start);
+ use_config("SMP", 3);
+ goto __start;
+
+ }
+}
+
+
+
+/*
+ * Generate dependencies for one file.
+ */
+void do_depend(const char * filename, const char * command)
+{
+ int mapsize;
+ int pagesizem1 = getpagesize()-1;
+ int fd;
+ struct stat st;
+ char * map;
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0) {
+ perror(filename);
+ return;
+ }
+
+ fstat(fd, &st);
+ if (st.st_size == 0) {
+ fprintf(stderr,"%s is empty\n",filename);
+ close(fd);
+ return;
+ }
+
+ mapsize = st.st_size;
+ mapsize = (mapsize+pagesizem1) & ~pagesizem1;
+ map = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, fd, 0);
+ if ((long) map == -1) {
+ perror("mkdep: mmap");
+ close(fd);
+ return;
+ }
+ if ((unsigned long) map % sizeof(unsigned long) != 0)
+ {
+ fprintf(stderr, "do_depend: map not aligned\n");
+ exit(1);
+ }
+
+ hasdep = 0;
+ clear_config();
+ state_machine(map, map+st.st_size);
+ if (hasdep) {
+ puts(command);
+ if (*command)
+ define_precious(filename);
+ }
+
+ munmap(map, mapsize);
+ close(fd);
+}
+
+
+
+/*
+ * Generate dependencies for all files.
+ */
+int main(int argc, char **argv)
+{
+ int len;
+ char *hpath;
+
+ hpath = getenv("HPATH");
+ if (!hpath) {
+ fputs("mkdep: HPATH not set in environment. "
+ "Don't bypass the top level Makefile.\n", stderr);
+ return 1;
+ }
+ len = strlen(hpath);
+ memcpy(path_array[0].buffer, hpath, len);
+ if (len && hpath[len-1] != '/')
+ path_array[0].buffer[len++] = '/';
+ path_array[0].buffer[len] = '\0';
+ path_array[0].len = len;
+
+ while (--argc > 0) {
+ const char * filename = *++argv;
+ const char * command = __depname;
+ len = strlen(filename);
+ memcpy(depname, filename, len+1);
+ if (len > 2 && filename[len-2] == '.') {
+ if (filename[len-1] == 'c' || filename[len-1] == 'S') {
+ depname[len-1] = 'o';
+ command = "";
+ }
+ }
+ do_depend(filename, command);
+ }
+ if (len_precious) {
+ *(str_precious+len_precious) = '\0';
+ printf(".PRECIOUS:%s\n", str_precious);
+ }
+ return 0;
+}