1 # 2 # Copyright (c) 2013, Joyent, Inc. All rights reserved. 3 # 4 5 ROOT = $(PWD) 6 PROTO = $(ROOT)/proto 7 STRAP_PROTO = $(ROOT)/proto.strap 8 MPROTO = $(ROOT)/manifest.d 9 BOOT_MPROTO = $(ROOT)/boot.manifest.d 10 BOOT_PROTO = $(ROOT)/proto.boot 11 12 # On Darwin/OS X we support running 'make check' 13 ifeq ($(shell uname -s),Darwin) 14 PATH = /bin:/usr/bin:/usr/sbin:/sbin:/opt/local/bin 15 else 16 PATH = /usr/bin:/usr/sbin:/sbin:/opt/local/bin 17 endif 18 19 LOCAL_SUBDIRS := $(shell ls projects/local) 20 OVERLAYS := $(shell cat overlay/order) 21 PKGSRC = $(ROOT)/pkgsrc 22 MANIFEST = manifest.gen 23 BOOT_MANIFEST = boot.manifest.gen 24 JSSTYLE = $(ROOT)/tools/jsstyle/jsstyle 25 JSLINT = $(ROOT)/tools/javascriptlint/build/install/jsl 26 CSTYLE = $(ROOT)/tools/cstyle 27 28 ADJUNCT_TARBALL := $(shell ls `pwd`/illumos-adjunct*.tgz 2>/dev/null \ 29 | tail -n1 && echo $?) 30 31 STAMPFILE := $(ROOT)/proto/buildstamp 32 33 WORLD_MANIFESTS := \ 34 $(MPROTO)/illumos.manifest \ 35 $(MPROTO)/live.manifest \ 36 $(MPROTO)/illumos-extra.manifest 37 38 BOOT_MANIFESTS := \ 39 $(BOOT_MPROTO)/illumos.manifest 40 41 SUBDIR_MANIFESTS := $(LOCAL_SUBDIRS:%=$(MPROTO)/%.sd.manifest) 42 OVERLAY_MANIFESTS := $(OVERLAYS:$(ROOT)/overlay/%=$(MPROTO)/%.ov.manifest) 43 44 BOOT_VERSION := boot-$(shell [[ -f $(ROOT)/configure-buildver ]] && \ 45 echo $$(head -n1 $(ROOT)/configure-buildver)-)$(shell head -n1 $(STAMPFILE)) 46 BOOT_TARBALL := output/$(BOOT_VERSION).tgz 47 48 world: 0-extra-stamp 0-illumos-stamp 1-extra-stamp 0-livesrc-stamp \ 49 0-local-stamp 0-tools-stamp 0-man-stamp 0-devpro-stamp 50 51 live: world manifest boot 52 @echo $(OVERLAY_MANIFESTS) 53 @echo $(SUBDIR_MANIFESTS) 54 mkdir -p ${ROOT}/log 55 (cd $(ROOT) && \ 56 pfexec ./tools/build_live $(ROOT)/$(MANIFEST) $(ROOT)/output \ 57 $(OVERLAYS) $(ROOT)/proto $(ROOT)/man/man) 58 59 boot: $(BOOT_TARBALL) 60 61 .PHONY: pkgsrc 62 pkgsrc: 63 cd $(PKGSRC) && gmake install 64 65 $(BOOT_TARBALL): world manifest 66 pfexec rm -rf $(BOOT_PROTO) 67 mkdir -p $(BOOT_PROTO) 68 mkdir -p $(ROOT)/output 69 pfexec ./tools/builder/builder $(ROOT)/$(BOOT_MANIFEST) \ 70 $(BOOT_PROTO) $(ROOT)/proto 71 (cd $(BOOT_PROTO) && pfexec gtar czf $(ROOT)/$@ .) 72 73 # 74 # Manifest construction. There are 5 sources for manifests we need to collect 75 # in $(MPROTO) before running the manifest tool. One each comes from 76 # illumos, illumos-extra, and the root of live (covering mainly what's in src). 77 # Additional manifests come from each of $(LOCAL_SUBDIRS), which may choose 78 # to construct them programmatically, and $(OVERLAYS), which must be static. 79 # These all end up in $(MPROTO), where we tell tools/build_manifest to look; 80 # it will pick up every file in that directory and treat it as a manifest. 81 # 82 # In addition, a separate manifest is generated in similar manner for the 83 # boot tarball. 84 # 85 # Look ma, no for loops in these shell fragments! 86 # 87 manifest: $(MANIFEST) $(BOOT_MANIFEST) 88 89 $(MPROTO) $(BOOT_MPROTO): 90 mkdir -p $@ 91 92 $(MPROTO)/live.manifest: src/manifest | $(MPROTO) 93 gmake DESTDIR=$(MPROTO) DESTNAME=live.manifest \ 94 -C src manifest 95 96 $(MPROTO)/illumos.manifest: projects/illumos/manifest | $(MPROTO) 97 cp projects/illumos/manifest $(MPROTO)/illumos.manifest 98 99 $(BOOT_MPROTO)/illumos.manifest: projects/illumos/manifest | $(BOOT_MPROTO) 100 cp projects/illumos/boot.manifest $(BOOT_MPROTO)/illumos.manifest 101 102 $(MPROTO)/illumos-extra.manifest: 1-extra-stamp | $(MPROTO) 103 gmake DESTDIR=$(MPROTO) DESTNAME=illumos-extra.manifest \ 104 -C projects/illumos-extra manifest; \ 105 106 .PHONY: $(MPROTO)/%.sd.manifest 107 $(MPROTO)/%.sd.manifest: 108 cd $(ROOT)/projects/local/$* && \ 109 if [[ -f Makefile.joyent ]]; then \ 110 gmake DESTDIR=$(MPROTO) DESTNAME=$*.sd.manifest \ 111 -f Makefile.joyent manifest; \ 112 else \ 113 gmake DESTDIR=$(MPROTO) DESTNAME=$*.sd.manifest \ 114 manifest; \ 115 fi 116 117 $(MPROTO)/%.ov.manifest: $(MPROTO) $(ROOT)/overlay/%/manifest 118 cp $(ROOT)/overlay/$*/manifest $@ 119 120 $(MANIFEST): $(WORLD_MANIFESTS) $(SUBDIR_MANIFESTS) $(OVERLAY_MANIFESTS) 121 -rm -f $@ 122 ./tools/build_manifest $(MPROTO) | ./tools/sorter > $@ 123 124 $(BOOT_MANIFEST): $(BOOT_MANIFESTS) 125 -rm -f $@ 126 ./tools/build_manifest $(BOOT_MPROTO) | ./tools/sorter > $@ 127 128 # 129 # Update source code from parent repositories. We do this for each local 130 # project as well as for illumos, illumos-extra, and illumos-live via the 131 # update_base tool. 132 # 133 update: update-base $(LOCAL_SUBDIRS:%=%.update) 134 -rm -f 0-local-stamp 135 136 .PHONY: update-base 137 update-base: 138 ./tools/update_base 139 140 .PHONY: %.update 141 %.update: 142 cd $(ROOT)/projects/local/$* && \ 143 if [[ -f Makefile.joyent ]]; then \ 144 gmake -f Makefile.joyent update; \ 145 else \ 146 gmake update; \ 147 fi 148 -rm -f 0-subdir-$*-stamp 149 150 0-local-stamp: $(LOCAL_SUBDIRS:%=0-subdir-%-stamp) 151 touch $@ 152 153 0-subdir-%-stamp: 154 cd "$(ROOT)/projects/local/$*" && \ 155 if [[ -f Makefile.joyent ]]; then \ 156 gmake -f Makefile.joyent DESTDIR=$(PROTO) world install; \ 157 else \ 158 gmake DESTDIR=$(PROTO) world install; \ 159 fi 160 touch $@ 161 162 0-devpro-stamp: 163 [ ! -d projects/devpro ] || \ 164 (cd projects/devpro && gmake DESTDIR=$(PROTO) install) 165 touch $@ 166 167 0-illumos-stamp: 0-extra-stamp 168 (cd $(ROOT) && ./tools/build_illumos) 169 touch $@ 170 171 0-extra-stamp: 172 (cd $(ROOT)/projects/illumos-extra && \ 173 gmake STRAP=strap DESTDIR=$(STRAP_PROTO) install_strap) 174 (cd $(STRAP_PROTO) && gtar xzf $(ADJUNCT_TARBALL)) 175 touch $@ 176 177 1-extra-stamp: 0-illumos-stamp 178 (cd $(ROOT)/projects/illumos-extra && \ 179 gmake DESTDIR=$(PROTO) install) 180 touch $@ 181 182 0-livesrc-stamp: src/bootparams.c 183 (cd $(ROOT)/src && \ 184 gmake DESTDIR=$(PROTO) && \ 185 gmake DESTDIR=$(PROTO) install) 186 touch $@ 187 188 0-man-stamp: 189 (cd $(ROOT)/man/src && gmake clean && gmake) 190 touch $@ 191 192 0-tools-stamp: 0-builder-stamp 0-pwgen-stamp tools/cryptpass 193 (cp ${ROOT}/tools/cryptpass $(PROTO)/usr/lib) 194 touch $@ 195 196 0-builder-stamp: 197 (cd $(ROOT)/tools/builder && gmake builder) 198 touch $@ 199 200 0-pwgen-stamp: 201 (cd ${ROOT}/tools/pwgen-* && autoconf && ./configure && \ 202 make && cp pwgen ${ROOT}/tools) 203 touch $@ 204 205 tools/cryptpass: tools/cryptpass.c 206 (cd ${ROOT}/tools && gcc -Wall -W -O2 -o cryptpass cryptpass.c) 207 208 jsl: $(JSLINT) 209 210 $(JSLINT): 211 @(cd $(ROOT)/tools/javascriptlint; make CC=gcc install) 212 213 check: $(JSLINT) 214 @(cd $(ROOT)/src && make check) 215 216 clean: 217 rm -f $(MANIFEST) 218 rm -rf $(ROOT)/$(MPROTO)/* 219 (cd $(ROOT)/src && gmake clean) 220 [ ! -d $(ROOT)/projects/illumos-extra ] || \ 221 (cd $(ROOT)/projects/illumos-extra && gmake clean) 222 [ ! -d projects/local ] || for dir in $(LOCAL_SUBDIRS); do \ 223 cd $(ROOT)/projects/local/$${dir} && \ 224 if [[ -f Makefile.joyent ]]; then \ 225 gmake -f Makefile.joyent clean; \ 226 else \ 227 gmake clean; \ 228 fi; \ 229 done 230 (cd $(PKGSRC) && gmake clean) 231 (cd $(ROOT) && rm -rf $(PROTO)) 232 (cd $(ROOT) && rm -rf $(STRAP_PROTO)) 233 (cd $(ROOT) && rm -rf $(BOOT_PROTO)) 234 (cd $(ROOT) && mkdir -p $(PROTO) $(STRAP_PROTO) $(BOOT_PROTO)) 235 rm -f 0-*-stamp 1-*-stamp 236 237 .PHONY: manifest check jsl