TODO revision 1.29 1 1.5 uebayasi o Call module as module.
2 1.5 uebayasi
3 1.5 uebayasi Until now, everything is called as attribute. Separate module from it:
4 1.5 uebayasi
5 1.5 uebayasi - Module is a collection of code (*.[cSo]), and provides a function.
6 1.5 uebayasi Module can depend on other modules.
7 1.5 uebayasi
8 1.5 uebayasi - Attribute provides metadata for modules. One module can have
9 1.5 uebayasi multiple attributes. Attribute doesn't generate a module (*.o,
10 1.5 uebayasi *.ko).
11 1.5 uebayasi
12 1.1 uebayasi o Emit everything (ioconf.*, Makefile, ...) per-attribute.
13 1.1 uebayasi
14 1.9 uebayasi config(9) related metadata (cfdriver, cfattach, cfdata, ...) should be
15 1.9 uebayasi collected using linker. Create ELF sections like
16 1.9 uebayasi .{rodata,data}.config.{cfdriver,cfattach,cfdata}. Provide reference
17 1.9 uebayasi symbols (e.g. cfdriverinit[]) using linker script. Sort entries by name
18 1.9 uebayasi to lookup entries by binary search in kernel.
19 1.9 uebayasi
20 1.1 uebayasi o Generate modular(9) related information. Especially module dependency.
21 1.1 uebayasi
22 1.9 uebayasi At this moment modular(9) modules hardcode dependency in *.c using the
23 1.9 uebayasi MODULE() macro:
24 1.9 uebayasi
25 1.9 uebayasi MODULE(MODULE_CLASS_DRIVER, hdaudio, "pci");
26 1.9 uebayasi
27 1.9 uebayasi This information already exists in config(5) definitions (files.*).
28 1.9 uebayasi Extend config(5) to be able to specify module's class.
29 1.9 uebayasi
30 1.9 uebayasi Ideally these module metadata are kept somewhere in ELF headers, so that
31 1.9 uebayasi loaders (e.g. boot(8)) can easily read. One idea is to abuse DYNAMIC
32 1.9 uebayasi sections to record dependency, as shared library does. (Feasibility
33 1.9 uebayasi unknown.)
34 1.9 uebayasi
35 1.1 uebayasi o Rename "interface attribute" to "bus".
36 1.1 uebayasi
37 1.1 uebayasi Instead of
38 1.1 uebayasi
39 1.1 uebayasi define audiobus {}
40 1.1 uebayasi attach audio at audiobus
41 1.1 uebayasi
42 1.1 uebayasi Do like this
43 1.1 uebayasi
44 1.1 uebayasi defbus audiobus {}
45 1.1 uebayasi attach audio at audiobus
46 1.1 uebayasi
47 1.15 uebayasi Always provide xxxbusprint() (and xxxbussubmatch if multiple children).
48 1.15 uebayasi Extend struct cfiattrdata like:
49 1.15 uebayasi
50 1.15 uebayasi struct cfiattrdata {
51 1.15 uebayasi const char *ci_name;
52 1.15 uebayasi cfprint_t ci_print;
53 1.15 uebayasi cfsubmatch_t ci_submatch;
54 1.15 uebayasi int ci_loclen;
55 1.15 uebayasi const struct cflocdesc ci_locdesc[];
56 1.15 uebayasi };
57 1.15 uebayasi
58 1.15 uebayasi o Simplify child configuration API
59 1.15 uebayasi
60 1.15 uebayasi With said struct cfiattrdata extension, config_found*() can omit
61 1.15 uebayasi print/submatch args. If the found child is known (e.g., "pcibus" creating
62 1.15 uebayasi "pci"):
63 1.15 uebayasi
64 1.16 uebayasi config_found(self, "pcibus");
65 1.15 uebayasi
66 1.15 uebayasi If finding unknown children (e.g. "pci" finding pci devices):
67 1.15 uebayasi
68 1.15 uebayasi config_find(self, "pci", locs, aux);
69 1.15 uebayasi
70 1.8 uebayasi o Retire "attach foo at bar with foo_bar.c"
71 1.8 uebayasi
72 1.8 uebayasi Most of these should be rewritten by defining a common interface attribute
73 1.8 uebayasi "foobus", instead of writing multiple attachments. com(4), ld(4), ehci(4)
74 1.8 uebayasi are typical examples. For ehci(4), EHCI-capable controller drivers implement
75 1.8 uebayasi "ehcibus" interface, like:
76 1.8 uebayasi
77 1.8 uebayasi defne ehcibus {}
78 1.8 uebayasi device imxehci: ehcibus
79 1.8 uebayasi
80 1.8 uebayasi These drivers' attach functions call config_found() to attach ehci(4) via
81 1.8 uebayasi the "ehcibus" interface attribute, instead of calling ehci_init() directly.
82 1.8 uebayasi Same for com(4) (com_attach_subr()) and ld(4) (ldattach()).
83 1.8 uebayasi
84 1.1 uebayasi o Sort objects in more reasonable order.
85 1.1 uebayasi
86 1.1 uebayasi Put machdep.ko in the lowest address. uvm.ko and kern.ko follow.
87 1.1 uebayasi
88 1.1 uebayasi Kill alphabetical sort (${OBJS:O} in sys/conf/Makefile.inc.kern.
89 1.1 uebayasi
90 1.1 uebayasi Use ldscript. Do like this
91 1.1 uebayasi
92 1.1 uebayasi .text :
93 1.1 uebayasi AT (ADDR(.text) & 0x0fffffff)
94 1.1 uebayasi {
95 1.1 uebayasi *(.text.machdep.locore.entry)
96 1.1 uebayasi *(.text.machdep.locore)
97 1.1 uebayasi *(.text.machdep)
98 1.1 uebayasi *(.text)
99 1.1 uebayasi *(.text.*)
100 1.1 uebayasi :
101 1.1 uebayasi
102 1.1 uebayasi Kill linker definitions in sys/conf/Makefile.inc.kern.
103 1.2 uebayasi
104 1.3 wiz o Differentiate "options" and "flags"/"params".
105 1.2 uebayasi
106 1.3 wiz "options" enables features by adding *.c files (via attributes).
107 1.2 uebayasi
108 1.2 uebayasi "flags" and "params" are to change contents of *.c files. These don't add
109 1.3 wiz *.c files to the result kernel, or don't build attributes (modules).
110 1.2 uebayasi
111 1.2 uebayasi o Make flags/params per attributes (modules).
112 1.2 uebayasi
113 1.2 uebayasi Basically flags and params are cpp(1) #define's generated in opt_*.h. Make
114 1.2 uebayasi them local to one attributes (modules). Flags/params which affects files
115 1.2 uebayasi across attributes (modules) are possible, but should be discouraged.
116 1.2 uebayasi
117 1.2 uebayasi o Generate things only by definitions.
118 1.2 uebayasi
119 1.2 uebayasi In the ideal dynamically modular world, "selection" will be done not at
120 1.2 uebayasi compile time but at runtime. Users select their wanted modules, by
121 1.2 uebayasi dynamically loading them.
122 1.2 uebayasi
123 1.2 uebayasi This means that the system provides all choices; that is, build all modules
124 1.2 uebayasi in the source tree. Necessary information is defined in the "definition"
125 1.2 uebayasi part.
126 1.2 uebayasi
127 1.2 uebayasi o Split cfdata.
128 1.2 uebayasi
129 1.8 uebayasi cfdata is a set of pattern matching rules to enable devices at runtime device
130 1.3 wiz auto-configuration. It is pure data and can (should) be generated separately
131 1.2 uebayasi from the code.
132 1.4 apb
133 1.4 apb o Allow easier adding and removing of options.
134 1.4 apb
135 1.4 apb It should be possible to add or remove options, flags, etc.,
136 1.4 apb without regard to whether or not they are already defined.
137 1.4 apb For example, a configuration like this:
138 1.4 apb
139 1.4 apb include GENERIC
140 1.4 apb options FOO
141 1.4 apb no options BAR
142 1.4 apb
143 1.4 apb should work regardless of whether or not options FOO and/or
144 1.4 apb options BAR were defined in GENERIC. It should not give
145 1.4 apb errors like "options BAR was already defined" or "options FOO
146 1.4 apb was not defined".
147 1.4 apb
148 1.5 uebayasi o Introduce "class".
149 1.5 uebayasi
150 1.7 wiz Every module should be classified as at least one class, as modular(9)
151 1.7 wiz modules already do. For example, file systems are marked as "vfs", network
152 1.5 uebayasi protocols are "netproto".
153 1.5 uebayasi
154 1.5 uebayasi Consider to merge "devclass" into "class".
155 1.5 uebayasi
156 1.5 uebayasi For syntax clarity, class names could be used as a keyword to select the
157 1.5 uebayasi class's instance module:
158 1.5 uebayasi
159 1.5 uebayasi # Define net80211 module as netproto class
160 1.5 uebayasi class netproto
161 1.5 uebayasi define net80211: netproto
162 1.5 uebayasi
163 1.5 uebayasi # Select net80211 to be builtin
164 1.5 uebayasi netproto net80211
165 1.5 uebayasi
166 1.5 uebayasi Accordingly device/attach selection syntax should be revisited.
167 1.5 uebayasi
168 1.6 uebayasi o Support kernel constructor/destructor (.kctors/.kdtors)
169 1.5 uebayasi
170 1.5 uebayasi Initialization and finalization should be called via constructors and
171 1.5 uebayasi destructors. Don't hardcode those sequences as sys/kern/init_main.c:main()
172 1.5 uebayasi does.
173 1.5 uebayasi
174 1.6 uebayasi The order of .kctors/.kdtors is resolved by dependency. The difference from
175 1.5 uebayasi userland is that in kernel depended ones are located in lower addresses;
176 1.5 uebayasi "machdep" module is the lowest. Thus the lowest entry in .ctors must be
177 1.5 uebayasi executed the first.
178 1.5 uebayasi
179 1.6 uebayasi The .kctors/.kdtors entries are executed by kernel's main() function, unlike
180 1.6 uebayasi userland where start code executes .ctors/.dtors before main(). The hardcoded
181 1.6 uebayasi sequence of various subsystem initializations in init_main.c:main() will be
182 1.7 wiz replaced by an array of .kctors invocations, and #ifdef's there will be gone.
183 1.6 uebayasi
184 1.12 uebayasi o Hide link-set in the final kernel.
185 1.5 uebayasi
186 1.12 uebayasi Link-set is used to collect references (pointers) at link time. It relys on
187 1.12 uebayasi the ld(1) behavior that it automatically generates `__start_X' and `__stop_X'
188 1.12 uebayasi symbols for the section `X' to reduce coding.
189 1.12 uebayasi
190 1.12 uebayasi Don't allow kernel subsystems create random ELF sections.
191 1.12 uebayasi
192 1.12 uebayasi Pre-define all the available link-set names and pre-generate a linker script
193 1.12 uebayasi to merge them into .rodata.
194 1.12 uebayasi
195 1.12 uebayasi (For modular(9) modules, `link_set_modules' is looked up by kernel loader.
196 1.12 uebayasi Provide only it.)
197 1.12 uebayasi
198 1.12 uebayasi Provide a way for 3rd party modules to declare extra link-set.
199 1.6 uebayasi
200 1.6 uebayasi o Shared kernel objects.
201 1.6 uebayasi
202 1.7 wiz Since NetBSD has not established a clear kernel ABI, every single kernel
203 1.6 uebayasi has to build all the objects by their own. As a result, similar kernels
204 1.6 uebayasi (e.g. evbarm kernels) repeatedly compile similar objects, that is waste of
205 1.6 uebayasi energy & space.
206 1.6 uebayasi
207 1.6 uebayasi Share them if possible. For evb* ports, ideally everything except machdep.ko
208 1.6 uebayasi should be shared.
209 1.6 uebayasi
210 1.6 uebayasi While leaving optimizations as options (CPU specific optimizations, inlined
211 1.6 uebayasi bus_space(9) operations, etc.) for users, the official binaries build
212 1.6 uebayasi provided by TNF should be as portable as possible.
213 1.10 uebayasi
214 1.23 uebayasi o Always use explicit kernel linker script.
215 1.23 uebayasi
216 1.23 uebayasi ld(1) has an option -T <ldscript> to use a given linker script. If not
217 1.23 uebayasi specified, a default, built-in linker script, mainly meant for userland
218 1.23 uebayasi programs, is used.
219 1.23 uebayasi
220 1.23 uebayasi Currently m68k, sh3, and vax don't have kernel linker scripts. These work
221 1.23 uebayasi because these have no constraints about page boundary; they map and access
222 1.23 uebayasi kernel .text/.data in the same way.
223 1.23 uebayasi
224 1.27 uebayasi o Pass input files to ${LD} via linker script.
225 1.27 uebayasi
226 1.27 uebayasi Instead of passing input files on command-line, output "INPUT(xxx.o)"
227 1.27 uebayasi commands, and include it from generated linker scripts.
228 1.27 uebayasi
229 1.27 uebayasi o Generate `*.d' files.
230 1.27 uebayasi
231 1.27 uebayasi Output source/object files in raw texts instead of `Makefile'. Generate
232 1.27 uebayasi `*.d' (make(1) depend) files. make(1) knows which object files are to be
233 1.27 uebayasi compiled. With "INPUT(xxx.o)" linker scripts, either generated `Makefile'
234 1.27 uebayasi or `Makefile.kern.inc' don't need to keep source/object files in variables.
235 1.27 uebayasi
236 1.10 uebayasi o Control ELF sections using linker script.
237 1.10 uebayasi
238 1.10 uebayasi Now kernel is linked and built directly from object files (*.o). Each port
239 1.10 uebayasi has an MD linker script, which does everything needed to be done at link
240 1.10 uebayasi time. As a result, they do from MI alignment restriction (read_mostly,
241 1.10 uebayasi cacheline_aligned) to load address specification for external boot loaders.
242 1.10 uebayasi
243 1.10 uebayasi Make this into multiple stages to make linkage more structural. Especially,
244 1.11 uebayasi reserve the final link for purely MD purpose. Note that in modular build,
245 1.11 uebayasi *.ko are shared between build of kernel and modular(9) modules (*.kmod).
246 1.10 uebayasi
247 1.10 uebayasi Monolithic build:
248 1.10 uebayasi *.o ---> netbsd.ko Generic MI linkage
249 1.10 uebayasi netbsd.ko ---> netbsd.ro Kernel MI linkage
250 1.10 uebayasi netbsd.ro ---> netbsd Kernel MD linkage
251 1.10 uebayasi
252 1.10 uebayasi Modular build (kernel):
253 1.10 uebayasi *.o ---> *.ko Generic + Per-module MI linkage
254 1.10 uebayasi *.ko ---> netbsd.ro Kernel MI linkage
255 1.10 uebayasi netbsd.ro ---> netbsd Kernel MD linkage
256 1.10 uebayasi
257 1.10 uebayasi Modular build (module):
258 1.10 uebayasi *.o ---> *.ko Generic + Per-module MI linkage
259 1.10 uebayasi *.ko ---> *.ro Modular MI linkage
260 1.10 uebayasi *.ro ---> *.kmod Modular MD linkage
261 1.10 uebayasi
262 1.10 uebayasi Genric MI linkage is for processing MI linkage that can be applied generally.
263 1.10 uebayasi Data section alignment (.data.read_mostly and .data.cacheline_aligned) is
264 1.10 uebayasi processed here.
265 1.10 uebayasi
266 1.10 uebayasi Per-module MI linkage is for modules that want some ordering. For example,
267 1.10 uebayasi machdep.ko wants to put entry code at the top of .text and .data.
268 1.10 uebayasi
269 1.10 uebayasi Kernel MI linkage is for collecting kernel global section data, that is what
270 1.10 uebayasi link-set is used for now. Once they are collected and symbols to the ranges
271 1.10 uebayasi are assigned, those sections are merged into the pre-existing sections
272 1.10 uebayasi (.rodata) because link-set sections in "netbsd" will never be interpreted by
273 1.10 uebayasi external loaders.
274 1.10 uebayasi
275 1.10 uebayasi Kernel MD linkage is used purely for MD purposes, that is, how kernels are
276 1.10 uebayasi loaded by external loaders. It might be possible that one kernel relocatable
277 1.10 uebayasi (netbsd.ro) is linked into multiple final kernel image (netbsd) for diferent
278 1.10 uebayasi load addresses.
279 1.10 uebayasi
280 1.11 uebayasi Modular MI linkage is to prepare a module to be loadable as modular(9). This
281 1.11 uebayasi may add some extra sections and/or symbols.
282 1.11 uebayasi
283 1.11 uebayasi Modular MD linkage is again for pure MD purposes like kernel MD linkage.
284 1.11 uebayasi Adjustment and/or optimization may be done.
285 1.11 uebayasi
286 1.11 uebayasi Kernel and modular MI linkages may change behavior depending on existence
287 1.11 uebayasi of debug information. In the future .symtab will be copied using linker
288 1.11 uebayasi during this stage.
289 1.13 uebayasi
290 1.24 uebayasi o Fix db_symtab copying (COPY_SYMTAB)
291 1.24 uebayasi
292 1.24 uebayasi o Collect all objects and create a relocatable (netbsd.ro). At this point,
293 1.24 uebayasi the number of symbols is known.
294 1.24 uebayasi
295 1.24 uebayasi o Relink and allocate .rodata.symtab with the calculated size of .symtab.
296 1.24 uebayasi Linker recalculates symbol addresses.
297 1.24 uebayasi
298 1.24 uebayasi o Embed the .symtab into .rodata.symtab.
299 1.24 uebayasi
300 1.24 uebayasi o Link the final netbsd ELF.
301 1.24 uebayasi
302 1.24 uebayasi The make(1) rule (dependency graph) should be identical with/without
303 1.24 uebayasi COPY_SYMTAB. Kill .ifdef COPY_SYMTAB from $S/conf/Makefile.kern.inc.
304 1.24 uebayasi
305 1.19 uebayasi o Preprocess and generate linker scripts dynamically.
306 1.19 uebayasi
307 1.19 uebayasi Include opt_xxx.h and replace some constant values (e.g. COHERENCY_UNIT,
308 1.19 uebayasi PAGE_SIZE, KERNEL_BASE_PHYS, KERNEL_BASE_VIRT, ...) with cpp(1).
309 1.19 uebayasi
310 1.19 uebayasi Don't unnecessarily define symbols. Don't use sed(1).
311 1.19 uebayasi
312 1.19 uebayasi o Clean up linker scripts.
313 1.19 uebayasi
314 1.19 uebayasi o Don't specify OUTPUT_FORMAT()/OUTPUT_ARCH()
315 1.19 uebayasi
316 1.19 uebayasi These are basically set in compilers/linkers. If non-default ABI is used,
317 1.19 uebayasi command-line arguments should be specified.
318 1.19 uebayasi
319 1.19 uebayasi o Remove .rel/.rela handlings.
320 1.19 uebayasi
321 1.19 uebayasi These are set in relocatable objects, and handled by dynamic linkers.
322 1.19 uebayasi Totally irrelefant for kernels.
323 1.19 uebayasi
324 1.19 uebayasi o Clean up debug section handlings.
325 1.19 uebayasi
326 1.19 uebayasi o Document (section boundary) symbols set in linker scripts.
327 1.19 uebayasi
328 1.19 uebayasi There must be a reason why symbols are defined and exported.
329 1.19 uebayasi
330 1.19 uebayasi PROVIDE() is to define internal symbols.
331 1.19 uebayasi
332 1.19 uebayasi o Clean up load addresses.
333 1.19 uebayasi
334 1.19 uebayasi o Program headers.
335 1.19 uebayasi
336 1.19 uebayasi o According to matt@, .ARM.extab/.ARM.exidx sections are no longer needed.
337 1.19 uebayasi
338 1.13 uebayasi o Redesign swapnetbsd.c (root/swap device specification)
339 1.13 uebayasi
340 1.13 uebayasi Don't build a whole kernel only to specify root/swap devices.
341 1.13 uebayasi
342 1.13 uebayasi Make these parameter re-configurable afterwards.
343 1.14 uebayasi
344 1.14 uebayasi o Namespace.
345 1.14 uebayasi
346 1.14 uebayasi Investigate namespace of attributes/modules/options. Figure out the hidden
347 1.14 uebayasi design about these, document it, then re-design it.
348 1.14 uebayasi
349 1.14 uebayasi At this moment, all of them share the single "selecttab", which means their
350 1.14 uebayasi namespaces are common, but they also have respective tables (attrtab,
351 1.14 uebayasi opttab, etc.).
352 1.14 uebayasi
353 1.14 uebayasi Selecting an option (addoption()), that is also a module name, works only if
354 1.14 uebayasi the module doesn't depend on anything, because addoption() doesn't select
355 1.14 uebayasi module and its dependencies (selectattr()). In other words, an option is
356 1.14 uebayasi only safely converted to a module (define), only if it doesn't depend on
357 1.14 uebayasi anything. (One example is DDB.)
358 1.17 uebayasi
359 1.17 uebayasi o Convert pseudo(dev) attach functions to take (void) (== kernel ctors).
360 1.17 uebayasi
361 1.17 uebayasi The pseudo attach function was originally designed to take `int n' as
362 1.17 uebayasi the number of instances of the pseudo device. Now most of pseudo
363 1.17 uebayasi devices have been converted to be `cloneable', meaning that their
364 1.17 uebayasi instances are dynamically allocated at run-time, because guessing how
365 1.17 uebayasi much instances are needed for users at compile time is almost impossible.
366 1.17 uebayasi Restricting such a pure software resource at compile time is senseless,
367 1.17 uebayasi considering that the rest of the world is dynamic.
368 1.17 uebayasi
369 1.17 uebayasi If pseudo attach functions once become (void), config(1) no longer
370 1.17 uebayasi has to generate iteration to call those functions, by making them part
371 1.17 uebayasi of kernel constructors, that are a list of (void) functions.
372 1.17 uebayasi
373 1.17 uebayasi Some pseudo devices may have dependency/ordering problems, because
374 1.17 uebayasi pseudo attach functions have no choice when to be called. This could
375 1.17 uebayasi be solved by converting to kctors, where functions are called in order
376 1.17 uebayasi by dependency.
377 1.18 pgoyette
378 1.18 pgoyette o Enhance ioconf behavior for pseudo-devices
379 1.18 pgoyette
380 1.18 pgoyette See "bin/48571: config(1) ioconf is insufficient for pseudo-devices" for
381 1.18 pgoyette more details. In a nutshell, it would be "useful" for config to emit
382 1.18 pgoyette the necessary stuff in the generated ioconf.[ch] to enable use of
383 1.18 pgoyette config_{init,fini}_component() for attaching and detaching pseudodev's.
384 1.18 pgoyette
385 1.18 pgoyette Currently, you need to manually construct your own data structures, and
386 1.18 pgoyette manually "attach" them, one at a time. This leads to duplication of
387 1.18 pgoyette code (where multiple drivers contain the same basic logic), and doesn't
388 1.18 pgoyette necessarily handle all of the "frobbing" of the kernel lists.
389 1.20 uebayasi
390 1.22 uebayasi o Don't use -Ttext ${TEXTADDR}.
391 1.22 uebayasi
392 1.22 uebayasi Although ld(1)'s `-Ttext ${TEXTADDR}' is an easy way to specify the virtual
393 1.22 uebayasi base address of .text at link time, it needs to change command-line; in
394 1.22 uebayasi kernel build, Makefile needs to change to reflect kernel's configuration.
395 1.22 uebayasi It is simpler to reflect kenel configuration using linker script via assym.h.
396 1.22 uebayasi
397 1.20 uebayasi o Convert ${DIAGNOSTIC} and ${DEBUG} as flags (defflag).
398 1.20 uebayasi
399 1.20 uebayasi Probably generate opt_diagnostic.h/opt_debug.h and include them in
400 1.20 uebayasi sys/param.h.
401 1.20 uebayasi
402 1.20 uebayasi o Strictly define DIAGNOSTIC.
403 1.20 uebayasi
404 1.20 uebayasi It is possible to make DIAGNOSTIC kernel and modules binary-compatible with
405 1.20 uebayasi non-DIAGNOSTIC ones. In that case, debug type informations should match
406 1.20 uebayasi theoretically (not confirmed).
407 1.23 uebayasi
408 1.25 uebayasi o Use suffix rules.
409 1.25 uebayasi
410 1.25 uebayasi Build objects following suffix rules. Source files are defined as relative to
411 1.25 uebayasi $S (e.g. sys/kern/init_main.c) and objects are generated in the corresponding
412 1.25 uebayasi subdirectories under kernel build directories (e.g.
413 1.25 uebayasi .../compile/GENERIC/sys/kern/init_main.o). Dig subdirectories from within
414 1.25 uebayasi config(1).
415 1.25 uebayasi
416 1.25 uebayasi Debugging (-g) and profiling (-pg) objects could be generated with *.go/*.po
417 1.25 uebayasi suffixes as userland libraries do. Maybe something similar for
418 1.25 uebayasi DIAGNOSTIC/DEBUG.
419 1.25 uebayasi
420 1.25 uebayasi genassym(1) definitions will be split into per-source instead of the single
421 1.25 uebayasi assym.h. Dependencies are corrected and some of misterious dependencies on
422 1.25 uebayasi `Makefile' in sys/conf/Makefile.kern.inc can go away.
423 1.25 uebayasi
424 1.23 uebayasi o Define genassym(1) symbols per file.
425 1.23 uebayasi
426 1.23 uebayasi Have each file define symbols that have to be generated by genassym(1) so
427 1.23 uebayasi that more accurate dependency is reflected.
428 1.23 uebayasi
429 1.23 uebayasi For example, if foo.S needs some symbols, it defines them in foo.assym,
430 1.23 uebayasi declaring that foo.S depends on foo.assym.h, and includes foo.assym.h.
431 1.23 uebayasi foo.assym.h is generated by following the suffix rule of .assym -> .assym.h.
432 1.23 uebayasi When one header is updated, only related *.assym.h files are regenerated,
433 1.23 uebayasi instead of rebuilding all MD/*.S files that depend on the global, single
434 1.23 uebayasi assym.h.
435 1.27 uebayasi
436 1.27 uebayasi o Support library.
437 1.27 uebayasi
438 1.27 uebayasi Provide a consistent way to build library either as .o or .a.
439 1.27 uebayasi
440 1.27 uebayasi o Accept `.a' suffix.
441 1.27 uebayasi
442 1.27 uebayasi Make "file" command accept `.a' suffix. Handle it the same way as `.o'.
443 1.28 uebayasi
444 1.28 uebayasi o Clean up ${MD_OBJS} and friends in Makefile.${MACHINE}.
445 1.28 uebayasi
446 1.28 uebayasi Don't use ${MD_OBJS}, ${MD_LIBS}, ${MD_SFILES}, and ${MD_CFILES}.
447 1.28 uebayasi
448 1.28 uebayasi List files in config(5)'s "file". Override build rules only when neccesary.
449 1.28 uebayasi
450 1.28 uebayasi Rely on the fact that config(1) parses files.${MACHINE} first, outputs
451 1.28 uebayasi files in the order it parses files.* (actually include depth), and
452 1.28 uebayasi `Makefile.kern.inc' preserve file order to pass to ${LD}.
453 1.29 uebayasi
454 1.29 uebayasi o Clean up CTF-related rules.
455 1.29 uebayasi
456 1.29 uebayasi Don't overwrite compile/link rules conditionally by existence of
457 1.29 uebayasi ${CTFCONVERT}/${CTFMERGE}. Give a separate suffix (*.ctfo) and define its
458 1.29 uebayasi rules (.c -> .ctfo).
459