lindows/CMakeLists.txt
2024-02-28 10:44:02 -05:00

198 lines
6.8 KiB
CMake

cmake_minimum_required(VERSION 3.28)
# grab commands
include(ExternalProject)
# dear god
project(lindows)
# find our programs
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake.d/")
find_package(NTFS3g REQUIRED)
find_package(CoreUtils REQUIRED)
find_package(MTools REQUIRED)
find_package(Python REQUIRED) # for GRUB
# TODO: find_package for bison (for GRUB)
# TODO: find_package for flex (for GRUB)
# TODO: find_package for sfdisk (for disk image generation)
# make c drive mount point
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lindows_c")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lindows_efi")
# build grub
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/grub")
ExternalProject_Add(GRUB
GIT_REPOSITORY "https://git.savannah.gnu.org/git/grub.git"
GIT_TAG "grub-2.12"
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
UPDATE_COMMAND "" # the commit is fixed, we will never need to update
# this should make it stop rebuilding every `make`
CONFIGURE_COMMAND ./bootstrap
COMMAND ./configure
--host=x86_64-pc-linux-gnu
--target=x86_64
--with-platform=efi
--disable-efiemu
--prefix=${CMAKE_CURRENT_BINARY_DIR}/grub
BUILD_COMMAND make
BUILD_IN_SOURCE TRUE
INSTALL_COMMAND make install
)
# build linux
add_executable(LinuxConfig IMPORTED)
set_property(TARGET LinuxConfig PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/linux/config)
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/linux")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/linux/modules")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/linux/headers")
ExternalProject_Add(Linux
GIT_REPOSITORY "https://github.com/torvalds/linux"
GIT_TAG "v6.7"
GIT_PROGRESS TRUE
UPDATE_COMMAND ""
CONFIGURE_COMMAND ${CoreUtils_Copy_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/src/linux/config .config
BUILD_COMMAND make
BUILD_IN_SOURCE TRUE
INSTALL_COMMAND ${CoreUtils_Copy_EXECUTABLE} arch/x86_64/boot/bzImage ${CMAKE_CURRENT_BINARY_DIR}/linux
COMMAND make modules_install INSTALL_MOD_PATH=${CMAKE_CURRENT_BINARY_DIR}/linux/modules
COMMAND make headers_install INSTALL_HDR_PATH=${CMAKE_CURRENT_BINARY_DIR}/linux/headers
STEP_TARGETS install
)
ExternalProject_Add_StepDependencies(Linux configure LinuxConfig)
# build glibc
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/glibc")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/glibc/prefix")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/glibc/lib")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/glibc/libexec")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/glibc/bin")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/glibc/sbin")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/glibc/include")
ExternalProject_Add(GLibC
GIT_REPOSITORY "https://sourceware.org/git/glibc.git"
GIT_TAG "glibc-2.39"
GIT_PROGRESS TRUE
UPDATE_COMMAND ""
CONFIGURE_COMMAND <SOURCE_DIR>/configure
--prefix=${CMAKE_CURRENT_BINARY_DIR}/glibc/prefix
--with-headers=${CMAKE_CURRENT_BINARY_DIR}/linux/headers/include
--enable-kernel=6.7.0
--host=x86_64-pc-linux-gnu
--enable-shared
BUILD_COMMAND make
INSTALL_COMMAND make install
COMMAND sh -c "cp -r ${CMAKE_CURRENT_BINARY_DIR}/glibc/prefix/sbin/* ${CMAKE_CURRENT_BINARY_DIR}/glibc/bin"
COMMAND sh -c "cp -r ${CMAKE_CURRENT_BINARY_DIR}/glibc/prefix/bin/* ${CMAKE_CURRENT_BINARY_DIR}/glibc/bin"
COMMAND sh -c "cp -r ${CMAKE_CURRENT_BINARY_DIR}/glibc/prefix/libexec/* ${CMAKE_CURRENT_BINARY_DIR}/glibc/lib"
COMMAND sh -c "cp -r ${CMAKE_CURRENT_BINARY_DIR}/glibc/prefix/lib/* ${CMAKE_CURRENT_BINARY_DIR}/glibc/lib"
STEP_TARGETS install
)
# this should probably be a shell script, i unfortunately do not care
add_custom_command(OUTPUT lindows_c.img
# create empty 128MiB disk image
COMMAND "${CoreUtils_dd_EXECUTABLE}" ARGS
if=/dev/zero
of=lindows_c.img
bs=1M
count=128
# format disk with new NTFS filesystem
COMMAND "${NTFS3g_Mkfs_EXECUTABLE}" ARGS -F # scary!
-L Windows
./lindows_c.img
# mount filesystem
COMMAND "${NTFS3g_Mount_EXECUTABLE}" ARGS
-o no_def_opts
lindows_c.img
lindows_c
# create system folders
COMMAND ${CoreUtils_Mkdir_EXECUTABLE} ARGS lindows_c/Windows
COMMAND ${CoreUtils_Mkdir_EXECUTABLE} ARGS lindows_c/Windows/System32
COMMAND ${CoreUtils_Mkdir_EXECUTABLE} ARGS lindows_c/Windows/GRUB
COMMAND ${CoreUtils_Mkdir_EXECUTABLE} ARGS lindows_c/Windows/GRUB/x86_64-efi
# grub stuff
COMMAND ${CoreUtils_Copy_EXECUTABLE} ARGS ${CMAKE_CURRENT_BINARY_DIR}/grub/lib/grub/x86_64-efi/* lindows_c/Windows/GRUB/x86_64-efi
COMMAND ${CoreUtils_Copy_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/src/grub/grub.cfg lindows_c/Windows/GRUB/grub.cfg
# install the kernel
COMMAND ${CoreUtils_Copy_EXECUTABLE} ARGS ${CMAKE_CURRENT_BINARY_DIR}/linux/bzImage lindows_c/Windows/vmlinux.exe
# copy glibc files to system32
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/copyglibc
# create users folder
COMMAND ${CoreUtils_Mkdir_EXECUTABLE} ARGS lindows_c/Users
# unmount filesystem
COMMAND "umount" ARGS lindows_c
DEPENDS
lsmss
Linux-install
GLibC-install
src/grub/grub.cfg
scripts/copyglibc
)
# this makes the efi system partition
add_custom_command(OUTPUT lindows_efi.img
COMMAND ${CoreUtils_Mkdir_EXECUTABLE} ARGS -p lindows_efi/
COMMAND "${CMAKE_CURRENT_BINARY_DIR}/grub/bin/grub-mkimage" ARGS
-p /Windows/GRUB
-O x86_64-efi
-o lindows_efi/grubx64.efi
-c ${CMAKE_CURRENT_SOURCE_DIR}/src/grub/grub-early.cfg
part_gpt ntfs
COMMAND "${CoreUtils_dd_EXECUTABLE}" ARGS
if=/dev/zero
of=lindows_efi.img
bs=1M
count=33
#COMMAND mkfs.vfat lindows_efi.img -F 32
COMMAND ${MTools_Format_EXECUTABLE} -i lindows_efi.img
COMMAND ${MTools_Mkdir_EXECUTABLE} -i lindows_efi.img ::/EFI
COMMAND ${MTools_Mkdir_EXECUTABLE} -i lindows_efi.img ::/EFI/BOOT
COMMAND ${MTools_Copy_EXECUTABLE} -i lindows_efi.img lindows_efi/grubx64.efi ::/EFI/BOOT/BOOTX64.EFI
DEPENDS src/grub/grub-early.cfg
)
# make the full disk image
add_custom_command(OUTPUT lindows.img
COMMAND echo ARGS label: gpt > disk.sfdisk
COMMAND echo ARGS unit: sectors >> disk.sfdisk
COMMAND echo ARGS start=1MiB, size=33MiB, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B >> disk.sfdisk
COMMAND echo ARGS start=34MiB, size=128MiB, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, uuid=48D29DA8-2FF8-4F23-BA1A-0E8CCFC329E2 >> disk.sfdisk
COMMAND "${CoreUtils_dd_EXECUTABLE}" ARGS
if=/dev/zero
of=lindows.img
bs=1M
count=256
# partition disk
COMMAND sfdisk ARGS lindows.img < disk.sfdisk
# write partitions
COMMAND "${CoreUtils_dd_EXECUTABLE}" ARGS
if=lindows_efi.img
of=lindows.img
bs=1M
count=33
seek=1
conv=notrunc
COMMAND "${CoreUtils_dd_EXECUTABLE}" ARGS
if=lindows_c.img
of=lindows.img
bs=1M
count=128
seek=34
conv=notrunc
DEPENDS lindows_c.img lindows_efi.img
BYPRODUCTS disk.sfdisk
)
add_custom_target(lindows ALL DEPENDS lindows.img)
add_subdirectory(lsmss)