Update makefiles and build instructions.

This commit is contained in:
jakcron 2019-02-17 15:17:52 +08:00
parent bccb693595
commit 810b3545be
9 changed files with 209 additions and 168 deletions

View file

@ -1,19 +1,22 @@
# Building # Building
## Linux (incl. Windows Subsystem for Linux) & MacOS - Makefile ## Linux (incl. Windows Subsystem for Linux) & MacOS - Makefile
### Requirements ### Requirements
* `make` * `make`
* Terminal access * Terminal access
* Typical GNU compatible development tools (e.g. `clang`, `g++`, `c++`, `ar` etc) with __C++11__ support * Typical GNU compatible development tools (e.g. `clang`, `g++`, `c++`, `ar` etc) with __C++11__ support
### Using Makefile ### Using Makefile
* `make` (default) - Compile program * `make` (default) - Compile program
* `make clean` - Remove executable and object files * Compiling the program requires local dependencies to be compiled via `make deps` beforehand
* `make clean` - Remove executable and object files
## Native Win32 - Visual Studio * `make deps` - Compile locally included dependency libraries
### Requirements * `make clean_deps` - Remove compiled library binaries and object files
* [Visual Studio Community](https://visualstudio.microsoft.com/vs/community/) 2015 or 2017
## Native Win32 - Visual Studio
### Compiling NSTool ### Requirements
* Open `build/visualstudio/nstool.sln` in Visual Studio * [Visual Studio Community](https://visualstudio.microsoft.com/vs/community/) 2015 or 2017
* Select Target (e.g `Debug`|`Release` & `x64`)
* Navigate to `Build`->`Build Solution` ### Compiling NSTool
* Open `build/visualstudio/nstool.sln` in Visual Studio
* Select Target (e.g `Debug`|`Release` & `x86`|`x64`)
* Navigate to `Build`->`Build Solution`

2
deps/libfnd vendored

@ -1 +1 @@
Subproject commit c68302624bd75951cc14cb30bb695288051aa4c8 Subproject commit 71b678a363b6339160809767565b79d90fdd8167

2
deps/liblz4 vendored

@ -1 +1 @@
Subproject commit c50865c96a87a86b8429e3b08a7c6e39e56e2815 Subproject commit fedcdbf5b4ac47aa09f7d9b0e665c2ae38c6edff

2
deps/libnintendo-es vendored

@ -1 +1 @@
Subproject commit 0e1ab5be9fba9870556a2867079fef1866e44161 Subproject commit 88fc5bf6251424d3462e34f696e0e67aa576bd86

@ -1 +1 @@
Subproject commit cf33ffffdcc2b8991b40e7542de90a5bcf6e1897 Subproject commit cf43c8b2680215a4389506be609fe8127d6cf490

@ -1 +1 @@
Subproject commit 6d6f8af8d9c89377595ae7406b199418c9fa5d3c Subproject commit 8a9004ed50237100ae6b8730f9a95271d577a886

@ -1 +1 @@
Subproject commit 5c40f272397eb800e3007a72cc5eb49e8b614070 Subproject commit c9e04cb9a92023fe1d395023654e17ca180314e3

2
deps/libpolarssl vendored

@ -1 +1 @@
Subproject commit 374b573ea76e42bd07dd7cf983778eb7be8bb522 Subproject commit 1ab999e3f9f7d95aeed963dddf7d0f4b34e68110

322
makefile
View file

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