From 90f95391b3e8340e4eca779c85c244312eb979ba Mon Sep 17 00:00:00 2001 From: Alexander Patel Date: Thu, 17 Jun 2021 00:47:33 -0700 Subject: [PATCH] Makefile: compile objects individually, then link This commit updates the Makefile to complile each .c source file into an object before linking. The benefit of this is that only the necessary files will be recompiled when modifying the code. We also move the Makefile and build.bat up to the root directory of the repo. This is so that calling make directly builds the binaries. Both files are updated to adapt to the new directory structure. With this change, initial build times are increased from ~3s to ~10s on my machine. However, subsequent build times are improved. As a result of this change, SConstruct is somewhat deprecated. We can update this as well if necessary in a future change. I verified that the build completes successfully and tests pass for both ubuntu and windows 10. A future change could compile src/ files into a static library to be linked with cli/, if necessary. Issue: #64 --- .github/workflows/build.yml | 7 ++-- .gitignore | 3 +- Makefile | 59 ++++++++++++++++++++++++++++++++++ build/SConstruct => SConstruct | 0 build/build.bat => build.bat | 4 +-- build/.gitignore | 5 --- build/Makefile | 22 ------------- 7 files changed, 65 insertions(+), 35 deletions(-) create mode 100644 Makefile rename build/SConstruct => SConstruct (100%) rename build/build.bat => build.bat (98%) delete mode 100644 build/.gitignore delete mode 100644 build/Makefile diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9b6cb1c..400701c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,8 +19,7 @@ jobs: - uses: actions/checkout@v2 - name: Run the Makefile. run: | - cd build - make + make all - name: Run tests. run: | python3 tests/tests.py @@ -32,7 +31,6 @@ jobs: - uses: actions/checkout@v2 - name: Run build batch script. run: | - cd build cmd /c build.bat - name: Run tests. run: | @@ -45,8 +43,7 @@ jobs: - uses: actions/checkout@v2 - name: Run the Makefile. run: | - cd build - make + make all - name: Run tests. run: | python3 tests/tests.py diff --git a/.gitignore b/.gitignore index 7ab78ce..1fcc62b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,9 @@ # PocketLang ignore list .vs/ .vscode/ +build/ -# It's a convinent batch scrpit to run pyton script +# It's a convinent batch script to run pyton script # changing directory and run another script. # Which are compile wasm and generate pages. docs/build.bat diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..05ee0f4 --- /dev/null +++ b/Makefile @@ -0,0 +1,59 @@ + +# ## Copyright (c) 2020-2021 Thakee Nathees +# ## Distributed Under The MIT License + +CC = gcc +CFLAGS = -fPIC -Wno-int-to-pointer-cast +DEBUG_CFLAGS = -D DEBUG -g3 -Og +RELEASE_CFLAGS = -g -O3 +LDFLAGS = -lm + +TARGET_EXEC = pocket +BUILD_DIR = ./build + +SRC_DIRS = ./src ./cli +INC_DIRS = ./src/include + +SRCS := $(shell find $(SRC_DIRS) -maxdepth 1 -name *.c) +OBJS := $(SRCS:.c=.o) +DEPS := $(OBJS:.o=.d) + +INC_FLAGS := $(addprefix -I,$(INC_DIRS)) +DEP_FLAGS = -MMD -MP +CC_FLAGS = $(INC_FLAGS) $(DEP_FLAGS) $(CFLAGS) + +DEBUG_DIR = $(BUILD_DIR)/debug +DEBUG_TARGET = $(DEBUG_DIR)/$(TARGET_EXEC) +DEBUG_OBJS := $(addprefix $(DEBUG_DIR)/, $(OBJS)) + +RELEASE_DIR = $(BUILD_DIR)/release +RELEASE_TARGET = $(RELEASE_DIR)/$(TARGET_EXEC) +RELEASE_OBJS := $(addprefix $(RELEASE_DIR)/, $(OBJS)) + +.PHONY: debug release all clean + +# default; target if run as `make` +debug: $(DEBUG_TARGET) + +$(DEBUG_TARGET): $(DEBUG_OBJS) + $(CC) $^ -o $@ $(LDFLAGS) + +$(DEBUG_DIR)/%.o: %.c + @mkdir -p $(dir $@) + $(CC) $(CC_FLAGS) $(DEBUG_CFLAGS) -c $< -o $@ + +release: $(RELEASE_TARGET) + +$(RELEASE_TARGET): $(RELEASE_OBJS) + $(CC) $^ -o $@ $(LDFLAGS) + +$(RELEASE_DIR)/%.o: %.c + @mkdir -p $(dir $@) + $(CC) $(CC_FLAGS) $(RELEASE_CFLAGS) -c $< -o $@ + +all: debug release + +clean: + rm -rf $(BUILD_DIR) + +-include $(DEPS) diff --git a/build/SConstruct b/SConstruct similarity index 100% rename from build/SConstruct rename to SConstruct diff --git a/build/build.bat b/build.bat similarity index 98% rename from build/build.bat rename to build.bat index 2027891..a81529c 100644 --- a/build/build.bat +++ b/build.bat @@ -95,11 +95,11 @@ set root_dir=..\..\..\ if "%debug_build%"=="false" ( set cflags=%cflags% -O2 -MD - set target_dir=release\ + set target_dir=build\release\ ) else ( set cflags=%cflags% -MDd -ZI set addnl_cdefines=%addnl_cdefines% /DDEBUG - set target_dir=debug\ + set target_dir=build\debug\ ) if "%shared_lib%"=="true" ( diff --git a/build/.gitignore b/build/.gitignore deleted file mode 100644 index 00f78a2..0000000 --- a/build/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -* -!.gitignore -!SConstruct -!build.bat -!Makefile diff --git a/build/Makefile b/build/Makefile deleted file mode 100644 index 4de14f2..0000000 --- a/build/Makefile +++ /dev/null @@ -1,22 +0,0 @@ - -## Copyright (c) 2020-2021 Thakee Nathees -## Distributed Under The MIT License - -CC = gcc -CFLAGS = -lm -fPIC -Wno-int-to-pointer-cast -INCLUDE_DIR = -I../src/include -SOURCES = ../cli/*.c ../src/*.c - -all: debug - -debug: - @mkdir -p debug/ - $(CC) -o debug/pocket $(SOURCES) $(INCLUDE_DIR) $(CFLAGS) -D DEBUG -g3 -Og - -release: - @mkdir -p release/ - $(CC) -o release/pocket $(SOURCES) $(INCLUDE_DIR) $(CFLAGS) -g -O3 - -clean: - rm -rf debug/ - rm -rf release/