#TOP = $(dir $(lastword $(MAKEFILE_LIST))) TOP=$(PWD) INSTALL_PREFIX ?= $(TOP)/usr SRC ?= ./src ROOTFS_OVERLAYS ?= SQUASHFS_SRC_URL ?= http://downloads.sourceforge.net/project/squashfs/squashfs/squashfs4.3/squashfs4.3.tar.gz SQUASHFS_SRC ?= $(notdir $(SQUASHFS_SRC_URL)) SQUASHFS_DIR ?= $(basename $(basename $(SQUASHFS_SRC))) MKSQUASHFS_WHICH := $(shell which mksquashfs 2>/dev/null) MKSQUASHFS_COMPILED := $(TOP)/$(SQUASHFS_DIR)/squashfs-tools/mksquashfs MKSQUASHFS ?= $(if $(MKSQUASHFS_WHICH),$(MKSQUASHFS_WHICH),$(MKSQUASHFS_COMPILED)) QEMU_SRC_URL ?= http://wiki.qemu-project.org/download/qemu-2.5.0-rc2.tar.bz2 QEMU_SRC ?= $(notdir $(QEMU_SRC_URL)) QEMU_DIR ?= $(basename $(basename $(QEMU_SRC))) QEMU_MACHINE ?= vexpress-a9 QEMU_SYSTEM_ARM_WHICH := $(shell which qemu-system-arm 2>/dev/null) QEMU_SYSTEM_ARM_COMPILED := $(INSTALL_PREFIX)/bin/qemu-system-arm QEMU_SYSTEM_ARM ?= $(if $(QEMU_SYSTEM_ARM_WHICH),$(QEMU_SYSTEM_ARM_WHICH),$(QEMU_SYSTEM_ARM_COMPILED)) LINUX_SRC_URL ?= https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.2.3.tar.xz LINUX_SRC ?= linux-4.2.3.tar.xz LINUX_DIR ?= linux-4.2.3 LINUX_CONFIG ?= vexpress LINUX_DTB ?= vexpress-v2p-ca9 BOOTARGS ?= console=ttyAMA0 root=/dev/mmcblk0 $(BOOTARGS_APPEND) BUSYBOX_SRC_URL ?= http://www.busybox.net/downloads/busybox-1.24.1.tar.bz2 BUSYBOX_SRC ?= $(notdir $(BUSYBOX_SRC_URL)) BUSYBOX_DIR ?= $(basename $(basename $(BUSYBOX_SRC))) export CROSS_COMPILE ?= arm-linux-gnueabihf- export ARCH ?= arm default: runqemu info: @echo "Using mksquashfs: $(MKSQUASHFS)" @echo "Using qmeu-system-arm: $(QEMU_SYSTEM_ARM)" # # downloads # define DoDownload $(SRC)/$($(1)_SRC): mkdir -p $(SRC) wget -O$(SRC)/$($(1)_SRC) "$($(1)_SRC_URL)" endef $(foreach what, SQUASHFS QEMU LINUX BUSYBOX, $(eval $(call DoDownload,$(what)))) # # unpacking # define DoUnpack $($(1)_DIR)/.do_unpack: $(SRC)/$($(1)_SRC) tar xf $(SRC)/$($(1)_SRC) touch $$@ endef $(foreach what, SQUASHFS QEMU LINUX BUSYBOX, $(eval $(call DoUnpack,$(what)))) # # linux # $(LINUX_DIR)/.config: $(LINUX_DIR)/.do_unpack cd $(LINUX_DIR) && $(MAKE) $(LINUX_CONFIG)_defconfig # TODO sed -i \ -e 's/.*CONFIG_DEVTMPFS_MOUNT.*/CONFIG_DEVTMPFS_MOUNT=y/' \ -e 's/.*CONFIG_SMC911X.*/CONFIG_SMC911X=y/' \ -e 's/.*CONFIG_OVERLAY_FS.*/CONFIG_OVERLAY_FS=y/' \ $(LINUX_DIR)/.config $(LINUX_DIR)/.do_compile: $(LINUX_DIR)/.config cd $(LINUX_DIR) && $(MAKE) zImage dtbs touch $@ $(LINUX_DIR)/arch/$(ARCH)/boot/zImage: $(LINUX_DIR)/.do_compile zImage: $(LINUX_DIR)/arch/$(ARCH)/boot/zImage modules: $(LINUX_DIR).config cd $(LINUX_DIR) && $(MAKE) modules # # QEMU # $(QEMU_DIR)/.do_configure: $(QEMU_DIR)/.do_unpack cd $(QEMU_DIR) && ./configure \ --target-list=arm-softmmu,arm-linux-user \ --prefix=$(INSTALL_PREFIX) touch $@ $(QEMU_DIR)/.do_compile: $(QEMU_DIR)/.do_configure cd $(QEMU_DIR) && $(MAKE) touch $@ $(QEMU_SYSTEM_ARM_COMPILED): $(QEMU_DIR)/.do_compile cd $(QEMU_DIR) && $(MAKE) install # # squasfs-utils # $(MKSQUASHFS): $(SQUASHFS_DIR)/.do_unpack cd $(SQUASHFS_DIR)/squashfs-tools && $(MAKE) # # busybox # $(BUSYBOX_DIR)/.config: $(BUSYBOX_DIR)/.do_unpack cd $(BUSYBOX_DIR) && $(MAKE) defconfig sed -i \ -e 's/.*CONFIG_STATIC.*/CONFIG_STATIC=y/' \ -e 's,.*CONFIG_BUSYBOX_EXEC_PATH.*,CONFIG_BUSYBOX_EXEC_PATH="/bin/busybox",' \ -e 's/.*CONFIG_FEATURE_SYNC_FANCY.*/# CONFIG_FEATURE_SYNC_FANCY is not set/;' \ $(BUSYBOX_DIR)/.config $(BUSYBOX_DIR)/.do_compile: $(BUSYBOX_DIR)/.config cd $(BUSYBOX_DIR) && $(MAKE) touch $@ $(BUSYBOX_DIR)/.do_install: $(BUSYBOX_DIR)/.do_compile cd $(BUSYBOX_DIR) && $(MAKE) install touch $@ # # rootfs # #TODO dep overlays rootfs.squashfs: $(BUSYBOX_DIR)/.do_install $(MKSQUASHFS) $(ROOTFS_OVERLAYS) rm -rf tmproot mkdir -p tmproot bash -c 'mkdir -p tmproot/{etc,dev,proc,sys,tmp,var,run}' for o in $(BUSYBOX_DIR)/_install/ $(ROOTFS_OVERLAYS) ; do \ if [ -d $$o ] ; then \ echo -e "\n\ninstalling $$o to rootfs" ; \ rsync -rvac $$o/ tmproot/ ; \ fi ; \ done $(MKSQUASHFS) tmproot/ $@ -noappend truncate -s %1M rootfs.squashfs # rootfs needs to be aligned build: rootfs.squashfs $(LINUX_DIR)/.do_compile runqemu: build $(QEMU_SYSTEM_ARM) @echo -e "\n\n\nUse Ctrl-a x to exit from QEMU\n\n\n" QEMU_AUDIO_DRV=none $(QEMU_SYSTEM_ARM) \ -M $(QEMU_MACHINE) \ -nographic \ -drive file=rootfs.squashfs,if=sd,format=raw \ -net nic \ -net user,hostfwd=tcp::2222-:22 \ -kernel $(LINUX_DIR)/arch/$(ARCH)/boot/zImage \ -dtb $(LINUX_DIR)/arch/$(ARCH)/boot/dts/$(LINUX_DTB).dtb \ -append "$(BOOTARGS)" env: @bash -c 'declare -p CROSS_COMPILE ARCH' qemucmd: @echo "$(QEMU_SYSTEM_ARM)"