Modest/Makefile

216 lines
8.3 KiB
Makefile
Raw Normal View History

2016-08-29 00:20:40 +03:00
TARGET := source
SRCDIR := source
CC ?= gcc
2017-03-16 20:45:50 +03:00
# make rules
# all —- build all components (libraries, examples, tests) (default)
# library -- build only static and shared library
# shared -- build only shared library
# static -- build only static library
# clean -- clean up current build directory
# clone -- copy all headers from source to include directories and modify local include (#include "...") to global (#include <...>)
# clean_api -- remove all headers from include directory
# create -- create directories for binary, libraries, tests
# install -- install libraries and headers on your system
# uninstall -- delete libraries and headers on your system
# test -- run all tests
2017-03-20 21:57:29 +03:00
# modules -- print modules list: Module name, Description, Dependencies
2017-03-16 20:45:50 +03:00
# make-pc-file -- create pkg-config file
2017-03-09 23:47:39 +03:00
#
2017-03-16 20:45:50 +03:00
# ARGS
# prefix, default /usr/local
# OS, if not defined try to get from "uname -s"
2017-03-20 21:57:29 +03:00
# PROJECT_OPTIMIZATION_LEVEL, default -O2
2017-03-16 20:45:50 +03:00
# MyCORE_BUILD_WITHOUT_THREADS, YES or (NO or undefined), default undefined
# MyCORE_BUILD_DEBUG, YES or (NO or undefined), default undefined
# MyCORE_WITH_PERF, YES or (NO or undefined), default undefined, try build with timers (rdtsc or some), OS dependent, may not work on some systems,
2017-03-20 21:57:29 +03:00
# PROJECT_INSTALL_HEADER, default "include"
# PROJECT_INSTALL_LIBRARY, default "lib"
# PROJECT_INSTALL_WITHOUT_HEADERS, YES or (NO or undefined), default undefined
2017-03-09 23:47:39 +03:00
#
2017-03-16 20:45:50 +03:00
# If OS build rules not exists we try make library with POSIX threads
2017-03-09 23:47:39 +03:00
.DEFAULT_GOAL := all
2016-08-29 00:20:40 +03:00
DESCRIPTION := fast HTML renderer library with no outside dependency
2017-03-16 16:38:01 +03:00
2017-03-09 23:47:39 +03:00
#********************
# other Makefile
#***************
include Makefile.cfg
#********************
# Build
#***************
MODEST_BUILD_MODULES ?= $(dir $(wildcard $(SRCDIR)/*/))
MODEST_BUILD_MODULES := $(patsubst %myport/,%myport/$(strip $(MODEST_PORT_NAME))/,$(MODEST_BUILD_MODULES))
MODEST_BUILD_MODULES_LIST := $(foreach dir,$(MODEST_BUILD_MODULES),$(word 2, $(subst $(MODEST_DIR_SEPARATOR), , $(dir))) )
2017-03-16 16:38:01 +03:00
MODEST_BUILD_MODULES_LIST_WITHOUT_PORT := $(strip $(foreach dir,$(MODEST_BUILD_MODULES_LIST),$(patsubst myport,,$(dir))))
2017-03-09 23:47:39 +03:00
MODEST_BUILD_MODULES_MAKEFILES_LIST := $(foreach dir,$(MODEST_BUILD_MODULES),$(dir)Makefile.mk)
#********************
# Targets
#***************
MODEST_BUILD_MODULES_TARGET := $(MODEST_BUILD_MODULES_LIST)
MODEST_BUILD_MODULES_TARGET_ALL := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$(dir)_all)
2017-03-11 22:53:26 +03:00
MODEST_BUILD_MODULES_TARGET_CLEAN := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$(dir)_clean) $(myport_clean)
2017-03-09 23:47:39 +03:00
MODEST_BUILD_MODULES_TARGET_CLONE := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$(dir)_clone)
#********************
# Utils
#***************
MODEST_UTILS_HDRS = $(foreach dir,$2,$(wildcard $(SRCDIR)/$1/$(dir)/*.h))
MODEST_UTILS_OBJS = $(patsubst %.c,%.o,$(foreach dir,$2,$(wildcard $(SRCDIR)/$1/$(dir)/*.c)))
MODEST_UTILS_HDRS_CLONE_CMND = $(foreach path,$(foreach dir,$2,$(wildcard $(SRCDIR)/$1/$(dir)/*.h)), cp $(path) $(patsubst $(SRCDIR)%,$(INCLUDE_DIR_API)%,$(path)) $(MODEST_UTILS_NEW_LINE))
MODEST_UTILS_HDRS_CLONE_GDIR = $(foreach dir,$2,$(INCLUDE_DIR_API)/$1/$(dir)/)
MODEST_UTILS_HDRS_CLONE_DIRS = $(foreach dir,$(strip $(patsubst %./,%,$(foreach path,$(call MODEST_UTILS_HDRS_CLONE_GDIR,$1,$2),$(dir $(path))))),mkdir -p $(dir) $(MODEST_UTILS_NEW_LINE))
MODEST_UTILS_HDRS_CLONE = $(info Clone for $1) $(call MODEST_UTILS_HDRS_CLONE_DIRS,$1,$2) $(MODEST_UTILS_NEW_LINE) $(call MODEST_UTILS_HDRS_CLONE_CMND,$1,$2)
2017-03-19 11:55:37 +03:00
#********************
# MyPORT
#***************
MyPORT_SELECTED_PORT = myport/$(strip $(MODEST_PORT_NAME))
2017-03-09 23:47:39 +03:00
#********************
# Include all modules Makefile.mk
#***************
include $(MODEST_BUILD_MODULES_MAKEFILES_LIST)
2017-03-20 21:57:29 +03:00
#********************
# Modules info
#***************
MODEST_BUILD_MODULES_INFO_DEP = $(foreach dep,$(strip $($1_dependencies)), $(dep))
MODEST_BUILD_MODULES_INFO := $(foreach name,$(MODEST_BUILD_MODULES_LIST_WITHOUT_PORT),$(MODEST_UTILS_NEW_LINE)Module: $(name)$(MODEST_UTILS_NEW_LINE)Description: $($(name)_description)$(MODEST_UTILS_NEW_LINE)Dependencies:$(call MODEST_BUILD_MODULES_INFO_DEP,$(name))$(MODEST_UTILS_NEW_LINE))
2017-03-09 23:47:39 +03:00
#********************
# Set ARGS for flags
#***************
MODEST_CFLAGS += -DMODEST_BUILD_OS=$(MODEST_BUILD_OS)
MODEST_CFLAGS += -DMODEST_PORT_NAME=$(MODEST_PORT_NAME)
2017-03-19 11:55:37 +03:00
MODEST_CFLAGS += $(patsubst -DMY%,-DMy%,$(call MODEST_UTILS_TO_UPCASE,-DMyCORE_OS_$(MODEST_BUILD_OS)))
2017-03-12 20:23:04 +03:00
override CFLAGS += $(MODEST_CFLAGS)
override LDFLAGS += $(MODEST_LDFLAGS)
2017-03-09 23:47:39 +03:00
#********************
# Objects
#***************
2017-03-10 10:36:54 +03:00
MODEST_BUILD_OBJECT_SHARED ?= $(CC) -shared $(LDFLAGS) $(MODEST_LDFLAGS) $1 -o $2
MODEST_BUILD_OBJECT_STATIC ?= $(AR) crus $2 $1
2017-03-09 23:47:39 +03:00
MODEST_BUILD_OBJECT_MODULES := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$($(dir)_objs))
2017-03-15 18:36:30 +03:00
MODEST_BUILD_OBJECT_MODULES := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$($(dir)_objs))
2017-03-09 23:47:39 +03:00
2017-03-13 17:52:50 +03:00
#********************
# Sub Directories
#***************
BUILD_SUB_DIRS := examples $(TEST_DIR)
2017-03-15 18:36:30 +03:00
#********************
# Install
#***************
2017-03-20 21:57:29 +03:00
PROJECT_INSTALL_LIBRARY := lib
PROJECT_INSTALL_HEADER := include
2017-03-16 16:38:01 +03:00
2018-03-20 17:06:12 +03:00
libdir ?= $(DESTDIR)$(prefix)/$(PROJECT_INSTALL_LIBRARY)
includedir ?= $(DESTDIR)$(prefix)/$(PROJECT_INSTALL_HEADER)
2017-03-16 16:38:01 +03:00
2018-03-20 17:06:12 +03:00
MODEST_INSTALL_CREATE_DIR := mkdir -p $(libdir)
ifneq ($(PROJECT_INSTALL_WITHOUT_HEADERS),YES)
MODEST_INSTALL_CREATE_DIR += $(includedir)
endif
2017-03-16 20:45:50 +03:00
2018-03-20 17:06:12 +03:00
MODEST_INSTALL_COMMAND := cp -av $(LIB_DIR_BASE)/* $(libdir)
2017-03-20 21:57:29 +03:00
ifneq ($(PROJECT_INSTALL_WITHOUT_HEADERS),YES)
2017-03-16 20:45:50 +03:00
MODEST_INSTALL_COMMAND += $(MODEST_UTILS_NEW_LINE) cp -av $(INCLUDE_DIR_API)/* $(includedir)
endif
2017-03-16 16:38:01 +03:00
#********************
# Uninstall
#***************
MODEST_UNINSTALL_MK_COMMAND :=
2017-03-16 20:45:50 +03:00
MODEST_UNINSTALL_FILE := uninstal.mk
2017-03-20 21:57:29 +03:00
ifneq ($(PROJECT_INSTALL_WITHOUT_HEADERS),YES)
2017-03-16 20:45:50 +03:00
MODEST_UNINSTALL_HEADERS := $(foreach name,$(MODEST_BUILD_MODULES_LIST_WITHOUT_PORT),rm -rf $(includedir)/$(name) \$$(MODEST_UTILS_NEW_LINE))
endif
2017-03-16 16:38:01 +03:00
MODEST_UNINSTALL_LIBRARY := $(foreach path,$(wildcard $(LIB_DIR_BASE)/lib*),rm -rf $(libdir)/$(notdir $(path)) \$$(MODEST_UTILS_NEW_LINE))
MODEST_UNINSTALL_COMMAND = echo "MODEST_UNINSTALL_MK_COMMAND = $(MODEST_UNINSTALL_HEADERS) $(MODEST_UNINSTALL_LIBRARY)" > $(MODEST_UNINSTALL_FILE)
-include $(MODEST_UNINSTALL_FILE)
#********************
# PKG-CONFIG
#***************
MODEST_PKG_CONFIG_FILE := modest.pc
MODEST_PKG_CONFIG_CFLAGS := $(foreach name,$(MODEST_BUILD_MODULES_LIST_WITHOUT_PORT),-I$\{includedir}/$(name))
MODEST_PKG_CONFIG_PROCESS = \
$(SED) \
2017-03-20 21:57:29 +03:00
-e 's,@version\@,$(PROJECT_VERSION_STRING),g' \
2017-03-16 16:38:01 +03:00
-e 's,@prefix\@,$(prefix),g' \
-e 's,@exec_prefix\@,$(exec_prefix),g' \
2017-03-20 21:57:29 +03:00
-e 's,@libdir\@,$(PROJECT_INSTALL_LIBRARY),g' \
-e 's,@includedir\@,$(PROJECT_INSTALL_HEADER),g' \
2017-03-16 16:38:01 +03:00
-e 's,@cflags\@,$(MODEST_PKG_CONFIG_CFLAGS),g' \
-e 's,@libname\@,$(LIB_NAME),g' \
-e 's,@description\@,$(DESCRIPTION),g' \
$1 > $2
2018-03-20 17:06:12 +03:00
MODEST_INSTALL_CREATE_DIR += $(libdir)/pkgconfig
MODEST_INSTALL_COMMAND += $(MODEST_UTILS_NEW_LINE) cp -av $(MODEST_PKG_CONFIG_FILE) $(libdir)/pkgconfig
MODEST_INSTALL_COMMAND := $(MODEST_INSTALL_CREATE_DIR) $(MODEST_UTILS_NEW_LINE) $(MODEST_INSTALL_COMMAND)
2017-03-15 18:36:30 +03:00
2017-03-09 23:47:39 +03:00
#********************
# Target options
#***************
2017-03-13 17:52:50 +03:00
all: library
for f in $(BUILD_SUB_DIRS); do $(MAKE) -C $$f all; done
library: shared static
2017-03-10 10:36:54 +03:00
2017-03-17 12:36:10 +03:00
shared: make-pc-file create $(MODEST_BUILD_MODULES_TARGET_ALL)
2017-03-10 10:36:54 +03:00
$(call MODEST_BUILD_OBJECT_SHARED,$(MODEST_BUILD_OBJECT_MODULES),$(call MODEST_LIBRARY_WITH_VERSION))
$(call MODEST_BUILD_SHARED_AFTER)
2017-03-10 10:36:54 +03:00
2017-03-17 12:36:10 +03:00
static: make-pc-file create $(MODEST_BUILD_MODULES_TARGET_ALL)
2017-03-11 22:53:26 +03:00
$(call MODEST_BUILD_OBJECT_STATIC,$(MODEST_BUILD_OBJECT_MODULES),$(call MODEST_LIBRARY_STATIC))
$(call MODEST_BUILD_STATIC_AFTER)
2017-03-09 23:47:39 +03:00
clean: $(MODEST_BUILD_MODULES_TARGET_CLEAN)
2017-03-11 22:53:26 +03:00
rm -f $(call MODEST_LIBRARY_WITH_VERSION) && rm -f $(call MODEST_LIBRARY_STATIC)
2017-03-13 17:52:50 +03:00
rm -rf $(TEST_DIR_BASE)
$(call MODEST_BUILD_CLEAN_AFTER)
-rm $(MODEST_PKG_CONFIG_FILE)
2017-03-13 17:52:50 +03:00
for f in $(BUILD_SUB_DIRS); do $(MAKE) -C $$f clean; done
2017-03-10 10:36:54 +03:00
clone: clean_api $(MODEST_BUILD_MODULES_TARGET_CLONE)
2017-03-16 23:15:55 +03:00
$(call MODEST_CLONE_SED_HEADER_COMMAND)
2017-03-10 10:36:54 +03:00
find $(INCLUDE_DIR_API) -name "*.h.bak" -exec rm -f {} \;
2017-03-09 23:47:39 +03:00
clean_api:
rm -rf $(INCLUDE_DIR_API)
2017-03-09 23:59:56 +03:00
create:
2017-03-13 17:52:50 +03:00
mkdir -p $(BINARY_DIR_BASE) $(LIB_DIR_BASE) $(TEST_DIR_BASE)
2017-03-15 18:36:30 +03:00
install:
$(MODEST_INSTALL_COMMAND)
2017-03-16 16:38:01 +03:00
$(MODEST_UNINSTALL_COMMAND)
uninstall:
$(MODEST_UNINSTALL_MK_COMMAND)
2017-03-15 18:36:30 +03:00
test: library
2017-03-13 17:52:50 +03:00
$(MAKE) -C $(TEST_DIR) run
2017-03-09 23:59:56 +03:00
2018-03-20 18:58:09 +03:00
make-pc-file: $(MODEST_PKG_CONFIG_FILE)
$(MODEST_PKG_CONFIG_FILE): $(MODEST_PKG_CONFIG_FILE).in
2017-03-16 16:38:01 +03:00
$(call MODEST_PKG_CONFIG_PROCESS,$(MODEST_PKG_CONFIG_FILE).in, $(MODEST_PKG_CONFIG_FILE))
2017-03-20 21:57:29 +03:00
modules:
$(info $(MODEST_BUILD_MODULES_INFO))
2017-03-13 17:52:50 +03:00
.PHONY: all clean clone test $(MODEST_BUILD_MODULES_TARGET_ALL)