From 9449b64b058929089d14881bf5bb1286bbd889eb Mon Sep 17 00:00:00 2001 From: Max Logaev Date: Wed, 19 Mar 2025 02:27:05 +0300 Subject: [PATCH] Build: Added CMake support Signed-off-by: Max Logaev --- .gitignore | 8 ++- CMakeLists.txt | 28 +++++++++ activate-env | 10 ++++ build-toolchain.sh | 39 ------------ example/CMakeLists.txt | 5 ++ libraries/CMakeLists.txt | 21 +++++++ libraries/kos-crt-stub/CMakeLists.txt | 8 +++ libraries/kos-crt-stub/kos-recipe.sh | 26 -------- scripts/end-recipe | 32 ---------- scripts/start-recipe | 17 ------ toolchain/CMakeLists.txt | 59 +++++++++++++++++++ .../kos-crt-stub => toolchain}/kos-app.lds | 0 12 files changed, 136 insertions(+), 117 deletions(-) create mode 100644 CMakeLists.txt create mode 100755 activate-env delete mode 100755 build-toolchain.sh create mode 100644 example/CMakeLists.txt create mode 100644 libraries/CMakeLists.txt create mode 100644 libraries/kos-crt-stub/CMakeLists.txt delete mode 100755 libraries/kos-crt-stub/kos-recipe.sh delete mode 100644 scripts/end-recipe delete mode 100644 scripts/start-recipe create mode 100644 toolchain/CMakeLists.txt rename {libraries/kos-crt-stub => toolchain}/kos-app.lds (100%) diff --git a/.gitignore b/.gitignore index 68ae0dbca..2d4f9c351 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,8 @@ *.out *.app -# Build dirs -toolchain/binutils/build -toolchain/gcc/build +# CMake build dir +build + +# SDK dir +sdk diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..c0e308587 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 3.31) + +project(kolibrios-ports) + +include(ExternalProject) + +# Number of threads for build +set(JOBS 6) + +# Installation directory for GCC and Binutils" +if(NOT DEFINED ENV{SDK_TOOLCHAIN_DIR}) + message(FATAL_ERROR "The environment variable SDK_TOOLCHAIN_DIR is not set!") +endif() + +set(SDK_TOOLCHAIN_DIR $ENV{SDK_TOOLCHAIN_DIR}) + +message(STATUS "SDK_TOOLCHAIN_DIR=${SDK_TOOLCHAIN_DIR}") + +# Directory for installing ports" +if(NOT DEFINED ENV{SDK_SYSROOT_DIR}) + message(FATAL_ERROR "The environment variable SDK_SYSROOT_DIR is not set!") +endif() + +set(SDK_SYSROOT_DIR $ENV{SDK_SYSROOT_DIR}) +message(STATUS "SDK_SYSROOT_DIR=${SDK_SYSROOT_DIR}") + +add_subdirectory(toolchain) +add_subdirectory(libraries) diff --git a/activate-env b/activate-env new file mode 100755 index 000000000..539f9034c --- /dev/null +++ b/activate-env @@ -0,0 +1,10 @@ +#!/bin/bash + +# Installation directory for GCC and Binutils" +export SDK_TOOLCHAIN_DIR="$(pwd)/sdk/toolchain" + +# Directory for installing ports" +export SDK_SYSROOT_DIR="$(pwd)/sdk/sysroot" + +# Add i586-kolibrios toolchain to PATH +export PATH=$PATH:"$SDK_TOOLCHAIN_DIR/bin" diff --git a/build-toolchain.sh b/build-toolchain.sh deleted file mode 100755 index a4871bf63..000000000 --- a/build-toolchain.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# Copyright (C) KolibriOS-NG team 2024. All rights reserved -# Distributed under terms of the GNU General Public License - -source scripts/start-recipe - -ROOT_DIR="$PWD" -PATH=$PATH:"$SDK_TOOLCHAIN_DIR/bin" - -declare -a DIRS=( - "toolchain/binutils" - "toolchain/gcc" - "libraries/kos-crt-stub" -) - -BUILD() -{ - for dir in "${DIRS[@]}" ; do - cd "$ROOT_DIR/$dir" - ./kos-recipe.sh - done -} - -INSTALL() -{ - :; - # "For root recipes, installation is performed in BUILD" -} - -CLEAN() -{ - for dir in "${DIRS[@]}" ; do - cd "$ROOT_DIR/$dir" - ./kos-recipe.sh --clean - done -} - -source scripts/end-recipe \ No newline at end of file diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt new file mode 100644 index 000000000..21077c142 --- /dev/null +++ b/example/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.31) + +project(hello) +add_executable(hello hello.c) +install(TARGETS hello DESTINATION bin) diff --git a/libraries/CMakeLists.txt b/libraries/CMakeLists.txt new file mode 100644 index 000000000..e576fbc84 --- /dev/null +++ b/libraries/CMakeLists.txt @@ -0,0 +1,21 @@ +# Rules for building libraries + +# Copy NewLib headers to sysroot dir +add_custom_target(copy-newlib-headers + COMMAND + ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_CURRENT_SOURCE_DIR}/newlib/libc/include" + "${SDK_SYSROOT_DIR}/include" + COMMENT "Copying all Newlib headers to ${SDK_SYSROOT_DIR}/include" +) + +# Pseudo libc (kos-crt-stub) +ExternalProject_Add( + kos-crt-stub + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/kos-crt-stub + CMAKE_ARGS + -DCMAKE_C_COMPILER=i586-kolibrios-gcc + -DCMAKE_C_COMPILER_WORKS=1 + -DCMAKE_INSTALL_PREFIX=${SDK_SYSROOT_DIR} + DEPENDS copy-kos-app-lds +) diff --git a/libraries/kos-crt-stub/CMakeLists.txt b/libraries/kos-crt-stub/CMakeLists.txt new file mode 100644 index 000000000..042c8d069 --- /dev/null +++ b/libraries/kos-crt-stub/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.31) + +project(crt-stub) + +# Pseudo libc +add_library(c crt-stub.c) + +install(TARGETS c DESTINATION lib) diff --git a/libraries/kos-crt-stub/kos-recipe.sh b/libraries/kos-crt-stub/kos-recipe.sh deleted file mode 100755 index 73c23ba93..000000000 --- a/libraries/kos-crt-stub/kos-recipe.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# Copyright (C) KolibriOS-NG team 2024. All rights reserved -# Distributed under terms of the GNU General Public License - -source ../../scripts/start-recipe - -BUILD() -{ - i586-kolibrios-gcc -c crt-stub.c -o crt-stub.o - i586-kolibrios-ar crs libc.a crt-stub.o -} - -INSTALL() -{ - mkdir -p "$SDK_SYSROOT_DIR/lib" - cp -f kos-app.lds "$SDK_SYSROOT_DIR/lib/" - cp -f libc.a "$SDK_SYSROOT_DIR/lib" -} - -CLEAN() -{ - rm -f crt-stub.o libc.a -} - -source ../../scripts/end-recipe diff --git a/scripts/end-recipe b/scripts/end-recipe deleted file mode 100644 index 25da55bbc..000000000 --- a/scripts/end-recipe +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (C) KolibriOS-NG team 2024. All rights reserved -# Distributed under terms of the GNU General Public License - -show_help() -{ -cat << EOF -usage: $0 [OPTION] -Options: - --build run recipe build - --install run recipe install (stub for root scripts) - --clean remove build artifacts - --help show this help - -Running without parameters is equivalent to running: -'--build' and '--install' - -Warning: Run the script only from the directory where it is located! -EOF -} - -if [[ $# -eq 0 ]]; then - BUILD - INSTALL -else - case $1 in - "--build" ) BUILD ;; - "--install" ) INSTALL ;; - "--clean" ) CLEAN ;; - "--help" ) show_help ;; - *) fatal "Unknown argument!" - esac -fi diff --git a/scripts/start-recipe b/scripts/start-recipe deleted file mode 100644 index a3df528a1..000000000 --- a/scripts/start-recipe +++ /dev/null @@ -1,17 +0,0 @@ -set -eu - -TARGET=i586-kolibrios -SDK_TOOLCHAIN_DIR=/opt/kolibrios-sdk/toolchain -SDK_SYSROOT_DIR=/opt/kolibrios-sdk/sysroot -NUM_JOBS=8 - -msg() -{ - echo -e "\e[32m$1\e[0m" -} - -fatal() -{ - echo -e "\e[31m$1\e[0m" - exit 1 -} diff --git a/toolchain/CMakeLists.txt b/toolchain/CMakeLists.txt new file mode 100644 index 000000000..bf9cf0851 --- /dev/null +++ b/toolchain/CMakeLists.txt @@ -0,0 +1,59 @@ +# Rules for building the i586-kolibrios-gcc toolchain + +# Binutils +set(BINUTILS_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/binutils) + +ExternalProject_Add( + binutils + SOURCE_DIR ${BINUTILS_SRC_DIR} + CONFIGURE_COMMAND + ${BINUTILS_SRC_DIR}/configure + --target=i586-kolibrios + --prefix=${SDK_TOOLCHAIN_DIR} + --with-sysroot=${SDK_SYSROOT_DIR} + --disable-werror + --disable-nls + --disable-intl + --disable-sim + --disable-gdb + --enable-shared + BUILD_COMMAND make -j${JOBS} + INSTALL_COMMAND make install-strip +) + +# GCC +set(GCC_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/gcc) + +ExternalProject_Add( + gcc + SOURCE_DIR ${GCC_SRC_DIR} + CONFIGURE_COMMAND + ${GCC_SRC_DIR}/configure + --target=i586-kolibrios + --with-sysroot=${SDK_SYSROOT_DIR} + --prefix=${SDK_TOOLCHAIN_DIR} + --disable-multilib + --disable-nls + --enable-shared + --enable-languages=c + BUILD_COMMAND + make -j${JOBS} all-gcc all-target-libgcc + INSTALL_COMMAND + make install-strip-gcc install-target-libgcc + DEPENDS + binutils +) + +add_dependencies(gcc copy-newlib-headers) + +# Copy kos-app.lds +add_custom_target(copy-kos-app-lds + COMMAND + ${CMAKE_COMMAND} -E copy + "${CMAKE_CURRENT_SOURCE_DIR}/kos-app.lds" + "${SDK_TOOLCHAIN_DIR}/i586-kolibrios/lib/" +) + +# Toolchain +add_custom_target(toolchain) +add_dependencies(toolchain gcc copy-kos-app-lds kos-crt-stub) diff --git a/libraries/kos-crt-stub/kos-app.lds b/toolchain/kos-app.lds similarity index 100% rename from libraries/kos-crt-stub/kos-app.lds rename to toolchain/kos-app.lds