+1 (315) 557-6473 

Bash Script for Compiling C++ Source Files with GCC

This Bash script automates the compilation of C++ source files using GCC or Clang. It identifies source files in the current directory, applies compiler options like warning flags, and checks for a "Compliance_Workarounds.hpp" header for C++20 compliance. The script's functionality includes compiler selection, option assignment, and compilation. It provides a detailed list of source files to be compiled and displays the compiler's version. Upon successful compilation, it generates an executable. This script streamlines the C++ build process, making it adaptable to different compilers and ensuring C++20 compliance while enhancing code quality with various warning flags.

Streamlined C++ Compilation for Your Convenience

This Bash script, designed for your ease and efficiency, simplifies the compilation of C++ source files using either the GCC or Clang compiler. It offers a range of advanced features, including compiler selection, the integration of warning flags, and compatibility checks for C++20 compliance via the "Compliance_Workarounds.hpp" header. By automating complex compilation tasks, the script ensures code quality, making it a valuable resource to assist with your C++ assignment. Compile your projects effortlessly, saving time and effort, and produce high-quality executables with confidence.

Block 1: Clear Screen and Set Build Task Name

clear BuildTaskName="$1" echo -e "$BuildTaskName\n" # Build Title

This block clears the terminal screen, assigns the first argument passed to the script as the build task name, and prints the build title with a newline.

Block 2: Check for Compliance Helper File

complianceHelperFile_filename="Compliance_Workarounds.hpp" complianceHelperFile_path="./${complianceHelperFile_filename}" if [[ ! -f "${complianceHelperFile_path}" ]]; then complianceHelperFile_path="${0%/*}/${complianceHelperFile_filename}" if [[ ! -f "${complianceHelperFile_path}" ]]; then complianceHelperFile_path=/dev/null fi fi

This block defines the filename and path for a compliance helper header file. It checks if the header file exists in the current directory, and if not, it checks if the header file exists in the same directory as the script. If the file is not found in either location, it sets the compliance helper file path to "/dev/null," indicating that no helper file will be used.

Block 3: Find C++ Source Files

temp=$IFS IFS=$'\n' sourceFiles=( $(find -L ./ -path ./.* -prune -o -name "*.cpp" -print) ) IFS=$temp

This block temporarily changes the internal field separator (IFS) to a newline character and uses the "find" command to search for C++ source files (files with a ".cpp" extension) in or under the current directory. It populates an array named "sourceFiles" with the list of found source files while ignoring hidden folders (those starting with a dot).

Block 4: Display Source Files

echo "compiling in \"$PWD\" ..." for fileName in "${sourceFiles[@]}"; do echo " $fileName" done echo ""

This block prints the current working directory and the list of C++ source files to be compiled. It displays the path to each source file.

Block 5: Define Compiler Options

GccOptions=" -Wall -Wextra -pedantic \ -Wdelete-non-virtual-dtor \ -Wduplicated-branches \ -Wduplicated-cond \ -Wextra-semi \ -Wfloat-equal \ -Winit-self \ -Wlogical-op \ -Wnoexcept \ -Wshadow \ -Wnon-virtual-dtor \ -Wold-style-cast \ -Wstrict-null-sentinel \ -Wsuggest-override \ -Wswitch-default \ -Wswitch-enum \ -Woverloaded-virtual \ -Wuseless-cast "

This block defines a set of compiler warning flags and stores them in the "GccOptions" variable. These options are specific to the GCC compiler.

Block 6: Define Clang Compiler Options

ClangOptions=" -stdlib=libc++ -Weverything \ -Wno-comma \ -Wno-unused-template \ -Wno-sign-conversion \ -Wno-exit-time-destructors \ -Wno-global-constructors \ -Wno-missing-prototypes \ -Wno-weak-vtables \ -Wno-padded \ -Wno-double-promotion \ -Wno-c++98-compat-pedantic \ -Wno-c++11-compat-pedantic \ -Wno-c++14-compat-pedantic \ -Wno-c++17-compat-pedantic \ -Wno-c++20-compat-pedantic \ -fdiagnostics-show-category=name \ \ -Wno-zero-as-null-pointer-constant \ -Wno-ctad-maybe-unsupported "

Block 7: Define Common Compiler Options

CommonOptions="-pthread -std=c++20 -I./ -DUSING_TOMS_SUGGESTIONS -D__func__=__PRETTY_FUNCTION__

This block defines a set of common compiler options that are shared between both the GCC and Clang compilers. It includes options related to C++ standard, preprocessor directives, and other common flags.

Block 8: Determine Compiler Options Based on Compiler Selection

if [ $Compiler = 'clang++' ]; then options="$Options $CommonOptions $ClangOptions" elif [ $Compiler = 'g++' ]; then options="$Options $CommonOptions $GccOptions" fi

This block checks the value of the "Compiler" variable (which should be set elsewhere in the script) and assigns the appropriate compiler options based on the selected compiler (either Clang or GCC).

Block 9: Clear Screen and Set Build Task Name

echo $Compiler $options -include \"${complianceHelperFile_path}\" $Compiler –version $Compiler $options -include "${complianceHelperFile_path}" -o "$Executable" "${sourceFiles[@]}" && echo -e "\nSuccessfully created \"$Executable\""

This block compiles the C++ source files using the selected compiler and the options defined earlier. It also includes the compliance helper header file, if available. Finally, it outputs the compiler version and a success message upon successful compilation.


In conclusion, this Bash script emerges as an indispensable tool for streamlining your C++ compilation tasks, providing you with a convenient and efficient solution. Whether you opt for GCC or Clang, this script simplifies the process and bolsters code quality through the incorporation of advanced features and adherence to C++20 standards. It not only helps you meet your assignment requirements but also significantly reduces the time and effort needed for complex compilation tasks. Embrace this powerful automation tool to boost your productivity and produce high-quality executables effortlessly. By automating intricate compilation procedures and ensuring code compliance, this script empowers you to focus on the creative aspects of your C++ projects, confident in the reliability of your code.