Merge pull request #60 from jakcron/nstool-1.1

Update makefile & .gitignore
This commit is contained in:
Jack 2019-03-02 12:22:46 +08:00 committed by GitHub
commit d35449fc1c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 137 additions and 98 deletions

1
.gitignore vendored
View file

@ -2,6 +2,7 @@ bin/*
*.o *.o
*.a *.a
*.so.* *.so.*
.DS_Store
## Ignore Visual Studio temporary files, build results, and ## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons. ## files generated by popular Visual Studio add-ons.

View file

@ -7,7 +7,10 @@
### Using Makefile ### Using Makefile
* `make` (default) - Compile program * `make` (default) - Compile program
* Compiling the program requires local dependencies to be compiled via `make deps` beforehand
* `make clean` - Remove executable and object files * `make clean` - Remove executable and object files
* `make deps` - Compile locally included dependency libraries
* `make clean_deps` - Remove compiled library binaries and object files
## Native Win32 - Visual Studio ## Native Win32 - Visual Studio
### Requirements ### Requirements
@ -15,5 +18,5 @@
### Compiling NSTool ### Compiling NSTool
* Open `build/visualstudio/nstool.sln` in Visual Studio * Open `build/visualstudio/nstool.sln` in Visual Studio
* Select Target (e.g `Debug`|`Release` & `x64`) * Select Target (e.g `Debug`|`Release` & `x86`|`x64`)
* Navigate to `Build`->`Build Solution` * Navigate to `Build`->`Build Solution`

2
deps/libfnd vendored

@ -1 +1 @@
Subproject commit 8cdd41b13ed369638583f733b3f60494525976ff Subproject commit a3da67f8bcbf794e3689b0496695a249e323b6e8

2
deps/liblz4 vendored

@ -1 +1 @@
Subproject commit c50865c96a87a86b8429e3b08a7c6e39e56e2815 Subproject commit 1dbb4a7988f91f0dbe854cb841b4ad5cdaff912e

2
deps/libnintendo-es vendored

@ -1 +1 @@
Subproject commit c294d8b81eda7f5cf75bb58f725d4b3c9189bc92 Subproject commit 5b46763f7c35111bc67406ecadb4381436aa62b8

@ -1 +1 @@
Subproject commit 67a4242a76aaf1d4c7d40c7c3b1b1f7a640a77ba Subproject commit 71f5f5d9488bf24ee3c9196911880c5ecda7c0cc

@ -1 +1 @@
Subproject commit ff5570e7642d4eadadf2b09c49e5b926cae9f4c0 Subproject commit dc434e4605476c40f584e6e98f54fdd980eba2eb

@ -1 +1 @@
Subproject commit add0fddabea63a32248ae16b75d8dfb8bfda16a5 Subproject commit 509300a121626a9221f2d8af42a06723481ebf33

2
deps/libpolarssl vendored

@ -1 +1 @@
Subproject commit 374b573ea76e42bd07dd7cf983778eb7be8bb522 Subproject commit 6573a1bd54a6a13bd468c6e17e631332eaff4449

207
makefile
View file

@ -1,90 +1,103 @@
# Project Defines # C++/C Recursive Project Makefile
# (c) Jack
# Version 3
# Project Name
PROJECT_NAME = nstool PROJECT_NAME = nstool
# Project Relative Paths
PROJECT_PATH = $(CURDIR) PROJECT_PATH = $(CURDIR)
PROJECT_SRC_PATH = ./src PROJECT_SRC_PATH = src
PROJECT_INCLUDE_PATH = PROJECT_SRC_SUBDIRS = $(PROJECT_SRC_PATH)
PROJECT_TEST_PATH = #PROJECT_INCLUDE_PATH = include
PROJECT_BIN_PATH = ./bin #PROJECT_TESTSRC_PATH = test
PROJECT_DOCS_PATH = #PROJECT_TESTSRC_SUBDIRS = $(PROJECT_TESTSRC_PATH)
PROJECT_DOXYFILE_PATH = PROJECT_BIN_PATH = bin
#PROJECT_DOCS_PATH = docs
#PROJECT_DOXYFILE_PATH = Doxyfile
# Project Library Defines # Determine if the root makefile has been established, and if not establish this makefile as the root makefile
PROJECT_LIB_VER_MAJOR = 0
PROJECT_LIB_VER_MINOR = 1
PROJECT_LIB_VER_PATCH = 0
PROJECT_SONAME = $(PROJECT_NAME).so.$(PROJECT_LIB_VER_MAJOR)
PROJECT_SO_FILENAME = $(PROJECT_SONAME).$(PROJECT_LIB_VER_MINOR).$(PROJECT_LIB_VER_PATCH)
# Project Dependencies
PROJECT_DEPEND = nintendo-hac-hb nintendo-hac nintendo-es nintendo-pki fnd polarssl lz4
# Check if this is the root makefile
ifeq ($(ROOT_PROJECT_NAME),) ifeq ($(ROOT_PROJECT_NAME),)
export ROOT_PROJECT_NAME = $(PROJECT_NAME) export ROOT_PROJECT_NAME = $(PROJECT_NAME)
export ROOT_PROJECT_PATH = $(PROJECT_PATH) export ROOT_PROJECT_PATH = $(PROJECT_PATH)
export ROOT_PROJECT_DEPENDENCY_PATH = $(ROOT_PROJECT_PATH)/deps export ROOT_PROJECT_DEPENDENCY_PATH = $(ROOT_PROJECT_PATH)/deps
endif endif
# Compiler Flags # Shared Library Definitions
PROJECT_SO_VER_MAJOR = 0
PROJECT_SO_VER_MINOR = 1
PROJECT_SO_VER_PATCH = 0
PROJECT_SONAME = $(PROJECT_NAME).so.$(PROJECT_SO_VER_MAJOR)
PROJECT_SO_FILENAME = $(PROJECT_SONAME).$(PROJECT_SO_VER_MINOR).$(PROJECT_SO_VER_PATCH)
# Project Dependencies
PROJECT_DEPEND_LOCAL = nintendo-hac-hb nintendo-hac nintendo-es nintendo-pki fnd polarssl lz4
PROJECT_DEPEND_EXTERNAL =
# Generate compiler flags for including project include path
ifneq ($(PROJECT_INCLUDE_PATH),) ifneq ($(PROJECT_INCLUDE_PATH),)
INC += -I"$(PROJECT_INCLUDE_PATH)" INC += -I"$(PROJECT_INCLUDE_PATH)"
endif endif
ifneq ($(PROJECT_DEPEND),)
LIB += $(foreach dep,$(PROJECT_DEPEND), -L"$(ROOT_PROJECT_DEPENDENCY_PATH)/lib$(dep)/bin" -l$(dep)) # Generate compiler flags for local included dependencies
INC += $(foreach dep,$(PROJECT_DEPEND), -I"$(ROOT_PROJECT_DEPENDENCY_PATH)/lib$(dep)/include") ifneq ($(PROJECT_DEPEND_LOCAL),)
LIB += $(foreach dep,$(PROJECT_DEPEND_LOCAL), -L"$(ROOT_PROJECT_DEPENDENCY_PATH)/lib$(dep)/bin" -l$(dep))
INC += $(foreach dep,$(PROJECT_DEPEND_LOCAL), -I"$(ROOT_PROJECT_DEPENDENCY_PATH)/lib$(dep)/include")
endif endif
CXXFLAGS = -std=c++11 $(INC) -fPIC -D__STDC_FORMAT_MACROS -Wall -Wno-unused-value
CFLAGS = -std=c11 $(INC) -fPIC -Wall -Wno-unused-value # Generate compiler flags for external dependencies
ARFLAGS = cr -o ifneq ($(PROJECT_DEPEND_EXTERNAL),)
LIB += $(foreach dep,$(PROJECT_DEPEND_EXTERNAL), -l$(dep))
endif
# Detect Platform
ifeq ($(PROJECT_PLATFORM),)
ifeq ($(OS), Windows_NT) ifeq ($(OS), Windows_NT)
# Windows Only Flags/Libs export PROJECT_PLATFORM = WIN32
CC = x86_64-w64-mingw32-gcc
CXX = x86_64-w64-mingw32-g++
CFLAGS += -Wno-unused-but-set-variable
CXXFLAGS += -Wno-unused-but-set-variable
LIB += -static
else else
UNAME = $(shell uname -s) UNAME = $(shell uname -s)
ifeq ($(UNAME), Darwin) ifeq ($(UNAME), Darwin)
# MacOS Only Flags/Libs export PROJECT_PLATFORM = MACOS
CFLAGS += -Wno-unused-private-field
CXXFLAGS += -Wno-unused-private-field
LIB +=
ARFLAGS = rc
else else
# *nix Only Flags/Libs export PROJECT_PLATFORM = GNU
CFLAGS += -Wno-unused-but-set-variable
CXXFLAGS += -Wno-unused-but-set-variable
LIB +=
endif endif
endif endif
ifeq ($(OS),Windows_NT)
# Windows Only Flags/Libs
CC = x86_64-w64-mingw32-gcc
CXX = x86_64-w64-mingw32-g++
CFLAGS += -Wno-unused-but-set-variable
CXXFLAGS += -Wno-unused-but-set-variable
LIBS += -static
else
UNAME = $(shell uname -s)
ifeq ($(UNAME), Darwin)
# MacOS Only Flags/Libs
CFLAGS += -Wno-unused-private-field
CXXFLAGS += -Wno-unused-private-field
LIBS +=
else
# *nix Only Flags/Libs
CFLAGS += -Wno-unused-but-set-variable
CXXFLAGS += -Wno-unused-but-set-variable
LIBS +=
endif
endif endif
# Generate platform specific compiler flags
ifeq ($(PROJECT_PLATFORM), WIN32)
# Windows Flags/Libs
CC = x86_64-w64-mingw32-gcc
CXX = x86_64-w64-mingw32-g++
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable
INC +=
LIB += -static
ARFLAGS = cr -o
else ifeq ($(PROJECT_PLATFORM), GNU)
# GNU/Linux Flags/Libs
#CC =
#CXX =
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable
INC +=
LIB +=
ARFLAGS = cr -o
else ifeq ($(PROJECT_PLATFORM), MACOS)
# MacOS Flags/Libs
#CC =
#CXX =
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-private-field
INC +=
LIB +=
ARFLAGS = rc
endif
# Compiler Flags
CXXFLAGS = -std=c++11 $(INC) $(WARNFLAGS) -fPIC
CFLAGS = -std=c11 $(INC) $(WARNFLAGS) -fPIC
# Object Files # Object Files
SRC_DIR = $(PROJECT_SRC_PATH) SRC_OBJ = $(foreach dir,$(PROJECT_SRC_SUBDIRS),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) $(foreach dir,$(PROJECT_SRC_SUBDIRS),$(subst .c,.o,$(wildcard $(dir)/*.c)))
SRC_OBJ = $(foreach dir,$(SRC_DIR),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) TESTSRC_OBJ = $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS),$(subst .c,.o,$(wildcard $(dir)/*.c)))
TEST_DIR = $(PROJECT_TEST_PATH)
TEST_OBJ = $(foreach dir,$(TEST_DIR),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp)))
# all is the default, user should specify what the default should do # all is the default, user should specify what the default should do
# - 'static_lib' for building static library # - 'static_lib' for building static library
@ -94,49 +107,71 @@ TEST_OBJ = $(foreach dir,$(TEST_DIR),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp)))
# These can typically be used together however *_lib and program should not be used together # These can typically be used together however *_lib and program should not be used together
all: program all: program
clean: clean_objs clean_bin_dir clean: clean_object_files remove_binary_dir
# Object Compile Rules
%.o: %.c
@echo CC $<
@$(CC) $(CFLAGS) -c $< -o $@
%.o: %.cpp
@echo CXX $<
@$(CXX) $(CXXFLAGS) -c $< -o $@
# Binary Directory # Binary Directory
.PHONY: bin_dir .PHONY: create_binary_dir
bin_dir: create_binary_dir:
@mkdir -p "$(PROJECT_BIN_PATH)" @mkdir -p "$(PROJECT_BIN_PATH)"
.PHONY: clean_bin_dir .PHONY: remove_binary_dir
clean_bin_dir: remove_binary_dir:
ifneq ($(PROJECT_BIN_PATH),)
@rm -rf "$(PROJECT_BIN_PATH)" @rm -rf "$(PROJECT_BIN_PATH)"
endif
.PHONY: clean_objs .PHONY: clean_object_files
clean_objs: clean_object_files:
@rm -f $(SRC_OBJ) $(TEST_OBJ) @rm -f $(SRC_OBJ) $(TESTSRC_OBJ)
# Build Library # Build Library
static_lib: $(SRC_OBJ) bin_dir static_lib: $(SRC_OBJ) create_binary_dir
ar $(ARFLAGS) "$(PROJECT_BIN_PATH)/$(PROJECT_NAME).a" $(SRC_OBJ) @echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME).a
@ar $(ARFLAGS) "$(PROJECT_BIN_PATH)/$(PROJECT_NAME).a" $(SRC_OBJ)
shared_lib: $(SRC_OBJ) bin_dir shared_lib: $(SRC_OBJ) create_binary_dir
gcc -shared -Wl,-soname,$(PROJECT_SONAME) -o "$(PROJECT_BIN_PATH)/$(PROJECT_SO_FILENAME)" $(SRC_OBJ) @echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_SO_FILENAME)
@gcc -shared -Wl,-soname,$(PROJECT_SONAME) -o "$(PROJECT_BIN_PATH)/$(PROJECT_SO_FILENAME)" $(SRC_OBJ)
# Build Program # Build Program
program: $(SRC_OBJ) bin_dir program: $(SRC_OBJ) create_binary_dir
$(CXX) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)" @echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME)
@$(CXX) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)"
# Build Test Program # Build Test Program
test_program: $(TEST_OBJ) $(SRC_OBJ) bin_dir test_program: $(TESTSRC_OBJ) $(SRC_OBJ) create_binary_dir
$(CXX) $(TEST_OBJ) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test" ifneq ($(PROJECT_TESTSRC_PATH),)
@echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test
@$(CXX) $(TESTSRC_OBJ) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test"
endif
# Documentation # Documentation
.PHONY: docs
docs: docs:
doxygen $(PROJECT_DOXYFILE_PATH) ifneq ($(PROJECT_DOCS_PATH),)
doxygen "$(PROJECT_DOXYFILE_PATH)"
endif
.PHONY: clean_docs .PHONY: clean_docs
clean_docs: clean_docs:
@rm -rf $(PROJECT_DOCS_PATH) ifneq ($(PROJECT_DOCS_PATH),)
@rm -rf "$(PROJECT_DOCS_PATH)"
endif
# Dependencies # Dependencies
.PHONY: build_deps .PHONY: deps
build_deps: deps:
@$(foreach lib,$(PROJECT_DEPEND), cd $(ROOT_PROJECT_DEPENDENCY_PATH)/lib$(lib) && $(MAKE) static_lib && cd $(PROJECT_PATH);) @$(foreach lib,$(PROJECT_DEPEND_LOCAL), cd "$(ROOT_PROJECT_DEPENDENCY_PATH)/lib$(lib)" && $(MAKE) static_lib && cd "$(PROJECT_PATH)";)
.PHONY: clean_deps .PHONY: clean_deps
clean_deps: clean_deps:
@$(foreach lib,$(PROJECT_DEPEND), cd $(ROOT_PROJECT_DEPENDENCY_PATH)/lib$(lib) && $(MAKE) clean && cd $(PROJECT_PATH);) @$(foreach lib,$(PROJECT_DEPEND_LOCAL), cd "$(ROOT_PROJECT_DEPENDENCY_PATH)/lib$(lib)" && $(MAKE) clean && cd "$(PROJECT_PATH)";)