stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 1 | # |
| 2 | # CDDL HEADER START |
| 3 | # |
| 4 | # The contents of this file are subject to the terms of the |
eschrock | dc0093f | 2006-03-03 22:38:03 -0800 | [diff] [blame] | 5 | # Common Development and Distribution License (the "License"). |
| 6 | # You may not use this file except in compliance with the License. |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 7 | # |
| 8 | # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| 9 | # or http://www.opensolaris.org/os/licensing. |
| 10 | # See the License for the specific language governing permissions |
| 11 | # and limitations under the License. |
| 12 | # |
| 13 | # When distributing Covered Code, include this CDDL HEADER in each |
| 14 | # file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| 15 | # If applicable, add the following below this CDDL HEADER, with the |
| 16 | # fields enclosed by brackets "[]" replaced with your own identifying |
| 17 | # information: Portions Copyright [yyyy] [name of copyright owner] |
| 18 | # |
| 19 | # CDDL HEADER END |
| 20 | # |
| 21 | # |
jmcp | 24fe0b3 | 2009-07-29 16:56:03 -0700 | [diff] [blame] | 22 | # Copyright 2009 Sun Microsystems, Inc. All rights reserved. |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 23 | # Use is subject to license terms. |
| 24 | # |
Jeremy Jones | 2a12f85 | 2013-08-21 15:45:46 -0800 | [diff] [blame] | 25 | # Copyright (c) 2013 by Delphix. All rights reserved. |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 26 | # Copyright 2015, Joyent, Inc. |
Jeremy Jones | 2a12f85 | 2013-08-21 15:45:46 -0800 | [diff] [blame] | 27 | # |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 28 | |
| 29 | .KEEP_STATE: |
| 30 | .SUFFIXES: |
| 31 | |
| 32 | include $(SRC)/cmd/mdb/Makefile.tools |
| 33 | |
Alexander Pyhalov | 9f92308 | 2016-08-30 12:55:15 +0300 | [diff] [blame] | 34 | # |
| 35 | # Make sure we're getting a consistent execution environment for the |
| 36 | # embedded scripts. |
| 37 | # |
| 38 | SHELL= /usr/bin/ksh93 |
| 39 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 40 | $(KMOD_SOURCES_DIFFERENT)KMODSRCS = $(MODSRCS) |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 41 | $(KMOD_SOURCES_DIFFERENT)KMODASMSRCS = $(MODASMSRCS) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 42 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 43 | MODOBJS = $(MODSRCS:%.c=dmod/%.o) $(MODASMSRCS:%.s=dmod/%.o) |
| 44 | KMODOBJS = $(KMODSRCS:%.c=kmod/%.o) $(KMODASMSRCS:%.s=kmod/%.o) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 45 | |
Alexander Pyhalov | 9f92308 | 2016-08-30 12:55:15 +0300 | [diff] [blame] | 46 | MODNAME_cmd = if [ -n "$(MODULE_NAME)" ]; then print $(MODULE_NAME); else print $(MODULE)| sed -e 's:\.so$$::'; fi |
| 47 | MODNAME = $(MODNAME_cmd:sh) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 48 | KMODULE = $(MODNAME) |
| 49 | |
| 50 | MODFILE = dmod/$(MODULE) |
| 51 | KMODFILE = kmod/$(KMODULE) |
| 52 | |
| 53 | # |
| 54 | # The mess below is designed to pick the right set of objects to build and/or |
| 55 | # lint. We have three flavors: |
| 56 | # |
mws | 1a7c1b7 | 2005-07-31 12:13:11 -0700 | [diff] [blame] | 57 | # 1. proc and raw modules. Only $(MODOBJS) are built. |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 58 | # 2. kvm modules for systems without kmdb. Only $(MODOBJS) are built. |
| 59 | # 3. kvm modules for systems with kmdb. $(MODOBJS) and $(KMODOBJS) are built. |
| 60 | # |
| 61 | # Complicating matters, we'd like to make the distinction between 2 and 3 before |
| 62 | # this Makefile is loaded. By default, we'll assume that all kvm modules should |
| 63 | # be built for kmdb. If, however, the user sets $(MODULE_BUILD_TYPE) to `mdb', |
| 64 | # the kmdb variant of the module won't be built. |
| 65 | # |
| 66 | |
| 67 | # Which flavors are to be built? |
| 68 | TARGETS_kvm_type_ = both # Build both if $(MODULE_BUILD_TYPE) is unset |
| 69 | TARGETS_kvm_type_kmdb = both |
| 70 | TARGETS_kvm_type_mdb = mdb |
| 71 | TARGETS_kvm_type = $(TARGETS_kvm_type_$(MODULE_BUILD_TYPE)) |
| 72 | |
| 73 | # What should we build? |
| 74 | TARGETS_kvm_kmdb = $(KMODFILE) |
| 75 | TARGETS_kvm_mdb = $(MODFILE) |
| 76 | TARGETS_kvm_both = $(TARGETS_kvm_mdb) $(TARGETS_kvm_kmdb) |
| 77 | TARGETS_kvm = $(TARGETS_kvm_$(TARGETS_kvm_type)) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 78 | TARGETS_proc = $(MODFILE) |
mws | 1a7c1b7 | 2005-07-31 12:13:11 -0700 | [diff] [blame] | 79 | TARGETS_raw = $(MODFILE) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 80 | TARGETS = $(TARGETS_$(MDBTGT)) |
| 81 | |
| 82 | # Where should we install that which we've built? |
| 83 | ROOTTGTS_kvm_type = $(TARGETS_kvm_type) # overridden by mdb_ks |
| 84 | ROOTTGTS_kvm_kmdb = $(ROOTKMOD)/$(KMODULE) |
| 85 | ROOTTGTS_kvm_mdb = $(ROOTMOD)/$(MODULE) |
| 86 | ROOTTGTS_kvm_both = $(ROOTTGTS_kvm_mdb) $(ROOTTGTS_kvm_kmdb) |
| 87 | ROOTTGTS_kvm = $(ROOTTGTS_kvm_$(ROOTTGTS_kvm_type)) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 88 | ROOTTGTS_proc = $(ROOTMOD)/$(MODULE) |
mws | 1a7c1b7 | 2005-07-31 12:13:11 -0700 | [diff] [blame] | 89 | ROOTTGTS_raw = $(ROOTMOD)/$(MODULE) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 90 | ROOTTGTS = $(ROOTTGTS_$(MDBTGT)) |
| 91 | |
| 92 | # What should we lint? |
| 93 | KLINTOBJS = $(KMODOBJS:%.o=%.ln) |
| 94 | LINTOBJS = $(MODOBJS:%.o=%.ln) |
| 95 | |
| 96 | LINTFILES_kvm_type = $(TARGETS_kvm_type) |
| 97 | LINTFILES_kvm_both = $(KLINTOBJS) $(LINTOBJS) |
| 98 | LINTFILES_kvm_mdb = $(LINTOBJS) |
| 99 | LINTFILES_kvm = $(LINTFILES_kvm_$(LINTFILES_kvm_type)) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 100 | LINTFILES_proc = $(LINTOBJS) |
mws | 1a7c1b7 | 2005-07-31 12:13:11 -0700 | [diff] [blame] | 101 | LINTFILES_raw = $(LINTOBJS) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 102 | LINTFILES = $(LINTFILES_$(MDBTGT)) |
| 103 | |
Robert Mustacchi | 259e543 | 2016-09-30 11:30:01 -0700 | [diff] [blame] | 104 | # |
| 105 | # Python specific flags. To try and make life easier for folks how are |
| 106 | # building with an LFS python, we attempt to use -isystem when it's |
| 107 | # available. |
| 108 | # |
| 109 | PYCPPFLAGS = -_gcc=-isystem -_gcc=$(ADJUNCT_PROTO)/usr/include/python$(PYTHON_VERSION) |
| 110 | PYCPPFLAGS += -_cc=-I$(ADJUNCT_PROTO)/usr/include/python$(PYTHON_VERSION) |
| 111 | PYLNFLAGS = -I$(ADJUNCT_PROTO)/usr/include/python$(PYTHON_VERSION) |
| 112 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 113 | kvm_TGTFLAGS = -D_KERNEL |
| 114 | proc_TGTFLAGS = -D_USER |
| 115 | |
Yuri Pankov | bd0ce62 | 2018-02-05 08:52:36 +0300 | [diff] [blame] | 116 | CSTD = $(CSTD_GNU99) |
Jeremy Jones | 2a12f85 | 2013-08-21 15:45:46 -0800 | [diff] [blame] | 117 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 118 | CFLAGS += $(CCVERBOSE) |
| 119 | CFLAGS64 += $(CCVERBOSE) |
Robert Mustacchi | 259e543 | 2016-09-30 11:30:01 -0700 | [diff] [blame] | 120 | CPPFLAGS += $($(MDBTGT)_TGTFLAGS) -I../../../common |
rie | 67e3a03 | 2008-05-02 15:01:06 -0700 | [diff] [blame] | 121 | LDFLAGS += $(ZTEXT) |
| 122 | LDFLAGS64 += $(ZTEXT) |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 123 | ASFLAGS += -P |
| 124 | AS_CPPFLAGS += -D_ASM |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 125 | |
| 126 | # Module type-specific compiler flags |
| 127 | $(MODOBJS) := CFLAGS += $(C_BIGPICFLAGS) $(XREGSFLAG) |
| 128 | $(MODOBJS) := CFLAGS64 += $(C_BIGPICFLAGS) $(XREGSFLAG) |
| 129 | $(KMODOBJS) $(KLINTOBJS) := CPPFLAGS += -D_KMDB |
| 130 | $(KMODOBJS) := V9CODESIZE = $(CCABS32) |
| 131 | $(KMODOBJS) := DTS_ERRNO = |
| 132 | |
| 133 | # Modules aren't allowed to export symbols |
rie | 67e3a03 | 2008-05-02 15:01:06 -0700 | [diff] [blame] | 134 | MAPFILE = $(SRC)/cmd/mdb/common/modules/conf/mapfile |
| 135 | |
| 136 | # Modules typically make external references. To provide for -zdefs use |
| 137 | # and clean ldd(1) processing, explicitly define all external references. |
| 138 | MAPFILE-EXT = $(SRC)/cmd/mdb/common/modules/conf/mapfile-extern |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 139 | |
| 140 | # |
| 141 | # kmdb is a kernel module, so we'll use the kernel's build flags. |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 142 | $(KMODOBJS) := CFLAGS64 += $(STAND_FLAGS_64) |
| 143 | |
| 144 | # |
| 145 | # Override this to pull source files from another directory |
| 146 | # |
| 147 | MODSRCS_DIR = ../../../common/modules/genunix |
| 148 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 149 | all: $$(TARGETS) |
| 150 | |
| 151 | install: all $$(ROOTTGTS) |
| 152 | |
| 153 | dmods: install |
| 154 | |
| 155 | clean.lint: |
Gordon Ross | b6805bf | 2013-08-23 18:31:03 -0400 | [diff] [blame] | 156 | $(RM) $(LINTFILES) $(MODSRCS:.c=.ln) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 157 | |
| 158 | clean: |
mws | 1a7c1b7 | 2005-07-31 12:13:11 -0700 | [diff] [blame] | 159 | $(RM) $(MODOBJS) $(KMODOBJS) $(CLEANFILES) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 160 | |
| 161 | clobber: clean clean.lint |
mws | 1a7c1b7 | 2005-07-31 12:13:11 -0700 | [diff] [blame] | 162 | $(RM) $(MODFILE) $(KMODFILE) $(CLOBBERFILES) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 163 | |
| 164 | lint: $$(LINTFILES) |
| 165 | |
| 166 | .NO_PARALLEL: |
| 167 | .PARALLEL: $(MODOBJS) $(KMODOBJS) mdb_tgt kmdb_tgt dmod kmod \ |
| 168 | $(TARGETS) $(LINTFILES) |
| 169 | |
rie | 67e3a03 | 2008-05-02 15:01:06 -0700 | [diff] [blame] | 170 | $(MODFILE): dmod .WAIT $(MODOBJS) $$(MAPFILE-EXT) |
| 171 | $(LINK.c) $(ZDEFS) $(ZIGNORE) $(MAPFILE-EXT:%=-M%) $(GSHARED) \ |
| 172 | $(MODOBJS) -o $@ $(LDLIBS) -lc |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 173 | $(CTFMERGE) -L VERSION -o $@ $(MODOBJS) |
| 174 | $(POST_PROCESS_SO) |
| 175 | |
| 176 | # |
| 177 | # kmdb dmods must *not* stray from the module API. To ensure that they don't, |
| 178 | # we try to link them, at build time, against an object that exports the symbols |
| 179 | # that they can legally use. The link test object is, however, only built when |
| 180 | # kmdb itself is built. Requiring module developers to build kmdb first would |
| 181 | # be painful, so by default, module-level builds don't do the link test (the |
| 182 | # $(POUND_SIGN) assignment below takes care of that). Builds of the entire |
| 183 | # tree can, however, guarantee the construction of kmdb first, and as such can |
| 184 | # override the setting of $(KMDB_LINKTEST_ENABLE). This override causes the |
| 185 | # link test to be run. |
| 186 | # |
| 187 | # Developers wanting to force a link test for a single module can use the |
| 188 | # `linktest' target from within a module directory. |
| 189 | # |
| 190 | LINKTESTOBJ = $(KMDBDIR)/kmdb_modlinktest.o |
| 191 | |
| 192 | KMDB_LINKTEST = \ |
eschrock | dc0093f | 2006-03-03 22:38:03 -0800 | [diff] [blame] | 193 | $(LD) $(ZDEFS) -dy -r -o $@.linktest $(KMODOBJS) \ |
| 194 | $(STANDOBJS) $(LINKTESTOBJ) && \ |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 195 | $(RM) $@.linktest |
| 196 | |
| 197 | KMDB_LINKTEST_ENABLE=$(POUND_SIGN) |
| 198 | $(KMDB_LINKTEST_ENABLE)KMDB_LINKTEST_CMD = $(KMDB_LINKTEST) |
| 199 | |
| 200 | # |
| 201 | # Ensure that dmods don't use floating point |
| 202 | # |
| 203 | KMDB_FPTEST_CMD = $(KMDB_FPTEST) |
| 204 | |
| 205 | $(KMODFILE): kmod .WAIT $(KMODOBJS) $(MAPFILE) |
eschrock | dc0093f | 2006-03-03 22:38:03 -0800 | [diff] [blame] | 206 | $(LD) -dy -r $(MAPFILE:%=-M%) -Nmisc/kmdbmod -o $@ $(KMODOBJS) \ |
| 207 | $(STANDOBJS) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 208 | $(KMDB_LINKTEST_CMD) |
| 209 | $(KMDB_FPTEST_CMD) |
johnlev | 5ae68c6 | 2006-01-29 11:09:20 -0800 | [diff] [blame] | 210 | $(CTFMERGE) -f -L VERSION -o $@ $(KMODOBJS) |
Richard Lowe | 6ddb337 | 2015-02-19 02:30:34 +0000 | [diff] [blame] | 211 | $(POST_PROCESS) |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 212 | $(SETDYNFLAG) -f DF_1_NOKSYMS $@ |
| 213 | |
| 214 | linktest: linktest_check .WAIT kmod .WAIT $(KMODOBJS) |
| 215 | $(KMDB_LINKTEST) |
| 216 | |
| 217 | linktest_check: |
eschrock | dc0093f | 2006-03-03 22:38:03 -0800 | [diff] [blame] | 218 | @if [ "$(MDBTGT)" != "kvm" ] ; then \ |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 219 | echo "ERROR: linktest is not supported non-kvm/disasm dmods" \ |
| 220 | >&2 ; \ |
| 221 | exit 1 ; \ |
| 222 | fi |
| 223 | |
| 224 | # |
| 225 | # Dynamic rules for object construction |
| 226 | # |
| 227 | dmod/%.o kmod/%.o: %.c |
| 228 | $(COMPILE.c) -o $@ $< |
| 229 | $(CTFCONVERT_O) |
| 230 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 231 | dmod/%.o kmod%.o: %.s |
| 232 | $(COMPILE.s) -o $@ $< |
| 233 | $(CTFCONVERT_O) |
| 234 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 235 | dmod/%.o kmod/%.o: ../%.c |
| 236 | $(COMPILE.c) -o $@ $< |
| 237 | $(CTFCONVERT_O) |
| 238 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 239 | dmod/%.o kmod%.o: ../%.s |
| 240 | $(COMPILE.s) -o $@ $< |
| 241 | $(CTFCONVERT_O) |
| 242 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 243 | dmod/%.o kmod/%.o: ../../../common/modules/$(MODNAME)/%.c |
| 244 | $(COMPILE.c) -o $@ $< |
| 245 | $(CTFCONVERT_O) |
| 246 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 247 | dmod/%.o kmod%.o: ../../../common/modules/$(MODNAME)/%.s |
| 248 | $(COMPILE.s) -o $@ $< |
| 249 | $(CTFCONVERT_O) |
| 250 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 251 | dmod/%.o kmod/%.o: $$(MODSRCS_DIR)/%.c |
| 252 | $(COMPILE.c) -o $@ $< |
| 253 | $(CTFCONVERT_O) |
| 254 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 255 | dmod/%.o kmod%.o: $$(MODSRCS_DIR)/%.s |
| 256 | $(COMPILE.s) -o $@ $< |
| 257 | $(CTFCONVERT_O) |
| 258 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 259 | # |
| 260 | # Lint |
| 261 | # |
| 262 | dmod/%.ln kmod/%.ln: %.c |
| 263 | $(LINT.c) -dirout=$(@D) -c $< |
| 264 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 265 | dmod/%.ln kmod/%.ln: %.s |
| 266 | $(LINT.s) -dirout=$(@D) -c $< |
| 267 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 268 | dmod/%.ln kmod/%.ln: ../%.c |
| 269 | $(LINT.c) -dirout=$(@D) -c $< |
| 270 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 271 | dmod/%.ln kmod/%.ln: ../%.s |
| 272 | $(LINT.s) -dirout=$(@D) -c $< |
| 273 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 274 | dmod/%.ln kmod/%.ln: ../../../common/modules/$(MODNAME)/%.c |
| 275 | $(LINT.c) -dirout=$(@D) -c $< |
| 276 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 277 | dmod/%.ln kmod/%.ln: ../../../common/modules/$(MODNAME)/%.s |
| 278 | $(LINT.s) -dirout=$(@D) -c $< |
| 279 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 280 | dmod/%.ln kmod/%.ln: $$(MODSRCS_DIR)/%.c |
| 281 | $(LINT.c) -dirout=$(@D) -c $< |
| 282 | |
Robert Mustacchi | 799823b | 2015-04-30 11:14:10 -0700 | [diff] [blame] | 283 | dmod/%.ln kmod/%.ln: $$(MODSRCS_DIR)/%.s |
| 284 | $(LINT.s) -dirout=$(@D) -c $< |
| 285 | |
stevel@tonic-gate | 7c478bd | 2005-06-14 00:00:00 -0700 | [diff] [blame] | 286 | # |
| 287 | # Installation targets |
| 288 | # |
| 289 | |
| 290 | $(ROOT)/usr/lib/mdb/$(MDBTGT): $(ROOT)/usr/lib/mdb |
| 291 | $(INS.dir) |
| 292 | |
| 293 | $(ROOT)/usr/lib/mdb: |
| 294 | $(INS.dir) |
| 295 | |
| 296 | $(ROOT)/kernel/kmdb: |
| 297 | $(INS.dir) |
| 298 | |
| 299 | $(ROOTMOD)/$(MODULE): $(ROOTMOD) |
| 300 | |
| 301 | $(ROOTKMOD)/$(KMODULE): $(ROOTKMOD) |
| 302 | |
| 303 | kmod dmod: |
| 304 | -@mkdir -p $@ |