|
|
1.1 root 1: ##
2: # Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: #
4: # @APPLE_LICENSE_HEADER_START@
5: #
6: # Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: # Reserved. This file contains Original Code and/or Modifications of
8: # Original Code as defined in and that are subject to the Apple Public
9: # Source License Version 1.1 (the "License"). You may not use this file
10: # except in compliance with the License. Please obtain a copy of the
11: # License at http://www.apple.com/publicsource and read it before using
12: # this file.
13: #
14: # The Original Code and all software distributed under the License are
15: # distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: # EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: # INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: # FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: # License for the specific language governing rights and limitations
20: # under the License.
21: #
22: # @APPLE_LICENSE_HEADER_END@
23: ##
24:
25: #
26: # Mach Operating System
27: # Copyright (c) 1986 Carnegie-Mellon University
28: # All rights reserved. The CMU software License Agreement specifies
29: # the terms and conditions for use and redistribution.
30: #
31: ######################################################################
32:
33: ifneq "" "$(wildcard /bin/mkdirs)"
34: MKDIRS = /bin/mkdirs
35: else
36: MKDIRS = /bin/mkdir -p
37: endif
38:
39: #
40: # This must be here before any rules are possibly defined by the
41: # machine dependent makefile fragment so that a plain "make" command
42: # always works. The config program will emit an appropriate rule to
43: # cause "all" to depend on every kernel configuration it generates.
44: #
45:
46: default: all
47:
48: #
49: # In order to move the link commands out of config and back into the
50: # template makefile, config has been changed to emit a dependency rule
51: # of the form *mach.sys: *mach.swap for each configuration so that
52: # the common commands for building each configuration can be placed
53: # directly in the template in the default rule for the .sys.swap
54: # dependency.
55: #
56: .SUFFIXES: .sys
57:
58: #
59: # Make sure we don't remove this by accident if interrupted at the wrong
60: # time.
61: #
62: .PRECIOUS: Makefile
63:
64: #
65: # Make depend hackery
66: #
67: MD= md
68: MD_SUFFIX=d
69: EXIT_RULE=${MD} -u Makedep -f -d `ls *.${MD_SUFFIX}`
70:
71: #
72: # This defines the kernel used for "target" object modules (ones that
73: # will run on the target architecture).
74: #
75: KCC= ${CC} -static
76: KCPP= ${KCC} -E
77:
78: #
79: # Headers files that defines stuff used by both libc and kernel
80: #
81: EXPORT_LIB= . arpa protocols
82:
83: #
84: # Pre-processor environment
85: #
86: INCLUDES = -I. -I$(SOURCE_DIR) -I$(SOURCE_DIR)/bsd \
87: -I$(SOURCE_DIR)/bsd/include -I$(SOURCE_DIR)/machdep \
88: -I$(SOURCE_DIR)/bsd/netat \
89: -I$(SOURCE_DIR)/bsd/netat/h -I$(SOURCE_DIR)/bsd/netat/at \
90: -I$(NEXT_ROOT)/System/Library/Frameworks/System.framework/PrivateHeaders \
91: -I$(NEXT_ROOT)/System/Library/Frameworks/System.framework/Headers \
92: -I$(NEXT_ROOT)/System/Library/Frameworks/System.framework/Headers/bsd
93:
94: # -- Compatible paths --
95: #INCLUDES = -I. -I$(SOURCE_DIR) -I$(SOURCE_DIR)/bsd \
96: # -I$(SOURCE_DIR)/bsd/include -I$(SOURCE_DIR)/machdep \
97: # -I$(SOURCE_DIR)/bsd/netat \
98: # -I$(SOURCE_DIR)/bsd/netat/h -I$(SOURCE_DIR)/bsd/netat/at \
99: # -I$(NEXT_ROOT)/NextLibrary/Frameworks/System.framework/PrivateHeaders \
100: # -I$(NEXT_ROOT)/NextLibrary/Frameworks/System.framework/Headers \
101: # -I$(NEXT_ROOT)/NextLibrary/Frameworks/System.framework/Headers/bsd
102:
103: DEFINES = $(IDENT) -DARCH_PRIVATE -D_KERNEL -DKERNEL -DKERNEL_PRIVATE \
104: -DDRIVER_PRIVATE -DKERNEL_BUILD -D__APPLE__ -DNeXT -D_NEXT_SOURCE \
105: $(MACHINE_DEFINES)
106:
107: CPP_FLAGS = -MD -imacros meta_features.h $(INCLUDES) $(DEFINES)
108:
109: #
110: # Profiling hackery
111: #
112: COPTS_P = $(CPP_FLAGS) -pg
113: COPTS= $(CPP_FLAGS)
114:
115: #
116: # CFLAGS --
117: # CCONFIGFLAGS -- flags to be set via "makeoptions" in the
118: # appropriate MASTER.* config file
119: # MACHINE_CFLAGS -- flags to be set in the Makefile.* file
120: #
121: CFLAGS= $(CCONFIGFLAGS) $(COPTS) $(MACHINE_CFLAGS)
122:
123: #
124: # Common assembly flags
125: #
126: # SFLAGS --
127: # SCONFIGFLAGS -- flags to be set via "makeoptions" in the
128: # appropriate MASTER.* config file
129: # MACHINE_SFLAGS -- flags to be set in the Makefile.* file
130: #
131: SFLAGS= $(CPP_FLAGS) -D__ASSEMBLER__ $(SCONFIGFLAGS) $(MACHINE_SFLAGS)
132:
133: #
134: # Macros that control installation of kernel and it's header files
135: #
136: # install flags for header files
137: #
138: INSTALL_FLAGS = -c -m 444
139:
140: #
141: # Commands that massage header files to remove KERNEL_PRIVATE and
142: # DRIVER_PRIVATE stuff
143: #
144: UNIFDEF = /usr/bin/unifdef
145: DECOMMENT = /usr/local/bin/decomment
146:
147: #
148: # Header files that are unifdef'ed and installed in INCDIR
149: #
150: EXPORT= mach mach/machine kernserv kernserv/machine \
151: bsd/machine bsd/sys bsd/net bsd/netinet bsd/netiso bsd/netns \
152: bsd/nfs bsd/dev bsd/dev/machine \
153: bsd/ufs/ffs bsd/ufs/ufs bsd/miscfs/union bsd/miscfs/specfs \
154: bsd/vfs bsd/libkern driverkit
155:
156: #
157: # Header files that are installed into LCLDIR
158: #
159: LCLEXPORT= mach mach_debug kern ipc kernserv vm bsd/sys bsd/dev bsd/net \
160: bsd/netiso bsd/netccitt bsd/netns bsd/dev/machine mach/machine \
161: machdep/machine driverkit \
162: bsd/ufs/mfs bsd/ufs/lfs bsd/isofs/cd9660 \
163: bsd/netat/h bsd/netat/at \
164: bsd/hfs/hfscommon/headers bsd/hfs/hfscommon/headers/system
165:
166: #
167: # Header file destinations
168: #
169: INCDIR= /System/Library/Frameworks/System.framework/Versions/B/Headers
170: LCLDIR= /System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders
171:
172: # -- Compatible paths --
173: #INCDIR= /NextLibrary/Frameworks/System.framework/Versions/B/Headers
174: #LCLDIR= /NextLibrary/Frameworks/System.framework/Versions/B/PrivateHeaders
175:
176:
177: #
178: # Kernel is installed in / and TFTPDIR (actually, hard linked together)
179: #
180: TFTPDIR= /private/tftpboot
181:
182: #
183: # driverkit library source.
184: #
185: LIBDRIVER_SOURCE= $(NEXT_ROOT)/usr/local/lib
186:
187: #
188: # ObjC library.
189: #
190: LIBOBJC_SOURCE= $(NEXT_ROOT)/usr/local/lib
191:
192: #
193: # Platform Expert library.
194: #
195: LIBPEXPERT_SOURCE= $(NEXT_ROOT)/usr/local/lib
196:
197: #
198: # Directories to be scanned when building tags.
199: # Machine-dependent makefile can add directories by defining
200: # MACHINE_TAG_DIRS.
201: #
202: TAGDIRS = \
203: bsd/dev bsd/if bsd/include bsd/kern bsd/libkern bsd/net \
204: bsd/netinet bsd/vfs bsd/nfs bsd/sys bsd/ufs/ffs bsd/ufs/lfs \
205: bsd/ufs/mfs bsd/ufs/ufs ipc kern kernserv \
206: mach mach_debug vm driverkit uxkern \
207: bsd/miscfs/deadfs bsd/miscfs/fdesc bsd/miscfs/fifofs \
208: bsd/miscfs/kernfs bsd/miscfs/nullfs bsd/miscfs/portal \
209: bsd/miscfs/procfs bsd/miscfs/specfs bsd/miscfs/umapfs \
210: bsd/miscfs/union bsd/hfs bsd/hfs/hfscomman
211:
212:
213: #
214: # Path to any internal tools. Currently, just newvers
215: #
216: TOOLDIR = ..
217:
218: #
219: # Path name of the version identification file.
220: #
221: VERSION_FILES= \
222: $(SOURCE_DIR)/conf/version.major \
223: $(SOURCE_DIR)/conf/version.minor \
224: $(SOURCE_DIR)/conf/version.variant
225:
226: #
227: # LDOBJS is the set of object files which comprise the kernel.
228: #
229: # LDOBJS_PREFIX and LDOBJS_SUFFIX are defined in the machine
230: # dependent Makefile (if necessary).
231: #
232: LDOBJS=${LDOBJS_PREFIX} ${OBJS} subr_prof.o ioconf.o ${LDOBJS_SUFFIX}
233:
234: #
235: # LDDEPS is the set of extra dependencies associated building
236: # the kernel.
237: #
238: # LDDEPS_PREFIX is defined in the machine dependent Makefile
239: # (if necessary).
240: #
241: LDDEPS=${LDDEPS_PREFIX} ${VERSION_FILES} $(TOOLDIR)/newvers
242:
243: #
244: # MACHINEDIR defines the path to the machine-dependent directory
245: # where genassym.c, etc live.
246: #
247: MACHINEDIR=$(SOURCE_DIR)/machdep/$(MACHINE)
248:
249:
250: #
251: # SYSDEPS is the set of extra dependencies associated with each
252: # *vmunix rule (in addition to *vmunix.sys).
253: #
254: # SYSDEPS_PREFIX is defined in the machine dependent Makefile
255: # (if necessary).
256: #
257: SYSDEPS=${SYSDEPS_PREFIX}
258:
259: #
260: # Name of the features include file and the build directory .h files
261: # that are used to build the features.h file. Machine dependent
262: # makefile can add other files to the FEATURES_H list by defining
263: # FEATURES_EXTRA.
264: #
265: FEATURES= features.h
266: FEATURES_H= meta_features.h
267:
268: #
269: # Compilation rules to generate mach_kernel from mach_kernel.sys.
270: #
271: SYS_RULE_1=@rm -f $@
272: SYS_RULE_2=strip -x -o $@ [email protected]
273: SYS_RULE_3=@chmod +w [email protected]
274: SYS_RULE_4=
275:
276: #
277: # Compilation rules to generate .o from .o
278: #
279: O_RULE_1A=rm -f $*.o; cp
280: O_RULE_1B=$*.o .
281:
282: #
283: # Compilation rules to generate .o from .s
284: #
285: S_RULE_1A=${KCC} -c ${SFLAGS}
286: S_RULE_1B=$*.s
287: S_RULE_2=
288: S_RULE_3=
289:
290: #
291: # Compilation rules to generate .o from .c for normal files
292: #
293: C_RULE_1A=${KCC} -c ${CFLAGS}
294: C_RULE_1B=$*.c
295: C_RULE_2=
296: C_RULE_3=
297: C_RULE_4=
298:
299: #
300: # Compilation rules to generate .o from .c for driver files
301: #
302: C_RULE_1A_D=${C_RULE_1A}
303: C_RULE_1B_D=${C_RULE_1B}
304: C_RULE_2_D=${C_RULE_2}
305: C_RULE_3_D=${C_RULE_3}
306: C_RULE_4_D=${C_RULE_4}
307:
308: #
309: # Compilation rules to generate .o from .c for profiling routine files
310: #
311: C_RULE_1A_P=${KCC} -c -S ${COPTS_P}
312: C_RULE_1B_P=${C_RULE_1B}
313: C_RULE_2_P=ex - $*.s < ${GPROF.EX}
314: C_RULE_3_P=${AS} -o $*.o $*.s
315: C_RULE_4_P=rm -f $*.s
316:
317: #
318: # Compilation rules to generate .o from .m for normal files
319: #
320: M_RULE_1A=${KCC} -c ${CFLAGS}
321: M_RULE_1B=$*.m
322: M_RULE_2=
323: M_RULE_3=
324: M_RULE_4=
325:
326: #
327: # Compilation rules to generate .o from .m for driver files
328: #
329: M_RULE_1A_D=${M_RULE_1A}
330: M_RULE_1B_D=${M_RULE_1B}
331: M_RULE_2_D=${M_RULE_2}
332: M_RULE_3_D=${M_RULE_3}
333: M_RULE_4_D=${M_RULE_4}
334:
335: #
336: # Compilation rules to generate .o from .m for profiling routine files
337: #
338: M_RULE_1A_P=${KCC} -c -S ${COPTS_P}
339: M_RULE_1B_P=${M_RULE_1B}
340: M_RULE_2_P=ex - $*.s < ${GPROF.EX}
341: M_RULE_3_P=${AS} -o $*.o $*.s
342: M_RULE_4_P=rm -f $*.s
343:
344: #
345: # Theses macros are filled in by the config program depending on the
346: # current configuration. The MACHDEP macro is replaced by the
347: # contents of the machine dependent makefile template and the others
348: # are replaced by the corresponding symbol definitions for the
349: # configuration.
350: #
351:
352: %OBJS
353:
354: %CFILES
355:
356: %MFILES
357:
358: %SFILES
359:
360: %BFILES
361:
362: %ORDERED
363: %MACHDEP
364:
365: #
366: # OBJSDEPS is the set of files (defined in the machine dependent
367: # template if necessary) which all objects depend on (such as an
368: # in-line assembler expansion filter
369: #
370:
371: ${OBJS}: ${OBJSDEPS}
372:
373: libmig : $(MACH_OFILES)
374: @make $(MACH_OFILES)
375:
376:
377: #
378: # Build a kernel.
379: #
380: mach_kernel.sys:${P} ${PRELDDEPS} ${LDOBJS} $(MACH_OFILES) ${LDDEPS} libmig
381: @rm -f vers.c
382: @/bin/sh $(TOOLDIR)/newvers `cat ${VERSION_FILES}`
383: ${KCC} ${INCLUDES} ${MACHINE_CFLAGS} -c vers.c
384: @rm -f $* $*.sys
385: @echo loading $*.sys
386: @${LD} -static ${LDFLAGS} ${FVMFILE_LDFLAGS} ${LDOBJS} \
387: $(MACH_OFILES) vers.o ${LDFLAGS2} ${LIBS}
388: @size a.out
389: @chmod 755 a.out
390: @-mv a.out $*.sys
391: @make .EXIT
392:
393: #
394: # Just do a load of the kernel to produce a mach_kernel.sys
395: # ... For debugging builds when you want to say:
396: # make foo.o load
397: #
398: load:
399: @rm -f mach_kernel.sys
400: @echo loading mach_kernel.sys
401: @${LD} -static ${LDFLAGS} ${FVMFILE_LDFLAGS} ${LDOBJS} \
402: $(MACH_OFILES) vers.o ${LDFLAGS2} ${LIBS}
403: @size a.out
404: @chmod 755 a.out
405: @-mv a.out mach_kernel.sys
406: @make .EXIT
407:
408: #
409: # This macro is replaced by three rules per configuration, plus a
410: # final definition for the LOAD symbol consisting of all configuration
411: # names and a dependency of "all" on this symbol (so that the
412: # "default" rule above will build everything). The three rules in
413: # each configuration are:
414: #
415: # - a *mach from *mach.sys dependency using the SYS_RULE_* rules,
416: # - a *mach.swap from LDDEPS, swap*.o, and LDDEPS dependency that
417: # simply copies the swap file to the target name, and
418: # - a swap*.o from swap*.c and SWAPDEPS dependency using the C_RULE_* rules.
419: #
420: # 19-Feb-92 (dmitch) - I don't think this is used anymore...
421: #
422:
423: %LOAD
424:
425: #
426: # Mach IPC-based interfaces
427: #
428:
429: # The Mig-generated files go into subdirectories.
430: # These macros create the subdirectories as they are needed.
431:
432: MAKE_MACH = [ -d mach ] || $(MKDIRS) mach
433: MAKE_DEVICE = [ -d device ] || $(MKDIRS) device
434: MAKE_KERN = [ -d kern ] || $(MKDIRS) kern
435: MAKE_MACH_DEBUG = [ -d mach_debug ] || $(MKDIRS) mach_debug
436: MAKE_KERNSERV = [ -d kernserv ] || $(MKDIRS) kernserv
437: MAKE_DEVSERV = [ -d driverkit ] || $(MKDIRS) driverkit
438: SET_SOURCE_DIR = CWD=`pwd`; cd $(SOURCE_DIR); SOURCE_DIR=`pwd`; cd $$CWD
439: SET_REL_SOURCE= REL_SOURCE_DIR=`relpath -d $$CWD/../.. . $$SOURCE_DIR`
440:
441: # Rules to create machine-dependent machine and mach/machine symlinks
442:
443: MIGFLAGS = -I. -I.. -I$$REL_SOURCE_DIR -DKERNEL
444: MIGKSFLAGS = $(MIGFLAGS) -DKERNEL_SERVER
445: MIGKUFLAGS = $(MIGFLAGS) -DKERNEL_USER
446:
447: MIG = mig
448:
449: MACHDIR = mach
450: KERNDIR = kern
451: MACHDEBUGDIR = mach_debug
452: KERNSERVDIR = kernserv
453: DEVSERVDIR = driverkit
454:
455:
456: MIGDIRS = $(MACHDIR) $(KERNSERVDIR) $(MACHDIR)/machine
457:
458: MACH_FFILES = $(MACHDIR)/port_allocate.c \
459: $(MACHDIR)/port_deallocate.c \
460: $(MACHDIR)/port_set_add.c \
461: $(MACHDIR)/port_set_remove.c \
462: $(MACHDIR)/port_set_allocate.c \
463: $(MACHDIR)/port_set_backlog.c \
464: $(MACHDIR)/port_status.c \
465: $(MACHDIR)/vm_allocate.c \
466: $(MACHDIR)/vm_deallocate.c \
467: $(MACHDIR)/port_set_deallocate.c \
468: $(MACHDIR)/task_set_special_port.c \
469: $(MACHDIR)/task_get_special_port.c \
470: $(MACHDIR)/thread_abort.c \
471: $(MACHDIR)/thread_get_special_port.c \
472: $(MACHDIR)/thread_set_special_port.c \
473: $(MACHDIR)/thread_suspend.c \
474: $(MACHDIR)/vm_read.c \
475: $(MACHDIR)/vm_write.c \
476: $(MACHDIR)/vm_protect.c
477:
478: MACH_OFILES = port_allocate.o \
479: port_deallocate.o \
480: port_set_add.o \
481: port_set_remove.o \
482: port_set_allocate.o \
483: port_set_backlog.o \
484: port_status.o \
485: vm_allocate.o \
486: vm_deallocate.o \
487: port_set_deallocate.o \
488: task_set_special_port.o \
489: task_get_special_port.o \
490: thread_abort.o \
491: thread_get_special_port.o \
492: thread_set_special_port.o \
493: thread_suspend.o \
494: vm_read.o \
495: vm_write.o \
496: vm_protect.o
497:
498: MACH_HFILE = $(MACHDIR)/mach_interface.h
499: MACH_HKLOADERFILE = $(MACHDIR)/mach_kernloader.h
500: MACH_INTERNAL = $(MACHDIR)/mach_user_internal.h
501: MACH_FILES = $(MACH_HFILE) $(MACH_INTERNAL) \
502: $(MACHDIR)/mach_server.c $(MACH_FFILES)
503:
504: $(MACH_FILES): $(SOURCE_DIR)/$(MACHDIR)/mach.defs \
505: $(SOURCE_DIR)/$(MACHDIR)/mach_types.defs \
506: $(SOURCE_DIR)/$(MACHDIR)/std_types.defs
507: -$(MAKE_MACH)
508: $(SET_SOURCE_DIR); cd $(MACHDIR); $(SET_REL_SOURCE); \
509: $(MIG) -typed -MD $(MIGKSFLAGS) \
510: -header /dev/null \
511: -user /dev/null \
512: -server mach_server.c \
513: $$REL_SOURCE_DIR/$(MACHDIR)/mach.defs; \
514: $(MIG) -typed -MD $(MIGFLAGS) \
515: -header mach_kernloader.h \
516: -i \
517: -server /dev/null \
518: $$REL_SOURCE_DIR/$(MACHDIR)/mach.defs
519: $(SET_SOURCE_DIR); cd $(MACHDIR); $(SET_REL_SOURCE); \
520: $(MIG) -typed -MD $(MIGKSFLAGS) \
521: -header /dev/null \
522: -user /dev/null \
523: -server mach_server.c \
524: $$REL_SOURCE_DIR/$(MACHDIR)/mach.defs; \
525: $(MIG) -MD $(MIGFLAGS) \
526: -header mach_interface.h \
527: -i \
528: -server /dev/null \
529: $$REL_SOURCE_DIR/$(MACHDIR)/mach.defs
530: -egrep 'Routine ' < $(MACH_HFILE) \
531: | sed -e 's/.*Routine \([a-z_]*\).*/#define \1 \1_EXTERNAL/' \
532: > $(MACH_INTERNAL)
533:
534: MEMORY_OBJECT_HFILE = $(MACHDIR)/memory_object_user.h
535: MEMORY_OBJECT_FILES = $(MEMORY_OBJECT_HFILE) \
536: $(MACHDIR)/memory_object_user.c $(MACHDIR)/memory_object_server.c
537:
538: $(MEMORY_OBJECT_FILES): $(SOURCE_DIR)/$(MACHDIR)/memory_object.defs
539: -$(MAKE_MACH)
540: $(SET_SOURCE_DIR); cd $(MACHDIR); $(SET_REL_SOURCE); \
541: $(MIG) -typed -MD $(MIGKUFLAGS) -DSEQNOS \
542: -header memory_object_user.h \
543: -user memory_object_user.c \
544: -server /dev/null \
545: $$REL_SOURCE_DIR/$(MACHDIR)/memory_object.defs
546:
547: MEMORY_OBJECT_DEFAULT_HFILE = $(MACHDIR)/memory_object_default.h
548: MEMORY_OBJECT_DEFAULT_FILES = $(MEMORY_OBJECT_DEFAULT_HFILE) \
549: $(MACHDIR)/memory_object_default_user.c \
550: $(MACHDIR)/memory_object_default_server.c
551:
552: $(MEMORY_OBJECT_DEFAULT_FILES): \
553: $(SOURCE_DIR)/$(MACHDIR)/memory_object_default.defs
554: -$(MAKE_MACH)
555: $(SET_SOURCE_DIR); cd $(MACHDIR); $(SET_REL_SOURCE); \
556: $(MIG) -typed -MD $(MIGKUFLAGS) -DSEQNOS \
557: -header memory_object_default.h \
558: -user memory_object_default_user.c \
559: -server /dev/null \
560: $$REL_SOURCE_DIR/$(MACHDIR)/memory_object_default.defs
561:
562: EXC_HFILE = $(MACHDIR)/exc.h
563: EXC_FILES = $(EXC_HFILE) $(MACHDIR)/exc_server.c
564:
565: $(EXC_FILES): $(SOURCE_DIR)/$(MACHDIR)/exc.defs \
566: $(SOURCE_DIR)/$(MACHDIR)/mach_types.defs \
567: $(SOURCE_DIR)/$(MACHDIR)/std_types.defs
568: -$(MAKE_MACH)
569: $(SET_SOURCE_DIR); cd $(MACHDIR); $(SET_REL_SOURCE); \
570: $(MIG) -MD $(MIGFLAGS) -header exc.h \
571: -user /dev/null \
572: -server exc_server.c \
573: $$REL_SOURCE_DIR/$(MACHDIR)/exc.defs
574:
575: MACH_HOST_HFILE = $(MACHDIR)/mach_host.h
576: MACH_HOST_FILES = $(MACH_HOST_HFILE) $(MACHDIR)/mach_host_server.c
577:
578: $(MACH_HOST_FILES): $(SOURCE_DIR)/$(MACHDIR)/mach_host.defs \
579: $(SOURCE_DIR)/$(MACHDIR)/mach_types.defs \
580: $(SOURCE_DIR)/$(MACHDIR)/std_types.defs
581: -$(MAKE_MACH)
582: $(SET_SOURCE_DIR); cd $(MACHDIR); $(SET_REL_SOURCE); \
583: $(MIG) -typed -MD $(MIGKSFLAGS) \
584: -header /dev/null \
585: -user /dev/null \
586: -server mach_host_server.c \
587: $$REL_SOURCE_DIR/$(MACHDIR)/mach_host.defs; \
588: $(MIG) -MD $(MIGFLAGS) \
589: -header mach_host.h \
590: -user /dev/null \
591: -server /dev/null \
592: $$REL_SOURCE_DIR/$(MACHDIR)/mach_host.defs
593:
594: MACH_PORT_FILES = $(MACHDIR)/mach_port_server.c
595:
596: $(MACH_PORT_FILES): $(SOURCE_DIR)/$(MACHDIR)/mach_port.defs \
597: $(SOURCE_DIR)/$(MACHDIR)/mach_types.defs \
598: $(SOURCE_DIR)/$(MACHDIR)/std_types.defs
599: -$(MAKE_MACH)
600: $(SET_SOURCE_DIR); cd $(MACHDIR); $(SET_REL_SOURCE); \
601: $(MIG) -untyped -MD $(MIGKSFLAGS) \
602: -header /dev/null \
603: -user /dev/null \
604: -server mach_port_server.c \
605: $$REL_SOURCE_DIR/$(MACHDIR)/mach_port.defs
606:
607: MACH_DEBUG_HFILE = $(MACHDEBUGDIR)/mach_debug.h
608: MACH_DEBUG_FILES = $(MACH_DEBUG_HFILE) $(MACHDEBUGDIR)/mach_debug_server.c
609:
610: $(MACH_DEBUG_FILES): $(SOURCE_DIR)/$(MACHDEBUGDIR)/mach_debug.defs \
611: $(SOURCE_DIR)/$(MACHDIR)/mach_types.defs \
612: $(SOURCE_DIR)/$(MACHDIR)/std_types.defs
613: -$(MAKE_MACH_DEBUG)
614: $(SET_SOURCE_DIR); cd $(MACHDEBUGDIR); $(SET_REL_SOURCE); \
615: $(MIG) -untyped -MD $(MIGKSFLAGS) \
616: -header mach_debug.h \
617: -user /dev/null \
618: -server mach_debug_server.c \
619: $$REL_SOURCE_DIR/$(MACHDEBUGDIR)/mach_debug.defs
620:
621: KERNSERV_HFILE = $(KERNSERVDIR)/kern_server.h
622: KERNSERV_FILES = $(KERNSERV_HFILE) $(KERNSERVDIR)/kern_server_handler.h \
623: $(KERNSERVDIR)/kern_server_handler.c
624:
625: $(KERNSERV_FILES): $(SOURCE_DIR)/$(KERNSERVDIR)/kern_server.defs \
626: $(SOURCE_DIR)/$(MACHDIR)/mach_types.defs \
627: $(SOURCE_DIR)/$(MACHDIR)/std_types.defs
628: -$(MAKE_KERNSERV)
629: $(SET_SOURCE_DIR); cd $(KERNSERVDIR); $(SET_REL_SOURCE); \
630: $(MIG) -MD $(MIGFLAGS) \
631: -header kern_server.h \
632: -sheader kern_server_handler.h \
633: -user /dev/null \
634: -handler kern_server_handler.c \
635: $$REL_SOURCE_DIR/$(KERNSERVDIR)/kern_server.defs
636:
637: KERNSERV_REPLY_HFILE = $(KERNSERVDIR)/kern_server_reply.h
638: KERNSERV_REPLY_FILES = $(KERNSERV_REPLY_HFILE) \
639: $(KERNSERVDIR)/kern_server_reply_user.c
640:
641: $(KERNSERV_REPLY_FILES): \
642: $(SOURCE_DIR)/$(KERNSERVDIR)/kern_server_reply.defs \
643: $(SOURCE_DIR)/$(MACHDIR)/mach_types.defs \
644: $(SOURCE_DIR)/$(MACHDIR)/std_types.defs
645: -$(MAKE_KERNSERV)
646: $(SET_SOURCE_DIR); cd $(KERNSERVDIR); $(SET_REL_SOURCE); \
647: $(MIG) -MD $(MIGFLAGS) \
648: -header kern_server_reply.h \
649: -user kern_server_reply_user.c \
650: -server /dev/null \
651: $$REL_SOURCE_DIR/$(KERNSERVDIR)/kern_server_reply.defs
652:
653: #
654: # Driverkit device server.
655: #
656: DEVSERV_NAME = driverServer
657: DEVSERV_FILES = $(DEVSERVDIR)/$(DEVSERV_NAME)Server.c
658: DEVSERV_DEFS = $(DEVSERV_NAME).defs
659: DEVSERV_SRC_DIR = $(NEXT_ROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
660:
661: # -- Compatible path --
662: #DEVSERV_SRC_DIR = $(NEXT_ROOT)/NextLibrary/Frameworks/System.framework/PrivateHeaders
663:
664: $(DEVSERV_FILES): $(DEVSERVDIR)/$(DEVSERV_DEFS) \
665: $(SOURCE_DIR)/$(MACHDIR)/mach_types.defs \
666: $(SOURCE_DIR)/$(MACHDIR)/std_types.defs
667: -$(MAKE_DEVSERV)
668: $(SET_SOURCE_DIR); cd $(DEVSERVDIR); $(SET_REL_SOURCE); \
669: $(MIG) -typed -MD -arch $(MACHINE) $(MIGKSFLAGS) \
670: -header /dev/null \
671: -user /dev/null \
672: -server driverServerServer.c \
673: $(DEVSERV_DEFS)
674:
675: #
676: # driverServer.defs file imported from the driverkit project...
677: #
678: DEVSERV_SOURCE_DIR=$(DEVSERV_SRC_DIR)/driverkit
679:
680: $(DEVSERVDIR)/$(DEVSERV_DEFS): $(DEVSERV_SOURCE_DIR)/$(DEVSERV_DEFS)
681: rm -f $@
682: -$(MAKE_DEVSERV)
683: cp -p $(DEVSERV_SOURCE_DIR)/$(DEVSERV_DEFS) $@
684:
685: #
686: # These files implement the Mach User Level API used by loadable servers
687: # and driverkit-based drivers.
688: #
689: $(MACH_OFILES): $(MACH_FFILES)
690: $(KCC) -c $(CFLAGS) -DMACH_USER_API \
691: -D$*=$*_EXTERNAL $(MACHDIR)/$*.c
692:
693: MIG_HFILES_EXP= $(MACH_HFILE) \
694: $(MACH_HKLOADERFILE) \
695: $(MACH_HOST_HFILE) \
696: $(MACH_INTERNAL) \
697: $(KERNSERV_HFILE) \
698: $(KERNSERV_REPLY_HFILE)
699:
700: # Explicit dependencies on generated files,
701: # to ensure that Mig has been run by the time
702: # these files are compiled.
703:
704: vm_object.o: $(MACHDIR)/memory_object_user.h \
705: $(MACHDIR)/memory_object_default.h
706:
707: exception.o: $(MACHDIR)/exc.h
708:
709: mig_support.o: $(MACHDIR)/mach_user_internal.h
710:
711: kern_server.o: $(MACHDIR)/mach_user_internal.h \
712: $(KERNSERVDIR)/kern_server.h \
713: $(KERNSERVDIR)/kern_server_reply.h
714:
715: #
716: # Clean up the current build directory.
717: #
718: clean: ${MACHINE_CLEAN}
719: @for f in ${LOAD}; \
720: do \
721: echo rm -f $$f $$f.* && rm -f $$f $$f.*; \
722: done
723: @for f in $(MIGDIRS) $(MACHDEBUGDIR) kern; \
724: do \
725: echo rm -f $$f/*.[ch]; rm -f $$f/*.[ch]; \
726: done
727: rm -f eddep tags *.o errs linterrs makelinks *.log *LOG* \
728: Makedep ${CLEAN_EXTRA}
729:
730:
731:
732: #
733: # Building the tags files
734: #
735: tags: tags_link ALWAYS
736: @cd $(SOURCE_DIR); \
737: rm -f /tmp/tag$$$$; \
738: touch /tmp/tag$$$$; \
739: echo Making file list; \
740: for i in ${TAGDIRS} ${MACHINE_TAG_DIRS}; \
741: do \
742: ls $$i/*.[cms] >> /tmp/tag$$$$ 2> /dev/null; \
743: done; \
744: for i in ${TAGDIRS} ${MACHINE_TAG_DIRS}; \
745: do \
746: ls $$i/*.h >> /tmp/tag$$$$ 2> /dev/null; \
747: done; \
748: echo Making ctags; \
749: TAGTYPE=`echo -n $(MACHINE) | tr a-z A-Z`; \
750: rm -f tags.$$TAGTYPE; \
751: cat /tmp/tag$$$$ | xargs ctags -w -d -t -T > tags.$$TAGTYPE; \
752: echo Making etags; \
753: rm -f TAGS.$$TAGTYPE; \
754: xargs etags -f TAGS.$$TAGTYPE < /tmp/tag$$$$; \
755: rm -f /tmp/tag$$$$
756:
757: #
758: # Building a mkid database file
759: #
760: id: id_link ALWAYS
761: @cd $(SOURCE_DIR); \
762: rm -f /tmp/id$$$$; \
763: touch /tmp/id$$$$; \
764: echo Making file list; \
765: for i in ${TAGDIRS} ${MACHINE_TAG_DIRS}; \
766: do \
767: ls $$i/*.[cms] >> /tmp/id$$$$ 2> /dev/null; \
768: done; \
769: for i in ${TAGDIRS} ${MACHINE_TAG_DIRS}; \
770: do \
771: ls $$i/*.h >> /tmp/id$$$$ 2> /dev/null; \
772: done; \
773: echo Making id database; \
774: TAGTYPE=`echo -n $(MACHINE) | tr a-z A-Z`; \
775: rm -f ID.$$TAGTYPE; \
776: mkid -a/tmp/id$$$$ -S.m=c -fID.$$TAGTYPE; \
777: rm -f /tmp/id$$$$
778:
779: #
780: # This little bit of magic sets "tags" to point to the current
781: # architecture. It also gets invoked whenever you build a kernel,
782: # so tags will point to the architecture of the last build.
783: #
784: tags_link:
785: @cd $(SOURCE_DIR); \
786: TAGTYPE=`echo -n $(MACHINE) | tr a-z A-Z`; \
787: rm -f tags TAGS; \
788: echo ln -s tags.$$TAGTYPE tags; \
789: ln -s tags.$$TAGTYPE tags; \
790: echo ln -s TAGS.$$TAGTYPE TAGS; \
791: ln -s TAGS.$$TAGTYPE TAGS
792:
793: id_link:
794: @cd $(SOURCE_DIR); \
795: TAGTYPE=`echo -n $(MACHINE) | tr a-z A-Z`; \
796: rm -f ID; \
797: echo ln -s ID.$$TAGTYPE ID; \
798: ln -s ID.$$TAGTYPE ID;
799:
800: #
801: # Move tags link after build
802: #
803: all: tags_link
804:
805:
806: #
807: # Profiling targets
808: #
809: gprof: kgmon_on all kgmon_off
810:
811: kgmon_on:
812: kgmon -r -b
813:
814: kgmon_off:
815: kgmon -h -p
816: gprof /mach >GPROF
817: gprof: kgmon_on all kgmon_off
818:
819: kgmon_on:
820: kgmon -r -b
821:
822: kgmon_off:
823: kgmon -h -p
824: gprof /mach >GPROF
825:
826: #
827: # Building the "features" file
828: #
829: features: ${FEATURES}
830:
831: ${FEATURES}: ${FEATURES_H} ${FEATURES_EXTRA} ALWAYS
832: rm -f features.temp
833: cc -traditional-cpp -E -dD -P -I. ${FEATURES_H} ${FEATURES_EXTRA} | \
834: sort -u > features.temp
835: @-if [ -f $@ ]; \
836: then \
837: echo diff $@ features.temp; \
838: diff $@ features.temp; \
839: fi
840: rm -f $@
841: mv -f features.temp $@
842:
843: #
844: # Special rules to install include files in release images
845: #
846: install: DSTROOT install_kernel installhdrs
847:
848: install_kernel: DSTROOT $(KERNEL_NAME) install_md
849: $(MKDIRS) ${DSTROOT}${TFTPDIR}
850: install -c -m 444 $(KERNEL_NAME) ${DSTROOT}/mach_kernel
851: ln ${DSTROOT}/mach_kernel ${DSTROOT}${TFTPDIR}/mach_kernel
852:
853: install_md: DSTROOT ${MACHINE_INSTALL}
854:
855: installhdrs: DSTROOT install_mi_hdrs install_md_hdrs
856:
857: install_mi_hdrs: DSTROOT install_mi_std_hdrs
858:
859: #
860: # Note the outer for loop of this operation has to be tolerant of non-zero
861: # returns because unifdef returns 1 if it makes a change. I don't think this
862: # is a problem, but we might want to modify unifdef instead of having the
863: # following "-for" expression...
864: #
865: install_mi_std_hdrs: DSTROOT $(MIG_HFILES_EXP) $(MACH_DEBUG_HFILE)
866: @-for i in ${EXPORT}; \
867: do \
868: EXPDIR=`pwd`/exports; \
869: [ -d $$EXPDIR ] || $(MKDIRS) $$EXPDIR; \
870: rm -f $$EXPDIR/*; \
871: (cd $(SOURCE_DIR)/$$i; \
872: hdrs=`echo *.h`; \
873: if [ "$$hdrs" = '*.h' ]; then \
874: echo No header files in $$i; \
875: else \
876: for j in $$hdrs; \
877: do \
878: DSTDIR=$(DSTROOT)$(INCDIR)/$$i; \
879: [ -d $$DSTDIR ] || $(MKDIRS) $$DSTDIR; \
880: echo garbage > $$EXPDIR/$$j.strip; \
881: $(UNIFDEF) -UKERNEL_PRIVATE -UDRIVER_PRIVATE \
882: $$j > $$EXPDIR/$$j || \
883: $(DECOMMENT) $$EXPDIR/$$j r > \
884: $$EXPDIR/$$j.strip; \
885: if [ -s $$EXPDIR/$$j.strip ]; \
886: then ( \
887: cd $$EXPDIR; \
888: install $(INSTALL_FLAGS) $$j $$DSTDIR; \
889: ); \
890: else \
891: echo Header file $$i/$$j not exported; \
892: fi; \
893: rm -f $$EXPDIR/$$j.strip; \
894: done; \
895: fi; \
896: ); \
897: done
898: for i in ${EXPORT_LIB}; \
899: do \
900: $(MKDIRS) ${DSTROOT}${INCDIR}/bsd/$$i; \
901: (cd $(SOURCE_DIR)/bsd/include/$$i; \
902: install $(INSTALL_FLAGS) *.h ${DSTROOT}${INCDIR}/bsd/$$i;); \
903: done
904: for i in ${MIGDIRS}; \
905: do \
906: $(MKDIRS) ${DSTROOT}${INCDIR}/$$i; \
907: (cd $(SOURCE_DIR)/$$i; \
908: install $(INSTALL_FLAGS) *.defs ${DSTROOT}${INCDIR}/$$i;); \
909: done
910: for i in ${MIG_HFILES_EXP}; \
911: do \
912: install $(INSTALL_FLAGS) $$i ${DSTROOT}${INCDIR}/$$i; \
913: done
914: :
915: : mach_debug is a special case
916: :
917: $(MKDIRS) ${DSTROOT}${LCLDIR}/${MACHDEBUGDIR}
918: install $(INSTALL_FLAGS) ${MACH_DEBUG_HFILE} \
919: ${DSTROOT}${LCLDIR}/${MACHDEBUGDIR}
920: install $(INSTALL_FLAGS) \
921: $(SOURCE_DIR)/${MACHDEBUGDIR}/mach_debug.defs \
922: ${DSTROOT}${LCLDIR}/${MACHDEBUGDIR}
923: install $(INSTALL_FLAGS) \
924: $(SOURCE_DIR)/${MACHDEBUGDIR}/mach_debug_types.defs \
925: ${DSTROOT}${LCLDIR}/${MACHDEBUGDIR}
926: :
927: : Install all headers into local include directory.
928: :
929: @cd ${SOURCE_DIR}; \
930: for i in ${LCLEXPORT}; \
931: do \
932: (cd $$i; \
933: $(MKDIRS) ${DSTROOT}${LCLDIR}/$$i; \
934: install $(INSTALL_FLAGS) *.h ${DSTROOT}${LCLDIR}/$$i;); \
935: done
936:
937: install_mi_compat_hdrs: DSTROOT ${SOURCE_DIR}/conf/compat_hdrs
938: @rm -rf compat
939: @for i in `cat ${SOURCE_DIR}/conf/compat_hdrs \
940: | awk '{print $$2}' | sort | uniq`; \
941: do \
942: $(MKDIRS) ${DSTROOT}/${COMPATDIR}/$$i; \
943: $(MKDIRS) compat/$$i; \
944: done
945: : creating compatability header files
946: @awk -f ${SOURCE_DIR}/conf/compat_hdrs.awk \
947: ${SOURCE_DIR}/conf/compat_hdrs
948: : installing compatability header files
949: @cd compat; for i in *; \
950: do \
951: (cd $$i;install -c -m 444 * \
952: ${DSTROOT}${COMPATDIR}/$$i); \
953: done
954:
955: #
956: # Install machine-dependent headers only.
957: #
958: install_md_hdrs: DSTROOT install_md_std_hdrs \
959: $(MACHINE_INSTALLHDRS)
960:
961: install_md_std_hdrs: DSTROOT
962: @-for i in `echo ${MACHINE_EXPORT}`; \
963: do \
964: EXPDIR=`pwd`/exports; \
965: [ -d $$EXPDIR ] || $(MKDIRS) $$EXPDIR; \
966: rm -f $$EXPDIR/*; \
967: (cd $(SOURCE_DIR)/$$i; \
968: hdrs=`echo *.h`; \
969: if [ "$$hdrs" = '*.h' ]; then \
970: echo No header files in $$i; \
971: else \
972: for j in $$hdrs; \
973: do \
974: DSTDIR=$(DSTROOT)$(INCDIR)/$$i; \
975: [ -d $$DSTDIR ] || $(MKDIRS) $$DSTDIR; \
976: echo garbage > $$EXPDIR/$$j.strip; \
977: $(UNIFDEF) -UKERNEL_PRIVATE -UDRIVER_PRIVATE $$j > $$EXPDIR/$$j || \
978: $(DECOMMENT) $$EXPDIR/$$j r > $$EXPDIR/$$j.strip; \
979: if [ -s $$EXPDIR/$$j.strip ]; \
980: then ( \
981: cd $$EXPDIR; \
982: install $(INSTALL_FLAGS) $$j $$DSTDIR; \
983: ); \
984: else \
985: echo Header file $$i/$$j not exported; \
986: fi; \
987: rm -f $$EXPDIR/$$j.strip; \
988: done; \
989: fi; \
990: ); \
991: done
992: for i in ${MACHINE_MIGDIRS}; \
993: do \
994: $(MKDIRS) ${DSTROOT}${INCDIR}/$$i; \
995: (cd $(SOURCE_DIR)/$$i; \
996: install $(INSTALL_FLAGS) *.defs ${DSTROOT}${INCDIR}/$$i;); \
997: done
998: -cd ${SOURCE_DIR}; \
999: for i in `echo ${MACHINE_LCLEXPORT}`; \
1000: do \
1001: (cd $$i; \
1002: $(MKDIRS) ${DSTROOT}${LCLDIR}/$$i; \
1003: install $(INSTALL_FLAGS) *.h ${DSTROOT}${LCLDIR}/$$i;); \
1004: done
1005:
1006: install_md_compat_hdrs: DSTROOT ${MACHINE_COMPATHDRS}
1007: @if [ "${MACHINE_COMPATHDRS}" ]; \
1008: then \
1009: rm -rf compat; \
1010: for i in `cat ${MACHINE_COMPATHDRS} \
1011: | awk '{print $$2}' | sort | uniq`; \
1012: do \
1013: $(MKDIRS) ${DSTROOT}/${COMPATDIR}/$$i; \
1014: $(MKDIRS) compat/$$i; \
1015: done; \
1016: awk -f ${SOURCE_DIR}/conf/compat_hdrs.awk \
1017: ${MACHINE_COMPATHDRS}; \
1018: ( \
1019: cd compat; for i in *; \
1020: do \
1021: ( \
1022: cd $$i; \
1023: install -c -m 444 * \
1024: ${DSTROOT}${COMPATDIR}/$$i; \
1025: ); \
1026: done; \
1027: ); \
1028: fi
1029: : installing "conversion compat" files if they exist
1030: @if [ -d ${SOURCE_DIR}/compat/${MACHINE} ]; \
1031: then \
1032: cd ${SOURCE_DIR}/compat/${MACHINE}; \
1033: for i in *; \
1034: do \
1035: if [ -d $$i ]; \
1036: then \
1037: (cd $$i; install -c -m 444 * \
1038: ${DSTROOT}${COMPATDIR}/$$i); \
1039: fi; \
1040: done; \
1041: fi
1042:
1043:
1044: #
1045: # Update the Makefile when any dependency files exist rather than only
1046: # when they are newer than the makefile (since it often gets touched
1047: # during reconfigurations when dependency files have yet to be
1048: # integrated). The makefile is copied before doing any potential
1049: # integration so that the new and old versions can be compared when
1050: # done (by the SYS_RULE_* rules) to prevent re-building things when no
1051: # dependencies change.
1052: #
1053: # N.B. There is always an empty artificial dependency file M.d
1054: # (created by config) which will never be integrated and simply
1055: # prevents the wild-card expansion below from failing.
1056: #
1057: # This seems redundant if we're always going to do it on exit.
1058: #
1059: #Makefile: *.${MD_SUFFIX}
1060: # ${EXIT_RULE}
1061: #
1062: .EXIT:
1063: ${EXIT_RULE}
1064:
1065: #
1066: # Rules for components which are not part of the kernel proper or that
1067: # need to be built in a special manner.
1068: # These need to build without profiling, as it confuses awk script.
1069: #
1070: genassym.o: $(MACHINEDIR)/genassym.c
1071: ${KCC} -c $(CCONFIGFLAGS) $(CPP_FLAGS) $(MACHINE_CFLAGS) \
1072: ${VOLATILE} ${MACHINE_GENASSYM_FLAGS} \
1073: $(MACHINEDIR)/genassym.c
1074:
1075: genassym.s: $(MACHINEDIR)/genassym.c
1076: ${KCC} -S $(CCONFIGFLAGS) $(CPP_FLAGS) $(MACHINE_CFLAGS) \
1077: ${VOLATILE} ${MACHINE_GENASSYM_FLAGS} -arch ${MACHINE} \
1078: $(MACHINEDIR)/genassym.c
1079:
1080: assym.h: genassym.s
1081: @rm -f assym.h
1082: awk -f $(MACHINEDIR)/genassym.awk < genassym.s > assym.h
1083:
1084: ioconf.o: ioconf.c
1085: ${C_RULE_1A}${C_RULE_1B}
1086: ${C_RULE_2}
1087: ${C_RULE_3}
1088: ${C_RULE_4}
1089:
1090: #
1091: # This rule insures that the subr_prof.c does NOT get compiled with
1092: # profiling. It implements mcount() and profiling it leads to recursion.
1093: #
1094:
1095: subr_prof.o: $(SOURCE_DIR)/bsd/kern/subr_prof.c
1096: $(KCC) -c $(CCONFIGFLAGS) $(CPP_FLAGS) $(MACHINE_CFLAGS) \
1097: $(SOURCE_DIR)/bsd/kern/subr_prof.c
1098:
1099:
1100: #
1101: # This macro is replaced by the set of rules which build everything in
1102: # OBJS. The extra dependencies for each object file are inserted
1103: # following this by md which uses the keys on the sentinel line
1104: # below.
1105: #
1106:
1107: %RULES
1108:
1109: #
1110: # Lord only knows what this is for, but config spit's out a reference
1111: #
1112: includelinks:
1113:
1114: DSTROOT:
1115: @if [ -n "${$@}" ]; \
1116: then \
1117: exit 0; \
1118: else \
1119: echo Must define $@; \
1120: exit 1; \
1121: fi
1122:
1123: ALWAYS:
1124:
1125: -include Makedep
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.