forked from w84death/floppinux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
149 lines (123 loc) · 4.55 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Detected Variables
CORES := $(shell nproc)
BASE := $(shell pwd)
SYS_ARCH := $(shell uname -p)
SHELL := /bin/bash
# Config Variables
ARCH = x86
LINUX_DIR = linux
LINUX_CFG = $(LINUX_DIR)/.config
BUSYBOX_DIR = busybox
BUSYBOX_CFG = $(BUSYBOX_DIR)/.config
FILES_DIR = files
FILESYSTEM_DIR = filesystem
MOUNT_POINT = /mnt/disk
INITTAB = $(FILES_DIR)/inittab
RC = $(FILES_DIR)/rc
SYSLINUX_CFG = $(FILES_DIR)/syslinux.cfg
TOOLCHAIN_DIR = i486-linux-musl-cross
WELCOME = $(FILES_DIR)/welcome
ROOTFS_SIZE = 1440
# Generated Files
KERNEL = bzImage
ROOTFS = rootfs.cpio.xz
FSIMAGE = floppinux.img
# Recipe Files
BZIMAGE = $(LINUX_DIR)/arch/$(ARCH)/boot/$(KERNEL)
INIT = $(FILESYSTEM_DIR)/sbin/init
.SILENT: download_toolchain
.PHONY: all allconfig rebuild test_filesystem test_floppy_image size clean clean_linux clean_busybox clean_filesystem
all: get_linux compile_linux download_toolchain get_busybox compile_busybox make_rootfs make_floppy_image
allconfig: get_linux configure_linux compile_linux download_toolchain get_busybox configure_busybox \
compile_busybox make_rootfs make_floppy_image
rebuild: clean_filesystem compile_linux compile_busybox make_rootfs make_floppy_image
cleanbuild: clean compile_linux compile_busybox make_rootfs make_floppy_image
get_linux:
ifneq ($(wildcard $(LINUX_DIR)),)
@echo "Linux directory found, pulling latest changes..."
cd $(LINUX_DIR) && git pull
else
@echo "Linux directory not found, cloning repo..."
git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git $(LINUX_DIR)
cp $(FILES_DIR)/linux-config $(LINUX_CFG)
endif
configure_linux:
$(MAKE) ARCH=x86 -C $(LINUX_DIR) mrproper
$(MAKE) ARCH=x86 -C $(LINUX_DIR) tinyconfig
$(MAKE) ARCH=x86 -C $(LINUX_DIR) menuconfig
compile_linux:
$(MAKE) ARCH=x86 -C $(LINUX_DIR) -j $(CORES) $(KERNEL)
@echo Kernel size
ls -la $(BZIMAGE)
cp $(BZIMAGE) .
download_toolchain:
ifeq ($(SYS_ARCH),x86_64)
if [ ! -d $(TOOLCHAIN_DIR) ]; then \
echo "Downloading musl toolchain..."; \
wget https://musl.cc/i486-linux-musl-cross.tgz; \
tar xf i486-linux-musl-cross.tgz; \
fi
else
echo "Compiling on i386, toolchain not needed"
endif
get_busybox:
ifneq ($(wildcard $(BUSYBOX_DIR)),)
@echo "Busybox directory found, pulling latest changes..."
cd $(BUSYBOX_DIR) && git pull
else
@echo "Busybox directory not found, cloning repo..."
git clone https://git.busybox.net/busybox/ $(BUSYBOX_DIR)
cp $(FILES_DIR)/busybox-config $(BUSYBOX_CFG)
endif
configure_busybox:
$(MAKE) ARCH=x86 -C $(BUSYBOX_DIR) allnoconfig
$(MAKE) ARCH=x86 -C $(BUSYBOX_DIR) menuconfig
compile_busybox:
ifeq ($(SYS_ARCH),x86_64)
@sed -i "s|.*CONFIG_CROSS_COMPILER_PREFIX.*|CONFIG_CROSS_COMPILER_PREFIX="\"$(BASE)"/i486-linux-musl-cross/bin/i486-linux-musl-\"|" $(BUSYBOX_DIR)/.config
@sed -i "s|.*CONFIG_SYSROOT.*|CONFIG_SYSROOT=\""$(BASE)"/i486-linux-musl-cross\"|" $(BUSYBOX_DIR)/.config
@sed -i "s|.*CONFIG_EXTRA_CFLAGS.*|CONFIG_EXTRA_CFLAGS=\"-I"$(BASE)"/i486-linux-musl-cross/include\"|" $(BUSYBOX_DIR)/.config
@sed -i "s|.*CONFIG_EXTRA_LDFLAGS.*|CONFIG_EXTRA_LDFLAGS=\"-L"$(BASE)"/i486-linux-musl-cross/lib\"|" $(BUSYBOX_DIR)/.config
endif
$(MAKE) ARCH=x86 -C $(BUSYBOX_DIR) -j $(CORES)
$(MAKE) ARCH=x86 -C $(BUSYBOX_DIR) install
mv $(BUSYBOX_DIR)/_install $(FILESYSTEM_DIR)
make_rootfs:
mkdir -p $(FILESYSTEM_DIR)/{dev,proc,etc/init.d,sys,tmp}
sudo mknod $(FILESYSTEM_DIR)/dev/console c 5 1
sudo mknod $(FILESYSTEM_DIR)/dev/null c 1 3
cp $(INITTAB) $(FILESYSTEM_DIR)/etc/
cp $(RC) $(FILESYSTEM_DIR)/etc/init.d/
cp $(WELCOME) $(FILESYSTEM_DIR)/
chmod +x $(FILESYSTEM_DIR)/etc/init.d/rc
sudo chown -R root:root $(FILESYSTEM_DIR)/
cd $(FILESYSTEM_DIR); find . | cpio -H newc -o | xz --check=crc32 > ../$(ROOTFS)
make_floppy_image:
dd if=/dev/zero of=$(FSIMAGE) bs=1k count=$(ROOTFS_SIZE)
mkdosfs $(FSIMAGE)
syslinux --install $(FSIMAGE)
sudo mkdir -p $(MOUNT_POINT)
sudo mount -o loop $(FSIMAGE) $(MOUNT_POINT)
sudo cp $(KERNEL) $(ROOTFS) $(SYSLINUX_CFG) $(MOUNT_POINT)
sync
sudo umount $(MOUNT_POINT)
test_filesystem:
qemu-system-i386 -kernel $(KERNEL) -initrd $(ROOTFS)
test_floppy_image:
qemu-system-i386 -fda $(FSIMAGE)
size:
sudo mount -o loop $(FSIMAGE) $(MOUNT_POINT)
df -h $(MOUNT_POINT)
ls -lah $(MOUNT_POINT)
sudo umount $(MOUNT_POINT)
clean: clean_linux clean_busybox clean_filesystem
clean_linux:
$(MAKE) -C $(LINUX_DIR) clean
rm -f $(KERNEL)
clean_busybox:
$(MAKE) -C $(BUSYBOX_DIR) clean
clean_filesystem:
sudo rm -rf $(FILESYSTEM_DIR)
rm -f $(FSIMAGE) $(ROOTFS)
reset: clean_filesystem
sudo rm -rf $(LINUX_DIR) $(BUSYBOX_DIR) $(TOOLCHAIN_DIR) i486-linux-musl-cross.tgz