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