# $Id$ CC := cc CFLAGS := -g ROOT := ./isoroot DASH_VERSION := 0.5.12 BASH_VERSION := 5.2.15 NCURSES_VERSION := 6.4 GETTEXT_VERSION := 0.22.3 MUSL_VERSION := 1.2.4 BINUTILS_VERSION := 2.41 TCSH_VERSION := 6.24.10 CPU := $(shell nproc) DATE := $(shell LC_ALL=C.UTF-8 date) .PHONY: all clean all: ./linux.iso $(ROOT)/bin/dash: if [ ! -e "dash-$(DASH_VERSION).tar.gz" ]; then wget -O dash-$(DASH_VERSION).tar.gz https://git.kernel.org/pub/scm/utils/dash/dash.git/snapshot/dash-$(DASH_VERSION).tar.gz ; fi if [ ! -e "dash-$(DASH_VERSION)" ]; then tar xvf dash-$(DASH_VERSION).tar.gz ; fi cd dash-$(DASH_VERSION) && ./autogen.sh && export CFLAGS="-static" && ./configure --exec-prefix=$(shell pwd)/$(ROOT)/ --prefix=/ && make -j$(CPU) && make install $(ROOT)/usr/bin/oksh: if [ ! -e "oksh" ]; then git clone https://github.com/ibara/oksh ; fi cd oksh && ./configure --exec-prefix=/usr --prefix=$(shell pwd)/$(ROOT)/usr && make -j$(CPU) && make install $(ROOT)/bin/tcsh: if [ ! -e "tcsh-$(TCSH_VERSION).tar.gz" ]; then wget -O tcsh-$(TCSH_VERSION).tar.gz https://astron.com/pub/tcsh/tcsh-6.24.10.tar.gz ; fi if [ ! -e "tcsh-$(TCSH_VERSION)" ]; then tar xvf tcsh-$(TCSH_VERSION).tar.gz ; fi cd tcsh-$(TCSH_VERSION) && if [ ! -e "Makefile" ]; then ./configure --exec-prefix=$(shell pwd)/$(ROOT)/usr --prefix=/usr ; fi cd tcsh-$(TCSH_VERSION) && make -j$(CPU) && make install $(ROOT)/bin/bash: if [ ! -e "bash-$(BASH_VERSION).tar.gz" ]; then wget -O bash-$(BASH_VERSION).tar.gz http://ftp.gnu.org/gnu/bash/bash-$(BASH_VERSION).tar.gz ; fi if [ ! -e "bash-$(BASH_VERSION)" ]; then tar xvf bash-$(BASH_VERSION).tar.gz ; fi cd bash-$(BASH_VERSION) && ./configure --disable-nls --exec-prefix=$(shell pwd)/$(ROOT)/ --prefix=/ && make -j$(CPU) && make install $(ROOT)/usr/bin/pcc: if [ ! -e "pcc" ]; then cvs -d :pserver:anonymous@pcc.ludd.ltu.se:/cvsroot co pcc ; fi mkdir -p $(ROOT)/usr/bin cd pcc && ./configure --exec-prefix=$(shell pwd)/$(ROOT)/usr --prefix=/usr && make -j$(CPU) && make install $(ROOT)/lib/libpam.so: if [ ! -e "pam" ]; then git clone https://github.com/linux-pam/linux-pam pam ; fi mkdir -p $(ROOT)/lib cd pam && if [ ! -e ./configure ]; then ./autogen.sh ; fi cd pam && if [ ! -e Makefile ]; then ./configure --disable-doc --exec-prefix=$(shell pwd)/$(ROOT)/ --prefix=$(shell pwd)/$(ROOT)/ ; fi cd pam && make && make install $(ROOT)/usr/lib/libintl.so: if [ ! -e "gettext-$(GETTEXT_VERSION).tar.gz" ]; then wget -O gettext-$(GETTEXT_VERSION).tar.gz http://ftp.gnu.org/gnu/gettext/gettext-$(GETTEXT_VERSION).tar.gz ; fi if [ ! -e "gettext-$(GETTEXT_VERSION)" ]; then tar xvf gettext-$(GETTEXT_VERSION).tar.gz ; fi cd gettext-$(GETTEXT_VERSION) && ./configure --exec-prefix=$(shell pwd)/$(ROOT)/usr --prefix=/usr --with-shared -without-debug && make -j$(CPU) && make install $(ROOT)/usr/lib/libncursesw.so: if [ ! -e "ncurses-$(NCURSES_VERSION).tar.gz" ]; then wget -O ncurses-$(NCURSES_VERSION).tar.gz http://ftp.gnu.org/gnu/ncurses/ncurses-$(NCURSES_VERSION).tar.gz ; fi if [ ! -e "ncurses-$(NCURSES_VERSION)" ]; then tar xvf ncurses-$(NCURSES_VERSION).tar.gz ; fi cd ncurses-$(NCURSES_VERSION) && ./configure --enable-termcap --exec-prefix=$(shell pwd)/$(ROOT)/usr --prefix=/usr --with-shared -without-debug --enable-widec && make -j$(CPU) && make install $(ROOT)/sbin/getty: ./getty.c mkdir -p $(ROOT)/sbin cc -o $@ $< $(ROOT)/sbin/cgetty: if [ ! -e "cgetty" ]; then svn co http://sw.nishi.boats/sw/~nishi/cgetty/trunk cgetty ; fi cd cgetty && make -j$(CPU) && cp bin/cgetty ../$(ROOT)/sbin/cgetty $(ROOT)/bin/clogin: if [ ! -e "clogin" ]; then svn co http://sw.nishi.boats/sw/~nishi/clogin/trunk clogin ; fi cd clogin && make -j$(CPU) && cp bin/clogin ../$(ROOT)/bin/clogin $(ROOT)/bin/nv: svn co http://sw.nishi.boats/sw/~nishi/nashville/trunk nv cd nv && make STATIC=YES -j$(CPU) && cp bin/nashville ../$(ROOT)/bin/nv $(ROOT)/usr/include/stdio.h: if [ ! -e "musl.tar.gz" ]; then wget -O musl.tar.gz https://musl.libc.org/releases/musl-$(MUSL_VERSION).tar.gz ; fi if [ ! -e "musl-$(MUSL_VERSION)" ]; then tar xvf musl.tar.gz ; fi mkdir -p $(ROOT)/usr/include cd musl-$(MUSL_VERSION) && ./configure --disable-doc --exec-prefix=$(shell pwd)/$(ROOT)/usr --prefix=$(shell pwd)/$(ROOT)/usr cd musl-$(MUSL_VERSION) && make -j$(CPU) && make install $(ROOT)/usr/sbin/dhclient: if [ ! -e "isc-dhcp" ]; then git clone https://github.com/isc-projects/dhcp isc-dhcp ; fi cd isc-dhcp && if [ ! -e "Makefile" ]; then ./configure --exec-prefix=$(shell pwd)/$(ROOT)/usr --prefix=$(shell pwd)/$(ROOT)/usr ; fi cd isc-dhcp && make -j$(CPU) && make install $(ROOT)/usr/sbin/dhcpcd: if [ ! -e "dhcpcd" ]; then git clone https://github.com/NetworkConfiguration/dhcpcd ; fi cd dhcpcd && ./configure --exec-prefix=/usr --prefix=$(shell pwd)/$(ROOT)/usr --etcdir=/etc cd dhcpcd && make -j$(CPU) && make install root: mkdir -p $(ROOT)/bin mkdir -p $(ROOT)/dev/pts mkdir -p $(ROOT)/dev/shm mkdir -p $(ROOT)/proc mkdir -p $(ROOT)/sys mkdir -p $(ROOT)/run umount $(ROOT)/dev/pts || exit 0 umount $(ROOT)/dev || exit 0 umount $(ROOT)/proc || exit 0 umount $(ROOT)/sys || exit 0 umount $(ROOT)/run || exit 0 mount -v --bind /dev $(ROOT)/dev mount -v --bind /dev/pts $(ROOT)/dev/pts mount -vt proc proc $(ROOT)/proc mount -vt sysfs sysfs $(ROOT)/sys mount -vt tmpfs tmpfs $(ROOT)/run mkdir -p $(ROOT)/etc if [ -h $(ROOT)/dev/shm ]; then mkdir -pv $(ROOT)/dev/shm ; fi ./$(ROOT)/sbin/init: if [ ! -e "cinit" ]; then svn co http://sw.nishi.boats/sw/~nishi/cinit/trunk cinit ; fi cd cinit && make -j$(CPU) && cp bin/cinit ../$(ROOT)/sbin/init ./$(ROOT)/etc/tcshrc: wget -O $@ http://nishi.boats/pub/tcshrc ./$(ROOT)/bzImage: wget -O $@ https://ftp.riken.jp/Linux/slackware/slackware64-15.0/kernels/huge.s/bzImage ./modules.txz: wget -O $@ https://mirrors.slackware.com/slackware/slackware64-15.0/slackware64/a/kernel-modules-5.15.19-x86_64-2.txz tar xvJf $@ -C $(ROOT) ./linux.iso: root \ $(ROOT)/bzImage \ ./dist/limine.cfg \ ./dist/inittab \ ./dist/rc.subr \ ./dist/fetch \ ./dist/rc.proc \ ./dist/init.d/rc \ ./dist/issue \ ./dist/udhcpc.script \ ./dist/hostname \ ./dist/rc.conf \ /bin/busybox \ ./modules.txz \ $(ROOT)/etc/tcshrc \ $(ROOT)/lib/libpam.so \ $(ROOT)/usr/lib/libintl.so \ $(ROOT)/usr/lib/libncursesw.so \ $(ROOT)/usr/bin/pcc \ $(ROOT)/bin/nv \ $(ROOT)/sbin/init \ $(ROOT)/sbin/getty \ $(ROOT)/bin/tcsh \ $(ROOT)/usr/include/stdio.h \ $(ROOT)/usr/bin/oksh \ $(ROOT)/bin/clogin \ ./dist/dhclient-script \ $(ROOT)/usr/sbin/dhcpcd \ $(ROOT)/sbin/cgetty \ # $(ROOT)/usr/sbin/dhclient # ISC dhcp is removed ; just use udhcpc or dhcpcd # # $(ROOT)/bin/bash # Never works fine. # # $(ROOT)/sbin/mingetty # Replaced with Cgetty. umount $(ROOT)/dev/pts || exit 0 umount $(ROOT)/dev || exit 0 umount $(ROOT)/proc || exit 0 umount $(ROOT)/sys || exit 0 umount $(ROOT)/run || exit 0 mkdir -p $(ROOT)/boot/grub mkdir -p $(ROOT)/etc mkdir -p $(ROOT)/etc/init.d mkdir -p $(ROOT)/etc/rcS.d mkdir -p $(ROOT)/etc/rc1.d/ mkdir -p $(ROOT)/etc/rc2.d/ mkdir -p $(ROOT)/etc/rc3.d/ mkdir -p $(ROOT)/etc/rc4.d/ mkdir -p $(ROOT)/etc/rc5.d/ mkdir -p $(ROOT)/etc/rc6.d/ cp ./dist/init.d/* $(ROOT)/etc/init.d/ cp ./dist/rcS.d/* $(ROOT)/etc/rcS.d/ cp ./dist/rc1.d/* $(ROOT)/etc/rc1.d/ cp ./dist/rc2.d/* $(ROOT)/etc/rc2.d/ cp ./dist/rc3.d/* $(ROOT)/etc/rc3.d/ cp ./dist/rc4.d/* $(ROOT)/etc/rc4.d/ cp ./dist/rc5.d/* $(ROOT)/etc/rc5.d/ cp ./dist/rc6.d/* $(ROOT)/etc/rc6.d/ cp ./dist/rc.subr $(ROOT)/etc/ cp ./dist/rc.proc $(ROOT)/etc/ cp ./dist/rc.conf $(ROOT)/etc/ cp ./dist/fetch $(ROOT)/bin/fetchinfo chmod +x $(ROOT)/bin/fetchinfo chmod +x $(ROOT)/etc/rc.subr chmod +x $(ROOT)/etc/rc.proc chmod +x $(ROOT)/etc/rc.conf cp ./dist/issue $(ROOT)/etc/ cp ./dist/dhclient-script $(ROOT)/sbin/ chmod +x $(ROOT)/sbin/dhclient-script mkdir -p $(ROOT)/etc/pam.d mkdir -p $(ROOT)/var/run mkdir -p $(ROOT)/usr/share/udhcpc cp ./dist/udhcpc.script $(ROOT)/usr/share/udhcpc/default.script chmod +x $(ROOT)/usr/share/udhcpc/default.script cp ./dist/pam.d/* $(ROOT)/etc/pam.d/ mkdir -p $(ROOT)/usr/share/terminfo mkdir -p $(ROOT)/tmp ln -sf /bin/busybox $(ROOT)/bin/login cp -f /bin/busybox $(ROOT)/bin/ cp -f /usr/lib/libgcc* $(ROOT)/usr/lib/ cp ./dist/pam.d/* $(ROOT)/etc/pam.d/ mkdir -p $(ROOT)/usr/share/terminfo mkdir -p $(ROOT)/tmp ln -sf /bin/clogin $(ROOT)/bin/login ln -sf /bin/busybox $(ROOT)/bin/mkdir ln -sf /usr/bin/tcsh $(ROOT)/bin/tcsh ln -sf /bin/busybox $(ROOT)/sbin/swapoff ln -sf /bin/busybox $(ROOT)/sbin/umount cp -f /bin/busybox $(ROOT)/bin/ cp -rf /usr/share/terminfo/* $(ROOT)/usr/share/terminfo/ chmod +x $(ROOT)/etc/init.d/* chmod +x $(ROOT)/etc/rc?.d/* printf "\x1b[m" > $(ROOT)/bootmotd printf " Booting \x1b[1m\x1b[31mScarlet\x1b[m \x1b[1mNashville+BB/Linux\x1b[m \x1b[1m\x1b[33mBuild $(DATE)\x1b[m\n" >> $(ROOT)/bootmotd printf " - Homebrew Linux Distro!\n" >> $(ROOT)/bootmotd cp ./bzImage isoroot/ cp ./dist/limine.cfg isoroot/ cp ./dist/inittab isoroot/etc/ cd ./nv/src && for i in `ls *.c`; do \ if [ "main.c" = "$$i" ]; then \ continue; \ fi; \ ln -sf /bin/nv ../../$(ROOT)/bin/`echo $$i | sed "s/\.c//g"`; \ done cp /lib/ld-musl* $(ROOT)/lib/ useradd -R $(shell pwd)/$(ROOT) -g 0 -u 0 -p root -s /bin/sh -d /root root || exit 0 groupadd -R $(shell pwd)/$(ROOT) -g 0 root || exit 0 echo "root:`mkpasswd root`:0::::::" > $(ROOT)/etc/shadow ln -sf /usr/bin/oksh $(ROOT)/bin/sh ln -sf /bin/busybox $(ROOT)/bin/ls ln -sf /bin/busybox $(ROOT)/sbin/mdev ln -sf /bin/busybox $(ROOT)/sbin/ifconfig ln -sf /bin/busybox $(ROOT)/sbin/ip ln -sf /bin/busybox $(ROOT)/sbin/route ln -sf /bin/busybox $(ROOT)/sbin/modprobe ln -sf /bin/busybox $(ROOT)/sbin/udhcpc ln -sf /bin/busybox $(ROOT)/sbin/ifup ln -sf /bin/busybox $(ROOT)/sbin/ifdown ln -sf /bin/busybox $(ROOT)/sbin/run-parts ln -sf /bin/busybox $(ROOT)/bin/grep ln -sf /bin/busybox $(ROOT)/bin/sed ln -sf /bin/busybox $(ROOT)/sbin/ping ln -sf /bin/busybox $(ROOT)/bin/mv mkdir -p $(ROOT)/lib mkdir -p $(ROOT)/root mkdir -p $(ROOT)/boot cp -rf $(ROOT)/share/* $(ROOT)/usr/share/ cp ./dist/hostname $(ROOT)/etc/ mkdir -p efi cp ./dist/sdm.jpg $(ROOT)/ fallocate -l 32m $(ROOT)/efi.img losetup /dev/loop0 $(ROOT)/efi.img mkfs.vfat /dev/loop0 mount -t vfat /dev/loop0 efi mkdir -p efi/efi/boot mkdir -p efi/boot mkdir -p efi/icons cp -rf /usr/share/refind/icons/* efi/icons/ cp ./dist/sdm.png efi/ cp /usr/share/refind/refind_x64.efi efi/efi/boot/bootx64.efi cp dist/refind.conf efi/efi/boot/refind.conf cp $(ROOT)/bzImage efi/ umount efi losetup -d /dev/loop0 cp /usr/share/limine/limine-bios-cd.bin $(ROOT)/limine-bios-cd.bin cp /usr/share/limine/limine-uefi-cd.bin $(ROOT)/limine-uefi-cd.bin cp dist/elilo.efi $(ROOT)/ cp /usr/share/limine/limine-bios.sys $(ROOT)/ chroot $(ROOT) /bin/busybox chown -R 0:0 . rm -f $@ xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot efi.img -efi-boot-part --efi-boot-image --protective-msdos-label -o $@ $(ROOT) limine bios-install $@ clean: umount $(ROOT)/dev/pts || exit 0 umount $(ROOT)/dev || exit 0 umount $(ROOT)/proc || exit 0 umount $(ROOT)/sys || exit 0 umount $(ROOT)/run || exit 0 rm -f ./linux.iso rm -rf isoroot