Kaltenberg/scripts/build.bash

110 lines
2.8 KiB
Bash
Executable File

#!/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