WIP: modules
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Copyright (c) 2026 0xKSor
|
||||
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(ksOS_init LANGUAGES C)
|
||||
|
||||
file(GLOB_RECURSE INIT_SOURCES CMAKE_CONFIGURE_DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.S
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.c
|
||||
)
|
||||
|
||||
add_executable(init ${INIT_SOURCES})
|
||||
|
||||
target_include_directories(init PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Source
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../Common
|
||||
)
|
||||
|
||||
target_compile_options(init PRIVATE
|
||||
-std=c23
|
||||
-ffreestanding
|
||||
-fno-stack-protector
|
||||
-fno-builtin
|
||||
-Wall -Wextra
|
||||
-g
|
||||
-mgeneral-regs-only
|
||||
)
|
||||
|
||||
# Передаем "голые" аргументы напрямую для ld.lld
|
||||
target_link_options(init PRIVATE
|
||||
"-Ttext=0x400000"
|
||||
"-e" "_start"
|
||||
"-z" "max-page-size=0x1000"
|
||||
"--no-dynamic-linker"
|
||||
)
|
||||
|
||||
set_target_properties(init PROPERTIES
|
||||
OUTPUT_NAME "Init"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||||
)
|
||||
@@ -0,0 +1,21 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Copyright (c) 2026 0xKSor
|
||||
|
||||
.section .text.entry, "ax"
|
||||
.global _start
|
||||
_start:
|
||||
// Set up stack pointer (8KB stack)
|
||||
adrp x0, stack_top
|
||||
add sp, x0, :lo12:stack_top
|
||||
|
||||
// Jump to C main
|
||||
bl main
|
||||
|
||||
// If main returns, loop forever
|
||||
b .
|
||||
|
||||
.section .bss, "aw", @nobits
|
||||
.align 12 // 4KB alignment
|
||||
stack_bottom:
|
||||
.space 8192 // 8KB stack
|
||||
stack_top:
|
||||
@@ -0,0 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Copyright (c) 2026 0xKSor
|
||||
|
||||
void main(void) {
|
||||
__asm__ volatile(
|
||||
"svc #0\n"
|
||||
"b .\n"
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Copyright (c) 2026 0xKSor
|
||||
|
||||
set(CMAKE_SYSTEM_NAME Generic)
|
||||
set(CMAKE_SYSTEM_PROCESSOR aarch64)
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
||||
|
||||
if(NOT LLVM_BIN)
|
||||
find_program(_CLANG
|
||||
NAMES clang
|
||||
HINTS
|
||||
/opt/homebrew/opt/llvm/bin
|
||||
/usr/local/opt/llvm/bin
|
||||
)
|
||||
|
||||
if(NOT _CLANG AND APPLE)
|
||||
execute_process(
|
||||
COMMAND brew --prefix llvm
|
||||
OUTPUT_VARIABLE LLVM_PREFIX
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_QUIET
|
||||
RESULT_VARIABLE BREW_PREFIX_RESULT
|
||||
)
|
||||
if(BREW_PREFIX_RESULT EQUAL 0 AND EXISTS "${LLVM_PREFIX}/bin/clang")
|
||||
set(_CLANG "${LLVM_PREFIX}/bin/clang")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT _CLANG)
|
||||
message(FATAL_ERROR "clang not found. Set LLVM_BIN or add clang to PATH.")
|
||||
endif()
|
||||
|
||||
get_filename_component(LLVM_BIN "${_CLANG}" DIRECTORY)
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_COMPILER "${LLVM_BIN}/clang")
|
||||
set(CMAKE_ASM_COMPILER "${LLVM_BIN}/clang")
|
||||
|
||||
set(TARGET_TRIPLE aarch64-none-elf)
|
||||
set(CMAKE_C_COMPILER_TARGET ${TARGET_TRIPLE})
|
||||
set(CMAKE_ASM_COMPILER_TARGET ${TARGET_TRIPLE})
|
||||
|
||||
if(APPLE)
|
||||
find_program(TERMOS_LD_LLD NAMES ld.lld HINTS /usr/local/bin /opt/homebrew/bin REQUIRED)
|
||||
set(CMAKE_C_LINK_FLAGS "")
|
||||
set(CMAKE_C_LINK_EXECUTABLE
|
||||
"${TERMOS_LD_LLD} <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
|
||||
endif()
|
||||
|
||||
find_program(LLVM_OBJCOPY NAMES llvm-objcopy objcopy
|
||||
HINTS
|
||||
"${LLVM_BIN}"
|
||||
/usr/local/opt/llvm/bin
|
||||
/opt/homebrew/opt/llvm/bin
|
||||
/usr/local/bin
|
||||
/opt/homebrew/bin
|
||||
REQUIRED
|
||||
)
|
||||
@@ -0,0 +1,124 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Copyright (c) 2026 0xKSor
|
||||
|
||||
set quiet := true
|
||||
|
||||
ROOT_BUILD_DIR := env_var_or_default("BUILD_DIR", justfile_directory() + "/../.build")
|
||||
RUNTIME_BUILD_DIR := ROOT_BUILD_DIR + "/Runtime"
|
||||
TEMP_DIR := env_var_or_default("TEMP_DIR", ROOT_BUILD_DIR + "/temp")
|
||||
|
||||
_default:
|
||||
just --list
|
||||
|
||||
@_build_cmake project_dir target_subpath:
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
PROJECT_DIR="{{ project_dir }}"
|
||||
TARGET_SUBPATH="{{ target_subpath }}"
|
||||
TEMP_DIR="{{ TEMP_DIR }}/Runtime/${TARGET_SUBPATH}"
|
||||
OUT_DIR="{{ RUNTIME_BUILD_DIR }}/${TARGET_SUBPATH}"
|
||||
|
||||
echo " 🛠️ CMake build: ${TARGET_SUBPATH}"
|
||||
|
||||
TOOLCHAIN_FILE="{{ justfile_directory() }}/cmake/aarch64.cmake"
|
||||
TOOLCHAIN=""
|
||||
if [ -f "${TOOLCHAIN_FILE}" ]; then
|
||||
TOOLCHAIN="-DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE}"
|
||||
else
|
||||
echo " ⚠️ Warning: Toolchain file not found at ${TOOLCHAIN_FILE}"
|
||||
fi
|
||||
|
||||
if ! OUT=$(cmake -B "${TEMP_DIR}" -S "${PROJECT_DIR}" -DCMAKE_BUILD_TYPE=Release ${TOOLCHAIN} -G Ninja 2>&1); then
|
||||
echo "$OUT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! OUT=$(cmake --build "${TEMP_DIR}" 2>&1); then
|
||||
echo "$OUT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "${OUT_DIR}"
|
||||
# Copy everything from build dir except CMake junk
|
||||
rsync -a --exclude='CMakeFiles' --exclude='CMakeCache.txt' --exclude='*.ninja*' --exclude='.ninja*' \
|
||||
"${TEMP_DIR}"/ "${OUT_DIR}"/ 2>/dev/null || \
|
||||
cp -R "${TEMP_DIR}"/* "${OUT_DIR}"/ 2>/dev/null || true
|
||||
|
||||
echo " ✅ CMake done: ${TARGET_SUBPATH}"
|
||||
|
||||
@_build_swiftpm project_dir target_subpath:
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
PROJECT_DIR="{{ project_dir }}"
|
||||
TARGET_SUBPATH="{{ target_subpath }}"
|
||||
TEMP_DIR="{{ TEMP_DIR }}/Runtime/${TARGET_SUBPATH}"
|
||||
OUT_DIR="{{ RUNTIME_BUILD_DIR }}/${TARGET_SUBPATH}"
|
||||
|
||||
echo " 🛠️ SwiftPM build: ${TARGET_SUBPATH}"
|
||||
|
||||
cd "${PROJECT_DIR}"
|
||||
|
||||
if ! OUT=$(swift build -c release --build-path "${TEMP_DIR}" 2>&1); then
|
||||
echo "$OUT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "${OUT_DIR}"
|
||||
if [ -d "${TEMP_DIR}/release" ]; then
|
||||
rsync -a "${TEMP_DIR}/release"/ "${OUT_DIR}"/ 2>/dev/null || \
|
||||
cp -R "${TEMP_DIR}/release"/* "${OUT_DIR}"/ 2>/dev/null || true
|
||||
elif [ -d "${TEMP_DIR}/Release" ]; then
|
||||
rsync -a "${TEMP_DIR}/Release"/ "${OUT_DIR}"/ 2>/dev/null || \
|
||||
cp -R "${TEMP_DIR}/Release"/* "${OUT_DIR}"/ 2>/dev/null || true
|
||||
fi
|
||||
|
||||
echo " ✅ SwiftPM done: ${TARGET_SUBPATH}"
|
||||
|
||||
@_discover_and_build category:
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
CATEGORY="{{ category }}"
|
||||
RUNTIME_DIR="{{ justfile_directory() }}"
|
||||
SRC_DIR="${RUNTIME_DIR}/${CATEGORY}"
|
||||
|
||||
if [ ! -d "${SRC_DIR}" ]; then
|
||||
echo " 📁 ${CATEGORY}/ not found, skipping"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
shopt -s nullglob
|
||||
projects=("${SRC_DIR}"/*/)
|
||||
shopt -u nullglob
|
||||
|
||||
if [ ${#projects[@]} -eq 0 ]; then
|
||||
echo " 📁 ${CATEGORY}/ is empty, skipping"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for dir in "${projects[@]}"; do
|
||||
name=$(basename "${dir}")
|
||||
echo ""
|
||||
echo " 📦 ${CATEGORY}/${name}"
|
||||
|
||||
if [ -f "${dir}/CMakeLists.txt" ]; then
|
||||
just --quiet _build_cmake "${dir}" "${CATEGORY}/${name}"
|
||||
elif [ -f "${dir}/Package.swift" ]; then
|
||||
just --quiet _build_swiftpm "${dir}" "${CATEGORY}/${name}"
|
||||
else
|
||||
echo " ⚠️ Skipping ${CATEGORY}/${name}: no CMakeLists.txt or Package.swift found"
|
||||
fi
|
||||
done
|
||||
|
||||
@build:
|
||||
@echo "🛠️ Building Runtime..."
|
||||
@mkdir -p {{ RUNTIME_BUILD_DIR }}/System
|
||||
@mkdir -p {{ RUNTIME_BUILD_DIR }}/Apps
|
||||
@just --quiet _discover_and_build System
|
||||
@just --quiet _discover_and_build Apps
|
||||
@echo ""
|
||||
@echo "✅ Runtime ready at: {{ RUNTIME_BUILD_DIR }}"
|
||||
|
||||
@clean:
|
||||
@rm -rf {{ TEMP_DIR }}/Runtime
|
||||
@rm -rf {{ RUNTIME_BUILD_DIR }}
|
||||
@echo "🧹 Runtime cleaned"
|
||||
Reference in New Issue
Block a user