From 363cb5bf09603554cc6b7ff204989ed2dfeb45a9 Mon Sep 17 00:00:00 2001 From: "N.N." Date: Thu, 18 Jun 2015 11:39:37 +0000 Subject: Added new build system with temporary names (intended to replace native miXed build system) svn path=/trunk/externals/miXed/; revision=17492 --- cyclone/Makefile.cyclone | 418 +++++++++++++++++ cyclone/Makefile.pdlibbuilder | 1015 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1433 insertions(+) create mode 100644 cyclone/Makefile.cyclone create mode 100644 cyclone/Makefile.pdlibbuilder diff --git a/cyclone/Makefile.cyclone b/cyclone/Makefile.cyclone new file mode 100644 index 0000000..ad20b51 --- /dev/null +++ b/cyclone/Makefile.cyclone @@ -0,0 +1,418 @@ +# Makefile for pure data externals in lib cyclone + +lib.name = cyclone + +cflags = -I../shared + + +################################################################################ +### hammer ##################################################################### +################################################################################ + + +# common sources for hammer types + +hloud := \ +../shared/common/loud.c + +hfitter := \ +../shared/common/loud.c \ +../shared/common/fitter.c + +hforky := \ +../shared/common/loud.c \ +../shared/unstable/forky.c + +hfragile := \ +../shared/common/loud.c \ +../shared/unstable/fragile.c + +hgrow := \ +../shared/common/grow.c \ +../shared/common/loud.c + +hgrowfitter := \ +../shared/common/grow.c \ +../shared/common/loud.c \ +../shared/common/fitter.c + +hfile := \ +../shared/hammer/file.c \ +../shared/common/loud.c \ +../shared/common/os.c \ +../shared/common/fitter.c \ +../shared/unstable/forky.c + +hrand := \ +../shared/common/rand.c \ +../shared/common/loud.c + +hrandfile := \ +../shared/common/rand.c \ +../shared/hammer/file.c \ +../shared/common/loud.c \ +../shared/common/os.c \ +../shared/common/fitter.c \ +../shared/unstable/forky.c + +hrandgrow := \ +../shared/common/rand.c \ +../shared/common/grow.c \ +../shared/common/loud.c \ +../shared/common/fitter.c + +hrandgrowfile := \ +../shared/common/rand.c \ +../shared/common/grow.c \ +../shared/hammer/file.c \ +../shared/common/loud.c \ +../shared/common/os.c \ +../shared/unstable/forky.c + +htree := \ +../shared/hammer/tree.c \ +../shared/common/loud.c + +htreefilevefl := \ +../shared/hammer/tree.c \ +../shared/hammer/file.c \ +../shared/common/vefl.c \ +../shared/common/loud.c \ +../shared/common/os.c \ +../shared/unstable/forky.c \ +../shared/unstable/fragile.c + +hgui := \ +../shared/hammer/gui.c \ +../shared/common/loud.c + +hseq := \ +../shared/common/mifi.c \ +../shared/hammer/file.c \ +../shared/common/grow.c \ +../shared/common/loud.c \ +../shared/common/os.c \ +../shared/common/fitter.c \ +../shared/unstable/forky.c + + +# hammer classes +accum.class.sources := hammer/accum.c $(hplain) +acos.class.sources := hammer/acos.c $(hplain) +active.class.sources := hammer/active.c $(hgui) +anal.class.sources := hammer/anal.c $(hloud) +Append.class.sources := hammer/Append.c $(hgrowfitter) +asin.class.sources := hammer/asin.c $(hplain) +bangbang.class.sources := hammer/bangbang.c $(hfitter) +bondo.class.sources := hammer/bondo.c $(hgrow) +Borax.class.sources := hammer/Borax.c $(hloud) +Bucket.class.sources := hammer/Bucket.c $(hplain) +buddy.class.sources := hammer/buddy.c $(hgrow) +capture.class.sources := hammer/capture.c $(hfile) +cartopol.class.sources := hammer/cartopol.c $(hplain) +Clip.class.sources := hammer/Clip.c $(hgrow) +coll.class.sources := hammer/coll.c $(hfile) +comment.class.sources := hammer/comment.c $(hforky) +cosh.class.sources := hammer/cosh.c $(hplain) +counter.class.sources := hammer/counter.c $(hfitter) +cycle.class.sources := hammer/cycle.c $(hfitter) +decide.class.sources := hammer/decide.c $(hloud) +Decode.class.sources := hammer/Decode.c $(hfitter) +drunk.class.sources := hammer/drunk.c $(hrand) +flush.class.sources := hammer/flush.c $(hplain) +forward.class.sources := hammer/forward.c $(hplain) +fromsymbol.class.sources := hammer/fromsymbol.c $(hplain) +funbuff.class.sources := hammer/funbuff.c $(htreefilevefl) +funnel.class.sources := hammer/funnel.c $(hgrow) +gate.class.sources := hammer/gate.c $(hfitter) +grab.class.sources := hammer/grab.c $(hfragile) +Histo.class.sources := hammer/Histo.c $(hloud) +iter.class.sources := hammer/iter.c $(hgrow) +match.class.sources := hammer/match.c $(hgrow) +maximum.class.sources := hammer/maximum.c $(hfitter) +mean.class.sources := hammer/mean.c $(hplain) +midiflush.class.sources := hammer/midiflush.c $(hplain) +midiformat.class.sources := hammer/midiformat.c $(hplain) +midiparse.class.sources := hammer/midiparse.c $(hplain) +minimum.class.sources := hammer/minimum.c $(hfitter) +mousefilter.class.sources := hammer/mousefilter.c $(hgui) +MouseState.class.sources := hammer/MouseState.c $(hgui) +mtr.class.sources := hammer/mtr.c $(hfile) +next.class.sources := hammer/next.c $(hplain) +offer.class.sources := hammer/offer.c $(htree) +onebang.class.sources := hammer/onebang.c $(hplain) +past.class.sources := hammer/past.c $(hgrowfitter) +Peak.class.sources := hammer/Peak.c $(hplain) +poltocar.class.sources := hammer/poltocar.c $(hplain) +prepend.class.sources := hammer/prepend.c $(hgrowfitter) +prob.class.sources := hammer/prob.c $(hrandfile) +pv.class.sources := hammer/pv.c $(hgrow) +seq.class.sources := hammer/seq.c $(hseq) +sinh.class.sources := hammer/sinh.c $(hplain) +speedlim.class.sources := hammer/speedlim.c $(hgrow) +spell.class.sources := hammer/spell.c $(hloud) +split.class.sources := hammer/split.c $(hplain) +spray.class.sources := hammer/spray.c $(hloud) +sprintf.class.sources := hammer/sprintf.c $(hloud) +substitute.class.sources := hammer/substitute.c $(hgrow) +sustain.class.sources := hammer/sustain.c $(hplain) +switch.class.sources := hammer/switch.c $(hfitter) +Table.class.sources := hammer/Table.c $(hrandgrowfile) +tanh.class.sources := hammer/tanh.c $(hplain) +testmess.class.sources := hammer/testmess.c $(hfragile) +thresh.class.sources := hammer/thresh.c $(hgrow) +TogEdge.class.sources := hammer/TogEdge.c $(hloud) +tosymbol.class.sources := hammer/tosymbol.c $(hgrow) +Trough.class.sources := hammer/Trough.c $(hplain) +universal.class.sources := hammer/universal.c $(hfragile) +urn.class.sources := hammer/urn.c $(hrandgrow) +Uzi.class.sources := hammer/Uzi.c $(hplain) +xbendin2.class.sources := hammer/xbendin2.c $(hplain) +xbendin.class.sources := hammer/xbendin.c $(hplain) +xbendout2.class.sources := hammer/xbendout2.c $(hplain) +xbendout.class.sources := hammer/xbendout.c $(hplain) +xnotein.class.sources := hammer/xnotein.c $(hplain) +xnoteout.class.sources := hammer/xnoteout.c $(hplain) +zl.class.sources := hammer/zl.c $(hgrow) + + +################################################################################ +### sickle ##################################################################### +################################################################################ + + +# common sources for sickle types + +ssic := \ +../shared/sickle/sic.c \ +../shared/common/loud.c + +sforky := \ +../shared/sickle/sic.c \ +../shared/common/loud.c \ +../shared/unstable/forky.c + +sfragile := \ +../shared/sickle/sic.c \ +../shared/common/loud.c \ +../shared/unstable/fragile.c + +sfragilefitter := \ +../shared/sickle/sic.c \ +../shared/common/loud.c \ +../shared/common/fitter.c \ +../shared/unstable/fragile.c + +sgrow := \ +../shared/common/grow.c \ +../shared/sickle/sic.c \ +../shared/common/loud.c + +sgrowclc := \ +../shared/common/grow.c \ +../shared/common/clc.c \ +../shared/sickle/sic.c \ +../shared/common/loud.c + +sgrowforky := \ +../shared/common/grow.c \ +../shared/sickle/sic.c \ +../shared/common/loud.c \ +../shared/common/fitter.c \ +../shared/unstable/forky.c + +svefl := \ +../shared/common/vefl.c \ +../shared/sickle/sic.c \ +../shared/common/loud.c \ +../shared/unstable/fragile.c + +sarsic := \ +../shared/sickle/sic.c \ +../shared/sickle/arsic.c \ +../shared/common/vefl.c \ +../shared/common/loud.c \ +../shared/unstable/fragile.c + +sarsicfitter := \ +../shared/sickle/sic.c \ +../shared/sickle/arsic.c \ +../shared/common/vefl.c \ +../shared/common/loud.c \ +../shared/common/fitter.c \ +../shared/unstable/fragile.c + +sfile := \ +../shared/hammer/file.c \ +../shared/sickle/sic.c \ +../shared/common/loud.c \ +../shared/common/os.c \ +../shared/unstable/forky.c + +# special case: sickle but not tilde (see class linedrive) +splainnotilde := \ +../shared/common/loud.c \ +../shared/common/fitter.c + + +# sickle classes + +abs~.class.sources := sickle/abs.c $(ssic) +acos~.class.sources := sickle/acos.c $(ssic) +acosh~.class.sources := sickle/acosh.c $(ssic) +allpass~.class.sources := sickle/allpass.c $(ssic) +asin~.class.sources := sickle/asin.c $(ssic) +asinh~.class.sources := sickle/asinh.c $(ssic) +atan2~.class.sources := sickle/atan2.c $(ssic) +atan~.class.sources := sickle/atan.c $(ssic) +atanh~.class.sources := sickle/atanh.c $(ssic) +average~.class.sources := sickle/average.c $(ssic) +avg~.class.sources := sickle/avg.c $(ssic) +bitand~.class.sources := sickle/bitand.c $(sforky) +bitnot~.class.sources := sickle/bitnot.c $(ssic) +bitor~.class.sources := sickle/bitor.c $(sforky) +bitshift~.class.sources := sickle/bitshift.c $(ssic) +bitxor~.class.sources := sickle/bitxor.c $(sforky) +buffir~.class.sources := sickle/buffir.c $(sarsicfitter) +capture~.class.sources := sickle/capture.c $(sfile) +cartopol~.class.sources := sickle/cartopol.c $(sfragile) +change~.class.sources := sickle/change.c $(ssic) +click~.class.sources := sickle/click.c $(sgrow) +Clip~.class.sources := sickle/Clip.c $(ssic) +comb~.class.sources := sickle/comb.c $(ssic) +cosh~.class.sources := sickle/cosh.c $(ssic) +cosx~.class.sources := sickle/cosx.c $(ssic) +count~.class.sources := sickle/count.c $(ssic) +curve~.class.sources := sickle/curve.c $(sgrowclc) +cycle~.class.sources := sickle/cycle.c $(svefl) +delay~.class.sources := sickle/delay.c $(ssic) +delta~.class.sources := sickle/delta.c $(ssic) +deltaclip~.class.sources := sickle/deltaclip.c $(ssic) +edge~.class.sources := sickle/edge.c $(ssic) +frameaccum~.class.sources := sickle/frameaccum.c $(sgrow) +framedelta~.class.sources := sickle/framedelta.c $(sgrow) +index~.class.sources := sickle/index.c $(sarsic) +kink~.class.sources := sickle/kink.c $(ssic) +Line~.class.sources := sickle/Line.c $(sgrow) +linedrive.class.sources := sickle/linedrive.c $(splainnotilde) +log~.class.sources := sickle/log.c $(ssic) +lookup~.class.sources := sickle/lookup.c $(sarsic) +lores~.class.sources := sickle/lores.c $(ssic) +matrix~.class.sources := sickle/matrix.c $(sfragilefitter) +maximum~.class.sources := sickle/maximum.c $(ssic) +minimum~.class.sources := sickle/minimum.c $(ssic) +minmax~.class.sources := sickle/minmax.c $(ssic) +mstosamps~.class.sources := sickle/mstosamps.c $(ssic) +onepole~.class.sources := sickle/onepole.c $(ssic) +overdrive~.class.sources := sickle/overdrive.c $(ssic) +peakamp~.class.sources := sickle/peakamp.c $(ssic) +peek~.class.sources := sickle/peek.c $(sarsic) +phasewrap~.class.sources := sickle/phasewrap.c $(ssic) +pink~.class.sources := sickle/pink.c $(ssic) +play~.class.sources := sickle/play.c $(sarsic) +poke~.class.sources := sickle/poke.c $(sarsic) +poltocar~.class.sources := sickle/poltocar.c $(sfragile) +pong~.class.sources := sickle/pong.c $(sforky) +pow~.class.sources := sickle/pow.c $(ssic) +rampsmooth~.class.sources := sickle/rampsmooth.c $(ssic) +rand~.class.sources := sickle/rand.c $(ssic) +record~.class.sources := sickle/record.c $(sarsic) +reson~.class.sources := sickle/reson.c $(ssic) +sah~.class.sources := sickle/sah.c $(ssic) +sampstoms~.class.sources := sickle/sampstoms.c $(ssic) +Scope~.class.sources := sickle/Scope.c $(sgrowforky) +sinh~.class.sources := sickle/sinh.c $(ssic) +sinx~.class.sources := sickle/sinx.c $(ssic) +slide~.class.sources := sickle/slide.c $(ssic) +Snapshot~.class.sources := sickle/Snapshot.c $(ssic) +spike~.class.sources := sickle/spike.c $(ssic) +svf~.class.sources := sickle/svf.c $(ssic) +tanh~.class.sources := sickle/tanh.c $(ssic) +tanx~.class.sources := sickle/tanx.c $(ssic) +train~.class.sources := sickle/train.c $(ssic) +trapezoid~.class.sources := sickle/trapezoid.c $(ssic) +triangle~.class.sources := sickle/triangle.c $(ssic) +vectral~.class.sources := sickle/vectral.c $(ssic) +wave~.class.sources := sickle/wave.c $(sarsic) +zerox~.class.sources := sickle/zerox.c $(ssic) + +nettles.class.sources := shadow/nettles.c $(ssic) + + +datafiles = \ +$(wildcard ../doc/help/cyclone/*-help.pd) \ +../doc/help/cyclone/all_about_cyclone.pd \ +../doc/help/cyclone/dspSwitch~.pd \ +../doc/help/cyclone/output~.pd \ +../doc/help/cyclone/test.mid \ +../doc/help/cyclone/voice.wav \ +../LICENSE.txt \ +README.txt \ +cyclone-meta.pd \ +$(wildcard abstractions/*.pd) + + +################################################################################ +### pdlibbuilder ############################################################### +################################################################################ + + +# Include Makefile.pdlibbuilder from this directory, or else from central +# externals directory in pd-extended configuration. + +externalsdir = ../.. + +include $(firstword $(wildcard Makefile.pdlibbuilder \ + $(externalsdir)/Makefile.pdlibbuilder)) + + +################################################################################ +### cyclone extra targets ###################################################### +################################################################################ + + +install: install-tests install-aliases + +install-tests: all + $(INSTALL_DIR) -v $(installpath)/tests && \ + $(INSTALL_DATA) $(wildcard ../test/cyclone/*) $(installpath)/tests + +# on Linux, add symbolic links for lower case aliases +install-aliases: all +ifeq ($(platform),Linux) + $(INSTALL_DIR) -v $(installpath) + cd $(installpath); \ + ln -s -f Append.$(extension) append.$(extension); \ + ln -s -f Append-help.pd append-help.pd; \ + ln -s -f Borax.$(extension) borax.$(extension); \ + ln -s -f Borax-help.pd borax-help.pd; \ + ln -s -f Bucket.$(extension) bucket.$(extension); \ + ln -s -f Bucket-help.pd bucket-help.pd; \ + ln -s -f Clip.$(extension) clip.$(extension); \ + ln -s -f Clip-help.pd clip-help.pd; \ + ln -s -f Decode.$(extension) decode.$(extension); \ + ln -s -f Decode-help.pd decode-help.pd; \ + ln -s -f Histo.$(extension) histo.$(extension); \ + ln -s -f Histo-help.pd histo-help.pd; \ + ln -s -f MouseState.$(extension) mousestate.$(extension); \ + ln -s -f MouseState-help.pd mousestate-help.pd; \ + ln -s -f Peak.$(extension) peak.$(extension); \ + ln -s -f Peak-help.pd peak-help.pd; \ + ln -s -f Table.$(extension) table.$(extension); \ + ln -s -f Table-help.pd table-help.pd; \ + ln -s -f TogEdge.$(extension) togedge.$(extension); \ + ln -s -f TogEdge-help.pd togedge-help.pd; \ + ln -s -f Trough.$(extension) trough.$(extension); \ + ln -s -f Trough-help.pd trough-help.pd; \ + ln -s -f Uzi.$(extension) uzi.$(extension); \ + ln -s -f Uzi-help.pd uzi-help.pd; \ + ln -s -f Clip~.$(extension) clip~.$(extension); \ + ln -s -f Clip~-help.pd clip~-help.pd; \ + ln -s -f Line~.$(extension) line~.$(extension); \ + ln -s -f Line~-help.pd line~-help.pd; \ + ln -s -f Scope~.$(extension) scope~.$(extension); \ + ln -s -f Scope~-help.pd scope~-help.pd; \ + ln -s -f Snapshot~.$(extension) snapshot~.$(extension); \ + ln -s -f Snapshot~-help.pd snapshot~-help.pd +endif + diff --git a/cyclone/Makefile.pdlibbuilder b/cyclone/Makefile.pdlibbuilder new file mode 100644 index 0000000..3bbea05 --- /dev/null +++ b/cyclone/Makefile.pdlibbuilder @@ -0,0 +1,1015 @@ +# +# Makefile.pdlibbuilder dated 20150614-1 +# +# GNUmake-based helper makefile for Pure Data externals. +# Written by Katja Vetter March-May 2015 for the public domain. +# Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's +# ShakeNMake. +# +# +#=== features ================================================================== +# +# +# - defines flags and extension according to autodetected platform +# - evaluates implicit dependencies for non-clean builds +# - defines rules to build from C or C++ sources +# - defines rules to build Pd class- or lib executables +# - defines rules for libdir installation +# - defines convenience targets for developer and user +# +# +#=== basic usage =============================================================== +# +# +# In your Makefile, define your Pd lib name and class sources, and include +# Makefile.pdlibbuilder at the end of the Makefile. Like so: +# +# ________________________________________________________________________ +# +# # Makefile for mylib +# +# lib.name = mylib +# +# class.sources = myclass1.c myclass2.c +# +# include path/to/Makefile.pdlibbuilder +# ________________________________________________________________________ +# +# +# For files in class.sources it is assumed that class basename = source file +# basename. All other class sources must be specified in variables +# .class.sources. +# +# The default target builds all classes as indidividual executables with Pd's +# default extension for the platform. +# +# +#=== variables ================================================================= +# +# +# The following variables may be specified in your Makefile: +# +# - lib.name: name of the library +# - class.sources: sources files (C or C++), class name = source basename +# +# - cflags: add preprocessor / compiler flags, notably -I or -D options +# - ldflags: add linker / loader flags +# - ldlibs: add flags for dynamic linking +# +# - .class.sources: list / add class-specific source files (C or C++) +# - .class.ldflags: add class-specific ld flags +# - .class.ldlibs: add class-specific dynamic link libs +# +# - lib.setup.sources: source file(s) with routines to set up all classes +# - common.sources: sources to include in each class statically +# - shared.sources: source file(s) of dynamic lib shared by all classes +# +# - datafiles: non-executable files, including abstractions and help patches +# - datadirs: directories with data files +# +# - externalsdir: relative path to 'externals' in pd SVN, default is '..' +# +# - makefiles: extra makefiles that should be made +# - makefiledirs: extra directories with makefiles that should be made +# +# +#=== Pd-extended libdir concept ================================================ +# +# +# For libdir layout as conceived by Hans-Christoph Steiner, see: +# +# https://puredata.info/docs/developer/Libdir +# +# Files README.txt, LICENSE.txt and -meta.pd are part of the libdir +# convention. Help patches for each class and abstraction are supposed to be +# available. Makefile.pdlibbuilder does not force the presence of these files +# however, and it does not automatically include such files in libdir +# installations. +# +# +#=== search paths ============================================================== +# +# +# Source file paths other than current working directory must be explicited in +# your Makefile. Executables are built in current working directory. Object (.o) +# files are built in the directory of their source files. +# +# Variable 'pdincludepath' stores the include path for Pd API headers. Default +# locations, searched in order of priority: +# +# any OS: $(externalsdir)../pd/include/pdextended +# $(externalsdir)../pd/include +# +# Linux: /usr/include/pdextended +# /usr/include/pd +# +# OSX: /Applications/Pd-extended.app/Contents/Resources/include/pdextended +# /Applications/Pd.app/Contents/Resources/include +# +# Windows: c/PROGRA~1/pd/include +# c/PROGRA~2/pd/include +# +# +# Overview of install paths per platform, taken from +# https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files. +# The rationale for a global install path (rather than in home) on Linux, +# is that some people share a home dir between 32 and 64 bit installations. +# +# Linux: $(libdir)/pd-externals/$(lib.name) +# OSX: ~/Library/Pd/$(lib.name) +# Windows: c/PROGRA~1/COMMON~1/Pd/$(lib.name) +# +# +#=== targets =================================================================== +# +# +# all: build classes (default) or library blob (if make-lib-executable=true) +# alldebug: build all with -g option turned on for debug symbols +# build-classes: build all class executables and optional shared lib +# build-lib: build all classes into a single lib executable +# : force clean build of an individual class +# +# install: install executables and data files +# dist: make source package for distribution (not yet implemented) +# dpkg-source: make debian source package (not yet implemented) +# +# clean: remove build products from source tree +# distclean: not yet implemented +# +# .pre: make preprocessor output file in current working directory +# .lst: make asm/source output file in current working directory +# help: print help text +# vars: print makefile variables +# allvars: print all variables +# depend: print generated prerequisites +# coffee: dummy target +# +# +#=== syntax conventions ======================================================== +# +# +# Makefile.pdlibbuilder variable names are lower case. Default make variables, +# environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) +# are upper case. Use target 'allvars' to print all variables and their values. +# +# Words in 'function' names are separated by dashes, like in 'make-object-file'. +# Words in data variables may be separated by dots, like in 'foo.class.sources'. +# Make's 'basename' function is sometimes exploited to split such variable +# names. +# +# +#=== useful make options ======================================================= +# +# +# Use 'make -d ' to print debug details of the make process +# Use 'make -p ' to print make's database +# +# +#=== TODO ====================================================================== +# +# +# - replace -DOSXFAT with specific architecture defines +# - document installpath +# - check if there's issues with & and $ in filenames +# - -static-libgcc or shared dll in MinGW? +# - fix Windows paths: can we allow spaces? then use env. var. paths +# - variables PD_PATH and PDINCLUDE for compatibility with pd-extended template +# - variable for external dependencies? +# - cygwin support +# - android support +# - makefile template targets dpkg-source dist libdir distclean tags and etags +# +# +################################################################################ +### pre-flight checks ########################################################## +################################################################################ + + +# GNU make version 3.81 (2006) or higher is required because of the following: +# - function 'info' +# - variable '.DEFAULT_GOAL' + +# force exit when make version is < 3.81 +ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) + $(error GNU make version 3.81 or higher is required) +endif + +# Relative path to directory 'externals' in pd-extended SVN tree. Default is +# parent of current working directory. May be defined differently in including +# makefile. This variable is used to probe for paths. +externalsdir ?= .. + +# variable you can use to check if Makefile.pdlibbuilder is already included +Makefile.pdlibbuilder = true + + +################################################################################ +### variables per platform ##################################################### +################################################################################ + + +#=== flags per architecture ==================================================== + + +# Set architecture-dependent flags, mainly for Linux. For Mac and Windows, +# arch.flags are overriden below. + +machine := $(shell uname -m) + +# Raspberry Pi 1st generation +ifeq ($(machine), armv6l) + arch.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard + CFLAGS += -fsingle-precision-constant +endif + +# Beagle, Udoo, RPi2 etc. +ifeq ($(machine), armv7l) + arch.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard + CFLAGS += -fsingle-precision-constant +endif + +# Intel 32 bit, build with SSE and SSE2 instructions +ifeq ($(findstring $(machine), i386 i686), $(machine)) + arch.flags = -march=pentium4 -mfpmath=sse -msse -msse2 +endif + +# Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions +ifeq ($(findstring $(machine), ia64 x86_64), $(machine)) + arch.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 +endif + + +#=== platform ================================================================== + + +# The following platforms are defined: Linux, Darwin, Windows. GNU and +# GNU/kFreeBSD are treated as Linux because they use the same options. + +uname := $(shell uname) + +ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) + platform = Linux +endif + +ifeq ($(uname), Darwin) + platform = Darwin +endif + +ifeq ($(findstring MINGW, $(uname)), MINGW) + platform = Windows +endif + +# TODO: Cygwin, Android + + +#=== flags and paths for Linux ================================================= + + +ifeq ($(platform), Linux) + prefix = /usr/local + libdir := $(prefix)/lib + pkglibdir ?= $(libdir)/pd-externals + mpdhsearchpaths := \ + $(externalsdir)/../pd/src/ \ + /usr/include/pdextended/ \ + /usr/include/pd/ + pdincludepath := \ + $(firstword $(dir $(wildcard $(addsuffix m_pd.h, $(mpdhsearchpaths))))) + extension = pd_linux + cpp.flags := -DUNIX + c.flags := -fpic + c.ldflags := -rdynamic -shared -fpic -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags + c.ldlibs := -lc -lm + cxx.flags := -fpic -fcheck-new + cxx.ldflags := -rdynamic -shared -fpic -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags + cxx.ldlibs := -lc -lm -lstdc++ + shared.extension = so + shared.ldflags = -rdynamic -fpic -shared -Wl,-soname,$(shared.lib) + stripflags = --strip-unneeded -R .note -R .comment +endif + + +#=== flags and paths for Darwin ================================================ + + +# On OSX we try to build fat binaries by default. It is assumed that OSX i386 +# can build for ppc and OSX x86_64 can't. TODO: try to refine this condition. +# TODO: replace -DOSXFAT with more specific defines. +# LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for +# OSX x86_64. + +ifeq ($(platform), Darwin) + pkglibdir ?= $(HOME)/Library/Pd + pdpath := $(firstword $(wildcard \ + $(externalsdir)/../pd \ + c/PROGRA~1/pd \ + c/PROGRA~2/pd)) + mpdhsearchpaths := \ + $(externalsdir)/../pd/src/ \ + /Applications/Pd-extended.app/Contents/Resources/include/pdextended/ \ + /Applications/Pd.app/Contents/Resources/src/ + pdincludepath := \ + $(firstword $(dir $(wildcard $(addsuffix m_pd.h, $(mpdhsearchpaths))))) + extension = pd_darwin + arch.flags = + cpp.flags := -DUNIX -DMACOSX -I /sw/include + c.flags := + c.ldflags := -undefined suppress -flat_namespace -bundle + c.ldlibs := -lc + cxx.ldflags := -undefined suppress -flat_namespace -bundle + cxx.ldlibs := -lc + shared.extension = dylib + shared.ldflags = -dynamiclib -undefined dynamic_lookup \ + -install_name @loader_path/$(shared.lib) \ + -compatibility_version 1 -current_version 1.0 + stripflags = -x + ifeq ($(machine), i386) + cpp.flags += -DOSXFAT + cxx.flags := -fcheck-new + arch.flags := -arch ppc -arch i386 -arch x86_64 -mmacosx-version-min=10.4 + endif + ifeq ($(machine), x86_64) + cpp.flags += -DOSXFAT + arch.flags := -arch i386 -arch x86_64 -mmacosx-version-min=10.5 + endif +endif + + +#=== flags and paths for Windows =============================================== + + +# On Windows we build 32 bit by default to match Pd(-extended) binary +# distributions. This may change in the future. +# Paths shall not contain spaces, use 8.3 format instead. +# TODO: try to convert env vars %PROGRAMFILES% and %COMMONPROGRAMFILES% to +# 8.3 format. + +ifeq ($(platform), Windows) + pkglibdir ?= c/PROGRA~1/COMMON~1/Pd + mpdhsearchpaths := \ + $(externalsdir)/../pd/src \ + c/PROGRA~1/pd/src \ + c/PROGRA~2/pd/src + pdincludepath := \ + $(firstword $(dir $(wildcard $(addsuffix m_pd.h, $(mpdhsearchpaths))))) + extension = dll + CC = gcc + CXX = g++ + arch.flags := -march=pentium4 -msse -msse2 -mfpmath=sse + cpp.flags := -DMSW -DNT + c.flags := + c.ldflags := -static-libgcc -shared \ + -Wl,--enable-auto-import $(pdpath)/bin/pd.dll + c.ldlibs := + cxx.flags := -fcheck-new + cxx.ldflags := -static-libstdc++ -shared \ + -Wl,--enable-auto-import $(pdpath)/bin/pd.dll + cxx.ldlibs := + shared.extension = dll + shared.ldflags := -static-libgcc -shared \ + $(pdpath)/bin/pd.dll + stripflags = --strip-unneeded -R .note -R .comment +endif +# TODO: should we set -mms-bitfields or not? + + +#=== platform-independent flags ================================================ + + +# From GNU make docs: 'Users expect to be able to specify CFLAGS freely +# themselves.' So we use CFLAGS to define platform-independent options which +# are not strictly required for compilation: optimizations and warnings. + +CFLAGS = -O3 -ffast-math -funroll-loops -fomit-frame-pointer + +# warnings are enabled by default, but may be suppressed +ifneq ($(suppress-warnings),yes) + CFLAGS += -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing +endif + + +#=== paths for installation ==================================================== + + +# Default pkglibdir is specified above per platform. It is aliased as +# 'objectsdir' to retain compatibility with pd-extended template. +objectsdir := $(pkglibdir) + +# base path where all components of the lib will be installed by default +installpath := $(DESTDIR)$(objectsdir)/$(lib.name) + + +#=== Makefile.config =========================================================== + + +# Optionally include Makefile.config, which can be used to override default +# paths or extensions. + +-include Makefile.config + + +#=== accumulated build flags =================================================== + + +# Variables cflags, ldflags and ldlibs may be defined in including makefile. +# Variable CFLAGS may be defined as command line argument. + +# preprocessor flags +cpp.flags += -DPD -I $(pdincludepath) + +# flags for C compiler / linker +c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) +c.ldflags := $(c.ldflags) $(ldflags) +c.ldlibs := $(c.ldlibs) $(ldlibs) + +# flags for C++ compiler / linker +cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) +cxx.ldflags := $(cxx.ldflags) $(ldflags) +cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) + + +################################################################################ +### variables: files ########################################################### +################################################################################ + + +# strip possibles spaces from lib.name, they mess up calculated file names +lib.name := $(strip $(lib.name)) + + +#=== sources =================================================================== + + +# Based on file names in class.sources, (re)define .class.sources + +define add-class-source +$(notdir $(basename $v)).class.sources += $v +endef + +$(foreach v, $(class.sources), $(eval $(add-class-source))) + +# derive class names from .class.sources variables +sourcevariables := $(filter %.class.sources, $(.VARIABLES)) +classes := $(basename $(basename $(sourcevariables))) + +# accumulate all source files specified in makefile +classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) +all.sources := $(classes.sources) $(lib.setup.sources) \ + $(shared.sources) $(common.sources) + +# construct shared lib name if shared sources are defined +ifdef shared.sources + shared.lib := lib$(lib.name).$(shared.extension) +else + shared.lib = +endif + + +#=== build products ============================================================ + + +# construct object filenames from all C and C++ source file names +classes.objects := $(addsuffix .o, $(basename $(classes.sources))) +common.objects := $(addsuffix .o, $(basename $(common.sources))) +shared.objects := $(addsuffix .o, $(basename $(shared.sources))) +lib.setup.objects := $(addsuffix .o, $(basename $(lib.setup.sources))) +all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ + $(lib.setup.objects) + +# construct class executable names from class names +classes.executables := $(addsuffix .$(extension), $(classes)) + + +################################################################################ +### variables: tools ########################################################### +################################################################################ + + +# aliases so we can define 'compile-$1' and give 'c' or 'cxx' as argument +compile-c := $(CC) +compile-cxx := $(CXX) + +# install executables, data and directories while preserving time stamps +INSTALL = install +INSTALL_PROGRAM := $(INSTALL) -p -m 644 +INSTALL_DATA := $(INSTALL) -p -m 644 +INSTALL_DIR := $(INSTALL) -p -m 755 -d + + +################################################################################ +### checks ##################################################################### +################################################################################ + + +# At this point most variables are defined. Time to do some checks and info's. + +# 'forward declaration' of default target, needed to do checks +all: + +# To avoid unpredictable results, make sure the default target is not redefined +# by including makefile. +ifneq ($(.DEFAULT_GOAL), all) + $(error Default target must be 'all'.) +endif + +# find out which target(s) will be made +ifdef MAKECMDGOALS + goals := $(MAKECMDGOALS) +else + goals := all +endif + +# check if m_pd.h is found and print info about it +$(if $(wildcard $(pdincludepath)m_pd.h), \ + $(info ++++ info: using Pd API $(pdincludepath)m_pd.h), \ + $(warning Where is your m_pd.h? It was searched but not found on one of the \ + following locations: $(mpdhsearchpaths). Alternatively you can specify \ + variable pdincludepath as argument.)) + +# print target info +$(info ++++ info: making target $(goals) in lib $(lib.name)) + +# when installing, print installpath info +$(if $(filter install install-lib, $(goals)), $(info ++++ info: \ + installpath is '$(installpath)')) + + +#=== define executables ======================================================== + + +# By default we build class executables, and optionally a shared dynamic link +# lib. When make-lib-executable=yes we build all classes into a single lib +# executable, on the condition that variable lib.setup.sources is defined. + +ifeq ($(make-lib-executable),yes) + $(if $(lib.setup.sources), ,\ + $(error Can not build library blob because lib.setup.sources is undefined)) + executables := $(lib.name).$(extension) +else + executables := $(classes.executables) $(shared.lib) +endif + + +#=== library version =========================================================== + + +# check library version if meta file exists + +metafile := $(wildcard $(lib.name)-meta.pd) + +ifdef metafile + lib.version := $(shell sed -n \ + 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ + $(lib.name)-meta.pd) +endif + + +################################################################################ +### rules: special targets ##################################################### +################################################################################ + + +# Disable built-in rules. If some target can't be built with the specified +# rules, it should not be built at all. +MAKEFLAGS += --no-builtin-rules + +.PRECIOUS: +.SUFFIXES: +.PHONY: all build-classes build-lib $(classes) $(makefiledirs) $(makefiles)\ + install install-classes install-lib \ + install-datafiles install-datadirs \ + force clean vars allvars depend help + + +################################################################################ +### rules: build targets ####################################################### +################################################################################ + + +# build lib when make-lib-executable = true, otherwise build classes (default) +all: $(if $(make-lib-executable), build-lib, build-classes) + +# build all with -g option turned on for debug symbols +alldebug: c.flags += -g +alldebug: cxx.flags += -g +alldebug: all + + +#=== one class per executable ================================================== + + +# build all class executables (default) +build-classes: $(classes.executables) + $(info ++++ info: class executables in $(lib.name) completed) + +# recipe for linking objects in class executable +# argument $1 = compiler type (c or cxx) +# argument $2 = class basename +define link-class + $(compile-$1) \ + $(arch.flags) \ + $($1.ldflags) $($2.class.ldflags) \ + -o $2.$(extension) \ + $(addsuffix .o, $(basename $($2.class.sources))) \ + $(addsuffix .o, $(basename $(common.sources))) \ + $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) +endef + +# general rule for linking object files in class executable +%.$(extension): $(shared.lib) + $(info ++++ info: linking objects in $@ for lib $(lib.name)) + $(if $(filter %.cc %.cpp, $($*.class.sources)), \ + $(call link-class,cxx,$*), \ + $(call link-class,c,$*)) + + +#=== library blob ============================================================== + + +# build all classes into single executable +build-lib: $(lib.name).$(extension) + $(info ++++ info: library blob $(lib.name).$(extension) completed) + +# recipe for linking objects in lib executable +# argument $1 = compiler type (c or cxx) +define link-lib + $(compile-$1) \ + $(arch.flags) \ + $($1.ldflags) $(lib.ldflags) \ + -o $(lib.name).$(extension) $(all.objects) \ + $($1.ldlibs) $(lib.ldlibs) +endef + +# rule for linking objects in lib executable +# declared conditionally to avoid name clashes +ifeq ($(make-lib-executable),yes) +$(lib.name).$(extension): $(all.objects) + $(if $(filter %.cc %.cpp, $(all.sources)), \ + $(call link-lib,cxx), \ + $(call link-lib,c)) +endif + + +#=== shared dynamic lib ======================================================== + + +# recipe for linking objects in shared executable +# argument $1 = compiler type (c or cxx) +define link-shared + $(compile-$1) \ + $(arch.flags) \ + $(shared.ldflags) \ + -o lib$(lib.name).$(shared.extension) $(shared.objects) \ + $($1.ldlibs) $(shared.ldlibs) +endef + +# rule for linking objects in shared executable +# build recipe is in macro 'link-shared' +lib$(lib.name).$(shared.extension): $(shared.objects) + $(info ++++ info: linking objects in shared lib $@) + $(if $(filter %.cc %.cpp, $(shared.sources)), \ + $(call link-shared,cxx), \ + $(call link-shared,c)) + + +#=== object files ============================================================== + + +# recipe to make .o from source +# argument $1 is compiler tupe (c or cxx) +define make-object-file + $(info ++++ info: making $@ in lib $(lib.name)) + $(compile-$1) \ + $($1.flags) \ + $(arch.flags) -o $@ -c $< +endef + +# Three rules to create .o files. These are double colon 'terminal' rules, +# meaning they are the last in a rules chain. + +%.o:: %.c + $(call make-object-file,c) + +%.o:: %.cc + $(call make-object-file,cxx) + +%.o:: %.cpp + $(call make-object-file,cxx) + + +#=== explicit prerequisites for class executables ============================== + + +# For class executables, prerequisite rules are declared in run time. Target +# 'depend' prints these rules for debugging purposes. + +# declare explicit prerequisites rule like 'class: class.extension' +# argument $v is class basename +define declare-class-target +$v: $v.$(extension) +endef + +# declare explicit prerequisites rule like 'class.extension: object1.o object2.o' +# argument $v is class basename +define declare-class-executable-target +$v.$(extension): $(addsuffix .o, $(basename $($v.class.sources))) \ + $(addsuffix .o, $(basename $(common.sources))) +endef + +# evaluate explicit prerequisite rules for all classes +$(foreach v, $(classes), $(eval $(declare-class-target))) +$(foreach v, $(classes), $(eval $(declare-class-executable-target))) + + +#=== implicit prerequisites for class executables ============================== + + +# Evaluating implicit prerequisites (header files) with help from the +# preprocessor is 'expensive' so this is done conditionally and selectively. +# Note that it is also possible to trigger a build via install targets, in +# which case implicit prerequisites are not checked. + +must-build-everything := $(filter all default lib, $(goals)) +must-build-class := $(filter $(classes), $(goals)) +must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) + +# declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' +# argument $1 is input source file(s) +define declare-object-target +$(filter %.o: %.h, $(shell $(CPP) $(c.flags) -MM $1)) $(MAKEFILE_LIST) +endef + +# evaluate implicit prerequisite rules when rebuilding everything +ifdef must-build-everything + $(if $(wildcard $(all.objects)), \ + $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ + $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) +endif + +# evaluate implicit prerequisite rules when selectively building classes +ifdef must-build-class + $(foreach v, $(must-build-sources), \ + $(eval $(call declare-object-target, $v))) + $(foreach v, $(shared.sources), \ + $(eval $(call declare-object-target, $v))) +endif + + +################################################################################ +### rules: preprocessor and assembly files ##################################### +################################################################################ + + +# Preprocessor and assembly output files for bug tracing etc. They are not part +# of the build processes for executables. By default these files are created in +# the current working directory. Dependency tracking is not performed, the build +# is forced instead to make sure it's up to date. + +force: + + +#=== preprocessor file ========================================================= + + +# make preprocessor output file with extension .pre +# argument $1 = compiler type (c or cxx) +define make-preprocessor-file + $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ + in current working directory) + $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) +endef + +%.pre:: %.c force + $(call make-preprocessor-file,c) + +%.pre:: %.cc force + $(call make-preprocessor-file,cxx) + +%.pre:: %.cpp force + $(call make-preprocessor-file,cxx) + + +#=== assembly file ============================================================= + + +# make C / assembly interleaved output file with extension .lst +# argument $1 = compiler type (c or cxx) +define make-assembly-file + $(info ++++ info: making assembly output file $(notdir $*.lst) \ + in current working directory) + $(compile-$1) \ + -c -Wa,-a,-ad -fverbose-asm \ + $($1.flags) \ + $(arch.flags) \ + $< > $(notdir $*.lst) +endef + +%.lst:: %.c force + $(call make-assembly-file,c) + +%.lst:: %.cc force + $(call make-assembly-file,cxx) + +%.lst:: %.cpp force + $(call make-assembly-file,cxx) + + +################################################################################ +### rules: installation targets ################################################ +################################################################################ + + +# Install targets depend on successful exit status of target all because nothing +# must be installed in case of a build error. + +# strip spaces from file names +executables := $(strip $(executables)) +datafiles := $(strip $(datafiles)) +datadirs := $(strip $(datadirs)) + +# Do not make any install sub-target with empty variable definition because the +# install program would exit with an error. +install: $(if $(executables), install-executables) +install: $(if $(datafiles), install-datafiles) +install: $(if $(datadirs), install-datadirs) + +install-executables: all + $(INSTALL_DIR) -v $(installpath) + $(INSTALL_PROGRAM) $(executables) $(installpath) + $(info ++++ info: executables of lib $(lib.name) installed \ + from $(CURDIR) to $(installpath)) + +install-datafiles: all + $(INSTALL_DIR) -v $(installpath) + $(INSTALL_DATA) $(datafiles) $(installpath) + $(info ++++ info: data files of lib $(lib.name) installed \ + from $(CURDIR) to $(installpath)) + +install-datadirs: all + @set -x; $(INSTALL_DIR) $(addprefix $(installpath)/, $(datadirs)) && \ + $(foreach v, $(datadirs), \ + $(INSTALL_DATA) $(wildcard $v/*) $(installpath)/$v;) + $(info ++++ info: data directories of lib $(lib.name) installed \ + from $(CURDIR) to $(installpath)) + + +################################################################################ +### rules: distribution targets ################################################ +################################################################################ + + +# TODO +# These targets are implemented in Makefile Template, but I have to figure out +# how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. + +# make source package +dist: + @echo "target dist not yet implemented" + +# make Debian source package +dpkg-source: + @echo "target dpkg-source not yet implemented" + +$(ORIGDIR): + +$(DISTDIR): + + +################################################################################ +### rules: clean targets ####################################################### +################################################################################ + + +# delete build products from build tree +clean: + rm -f $(all.objects) + rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) + rm -f *.pre *.lst + +# remove distribution directories and tarballs from build tree +distclean: clean + @echo "target distclean not yet implemented" + + +################################################################################ +### rules: submake targets ##################################################### +################################################################################ + + +# Iterate over sub-makefiles or makefiles in other directories. + +# When 'continue-make=yes' is set, sub-makes will report 'true' to the parent +# process regardless of their real exit status. This prevents the parent make +# from being aborted by a sub-make error. +ifeq ($(continue-make),yes) + continue = || true +endif + +# These targets will trigger sub-make processes for entries in 'makefiledirs' +# and 'makefiles'. +all alldebug install clean distclean dist dkpg-source: \ + $(makefiledirs) $(makefiles) + +# this expands to identical rules for each entry in 'makefiledirs' +$(makefiledirs): + $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) + +# this expands to identical rules for each entry in 'makefiles' +$(makefiles): + $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) + + +################################################################################ +### rules: convenience targets ################################################# +################################################################################ + + +#=== show variables ============================================================ + + +# Several 'function' macro's cause errors when expanded within a rule or without +# proper arguments. Variables which are set with the define directive are only +# shown by name for that reason. +functions = \ +add-class-source \ +declare-class-target \ +declare-class-executable-target \ +declare-object-target \ +link-class \ +link-lib \ +link-shared \ +make-object-file \ +make-preprocessor-file \ +make-assembly-file \ +install-class-executable \ +define-class-sources \ +declare-helptext + +# show variables from makefiles +vars: + $(info ++++ info: showing makefile variables:) + $(foreach v,\ + $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ + $(if $(filter file, $(origin $v)),\ + $(info variable $v = $($v)))) + $(foreach v, $(functions), $(info 'function' name: $v)) + @echo + +# show all variables +allvars: + $(info ++++ info: showing default, automatic and makefile variables:) + $(foreach v, \ + $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ + $(info variable ($(origin $v)) $v = $($v))) + $(foreach v, $(functions), $(info 'function' name: $v)) + @echo + + +#=== show dependencies ========================================================= + + +# show generated prerequisites rules +depend: + $(info ++++ info: generated prerequisite rules) + $(foreach v, $(classes), $(info $(declare-class-target))) + $(foreach v, $(classes), $(info $(declare-class-executable-target))) + $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) + @echo + + +#=== show help text ============================================================ + + +# show targets and other info for user + +help: + @echo "$(declare-helptext)" + +define declare-helptext +\nMain targets (for complete overview of targets see Makefile.pdlibbuilder):\ +\n\nall (default target): build executables\ +\ninstall: install executables / data files\ +\nvars: print makefile variables for troubleshooting\ +\nhelp: print this help text\ +\n\nPd API m_pd.h is searched at the following paths (in order of priority):\ +$(addprefix \n, $(mpdhsearchpaths)) \ +\n\nPd API m_pd.h is found at the following pdincludepath: \ +\n$(pdincludepath)\ +\n\nAlternatively you can specify variable pdincludepath as argument.\ +\n\nBase path for installation of all components is:\ +\n$(installpath)\ +\n +endef + + +#=== dummy target ============================================================== + + +coffee: + @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." + + +################################################################################ +### the end #################################################################### +################################################################################ + -- cgit v1.2.1