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 0000000..e38c277 Binary files /dev/null and b/build/linux-86_64/tetris_clone differ diff --git a/makefile b/makefile new file mode 100644 index 0000000..7a65bd6 --- /dev/null +++ b/makefile @@ -0,0 +1,41 @@ +NAME = sdl_template + +# compiler settings +CC := clang +CFLAGS = $(shell pkg-config --cflags sdl2) -Wall -g +LDFLAGS = $(shell pkg-config --libs sdl2) -lm + +# file locations +DIR_BIN := bin +DIR_OBJ := obj +SRC = $(wildcard src/*.c) $(wildcard src/**/*.c) $(wildcard src/**/**/*.c) $(wildcard src/**/**/**/*.c) $(wildcard src/**/**/**/**/*.c) +OBJ = $(patsubst src/%,$(DIR_OBJ)/$(ARCH)/%,$(SRC:.c=.o)) +TARGET = $(DIR_BIN)/$(ARCH)/$(NAME)$(EXT) + +# sets the variables for the different targets +linux-x86_64: + $(MAKE) build ARCH=linux-x86_64 CFLAGS="$(CFLAGS) -target x86_64-pc-linux-gnu" +win-x86_64: + $(MAKE) build ARCH=win-x86-64 CFLAGS="$(CFLAGS) -target x86_64-pc-windows-gnu" EXT=".exe" +web: + $(MAKE) build ARCH=web CC=emcc EXT=".html" + +all: linux-x86_64 win-x86_64 web + +clean: + rm -rf $(DIR_BIN) $(DIR_OBJ) + +build: dirs binary + +# creates the binary +binary: $(OBJ) + $(CC) -o $(TARGET) $^ $(CFLAGS) $(LDFLAGS) + +# creates the object files, include a flag for no unused command line arguments, because in this context it's unneeded +$(DIR_OBJ)/$(ARCH)/%.o: src/%.c + mkdir -p $(dir $@) + $(CC) -o $@ -c $< $(CFLAGS) $(LDFLAGS) -Wno-unused-command-line-argument + +dirs: + mkdir -p $(DIR_BIN)/$(ARCH) + mkdir -p $(DIR_OBJ)/$(ARCH)