339 lines
12 KiB
Makefile
339 lines
12 KiB
Makefile
|
###############################################################################
|
||
|
#
|
||
|
# Copyright 2010 Jonathan Wallace. All rights reserved.
|
||
|
#
|
||
|
# Redistribution and use in source and binary forms, with or without
|
||
|
# modification, are permitted provided that the following conditions are met:
|
||
|
#
|
||
|
# 1. Redistributions of source code must retain the above copyright
|
||
|
# notice, this list of conditions and the following disclaimer.
|
||
|
#
|
||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||
|
# notice, this list of conditions and the following disclaimer in the
|
||
|
# documentation and/or other materials provided with the distribution.
|
||
|
#
|
||
|
# THIS SOFTWARE IS PROVIDED BY JONATHAN WALLACE ``AS IS'' AND ANY
|
||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JONATHAN WALLACE OR
|
||
|
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||
|
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||
|
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||
|
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||
|
# DAMAGE.
|
||
|
#
|
||
|
# The views and conclusions contained in the software and documentation are
|
||
|
# those of the authors and should not be interpreted as representing official
|
||
|
# policies, either expressed or implied, of Jonathan Wallace....
|
||
|
#
|
||
|
#
|
||
|
# Author Bernhard Fluehmann
|
||
|
#
|
||
|
# bernhard.fluehmann@patton-inalp.com
|
||
|
#
|
||
|
#
|
||
|
# TARGETS
|
||
|
# all
|
||
|
# Builds either a shared or a static library, depending of the value
|
||
|
# of the SHARED variable.
|
||
|
# Default: static
|
||
|
#
|
||
|
# banner
|
||
|
# Displays the library version and the target
|
||
|
#
|
||
|
# install
|
||
|
# Installs either the shared of the static library, depending of the value
|
||
|
# of the SHARED variable. Installs the header files as well.
|
||
|
# Builds the library before installing if it does not exist already.
|
||
|
# Ececutes ldconfig in case of the shared library.
|
||
|
# Default locations:
|
||
|
# library: $(exec_prefix)/$(libdir) => /usr/lib
|
||
|
# headers: $(prefix)/$(includedir) => /usr/include
|
||
|
#
|
||
|
# install_headers
|
||
|
# Installs the header files.
|
||
|
# Default location: $(prefix)/$(includedir) => /usr/include
|
||
|
#
|
||
|
# clean
|
||
|
# Removes the shared or the static library, depending of the value
|
||
|
# of the SHARED variable, from this folder and all the folders and objects
|
||
|
# which were created to build it.
|
||
|
#
|
||
|
# uninstall
|
||
|
# Removes the shared or the static library, depending of the value
|
||
|
# of the SHARED variable from the system. In case of the shared library,
|
||
|
# removes the symbolic links as well and executes ldconfig.
|
||
|
#
|
||
|
# uninstall_headers
|
||
|
# Remove the headers from the system.
|
||
|
#
|
||
|
# Variables
|
||
|
# prefix
|
||
|
# The general installation root directory. Default: /usr
|
||
|
#
|
||
|
# exec_prefix
|
||
|
# The installation root directory to place executables and libraries.
|
||
|
# Default: prefix
|
||
|
#
|
||
|
# libdir
|
||
|
# The directory where the libraries are installed, as a subdirectory of
|
||
|
# exec_prefix. Default: lib
|
||
|
#
|
||
|
# includedir
|
||
|
# The directory where the header files are installed, as a subdirectory of
|
||
|
# prefix. Default: include
|
||
|
#
|
||
|
# srcdir
|
||
|
# The directory where the object source files are located.
|
||
|
# Default: _internal/Source
|
||
|
#
|
||
|
# CXX
|
||
|
# The compiler to be used. Default: c++
|
||
|
#
|
||
|
# CXXFLAGS
|
||
|
# The compiler flags used to compile the object files.
|
||
|
# Default:
|
||
|
# cxxflags_default for default
|
||
|
# cxxflags_small for BUILD_TYPE=small
|
||
|
# cxxflags_debug for BUILD_TYPE=debug
|
||
|
#
|
||
|
# AR
|
||
|
# The archiver to be used. Default: ar
|
||
|
#
|
||
|
# PIC
|
||
|
# The PIC to be used. Default: PIC
|
||
|
#
|
||
|
# BUILD_TYPE
|
||
|
# Used to select a specific set of predefined configuration parameters.
|
||
|
# Default: undefined: The default settings are used
|
||
|
# Options:
|
||
|
# small
|
||
|
# debug
|
||
|
#
|
||
|
# SHARED
|
||
|
# Used to select if the library is a shared or a dynamic one
|
||
|
# Default: undefined: static
|
||
|
# Options:
|
||
|
# 0: static
|
||
|
# 1: shared
|
||
|
#
|
||
|
#
|
||
|
#
|
||
|
|
||
|
# JSON source files to build
|
||
|
objects = internalJSONNode.o JSONAllocator.o JSONChildren.o \
|
||
|
JSONDebug.o JSONIterators.o JSONMemory.o JSONNode.o \
|
||
|
JSONNode_Mutex.o JSONPreparse.o JSONStream.o JSONValidator.o \
|
||
|
JSONWorker.o JSONWriter.o libjson.o
|
||
|
OS=$(shell uname)
|
||
|
|
||
|
# Defaults
|
||
|
ifeq ($(OS), Darwin)
|
||
|
cxxflags_default = -fast -ffast-math -fexpensive-optimizations -DNDEBUG
|
||
|
else
|
||
|
cxxflags_default = -O3 -ffast-math -fexpensive-optimizations -DNDEBUG
|
||
|
endif
|
||
|
cxxflags_small = -Os -ffast-math -DJSON_LESS_MEMORY -DNDEBUG
|
||
|
cxxflags_debug = -g -DJSON_SAFE -DJSON_DEBUG
|
||
|
cxxflags_shared = -f$(PIC)
|
||
|
libname = libjson
|
||
|
libname_hdr := $(libname)
|
||
|
libname_debug = $(libname)_dbg
|
||
|
suffix_shared = so
|
||
|
suffix_static = a
|
||
|
major_version = 7
|
||
|
minor_version = 6.1
|
||
|
objdir = Objects
|
||
|
|
||
|
|
||
|
# Variables
|
||
|
prefix ?= /usr
|
||
|
exec_prefix ?= $(prefix)
|
||
|
libdir ?= lib
|
||
|
includedir ?= include
|
||
|
srcdir ?= _internal/Source
|
||
|
CXX ?= c++
|
||
|
AR ?= ar
|
||
|
PIC ?= PIC
|
||
|
BUILD_TYPE ?= "default"
|
||
|
SHARED ?= "1"
|
||
|
|
||
|
|
||
|
# Internal Variables
|
||
|
inst_path = $(exec_prefix)/$(libdir)
|
||
|
include_path = $(prefix)/$(includedir)
|
||
|
|
||
|
|
||
|
# Usage check
|
||
|
ifdef CXXFLAGS
|
||
|
ifdef BUILD_TYPE
|
||
|
$(error CXXFLAGS and BUILD_TYPE are mutually exclusive)
|
||
|
endif
|
||
|
endif
|
||
|
|
||
|
# BUILD_TYPE specific settings
|
||
|
ifeq ($(BUILD_TYPE), small)
|
||
|
CXXFLAGS = $(cxxflags_small)
|
||
|
else ifeq ($(BUILD_TYPE), debug)
|
||
|
CXXFLAGS = $(cxxflags_debug)
|
||
|
libname := $(libname_debug)
|
||
|
else
|
||
|
CXXFLAGS ?= $(cxxflags_default)
|
||
|
endif
|
||
|
|
||
|
# SHARED specific settings
|
||
|
ifeq ($(SHARED), 1)
|
||
|
libname_shared = $(libname).$(suffix_shared)
|
||
|
libname_shared_major_version = $(libname_shared).$(major_version)
|
||
|
lib_target = $(libname_shared_major_version).$(minor_version)
|
||
|
objdir := $(objdir)_shared
|
||
|
CXXFLAGS := $(CXXFLAGS) $(cxxflags_shared)
|
||
|
else
|
||
|
lib_target = $(libname).$(suffix_static)
|
||
|
objdir := $(objdir)_static
|
||
|
endif
|
||
|
|
||
|
# Phony targets
|
||
|
.PHONY: all banner installdirs install install_headers clean uninstall \
|
||
|
uninstall_headers
|
||
|
|
||
|
# Targets
|
||
|
all: $(lib_target)
|
||
|
@echo "============================================================"
|
||
|
@echo "Done"
|
||
|
@echo "============================================================"
|
||
|
|
||
|
banner:
|
||
|
@echo "============================================================"
|
||
|
@echo "libjson version: "$(major_version).$(minor_version) "target: "$(target) "OS: "$(OS)
|
||
|
@echo "============================================================"
|
||
|
|
||
|
installdirs: banner
|
||
|
mkdir -p $(objdir)
|
||
|
|
||
|
# Libraries
|
||
|
ifeq ($(SHARED),1)
|
||
|
$(lib_target): banner installdirs $(addprefix $(objdir)/, $(objects))
|
||
|
@echo "Link "
|
||
|
cd $(objdir) ; \
|
||
|
if test "$(OS)" = "Darwin" ; then \
|
||
|
$(CXX) -shared -Wl,-dylib_install_name -Wl,$(libname_shared_major_version) -o $@ $(objects) ; \
|
||
|
else \
|
||
|
$(CXX) -shared -Wl,-soname,$(libname_shared_major_version) -o $@ $(objects) ; \
|
||
|
fi ; \
|
||
|
mv -f $@ ../
|
||
|
@echo "Link: Done"
|
||
|
else
|
||
|
$(lib_target): banner installdirs $(addprefix $(objdir)/, $(objects))
|
||
|
@echo "Archive"
|
||
|
cd $(objdir) ; \
|
||
|
$(AR) -cvq $@ $(objects) ; \
|
||
|
mv -f $@ ../
|
||
|
@echo "Archive: Done"
|
||
|
endif
|
||
|
|
||
|
# Compile object files
|
||
|
$(objdir)/%.o: $(srcdir)/%.cpp
|
||
|
$(CXX) $< -o $@ -c $(CXXFLAGS)
|
||
|
|
||
|
ifeq ($(SHARED),1)
|
||
|
install: banner install_headers $(lib_target)
|
||
|
@echo "Install shared library"
|
||
|
cp -f ./$(lib_target) $(inst_path)
|
||
|
cd $(inst_path) ; \
|
||
|
ln -sf $(lib_target) $(libname_shared_major_version) ; \
|
||
|
ln -sf $(libname_shared_major_version) $(libname_shared)
|
||
|
ifneq ($(OS),Darwin)
|
||
|
ldconfig
|
||
|
endif
|
||
|
@echo "Install shared library: Done."
|
||
|
else
|
||
|
install: banner install_headers $(lib_target)
|
||
|
@echo "Install static library"
|
||
|
cp -f ./$(lib_target) $(inst_path)
|
||
|
@echo "Install static library: Done."
|
||
|
endif
|
||
|
|
||
|
install_headers: banner
|
||
|
@echo "Install header files"
|
||
|
mkdir -p $(include_path)/$(libname_hdr)
|
||
|
cp -f ./*.h $(include_path)/$(libname_hdr)
|
||
|
mkdir -p $(include_path)/$(libname_hdr)/$(srcdir)
|
||
|
cp -f ./$(srcdir)/*.h $(include_path)/$(libname_hdr)/$(srcdir)
|
||
|
cp -r ./$(srcdir)/JSONDefs $(include_path)/$(libname_hdr)/$(srcdir)
|
||
|
chmod -R a+r $(include_path)/$(libname_hdr)
|
||
|
find $(include_path)/$(libname_hdr) -type d -exec chmod a+x {} \;
|
||
|
cp -rv $(srcdir)/Dependencies/ $(include_path)/$(libname_hdr)/$(srcdir)
|
||
|
@echo "Install header files: Done."
|
||
|
|
||
|
clean: banner
|
||
|
@echo "Clean library and object folder"
|
||
|
rm -rf $(objdir)
|
||
|
rm -f $(lib_target)
|
||
|
@echo "Clean library and object folder: Done"
|
||
|
|
||
|
ifeq ($(SHARED),1)
|
||
|
uninstall: banner uninstall_headers
|
||
|
@echo "Uninstall shared library"
|
||
|
rm -f $(inst_path)/$(libname_shared)
|
||
|
rm -f $(inst_path)/$(libname_shared_major_version)
|
||
|
rm -f $(inst_path)/$(lib_target)
|
||
|
ifneq ($(OS),Darwin)
|
||
|
ldconfig
|
||
|
endif
|
||
|
@echo "Uninstall shared library: Done"
|
||
|
else
|
||
|
uninstall: banner uninstall_headers
|
||
|
@echo "Uninstall static library"
|
||
|
rm -f $(inst_path)/$(lib_target)
|
||
|
@echo "Uninstall static library: Done"
|
||
|
endif
|
||
|
|
||
|
uninstall_headers: banner
|
||
|
@echo "Uninstall header files"
|
||
|
rm -rf $(include_path)/$(libname_hdr)
|
||
|
@echo "Uninstall header files: Done"
|
||
|
|
||
|
test:
|
||
|
$(CXX) _internal/TestSuite/main.cpp _internal/TestSuite/TestAssign.cpp _internal/TestSuite/TestChildren.cpp \
|
||
|
_internal/TestSuite/TestComments.cpp _internal/TestSuite/TestConverters.cpp _internal/TestSuite/TestCtors.cpp \
|
||
|
_internal/TestSuite/TestEquality.cpp _internal/TestSuite/TestFunctions.cpp _internal/TestSuite/TestInequality.cpp \
|
||
|
_internal/TestSuite/TestInspectors.cpp _internal/TestSuite/TestIterators.cpp _internal/TestSuite/TestMutex.cpp \
|
||
|
_internal/TestSuite/TestNamespace.cpp _internal/TestSuite/TestRefCounting.cpp _internal/TestSuite/TestSuite.cpp \
|
||
|
_internal/TestSuite/TestWriter.cpp _internal/TestSuite/TestString.cpp _internal/TestSuite/UnitTest.cpp \
|
||
|
_internal/TestSuite/TestValidator.cpp _internal/TestSuite/TestStreams.cpp _internal/TestSuite/TestBinary.cpp \
|
||
|
_internal/TestSuite/RunTestSuite2.cpp _internal/TestSuite/TestSharedString.cpp \
|
||
|
_internal/Source/internalJSONNode.cpp _internal/Source/JSONPreparse.cpp _internal/Source/JSONChildren.cpp \
|
||
|
_internal/Source/JSONDebug.cpp _internal/Source/JSONIterators.cpp _internal/Source/JSONMemory.cpp \
|
||
|
_internal/Source/JSONNode_Mutex.cpp _internal/Source/JSONNode.cpp _internal/Source/JSONWorker.cpp \
|
||
|
_internal/Source/JSONWriter.cpp _internal/Source/libjson.cpp _internal/Source/JSONValidator.cpp \
|
||
|
_internal/Source/JSONStream.cpp _internal/Source/JSONAllocator.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSON_Base64/json_decode64.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSON_Base64/json_encode64.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONDebug/JSON_ASSERT_SAFE.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONDebug/JSON_ASSERT.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONDebug/JSON_FAIL_SAFE.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONDebug/JSON_FAIL.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONGlobals/jsonSingleton.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/isValidArray.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/isValidMember.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/isValidNamedObject.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/isValidNumber.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/isValidObject.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/isValidPartialRoot.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/isValidRoot.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/isValidString.cpp \
|
||
|
_internal/TestSuite/TestSuite2/JSONValidator/securityTest.cpp \
|
||
|
_internal/TestSuite/TestSuite2/NumberToString/_areFloatsEqual.cpp \
|
||
|
_internal/TestSuite/TestSuite2/NumberToString/_atof.cpp \
|
||
|
_internal/TestSuite/TestSuite2/NumberToString/_ftoa.cpp \
|
||
|
_internal/TestSuite/TestSuite2/NumberToString/_itoa.cpp \
|
||
|
_internal/TestSuite/TestSuite2/NumberToString/_uitoa.cpp \
|
||
|
_internal/TestSuite/TestSuite2/NumberToString/getLenSize.cpp \
|
||
|
_internal/TestSuite/TestSuite2/NumberToString/isNumeric.cpp \
|
||
|
$(CXXFLAGS) -o ./testapp
|
||
|
./testapp
|