#!/usr/bin/env bash cd $(dirname $0) SCRIPT_PATH=$(pwd) cd .. PROJECT_PATH=$(pwd) function list_modules() { MODULE_FOLDER=$1 MODULES=$(ls $MODULE_FOLDER) for MODULE in $MODULES do if [[ -d "$MODULE_FOLDER/$MODULE/src-c" ]]; then echo $MODULE fi done } function make_object_name() { SOURCE_PATH=$1 OBJECT_NAME=$(echo $SOURCE_PATH | tr "-" "_" | tr "/" "-") echo $OBJECT_NAME.o } function list_sources() { MODULE_PATH=$1 ENTRY_PATH=$(pwd) cd $MODULE_PATH SOURCES=$(find . -type f | grep ".c$") for SOURCE in $SOURCES do echo $SOURCE | cut -c 3- done cd $ENTRY_PATH } function build_dependencies() { SOURCES=$(list_sources $PROJECT_PATH/dependencies/src-c) mkdir -p .build/dependencies rm -f .build/dependencies/*.o for SOURCE in $SOURCES do OBJECT_NAME=$(make_object_name $SOURCE) gcc -c -o $PROJECT_PATH/.build/dependencies/$OBJECT_NAME \ $PROJECT_PATH/dependencies/src-c/$SOURCE \ -I $PROJECT_PATH/dependencies/inc-c done ar -rvs $PROJECT_PATH/.build/archives/voxula-dependencies.a $PROJECT_PATH/.build/dependencies/*.o } function make_include_statements() { MODULE_NAME=$1 for INCLUDE_PATH in $(cat modules/$MODULE_NAME/includes.txt) do MODIFIED_PATH="${INCLUDE_PATH//"{module}"/"$PROJECT_PATH/modules/$MODULE_NAME"}" MODIFIED_PATH="${MODIFIED_PATH//"{module-folder}"/"$PROJECT_PATH/modules"}" echo "-I ${MODIFIED_PATH//"{dependencies}"/"$PROJECT_PATH/dependencies"}" done } function build_single_module() { MODULE_NAME=$1 mkdir -p $PROJECT_PATH/.build/modules/$MODULE_NAME/objects rm -f $PROJECT_PATH/.build/modules/$MODULE_NAME/objects/*.o echo "| ========================================>" echo "| Now building module: $MODULE_NAME" echo "| ========================================>" INCLUDE_STATEMENTS=$(make_include_statements $MODULE_NAME) SOURCES=$(list_sources modules/$MODULE_NAME/src-c) for SOURCE in $SOURCES do echo "> $SOURCE" OBJECT_NAME=$(make_object_name $SOURCE) gcc -c -o .build/modules/$MODULE_NAME/objects/$OBJECT_NAME \ -g3 -Wall -Wextra -Wpedantic \ modules/$MODULE_NAME/src-c/$SOURCE $INCLUDE_STATEMENTS done if [[ $(ls .build/modules/$MODULE_NAME/objects/ | grep ".o$") == "" ]]; then echo "> Empty Module, not creating archive." echo " " return fi ar -rvs .build/archives/voxula-$MODULE_NAME.a .build/modules/$MODULE_NAME/objects/*.o echo " " } mkdir -p .build/archives rm -f .build/archives/*.a build_dependencies MODULE_LIST=$(list_modules "modules") for MODULE in $MODULE_LIST do build_single_module $MODULE done gcc -g3 -o voxula .build/archives/*.a .build/archives/*.a -lSDL2 -lGL