From e1e4878d55d5a4f35f2aca1ae08128a3eec6b647 Mon Sep 17 00:00:00 2001 From: Eric-Paul Ickhorn Date: Fri, 19 Jan 2024 01:37:36 +0100 Subject: [PATCH] Added gitignore and wrote basic build script --- .gitignore | 12 +++ action.bash | 133 ++++++++++++++++++++++++++++ core/build-config/include_paths.txt | 3 + 3 files changed, 148 insertions(+) create mode 100644 .gitignore create mode 100644 action.bash create mode 100644 core/build-config/include_paths.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d3c00bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ + +# Complete folders that are unwanted in commits +*.build/ +*.local/ +*.vscode/ + +# Machine Code +*.a +*.dll +*.elf +*.exe +*.so diff --git a/action.bash b/action.bash new file mode 100644 index 0000000..868df84 --- /dev/null +++ b/action.bash @@ -0,0 +1,133 @@ + +cd $(dirname "$(pwd)/$0") +REPOSITORY_FOLDER=$(pwd) + + +PROJECT_NAME="maintree" +DEBUG_CC_OPTIONS="-g2 -Wall -Wextra -Wpedantic" +RELEASE_CC_OPTIONS="-O3 -Wall" + +MAIN_OBJECTS_FOLDER=".build/objects/" +CONFIG_FILE_INCLUDE_PATHS="build-config/include_paths.txt" + +function clone_dependencies { + echo "================ Cloning Dependencies! ================" + mkdir -p .build/depends/libRR + cd .build/depends/libRR/ + git clone --depth=1 https://git.nerdcult.net/libRR/Core/ + + cd "$REPOSITORY_FOLDER" +} + +function build_dependencies { + echo "================ Building Dependencies! ================" + + mkdir -p "$REPOSITORY_FOLDER/.build/output" + + cd .build/depends/libRR/Core/ + bash build.bash release + cp .build/libRR-Core.a "$REPOSITORY_FOLDER/.build/" + + cd "$REPOSITORY_FOLDER" +} + +function get_include_path_configuration { + MODULE_NAME=$1 + + INCLUDE_CONFIG_PATH="$REPOSITORY_FOLDER/$MODULE_NAME/$CONFIG_FILE_INCLUDE_PATHS" + INCLUDE_STATEMENTS="-I $REPOSITORY_FOLDER/$MODULE_NAME/inc-c/" + if [[ ! -f $INCLUDE_CONFIG_PATH ]] + then + return + fi + + for LINE in $(cat $INCLUDE_CONFIG_PATH) + do + INCLUDE_STATEMENTS="$INCLUDE_STATEMENTS -I \"$REPOSITORY_FOLDER/$LINE\"" + done +} + +function compile_module_c_sources { + MODULE_NAME=$1 + + get_include_path_configuration $MODULE_NAME + echo $INCLUDE_STATEMENTS + + MODULE_SOURCE_PATH="$REPOSITORY_FOLDER/$MODULE_NAME/src-c/" + MODULE_OBJECTS_FOLDER="$REPOSITORY_FOLDER/$MAIN_OBJECTS_FOLDER/$MODULE_NAME/" + mkdir -p $MODULE_OBJECTS_FOLDER + + # Loop through all files in the 'src-c'-folder and hand them over to GCC + + cd $MODULE_SOURCE_PATH + MODULE_SOURCES=$(find . -mindepth 1) + for SOURCE_FOLDER_ITEM in $MODULE_SOURCES + do + # Cut away the dot-slash given by 'find' as abbrevation for the working directory + RELATIVE_SOURCE_PATH=$(echo $SOURCE_FOLDER_ITEM | cut -c "3-") + + # If this folder item is a folder, it must be created as an + # output-folder for the object files to be placed in + + if [[ -d $RELATIVE_SOURCE_PATH ]] + then + mkdir -p "$MODULE_OBJECTS_FOLDER/$RELATIVE_SOURCE_PATH/" + continue + fi + + # Check if this is a C source file by checking the last 2 characters (the ending), + # and if it isn't, continue with the next file. + + LEN_SOURCE_FILE_NAME=${#RELATIVE_SOURCE_PATH} + let PENULTIMATE_OFFSET=$LEN_SOURCE_FILE_NAME-1 + LAST_2_CHARACTERS=$(echo $RELATIVE_SOURCE_PATH | cut -c "$PENULTIMATE_OFFSET-") + if [[ $LAST_2_CHARACTERS != ".c" ]]; then continue; fi + + # Status Message + echo "==> File: $RELATIVE_SOURCE_PATH" + + # Finally, call GCC to compile the C-file and let it place the file in the + # objects folder or one of the possible subfolders which now could exist. + + gcc -c $CC_OPTIONS -o \ + "$MODULE_OBJECTS_FOLDER/$RELATIVE_SOURCE_PATH.o" \ + "$MODULE_SOURCE_PATH/$RELATIVE_SOURCE_PATH" \ + $INCLUDE_STATEMENTS + done + + ar -rvs $REPOSITORY_FOLDER/.build/$PROJECT_NAME-$MODULE_NAME.a $MODULE_OBJECTS_FOLDER/* + cd $REPOSITORY_FOLDER +} + +function build_in_debug_profile { + echo "================ Building in Debug Profile! ================" + CC_OPTIONS=$DEBUG_CC_OPTIONS + compile_module_c_sources core +} + +function build_in_release_profile { + echo "================ Building in Release Profile! ================" + CC_OPTIONS=$RELEASE_CC_OPTIONS + compile_module_c_sources core +} + +case $1 in + "d" | "dbg" | "debug") + build_in_debug_profile + ;; + + "r" | "release") + build_in_release_profile + ;; + + "c" | "clone-dependencies") + clone_dependencies + ;; + + "b" | "build-dependencies") + build_dependencies + ;; + *) + echo "Unknown action." + ;; +esac diff --git a/core/build-config/include_paths.txt b/core/build-config/include_paths.txt new file mode 100644 index 0000000..45c9e10 --- /dev/null +++ b/core/build-config/include_paths.txt @@ -0,0 +1,3 @@ +core/exports/ +.build/depends/libRR/Core/core/exports/ +.build/depends/libRR/Core/platform/exports/ \ No newline at end of file