#!/usr/bin/env bash CBUILD_VERSION=2.1.2 CONFIG_VERSION=7 PROJECT="GraphC" CMP_C="gcc" CMP_CPP="g++" STD_C="c11" STD_CPP="c++17" WARN_C="-Wall -Wno-discarded-qualifiers -Wextra -Wno-unused-parameter" WARN_CPP="-Wall -Wextra -Wno-unused-parameter" SRC_C="$(find src -name '*.c')" SRC_CPP="$(find src -name '*.cpp')" # Directory with dependency configs. # See cbuild/example_dependency_configs DEPENDENCY_CONFIGS_DIR='dependencies' # List of dependency config files in DEPENDENCY_CONFIGS_DIR separated by space. ENABLED_DEPENDENCIES='precompiled kerep imgui imnodes' # OBJDIR structure: # ├── objects/ - Compiled object files. Cleans on each call of build task # ├── static_libs/ - Symbolic links to static libraries used by linker. Cleans on each call of build task. # ├── static_libs/ - Symbolic links to dynamic libraries used by linker. Cleans on each call of build task. # └── profile/ - gcc *.gcda profiling info files OBJDIR="obj" OUTDIR="bin" STATIC_LIB_FILE="lib$PROJECT.a" # header include directories INCLUDE="-I./dependencies/imgui -I./dependencies/include/SDL2" # OS-specific options case "$OS" in WINDOWS) EXEC_FILE="$PROJECT.exe" SHARED_LIB_FILE="$PROJECT.dll" LINKER_LIBS="-lopengl32 -lpthread -lws2_32" ;; LINUX) EXEC_FILE="$PROJECT" SHARED_LIB_FILE="$PROJECT.so" LINKER_LIBS="-lSDL2 -lGL" ;; *) error "operating system $OS has no configuration variants" ;; esac # TASKS case "$TASK" in # writes ttf fonts fron ./fonts/ to C compressed arrays in C source files # builds static library from font arrays definitions embed_fonts) SRC_CPP="" SRC_C="" C_ARGS="-O0 -fpic" WARN_C="-Wno-unused-const-variable" CPP_ARGS="$C_ARGS" STATIC_LIB_FILE="fonts_embedded.a" TASK_SCRIPT=tasks/embed_fonts.sh ;; # creates executable using profile info generated by build_profile build_exec) # -flto applies more optimizations across object files # -flto=auto is needed to multithreaded copilation # -fuse-linker-plugin is required to use static libs with lto, it strips away all C_ARGS="-O2 -flto=auto -fuse-linker-plugin" #-fprofile-use -fprofile-prefix-path=$(realpath $OBJDIR)/objects CPP_ARGS="$C_ARGS" LINKER_ARGS="$CPP_ARGS $LINKER_LIBS" PRE_TASK_SCRIPT= TASK_SCRIPT=cbuild/default_tasks/build_exec.sh ;; # creates executable with debug info and no optimizations build_exec_dbg) C_ARGS="-O0 -g -DDEBUG=1" CPP_ARGS="$C_ARGS" LINKER_ARGS="$CPP_ARGS $LINKER_LIBS" PRE_TASK_SCRIPT= TASK_SCRIPT=cbuild/default_tasks/build_exec.sh ;; # executes $EXEC_FILE exec) TASK_SCRIPT=cbuild/default_tasks/exec.sh ;; # executes $EXEC_FILE with valgrind memory checker valgrind) VALGRIND_ARGS="-s --log-file=valgrind.log --read-var-info=yes --track-origins=yes --fullpath-after=$(pwd) --leak-check=full --show-leak-kinds=all" TASK_SCRIPT=cbuild/default_tasks/valgrind.sh ;; # generates profiling info profile) OUTDIR="$OUTDIR/profile" # -flto applies more optimizations across object files # -flto=auto is needed to multithreaded copilation # -fuse-linker-plugin is required to use static libs with lto # -pg adds code to executable, that generates file containing function call info (gmon.out) # -fprofile-generate generates executable with profiling code # -fprofile-prefix-path sets path where profiling info about objects will be saved C_ARGS="-O2 -flto=auto -fuse-linker-plugin -fprofile-generate -fprofile-prefix-path=$(realpath $OBJDIR)/objects" CPP_ARGS="$C_ARGS" LINKER_ARGS="$CPP_ARGS" PRE_TASK_SCRIPT= TASK_SCRIPT=cbuild/default_tasks/build_exec.sh POST_TASK_SCRIPT=cbuild/default_tasks/profile.sh ;; # compiles program with -pg and runs it with gprof # uses gprof2dot python script to generate function call tree (pip install gprof2dot) # requires graphviz (https://www.graphviz.org/download/source/) gprof) OUTDIR="$OUTDIR/gprof" # -pg adds code to executable, that generates file containing function call info (gmon.out) C_ARGS="-O2 -flto=auto -fuse-linker-plugin -pg" CPP_ARGS="$C_ARGS" LINKER_ARGS="$CPP_ARGS" PRE_TASK_SCRIPT= TASK_SCRIPT=cbuild/default_tasks/build_exec.sh POST_TASK_SCRIPT=cbuild/default_tasks/gprof.sh ;; # compiles executable with sanitizers and executes it to find errors and warnings sanitize) OUTDIR="$OUTDIR/sanitize" C_ARGS="-O0 -g3 -fsanitize=undefined,address" CPP_ARGS="$C_ARGS" LINKER_ARGS="$CPP_ARGS" PRE_TASK_SCRIPT= TASK_SCRIPT=cbuild/default_tasks/build_exec.sh POST_TASK_SCRIPT=cbuild/default_tasks/exec.sh ;; # compiles program and runs it with callgrind (part of valgrind) # uses gprof2dot python script to generate function call tree (pip install gprof2dot) # requires graphviz (https://www.graphviz.org/download/source/) # P.S. detailed results can be viewed in KCacheGrind callgrind) OUTDIR="$OUTDIR/callgrind" # -pg adds code to executable, that generates file containing function call info (gmon.out) C_ARGS="-O2 -flto=auto -fuse-linker-plugin" CPP_ARGS="$C_ARGS" LINKER_ARGS="$CPP_ARGS" PRE_TASK_SCRIPT= TASK_SCRIPT=cbuild/default_tasks/build_exec.sh POST_TASK_SCRIPT=cbuild/default_tasks/callgrind.sh ;; # deletes generated files clean) TASK_SCRIPT=cbuild/default_tasks/clean.sh POST_TASK_SCRIPT=tasks/clean_additions.sh ;; # nothing to do "" | no_task) ;; # unknown task *) error "task <$TASK> not found" ;; esac