summaryrefslogtreecommitdiff
path: root/Makefile
blob: 0d0b589fb9691b51a9ee9f7605f2791b46dd005e (plain)
  1. # Optional file to set variables also possible to pass in environment:
  2. # * http_proxy - proxy URL (for APT), e.g. http://example.net:9999/
  3. # * apt_cacher_host - apt-cacher host (for all downloads), e.g. example.net
  4. # * approx_host - approx host (for all downloads), e.g. example.net
  5. # * noscreen - set to "true" to use default (serial) instead of HDMI+USB
  6. # * noquiet - set to "true" to not quiet down default boot messages
  7. # * nogfx - set to "true" to minimize video buffers
  8. # * bootargs - set custom bootargs, e.g. BOOT_DEBUG=5 log_host=example.org preseed/interactive=true
  9. # * fakeroot - command used for faked root (set empty to not fake root)
  10. # * sudo - command used for real root (leave empty to not switch to root)
  11. # * eatmydata - avoid fsync (set empty to not use)
  12. -include local.mk
  13. suites stretch buster sid
  14. archs armhf
  15. devicetypes-armhf lime lime2 micro
  16. nodes := $(patsubst nodes/%.yml,%,$(wildcard nodes/*.yml))
  17. profiles-di = $(foreach suite,$(suites),\
  18.  $(patsubst %,content/%-$(suite)/preseed.cfg,$(subst -,/,$(nodes))))
  19. profiles-script = $(patsubst %/preseed.cfg,%/script.sh,$(profiles-di))
  20. profiles = $(profiles-di) $(profiles-script)
  21. mdfiles content/MD5SUMS
  22. shafiles = $(patsubst %,content/SHA%SUMS,1 256 512)
  23. checksumfiles = $(mdfiles) $(shafiles)
  24. signfiles = $(patsubst %,%.sig,$(checksumfiles))
  25. info content/NEWS content/TODO
  26. info += content/index.html content/style.css
  27. title := $(shell grep -Pom1 '^\# \K.*[^\# ]+' README)
  28. #installsuite-stretch = $(if $(foobar),buster))
  29. #installsuite-stretch-reason = $(if $(foobar),foobar broken with stretch))
  30. # * d-i releases require an archive with same-ABI kernel.
  31. # * d-i rejects non-stable snapshot older than 1 month: bug#771699
  32. #time-stretch-reason = bug\#771699
  33. #snapshot-buster-di = 20170127
  34. #snapshot-buster-kernel = 4.9.0-1
  35. # if no newer snapshot available for sid, reuse stretch hints
  36. #time-sid-reason = $(time-buster-reason)
  37. snapshot-sid-di = $(snapshot-buster-di)
  38. snapshot-sid-kernel = $(snapshot-buster-kernel)
  39. #snapshot-sid-archive = $(snapshot-buster-archive)
  40. #snapshot-sid-reason = $(snapshot-buster-reason)
  41. #time-sid = $(time-buster)
  42. this-partdir imageparts/$(or $(installsuite-$(1):%=$(1)-%),$(1))
  43. this-vendordir = $(foreach suite-di,$(or $(installsuite-$(1)),$(1)),$(strip \
  44.  vendor/$(or $(snapshot-$(suite-di)-di:%=$(suite-di)-%),$(suite-di))))
  45. this-snapshot = $(snapshot-$(or $(installsuite-$(1)),$(1))-archive)
  46. this-snapshot-kernel = $(snapshot-$(or $(installsuite-$(1)),$(1))-kernel)
  47. this-snapshot-reason = $(snapshot-$(or $(installsuite-$(1)),$(1))-reason)
  48. proxy = $(or $(http_proxy),$(apt_cacher_host:%=http://%:3142/),$(approx_host:%=http://%:9999/))
  49. this-repo = $(or $(http_proxy:%/=%),$(apt_cacher_host:%=http://%:3142/$(1)),$(approx_host:%=http://%:9999),http://$(1))$(2)
  50. this-installsuite-warn \
  51.  WARNING:Installer $(installsuite-$(1)) used for target $(1)$(if $(installsuite-$(1)-reason),\
  52.  ($(installsuite-$(1)-reason))).\n
  53. this-snapshot-warn \
  54.  WARNINGInstall uses snapshot archive$(if $(call this-snapshot-reason,$(1)),\
  55.  ($(call this-snapshot-reason,$(1)))).\n$(if $(time-$(1)),\
  56.  !!! Time will be set back during install$(if $(time-$1)-reason,\
  57.  ($(time-$(1)-reason))).\n)\
  58.  !!! At first boot of new systemedit /etc/apt/sources.list e.g. to this:\n\
  59.  $()  deb http://httpredir.debian.org/debian/ $(1main\n\
  60.  $()  deb http://httpredir.debian.org/debian/ $(1)-updates main\n\
  61.  $()  deb http://security.debian.org/ $(1main\n
  62. this-warnings \
  63.  $(if $(installsuite-$(1)),\
  64.  printf "\n$(call this-installsuite-warn,$(1))";)\
  65.  $(if $(call this-snapshot,$(1)),\
  66.  printf "\n$(call this-snapshot-warn,$(1))")
  67. di-firmware-armhf-lime A20-OLinuXino-Lime
  68. di-firmware-armhf-lime2 A20-OLinuXino-Lime2
  69. di-firmware-armhf-micro A20-OLinuXino-MICRO
  70. spl-armhf-lime A20-OLinuXino-Lime/u-boot-sunxi-with-spl.bin
  71. spl-armhf-lime2 A20-OLinuXino-Lime2/u-boot-sunxi-with-spl.bin
  72. spl-armhf-micro A20-OLinuXino_MICRO/u-boot-sunxi-with-spl.bin
  73. dtb-armhf-lime sun7i-a20-olinuxino-lime.dtb
  74. dtb-armhf-lime2 sun7i-a20-olinuxino-lime2.dtb
  75. dtb-armhf-micro sun7i-a20-olinuxino-micro.dtb
  76. scr-armhf bootscr.sunxi
  77. vendor-files = $(foreach suite,$(suites),\
  78.  $(foreach arch,$(archs),\
  79.  $(foreach type,$(devicetypes-$(arch)),\
  80.  vendor/$(or $(snapshot-$(suite)-di:%=$(suite)-%),$(suite))/$(arch)/$(type))))
  81. images-di = $(foreach suite,$(suites),\
  82.  $(foreach arch,$(archs),\
  83.  $(foreach type,$(devicetypes-$(arch)),\
  84.  $(foreach node,plain $(nodes),\
  85.  images/$(suite)/$(arch)/d-i/$(node)/$(type).img.gz))))
  86. this-kernelbuild = $(shell readlink $(1| grep -Po 'vmlinuz-\K.*')
  87. # erase block size of sdcard, in power-of-two megabytes
  88. segmentsize ?4
  89. # boot partition size, in power-of-two megabytes
  90. bootsize ?= $(shell echo $$(( \
  91.  200 / $(segmentsize\
  92.   \
  93.  * $(segmentsize) )) )
  94. # use video console (HDMI/VGA) by default (U-boot default is serial)
  95. console = $(strip $(if $(noscreen),\
  96.  ,\
  97.  tty1))
  98. # ensure custom bootargs are applied last
  99. bootargs := $(strip \
  100.  $(if $(nogfx),\
  101.   sunxi_ve_mem_reserve=\
  102.   sunxi_g2d_mem_reserve=\
  103.   sunxi_fb_mem_reserve=16 \
  104.  \
  105.  $(bootargs))
  106. SUPATH PATH=/usr/sbin:/sbin:$(PATH)
  107. # tool is either custom (even empty), in PATH, fallback in PATH, or missing
  108. this_tool = $(strip \
  109.  $(if $(filter-out undefined,$(origin $(1))),\
  110.   $($(1)),\
  111.   $(or \
  112.    $(if $(wildcard $(patsubst %,%/$(1),$(subst :, ,$(PATH)))),\
  113.     $(1)),\
  114.    $(if $(wildcard $(patsubst %,%/$(2),$(subst :, ,$(PATH)))),\
  115.     $(2)$(eval tools_fallback += $(1))),\
  116.    $(eval tools_missing += $(1)$(3:%=[%])))))
  117. GZIP := $(call this_tool,pigz,gzip)
  118. GUNZIP := $(call this_tool,unpigz,gunzip)
  119. FAKEROOT := $(call this_tool,fakeroot)
  120. SUDO := $(call this_tool,sudo)
  121. this-fakeroot = $(if $(FAKEROOT),$(call this-fakeroot-$(FAKEROOT),$(1)),$(SUDO))
  122. this-fakeroot-fakeroot fakeroot -i'$(1)' -s'$(1)'
  123. this-fakeroot-fakeroot-ng fakeroot-ng -p'$(1)'
  124. this-fakeroot-fakeroot-pseudo fakeroot-pseudo -i'$(1)' -s'$(1)'
  125. MOUNT_FAT := $(call this_tool,fusefat) -o rw+
  126. UMOUNT_FAT fusermount -u
  127. # TODO: avoid sudo when fuse2fs proven reliable
  128. MOUNT_EXT := $(if $(SUDO),$(SUDOmount,$(SUPATH) $(call this_tool,fuse2fs))
  129. UMOUNT_EXT = $(if $(SUDO),$(SUDOumount,fusermount -u)
  130. # options fetched from "bash -x flash-kernel" on Lime2 box.
  131. MKIMAGE := $(call this_tool,mkimage,,sunxi-tools) -A arm -O linux -T script -C none -'' -'' -'boot script'
  132. EATMYDATA := $(call this_tool,eatmydata)
  133. $(if $(tools_fallback),\
  134.  $(warning NOTICEHelper tools missing (replaced by alternative):\
  135.  $(tools_fallback)))
  136. $(if $(tools_missing),\
  137.  $(warning WARNINGHelper tools missing:\
  138.  $(tools_missing)))
  139. all: $(checksumfiles) $(images-di) $(info)
  140. sign: $(signfiles)
  141. # TODO: drop sid → buster workaround when fixed in boxer
  142. $(profiles-di): content/%/preseed.cfg\
  143.  $(wildcard nodes/*.ymlskel/preseed.cfg.in skel/script.sh.in
  144.     mkdir -$(dir $@)
  145.     cd $(dir $@\
  146.         && boxer compose \
  147.             --nodedir $(CURDIR)/nodes \
  148.             --skeldir $(CURDIR)/skel \
  149.             --suite $(patsubst sid,buster,$(lastword $(subst -, ,$*))) \
  150.             $(subst /,-,$(firstword $(subst -, ,$*)))
  151. $(profiles-script): content/%/script.shcontent/%/preseed.cfg
  152. $(mdfiles): content/MD%SUMS: $(profiles)
  153.     cd content && md$*sum $(profiles:content/%=%) > MD$*SUMS~
  154.     rm -$@.sig
  155.     mv -$@~ $@
  156. $(shafiles): content/SHA%SUMS: $(profiles)
  157.     cd content && sha$*sum $(profiles:content/%=%) > SHA$*SUMS~
  158.     rm -$@.sig
  159.     mv -$@~ $@
  160. $(signfiles): %.sig: % $(checksumfiles)
  161.     rm -$@
  162.     gpg --detach-sign --$$<
  163. $(info): content/% : %
  164.     mkdir -p content
  165.     cp -$< $@
  166. header.htm:
  167.     echo '# $(title)' | pandoc -f markdown -t html -$@
  168. index.htmlREADME header.htm style.css
  169.     tail -+$< | \
  170.         pandoc ---toc \
  171.             -"$(title)" \
  172.             -B header.htm \
  173.             -c style.css \
  174.             -f markdown -t html \
  175.             -$@
  176. style.cssstyle.scss
  177.     scss --compass --sourcemap=none --style compressed $< $@
  178. clean::
  179.     rm -rf content
  180. define SUITE_ARCH_TYPE_NODE_template =
  181. # Prepend firmware to (plain/preseed installer/bootstrapped) partition
  182. images/$(1)/$(2)/d-i/$(4)/$(3).img.gz\
  183.  $(call this-vendordir,$(1))/$(2)/firmware.$(di-firmware-$(2)-$(3)).img.gz \
  184.  $(call this-partdir,$(1))/$(2)/$(4)/partition.img.gz
  185.     mkdir -$$(dir $$@)
  186.     zcat $$^ | $(GZIP) --rsyncable > $$@~
  187.     mv -$$@~ $$@
  188.     @$(call this-warnings,$(1))
  189. images/$(1)/$(2)/local/$(4)/$(3).img.gz\
  190.  $(call this-partdir,$(1))/$(2)/$(4)/local/firmware.$(3).img \
  191.  partition/$(1)/$(2)/$(4)/$(3)/boot.img \
  192.  partition/$(1)/$(2)/$(4)/rootfs.img
  193.     mkdir -$$(dir $$@)
  194.     cat $$^ | $(GZIP) --rsyncable > $$@~
  195.     mv -$$@~ $$@
  196.     @$(call this-warnings,$(1))
  197. # Compose firmware from bootstrapped system
  198. $(call this-partdir,$(1))/$(2)/$(4)/d-i/firmware.$(3).img\
  199.  partition/$(1)/$(2)/$(4)/rootfs
  200.     mkdir -$$(dir $$@)
  201.     dd if=/dev/zero of=$$@~ bs=1M count=seek=39
  202.     $(SUPATHparted -$$@~ -- \
  203.         mklabel msdos \
  204.         mkpart primary fat32 1MiB 100\
  205.         toggle boot
  206.     truncate -8$$@~
  207.     cat $$</usr/lib/u-boot/$(spl-$(2)-$(3)) >> $$@~
  208.     truncate -1$$@~
  209.     mv -$$@~ $$@
  210. # Boot partition
  211. # TODO: extract boot.cmd variables from rootfs
  212. partition/$(1)/$(2)/$(4)/$(3)/boot.img\
  213.  partition/$(1)/$(2)/$(4)/rootfs \
  214.  partition/$(1)/$(2)/$(4)/$(3)/boot.cmd
  215.     $$(eval kernelbuild = $$(call this-kernelbuild,$$</vmlinuz))
  216.     mkdir -$$(dir $$@)
  217.     $(SUPATHmkfs.ext2 $$@~ $(bootsize)M
  218.     mkdir -$$@.mnt
  219.     $(MOUNT_EXT) $$@~ $$@.mnt
  220.     $(or $(SUDO),$(call this-fakeroot,partition/$(1)/$(2)/$(4)/rootfs.state)) \
  221.         chown root: $$@.mnt
  222.     $(or $(SUDO),$(call this-fakeroot,partition/$(1)/$(2)/$(4)/rootfs.state)) \
  223.         install -D \
  224.             -$$@.mnt \
  225.             $$</boot/*-$$(kernelbuild)
  226.     $(or $(SUDO),$(call this-fakeroot,partition/$(1)/$(2)/$(4)/rootfs.state)) \
  227.         install -D \
  228.             -$$@.mnt/dtbs/$$(kernelbuild\
  229.             $$</usr/lib/linux-image-$$(kernelbuild)/$(dtb-$(2)-$(3))
  230.     $(MKIMAGE) -d partition/$(1)/$(2)/$(4)/$(3)/boot.cmd $$(dir $$@)/boot.scr
  231.     $(or $(SUDO),$(call this-fakeroot,partition/$(1)/$(2)/$(4)/rootfs.state)) \
  232.         cp $$(dir $$@)/boot.scr $$@.mnt/boot.scr
  233.     $(UMOUNT_EXT"$$@.mnt"
  234.     mv -$$@~ $$@
  235. partition/$(1)/$(2)/$(4)/$(3)/boot.cmd\
  236.  partition/$(1)/$(2)/$(4)/rootfs \
  237.  partition/$(1)/$(2)/$(4)/rootfs.img.uuid
  238.     $$(eval kernelbuild = $$(call this-kernelbuild,$$</vmlinuz))
  239.     mkdir -$$(dir $$@)
  240.     perl -0777 -p \
  241.         $(if $(console),\
  242.             -'s/^(?=[^#])/setenv console $(console)\n/m;'\
  243.         -"s'@@LINUX_KERNEL_CMDLINE_DEFAULTS@@''g;" \
  244.         -"s'@@LINUX_KERNEL_CMDLINE@@'$(strip $(if $(noquiet),,quiet) $(bootargs))'g;" \
  245.         -"s'@@UBOOT_ENV_EXTRA@@''g;" \
  246.         -"s'@@KERNEL_VERSION@@'$$(kernelbuild)'g;" \
  247.         < $$</etc/flash-kernel/bootscript/$(scr-$(2)) \
  248.         > $$@~
  249.     sed -'2asetenv bootargs root=/dev/disk/by-uuid/'"$$$$(cat partition/$(1)/$(2)/$(4)/rootfs.img.uuid)" $$@~
  250.     mv -$$@~ $$@
  251. $(call this-partdir,$(1))/$(2)/$(4)/local/firmware.$(3).img\
  252.  partition/$(1)/$(2)/$(4)/rootfs \
  253.  partition/$(1)/$(2)/$(4)/rootfs.size
  254.     mkdir -$$(dir $$@)
  255.     dd if=/dev/zero of=$$@~ \
  256.         bs=1M \
  257.         count=\
  258.         seek=$$$$(( \
  259.             $(segmentsize\
  260.             + $(bootsize\
  261.             + $$$$(cat partition/$(1)/$(2)/$(4)/rootfs.size\
  262.                 1024 1024 ))
  263.     $(SUPATHparted -$$@~ -- \
  264.         mklabel msdos \
  265.         mkpart primary ext2 \
  266.             $(segmentsize)MiB \
  267.             $$$$(( ( \
  268.                 $(segmentsize) + $(bootsize) ) * 1024 1024 \
  269.                 ))B \
  270.         toggle boot \
  271.         mkpart primary ext2 \
  272.             $$$$(( ( $(segmentsize) + $(bootsize) ) * 1024 1024 \
  273.                 ))B \
  274.             100%
  275.     truncate -8$$@~
  276.     cat $$</usr/lib/u-boot/$(spl-$(2)-$(3)) >> $$@~
  277.     truncate -4$$@~
  278.     mv -$$@~ $$@
  279.     touch $$@
  280. endef
  281. $(foreach suite,$(suites),\
  282.  $(foreach arch,$(archs),\
  283.  $(foreach type,$(devicetypes-$(arch)),\
  284.  $(foreach node,plain $(nodes),\
  285.  $(eval $(call SUITE_ARCH_TYPE_NODE_template,$(suite),$(arch),$(type),$(node)))))))
  286. define SUITE_ARCH_NODE_template =
  287. ifneq ($(3),plain)
  288. # Add preseed file to ramdisk in installer partition
  289. $(call this-partdir,$(1))/$(2)/$(3)/partition.img.gz\
  290.  $(call this-partdir,$(1))/$(2)/plain/partition.img.gz \
  291.  content/$(3)-$(1)/preseed.cfg
  292.     mkdir -$$(dir $$@)
  293.     cp -$$< $$@
  294.     $(GUNZIP) -$$@
  295.     mkdir -$$(dir $$@)/ramdisk
  296.     $(MOUNT_FAT) $$(patsubst %.gz,%,$$@) $$(dir $$@)/ramdisk
  297.     cp -$$(dir $$@)/ramdisk/initrd.gz $$(dir $$@)
  298.     $(GUNZIP) -$$(dir $$@)/initrd.gz
  299.     cp -f content/$(3)-$(1)/preseed.cfg $$(dir $$@)
  300.     cd $$(dir $$@) && echo preseed.cfg | cpio --format=newc -oAO initrd
  301.     $(GZIP) -$$(dir $$@)/initrd
  302.     rm -$$(dir $$@)/ramdisk/INITRD.GZ
  303.     cp $$(dir $$@)/initrd.gz $$(dir $$@)/ramdisk/INITRD.GZ
  304.     $(UMOUNT_FAT) $$(dir $$@)/ramdisk
  305.     $(GZIP) -$$(patsubst %.gz,%,$$@)
  306. endif
  307. # Copy preseed file, and strip templating parts if from skeleton
  308. partition/$(1)/$(2)/$(3)/rootfs.preseed.cfg\
  309.  $(if $(filter plain,$(3)),skel/preseed.cfg.in,content/$(3)-$(1)/preseed.cfg)
  310.     mkdir -"$$(dir $$@)"
  311.     cp -$$< $$@
  312.     $(if $(filter plain,$(3)),\
  313.         perl --0777 -p \
  314.             -'s!\[\%(?:[^\n]+\n)+!!g' \
  315.             $$@)
  316. # Configure multistrap
  317. # TODO: install libfakeroot only on alien arch
  318. # TODO: Stop uncomment hooks when faketime supports chroot: bug#778462
  319. partition/$(1)/$(2)/$(3)/rootfs.multistrap.conf\
  320.  partition/$(1)/$(2)/$(3)/rootfs.preseed.cfg \
  321.  skel/multistrap.conf.in
  322.     $$(eval packages = $$(strip \
  323.         $(if $(FAKEROOT),libfakeroot\
  324.         $(if $(EATMYDATA),libeatmydata1\
  325.         $(if $(time-$(1)),libfaketime\
  326.         $$(shell perl -0777 -n \
  327.             -'s/ \\\n / /;' \
  328.             -'print m,^d-i pkgsel/include string ([^\n]*),m;' \
  329.             < $$<)))
  330.     $(if $(call this-snapshot,$(1)),\
  331.         $$(eval source = $(call this-repo,snapshot.debian.org,/archive/debian/$(call this-snapshot,$(1)))),
  332.         $$(eval source = $(call this-repo,httpredir.debian.org,/debian)))
  333.     perl -p \
  334.         -'s!\@suite\@!$(1)!;' \
  335.         -'s!\@arch\@!$(2)!;' \
  336.         -'s!\@libdir\@!skel!;' \
  337.         -'s!\@preseed\@!$$<!;' \
  338.         -'s!\@packages\@!$$(packages)!;' \
  339.         -'s!\@source\@!$$(source)!;' \
  340.         $(if $(time-$(1)),\
  341.             ,\
  342.             -'s!^hookdir=!#hookdir=!g;'\
  343.         skel/multistrap.conf.in \
  344.         > $$@
  345. # Bootstrap system
  346. # TODO: Stop manually run hooks when faketime supports chroot: bug#778462
  347. partition/$(1)/$(2)/$(3)/rootfs.img.uuid\
  348.  partition/$(1)/$(2)/$(3)/rootfs.img
  349.     $(SUPATHblkid $$< | grep -Po 'UUID="\K[^"]+' > $$@~
  350.     mv -$$@~ $$@
  351. partition/$(1)/$(2)/$(3)/rootfs.img\
  352.  partition/$(1)/$(2)/$(3)/rootfs \
  353.  partition/$(1)/$(2)/$(3)/rootfs.size
  354.     $(SUPATHmkfs.ext4 $$@~ \
  355.         $$$$(( $$$$(cat "$$<.size") / 1024 ))k
  356.     mkdir -$$@.mnt
  357.     $(MOUNT_EXT) $$@~ $$@.mnt
  358.     $(or $(SUDO),$(call this-fakeroot,$$<.state)) \
  359.         rsync -aHS --numeric-ids --info=progress2 \
  360.             $(and $(SUDO),$(FAKEROOT),\
  361.                 -"$(call this-fakeroot,$$<.state)"\
  362.             --exclude '/boot' \
  363.             --exclude '/var/cache/apt/archives/*.deb' \
  364.             --exclude multistrap-configure.sh \
  365.             --exclude tmp/preseeds \
  366.             $$</ $$@.mnt/
  367.     $(UMOUNT_EXT"$$@.mnt"
  368.     mv -$$@~ $$@
  369.     touch $$@
  370. # Guestimate image size from size of contents
  371. # * added 10% - 5 as reserved by ext4, and 5 for inaccuracy
  372. partition/$(1)/$(2)/$(3)/rootfs.size\
  373.  partition/$(1)/$(2)/$(3)/rootfs
  374.     echo \
  375.         $$$$(( \
  376.             \
  377.                 $$$$( \
  378.                     $(call this-fakeroot,$$<.state\
  379.                         du -"$$<" \
  380.                             | cut -\
  381.                 1024 \
  382.                 100 110 \
  383.                 / $(segmentsize) + \
  384.             * $(segmentsize) * 1024 1024 )) \
  385.         > $$@~
  386.     mv -$$@~ $$@
  387. partition/$(1)/$(2)/$(3)/rootfs\
  388.  partition/$(1)/$(2)/$(3)/rootfs.multistrap.conf
  389.     $(SUPATH) $(call this-fakeroot,$$@.state\
  390.         $(EATMYDATA\
  391.         $(if $(time-$(1)),\
  392.             faketime $(time-$(1))) \
  393.         multistrap \
  394.             -$$< \
  395.             -"$$@"
  396.     $(if $(time-$(1)),\
  397.         ,\
  398.         $(call this-fakeroot,$$@.state\
  399.             $(EATMYDATA\
  400.             run-parts \
  401.                 --regex '^completion' \
  402.                 --arg "$$@" \
  403.                 skel/multistrap-hooks)
  404. # TODO: why doesn't this work?!?
  405. #partition/$(1)/$(2)/$(3)/rootfs/%: \
  406. # partition/$(1)/$(2)/$(3)/rootfs
  407. endef
  408. $(foreach suite,$(suites),\
  409.  $(foreach arch,$(archs),\
  410.  $(foreach node,plain $(nodes),\
  411.  $(eval $(call SUITE_ARCH_NODE_template,$(suite),$(arch),$(node))))))
  412. define SUITE_ARCH_template =
  413. # Adjust options in binary U-boot file boot.scr in ramdisk in partition:
  414. # * Overwrite whole disk by default
  415. # * if needed by installer, then
  416. #   * hardcode use of snapshot archive
  417. #   * avoid updates or security archives (unsupported with snapshot)
  418. #   * if needed, set back time and suppress use of network time
  419. #   else use httpredir.d.o by default
  420. # * if variable "http_proxy", "apt_cacher_host" or "approx_host" is set,
  421. #   hardcode http proxy
  422. # * if non-default d-i suite in use, hardcode target suite
  423. # * If U-boot uses HDMI+USB, have Linux not replace framebuffer driver
  424. # * if variable "botargs" is set, append its content to bootargs
  425. $(call this-partdir,$(1))/$(2)/plain/partition.img.gz\
  426.  $(call this-vendordir,$(1))/$(2)/partition.img.gz
  427.     $$(eval bootargs := $$(strip \
  428.         $(if $(console),\
  429.             fb=false\
  430.         partman-auto/method?=regular \
  431.         $$(if $$(call this-snapshot,$(1)),\
  432.             mirror/country=manual \
  433.             mirror/http/hostname=$(or $(apt_cacher_host:%=%:3142),$(approx_host:%=%:9999),snapshot.debian.org\
  434.             mirror/http/directory=$(apt_cacher_host:%=/snapshot.debian.org)/archive/debian/$$(call this-snapshot,$(1)) \
  435.             apt-setup/services-select\
  436.             $$(if $$(time-$(1)),\
  437.                 preseed/early_command=\\"date -s $$(time-$(1))\\" \
  438.                 clock-setup/ntp=false\
  439.         ,\
  440.             mirror/country?=manual \
  441.             mirror/http/hostname?=httpredir.debian.org \
  442.             mirror/http/directory?=/debian \
  443.         \
  444.         $(if $(proxy),\
  445.             mirror/http/proxy=$(proxy)) \
  446.         $$(if $$(installsuite-$(1)),\
  447.             mirror/suite=$(1)) \
  448.         $(bootargs)))
  449.     mkdir -$$(dir $$@)
  450.     cp -$$< $$@
  451.     $(GUNZIP) -$$@
  452.     mkdir -$$(dir $$@)/ramdisk
  453.     $(MOUNT_FAT) $$(patsubst %.gz,%,$$@) $$(dir $$@)/ramdisk
  454.     perl -0777 -p \
  455.         -'s/^.*(?=#\s*Bootscript)//s;' \
  456.         $(if $(console),\
  457.             -'s/^(?=[^#])/setenv console $(console)/m;'\
  458.         -'s'\''^setenv bootargs \K'\''$$(bootargs)'\'';' \
  459.         < $$(dir $$@)/ramdisk/boot.scr \
  460.         > $$(dir $$@)/boot.cmd
  461.     $(MKIMAGE) -$$(dir $$@)/boot.cmd $$(dir $$@)/boot.scr
  462.     rm -$$(dir $$@)/ramdisk/BOOT.SCR
  463.     cp $$(dir $$@)/boot.scr $$(dir $$@)/ramdisk/BOOT.SCR
  464.     $(UMOUNT_FAT) $$(dir $$@)/ramdisk
  465.     $(GZIP) -$$(patsubst %.gz,%,$$@)
  466. # Fetch pristine parts
  467. vendor/$(or $(snapshot-$(1)-di:%=$(1)-%),$(1))/$(2)/%:
  468.     mkdir -$$(dir $$@)
  469.     curl $(proxy:%=-%) -fsSRo '$$@' \
  470.         'http://ftp.de.debian.org/debian/dists/$(1)/main/installer-$(2)/$(or $(snapshot-$(1)-di),current)/images/netboot/SD-card-images/$$(notdir $$@)'
  471. endef
  472. $(foreach suite,$(suites),\
  473.  $(foreach arch,$(archs),\
  474.  $(eval $(call SUITE_ARCH_template,$(suite),$(arch)))))
  475. #%.img.gz: %.img
  476. #   $(GZIP) -c --rsyncable $< > $@~
  477. #   mv -f $@~ $@
  478. clean::
  479.     $(SUDOrm -rf --one-file-system images imageparts partition
  480.     rm -*.htm *.html *.css
  481. distcleanclean
  482.     rm -rf vendor
  483. .PHONYall sign clean distclean
  484. .PRECIOUS: $(vendor-files)