blob: 1efb7d4a429236976a434b843d94cf484093446d [file] [log] [blame]
#*******************************************************************************
# Copyright (c) 2014-2015 Zeligsoft (2009) Limited and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#*******************************************************************************
# Top level makefile for building RTS services library.
#
# Currently only supports linux - linux targets are implied.
#
# By default, the RTS library is put into a 'lib' directory under the $RTSROOT
# directory. The user can specify an alternate location with LIBDEST=xxx.
# The LIBDEST directory is created if it doesn't exist.
#
# Build products are put into BUILDROOT (default is +/build). Created by build.
#
# The 'exportfiles' makefile-target puts the library headers, the library
# and a manifest file (containing version information) into a 'umlrt-rts'
# subdirectory of the EXPORTDIR directory.
#
# The 'exportarchive' makefile-target takes the files generated by the
# 'exportfiles' target and puts them into the EXPORTARCHIVE file.
# The default name is EXPORTDIR/umlrt-rts.tgz.
#
# The directory for EXPORTDIR and EXPORTARCHIVE file can be supplied on the
# command-line.
#
# Note: The export operations remove and regenerate the contents of the
# EXPORTDIR/umlrt-rts subdirectory but do not disturb any other content
# that may be present in the EXPORTDIR directory.
#
# Targets:
# (none) : The default target is 'all' - same as 'library'.
# all : everything - currently only 'library'
# library : the RTS services library
# clean : Delete all build products.
# exportfiles : create a directory with the library, manifest and headers.
# exportarchive : create a tar archive with the library, manifest and headers.
# exportclean : clean the contents of EXPORTDIR/umlrt-rts sub-directory.
# exportdir : create the EXPORTDIR/umlrt-rts sub-directory.
#
# Variables (can be overridden during make invoke with <var>=<value>):
# RTSROOT : default RTSROOT=. : umlrt.rts repo dir.
# BUILDROOT : default BUILDROOT=$(RTSROOT)/build : build output dir.
# OSNAME : default OS=linux : Target platform.
# OSVERSION : default <empty> : os-version, only if required.
# LIBDEST : Change default library destination directory.
# DEPEND : default DEPEND=1 : 'DEPEND=0' to skip dependency generation.
# DEBUG : default DEBUG=0 : 'DEBUG=1' compiles with '-g -O0'.
# CC : default CC=g++ : Change default compiler.
# CPPFLAGS : Replace default cc compile flags.
# AR : default AR=ar : Change default archiver.
# ARFLAGS : Replace default archiver flags.
# EXPORTDIR : default EXPORTDIR=$(BUILDROOT)/export
# EXPORTARCHIVE : default is 'umlrt-rts.tgz'
#
# Local variables (not typically passed in via env) are in lower-case.
#
# Examples:
# make : Default - same as 'make all' and 'make library'
# make all : Default - same as 'make' and 'make library'
# make library : Default - same as 'make' and 'make all'
# make exportfiles : Build the library and make tar-archive with required files.
# make DEBUG=1 : Make the library with debug compile options.
# make DEPEND=0 : Build the library but skip building dependencies
# make clean : clean all build products (library, objects, dependency files.)
# make LIBDEST=~/lib : Put library into '~/lib'.
# make BUILDROOT=~/build : Put build-products into '~/build'.
# make exportfiles : Puts export files into $(BUILDROOT)/export/umlrt-rts.
# make exportarchive : Puts 'umlrt-rts.tgz/ into $(BUILDROOT)/export.
#
# After a clean pull from the repo, "make DEPEND=0" will build everything but
# will skip building dependencies (hence will be faster). (Dependencies are not
# required for this scenario to guarantee everything gets explicitly built.)
#
# RTSROOT and BUILDROOT notes
# ---------------------------
# RTSROOT names the top-level (umlrt.rts) directory. The default RTSROOT
# is current working directory (where this Makefile currently resides).
#
# BUILDROOT names the top-level build-products output directory tree.
# Object files and dependency files are written here.
# This directory tree is created by the build process if it doesn't yexist.
# The tree-structure under BUILDROOT matches the associated directory tree
# under RTSROOT.
#
# -I Header Search Path
# ---------------------
# The include search path for source compiles depends on the OS and OS-version
# and starts in the most specific location and works its way out to the most
# generic location. In general, the include path consists of the following path:
#
# $RTSROOT/os/<os-name>/<os-vers>/include - OS-version-specific (may not exist)
# $RTSROOT/os/<os-name>/include - OS-specific headers
# $RTSROOT/base/include - base utilities headers
# $RTSROOT/include - UML-RT public headers
# cwd is source root - current version assumes cwd is top-level src directory.
# This can be overridden while invoking make with RTSROOT=xxx.
RTSROOT=.
# Build output (objects) are placed in a directory tree
# This can be overridden while invoking make with BUILDROOT=xxx.
BUILDROOT=$(RTSROOT)/build
# OS name
# This can be overridden while invoking make with OSNAME=xxx.
OSNAME=linux
# OS version - no OS-version-specific implementations required yet
OSVERSION=
# Export root directory
EXPORTDIR=$(BUILDROOT)/export
EXPORTARCHIVE=$(EXPORTDIR)/umlrt-rts.tgz
# Destination directory for the RTS services library.
# This can be overridden while invoking make with LIBDEST=xxx.
LIBDEST=$(RTSROOT)/lib
# Misc commands
ECHO=echo
MAKE=make
RM=rm -rf
MD=mkdir -p
SED=sed -e
CP=cp
TAR=tar
# Compiler
# This can be overridden while invoking make with CC=xxx.
CC=g++
# Archiver
# This can be overridden while invoking make with AR=xxx.
AR=ar
# Compile flags
# TODO: add os-version if required
# i.e. -I $(RTSROOT)/os/$(OSNAME)/$(OSVERSION)/include
INCLUDES=\
$(RTSROOT)/os/$(OSNAME)/include \
$(RTSROOT)/base/include \
$(RTSROOT)/include
CFLAGS=-c -Wall
CFLAGS+= $(foreach i, $(INCLUDES), -I$i)
# This can be overridden while invoking make with DEBUG=1
DEBUG=0
# Can optionally skip building dependencies (default is 'build dependencies')
# This can be overridden while invoking make with DEPEND=0
DEPEND=1
# Add debugging compile flags
ifeq ($(DEBUG),1)
CFLAGS+= -g -O0
endif
# Archiver flags
# This can be overridden while invoking make with ARFLAGS=xxx
ARFLAGS=rs
# Ouput RTS services library
library=$(LIBDEST)/librts.a
# Objects that make up the RTS services library
objs=\
$(BUILDROOT)/base/basedebug.o \
$(BUILDROOT)/base/basefatal.o \
$(BUILDROOT)/umlrt/umlrtapi.o \
$(BUILDROOT)/umlrt/umlrtbasicthread.o \
$(BUILDROOT)/umlrt/umlrtcapsule.o \
$(BUILDROOT)/umlrt/umlrtcapsuleid.o \
$(BUILDROOT)/umlrt/umlrtcapsuletocontrollermap.o \
$(BUILDROOT)/umlrt/umlrtcommsport.o \
$(BUILDROOT)/umlrt/umlrtcontroller.o \
$(BUILDROOT)/umlrt/umlrtframeprotocol.o \
$(BUILDROOT)/umlrt/umlrtframeservice.o \
$(BUILDROOT)/umlrt/umlrthashmap.o \
$(BUILDROOT)/umlrt/umlrtinsignal.o \
$(BUILDROOT)/umlrt/umlrtlogprotocol.o \
$(BUILDROOT)/umlrt/umlrtmain.o \
$(BUILDROOT)/umlrt/umlrtmainloop.o \
$(BUILDROOT)/umlrt/umlrtmaintargetstartup.o \
$(BUILDROOT)/umlrt/umlrtmaintargetshutdown.o \
$(BUILDROOT)/umlrt/umlrtmessage.o \
$(BUILDROOT)/umlrt/umlrtmessagepool.o \
$(BUILDROOT)/umlrt/umlrtmessagequeue.o \
$(BUILDROOT)/umlrt/umlrtmutex.o \
$(BUILDROOT)/umlrt/umlrtobjectclass.o \
$(BUILDROOT)/umlrt/umlrtoutsignal.o \
$(BUILDROOT)/umlrt/umlrtpool.o \
$(BUILDROOT)/umlrt/umlrtprioritymessagequeue.o \
$(BUILDROOT)/umlrt/umlrtprotocol.o \
$(BUILDROOT)/umlrt/umlrtqueue.o \
$(BUILDROOT)/umlrt/umlrtrtsinterfaceumlrt.o \
$(BUILDROOT)/umlrt/umlrtsemaphore.o \
$(BUILDROOT)/umlrt/umlrtsignal.o \
$(BUILDROOT)/umlrt/umlrtsignalelement.o \
$(BUILDROOT)/umlrt/umlrtsignalelementpool.o \
$(BUILDROOT)/umlrt/umlrttimerid.o \
$(BUILDROOT)/umlrt/umlrttimerpool.o \
$(BUILDROOT)/umlrt/umlrttimerprotocol.o \
$(BUILDROOT)/umlrt/umlrttimerqueue.o \
$(BUILDROOT)/umlrt/umlrttimespec.o
# Phony targets.
.PHONY : all clean library exportdir exportclean exportfiles exportarchive
# Build everything.
all : library
# phony target for the RTS services library (is currently the default target)
library : $(library)
# Include dependencies (default) - skip if DEPEND=0
ifneq ($(MAKECMDGOALS),clean)
ifeq ($(DEPEND),1)
-include $(objs:.o=.d)
endif
endif
# Clean everything.
clean :
$(RM) -rf $(library) $(objs) $(objs:.o=.d)
# Create the export directory if it doesn't exist.
exportdir:
@$(MD) $(EXPORTDIR)/umlrt-rts
# Clean the export directory
exportclean:
@$(ECHO) "removing $(EXPORTDIR)/umlrt-rts"
@$(RM) $(EXPORTDIR)/umlrt-rts
# Build the export files (library, manifest, headers)
exportfiles: library exportclean exportdir
@$(ECHO) "export files to $(EXPORTDIR)/umlrt-rts"
@$(CP) $(library) $(EXPORTDIR)/umlrt-rts
@$(RTSROOT)/script/git-showid.sh > $(EXPORTDIR)/umlrt-rts/manifest
@$(CP) -r $(RTSROOT)/include $(EXPORTDIR)/umlrt-rts
# Build the export archive
exportarchive: exportfiles
@$(ECHO) "creating export archive $(EXPORTARCHIVE)"
@$(TAR) -c -z -f $(EXPORTARCHIVE) -C $(EXPORTDIR)/umlrt-rts .
# RTS services library build
$(library) : $(objs)
@-$(MD) $(LIBDEST)
$(AR) $(ARFLAGS) $@ $^
# dependencies rule
$(BUILDROOT)/%.d : $(RTSROOT)/%.cc
@$(MD) `dirname $@`
@$(CC) -MP -MM $^ $(CFLAGS) -MT $(subst .d,.o,$@) -MF $@
# objects rule
$(BUILDROOT)/%.o : $(RTSROOT)/%.cc
@$(MD) `dirname $@`
$(CC) $< $(CFLAGS) -o $@