From 9362cb092c1989cea9530c2ea019f537fb5259f7 Mon Sep 17 00:00:00 2001 From: Quinn Date: Sun, 19 Jan 2025 19:22:16 +0100 Subject: [PATCH] update template to use makefile --- .gitignore | 5 ++- .vscode/launch.json | 32 +++++---------- .vscode/tasks.json | 35 ++++++++-------- build.sh | 71 --------------------------------- build/linux-86_64/assets/uwu | 1 + build/linux-86_64/tetris_clone | Bin 0 -> 49520 bytes makefile | 41 +++++++++++++++++++ 7 files changed, 74 insertions(+), 111 deletions(-) delete mode 100755 build.sh create mode 100644 build/linux-86_64/assets/uwu create mode 100755 build/linux-86_64/tetris_clone create mode 100644 makefile diff --git a/.gitignore b/.gitignore index 2575ab0..aa4e436 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ +.cache .vscode/* !.vscode/tasks.json !.vscode/launch.json -build +bin +obj +compile_commands.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 0258d4f..797639f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -2,30 +2,20 @@ "version": "2.0.0", "configurations": [ { - "name": "(gdb) C Launch", - "type": "cppdbg", + "name": "(lldb) C Launch", + "type": "lldb", "request": "launch", - "program": "${workspaceFolder}/build/linux-86_64/${workspaceFolderBasename}", + "program": "", + "linux": { + "program": "${workspaceFolder}/bin/linux-x86_64/sdl_template", + "preLaunchTask": "build linux-x86_64" + }, + "windows": { + "program": "${workspaceFolder}/bin/win-x86_64/sdl_template", + "preLaunchTask": "build win-x86_64" + }, "args": [], - "stopAtEntry": false, "cwd": "${workspaceFolder}", - "environment": [], - "externalConsole": false, - "miDebuggerPath": "/usr/bin/gdb", - "MIMode": "gdb", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - }, - { - "description": "Set Disassembly Flavor to Intel", - "text": "-gdb-set disassembly-flavor intel", - "ignoreFailures": true - } - ], - "preLaunchTask": "build linux86_64" } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 01d44c5..cdbd550 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,18 +1,16 @@ { + "version": "2.0.0", "tasks": [ { "type": "shell", - "label": "build linux86_64", - "command": "./build.sh", + "label": "build linux-x86_64", + "command": "make", "args": [ - "linux86_64" + "linux-x86_64" ], "options": { "cwd": "${workspaceFolder}" }, - "problemMatcher": [ - "$gcc" - ], "group": { "kind": "build", "isDefault": true @@ -21,17 +19,14 @@ }, { "type": "shell", - "label": "build win86_64", - "command": "./build.sh", + "label": "build win-x86_64", + "command": "make", "args": [ - "win86_64" + "win-x86_64" ], "options": { "cwd": "${workspaceFolder}" }, - "problemMatcher": [ - "$gcc" - ], "group": { "kind": "build", "isDefault": false @@ -41,22 +36,26 @@ { "type": "shell", "label": "build web", - "command": "./build.sh", + "command": "make", "args": [ "web" ], "options": { "cwd": "${workspaceFolder}" }, - "problemMatcher": [ - "$gcc" - ], "group": { "kind": "build", "isDefault": false }, "detail": "builds the program for web using emscripten" + }, + { + "label": "create compile_commands.json", + "type": "shell", + "command": "bear -- make", + "runOptions": { + "runOn": "folderOpen" + } } - ], - "version": "2.0.0" + ] } diff --git a/build.sh b/build.sh deleted file mode 100755 index 756d52f..0000000 --- a/build.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -# define variables -PROJECT_NAME=${PWD##*/} -BUILD_DIR="./build" -INCLUDE_IN_BUILD="./assets" - -# compilation targets -args_linux86_64() -{ - ARCHITECTURE="linux-86_64" - COMPILER="/bin/gcc" - ARGS="-lSDL2" - FILE_EXSTENSION="" -} - -args_win86-64() -{ - ARCHITECTURE="win-86_64" - COMPILER="/usr/bin/x86_64-w64-mingw32-gcc" - ARGS="-lmingw32 -lSDL2main -lSDL2 -mwindows" - INCLUDE_IN_BUILD="$INCLUDE_IN_BUILD /usr/x86_64-w64-mingw32/bin/SDL2.dll" - FILE_EXSTENSION=".exe" -} - -args_emscripten() -{ - ARCHITECTURE="web" - COMPILER="emcc" # just make sure it's in $PATH (it's a pain to install) - ARGS="-s USE_SDL=2" - FILE_EXSTENSION=".html" -} - -# handle arguments -if [ "$1" = "linux86_64" ]; then args_linux86_64 -elif [ "$1" = "win86_64" ]; then args_win86-64 -elif [ "$1" = "web" ]; then args_emscripten -else echo -e "\033[91mdidn't include any arguments! D:\033[0m" && exit 1 -fi - -# check whether $BUILD_DIR or $ARCHITECTURE isn't set -if [[ -z $BUILD_DIR ]] || [[ -z "$ARCHITECTURE" ]]; then - echo -e "\033[91mBUILD_DIR or ARCHITECTURE not set D:\033[0m" - exit 1 -fi - - -# make (and clear) the build directory -mkdir -p "$BUILD_DIR/$ARCHITECTURE" -rm -rf "${BUILD_DIR:?}/$ARCHITECTURE/*" - -# copy included files or directories to the build directory -if [[ -n $INCLUDE_IN_BUILD ]]; then - cp -r "$INCLUDE_IN_BUILD" "$BUILD_DIR/$ARCHITECTURE" -fi - -# get the executable path -EXE_PATH=$BUILD_DIR/$ARCHITECTURE/$PROJECT_NAME$FILE_EXSTENSION -echo "building at: $EXE_PATH" - -# check whether the compiler can actually be executed -if [ ! -x "$COMPILER" ] && ! command -v "$COMPILER" > /dev/null; then - echo -e "\033[91mCouldn't find an executable at path: \033[0m $COMPILER" - exit 1 -fi - -# compile the code -COMMAND="$COMPILER $(find ./src -name "*.c") -o $EXE_PATH -Wall -g -lm $ARGS" -echo "using command: $COMMAND" -$COMMAND -exit $? diff --git a/build/linux-86_64/assets/uwu b/build/linux-86_64/assets/uwu new file mode 100644 index 0000000..e108e50 --- /dev/null +++ b/build/linux-86_64/assets/uwu @@ -0,0 +1 @@ +uwu diff --git a/build/linux-86_64/tetris_clone b/build/linux-86_64/tetris_clone new file mode 100755 index 0000000000000000000000000000000000000000..e38c277a5d055002bb81dee01e87459a1e9ebbb9 GIT binary patch literal 49520 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