From a331f3100da6faa8d7a8a1f5d0e3737349f12522 Mon Sep 17 00:00:00 2001 From: porres Date: Mon, 20 Jul 2020 22:16:13 -0300 Subject: [PATCH] dir --- 30/!Readdir/01/Makefile | 6 - 30/!Readdir/01/pd-lib-builder/CHANGELOG.txt | 87 -- .../01/pd-lib-builder/Makefile.pdlibbuilder | 1252 ----------------- 30/!Readdir/01/pd-lib-builder/README.md | 113 -- 30/!Readdir/01/readdir-help.pd | 58 - 30/!Readdir/01/readdir-test.pd | 33 - 30/!Readdir/01/readdir.c | 286 ---- 30/!Readdir/01/readdir.o | Bin 17316 -> 0 bytes 30/!Readdir/01/readdir.pd_darwin | Bin 26496 -> 0 bytes 30/!Readdir/02/Makefile | 6 - 30/!Readdir/02/pd-lib-builder/CHANGELOG.txt | 87 -- .../02/pd-lib-builder/Makefile.pdlibbuilder | 1252 ----------------- 30/!Readdir/02/pd-lib-builder/README.md | 113 -- 30/!Readdir/02/readdir-help.pd | 58 - 30/!Readdir/02/readdir-test.pd | 37 - 30/!Readdir/02/readdir.c | 287 ---- 30/!Readdir/02/readdir.o | Bin 17364 -> 0 bytes 30/!Readdir/02/readdir.pd_darwin | Bin 26496 -> 0 bytes 30/!Readdir/03/Makefile | 6 - 30/!Readdir/03/pd-lib-builder/CHANGELOG.txt | 87 -- .../03/pd-lib-builder/Makefile.pdlibbuilder | 1252 ----------------- 30/!Readdir/03/pd-lib-builder/README.md | 113 -- 30/!Readdir/03/readdir-help.pd | 58 - 30/!Readdir/03/readdir-test.pd | 39 - 30/!Readdir/03/readdir.c | 281 ---- 30/!Readdir/03/readdir.o | Bin 17192 -> 0 bytes 30/!Readdir/03/readdir.pd_darwin | Bin 26400 -> 0 bytes 30/!sort/Makefile | 6 - 30/!sort/pd-lib-builder/CHANGELOG.txt | 87 -- 30/!sort/pd-lib-builder/Makefile.pdlibbuilder | 1252 ----------------- 30/!sort/pd-lib-builder/README.md | 113 -- 30/!sort/sort.c | 185 --- 30/!sort/sort.o | Bin 17872 -> 0 bytes 30/!sort/sort.pd_darwin | Bin 33988 -> 0 bytes 30/!sort/test.pd | 25 - 30/Makefile | 6 - 30/bagal.wav | Bin 201710 -> 0 bytes 30/clone.pd | 4 - 30/dir-test.pd | 42 - 30/dir.c | 304 ---- 30/dir.o | Bin 20140 -> 0 bytes 30/dir.pd_darwin | Bin 35280 -> 0 bytes 30/kaglama.wav | Bin 1136 -> 0 bytes 30/pd-lib-builder/CHANGELOG.txt | 87 -- 30/pd-lib-builder/Makefile.pdlibbuilder | 1252 ----------------- 30/pd-lib-builder/README.md | 113 -- 30/test/test2.pd | 11 - Classes/Source/dir.c | 31 +- 48 files changed, 23 insertions(+), 9006 deletions(-) delete mode 100755 30/!Readdir/01/Makefile delete mode 100644 30/!Readdir/01/pd-lib-builder/CHANGELOG.txt delete mode 100644 30/!Readdir/01/pd-lib-builder/Makefile.pdlibbuilder delete mode 100644 30/!Readdir/01/pd-lib-builder/README.md delete mode 100755 30/!Readdir/01/readdir-help.pd delete mode 100755 30/!Readdir/01/readdir-test.pd delete mode 100755 30/!Readdir/01/readdir.c delete mode 100644 30/!Readdir/01/readdir.o delete mode 100755 30/!Readdir/01/readdir.pd_darwin delete mode 100755 30/!Readdir/02/Makefile delete mode 100644 30/!Readdir/02/pd-lib-builder/CHANGELOG.txt delete mode 100644 30/!Readdir/02/pd-lib-builder/Makefile.pdlibbuilder delete mode 100644 30/!Readdir/02/pd-lib-builder/README.md delete mode 100755 30/!Readdir/02/readdir-help.pd delete mode 100755 30/!Readdir/02/readdir-test.pd delete mode 100755 30/!Readdir/02/readdir.c delete mode 100644 30/!Readdir/02/readdir.o delete mode 100755 30/!Readdir/02/readdir.pd_darwin delete mode 100755 30/!Readdir/03/Makefile delete mode 100644 30/!Readdir/03/pd-lib-builder/CHANGELOG.txt delete mode 100644 30/!Readdir/03/pd-lib-builder/Makefile.pdlibbuilder delete mode 100644 30/!Readdir/03/pd-lib-builder/README.md delete mode 100755 30/!Readdir/03/readdir-help.pd delete mode 100755 30/!Readdir/03/readdir-test.pd delete mode 100755 30/!Readdir/03/readdir.c delete mode 100644 30/!Readdir/03/readdir.o delete mode 100755 30/!Readdir/03/readdir.pd_darwin delete mode 100755 30/!sort/Makefile delete mode 100644 30/!sort/pd-lib-builder/CHANGELOG.txt delete mode 100644 30/!sort/pd-lib-builder/Makefile.pdlibbuilder delete mode 100644 30/!sort/pd-lib-builder/README.md delete mode 100644 30/!sort/sort.c delete mode 100644 30/!sort/sort.o delete mode 100755 30/!sort/sort.pd_darwin delete mode 100644 30/!sort/test.pd delete mode 100755 30/Makefile delete mode 100644 30/bagal.wav delete mode 100644 30/clone.pd delete mode 100644 30/dir-test.pd delete mode 100644 30/dir.c delete mode 100644 30/dir.o delete mode 100755 30/dir.pd_darwin delete mode 100644 30/kaglama.wav delete mode 100644 30/pd-lib-builder/CHANGELOG.txt delete mode 100644 30/pd-lib-builder/Makefile.pdlibbuilder delete mode 100644 30/pd-lib-builder/README.md delete mode 100644 30/test/test2.pd diff --git a/30/!Readdir/01/Makefile b/30/!Readdir/01/Makefile deleted file mode 100755 index a24d075a5..000000000 --- a/30/!Readdir/01/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -readdir.class.sources := readdir.c - -# include Makefile.pdlibbuilder from submodule directory 'pd-lib-builder' -PDLIBBUILDER_DIR=pd-lib-builder/ -include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder diff --git a/30/!Readdir/01/pd-lib-builder/CHANGELOG.txt b/30/!Readdir/01/pd-lib-builder/CHANGELOG.txt deleted file mode 100644 index 41ac0e206..000000000 --- a/30/!Readdir/01/pd-lib-builder/CHANGELOG.txt +++ /dev/null @@ -1,87 +0,0 @@ -Changelog for Makefile.pdlibbuilder. - -v0.5.0, dated 2018-01-23 -Implement target architecture detection for Windows builds, -and set appropriate options for 32 and 64 bit (used to be for 32 bit only). -(feature, issue #37 #38, merge commit 215bf3e) - -v0.4.4, dated 2016-11-22 -Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' -(bugfix, issue #31, commit 2c14110) - -v0.4.3, dated 2016-11-02 -Replace flags '-fpic' by 'fPIC'. -(bugfix, issue #29, commit 426b38b) - -v0.4.2, dated 2016-10-30 -Fix issue where incorrect message about m_pd.h is given. -(bugfix, commit 2e13d8f) - -v0.4.1, dated 2016-10-27 -Respect cflag for minimum OSX version when defined by lib makefile. -(bugfix, pull request #22, commit 48c4127) - -v0.4.0, dated 2016-10-14 -Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can -also be defined in environment. -(feature, issue #27, commit b0dab72) - -v0.3.1, dated 2016-10-13 -Fix bug where pd.dll wouldn't be found. -(bugfix, commit a0c87be) - -v0.3.0, dated 2016-10-09 -Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. -(feature, issue #26, commit 41e9743) - -v0.2.8, dated 2016-10-09 -Allow installed files to contain weird characters (notably '$'). -(bugfix, pull request #20, commit 5b920b1) - -v0.2.7, dated 2016-10-04 -Remove all default pd search paths except vanilla's. -(discussion, issue #25, commit a6a89dc) - -v0.2.6, dated 2016-09-20 -Redefined dependency checking so it won't stall rebuilds on OSX. -(bugfix, issue #16, commit 9fd1795) - -v0.2.5, dated 2016-06-26 -Fixed dependency checking for object files in other directories. -(bugfix, commit f06e550) - -v0.2.4, dated 2016-06-25 -Fixed regression bug that disabled all dependency checking. -(bugfix, commit 1d7bb5e) - -v0.2.3, dated 2016-03-29 -Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. -(bugfix, issue #16, commit eb614fd) - -v0.2.2, dated 2016-03-28 -Removed target 'pre' because it forced rebuild of everything in 'all'. -(bugfix, issue #17, commit c989c8e) - -v0.2.1, dated 2015-12-27 -Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. -(bugfix, issue #5, commit 98f3582) - -v0.2.0, dated 2015-12-19 -Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. -(feature, pull request #9, commit 3946ea5) - -v0.1.0, dated 2015-12-08 -Added targets 'pre' and 'post' to automatically run before and after 'all'. -(feature, pull request #4, commit a5678ac) - -v0.0.2, dated 2015-12-06 -Improved methods for searching pd paths. -(bugfix, commit ed37e6b) - -v0.0.1, dated 2015-10-31 -Fixed expansion of variable 'lib.version'. -(bugfix, issue #1, commit 974b617) - -v0.0.0, dated 2015-06-24 -Initial version. -(commit 16517a2) diff --git a/30/!Readdir/01/pd-lib-builder/Makefile.pdlibbuilder b/30/!Readdir/01/pd-lib-builder/Makefile.pdlibbuilder deleted file mode 100644 index 1db3f8c2c..000000000 --- a/30/!Readdir/01/pd-lib-builder/Makefile.pdlibbuilder +++ /dev/null @@ -1,1252 +0,0 @@ -# Makefile.pdlibbuilder dated 2018-01-23 -version = 0.5.0 - -# Helper makefile for Pure Data external libraries. -# Written by Katja Vetter March-June 2015 for the public domain. No warranties. -# Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's -# ShakeNMake. -# -# Grab the newest version of Makefile.pdlibbuilder from -# https://github.com/pure-data/pd-lib-builder/ -# -# GNU make version >= 3.81 required. -# -# -#=== characteristics =========================================================== -# -# -# - defines build settings based on autodetected OS and architecture -# - defines rules to build Pd class- or lib executables from C or C++ sources -# - defines rules for libdir installation -# - defines convenience targets for developer and user -# - evaluates implicit dependencies for non-clean builds -# -# -#=== basic usage =============================================================== -# -# -# In your Makefile, define your Pd lib name and class files, and include -# Makefile.pdlibbuilder at the end of the Makefile. Like so: -# -# ________________________________________________________________________ -# -# # Makefile for mylib -# -# lib.name = mylib -# -# class.sources = myclass1.c myclass2.c -# -# datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt -# -# include Makefile.pdlibbuilder -# ________________________________________________________________________ -# -# -# For files in class.sources it is assumed that class basename == source file -# basename. The default target builds all classes as individual executables -# with Pd's default extension for the platform. For anything more than the -# most basic usage, continue reading. -# -# -#=== list of Makefile.pdlibbuilder API variables =============================== -# -# -# Variables available for definition in your library Makefile: -# -# - lib.name -# - lib.setup.sources -# - class.sources -# - common.sources -# - shared.sources -# - .class.sources -# - .class.ldflags -# - .class.ldlibs -# - cflags -# - ldflags -# - ldlibs -# - datafiles -# - datadirs -# - makefiles -# - makefiledirs -# - externalsdir -# -# Optional multiline defines evaluated per operating system: -# -# - forLinux -# - forDarwin -# - forWindows -# -# Variables available for your makefile or make command line: -# -# - make-lib-executable -# - suppress-wunused -# -# Path variables for make command line or environment: -# -# - PDDIR -# - PDINCLUDEDIR -# - PDBINDIR -# - PDLIBDIR -# -# Standard make variables for make command line or environment: -# -# - CPPFLAGS -# - CFLAGS -# - LDFLAGS -# - CC -# - CXX -# - INSTALL -# - DESTDIR -# -# Deprecated path variables: -# -# - PD_PATH -# - pdincludepath -# - pdbinpath -# - objectsdir -# -# -#=== descriptions of Makefile.pdlibbuilder API variables ======================= -# -# -# lib.name: -# Name of the library directory as it will be installed / distributed. Also the -# name of the lib executable in the case where all classes are linked into -# a single binary. -# -# lib.setup.sources: -# Source file(s) (C or C++) which must be compiled only when linking all classes -# into a single lib binary. -# -# class.sources: -# All sources files (C or C++) for which the condition holds that -# class name == source file basename. -# -# .class.sources: -# Source file(s) (C or C++) specific to class . Use this for -# multiple-source classes or when class name != source file basename. -# -# common.sources: -# Source file(s) which must be statically linked to each class in the library. -# -# shared.sources: -# Source file(s) (C or C++) to build a shared dynamic link lib, to be linked -# with all class executables. -# -# cflags, ldflags, ldlibs: -# Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic -# link libs) for the whole library. These flags are added to platform-specific -# flags defined by Makefile.pdlibbuilder. -# -# .class.ldflags and .class.ldlibs: -# Define ldflags resp. ldlibs specific to class . These flags are -# added to platform-specific flags defined by Makefile.pdlibbuilder, and flags -# defined in your Makefile for the whole library. Note: cflags can not be -# defined per class in the current implementation. -# -# datafiles and datadirs: -# All extra files you want to include in binary distributions of the -# library: abstractions and help patches, example patches, meta patch, readme -# and license texts, manuals, sound files, etcetera. Use 'datafiles' for all -# files that should go into your lib rootdir and 'datadirs' for complete -# directories you want to copy from source to distribution. -# -# forLinux, forDarwin, forWindows: -# Shorthand for 'variable definitions for Linux only' etc. Use like: -# define forLinux -# cflags += -DLINUX -# class.sources += linuxthing.c -# endef -# -# makefiles and makefiledirs: -# Extra makefiles or directories with makefiles that should be made in sub-make -# processes. -# -# make-lib-executable: -# When this variable is defined 'yes' in your makefile or as command argument, -# Makefile.pdlibbuilder will try to build all classes into a single library -# executable (but it will force exit if lib.setup.sources is undefined). -# If your makefile defines 'make-lib-executable=yes' as the library default, -# this can still be overriden with 'make-lib-executable=no' as command argument -# to build individual class executables (the Makefile.pdlibbuilder default.) -# -# suppress-wunused: -# When this variable is defined ('yes' or any other value), -Wunused-variable, -# -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, -# but the other warnings from -Wall are retained. -# -# PDDIR: -# Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -# PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. -# -# PDINCLUDEDIR: -# Directory where Pd API m_pd.h should be found, and other Pd header files. -# Overrides the default search path. -# -# PDBINDIR: -# Directory where pd.dll should be found for linking (Windows only). Overrides -# the default search path. -# -# PDLIBDIR: -# Root directory for installation of Pd library directories. Overrides the -# default install location. -# -# DESTDIR: -# Prepended path component for staged install. -# -# CPPFLAGS: -# Preprocessor flags which are not strictly required for building. -# -# CFLAGS: -# Compiler flags which are not strictly required for building. Compiler flags -# defined by Makefile.pdlibbuilder for warning, optimization and architecture -# specification are overriden by CFLAGS. -# -# LDFLAGS: -# Linker flags which are not strictly required for building. Linker flags -# defined by Makefile.pdlibbuilder for architecture specification are overriden -# by LDFLAGS. -# -# CC and CXX: -# C and C++ compiler programs as defined in your build environment. -# -# INSTALL -# Definition of install program. -# -# PD_PATH: -# Equivalent to PDDIR. Supported for compatibility with pd-extended central -# makefile, but deprecated otherwise. -# -# objectsdir: -# Root directory for installation of Pd library directories, like PDLIBDIR but -# not overridable by environment. Supported for compatibility with pd-extended -# central makefile, but deprecated otherwise. -# -# pdincludepath, pdbinpath: -# As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated -# as user variables. -# -# -#=== paths ===================================================================== -# -# -# Source files in directories other than current working directory must be -# prefixed with their relative path. Do not rely on VPATH or vpath. -# Object (.o) files are built in the directory of their source files. -# Executables are built in current working directory. -# -# Default search path for m_pd.h and other API header files is platform -# dependent, and overridable by PDINCLUDEDIR: -# -# Linux: /usr/include/pd -# -# OSX: /Applications/Pd*.app/Contents/Resources/src -# -# Windows: %PROGRAMFILES%/pd/src -# -# Default location to install pd libraries is platform dependent, and -# overridable by PDLIBDIR: -# -# Linux: /usr/local/lib/pd-externals -# OSX: ~/Library/Pd -# Windows: %APPDATA%/Pd -# -# https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files -# The rationale for not installing to ~/pd-externals by default on Linux -# is that some people share the home dir between 32 and 64 bit installations. -# -# -#=== targets =================================================================== -# -# -# all: build $(executables) plus optional post target -# post: target to build after $(executables) -# alldebug: build all with -g option turned on for debug symbols -# : force clean build of an individual class -# .pre: make preprocessor output file in current working directory -# .lst: make asm/source output file in current working directory -# -# install: install executables and data files -# clean: remove build products from source tree -# -# help: print help text -# vars: print makefile variables -# allvars: print all variables -# depend: print generated prerequisites -# coffee: dummy target -# -# Variable $(executables) expands to class executables plus optional shared lib, -# or alternatively to single lib executable when make-lib-executable=true. -# Targets pre and post can be defined by library makefile. Make sure to include -# Makefile.pdlibbuilder first so default target all will not be redefined. -# -# -#=== 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. It does not automatically include such files in libdir installations. -# Data files you want to include in distributions must be defined explicitly in -# your Makefile. -# -# -#=== Makefile.pdlibbuilder 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. -# -# 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. -# Words in variables expressing a function or command are separated by dashes, -# like in 'make-lib-executable'. -# -# -#=== useful make options ======================================================= -# -# -# Use 'make -d ' to print debug details of the make process. -# Use 'make -p ' to print make's database. -# -# -#=== TODO ====================================================================== -# -# -# - decide whether to use -static-libgcc or shared dll in MinGW -# - cygwin support -# - android support -# - Windows 64 bit support -# - figure out how to handle '$' in filenames -# - add makefile template targets dpkg-source dist libdir distclean tags? -# -# -#=== end of documentation sections ============================================= -# -# -################################################################################ -################################################################################ -################################################################################ - - -# 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 externals root dir in multi-lib source tree like -# pd-extended SVN. Default is parent of current working directory. May be -# defined differently in including makefile. -externalsdir ?= .. - -# variable you can use to check if Makefile.pdlibbuilder is already included -Makefile.pdlibbuilder = true - - -################################################################################ -### variables: library name and version ######################################## -################################################################################ - - -# strip possibles spaces from lib.name, they mess up calculated file names -lib.name := $(strip $(lib.name)) - -# if meta file exists, check library version -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' \ - $(metafile)) -endif - - -################################################################################ -### variables: files ########################################################### -################################################################################ - - -#=== sources =================================================================== - - -# (re)define .class.sources using file names in 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) - - -#=== object files ============================================================== - - -# 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) - - -#=== executables =============================================================== - - -# use recursive variables here because executable extension is not yet known - -# construct class executable names from class names -classes.executables = $(addsuffix .$(extension), $(classes)) - -# construct shared lib executable name if shared sources are defined -ifdef shared.sources - shared.lib = lib$(lib.name).$(shared.extension) -else - shared.lib = -endif - - -################################################################################ -### platform detection ######################################################### -################################################################################ - - -#=== operating system ========================================================== - - -# The following systems are defined: Linux, Darwin, Windows. GNU and -# GNU/kFreeBSD are treated as Linux to get the same options. - -uname := $(shell uname) - -ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) - system = Linux -endif - -ifeq ($(uname), Darwin) - system = Darwin -endif - -ifeq ($(filter MINGW% MSYS, $(uname)), $(uname)) - system = Windows -endif - -# Unfortunately not all Mingw versions provide a link cc > gcc, therefore -# gcc is hardcoded here (but not if CC is redefined). -ifeq ($(system), Windows) - ifeq ($(origin CC), default) - CC = gcc - endif -endif - -# evaluate possible system-specific multiline defines from library makefile -$(eval $(for$(system))) - - -# TODO: Cygwin, Android - - -#=== architecture ============================================================== - - -# native architecture of the build machine -build.arch := $(shell uname -m) - -# Target architecture as reported by compiler. Give precedence to eventual -# user-defined compiler. The first field of -- is extracted. -ifneq ($(origin CXX), default) - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CXX) -dumpmachine))) -else - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine))) -endif - -# Target architecture as reported by compiler is only used for Windows at the -# moment. For other systems this still has to be tested. -ifeq ($(system), Windows) - target.arch = $(dumpmachine.cpu) -else - target.arch = $(build.arch) -endif - - -################################################################################ -### variables per platform ##################################################### -################################################################################ - - -#=== flags per architecture ==================================================== - - -# Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, -# arch.c.flags are overriden below. - -# Raspberry Pi 1st generation -ifeq ($(target.arch), armv6l) - arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard - -# Beagle, Udoo, RPi2 etc. -else ifeq ($(target.arch), armv7l) - arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard - -# Intel 32 bit, build with SSE and SSE2 instructions -else ifeq ($(findstring $(target.arch), i386 i686), $(target.arch)) - arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 - -# Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions -else ifeq ($(findstring $(target.arch), x86_64), $(target.arch)) - arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 - -# if none of the above architectures detected -else - arch.c.flags = -endif - - -#=== flags and paths for Linux ================================================= - - -ifeq ($(system), Linux) - prefix = /usr/local - libdir := $(prefix)/lib - pkglibdir = $(libdir)/pd-externals - pdincludepath := $(wildcard /usr/include/pd) - 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. -# LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for -# OSX x86_64. - - -ifeq ($(system), Darwin) - pkglibdir = $(HOME)/Library/Pd - pdincludepath := $(firstword $(wildcard \ - /Applications/Pd*.app/Contents/Resources/src)) - extension = pd_darwin - 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 - version.flag := $(filter $(cflags), -mmacosx-version-min=%) - ifeq ($(target.arch), i386) - cxx.flags := -fcheck-new - arch := ppc i386 x86_64 - version.flag ?= -mmacosx-version-min=10.4 - endif - ifeq ($(target.arch), x86_64) - arch := i386 x86_64 - version.flag ?= -mmacosx-version-min=10.5 - endif - arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) - arch.ld.flags := $(arch.c.flags) -endif - - -#=== flags and paths for Windows =============================================== - - -# Standard paths on Windows contain spaces, and GNU make functions treat such -# paths as lists, with unintended effects. Therefore we must use shell function -# ls instead of make's wildcard, and probe for each standard path individually. -# Using double quotes around paths with spaces is obligatory. Since some path -# variables are assembled or re-expanded later, great care must be taken to put -# quotes at appropriate points throughout the makefile. Thanks, Bill. - -# paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) -ifeq ($(system), Windows) - pkglibdir := $(APPDATA)/Pd - ifndef pdbinpath - pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") - endif - ifndef pdincludepath - pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") - endif -endif - -# TODO: decide whether -mms-bitfields should be specified. -ifeq ($(system), Windows) - cpp.flags := -DMSW -DNT - ifeq ($(filter i%86 mingw32, $(target.arch)), $(target.arch)) - arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse - else ifeq (x86_64, $(target.arch)) - cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 - arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse - else - arch.c.flags = - endif - extension = dll - c.flags := - c.ldflags = -static-libgcc -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - c.ldlibs := - cxx.flags := -fcheck-new - cxx.ldflags = -static-libstdc++ -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - cxx.ldlibs := - shared.extension = dll - shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" - stripflags = --strip-unneeded -R .note -R .comment -endif - - -#=== paths ===================================================================== - - -# Platform-dependent default paths are specified above, but overridable. -# Path variables in upper case can be defined as make command argument or in the -# environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with -# the build system that pd-l2ork has inherited from pd-extended. - -PDDIR ?= $(PD_PATH) -PDINCLUDEDIR ?= $(pdincludepath) -PDBINDIR ?= $(pdbinpath) -PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) - -ifneq ($(PDDIR),) - PDINCLUDEDIR := $(wildcard $(PDDIR)/src) - PDBINDIR := $(wildcard $(PDDIR)/bin) -endif - -# base path where all components of the lib will be installed by default -installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) - -# check if include path contains spaces (as is often the case on Windows) -# if so, store the path so we can later do checks with it -pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) - - -#=== accumulated build flags =================================================== - - -# From GNU make docs: 'Users expect to be able to specify CFLAGS freely -# themselves.' So we use CFLAGS to define options which are not strictly -# required for compilation: optimizations, architecture specifications, and -# warnings. CFLAGS can be safely overriden using a make command argument. -# Variables cflags, ldflags and ldlibs may be defined in including makefile. - -optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer -warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing - -# suppress -Wunused-variable & Co if you don't want to clutter a build log -ifdef suppress-wunused - warn.flags += $(addprefix -Wno-unused-, function parameter value variable) -endif - -CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) - -# preprocessor flags -cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) - -# flags for dependency checking (cflags from makefile may define -I options) -depcheck.flags := $(cpp.flags) $(cflags) - -# architecture specifications for linker are overridable by LDFLAGS -LDFLAGS := $(arch.ld.flags) - -# now add the same ld flags to shared dynamic lib -shared.ldflags := $(shared.ldflags) $(LDFLAGS) - -# accumulated flags for C compiler / linker -c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) -c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) -c.ldlibs := $(c.ldlibs) $(ldlibs) - -# accumulated flags for C++ compiler / linker -cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) -cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) -cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) - - -################################################################################ -### variables: tools ########################################################### -################################################################################ - - -# aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument -compile-c := $(CC) -compile-cxx := $(CXX) - - -################################################################################ -### checks ##################################################################### -################################################################################ - - -# At this point most variables are defined. Now do some checks and info's -# before rules begin. - -# '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 - -# store path to Pd API m_pd.h if it is found -ifdef PDINCLUDEDIR - mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") -endif - -# print Makefile.pdlibbuilder version -$(info ++++ info: using Makefile.pdlibbuilder version $(version)) - -# when making target all, check if m_pd.h is found and print info about it -ifeq ($(goals), all) - $(if $(mpdh), \ - $(info ++++ info: using Pd API $(mpdh)), \ - $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) -endif - -# print target info -$(info ++++ info: making target $(goals) $(if $(lib.name),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 - - -################################################################################ -### 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 post build-lib \ - $(classes) $(makefiledirs) $(makefiles) \ - install install-executables install-datafiles install-datadirs \ - force clean vars allvars depend help - - -################################################################################ -### rules: build targets ####################################################### -################################################################################ - - -# Target all forces the build of targets [$(executables) post] in -# deterministic order. Target $(executables) builds class executables plus -# optional shared lib or alternatively a single lib executable when -# make-lib-executable=true. Target post is optionally defined by -# library makefile. - -all: post -post: $(executables) - -all: - $(info ++++info: target all in lib $(lib.name) completed) - -# build all with -g option turned on for debug symbols -alldebug: c.flags += -g -alldebug: cxx.flags += -g -alldebug: all - - -#=== class executable ========================================================== - - -# recipe for linking objects in class executable -# argument $1 = compiler type (c or cxx) -# argument $2 = class basename -define link-class - $(compile-$1) \ - $($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) \ - $($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) \ - $(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 file from source -# argument $1 is compiler type (c or cxx) -define make-object-file - $(info ++++ info: making $@ in lib $(lib.name)) - $(compile-$1) \ - $($1.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. - -# When the Pd include path contains spaces it will mess up the implicit -# prerequisites rules. -disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) - -ifndef disable-dependency-tracking - must-build-everything := $(filter all, $(goals)) - must-build-class := $(filter $(classes), $(goals)) - must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) -endif - -# declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' -# argument $1 is input source file(s) -# dir is explicitly added because option -MM strips it by default -define declare-object-target -$(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.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) \ - $< > $(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. - - -# -p = preserve time stamps -# -m = set permission mode (as in chmod) -# -d = create all components of specified directories -INSTALL = install -INSTALL_PROGRAM := $(INSTALL) -p -m 644 -INSTALL_DATA := $(INSTALL) -p -m 644 -INSTALL_DIR := $(INSTALL) -m 755 -d - -# 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)" - $(foreach v, $(executables), \ - $(INSTALL_PROGRAM) '$v' "$(installpath)";) - $(info ++++ info: executables of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datafiles: all - $(INSTALL_DIR) -v "$(installpath)" - $(foreach v, $(datafiles), \ - $(INSTALL_DATA) '$(v)' "$(installpath)";) - $(info ++++ info: data files of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datadirs: all - $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) - $(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. Useful when you want to quickly find -# out which sub-makes from a large set will succeed. -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 - - -# 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 ============================================================ - - -# brief info about targets and paths - -ifdef mpdh - mpdhinfo := $(mpdh) -else - mpdhinfo := m_pd.h was not found. Is Pd installed? -endif - -help: - @echo - @echo " Main targets:" - @echo " all: build executables (default target)" - @echo " install: install all components of the library" - @echo " vars: print makefile variables for troubleshooting" - @echo " allvars: print all variables for troubleshooting" - @echo " help: print this help text" - @echo - @echo " Pd API m_pd.h:" - @echo " $(mpdhinfo)" - @echo " You may specify your preferred Pd include directory as argument" - @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." - @echo - @echo " Path for installation of your libdir(s):" - @echo " $(PDLIBDIR)" - @echo " Alternatively you may specify your path for installation as argument" - @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." - @echo - @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." - @echo - - -#=== dummy target ============================================================== - - -coffee: - @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." - - -################################################################################ -### end of rules sections ###################################################### -################################################################################ - - -# for syntax highlighting in vim and github -# vim: set filetype=make: - diff --git a/30/!Readdir/01/pd-lib-builder/README.md b/30/!Readdir/01/pd-lib-builder/README.md deleted file mode 100644 index 75e070e60..000000000 --- a/30/!Readdir/01/pd-lib-builder/README.md +++ /dev/null @@ -1,113 +0,0 @@ - - -### Makefile.pdlibbuilder ### - -Helper makefile for Pure Data external libraries. -Written by Katja Vetter March-June 2015 for the public domain. No warranties. -Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's -ShakeNMake. - -GNU make version >= 3.81 required. - - -### characteristics ### - - -* defines build settings based on autodetected OS and architecture -* defines rules to build Pd class- or lib executables from C or C++ sources -* defines rules for libdir installation -* defines convenience targets for developer and user -* evaluates implicit dependencies for non-clean builds - - -### basic usage ### - - -In your Makefile, define your Pd lib name and class files, and include -Makefile.pdlibbuilder at the end of the Makefile. Like so: - - - # Makefile for mylib - - lib.name = mylib - - class.sources = myclass1.c myclass2.c - - datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt - - include Makefile.pdlibbuilder - - -For files in class.sources it is assumed that class name == source file -basename. The default target builds all classes as individual executables -with Pd's default extension for the platform. For anything more than the -most basic usage, read the documentation sections in Makefile.pdlibbuilder. - - -### paths ### - - -Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be -defined not only as make command argument but also in the environment, to -override platform-dependent defaults: - -PDDIR: -Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. - -PDINCLUDEDIR: -Directory where Pd API m_pd.h should be found, and other Pd header files. -Overrides the default search path. - -PDBINDIR: -Directory where pd.dll should be found for linking (Windows only). Overrides -the default search path. - -PDLIBDIR: -Root directory for installation of Pd library directories. Overrides the -default install location. - - -### documentation ### - - -This README.md provides only basic information. A large comment section inside -Makefile.pdlibbuilder lists and explains the available user variables, default -paths, and targets. The internal documentation reflects the exact functionality -of the particular version. A tips&tricks page is in the works. - - -### versioning ### - - -The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), -and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers -are invited to regulary check for updates, and to contribute and discuss -improvements here. If you really need to distribute a personalized version with -your library, rename Makefile.pdlibbuilder to avoid confusion. - - -### examples ### - - -Here are a few projects using the Makefile.pdlibbuilder approach: - -https://github.com/pure-data/helloworld - -https://github.com/electrickery/pd-cyclone (stable) - -https://github.com/porres/pd-cyclone (experimental) - -https://git.iem.at/pd/iemguts - -https://git.iem.at/pd/iemnet - -https://git.iem.at/pd/iem_ambi - -https://git.iem.at/pd/mediasettings - -https://git.iem.at/pd-gui/punish - -https://github.com/residuum/PuRestJson - -More examples will be referenced here when they are available. diff --git a/30/!Readdir/01/readdir-help.pd b/30/!Readdir/01/readdir-help.pd deleted file mode 100755 index 74bc02a6d..000000000 --- a/30/!Readdir/01/readdir-help.pd +++ /dev/null @@ -1,58 +0,0 @@ -#N canvas 0 26 510 574 10; -#X msg 87 194 close; -#X msg 54 75 bang; -#X msg 77 144 tell; -#X obj 38 292 print dir-entry; -#X obj 82 264 print end-of-directory; -#X text 130 4 readdir : simple directory accessor; -#X text 240 523 Bryan Jurish ; -#X text 155 36 open DIR : opens the directory DIR; -#X text 184 77 bang : outlet next directory entry; -#X text 184 94 next : ditto; -#X msg 61 94 next; -#X msg 71 125 rewind; -#X text 173 125 rewind : return to beginning of directory; -#X text 187 145 tell : output current position; -#X text 146 163 seek FLOAT : goto position FLOAT; -#X msg 82 163 seek 0; -#X text 181 192 close : close directory; -#X text 258 265 2nd outlet bangs at end of directory; -#X text 260 295 Directory entries go to 1st outlet; -#X text 39 321 Directory entries appear as messages of the form TYPE -NAME \, where NAME is the name of the entry \, and TYPE is one of the -following:; -#X text 147 361 file : regular file; -#X text 154 374 dir : subdirectory; -#X text 147 387 fifo : named pipe; -#X text 147 400 sock : local-domain socket; -#X text 133 413 chrdev : character device; -#X text 133 427 blkdev : block device; -#X obj 38 237 readdir; -#X msg 44 46 open /tmp; -#X text 126 440 unknown : something else (maybe a symlink); -#X msg 38 26 open .; -#X text 39 462 BEWARE: Recognition of directory entry types does NOT -work on windows or any other system whose `dirent' struct is missing -the `d_type' field. On such systems \, the TYPE selector on the first -outlet is always the symbol `unknown'.; -#N canvas 260 141 494 344 META 0; -#X text 12 145 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan -Wilkes for Pd version 0.42.; -#X text 12 25 LICENSE GPL v2; -#X text 12 125 AUTHOR Bryan Jurish ; -#X text 12 5 KEYWORDS control filesystem; -#X text 12 45 DESCRIPTION simple directory accessor; -#X text 12 65 INLET_0 open bang next rewind tell seek close; -#X text 12 85 OUTLET_0 anything; -#X text 12 105 OUTLET_1 bang; -#X restore 451 552 pd META; -#X connect 0 0 26 0; -#X connect 1 0 26 0; -#X connect 2 0 26 0; -#X connect 10 0 26 0; -#X connect 11 0 26 0; -#X connect 15 0 26 0; -#X connect 26 0 3 0; -#X connect 26 1 4 0; -#X connect 27 0 26 0; -#X connect 29 0 26 0; diff --git a/30/!Readdir/01/readdir-test.pd b/30/!Readdir/01/readdir-test.pd deleted file mode 100755 index 7dd11def9..000000000 --- a/30/!Readdir/01/readdir-test.pd +++ /dev/null @@ -1,33 +0,0 @@ -#N canvas 958 137 337 420 10; -#X obj 64 274 readdir; -#X msg 141 236 close; -#X obj 108 301 print end-of-directory; -#X msg 85 119 bang; -#X msg 64 93 open \$1; -#X msg 64 37 .; -#X msg 101 37 test; -#X msg 144 37 foo; -#X obj 64 69 symbol; -#X obj 64 328 print entry; -#X msg 109 166 tell; -#X msg 105 142 rewind; -#X msg 148 202 seek \$1; -#X floatatom 147 183 5 0 0 0 - - -; -#X obj 153 65 openpanel 1; -#X obj 193 43 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 --1; -#X connect 0 0 9 0; -#X connect 0 1 2 0; -#X connect 1 0 0 0; -#X connect 3 0 0 0; -#X connect 4 0 0 0; -#X connect 5 0 8 0; -#X connect 6 0 8 0; -#X connect 7 0 8 0; -#X connect 8 0 4 0; -#X connect 10 0 0 0; -#X connect 11 0 0 0; -#X connect 12 0 0 0; -#X connect 13 0 12 0; -#X connect 14 0 4 0; -#X connect 15 0 14 0; diff --git a/30/!Readdir/01/readdir.c b/30/!Readdir/01/readdir.c deleted file mode 100755 index ded161737..000000000 --- a/30/!Readdir/01/readdir.c +++ /dev/null @@ -1,286 +0,0 @@ -/* -*- Mode: C -*- */ -/*=============================================================================*\ - * File: readdir.c - * Author: Bryan Jurish - * Description: general directory access object - * - * Copyright (c) 2003-2009 Bryan Jurish. - * - * For information on usage and redistribution, and for a DISCLAIMER OF ALL - * WARRANTIES, see the file, "LICENSE.txt," in this distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * See file LICENSE for further informations on licensing terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *=============================================================================*/ - -#include -#include -#include -#include - -#include - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -/*-------------------------------------------------------------------- - * DEBUG - *--------------------------------------------------------------------*/ -//#define READDIR_DEBUG 1 - - -/*===================================================================== - * Constants - *=====================================================================*/ -#ifdef READDIR_DEBUG -// error-message buffer -#define EBUFSIZE 256 -static char readdir_errbuf[EBUFSIZE]; -#endif - - -/*===================================================================== - * Structures and Types - *=====================================================================*/ - -static char *readdir_banner = - "\n" - "readdir: simple directory accessor v" "0.02" " by Bryan Jurish\n" - "readdir: compiled by " "rdz" " on " "2015-11-16" ; - -static t_class *readdir_class; - -typedef struct _readdir -{ - t_object x_obj; - DIR *x_dir; //-- current directory - t_symbol *x_dirname; //-- current directory name - //struct dirent *x_dirent; //-- current entry of current directory - t_atom x_eatom; //-- current output atom (symbol) - t_outlet *x_ent_outlet; //-- entry outlet - t_outlet *x_eod_outlet; //-- end-of-directory outlet -} t_readdir; - -/*===================================================================== - * Constants - *=====================================================================*/ -static t_symbol *sp_none; -static t_symbol *sp_unknown; -static t_symbol *sp_file; -static t_symbol *sp_dir; -static t_symbol *sp_fifo; -static t_symbol *sp_sock; -static t_symbol *sp_chrdev; -static t_symbol *sp_blkdev; - -/*-------------------------------------------------------------------- - * close - */ -static void readdir_close(t_readdir *x) -{ - if (!x->x_dir) return; - if (0 != closedir(x->x_dir)) { - pd_error(x, "readdir: cannot close %s: %s", x->x_dirname->s_name, strerror(errno)); - return; - } - x->x_dir = NULL; - x->x_dirname = sp_none; -} - -/*-------------------------------------------------------------------- - * open DIR - */ -static void readdir_open(t_readdir *x, t_symbol *dirname) -{ -#ifdef READDIR_DEBUG - post("readdir: got message: open %s", dirname->s_name); -#endif - - if (x->x_dir) readdir_close(x); - if ( !(x->x_dir = opendir(dirname->s_name)) ) { - pd_error(x, "readdir: cannot open %s: %s", dirname->s_name, strerror(errno)); - return; - } - x->x_dirname = dirname; -} - -/*-------------------------------------------------------------------- - * next : get next entry - */ -static void readdir_next(t_readdir *x) -{ - t_symbol *sel = sp_unknown; - struct dirent *result = NULL; - if ( !x->x_dir || !(result = readdir(x->x_dir)) ) { - if (errno == EBADF) { - //-- real error - pd_error(x, "readdir: cannot read from %s: %s", x->x_dirname->s_name, strerror(errno)); - } - else { - //-- end of directory - outlet_bang(x->x_eod_outlet); - } - return; - } - -#if HAVE_STRUCT_DIRENT_D_TYPE - //-- get type (if this OS supports it, e.g. if we're not on windoof) - switch (result->d_type) - { -#if HAVE_DECL_DT_REG - case DT_REG: sel = sp_file; break; -#endif - -#if HAVE_DECL_DT_DIR - case DT_DIR: sel = sp_dir; break; -#endif - -#if HAVE_DECL_DT_FIFO - case DT_FIFO: sel = sp_fifo; break; -#endif - -#if HAVE_DECL_DT_SOCK - case DT_SOCK: sel = sp_sock; break; -#endif - -#if HAVE_DECL_DT_CHR - case DT_CHR: sel = sp_chrdev; break; -#endif - -#if HAVE_DECL_DT_BLK - case DT_BLK: sel = sp_blkdev; break; -#endif - -#if HAVE_DECL_DT_UNKNOWN - case DT_UNKNOWN: -#endif - default: - sel = sp_unknown; - break; - } -#else /* if !HAVE_STRUCT_DIRENT_D_TYPE */ - sel = sp_unknown; -#endif /* HAVE_STRUCT_DIRENT_D_TYPE */ - - x->x_eatom.a_w.w_symbol = gensym(result->d_name); - outlet_anything(x->x_ent_outlet, sel, 1, &x->x_eatom); -} - -/*-------------------------------------------------------------------- - * rewind - */ -static void readdir_rewind(t_readdir *x) -{ - if (x->x_dir) rewinddir(x->x_dir); -} - -/*-------------------------------------------------------------------- - * tell - */ -static void readdir_tell(t_readdir *x) -{ - off_t off = 0; - if (x->x_dir) off = telldir(x->x_dir); -#ifdef READDIR_DEBUG - post("readdir_tell(): off: %%d=%d, %%f=%f\n", off, (t_float)off); -#endif - outlet_float(x->x_ent_outlet, (t_float)off); -} - -/*-------------------------------------------------------------------- - * seek FLOAT - */ -static void readdir_seek(t_readdir *x, t_floatarg pos) -{ - if (!x->x_dir) { - pd_error(x, "readdir: seek %g: no directory opened!", pos); - return; - } - seekdir(x->x_dir, (off_t)pos); -} - - -/*-------------------------------------------------------------------- - * new - */ -static void *readdir_new(void) -{ - t_readdir *x = (t_readdir *)pd_new(readdir_class); - - //-- defaults - x->x_dir = NULL; - x->x_dirname = sp_none; - SETSYMBOL(&x->x_eatom, sp_none); - - //-- outlets - x->x_ent_outlet = outlet_new(&x->x_obj, &s_symbol); - x->x_eod_outlet = outlet_new(&x->x_obj, &s_bang); - - return (void *)x; -} - -/*-------------------------------------------------------------------- - * free - */ -static void readdir_free(t_readdir *x) -{ - readdir_close(x); - outlet_free(x->x_ent_outlet); - outlet_free(x->x_eod_outlet); - return; -} - -/*-------------------------------------------------------------------- - * setup - */ -void readdir_setup(void) -{ - post(readdir_banner); -#ifdef READDIR_DEBUG - post("readdir: debugging enabled"); -#endif - - //-- constants - sp_none = gensym("none"); - sp_unknown = gensym("unknown"); - sp_file = gensym("file"); - sp_dir = gensym("dir"); - sp_fifo = gensym("fifo"); - sp_sock = gensym("sock"); - sp_chrdev = gensym("chrdev"); - sp_blkdev = gensym("blkdev"); - - //-- class - readdir_class = class_new(gensym("readdir"), - (t_newmethod)readdir_new, - (t_method)readdir_free, - sizeof(t_readdir), - CLASS_DEFAULT, - 0); - - //-- methods - class_addmethod(readdir_class, (t_method)readdir_open, gensym("open"), A_DEFSYMBOL, 0); - class_addmethod(readdir_class, (t_method)readdir_close, gensym("close"), 0); - class_addmethod(readdir_class, (t_method)readdir_next, gensym("next"), 0); - class_addbang(readdir_class, (t_method)readdir_next); - class_addmethod(readdir_class, (t_method)readdir_rewind, gensym("rewind"), 0); - class_addmethod(readdir_class, (t_method)readdir_tell, gensym("tell"), 0); - class_addmethod(readdir_class, (t_method)readdir_seek, gensym("seek"), A_DEFFLOAT, 0); - - //-- help symbol - class_sethelpsymbol(readdir_class, gensym("readdir-help.pd")); -} diff --git a/30/!Readdir/01/readdir.o b/30/!Readdir/01/readdir.o deleted file mode 100644 index 412fc3c90614c2e5bf58086477288bf646bb2ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17316 zcmeHO4RBml6@F>9G_=Vkg+>E5?Q7XW(QHjht+7}pA!*o3T0&bOh1!=i*)+B3Zrt5M z3nCL(4yWctY+;i`H`}W=K)9?J?$ChPHL7j$LXjx?tvyR|TaX}iZhI-~8G1Pp? zXCR+}d-i_bm@<3*QFV zmeLOroS@7)-LiVXJ5uDnB%qJegy%T1;Eq_v$Z^)KXkC}l*(wH^_8f1+49ogDL66l( z!Qwa_(O6_lXtS$AAMb*_NAWA}+_+L=>!oZj%3 zP%Ib`M~<^{Rm){-(zCe&6K4odARlJYxgdtQgtzs!cf_3Sq3gDUIvuCE(d4$l$3g(V zfDgv;O}v7Uc+z1xPO#hQinMPFx|Z4b*aIKk2>cE4q5UJZ-MYOPjS5sXKkszQVnyK~ z#78jh`H%JrD zDG&WTnTStSo<1m^{`L;gM)-&a@zxD3Phtsuq;0XHR_ZCRlHYSJKP;9Hr!5!Y^2u1L zmvgBv7#0_c#izB!-M7&V?I0CH2dbESTi^MYj2N@phv-w3d`$x(+`72Zavn7BHz9q?+48D#4_|4LBu48LJmBKR?7L*#76t@`;zZT%}Bc}&@R=y zS`C+fd5iJRM!X*#w_1&s^-uEm5Uh0Q6{-86xuJgvtxW#D%Zt;!uu?an#|ZtqT)!q; zGKD3Zbi6uFuHGGQN%HZPFzg>HCs@V7utS=v23GrUJ19=vhzm>I2#R>0OwHh!D^eba z{@T;G%W5AxsiQrNRwmj_Mzp^|&*2%eq$5ytpyqz=f2BBy`$e*jD_X>e?o`ZTZb8fk z+r0=&Ugj>jmxP@l94&qC(BZ<;tA-Hx(bAdB4|*JBTC~wvg#K5m)ZSTtw6v@dyQdMm zr)BodzmCmUX7+Q9KKq4cUj;fU60>~FbgDwRsTw|7diBujbY3)&xE9Gkdekr{-sD`W zhC|^{(Apl_8VX+*vbwhP1g*|35j48ORy5qP)#~VubOx`rHuY?!hy>d^*&pr=hOCaB za5QLz_=ph+^7GV+1$%m|XfU`{6aC%6p58^hoz`@*TxLhNZ0qd_+VB$Wh=n6N?e>n2 zU^E(z*wm(!6dA%JD*^8@dKH#sZ@z*TX z11_^W+C!mm%w~l4g6J~ToIVx!WStDu?uvxB z>z?mpJ^qAxF7U5HBHtzbkchEl6XZFNwUF
cL3)&>mlj? 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 3.81 required. -# -# -#=== characteristics =========================================================== -# -# -# - defines build settings based on autodetected OS and architecture -# - defines rules to build Pd class- or lib executables from C or C++ sources -# - defines rules for libdir installation -# - defines convenience targets for developer and user -# - evaluates implicit dependencies for non-clean builds -# -# -#=== basic usage =============================================================== -# -# -# In your Makefile, define your Pd lib name and class files, and include -# Makefile.pdlibbuilder at the end of the Makefile. Like so: -# -# ________________________________________________________________________ -# -# # Makefile for mylib -# -# lib.name = mylib -# -# class.sources = myclass1.c myclass2.c -# -# datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt -# -# include Makefile.pdlibbuilder -# ________________________________________________________________________ -# -# -# For files in class.sources it is assumed that class basename == source file -# basename. The default target builds all classes as individual executables -# with Pd's default extension for the platform. For anything more than the -# most basic usage, continue reading. -# -# -#=== list of Makefile.pdlibbuilder API variables =============================== -# -# -# Variables available for definition in your library Makefile: -# -# - lib.name -# - lib.setup.sources -# - class.sources -# - common.sources -# - shared.sources -# - .class.sources -# - .class.ldflags -# - .class.ldlibs -# - cflags -# - ldflags -# - ldlibs -# - datafiles -# - datadirs -# - makefiles -# - makefiledirs -# - externalsdir -# -# Optional multiline defines evaluated per operating system: -# -# - forLinux -# - forDarwin -# - forWindows -# -# Variables available for your makefile or make command line: -# -# - make-lib-executable -# - suppress-wunused -# -# Path variables for make command line or environment: -# -# - PDDIR -# - PDINCLUDEDIR -# - PDBINDIR -# - PDLIBDIR -# -# Standard make variables for make command line or environment: -# -# - CPPFLAGS -# - CFLAGS -# - LDFLAGS -# - CC -# - CXX -# - INSTALL -# - DESTDIR -# -# Deprecated path variables: -# -# - PD_PATH -# - pdincludepath -# - pdbinpath -# - objectsdir -# -# -#=== descriptions of Makefile.pdlibbuilder API variables ======================= -# -# -# lib.name: -# Name of the library directory as it will be installed / distributed. Also the -# name of the lib executable in the case where all classes are linked into -# a single binary. -# -# lib.setup.sources: -# Source file(s) (C or C++) which must be compiled only when linking all classes -# into a single lib binary. -# -# class.sources: -# All sources files (C or C++) for which the condition holds that -# class name == source file basename. -# -# .class.sources: -# Source file(s) (C or C++) specific to class . Use this for -# multiple-source classes or when class name != source file basename. -# -# common.sources: -# Source file(s) which must be statically linked to each class in the library. -# -# shared.sources: -# Source file(s) (C or C++) to build a shared dynamic link lib, to be linked -# with all class executables. -# -# cflags, ldflags, ldlibs: -# Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic -# link libs) for the whole library. These flags are added to platform-specific -# flags defined by Makefile.pdlibbuilder. -# -# .class.ldflags and .class.ldlibs: -# Define ldflags resp. ldlibs specific to class . These flags are -# added to platform-specific flags defined by Makefile.pdlibbuilder, and flags -# defined in your Makefile for the whole library. Note: cflags can not be -# defined per class in the current implementation. -# -# datafiles and datadirs: -# All extra files you want to include in binary distributions of the -# library: abstractions and help patches, example patches, meta patch, readme -# and license texts, manuals, sound files, etcetera. Use 'datafiles' for all -# files that should go into your lib rootdir and 'datadirs' for complete -# directories you want to copy from source to distribution. -# -# forLinux, forDarwin, forWindows: -# Shorthand for 'variable definitions for Linux only' etc. Use like: -# define forLinux -# cflags += -DLINUX -# class.sources += linuxthing.c -# endef -# -# makefiles and makefiledirs: -# Extra makefiles or directories with makefiles that should be made in sub-make -# processes. -# -# make-lib-executable: -# When this variable is defined 'yes' in your makefile or as command argument, -# Makefile.pdlibbuilder will try to build all classes into a single library -# executable (but it will force exit if lib.setup.sources is undefined). -# If your makefile defines 'make-lib-executable=yes' as the library default, -# this can still be overriden with 'make-lib-executable=no' as command argument -# to build individual class executables (the Makefile.pdlibbuilder default.) -# -# suppress-wunused: -# When this variable is defined ('yes' or any other value), -Wunused-variable, -# -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, -# but the other warnings from -Wall are retained. -# -# PDDIR: -# Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -# PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. -# -# PDINCLUDEDIR: -# Directory where Pd API m_pd.h should be found, and other Pd header files. -# Overrides the default search path. -# -# PDBINDIR: -# Directory where pd.dll should be found for linking (Windows only). Overrides -# the default search path. -# -# PDLIBDIR: -# Root directory for installation of Pd library directories. Overrides the -# default install location. -# -# DESTDIR: -# Prepended path component for staged install. -# -# CPPFLAGS: -# Preprocessor flags which are not strictly required for building. -# -# CFLAGS: -# Compiler flags which are not strictly required for building. Compiler flags -# defined by Makefile.pdlibbuilder for warning, optimization and architecture -# specification are overriden by CFLAGS. -# -# LDFLAGS: -# Linker flags which are not strictly required for building. Linker flags -# defined by Makefile.pdlibbuilder for architecture specification are overriden -# by LDFLAGS. -# -# CC and CXX: -# C and C++ compiler programs as defined in your build environment. -# -# INSTALL -# Definition of install program. -# -# PD_PATH: -# Equivalent to PDDIR. Supported for compatibility with pd-extended central -# makefile, but deprecated otherwise. -# -# objectsdir: -# Root directory for installation of Pd library directories, like PDLIBDIR but -# not overridable by environment. Supported for compatibility with pd-extended -# central makefile, but deprecated otherwise. -# -# pdincludepath, pdbinpath: -# As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated -# as user variables. -# -# -#=== paths ===================================================================== -# -# -# Source files in directories other than current working directory must be -# prefixed with their relative path. Do not rely on VPATH or vpath. -# Object (.o) files are built in the directory of their source files. -# Executables are built in current working directory. -# -# Default search path for m_pd.h and other API header files is platform -# dependent, and overridable by PDINCLUDEDIR: -# -# Linux: /usr/include/pd -# -# OSX: /Applications/Pd*.app/Contents/Resources/src -# -# Windows: %PROGRAMFILES%/pd/src -# -# Default location to install pd libraries is platform dependent, and -# overridable by PDLIBDIR: -# -# Linux: /usr/local/lib/pd-externals -# OSX: ~/Library/Pd -# Windows: %APPDATA%/Pd -# -# https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files -# The rationale for not installing to ~/pd-externals by default on Linux -# is that some people share the home dir between 32 and 64 bit installations. -# -# -#=== targets =================================================================== -# -# -# all: build $(executables) plus optional post target -# post: target to build after $(executables) -# alldebug: build all with -g option turned on for debug symbols -# : force clean build of an individual class -# .pre: make preprocessor output file in current working directory -# .lst: make asm/source output file in current working directory -# -# install: install executables and data files -# clean: remove build products from source tree -# -# help: print help text -# vars: print makefile variables -# allvars: print all variables -# depend: print generated prerequisites -# coffee: dummy target -# -# Variable $(executables) expands to class executables plus optional shared lib, -# or alternatively to single lib executable when make-lib-executable=true. -# Targets pre and post can be defined by library makefile. Make sure to include -# Makefile.pdlibbuilder first so default target all will not be redefined. -# -# -#=== 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. It does not automatically include such files in libdir installations. -# Data files you want to include in distributions must be defined explicitly in -# your Makefile. -# -# -#=== Makefile.pdlibbuilder 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. -# -# 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. -# Words in variables expressing a function or command are separated by dashes, -# like in 'make-lib-executable'. -# -# -#=== useful make options ======================================================= -# -# -# Use 'make -d ' to print debug details of the make process. -# Use 'make -p ' to print make's database. -# -# -#=== TODO ====================================================================== -# -# -# - decide whether to use -static-libgcc or shared dll in MinGW -# - cygwin support -# - android support -# - Windows 64 bit support -# - figure out how to handle '$' in filenames -# - add makefile template targets dpkg-source dist libdir distclean tags? -# -# -#=== end of documentation sections ============================================= -# -# -################################################################################ -################################################################################ -################################################################################ - - -# 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 externals root dir in multi-lib source tree like -# pd-extended SVN. Default is parent of current working directory. May be -# defined differently in including makefile. -externalsdir ?= .. - -# variable you can use to check if Makefile.pdlibbuilder is already included -Makefile.pdlibbuilder = true - - -################################################################################ -### variables: library name and version ######################################## -################################################################################ - - -# strip possibles spaces from lib.name, they mess up calculated file names -lib.name := $(strip $(lib.name)) - -# if meta file exists, check library version -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' \ - $(metafile)) -endif - - -################################################################################ -### variables: files ########################################################### -################################################################################ - - -#=== sources =================================================================== - - -# (re)define .class.sources using file names in 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) - - -#=== object files ============================================================== - - -# 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) - - -#=== executables =============================================================== - - -# use recursive variables here because executable extension is not yet known - -# construct class executable names from class names -classes.executables = $(addsuffix .$(extension), $(classes)) - -# construct shared lib executable name if shared sources are defined -ifdef shared.sources - shared.lib = lib$(lib.name).$(shared.extension) -else - shared.lib = -endif - - -################################################################################ -### platform detection ######################################################### -################################################################################ - - -#=== operating system ========================================================== - - -# The following systems are defined: Linux, Darwin, Windows. GNU and -# GNU/kFreeBSD are treated as Linux to get the same options. - -uname := $(shell uname) - -ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) - system = Linux -endif - -ifeq ($(uname), Darwin) - system = Darwin -endif - -ifeq ($(filter MINGW% MSYS, $(uname)), $(uname)) - system = Windows -endif - -# Unfortunately not all Mingw versions provide a link cc > gcc, therefore -# gcc is hardcoded here (but not if CC is redefined). -ifeq ($(system), Windows) - ifeq ($(origin CC), default) - CC = gcc - endif -endif - -# evaluate possible system-specific multiline defines from library makefile -$(eval $(for$(system))) - - -# TODO: Cygwin, Android - - -#=== architecture ============================================================== - - -# native architecture of the build machine -build.arch := $(shell uname -m) - -# Target architecture as reported by compiler. Give precedence to eventual -# user-defined compiler. The first field of -- is extracted. -ifneq ($(origin CXX), default) - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CXX) -dumpmachine))) -else - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine))) -endif - -# Target architecture as reported by compiler is only used for Windows at the -# moment. For other systems this still has to be tested. -ifeq ($(system), Windows) - target.arch = $(dumpmachine.cpu) -else - target.arch = $(build.arch) -endif - - -################################################################################ -### variables per platform ##################################################### -################################################################################ - - -#=== flags per architecture ==================================================== - - -# Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, -# arch.c.flags are overriden below. - -# Raspberry Pi 1st generation -ifeq ($(target.arch), armv6l) - arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard - -# Beagle, Udoo, RPi2 etc. -else ifeq ($(target.arch), armv7l) - arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard - -# Intel 32 bit, build with SSE and SSE2 instructions -else ifeq ($(findstring $(target.arch), i386 i686), $(target.arch)) - arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 - -# Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions -else ifeq ($(findstring $(target.arch), x86_64), $(target.arch)) - arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 - -# if none of the above architectures detected -else - arch.c.flags = -endif - - -#=== flags and paths for Linux ================================================= - - -ifeq ($(system), Linux) - prefix = /usr/local - libdir := $(prefix)/lib - pkglibdir = $(libdir)/pd-externals - pdincludepath := $(wildcard /usr/include/pd) - 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. -# LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for -# OSX x86_64. - - -ifeq ($(system), Darwin) - pkglibdir = $(HOME)/Library/Pd - pdincludepath := $(firstword $(wildcard \ - /Applications/Pd*.app/Contents/Resources/src)) - extension = pd_darwin - 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 - version.flag := $(filter $(cflags), -mmacosx-version-min=%) - ifeq ($(target.arch), i386) - cxx.flags := -fcheck-new - arch := ppc i386 x86_64 - version.flag ?= -mmacosx-version-min=10.4 - endif - ifeq ($(target.arch), x86_64) - arch := i386 x86_64 - version.flag ?= -mmacosx-version-min=10.5 - endif - arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) - arch.ld.flags := $(arch.c.flags) -endif - - -#=== flags and paths for Windows =============================================== - - -# Standard paths on Windows contain spaces, and GNU make functions treat such -# paths as lists, with unintended effects. Therefore we must use shell function -# ls instead of make's wildcard, and probe for each standard path individually. -# Using double quotes around paths with spaces is obligatory. Since some path -# variables are assembled or re-expanded later, great care must be taken to put -# quotes at appropriate points throughout the makefile. Thanks, Bill. - -# paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) -ifeq ($(system), Windows) - pkglibdir := $(APPDATA)/Pd - ifndef pdbinpath - pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") - endif - ifndef pdincludepath - pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") - endif -endif - -# TODO: decide whether -mms-bitfields should be specified. -ifeq ($(system), Windows) - cpp.flags := -DMSW -DNT - ifeq ($(filter i%86 mingw32, $(target.arch)), $(target.arch)) - arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse - else ifeq (x86_64, $(target.arch)) - cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 - arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse - else - arch.c.flags = - endif - extension = dll - c.flags := - c.ldflags = -static-libgcc -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - c.ldlibs := - cxx.flags := -fcheck-new - cxx.ldflags = -static-libstdc++ -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - cxx.ldlibs := - shared.extension = dll - shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" - stripflags = --strip-unneeded -R .note -R .comment -endif - - -#=== paths ===================================================================== - - -# Platform-dependent default paths are specified above, but overridable. -# Path variables in upper case can be defined as make command argument or in the -# environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with -# the build system that pd-l2ork has inherited from pd-extended. - -PDDIR ?= $(PD_PATH) -PDINCLUDEDIR ?= $(pdincludepath) -PDBINDIR ?= $(pdbinpath) -PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) - -ifneq ($(PDDIR),) - PDINCLUDEDIR := $(wildcard $(PDDIR)/src) - PDBINDIR := $(wildcard $(PDDIR)/bin) -endif - -# base path where all components of the lib will be installed by default -installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) - -# check if include path contains spaces (as is often the case on Windows) -# if so, store the path so we can later do checks with it -pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) - - -#=== accumulated build flags =================================================== - - -# From GNU make docs: 'Users expect to be able to specify CFLAGS freely -# themselves.' So we use CFLAGS to define options which are not strictly -# required for compilation: optimizations, architecture specifications, and -# warnings. CFLAGS can be safely overriden using a make command argument. -# Variables cflags, ldflags and ldlibs may be defined in including makefile. - -optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer -warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing - -# suppress -Wunused-variable & Co if you don't want to clutter a build log -ifdef suppress-wunused - warn.flags += $(addprefix -Wno-unused-, function parameter value variable) -endif - -CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) - -# preprocessor flags -cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) - -# flags for dependency checking (cflags from makefile may define -I options) -depcheck.flags := $(cpp.flags) $(cflags) - -# architecture specifications for linker are overridable by LDFLAGS -LDFLAGS := $(arch.ld.flags) - -# now add the same ld flags to shared dynamic lib -shared.ldflags := $(shared.ldflags) $(LDFLAGS) - -# accumulated flags for C compiler / linker -c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) -c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) -c.ldlibs := $(c.ldlibs) $(ldlibs) - -# accumulated flags for C++ compiler / linker -cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) -cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) -cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) - - -################################################################################ -### variables: tools ########################################################### -################################################################################ - - -# aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument -compile-c := $(CC) -compile-cxx := $(CXX) - - -################################################################################ -### checks ##################################################################### -################################################################################ - - -# At this point most variables are defined. Now do some checks and info's -# before rules begin. - -# '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 - -# store path to Pd API m_pd.h if it is found -ifdef PDINCLUDEDIR - mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") -endif - -# print Makefile.pdlibbuilder version -$(info ++++ info: using Makefile.pdlibbuilder version $(version)) - -# when making target all, check if m_pd.h is found and print info about it -ifeq ($(goals), all) - $(if $(mpdh), \ - $(info ++++ info: using Pd API $(mpdh)), \ - $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) -endif - -# print target info -$(info ++++ info: making target $(goals) $(if $(lib.name),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 - - -################################################################################ -### 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 post build-lib \ - $(classes) $(makefiledirs) $(makefiles) \ - install install-executables install-datafiles install-datadirs \ - force clean vars allvars depend help - - -################################################################################ -### rules: build targets ####################################################### -################################################################################ - - -# Target all forces the build of targets [$(executables) post] in -# deterministic order. Target $(executables) builds class executables plus -# optional shared lib or alternatively a single lib executable when -# make-lib-executable=true. Target post is optionally defined by -# library makefile. - -all: post -post: $(executables) - -all: - $(info ++++info: target all in lib $(lib.name) completed) - -# build all with -g option turned on for debug symbols -alldebug: c.flags += -g -alldebug: cxx.flags += -g -alldebug: all - - -#=== class executable ========================================================== - - -# recipe for linking objects in class executable -# argument $1 = compiler type (c or cxx) -# argument $2 = class basename -define link-class - $(compile-$1) \ - $($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) \ - $($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) \ - $(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 file from source -# argument $1 is compiler type (c or cxx) -define make-object-file - $(info ++++ info: making $@ in lib $(lib.name)) - $(compile-$1) \ - $($1.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. - -# When the Pd include path contains spaces it will mess up the implicit -# prerequisites rules. -disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) - -ifndef disable-dependency-tracking - must-build-everything := $(filter all, $(goals)) - must-build-class := $(filter $(classes), $(goals)) - must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) -endif - -# declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' -# argument $1 is input source file(s) -# dir is explicitly added because option -MM strips it by default -define declare-object-target -$(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.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) \ - $< > $(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. - - -# -p = preserve time stamps -# -m = set permission mode (as in chmod) -# -d = create all components of specified directories -INSTALL = install -INSTALL_PROGRAM := $(INSTALL) -p -m 644 -INSTALL_DATA := $(INSTALL) -p -m 644 -INSTALL_DIR := $(INSTALL) -m 755 -d - -# 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)" - $(foreach v, $(executables), \ - $(INSTALL_PROGRAM) '$v' "$(installpath)";) - $(info ++++ info: executables of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datafiles: all - $(INSTALL_DIR) -v "$(installpath)" - $(foreach v, $(datafiles), \ - $(INSTALL_DATA) '$(v)' "$(installpath)";) - $(info ++++ info: data files of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datadirs: all - $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) - $(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. Useful when you want to quickly find -# out which sub-makes from a large set will succeed. -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 - - -# 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 ============================================================ - - -# brief info about targets and paths - -ifdef mpdh - mpdhinfo := $(mpdh) -else - mpdhinfo := m_pd.h was not found. Is Pd installed? -endif - -help: - @echo - @echo " Main targets:" - @echo " all: build executables (default target)" - @echo " install: install all components of the library" - @echo " vars: print makefile variables for troubleshooting" - @echo " allvars: print all variables for troubleshooting" - @echo " help: print this help text" - @echo - @echo " Pd API m_pd.h:" - @echo " $(mpdhinfo)" - @echo " You may specify your preferred Pd include directory as argument" - @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." - @echo - @echo " Path for installation of your libdir(s):" - @echo " $(PDLIBDIR)" - @echo " Alternatively you may specify your path for installation as argument" - @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." - @echo - @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." - @echo - - -#=== dummy target ============================================================== - - -coffee: - @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." - - -################################################################################ -### end of rules sections ###################################################### -################################################################################ - - -# for syntax highlighting in vim and github -# vim: set filetype=make: - diff --git a/30/!Readdir/02/pd-lib-builder/README.md b/30/!Readdir/02/pd-lib-builder/README.md deleted file mode 100644 index 75e070e60..000000000 --- a/30/!Readdir/02/pd-lib-builder/README.md +++ /dev/null @@ -1,113 +0,0 @@ - - -### Makefile.pdlibbuilder ### - -Helper makefile for Pure Data external libraries. -Written by Katja Vetter March-June 2015 for the public domain. No warranties. -Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's -ShakeNMake. - -GNU make version >= 3.81 required. - - -### characteristics ### - - -* defines build settings based on autodetected OS and architecture -* defines rules to build Pd class- or lib executables from C or C++ sources -* defines rules for libdir installation -* defines convenience targets for developer and user -* evaluates implicit dependencies for non-clean builds - - -### basic usage ### - - -In your Makefile, define your Pd lib name and class files, and include -Makefile.pdlibbuilder at the end of the Makefile. Like so: - - - # Makefile for mylib - - lib.name = mylib - - class.sources = myclass1.c myclass2.c - - datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt - - include Makefile.pdlibbuilder - - -For files in class.sources it is assumed that class name == source file -basename. The default target builds all classes as individual executables -with Pd's default extension for the platform. For anything more than the -most basic usage, read the documentation sections in Makefile.pdlibbuilder. - - -### paths ### - - -Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be -defined not only as make command argument but also in the environment, to -override platform-dependent defaults: - -PDDIR: -Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. - -PDINCLUDEDIR: -Directory where Pd API m_pd.h should be found, and other Pd header files. -Overrides the default search path. - -PDBINDIR: -Directory where pd.dll should be found for linking (Windows only). Overrides -the default search path. - -PDLIBDIR: -Root directory for installation of Pd library directories. Overrides the -default install location. - - -### documentation ### - - -This README.md provides only basic information. A large comment section inside -Makefile.pdlibbuilder lists and explains the available user variables, default -paths, and targets. The internal documentation reflects the exact functionality -of the particular version. A tips&tricks page is in the works. - - -### versioning ### - - -The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), -and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers -are invited to regulary check for updates, and to contribute and discuss -improvements here. If you really need to distribute a personalized version with -your library, rename Makefile.pdlibbuilder to avoid confusion. - - -### examples ### - - -Here are a few projects using the Makefile.pdlibbuilder approach: - -https://github.com/pure-data/helloworld - -https://github.com/electrickery/pd-cyclone (stable) - -https://github.com/porres/pd-cyclone (experimental) - -https://git.iem.at/pd/iemguts - -https://git.iem.at/pd/iemnet - -https://git.iem.at/pd/iem_ambi - -https://git.iem.at/pd/mediasettings - -https://git.iem.at/pd-gui/punish - -https://github.com/residuum/PuRestJson - -More examples will be referenced here when they are available. diff --git a/30/!Readdir/02/readdir-help.pd b/30/!Readdir/02/readdir-help.pd deleted file mode 100755 index 74bc02a6d..000000000 --- a/30/!Readdir/02/readdir-help.pd +++ /dev/null @@ -1,58 +0,0 @@ -#N canvas 0 26 510 574 10; -#X msg 87 194 close; -#X msg 54 75 bang; -#X msg 77 144 tell; -#X obj 38 292 print dir-entry; -#X obj 82 264 print end-of-directory; -#X text 130 4 readdir : simple directory accessor; -#X text 240 523 Bryan Jurish ; -#X text 155 36 open DIR : opens the directory DIR; -#X text 184 77 bang : outlet next directory entry; -#X text 184 94 next : ditto; -#X msg 61 94 next; -#X msg 71 125 rewind; -#X text 173 125 rewind : return to beginning of directory; -#X text 187 145 tell : output current position; -#X text 146 163 seek FLOAT : goto position FLOAT; -#X msg 82 163 seek 0; -#X text 181 192 close : close directory; -#X text 258 265 2nd outlet bangs at end of directory; -#X text 260 295 Directory entries go to 1st outlet; -#X text 39 321 Directory entries appear as messages of the form TYPE -NAME \, where NAME is the name of the entry \, and TYPE is one of the -following:; -#X text 147 361 file : regular file; -#X text 154 374 dir : subdirectory; -#X text 147 387 fifo : named pipe; -#X text 147 400 sock : local-domain socket; -#X text 133 413 chrdev : character device; -#X text 133 427 blkdev : block device; -#X obj 38 237 readdir; -#X msg 44 46 open /tmp; -#X text 126 440 unknown : something else (maybe a symlink); -#X msg 38 26 open .; -#X text 39 462 BEWARE: Recognition of directory entry types does NOT -work on windows or any other system whose `dirent' struct is missing -the `d_type' field. On such systems \, the TYPE selector on the first -outlet is always the symbol `unknown'.; -#N canvas 260 141 494 344 META 0; -#X text 12 145 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan -Wilkes for Pd version 0.42.; -#X text 12 25 LICENSE GPL v2; -#X text 12 125 AUTHOR Bryan Jurish ; -#X text 12 5 KEYWORDS control filesystem; -#X text 12 45 DESCRIPTION simple directory accessor; -#X text 12 65 INLET_0 open bang next rewind tell seek close; -#X text 12 85 OUTLET_0 anything; -#X text 12 105 OUTLET_1 bang; -#X restore 451 552 pd META; -#X connect 0 0 26 0; -#X connect 1 0 26 0; -#X connect 2 0 26 0; -#X connect 10 0 26 0; -#X connect 11 0 26 0; -#X connect 15 0 26 0; -#X connect 26 0 3 0; -#X connect 26 1 4 0; -#X connect 27 0 26 0; -#X connect 29 0 26 0; diff --git a/30/!Readdir/02/readdir-test.pd b/30/!Readdir/02/readdir-test.pd deleted file mode 100755 index 8851649b9..000000000 --- a/30/!Readdir/02/readdir-test.pd +++ /dev/null @@ -1,37 +0,0 @@ -#N canvas 958 137 572 546 10; -#X obj 130 376 readdir; -#X msg 311 313 close; -#X obj 174 403 print end-of-directory; -#X msg 255 196 bang; -#X msg 64 93 open \$1; -#X msg 64 37 .; -#X msg 101 37 test; -#X msg 144 37 foo; -#X obj 64 69 symbol; -#X obj 130 430 print entry; -#X msg 279 243 tell; -#X msg 275 219 rewind; -#X msg 318 279 seek \$1; -#X floatatom 317 260 5 0 0 0 - - -; -#X obj 153 65 openpanel 1; -#X obj 193 43 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 --1; -#X msg 153 91 set open \$1; -#X msg 167 119 open /Users/porres/Documents/Pd; -#X connect 0 0 9 0; -#X connect 0 1 2 0; -#X connect 1 0 0 0; -#X connect 3 0 0 0; -#X connect 4 0 0 0; -#X connect 5 0 8 0; -#X connect 6 0 8 0; -#X connect 7 0 8 0; -#X connect 8 0 4 0; -#X connect 10 0 0 0; -#X connect 11 0 0 0; -#X connect 12 0 0 0; -#X connect 13 0 12 0; -#X connect 14 0 16 0; -#X connect 15 0 14 0; -#X connect 16 0 17 0; -#X connect 17 0 0 0; diff --git a/30/!Readdir/02/readdir.c b/30/!Readdir/02/readdir.c deleted file mode 100755 index 5d629f667..000000000 --- a/30/!Readdir/02/readdir.c +++ /dev/null @@ -1,287 +0,0 @@ -/* -*- Mode: C -*- */ -/*=============================================================================*\ - * File: readdir.c - * Author: Bryan Jurish - * Description: general directory access object - * - * Copyright (c) 2003-2009 Bryan Jurish. - * - * For information on usage and redistribution, and for a DISCLAIMER OF ALL - * WARRANTIES, see the file, "LICENSE.txt," in this distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * See file LICENSE for further informations on licensing terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *=============================================================================*/ - -#include -#include -#include -#include - -#include - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -/*-------------------------------------------------------------------- - * DEBUG - *--------------------------------------------------------------------*/ -//#define READDIR_DEBUG 1 - - -/*===================================================================== - * Constants - *=====================================================================*/ -#ifdef READDIR_DEBUG -// error-message buffer -#define EBUFSIZE 256 -static char readdir_errbuf[EBUFSIZE]; -#endif - - -/*===================================================================== - * Structures and Types - *=====================================================================*/ - -static char *readdir_banner = - "\n" - "readdir: simple directory accessor v" "0.02" " by Bryan Jurish\n" - "readdir: compiled by " "rdz" " on " "2015-11-16" ; - -static t_class *readdir_class; - -typedef struct _readdir -{ - t_object x_obj; - DIR *x_dir; //-- current directory - t_symbol *x_dirname; //-- current directory name - //struct dirent *x_dirent; //-- current entry of current directory - t_atom x_eatom; //-- current output atom (symbol) - t_outlet *x_ent_outlet; //-- entry outlet - t_outlet *x_eod_outlet; //-- end-of-directory outlet -} t_readdir; - -/*===================================================================== - * Constants - *=====================================================================*/ -static t_symbol *sp_none; -static t_symbol *sp_unknown; -static t_symbol *sp_file; -static t_symbol *sp_dir; -static t_symbol *sp_fifo; -static t_symbol *sp_sock; -static t_symbol *sp_chrdev; -static t_symbol *sp_blkdev; - -/*-------------------------------------------------------------------- - * close - */ -static void readdir_close(t_readdir *x) -{ - if (!x->x_dir) return; - if (0 != closedir(x->x_dir)) { - pd_error(x, "readdir: cannot close %s: %s", x->x_dirname->s_name, strerror(errno)); - return; - } - x->x_dir = NULL; - x->x_dirname = sp_none; -} - -/*-------------------------------------------------------------------- - * open DIR - */ -static void readdir_open(t_readdir *x, t_symbol *dirname) -{ -#ifdef READDIR_DEBUG - post("readdir: got message: open %s", dirname->s_name); -#endif - - if (x->x_dir) readdir_close(x); - if ( !(x->x_dir = opendir(dirname->s_name)) ) { - pd_error(x, "readdir: cannot open %s: %s", dirname->s_name, strerror(errno)); - return; - } - x->x_dirname = dirname; - post("x->x_dirname = %s", x->x_dirname->s_name); -} - -/*-------------------------------------------------------------------- - * next : get next entry - */ -static void readdir_next(t_readdir *x) -{ - t_symbol *sel = sp_unknown; - struct dirent *result = NULL; - if ( !x->x_dir || !(result = readdir(x->x_dir)) ) { - if (errno == EBADF) { - //-- real error - pd_error(x, "readdir: cannot read from %s: %s", x->x_dirname->s_name, strerror(errno)); - } - else { - //-- end of directory - outlet_bang(x->x_eod_outlet); - } - return; - } - -#if HAVE_STRUCT_DIRENT_D_TYPE - //-- get type (if this OS supports it, e.g. if we're not on windoof) - switch (result->d_type) - { -#if HAVE_DECL_DT_REG - case DT_REG: sel = sp_file; break; -#endif - -#if HAVE_DECL_DT_DIR - case DT_DIR: sel = sp_dir; break; -#endif - -#if HAVE_DECL_DT_FIFO - case DT_FIFO: sel = sp_fifo; break; -#endif - -#if HAVE_DECL_DT_SOCK - case DT_SOCK: sel = sp_sock; break; -#endif - -#if HAVE_DECL_DT_CHR - case DT_CHR: sel = sp_chrdev; break; -#endif - -#if HAVE_DECL_DT_BLK - case DT_BLK: sel = sp_blkdev; break; -#endif - -#if HAVE_DECL_DT_UNKNOWN - case DT_UNKNOWN: -#endif - default: - sel = sp_unknown; - break; - } -#else /* if !HAVE_STRUCT_DIRENT_D_TYPE */ - sel = sp_unknown; -#endif /* HAVE_STRUCT_DIRENT_D_TYPE */ - - x->x_eatom.a_w.w_symbol = gensym(result->d_name); - outlet_anything(x->x_ent_outlet, sel, 1, &x->x_eatom); -} - -/*-------------------------------------------------------------------- - * rewind - */ -static void readdir_rewind(t_readdir *x) -{ - if (x->x_dir) rewinddir(x->x_dir); -} - -/*-------------------------------------------------------------------- - * tell - */ -static void readdir_tell(t_readdir *x) -{ - off_t off = 0; - if (x->x_dir) off = telldir(x->x_dir); -#ifdef READDIR_DEBUG - post("readdir_tell(): off: %%d=%d, %%f=%f\n", off, (t_float)off); -#endif - outlet_float(x->x_ent_outlet, (t_float)off); -} - -/*-------------------------------------------------------------------- - * seek FLOAT - */ -static void readdir_seek(t_readdir *x, t_floatarg pos) -{ - if (!x->x_dir) { - pd_error(x, "readdir: seek %g: no directory opened!", pos); - return; - } - seekdir(x->x_dir, (off_t)pos); -} - - -/*-------------------------------------------------------------------- - * new - */ -static void *readdir_new(void) -{ - t_readdir *x = (t_readdir *)pd_new(readdir_class); - - //-- defaults - x->x_dir = NULL; - x->x_dirname = sp_none; - SETSYMBOL(&x->x_eatom, sp_none); - - //-- outlets - x->x_ent_outlet = outlet_new(&x->x_obj, &s_symbol); - x->x_eod_outlet = outlet_new(&x->x_obj, &s_bang); - - return (void *)x; -} - -/*-------------------------------------------------------------------- - * free - */ -static void readdir_free(t_readdir *x) -{ - readdir_close(x); - outlet_free(x->x_ent_outlet); - outlet_free(x->x_eod_outlet); - return; -} - -/*-------------------------------------------------------------------- - * setup - */ -void readdir_setup(void) -{ - post(readdir_banner); -#ifdef READDIR_DEBUG - post("readdir: debugging enabled"); -#endif - - //-- constants - sp_none = gensym("none"); - sp_unknown = gensym("unknown"); - sp_file = gensym("file"); - sp_dir = gensym("dir"); - sp_fifo = gensym("fifo"); - sp_sock = gensym("sock"); - sp_chrdev = gensym("chrdev"); - sp_blkdev = gensym("blkdev"); - - //-- class - readdir_class = class_new(gensym("readdir"), - (t_newmethod)readdir_new, - (t_method)readdir_free, - sizeof(t_readdir), - CLASS_DEFAULT, - 0); - - //-- methods - class_addmethod(readdir_class, (t_method)readdir_open, gensym("open"), A_DEFSYMBOL, 0); - class_addmethod(readdir_class, (t_method)readdir_close, gensym("close"), 0); - class_addmethod(readdir_class, (t_method)readdir_next, gensym("next"), 0); - class_addbang(readdir_class, (t_method)readdir_next); - class_addmethod(readdir_class, (t_method)readdir_rewind, gensym("rewind"), 0); - class_addmethod(readdir_class, (t_method)readdir_tell, gensym("tell"), 0); - class_addmethod(readdir_class, (t_method)readdir_seek, gensym("seek"), A_DEFFLOAT, 0); - - //-- help symbol - class_sethelpsymbol(readdir_class, gensym("readdir-help.pd")); -} diff --git a/30/!Readdir/02/readdir.o b/30/!Readdir/02/readdir.o deleted file mode 100644 index 280f0a1059d9cff9cb58b540439de76074b734b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17364 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 diff --git a/30/!Readdir/02/readdir.pd_darwin b/30/!Readdir/02/readdir.pd_darwin deleted file mode 100755 index 86396f2ad0b2747756c798c1c739c72d18c5c491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26496 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 diff --git a/30/!Readdir/03/Makefile b/30/!Readdir/03/Makefile deleted file mode 100755 index a24d075a5..000000000 --- a/30/!Readdir/03/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -readdir.class.sources := readdir.c - -# include Makefile.pdlibbuilder from submodule directory 'pd-lib-builder' -PDLIBBUILDER_DIR=pd-lib-builder/ -include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder diff --git a/30/!Readdir/03/pd-lib-builder/CHANGELOG.txt b/30/!Readdir/03/pd-lib-builder/CHANGELOG.txt deleted file mode 100644 index 41ac0e206..000000000 --- a/30/!Readdir/03/pd-lib-builder/CHANGELOG.txt +++ /dev/null @@ -1,87 +0,0 @@ -Changelog for Makefile.pdlibbuilder. - -v0.5.0, dated 2018-01-23 -Implement target architecture detection for Windows builds, -and set appropriate options for 32 and 64 bit (used to be for 32 bit only). -(feature, issue #37 #38, merge commit 215bf3e) - -v0.4.4, dated 2016-11-22 -Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' -(bugfix, issue #31, commit 2c14110) - -v0.4.3, dated 2016-11-02 -Replace flags '-fpic' by 'fPIC'. -(bugfix, issue #29, commit 426b38b) - -v0.4.2, dated 2016-10-30 -Fix issue where incorrect message about m_pd.h is given. -(bugfix, commit 2e13d8f) - -v0.4.1, dated 2016-10-27 -Respect cflag for minimum OSX version when defined by lib makefile. -(bugfix, pull request #22, commit 48c4127) - -v0.4.0, dated 2016-10-14 -Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can -also be defined in environment. -(feature, issue #27, commit b0dab72) - -v0.3.1, dated 2016-10-13 -Fix bug where pd.dll wouldn't be found. -(bugfix, commit a0c87be) - -v0.3.0, dated 2016-10-09 -Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. -(feature, issue #26, commit 41e9743) - -v0.2.8, dated 2016-10-09 -Allow installed files to contain weird characters (notably '$'). -(bugfix, pull request #20, commit 5b920b1) - -v0.2.7, dated 2016-10-04 -Remove all default pd search paths except vanilla's. -(discussion, issue #25, commit a6a89dc) - -v0.2.6, dated 2016-09-20 -Redefined dependency checking so it won't stall rebuilds on OSX. -(bugfix, issue #16, commit 9fd1795) - -v0.2.5, dated 2016-06-26 -Fixed dependency checking for object files in other directories. -(bugfix, commit f06e550) - -v0.2.4, dated 2016-06-25 -Fixed regression bug that disabled all dependency checking. -(bugfix, commit 1d7bb5e) - -v0.2.3, dated 2016-03-29 -Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. -(bugfix, issue #16, commit eb614fd) - -v0.2.2, dated 2016-03-28 -Removed target 'pre' because it forced rebuild of everything in 'all'. -(bugfix, issue #17, commit c989c8e) - -v0.2.1, dated 2015-12-27 -Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. -(bugfix, issue #5, commit 98f3582) - -v0.2.0, dated 2015-12-19 -Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. -(feature, pull request #9, commit 3946ea5) - -v0.1.0, dated 2015-12-08 -Added targets 'pre' and 'post' to automatically run before and after 'all'. -(feature, pull request #4, commit a5678ac) - -v0.0.2, dated 2015-12-06 -Improved methods for searching pd paths. -(bugfix, commit ed37e6b) - -v0.0.1, dated 2015-10-31 -Fixed expansion of variable 'lib.version'. -(bugfix, issue #1, commit 974b617) - -v0.0.0, dated 2015-06-24 -Initial version. -(commit 16517a2) diff --git a/30/!Readdir/03/pd-lib-builder/Makefile.pdlibbuilder b/30/!Readdir/03/pd-lib-builder/Makefile.pdlibbuilder deleted file mode 100644 index 1db3f8c2c..000000000 --- a/30/!Readdir/03/pd-lib-builder/Makefile.pdlibbuilder +++ /dev/null @@ -1,1252 +0,0 @@ -# Makefile.pdlibbuilder dated 2018-01-23 -version = 0.5.0 - -# Helper makefile for Pure Data external libraries. -# Written by Katja Vetter March-June 2015 for the public domain. No warranties. -# Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's -# ShakeNMake. -# -# Grab the newest version of Makefile.pdlibbuilder from -# https://github.com/pure-data/pd-lib-builder/ -# -# GNU make version >= 3.81 required. -# -# -#=== characteristics =========================================================== -# -# -# - defines build settings based on autodetected OS and architecture -# - defines rules to build Pd class- or lib executables from C or C++ sources -# - defines rules for libdir installation -# - defines convenience targets for developer and user -# - evaluates implicit dependencies for non-clean builds -# -# -#=== basic usage =============================================================== -# -# -# In your Makefile, define your Pd lib name and class files, and include -# Makefile.pdlibbuilder at the end of the Makefile. Like so: -# -# ________________________________________________________________________ -# -# # Makefile for mylib -# -# lib.name = mylib -# -# class.sources = myclass1.c myclass2.c -# -# datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt -# -# include Makefile.pdlibbuilder -# ________________________________________________________________________ -# -# -# For files in class.sources it is assumed that class basename == source file -# basename. The default target builds all classes as individual executables -# with Pd's default extension for the platform. For anything more than the -# most basic usage, continue reading. -# -# -#=== list of Makefile.pdlibbuilder API variables =============================== -# -# -# Variables available for definition in your library Makefile: -# -# - lib.name -# - lib.setup.sources -# - class.sources -# - common.sources -# - shared.sources -# - .class.sources -# - .class.ldflags -# - .class.ldlibs -# - cflags -# - ldflags -# - ldlibs -# - datafiles -# - datadirs -# - makefiles -# - makefiledirs -# - externalsdir -# -# Optional multiline defines evaluated per operating system: -# -# - forLinux -# - forDarwin -# - forWindows -# -# Variables available for your makefile or make command line: -# -# - make-lib-executable -# - suppress-wunused -# -# Path variables for make command line or environment: -# -# - PDDIR -# - PDINCLUDEDIR -# - PDBINDIR -# - PDLIBDIR -# -# Standard make variables for make command line or environment: -# -# - CPPFLAGS -# - CFLAGS -# - LDFLAGS -# - CC -# - CXX -# - INSTALL -# - DESTDIR -# -# Deprecated path variables: -# -# - PD_PATH -# - pdincludepath -# - pdbinpath -# - objectsdir -# -# -#=== descriptions of Makefile.pdlibbuilder API variables ======================= -# -# -# lib.name: -# Name of the library directory as it will be installed / distributed. Also the -# name of the lib executable in the case where all classes are linked into -# a single binary. -# -# lib.setup.sources: -# Source file(s) (C or C++) which must be compiled only when linking all classes -# into a single lib binary. -# -# class.sources: -# All sources files (C or C++) for which the condition holds that -# class name == source file basename. -# -# .class.sources: -# Source file(s) (C or C++) specific to class . Use this for -# multiple-source classes or when class name != source file basename. -# -# common.sources: -# Source file(s) which must be statically linked to each class in the library. -# -# shared.sources: -# Source file(s) (C or C++) to build a shared dynamic link lib, to be linked -# with all class executables. -# -# cflags, ldflags, ldlibs: -# Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic -# link libs) for the whole library. These flags are added to platform-specific -# flags defined by Makefile.pdlibbuilder. -# -# .class.ldflags and .class.ldlibs: -# Define ldflags resp. ldlibs specific to class . These flags are -# added to platform-specific flags defined by Makefile.pdlibbuilder, and flags -# defined in your Makefile for the whole library. Note: cflags can not be -# defined per class in the current implementation. -# -# datafiles and datadirs: -# All extra files you want to include in binary distributions of the -# library: abstractions and help patches, example patches, meta patch, readme -# and license texts, manuals, sound files, etcetera. Use 'datafiles' for all -# files that should go into your lib rootdir and 'datadirs' for complete -# directories you want to copy from source to distribution. -# -# forLinux, forDarwin, forWindows: -# Shorthand for 'variable definitions for Linux only' etc. Use like: -# define forLinux -# cflags += -DLINUX -# class.sources += linuxthing.c -# endef -# -# makefiles and makefiledirs: -# Extra makefiles or directories with makefiles that should be made in sub-make -# processes. -# -# make-lib-executable: -# When this variable is defined 'yes' in your makefile or as command argument, -# Makefile.pdlibbuilder will try to build all classes into a single library -# executable (but it will force exit if lib.setup.sources is undefined). -# If your makefile defines 'make-lib-executable=yes' as the library default, -# this can still be overriden with 'make-lib-executable=no' as command argument -# to build individual class executables (the Makefile.pdlibbuilder default.) -# -# suppress-wunused: -# When this variable is defined ('yes' or any other value), -Wunused-variable, -# -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, -# but the other warnings from -Wall are retained. -# -# PDDIR: -# Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -# PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. -# -# PDINCLUDEDIR: -# Directory where Pd API m_pd.h should be found, and other Pd header files. -# Overrides the default search path. -# -# PDBINDIR: -# Directory where pd.dll should be found for linking (Windows only). Overrides -# the default search path. -# -# PDLIBDIR: -# Root directory for installation of Pd library directories. Overrides the -# default install location. -# -# DESTDIR: -# Prepended path component for staged install. -# -# CPPFLAGS: -# Preprocessor flags which are not strictly required for building. -# -# CFLAGS: -# Compiler flags which are not strictly required for building. Compiler flags -# defined by Makefile.pdlibbuilder for warning, optimization and architecture -# specification are overriden by CFLAGS. -# -# LDFLAGS: -# Linker flags which are not strictly required for building. Linker flags -# defined by Makefile.pdlibbuilder for architecture specification are overriden -# by LDFLAGS. -# -# CC and CXX: -# C and C++ compiler programs as defined in your build environment. -# -# INSTALL -# Definition of install program. -# -# PD_PATH: -# Equivalent to PDDIR. Supported for compatibility with pd-extended central -# makefile, but deprecated otherwise. -# -# objectsdir: -# Root directory for installation of Pd library directories, like PDLIBDIR but -# not overridable by environment. Supported for compatibility with pd-extended -# central makefile, but deprecated otherwise. -# -# pdincludepath, pdbinpath: -# As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated -# as user variables. -# -# -#=== paths ===================================================================== -# -# -# Source files in directories other than current working directory must be -# prefixed with their relative path. Do not rely on VPATH or vpath. -# Object (.o) files are built in the directory of their source files. -# Executables are built in current working directory. -# -# Default search path for m_pd.h and other API header files is platform -# dependent, and overridable by PDINCLUDEDIR: -# -# Linux: /usr/include/pd -# -# OSX: /Applications/Pd*.app/Contents/Resources/src -# -# Windows: %PROGRAMFILES%/pd/src -# -# Default location to install pd libraries is platform dependent, and -# overridable by PDLIBDIR: -# -# Linux: /usr/local/lib/pd-externals -# OSX: ~/Library/Pd -# Windows: %APPDATA%/Pd -# -# https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files -# The rationale for not installing to ~/pd-externals by default on Linux -# is that some people share the home dir between 32 and 64 bit installations. -# -# -#=== targets =================================================================== -# -# -# all: build $(executables) plus optional post target -# post: target to build after $(executables) -# alldebug: build all with -g option turned on for debug symbols -# : force clean build of an individual class -# .pre: make preprocessor output file in current working directory -# .lst: make asm/source output file in current working directory -# -# install: install executables and data files -# clean: remove build products from source tree -# -# help: print help text -# vars: print makefile variables -# allvars: print all variables -# depend: print generated prerequisites -# coffee: dummy target -# -# Variable $(executables) expands to class executables plus optional shared lib, -# or alternatively to single lib executable when make-lib-executable=true. -# Targets pre and post can be defined by library makefile. Make sure to include -# Makefile.pdlibbuilder first so default target all will not be redefined. -# -# -#=== 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. It does not automatically include such files in libdir installations. -# Data files you want to include in distributions must be defined explicitly in -# your Makefile. -# -# -#=== Makefile.pdlibbuilder 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. -# -# 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. -# Words in variables expressing a function or command are separated by dashes, -# like in 'make-lib-executable'. -# -# -#=== useful make options ======================================================= -# -# -# Use 'make -d ' to print debug details of the make process. -# Use 'make -p ' to print make's database. -# -# -#=== TODO ====================================================================== -# -# -# - decide whether to use -static-libgcc or shared dll in MinGW -# - cygwin support -# - android support -# - Windows 64 bit support -# - figure out how to handle '$' in filenames -# - add makefile template targets dpkg-source dist libdir distclean tags? -# -# -#=== end of documentation sections ============================================= -# -# -################################################################################ -################################################################################ -################################################################################ - - -# 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 externals root dir in multi-lib source tree like -# pd-extended SVN. Default is parent of current working directory. May be -# defined differently in including makefile. -externalsdir ?= .. - -# variable you can use to check if Makefile.pdlibbuilder is already included -Makefile.pdlibbuilder = true - - -################################################################################ -### variables: library name and version ######################################## -################################################################################ - - -# strip possibles spaces from lib.name, they mess up calculated file names -lib.name := $(strip $(lib.name)) - -# if meta file exists, check library version -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' \ - $(metafile)) -endif - - -################################################################################ -### variables: files ########################################################### -################################################################################ - - -#=== sources =================================================================== - - -# (re)define .class.sources using file names in 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) - - -#=== object files ============================================================== - - -# 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) - - -#=== executables =============================================================== - - -# use recursive variables here because executable extension is not yet known - -# construct class executable names from class names -classes.executables = $(addsuffix .$(extension), $(classes)) - -# construct shared lib executable name if shared sources are defined -ifdef shared.sources - shared.lib = lib$(lib.name).$(shared.extension) -else - shared.lib = -endif - - -################################################################################ -### platform detection ######################################################### -################################################################################ - - -#=== operating system ========================================================== - - -# The following systems are defined: Linux, Darwin, Windows. GNU and -# GNU/kFreeBSD are treated as Linux to get the same options. - -uname := $(shell uname) - -ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) - system = Linux -endif - -ifeq ($(uname), Darwin) - system = Darwin -endif - -ifeq ($(filter MINGW% MSYS, $(uname)), $(uname)) - system = Windows -endif - -# Unfortunately not all Mingw versions provide a link cc > gcc, therefore -# gcc is hardcoded here (but not if CC is redefined). -ifeq ($(system), Windows) - ifeq ($(origin CC), default) - CC = gcc - endif -endif - -# evaluate possible system-specific multiline defines from library makefile -$(eval $(for$(system))) - - -# TODO: Cygwin, Android - - -#=== architecture ============================================================== - - -# native architecture of the build machine -build.arch := $(shell uname -m) - -# Target architecture as reported by compiler. Give precedence to eventual -# user-defined compiler. The first field of -- is extracted. -ifneq ($(origin CXX), default) - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CXX) -dumpmachine))) -else - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine))) -endif - -# Target architecture as reported by compiler is only used for Windows at the -# moment. For other systems this still has to be tested. -ifeq ($(system), Windows) - target.arch = $(dumpmachine.cpu) -else - target.arch = $(build.arch) -endif - - -################################################################################ -### variables per platform ##################################################### -################################################################################ - - -#=== flags per architecture ==================================================== - - -# Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, -# arch.c.flags are overriden below. - -# Raspberry Pi 1st generation -ifeq ($(target.arch), armv6l) - arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard - -# Beagle, Udoo, RPi2 etc. -else ifeq ($(target.arch), armv7l) - arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard - -# Intel 32 bit, build with SSE and SSE2 instructions -else ifeq ($(findstring $(target.arch), i386 i686), $(target.arch)) - arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 - -# Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions -else ifeq ($(findstring $(target.arch), x86_64), $(target.arch)) - arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 - -# if none of the above architectures detected -else - arch.c.flags = -endif - - -#=== flags and paths for Linux ================================================= - - -ifeq ($(system), Linux) - prefix = /usr/local - libdir := $(prefix)/lib - pkglibdir = $(libdir)/pd-externals - pdincludepath := $(wildcard /usr/include/pd) - 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. -# LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for -# OSX x86_64. - - -ifeq ($(system), Darwin) - pkglibdir = $(HOME)/Library/Pd - pdincludepath := $(firstword $(wildcard \ - /Applications/Pd*.app/Contents/Resources/src)) - extension = pd_darwin - 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 - version.flag := $(filter $(cflags), -mmacosx-version-min=%) - ifeq ($(target.arch), i386) - cxx.flags := -fcheck-new - arch := ppc i386 x86_64 - version.flag ?= -mmacosx-version-min=10.4 - endif - ifeq ($(target.arch), x86_64) - arch := i386 x86_64 - version.flag ?= -mmacosx-version-min=10.5 - endif - arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) - arch.ld.flags := $(arch.c.flags) -endif - - -#=== flags and paths for Windows =============================================== - - -# Standard paths on Windows contain spaces, and GNU make functions treat such -# paths as lists, with unintended effects. Therefore we must use shell function -# ls instead of make's wildcard, and probe for each standard path individually. -# Using double quotes around paths with spaces is obligatory. Since some path -# variables are assembled or re-expanded later, great care must be taken to put -# quotes at appropriate points throughout the makefile. Thanks, Bill. - -# paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) -ifeq ($(system), Windows) - pkglibdir := $(APPDATA)/Pd - ifndef pdbinpath - pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") - endif - ifndef pdincludepath - pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") - endif -endif - -# TODO: decide whether -mms-bitfields should be specified. -ifeq ($(system), Windows) - cpp.flags := -DMSW -DNT - ifeq ($(filter i%86 mingw32, $(target.arch)), $(target.arch)) - arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse - else ifeq (x86_64, $(target.arch)) - cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 - arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse - else - arch.c.flags = - endif - extension = dll - c.flags := - c.ldflags = -static-libgcc -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - c.ldlibs := - cxx.flags := -fcheck-new - cxx.ldflags = -static-libstdc++ -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - cxx.ldlibs := - shared.extension = dll - shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" - stripflags = --strip-unneeded -R .note -R .comment -endif - - -#=== paths ===================================================================== - - -# Platform-dependent default paths are specified above, but overridable. -# Path variables in upper case can be defined as make command argument or in the -# environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with -# the build system that pd-l2ork has inherited from pd-extended. - -PDDIR ?= $(PD_PATH) -PDINCLUDEDIR ?= $(pdincludepath) -PDBINDIR ?= $(pdbinpath) -PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) - -ifneq ($(PDDIR),) - PDINCLUDEDIR := $(wildcard $(PDDIR)/src) - PDBINDIR := $(wildcard $(PDDIR)/bin) -endif - -# base path where all components of the lib will be installed by default -installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) - -# check if include path contains spaces (as is often the case on Windows) -# if so, store the path so we can later do checks with it -pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) - - -#=== accumulated build flags =================================================== - - -# From GNU make docs: 'Users expect to be able to specify CFLAGS freely -# themselves.' So we use CFLAGS to define options which are not strictly -# required for compilation: optimizations, architecture specifications, and -# warnings. CFLAGS can be safely overriden using a make command argument. -# Variables cflags, ldflags and ldlibs may be defined in including makefile. - -optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer -warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing - -# suppress -Wunused-variable & Co if you don't want to clutter a build log -ifdef suppress-wunused - warn.flags += $(addprefix -Wno-unused-, function parameter value variable) -endif - -CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) - -# preprocessor flags -cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) - -# flags for dependency checking (cflags from makefile may define -I options) -depcheck.flags := $(cpp.flags) $(cflags) - -# architecture specifications for linker are overridable by LDFLAGS -LDFLAGS := $(arch.ld.flags) - -# now add the same ld flags to shared dynamic lib -shared.ldflags := $(shared.ldflags) $(LDFLAGS) - -# accumulated flags for C compiler / linker -c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) -c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) -c.ldlibs := $(c.ldlibs) $(ldlibs) - -# accumulated flags for C++ compiler / linker -cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) -cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) -cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) - - -################################################################################ -### variables: tools ########################################################### -################################################################################ - - -# aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument -compile-c := $(CC) -compile-cxx := $(CXX) - - -################################################################################ -### checks ##################################################################### -################################################################################ - - -# At this point most variables are defined. Now do some checks and info's -# before rules begin. - -# '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 - -# store path to Pd API m_pd.h if it is found -ifdef PDINCLUDEDIR - mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") -endif - -# print Makefile.pdlibbuilder version -$(info ++++ info: using Makefile.pdlibbuilder version $(version)) - -# when making target all, check if m_pd.h is found and print info about it -ifeq ($(goals), all) - $(if $(mpdh), \ - $(info ++++ info: using Pd API $(mpdh)), \ - $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) -endif - -# print target info -$(info ++++ info: making target $(goals) $(if $(lib.name),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 - - -################################################################################ -### 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 post build-lib \ - $(classes) $(makefiledirs) $(makefiles) \ - install install-executables install-datafiles install-datadirs \ - force clean vars allvars depend help - - -################################################################################ -### rules: build targets ####################################################### -################################################################################ - - -# Target all forces the build of targets [$(executables) post] in -# deterministic order. Target $(executables) builds class executables plus -# optional shared lib or alternatively a single lib executable when -# make-lib-executable=true. Target post is optionally defined by -# library makefile. - -all: post -post: $(executables) - -all: - $(info ++++info: target all in lib $(lib.name) completed) - -# build all with -g option turned on for debug symbols -alldebug: c.flags += -g -alldebug: cxx.flags += -g -alldebug: all - - -#=== class executable ========================================================== - - -# recipe for linking objects in class executable -# argument $1 = compiler type (c or cxx) -# argument $2 = class basename -define link-class - $(compile-$1) \ - $($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) \ - $($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) \ - $(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 file from source -# argument $1 is compiler type (c or cxx) -define make-object-file - $(info ++++ info: making $@ in lib $(lib.name)) - $(compile-$1) \ - $($1.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. - -# When the Pd include path contains spaces it will mess up the implicit -# prerequisites rules. -disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) - -ifndef disable-dependency-tracking - must-build-everything := $(filter all, $(goals)) - must-build-class := $(filter $(classes), $(goals)) - must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) -endif - -# declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' -# argument $1 is input source file(s) -# dir is explicitly added because option -MM strips it by default -define declare-object-target -$(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.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) \ - $< > $(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. - - -# -p = preserve time stamps -# -m = set permission mode (as in chmod) -# -d = create all components of specified directories -INSTALL = install -INSTALL_PROGRAM := $(INSTALL) -p -m 644 -INSTALL_DATA := $(INSTALL) -p -m 644 -INSTALL_DIR := $(INSTALL) -m 755 -d - -# 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)" - $(foreach v, $(executables), \ - $(INSTALL_PROGRAM) '$v' "$(installpath)";) - $(info ++++ info: executables of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datafiles: all - $(INSTALL_DIR) -v "$(installpath)" - $(foreach v, $(datafiles), \ - $(INSTALL_DATA) '$(v)' "$(installpath)";) - $(info ++++ info: data files of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datadirs: all - $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) - $(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. Useful when you want to quickly find -# out which sub-makes from a large set will succeed. -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 - - -# 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 ============================================================ - - -# brief info about targets and paths - -ifdef mpdh - mpdhinfo := $(mpdh) -else - mpdhinfo := m_pd.h was not found. Is Pd installed? -endif - -help: - @echo - @echo " Main targets:" - @echo " all: build executables (default target)" - @echo " install: install all components of the library" - @echo " vars: print makefile variables for troubleshooting" - @echo " allvars: print all variables for troubleshooting" - @echo " help: print this help text" - @echo - @echo " Pd API m_pd.h:" - @echo " $(mpdhinfo)" - @echo " You may specify your preferred Pd include directory as argument" - @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." - @echo - @echo " Path for installation of your libdir(s):" - @echo " $(PDLIBDIR)" - @echo " Alternatively you may specify your path for installation as argument" - @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." - @echo - @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." - @echo - - -#=== dummy target ============================================================== - - -coffee: - @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." - - -################################################################################ -### end of rules sections ###################################################### -################################################################################ - - -# for syntax highlighting in vim and github -# vim: set filetype=make: - diff --git a/30/!Readdir/03/pd-lib-builder/README.md b/30/!Readdir/03/pd-lib-builder/README.md deleted file mode 100644 index 75e070e60..000000000 --- a/30/!Readdir/03/pd-lib-builder/README.md +++ /dev/null @@ -1,113 +0,0 @@ - - -### Makefile.pdlibbuilder ### - -Helper makefile for Pure Data external libraries. -Written by Katja Vetter March-June 2015 for the public domain. No warranties. -Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's -ShakeNMake. - -GNU make version >= 3.81 required. - - -### characteristics ### - - -* defines build settings based on autodetected OS and architecture -* defines rules to build Pd class- or lib executables from C or C++ sources -* defines rules for libdir installation -* defines convenience targets for developer and user -* evaluates implicit dependencies for non-clean builds - - -### basic usage ### - - -In your Makefile, define your Pd lib name and class files, and include -Makefile.pdlibbuilder at the end of the Makefile. Like so: - - - # Makefile for mylib - - lib.name = mylib - - class.sources = myclass1.c myclass2.c - - datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt - - include Makefile.pdlibbuilder - - -For files in class.sources it is assumed that class name == source file -basename. The default target builds all classes as individual executables -with Pd's default extension for the platform. For anything more than the -most basic usage, read the documentation sections in Makefile.pdlibbuilder. - - -### paths ### - - -Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be -defined not only as make command argument but also in the environment, to -override platform-dependent defaults: - -PDDIR: -Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. - -PDINCLUDEDIR: -Directory where Pd API m_pd.h should be found, and other Pd header files. -Overrides the default search path. - -PDBINDIR: -Directory where pd.dll should be found for linking (Windows only). Overrides -the default search path. - -PDLIBDIR: -Root directory for installation of Pd library directories. Overrides the -default install location. - - -### documentation ### - - -This README.md provides only basic information. A large comment section inside -Makefile.pdlibbuilder lists and explains the available user variables, default -paths, and targets. The internal documentation reflects the exact functionality -of the particular version. A tips&tricks page is in the works. - - -### versioning ### - - -The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), -and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers -are invited to regulary check for updates, and to contribute and discuss -improvements here. If you really need to distribute a personalized version with -your library, rename Makefile.pdlibbuilder to avoid confusion. - - -### examples ### - - -Here are a few projects using the Makefile.pdlibbuilder approach: - -https://github.com/pure-data/helloworld - -https://github.com/electrickery/pd-cyclone (stable) - -https://github.com/porres/pd-cyclone (experimental) - -https://git.iem.at/pd/iemguts - -https://git.iem.at/pd/iemnet - -https://git.iem.at/pd/iem_ambi - -https://git.iem.at/pd/mediasettings - -https://git.iem.at/pd-gui/punish - -https://github.com/residuum/PuRestJson - -More examples will be referenced here when they are available. diff --git a/30/!Readdir/03/readdir-help.pd b/30/!Readdir/03/readdir-help.pd deleted file mode 100755 index 74bc02a6d..000000000 --- a/30/!Readdir/03/readdir-help.pd +++ /dev/null @@ -1,58 +0,0 @@ -#N canvas 0 26 510 574 10; -#X msg 87 194 close; -#X msg 54 75 bang; -#X msg 77 144 tell; -#X obj 38 292 print dir-entry; -#X obj 82 264 print end-of-directory; -#X text 130 4 readdir : simple directory accessor; -#X text 240 523 Bryan Jurish ; -#X text 155 36 open DIR : opens the directory DIR; -#X text 184 77 bang : outlet next directory entry; -#X text 184 94 next : ditto; -#X msg 61 94 next; -#X msg 71 125 rewind; -#X text 173 125 rewind : return to beginning of directory; -#X text 187 145 tell : output current position; -#X text 146 163 seek FLOAT : goto position FLOAT; -#X msg 82 163 seek 0; -#X text 181 192 close : close directory; -#X text 258 265 2nd outlet bangs at end of directory; -#X text 260 295 Directory entries go to 1st outlet; -#X text 39 321 Directory entries appear as messages of the form TYPE -NAME \, where NAME is the name of the entry \, and TYPE is one of the -following:; -#X text 147 361 file : regular file; -#X text 154 374 dir : subdirectory; -#X text 147 387 fifo : named pipe; -#X text 147 400 sock : local-domain socket; -#X text 133 413 chrdev : character device; -#X text 133 427 blkdev : block device; -#X obj 38 237 readdir; -#X msg 44 46 open /tmp; -#X text 126 440 unknown : something else (maybe a symlink); -#X msg 38 26 open .; -#X text 39 462 BEWARE: Recognition of directory entry types does NOT -work on windows or any other system whose `dirent' struct is missing -the `d_type' field. On such systems \, the TYPE selector on the first -outlet is always the symbol `unknown'.; -#N canvas 260 141 494 344 META 0; -#X text 12 145 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan -Wilkes for Pd version 0.42.; -#X text 12 25 LICENSE GPL v2; -#X text 12 125 AUTHOR Bryan Jurish ; -#X text 12 5 KEYWORDS control filesystem; -#X text 12 45 DESCRIPTION simple directory accessor; -#X text 12 65 INLET_0 open bang next rewind tell seek close; -#X text 12 85 OUTLET_0 anything; -#X text 12 105 OUTLET_1 bang; -#X restore 451 552 pd META; -#X connect 0 0 26 0; -#X connect 1 0 26 0; -#X connect 2 0 26 0; -#X connect 10 0 26 0; -#X connect 11 0 26 0; -#X connect 15 0 26 0; -#X connect 26 0 3 0; -#X connect 26 1 4 0; -#X connect 27 0 26 0; -#X connect 29 0 26 0; diff --git a/30/!Readdir/03/readdir-test.pd b/30/!Readdir/03/readdir-test.pd deleted file mode 100755 index 95aefcc57..000000000 --- a/30/!Readdir/03/readdir-test.pd +++ /dev/null @@ -1,39 +0,0 @@ -#N canvas 958 137 572 546 10; -#X obj 130 376 readdir; -#X msg 311 313 close; -#X obj 174 403 print end-of-directory; -#X msg 255 196 bang; -#X msg 64 93 open \$1; -#X msg 64 37 .; -#X msg 101 37 test; -#X msg 144 37 foo; -#X obj 64 69 symbol; -#X obj 130 430 print entry; -#X msg 279 243 tell; -#X msg 275 219 rewind; -#X msg 318 279 seek \$1; -#X floatatom 317 260 5 0 0 0 - - -; -#X obj 153 65 openpanel 1; -#X obj 193 43 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 --1; -#X msg 153 91 set open \$1; -#X msg 167 119 open /Users/porres/Documents/Pd; -#X msg 194 149 open /Users/porres/Documents/Pdd; -#X connect 0 0 9 0; -#X connect 0 1 2 0; -#X connect 1 0 0 0; -#X connect 3 0 0 0; -#X connect 4 0 0 0; -#X connect 5 0 8 0; -#X connect 6 0 8 0; -#X connect 7 0 8 0; -#X connect 8 0 4 0; -#X connect 10 0 0 0; -#X connect 11 0 0 0; -#X connect 12 0 0 0; -#X connect 13 0 12 0; -#X connect 14 0 16 0; -#X connect 15 0 14 0; -#X connect 16 0 17 0; -#X connect 17 0 0 0; -#X connect 18 0 0 0; diff --git a/30/!Readdir/03/readdir.c b/30/!Readdir/03/readdir.c deleted file mode 100755 index ae0cf9e0d..000000000 --- a/30/!Readdir/03/readdir.c +++ /dev/null @@ -1,281 +0,0 @@ -/* -*- Mode: C -*- */ -/*=============================================================================*\ - * File: readdir.c - * Author: Bryan Jurish - * Description: general directory access object - * - * Copyright (c) 2003-2009 Bryan Jurish. - * - * For information on usage and redistribution, and for a DISCLAIMER OF ALL - * WARRANTIES, see the file, "LICENSE.txt," in this distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * See file LICENSE for further informations on licensing terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *=============================================================================*/ - -#include -//#include -#include - -#include - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -/*-------------------------------------------------------------------- - * DEBUG - *--------------------------------------------------------------------*/ -//#define READDIR_DEBUG 1 - - -/*===================================================================== - * Constants - *=====================================================================*/ -#ifdef READDIR_DEBUG -// error-message buffer -#define EBUFSIZE 256 -static char readdir_errbuf[EBUFSIZE]; -#endif - - -/*===================================================================== - * Structures and Types - *=====================================================================*/ - -static char *readdir_banner = - "\n" - "readdir: simple directory accessor v" "0.02" " by Bryan Jurish\n" - "readdir: compiled by " "rdz" " on " "2015-11-16" ; - -static t_class *readdir_class; - -typedef struct _readdir -{ - t_object x_obj; - DIR *x_dir; //-- current directory - t_symbol *x_dirname; //-- current directory name - //struct dirent *x_dirent; //-- current entry of current directory - t_atom x_eatom; //-- current output atom (symbol) - t_outlet *x_ent_outlet; //-- entry outlet - t_outlet *x_eod_outlet; //-- end-of-directory outlet -} t_readdir; - -/*===================================================================== - * Constants - *=====================================================================*/ -static t_symbol *sp_none; -static t_symbol *sp_unknown; -static t_symbol *sp_file; -static t_symbol *sp_dir; -static t_symbol *sp_fifo; -static t_symbol *sp_sock; -static t_symbol *sp_chrdev; -static t_symbol *sp_blkdev; - -/*-------------------------------------------------------------------- - * close - */ -static void readdir_close(t_readdir *x) -{ - if (!x->x_dir) return; - if (0 != closedir(x->x_dir)) { - pd_error(x, "readdir: cannot close %s", x->x_dirname->s_name); - return; - } - x->x_dir = NULL; - x->x_dirname = sp_none; -} - -/*-------------------------------------------------------------------- - * open DIR - */ -static void readdir_open(t_readdir *x, t_symbol *dirname){ - post("readdir: got message: open %s", dirname->s_name); - if(x->x_dir){ - post("there's an open dr, close it"); - readdir_close(x); - } - if(!(x->x_dir = opendir(dirname->s_name))){ - pd_error(x, "readdir: cannot open %s", dirname->s_name); - return; - } - x->x_dirname = dirname; - post("we could open, so x->x_dirname = %s", x->x_dirname->s_name); -} - -/*-------------------------------------------------------------------- - * next : get next entry - */ -static void readdir_next(t_readdir *x) -{ - t_symbol *sel = sp_unknown; - post("sel = %s", sel->s_name); - struct dirent *result = NULL; - if ( !x->x_dir || !(result = readdir(x->x_dir)) ) { - - outlet_bang(x->x_eod_outlet); - - return; - } - -#if HAVE_STRUCT_DIRENT_D_TYPE - //-- get type (if this OS supports it, e.g. if we're not on windoof) - switch (result->d_type) - { -#if HAVE_DECL_DT_REG - case DT_REG: sel = sp_file; break; -#endif - -#if HAVE_DECL_DT_DIR - case DT_DIR: sel = sp_dir; break; -#endif - -#if HAVE_DECL_DT_FIFO - case DT_FIFO: sel = sp_fifo; break; -#endif - -#if HAVE_DECL_DT_SOCK - case DT_SOCK: sel = sp_sock; break; -#endif - -#if HAVE_DECL_DT_CHR - case DT_CHR: sel = sp_chrdev; break; -#endif - -#if HAVE_DECL_DT_BLK - case DT_BLK: sel = sp_blkdev; break; -#endif - -#if HAVE_DECL_DT_UNKNOWN - case DT_UNKNOWN: -#endif - default: - sel = sp_unknown; - break; - } -#else /* if !HAVE_STRUCT_DIRENT_D_TYPE */ - sel = sp_unknown; -#endif /* HAVE_STRUCT_DIRENT_D_TYPE */ - - x->x_eatom.a_w.w_symbol = gensym(result->d_name); - outlet_anything(x->x_ent_outlet, sel, 1, &x->x_eatom); -} - -/*-------------------------------------------------------------------- - * rewind - */ -static void readdir_rewind(t_readdir *x) -{ - if (x->x_dir) rewinddir(x->x_dir); -} - -/*-------------------------------------------------------------------- - * tell - */ -static void readdir_tell(t_readdir *x) -{ - off_t off = 0; - if (x->x_dir) off = telldir(x->x_dir); -#ifdef READDIR_DEBUG - post("readdir_tell(): off: %%d=%d, %%f=%f\n", off, (t_float)off); -#endif - outlet_float(x->x_ent_outlet, (t_float)off); -} - -/*-------------------------------------------------------------------- - * seek FLOAT - */ -static void readdir_seek(t_readdir *x, t_floatarg pos) -{ - if (!x->x_dir) { - pd_error(x, "readdir: seek %g: no directory opened!", pos); - return; - } - seekdir(x->x_dir, (off_t)pos); -} - - -/*-------------------------------------------------------------------- - * new - */ -static void *readdir_new(void) -{ - t_readdir *x = (t_readdir *)pd_new(readdir_class); - - //-- defaults - x->x_dir = NULL; - x->x_dirname = sp_none; - SETSYMBOL(&x->x_eatom, sp_none); - - //-- outlets - x->x_ent_outlet = outlet_new(&x->x_obj, &s_symbol); - x->x_eod_outlet = outlet_new(&x->x_obj, &s_bang); - - return (void *)x; -} - -/*-------------------------------------------------------------------- - * free - */ -static void readdir_free(t_readdir *x) -{ - readdir_close(x); - outlet_free(x->x_ent_outlet); - outlet_free(x->x_eod_outlet); - return; -} - -/*-------------------------------------------------------------------- - * setup - */ -void readdir_setup(void) -{ - post(readdir_banner); -#ifdef READDIR_DEBUG - post("readdir: debugging enabled"); -#endif - - //-- constants - sp_none = gensym("none"); - sp_unknown = gensym("unknown"); - sp_file = gensym("file"); - sp_dir = gensym("dir"); - sp_fifo = gensym("fifo"); - sp_sock = gensym("sock"); - sp_chrdev = gensym("chrdev"); - sp_blkdev = gensym("blkdev"); - - //-- class - readdir_class = class_new(gensym("readdir"), - (t_newmethod)readdir_new, - (t_method)readdir_free, - sizeof(t_readdir), - CLASS_DEFAULT, - 0); - - //-- methods - class_addmethod(readdir_class, (t_method)readdir_open, gensym("open"), A_DEFSYMBOL, 0); - class_addmethod(readdir_class, (t_method)readdir_close, gensym("close"), 0); - class_addmethod(readdir_class, (t_method)readdir_next, gensym("next"), 0); - class_addbang(readdir_class, (t_method)readdir_next); - class_addmethod(readdir_class, (t_method)readdir_rewind, gensym("rewind"), 0); - class_addmethod(readdir_class, (t_method)readdir_tell, gensym("tell"), 0); - class_addmethod(readdir_class, (t_method)readdir_seek, gensym("seek"), A_DEFFLOAT, 0); - - //-- help symbol - class_sethelpsymbol(readdir_class, gensym("readdir-help.pd")); -} diff --git a/30/!Readdir/03/readdir.o b/30/!Readdir/03/readdir.o deleted file mode 100644 index 44bb03f62c45ae659089c8ada9c384b49b263883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17192 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 diff --git a/30/!Readdir/03/readdir.pd_darwin b/30/!Readdir/03/readdir.pd_darwin deleted file mode 100755 index 8a4e59bea867b2cead51dbb4cec425febf4750f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26400 zcmeHOe{@vGb)J=0u(gS_VBug#mG961&IcK&wy^8@IOQ2%GpvT}qQ4(vpUgI_}DLQ>DaqOqy)J zZ)V=^(?c@;qo++y-W=VTd+*$PXXehl(Y|?iUj4)Gv@ zX1LSrh_&nrE3VVVCFqu+A1rZ*GijoqyvR(mu69$cO@wo418Y54c1$yhc~H~QlZZ{K zFP8%{d;d8HH|S9%mUm9m@57EtwP)}N#&=&V>`9WVr_piv+DTY+_pXL+i>`$ zCEytV+7`vvNgyugwD6lA+Tw7nbQ=)TGtgg_w`-dHchfJA2R3fLZ{S@c!w#84gMC=0 zNpB!?BUbFt;7m=O$G(~z{4yqeXz)hOdtUOMl)PIs@0jHMh2-6;d5=ln3CUZidHW^r zYm!%?c~Qyxy5v=A-u;qyTJowjuU_(=lf2*7yd~fbec^|A8j_6x-_RF&73RfA&ejF^ zbP1Glb)uY61v>Mt7t${$2Vazy)@e%_a_eAY@LnuzVBTaEZRB(zCo;z%m3mrfHfqhk z%xRV@Ol!(*Jkw{>xJPU3vowwzAhykFOKH?oL-tPAU``g>Y;4vxsx2FXv+0*yf0c~_ zo5psnF)gRDbP|no7_~LBHm&h(01hXvq&a z^8u>g@t>{NeLBguAX#5Q-8WE~st*z!1*+OCnO7%-e7^j0fZJ2s0)f;%G+M~64;|dg zxq!-3RC%~eB-Rfdd|dOsNQ>)ooofIoJGaj2+`(~5(giC5nfp{hV#5{XuR;az4C6ga6D)MN@lVOU+yz$*5|%I`smD2S#R- zITuVWmHLXI^#SY)Gm`t@E4d^1P$e?VRnvOreh#i;n>?_1p5<5(63$a7Qb`yJq*u%sgBzA;Y4>6h=>mc?D zv2Db@N9-PATtiHeS{NLaLY#em>Pcf7l8r)cYpwTB-Nt&yE9V&Rr{)_3=WqoOU+ z9S@5rUt3~f{#F->a3mt);qXpN@J_x*EbeI+*J;h=M!aiRPb6%>O1Lf29ouWPw6%rf z@$Q)MKyYzziP5^(SRLEj5;gAXjdjI4^NMZVyL!;Sc1pzBA2hn7#*$#=(mN|F@2p&A zHMrc^(VZ}M!C=dd@N$FwG|J;5(HV|~7sd^km8|wyg(16dbg}btP|J7>PJ`3cQB>h6nY#bfTpZ(?j_>bE*e&x7{}&pw~WKcmRY_q9dfv2Vlg zXR~p3thU%!TRfw-*uSPYc+fjoI8d;*xT>}|h$;iXHS7H_o85s@%dROl4i*kVEKpl) z7+^;LO_14%axxjVnFjnRWM0b4$TkhDO&UWT;co#oSF+j9p`6T~0rn-pKFAzEIhhRn zAm8~yKg(vfQ3k`y4UDui;Q_l2PztyOun4dOumVsIXad|1Xa__AeSrOdM*)ukjslJW zP66EHdcgI7>jBpTt_NHXxE^pl;CjIIfa?L*1Fi>L5Bzd?VCH;(^9{3%L!a!QRnRl) z=_%MC#Ht!IZnn1IoA-v@zBCE-@mHj4+V@7<)mQaa9FpOydjEJvj7Q0LB%w6F`XLmbJL3Yo{v7_NVWR&F?aR}k8&1zKaHe?k}=x|;YxOaWSmLW)iujllJZo7Gt=G)Xp3Ag3C| zCP?u7ZL0b$sORD36!lzo9;;;-O7!-KS%qR4XK};V_ZRi_obxoNJw^@0cHo?>7!dRc zk2;QKZ1$5CBcr^|8V{nq?-GX|zuW&nHvB#t z&X@znXOseX_|H>z##->q@Fu{`0LB;aoOCYW7Qj4!0hkY104N9C23QC{s<{eyuRq~2aMgHN4CCvGWVIyVz*8<~0oxoYdM7;@9F2(?}0C~g!MA-j{?9Joy= z4mSjAfVr&zj43w(Yj@6X%u{a&Q*Q-VZRJ)URJZirgqR}^!J@dm<|*~nBv&avpX4b0 z9VJK04=OoIepxZ&J*NC_5Ro5pi0F?wMD+)qoNf6ph^x^} zt_NHXxE^pl;CjIIfa?L*16O(A?^XQ2hw&G9wL=UB-uLj1B!ee_^F3e@UY?xs=3uLY zcdH3W(}-vjF!QnR1o)|dbU`;v+UkR>u-y$Htz!H0(csShW$=E<6jOyDjaQ#s@@abr zK$GcOcLlcTc!qOYo;2SnbLp!7ee}J7iccs_#-cD;w4xlg!MxTTf>Vh5XX;ahAU&af znr{`?x=#=+QIghpNpp=%mAFng7H3R81G8kBqU5yGt~J*m=dJ}k?`^EXR?i^6g zG!aBaL?>te7;(pB*(2?=$9H2ZUF#l$p$#3@3Z(7!I9}^M14T^pqwh34qwR&XJr;I* z_BG8q&I4s9z286qZBG~^@Gh^PI~I0Zc(>2pci_I@GbY}5r~%y%g^~Fa?>l5bFM_-u z2LpaAKt6^|04AQhSZ6OhAK-bzRH-xY(f1w1+xtH(`|7eM4!!NYEA!KPtCzr#0YI1J zT?gKIATE71$$bYt&eZ^(b?`ayTzL~q&?7$G8;^ZD($z}XxHp~%?^?WiF;Vmc1?5KZu-^tK<#}Sn?ge?`>>Bxj%04ezc5gRpfdc=6iOBi;Ls7Q_fV60 zNwNAA>us`5D%LK=;w`t#5yfg%tiL1cQN`M|9t=&HM9dK;%Bl8Jr!&0JsJ zLfwSE{I2dxLuys#NmRlaFf)=UYfQ$g8&Yif71@a8=3xjmq;A9rzoht>1U&;uRORl2 z*!{CKvkFzPdQ;v%k6YSX$2PFtyn9~7+T`@uFSK-|obk1rGpg3y@gQnZ05z>R6m4`Gwe5n18(A z`b33%GZjS!6fPAA?@?4>A1v(gih_Qu++nZq48u|yfTiiJ0n7nFU4AQLDen{X`Ej3M zx{u#L1K{yH*~kZ2C`hwqXTVrp?5{1JgP{I_!b9Lut`5+Ln0+QLZkZ;Li=d(zar;cY zTFhyWZGI8(jF!`{ZI-m`(J?*RfGz^z8A)%2=`t{$vGe&*e}>6BLj5Vk*!M{y{G0P^E5g4s&&oyk_t{wOk$EK|D%fUi16hIo??w7yr2AG@*QFQ;Nu|5 zvY(ITPvhHvy7;KKxp~CX)bH^JA+{W6R5F$yAAp$FX*#Xxdo?|-={8LdBW9l|rfK;> z7j(a-`}O%6&%kIut?570^oXX9lZGwpd-m5gJ>r+<#fzH$mZo3T^f^uQ>jU*KX!>6? zeM!@AYC5Co|J3xjrmtxFr<&&R9Pa~IaVOSyY1JEbo`~vPssv`IS2*Ym4tlGDZgbF# zNwC{H;GqA=K_7L{Cmi%?2R-VbUvtp^;Glotpx<-QKX=g6(Rq9S?RO6#DsFew^LziV n_gw>FZC_VyTvu&b7UTcuW&r~0)z&}tg#vNa-t%j6ec*opuiRmT diff --git a/30/!sort/Makefile b/30/!sort/Makefile deleted file mode 100755 index b4d966df3..000000000 --- a/30/!sort/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -sort.class.sources := sort.c - -# include Makefile.pdlibbuilder from submodule directory 'pd-lib-builder' -PDLIBBUILDER_DIR=pd-lib-builder/ -include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder diff --git a/30/!sort/pd-lib-builder/CHANGELOG.txt b/30/!sort/pd-lib-builder/CHANGELOG.txt deleted file mode 100644 index 41ac0e206..000000000 --- a/30/!sort/pd-lib-builder/CHANGELOG.txt +++ /dev/null @@ -1,87 +0,0 @@ -Changelog for Makefile.pdlibbuilder. - -v0.5.0, dated 2018-01-23 -Implement target architecture detection for Windows builds, -and set appropriate options for 32 and 64 bit (used to be for 32 bit only). -(feature, issue #37 #38, merge commit 215bf3e) - -v0.4.4, dated 2016-11-22 -Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' -(bugfix, issue #31, commit 2c14110) - -v0.4.3, dated 2016-11-02 -Replace flags '-fpic' by 'fPIC'. -(bugfix, issue #29, commit 426b38b) - -v0.4.2, dated 2016-10-30 -Fix issue where incorrect message about m_pd.h is given. -(bugfix, commit 2e13d8f) - -v0.4.1, dated 2016-10-27 -Respect cflag for minimum OSX version when defined by lib makefile. -(bugfix, pull request #22, commit 48c4127) - -v0.4.0, dated 2016-10-14 -Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can -also be defined in environment. -(feature, issue #27, commit b0dab72) - -v0.3.1, dated 2016-10-13 -Fix bug where pd.dll wouldn't be found. -(bugfix, commit a0c87be) - -v0.3.0, dated 2016-10-09 -Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. -(feature, issue #26, commit 41e9743) - -v0.2.8, dated 2016-10-09 -Allow installed files to contain weird characters (notably '$'). -(bugfix, pull request #20, commit 5b920b1) - -v0.2.7, dated 2016-10-04 -Remove all default pd search paths except vanilla's. -(discussion, issue #25, commit a6a89dc) - -v0.2.6, dated 2016-09-20 -Redefined dependency checking so it won't stall rebuilds on OSX. -(bugfix, issue #16, commit 9fd1795) - -v0.2.5, dated 2016-06-26 -Fixed dependency checking for object files in other directories. -(bugfix, commit f06e550) - -v0.2.4, dated 2016-06-25 -Fixed regression bug that disabled all dependency checking. -(bugfix, commit 1d7bb5e) - -v0.2.3, dated 2016-03-29 -Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. -(bugfix, issue #16, commit eb614fd) - -v0.2.2, dated 2016-03-28 -Removed target 'pre' because it forced rebuild of everything in 'all'. -(bugfix, issue #17, commit c989c8e) - -v0.2.1, dated 2015-12-27 -Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. -(bugfix, issue #5, commit 98f3582) - -v0.2.0, dated 2015-12-19 -Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. -(feature, pull request #9, commit 3946ea5) - -v0.1.0, dated 2015-12-08 -Added targets 'pre' and 'post' to automatically run before and after 'all'. -(feature, pull request #4, commit a5678ac) - -v0.0.2, dated 2015-12-06 -Improved methods for searching pd paths. -(bugfix, commit ed37e6b) - -v0.0.1, dated 2015-10-31 -Fixed expansion of variable 'lib.version'. -(bugfix, issue #1, commit 974b617) - -v0.0.0, dated 2015-06-24 -Initial version. -(commit 16517a2) diff --git a/30/!sort/pd-lib-builder/Makefile.pdlibbuilder b/30/!sort/pd-lib-builder/Makefile.pdlibbuilder deleted file mode 100644 index 1db3f8c2c..000000000 --- a/30/!sort/pd-lib-builder/Makefile.pdlibbuilder +++ /dev/null @@ -1,1252 +0,0 @@ -# Makefile.pdlibbuilder dated 2018-01-23 -version = 0.5.0 - -# Helper makefile for Pure Data external libraries. -# Written by Katja Vetter March-June 2015 for the public domain. No warranties. -# Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's -# ShakeNMake. -# -# Grab the newest version of Makefile.pdlibbuilder from -# https://github.com/pure-data/pd-lib-builder/ -# -# GNU make version >= 3.81 required. -# -# -#=== characteristics =========================================================== -# -# -# - defines build settings based on autodetected OS and architecture -# - defines rules to build Pd class- or lib executables from C or C++ sources -# - defines rules for libdir installation -# - defines convenience targets for developer and user -# - evaluates implicit dependencies for non-clean builds -# -# -#=== basic usage =============================================================== -# -# -# In your Makefile, define your Pd lib name and class files, and include -# Makefile.pdlibbuilder at the end of the Makefile. Like so: -# -# ________________________________________________________________________ -# -# # Makefile for mylib -# -# lib.name = mylib -# -# class.sources = myclass1.c myclass2.c -# -# datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt -# -# include Makefile.pdlibbuilder -# ________________________________________________________________________ -# -# -# For files in class.sources it is assumed that class basename == source file -# basename. The default target builds all classes as individual executables -# with Pd's default extension for the platform. For anything more than the -# most basic usage, continue reading. -# -# -#=== list of Makefile.pdlibbuilder API variables =============================== -# -# -# Variables available for definition in your library Makefile: -# -# - lib.name -# - lib.setup.sources -# - class.sources -# - common.sources -# - shared.sources -# - .class.sources -# - .class.ldflags -# - .class.ldlibs -# - cflags -# - ldflags -# - ldlibs -# - datafiles -# - datadirs -# - makefiles -# - makefiledirs -# - externalsdir -# -# Optional multiline defines evaluated per operating system: -# -# - forLinux -# - forDarwin -# - forWindows -# -# Variables available for your makefile or make command line: -# -# - make-lib-executable -# - suppress-wunused -# -# Path variables for make command line or environment: -# -# - PDDIR -# - PDINCLUDEDIR -# - PDBINDIR -# - PDLIBDIR -# -# Standard make variables for make command line or environment: -# -# - CPPFLAGS -# - CFLAGS -# - LDFLAGS -# - CC -# - CXX -# - INSTALL -# - DESTDIR -# -# Deprecated path variables: -# -# - PD_PATH -# - pdincludepath -# - pdbinpath -# - objectsdir -# -# -#=== descriptions of Makefile.pdlibbuilder API variables ======================= -# -# -# lib.name: -# Name of the library directory as it will be installed / distributed. Also the -# name of the lib executable in the case where all classes are linked into -# a single binary. -# -# lib.setup.sources: -# Source file(s) (C or C++) which must be compiled only when linking all classes -# into a single lib binary. -# -# class.sources: -# All sources files (C or C++) for which the condition holds that -# class name == source file basename. -# -# .class.sources: -# Source file(s) (C or C++) specific to class . Use this for -# multiple-source classes or when class name != source file basename. -# -# common.sources: -# Source file(s) which must be statically linked to each class in the library. -# -# shared.sources: -# Source file(s) (C or C++) to build a shared dynamic link lib, to be linked -# with all class executables. -# -# cflags, ldflags, ldlibs: -# Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic -# link libs) for the whole library. These flags are added to platform-specific -# flags defined by Makefile.pdlibbuilder. -# -# .class.ldflags and .class.ldlibs: -# Define ldflags resp. ldlibs specific to class . These flags are -# added to platform-specific flags defined by Makefile.pdlibbuilder, and flags -# defined in your Makefile for the whole library. Note: cflags can not be -# defined per class in the current implementation. -# -# datafiles and datadirs: -# All extra files you want to include in binary distributions of the -# library: abstractions and help patches, example patches, meta patch, readme -# and license texts, manuals, sound files, etcetera. Use 'datafiles' for all -# files that should go into your lib rootdir and 'datadirs' for complete -# directories you want to copy from source to distribution. -# -# forLinux, forDarwin, forWindows: -# Shorthand for 'variable definitions for Linux only' etc. Use like: -# define forLinux -# cflags += -DLINUX -# class.sources += linuxthing.c -# endef -# -# makefiles and makefiledirs: -# Extra makefiles or directories with makefiles that should be made in sub-make -# processes. -# -# make-lib-executable: -# When this variable is defined 'yes' in your makefile or as command argument, -# Makefile.pdlibbuilder will try to build all classes into a single library -# executable (but it will force exit if lib.setup.sources is undefined). -# If your makefile defines 'make-lib-executable=yes' as the library default, -# this can still be overriden with 'make-lib-executable=no' as command argument -# to build individual class executables (the Makefile.pdlibbuilder default.) -# -# suppress-wunused: -# When this variable is defined ('yes' or any other value), -Wunused-variable, -# -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, -# but the other warnings from -Wall are retained. -# -# PDDIR: -# Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -# PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. -# -# PDINCLUDEDIR: -# Directory where Pd API m_pd.h should be found, and other Pd header files. -# Overrides the default search path. -# -# PDBINDIR: -# Directory where pd.dll should be found for linking (Windows only). Overrides -# the default search path. -# -# PDLIBDIR: -# Root directory for installation of Pd library directories. Overrides the -# default install location. -# -# DESTDIR: -# Prepended path component for staged install. -# -# CPPFLAGS: -# Preprocessor flags which are not strictly required for building. -# -# CFLAGS: -# Compiler flags which are not strictly required for building. Compiler flags -# defined by Makefile.pdlibbuilder for warning, optimization and architecture -# specification are overriden by CFLAGS. -# -# LDFLAGS: -# Linker flags which are not strictly required for building. Linker flags -# defined by Makefile.pdlibbuilder for architecture specification are overriden -# by LDFLAGS. -# -# CC and CXX: -# C and C++ compiler programs as defined in your build environment. -# -# INSTALL -# Definition of install program. -# -# PD_PATH: -# Equivalent to PDDIR. Supported for compatibility with pd-extended central -# makefile, but deprecated otherwise. -# -# objectsdir: -# Root directory for installation of Pd library directories, like PDLIBDIR but -# not overridable by environment. Supported for compatibility with pd-extended -# central makefile, but deprecated otherwise. -# -# pdincludepath, pdbinpath: -# As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated -# as user variables. -# -# -#=== paths ===================================================================== -# -# -# Source files in directories other than current working directory must be -# prefixed with their relative path. Do not rely on VPATH or vpath. -# Object (.o) files are built in the directory of their source files. -# Executables are built in current working directory. -# -# Default search path for m_pd.h and other API header files is platform -# dependent, and overridable by PDINCLUDEDIR: -# -# Linux: /usr/include/pd -# -# OSX: /Applications/Pd*.app/Contents/Resources/src -# -# Windows: %PROGRAMFILES%/pd/src -# -# Default location to install pd libraries is platform dependent, and -# overridable by PDLIBDIR: -# -# Linux: /usr/local/lib/pd-externals -# OSX: ~/Library/Pd -# Windows: %APPDATA%/Pd -# -# https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files -# The rationale for not installing to ~/pd-externals by default on Linux -# is that some people share the home dir between 32 and 64 bit installations. -# -# -#=== targets =================================================================== -# -# -# all: build $(executables) plus optional post target -# post: target to build after $(executables) -# alldebug: build all with -g option turned on for debug symbols -# : force clean build of an individual class -# .pre: make preprocessor output file in current working directory -# .lst: make asm/source output file in current working directory -# -# install: install executables and data files -# clean: remove build products from source tree -# -# help: print help text -# vars: print makefile variables -# allvars: print all variables -# depend: print generated prerequisites -# coffee: dummy target -# -# Variable $(executables) expands to class executables plus optional shared lib, -# or alternatively to single lib executable when make-lib-executable=true. -# Targets pre and post can be defined by library makefile. Make sure to include -# Makefile.pdlibbuilder first so default target all will not be redefined. -# -# -#=== 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. It does not automatically include such files in libdir installations. -# Data files you want to include in distributions must be defined explicitly in -# your Makefile. -# -# -#=== Makefile.pdlibbuilder 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. -# -# 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. -# Words in variables expressing a function or command are separated by dashes, -# like in 'make-lib-executable'. -# -# -#=== useful make options ======================================================= -# -# -# Use 'make -d ' to print debug details of the make process. -# Use 'make -p ' to print make's database. -# -# -#=== TODO ====================================================================== -# -# -# - decide whether to use -static-libgcc or shared dll in MinGW -# - cygwin support -# - android support -# - Windows 64 bit support -# - figure out how to handle '$' in filenames -# - add makefile template targets dpkg-source dist libdir distclean tags? -# -# -#=== end of documentation sections ============================================= -# -# -################################################################################ -################################################################################ -################################################################################ - - -# 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 externals root dir in multi-lib source tree like -# pd-extended SVN. Default is parent of current working directory. May be -# defined differently in including makefile. -externalsdir ?= .. - -# variable you can use to check if Makefile.pdlibbuilder is already included -Makefile.pdlibbuilder = true - - -################################################################################ -### variables: library name and version ######################################## -################################################################################ - - -# strip possibles spaces from lib.name, they mess up calculated file names -lib.name := $(strip $(lib.name)) - -# if meta file exists, check library version -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' \ - $(metafile)) -endif - - -################################################################################ -### variables: files ########################################################### -################################################################################ - - -#=== sources =================================================================== - - -# (re)define .class.sources using file names in 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) - - -#=== object files ============================================================== - - -# 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) - - -#=== executables =============================================================== - - -# use recursive variables here because executable extension is not yet known - -# construct class executable names from class names -classes.executables = $(addsuffix .$(extension), $(classes)) - -# construct shared lib executable name if shared sources are defined -ifdef shared.sources - shared.lib = lib$(lib.name).$(shared.extension) -else - shared.lib = -endif - - -################################################################################ -### platform detection ######################################################### -################################################################################ - - -#=== operating system ========================================================== - - -# The following systems are defined: Linux, Darwin, Windows. GNU and -# GNU/kFreeBSD are treated as Linux to get the same options. - -uname := $(shell uname) - -ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) - system = Linux -endif - -ifeq ($(uname), Darwin) - system = Darwin -endif - -ifeq ($(filter MINGW% MSYS, $(uname)), $(uname)) - system = Windows -endif - -# Unfortunately not all Mingw versions provide a link cc > gcc, therefore -# gcc is hardcoded here (but not if CC is redefined). -ifeq ($(system), Windows) - ifeq ($(origin CC), default) - CC = gcc - endif -endif - -# evaluate possible system-specific multiline defines from library makefile -$(eval $(for$(system))) - - -# TODO: Cygwin, Android - - -#=== architecture ============================================================== - - -# native architecture of the build machine -build.arch := $(shell uname -m) - -# Target architecture as reported by compiler. Give precedence to eventual -# user-defined compiler. The first field of -- is extracted. -ifneq ($(origin CXX), default) - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CXX) -dumpmachine))) -else - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine))) -endif - -# Target architecture as reported by compiler is only used for Windows at the -# moment. For other systems this still has to be tested. -ifeq ($(system), Windows) - target.arch = $(dumpmachine.cpu) -else - target.arch = $(build.arch) -endif - - -################################################################################ -### variables per platform ##################################################### -################################################################################ - - -#=== flags per architecture ==================================================== - - -# Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, -# arch.c.flags are overriden below. - -# Raspberry Pi 1st generation -ifeq ($(target.arch), armv6l) - arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard - -# Beagle, Udoo, RPi2 etc. -else ifeq ($(target.arch), armv7l) - arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard - -# Intel 32 bit, build with SSE and SSE2 instructions -else ifeq ($(findstring $(target.arch), i386 i686), $(target.arch)) - arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 - -# Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions -else ifeq ($(findstring $(target.arch), x86_64), $(target.arch)) - arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 - -# if none of the above architectures detected -else - arch.c.flags = -endif - - -#=== flags and paths for Linux ================================================= - - -ifeq ($(system), Linux) - prefix = /usr/local - libdir := $(prefix)/lib - pkglibdir = $(libdir)/pd-externals - pdincludepath := $(wildcard /usr/include/pd) - 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. -# LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for -# OSX x86_64. - - -ifeq ($(system), Darwin) - pkglibdir = $(HOME)/Library/Pd - pdincludepath := $(firstword $(wildcard \ - /Applications/Pd*.app/Contents/Resources/src)) - extension = pd_darwin - 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 - version.flag := $(filter $(cflags), -mmacosx-version-min=%) - ifeq ($(target.arch), i386) - cxx.flags := -fcheck-new - arch := ppc i386 x86_64 - version.flag ?= -mmacosx-version-min=10.4 - endif - ifeq ($(target.arch), x86_64) - arch := i386 x86_64 - version.flag ?= -mmacosx-version-min=10.5 - endif - arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) - arch.ld.flags := $(arch.c.flags) -endif - - -#=== flags and paths for Windows =============================================== - - -# Standard paths on Windows contain spaces, and GNU make functions treat such -# paths as lists, with unintended effects. Therefore we must use shell function -# ls instead of make's wildcard, and probe for each standard path individually. -# Using double quotes around paths with spaces is obligatory. Since some path -# variables are assembled or re-expanded later, great care must be taken to put -# quotes at appropriate points throughout the makefile. Thanks, Bill. - -# paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) -ifeq ($(system), Windows) - pkglibdir := $(APPDATA)/Pd - ifndef pdbinpath - pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") - endif - ifndef pdincludepath - pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") - endif -endif - -# TODO: decide whether -mms-bitfields should be specified. -ifeq ($(system), Windows) - cpp.flags := -DMSW -DNT - ifeq ($(filter i%86 mingw32, $(target.arch)), $(target.arch)) - arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse - else ifeq (x86_64, $(target.arch)) - cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 - arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse - else - arch.c.flags = - endif - extension = dll - c.flags := - c.ldflags = -static-libgcc -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - c.ldlibs := - cxx.flags := -fcheck-new - cxx.ldflags = -static-libstdc++ -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - cxx.ldlibs := - shared.extension = dll - shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" - stripflags = --strip-unneeded -R .note -R .comment -endif - - -#=== paths ===================================================================== - - -# Platform-dependent default paths are specified above, but overridable. -# Path variables in upper case can be defined as make command argument or in the -# environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with -# the build system that pd-l2ork has inherited from pd-extended. - -PDDIR ?= $(PD_PATH) -PDINCLUDEDIR ?= $(pdincludepath) -PDBINDIR ?= $(pdbinpath) -PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) - -ifneq ($(PDDIR),) - PDINCLUDEDIR := $(wildcard $(PDDIR)/src) - PDBINDIR := $(wildcard $(PDDIR)/bin) -endif - -# base path where all components of the lib will be installed by default -installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) - -# check if include path contains spaces (as is often the case on Windows) -# if so, store the path so we can later do checks with it -pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) - - -#=== accumulated build flags =================================================== - - -# From GNU make docs: 'Users expect to be able to specify CFLAGS freely -# themselves.' So we use CFLAGS to define options which are not strictly -# required for compilation: optimizations, architecture specifications, and -# warnings. CFLAGS can be safely overriden using a make command argument. -# Variables cflags, ldflags and ldlibs may be defined in including makefile. - -optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer -warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing - -# suppress -Wunused-variable & Co if you don't want to clutter a build log -ifdef suppress-wunused - warn.flags += $(addprefix -Wno-unused-, function parameter value variable) -endif - -CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) - -# preprocessor flags -cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) - -# flags for dependency checking (cflags from makefile may define -I options) -depcheck.flags := $(cpp.flags) $(cflags) - -# architecture specifications for linker are overridable by LDFLAGS -LDFLAGS := $(arch.ld.flags) - -# now add the same ld flags to shared dynamic lib -shared.ldflags := $(shared.ldflags) $(LDFLAGS) - -# accumulated flags for C compiler / linker -c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) -c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) -c.ldlibs := $(c.ldlibs) $(ldlibs) - -# accumulated flags for C++ compiler / linker -cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) -cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) -cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) - - -################################################################################ -### variables: tools ########################################################### -################################################################################ - - -# aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument -compile-c := $(CC) -compile-cxx := $(CXX) - - -################################################################################ -### checks ##################################################################### -################################################################################ - - -# At this point most variables are defined. Now do some checks and info's -# before rules begin. - -# '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 - -# store path to Pd API m_pd.h if it is found -ifdef PDINCLUDEDIR - mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") -endif - -# print Makefile.pdlibbuilder version -$(info ++++ info: using Makefile.pdlibbuilder version $(version)) - -# when making target all, check if m_pd.h is found and print info about it -ifeq ($(goals), all) - $(if $(mpdh), \ - $(info ++++ info: using Pd API $(mpdh)), \ - $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) -endif - -# print target info -$(info ++++ info: making target $(goals) $(if $(lib.name),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 - - -################################################################################ -### 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 post build-lib \ - $(classes) $(makefiledirs) $(makefiles) \ - install install-executables install-datafiles install-datadirs \ - force clean vars allvars depend help - - -################################################################################ -### rules: build targets ####################################################### -################################################################################ - - -# Target all forces the build of targets [$(executables) post] in -# deterministic order. Target $(executables) builds class executables plus -# optional shared lib or alternatively a single lib executable when -# make-lib-executable=true. Target post is optionally defined by -# library makefile. - -all: post -post: $(executables) - -all: - $(info ++++info: target all in lib $(lib.name) completed) - -# build all with -g option turned on for debug symbols -alldebug: c.flags += -g -alldebug: cxx.flags += -g -alldebug: all - - -#=== class executable ========================================================== - - -# recipe for linking objects in class executable -# argument $1 = compiler type (c or cxx) -# argument $2 = class basename -define link-class - $(compile-$1) \ - $($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) \ - $($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) \ - $(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 file from source -# argument $1 is compiler type (c or cxx) -define make-object-file - $(info ++++ info: making $@ in lib $(lib.name)) - $(compile-$1) \ - $($1.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. - -# When the Pd include path contains spaces it will mess up the implicit -# prerequisites rules. -disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) - -ifndef disable-dependency-tracking - must-build-everything := $(filter all, $(goals)) - must-build-class := $(filter $(classes), $(goals)) - must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) -endif - -# declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' -# argument $1 is input source file(s) -# dir is explicitly added because option -MM strips it by default -define declare-object-target -$(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.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) \ - $< > $(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. - - -# -p = preserve time stamps -# -m = set permission mode (as in chmod) -# -d = create all components of specified directories -INSTALL = install -INSTALL_PROGRAM := $(INSTALL) -p -m 644 -INSTALL_DATA := $(INSTALL) -p -m 644 -INSTALL_DIR := $(INSTALL) -m 755 -d - -# 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)" - $(foreach v, $(executables), \ - $(INSTALL_PROGRAM) '$v' "$(installpath)";) - $(info ++++ info: executables of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datafiles: all - $(INSTALL_DIR) -v "$(installpath)" - $(foreach v, $(datafiles), \ - $(INSTALL_DATA) '$(v)' "$(installpath)";) - $(info ++++ info: data files of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datadirs: all - $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) - $(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. Useful when you want to quickly find -# out which sub-makes from a large set will succeed. -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 - - -# 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 ============================================================ - - -# brief info about targets and paths - -ifdef mpdh - mpdhinfo := $(mpdh) -else - mpdhinfo := m_pd.h was not found. Is Pd installed? -endif - -help: - @echo - @echo " Main targets:" - @echo " all: build executables (default target)" - @echo " install: install all components of the library" - @echo " vars: print makefile variables for troubleshooting" - @echo " allvars: print all variables for troubleshooting" - @echo " help: print this help text" - @echo - @echo " Pd API m_pd.h:" - @echo " $(mpdhinfo)" - @echo " You may specify your preferred Pd include directory as argument" - @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." - @echo - @echo " Path for installation of your libdir(s):" - @echo " $(PDLIBDIR)" - @echo " Alternatively you may specify your path for installation as argument" - @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." - @echo - @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." - @echo - - -#=== dummy target ============================================================== - - -coffee: - @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." - - -################################################################################ -### end of rules sections ###################################################### -################################################################################ - - -# for syntax highlighting in vim and github -# vim: set filetype=make: - diff --git a/30/!sort/pd-lib-builder/README.md b/30/!sort/pd-lib-builder/README.md deleted file mode 100644 index 75e070e60..000000000 --- a/30/!sort/pd-lib-builder/README.md +++ /dev/null @@ -1,113 +0,0 @@ - - -### Makefile.pdlibbuilder ### - -Helper makefile for Pure Data external libraries. -Written by Katja Vetter March-June 2015 for the public domain. No warranties. -Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's -ShakeNMake. - -GNU make version >= 3.81 required. - - -### characteristics ### - - -* defines build settings based on autodetected OS and architecture -* defines rules to build Pd class- or lib executables from C or C++ sources -* defines rules for libdir installation -* defines convenience targets for developer and user -* evaluates implicit dependencies for non-clean builds - - -### basic usage ### - - -In your Makefile, define your Pd lib name and class files, and include -Makefile.pdlibbuilder at the end of the Makefile. Like so: - - - # Makefile for mylib - - lib.name = mylib - - class.sources = myclass1.c myclass2.c - - datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt - - include Makefile.pdlibbuilder - - -For files in class.sources it is assumed that class name == source file -basename. The default target builds all classes as individual executables -with Pd's default extension for the platform. For anything more than the -most basic usage, read the documentation sections in Makefile.pdlibbuilder. - - -### paths ### - - -Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be -defined not only as make command argument but also in the environment, to -override platform-dependent defaults: - -PDDIR: -Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. - -PDINCLUDEDIR: -Directory where Pd API m_pd.h should be found, and other Pd header files. -Overrides the default search path. - -PDBINDIR: -Directory where pd.dll should be found for linking (Windows only). Overrides -the default search path. - -PDLIBDIR: -Root directory for installation of Pd library directories. Overrides the -default install location. - - -### documentation ### - - -This README.md provides only basic information. A large comment section inside -Makefile.pdlibbuilder lists and explains the available user variables, default -paths, and targets. The internal documentation reflects the exact functionality -of the particular version. A tips&tricks page is in the works. - - -### versioning ### - - -The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), -and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers -are invited to regulary check for updates, and to contribute and discuss -improvements here. If you really need to distribute a personalized version with -your library, rename Makefile.pdlibbuilder to avoid confusion. - - -### examples ### - - -Here are a few projects using the Makefile.pdlibbuilder approach: - -https://github.com/pure-data/helloworld - -https://github.com/electrickery/pd-cyclone (stable) - -https://github.com/porres/pd-cyclone (experimental) - -https://git.iem.at/pd/iemguts - -https://git.iem.at/pd/iemnet - -https://git.iem.at/pd/iem_ambi - -https://git.iem.at/pd/mediasettings - -https://git.iem.at/pd-gui/punish - -https://github.com/residuum/PuRestJson - -More examples will be referenced here when they are available. diff --git a/30/!sort/sort.c b/30/!sort/sort.c deleted file mode 100644 index 5a65ef91d..000000000 --- a/30/!sort/sort.c +++ /dev/null @@ -1,185 +0,0 @@ -// Based on matt barber's sort method for cyclone's zl - -#include -#include -#include "m_pd.h" - -#define INISIZE 128 -#define MAXSIZE 2147483647 - -typedef struct _sortdata{ - int d_size; // as allocated - int d_natoms; // as used - int d_dir; // direction - t_atom *d_buf; - t_atom d_bufini[INISIZE]; -}t_sortdata; - -typedef struct _sort{ - t_object x_obj; - t_sortdata x_inbuf1; - t_sortdata x_outbuf1; - t_sortdata x_outbuf2; - float x_dir; - t_outlet *x_out2; -}t_sort; - -static t_class *sort_class; - -static void swap(t_atom *av, int i, int j){ - t_atom temp = av[j]; - av[j] = av[i]; - av[i] = temp; -} - -static int compare(t_atom *a1, t_atom *a2){ - if(a1->a_type == A_FLOAT && a2->a_type == A_SYMBOL) - return(-1); - else if(a1->a_type == A_SYMBOL && a2->a_type == A_FLOAT) - return(1); - else if(a1->a_type == A_FLOAT && a2->a_type == A_FLOAT){ - if(a1->a_w.w_float < a2->a_w.w_float) - return(-1); - else if(a1->a_w.w_float > a2->a_w.w_float) - return(1); - else - return(0); - } - else - return(strcmp(a1->a_w.w_symbol->s_name, a2->a_w.w_symbol->s_name)); -} - -static void sort_qsort(t_sort *x, t_atom *av1, t_atom *av2, int left, int right, float dir){ - if(left >= right) - return; - swap(av1, left, (left + right)/2); - if(av2) - swap(av2, left, (left + right)/2); - int last = left; - for(int i = left+1; i <= right; i++){ - if((dir * compare(av1+i, av1 + left)) < 0){ - swap(av1, ++last, i); - if(av2) - swap(av2, last, i); - } - } - swap(av1, left, last); - if(av2) - swap(av2, left, last); - sort_qsort(x, av1, av2, left, last-1, dir); - sort_qsort(x, av1, av2, last+1, right, dir); -} - -static void sort_rev(int n, t_atom *av){ - for(int i = 0, j = n-1; i < n/2; i++, j--) - swap(av, i, j); -} - -static void sort_sort(t_sort *x, int natoms, t_atom *buf, int bang){ - x->x_dir = x->x_dir >= 0 ? 1 : -1; - if(buf){ - t_atom *buf2 = x->x_outbuf2.d_buf; - x->x_outbuf2.d_natoms = natoms; - if(bang){ - if(x->x_inbuf1.d_dir != x->x_dir){ - x->x_inbuf1.d_dir = x->x_dir; - sort_rev(natoms, buf2); - sort_rev(natoms, buf); - } - outlet_list(x->x_out2, &s_list, natoms, buf2); - outlet_list(((t_object *)x)->ob_outlet, &s_list, natoms, buf); - } - else{ - memcpy(buf, x->x_inbuf1.d_buf, natoms*sizeof(*buf)); - for(int i = 0; i < natoms; i++) - SETFLOAT(&buf2[i], i); // indexes - sort_qsort(x, buf, buf2, 0, natoms-1, x->x_inbuf1.d_dir = x->x_dir); - outlet_list(x->x_out2, &s_list, natoms, buf2); - outlet_list(((t_object *)x)->ob_outlet, &s_list, natoms, buf); - } - } -} - -static void doit(t_sort *x, int bang){ - if(x->x_inbuf1.d_natoms){ - t_sortdata *d = &x->x_outbuf1; - sort_sort(x, x->x_inbuf1.d_natoms, d->d_buf, bang); - } - else - pd_error(x, "[sort]: empty buffer, no output"); -} - -static void sort_bang(t_sort *x){ - doit(x, 1); -} - -static void sort_realloc(t_sortdata *d, int size){ - if(size > MAXSIZE) - size = MAXSIZE; - if(d->d_buf == d->d_bufini) // !heaped - d->d_buf = getbytes(size*sizeof(t_atom)); - else // heaped - d->d_buf = (t_atom *)resizebytes(d->d_buf, d->d_size*sizeof(t_atom), size*sizeof(t_atom)); - d->d_size = size; -} - -static void set_size(t_sort *x, t_sortdata *d, int ac){ - if(ac > d->d_size){ - sort_realloc(&x->x_inbuf1, ac); - sort_realloc(&x->x_outbuf1, ac); - sort_realloc(&x->x_outbuf2, ac); - } - d->d_natoms = ac > d->d_size ? d->d_size : ac; -} - -static void sort_list(t_sort *x, t_symbol *s, int ac, t_atom *av){ - s = NULL; - set_size(x, &x->x_inbuf1, ac); - memcpy(x->x_inbuf1.d_buf, av, x->x_inbuf1.d_natoms*sizeof(*x->x_inbuf1.d_buf)); - doit(x, 0); -} - -static void sort_anything(t_sort *x, t_symbol *s, int ac, t_atom *av){ - set_size(x, &x->x_inbuf1, ac+1); - SETSYMBOL(x->x_inbuf1.d_buf, s); - if(ac) - memcpy(x->x_inbuf1.d_buf+1, av, (x->x_inbuf1.d_natoms-1)*sizeof(*x->x_inbuf1.d_buf)); - doit(x, 0); -} - -static void sortdata_free(t_sortdata *d){ - if(d->d_buf != d->d_bufini) - freebytes(d->d_buf, d->d_size*sizeof(*d->d_buf)); -} - -static void sort_free(t_sort *x){ - sortdata_free(&x->x_inbuf1); - sortdata_free(&x->x_outbuf1); - sortdata_free(&x->x_outbuf2); -} - -static void sortdata_init(t_sortdata *d){ - d->d_natoms = 0; - d->d_size = INISIZE; - d->d_buf = d->d_bufini; -} - -static void *sort_new(t_floatarg f){ - t_sort *x = (t_sort *)pd_new(sort_class); - sortdata_init(&x->x_inbuf1); - sortdata_init(&x->x_outbuf1); - sortdata_init(&x->x_outbuf2); - x->x_dir = f; - floatinlet_new(&x->x_obj, &x->x_dir); - outlet_new((t_object *)x, &s_list); - x->x_out2 = outlet_new((t_object *)x, &s_list); - return(x); -} - -void sort_setup(void){ - sort_class = class_new(gensym("sort"), (t_newmethod)sort_new, - (t_method)sort_free, sizeof(t_sort), 0, A_DEFFLOAT, 0); - class_addbang(sort_class, sort_bang); - class_addlist(sort_class, sort_list); - class_addanything(sort_class, sort_anything); -} diff --git a/30/!sort/sort.o b/30/!sort/sort.o deleted file mode 100644 index ce04d9e7ac9f13a22146e7b4ce615d97b56546df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17872 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

9GpA0r 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 DWZ8>9 diff --git a/30/!sort/test.pd b/30/!sort/test.pd deleted file mode 100644 index 4e01d36c8..000000000 --- a/30/!sort/test.pd +++ /dev/null @@ -1,25 +0,0 @@ -#N canvas 500 73 749 378 10; -#X obj 364 249 display; -#X msg 403 155 -1; -#X msg 436 155 1; -#X obj 339 120 bng 17 250 50 0 empty empty empty 17 7 0 10 -228856 --1 -1; -#X floatatom 234 91 5 0 0 0 - - -; -#X symbolatom 166 91 10 0 0 0 - - -; -#X obj 403 214 display; -#X msg 272 91 x y; -#X msg 364 120 1 2 3 4 5 6 7 8 9; -#X msg 304 91 a b c d 1 e 3 f 5 g 6 h 4 i j k; -#X msg 130 91 cu; -#X obj 364 185 sort -1; -#X connect 1 0 11 1; -#X connect 2 0 11 1; -#X connect 3 0 11 0; -#X connect 4 0 11 0; -#X connect 5 0 11 0; -#X connect 7 0 11 0; -#X connect 8 0 11 0; -#X connect 9 0 11 0; -#X connect 10 0 11 0; -#X connect 11 0 0 0; -#X connect 11 1 6 0; diff --git a/30/Makefile b/30/Makefile deleted file mode 100755 index 81363dade..000000000 --- a/30/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -dir.class.sources := dir.c - -# include Makefile.pdlibbuilder from submodule directory 'pd-lib-builder' -PDLIBBUILDER_DIR=pd-lib-builder/ -include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder diff --git a/30/bagal.wav b/30/bagal.wav deleted file mode 100644 index 8c04987338fc249f5e11a197978a3868ffd074dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201710 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ℑ`UCp;JL0rWpzXrl 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 -#include -#include - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#define MAXN 32768 // max n of files - -static t_class *dir_class; - -typedef struct _sortdata{ - int maxn; // as allocated - int n; // as used - t_atom *buf; - t_atom bufini[MAXN]; -}t_sortdata; - -typedef struct dir{ - t_object x_obj; - DIR *x_dir; - char x_directory[MAXPDSTRING]; - t_symbol *x_getdir; // default directory - t_symbol *x_ext; - t_atom x_files[MAXN]; - t_int x_n; - t_int x_seek; - t_sortdata x_inbuf; - t_outlet *x_out1; - t_outlet *x_out2; - t_outlet *x_out3; - t_outlet *x_out4; -}t_dir; - -static void sort_swap(t_atom *av, int i, int j){ - t_atom temp = av[j]; - av[j] = av[i]; - av[i] = temp; -} - -static int sort_compare(t_atom *a1, t_atom *a2){ - if(a1->a_type == A_FLOAT && a2->a_type == A_SYMBOL) - return(-1); - else if(a1->a_type == A_SYMBOL && a2->a_type == A_FLOAT) - return(1); - else if(a1->a_type == A_FLOAT && a2->a_type == A_FLOAT){ - if(a1->a_w.w_float < a2->a_w.w_float) - return(-1); - else if(a1->a_w.w_float > a2->a_w.w_float) - return(1); - else - return(0); - } - else - return(strcmp(a1->a_w.w_symbol->s_name, a2->a_w.w_symbol->s_name)); -} - -static void sort_qsort(t_dir *x, t_atom *av1, int left, int right){ - if(left >= right) - return; - sort_swap(av1, left, (left+right)/2); - int last = left; - for(int i = left+1; i <= right; i++){ - if((sort_compare(av1+i, av1+left)) < 0) - sort_swap(av1, ++last, i); - } - sort_swap(av1, left, last); - sort_qsort(x, av1, left, last-1); - sort_qsort(x, av1, last+1, right); -} - -static void dir_sort(t_dir *x, t_sortdata *d, int ac, t_atom *av){ - if(ac){ - if(ac > d->maxn) - ac = d->maxn; - d->n = ac; - memcpy(d->buf, av, ac*sizeof(*d->buf)); - sort_qsort(x, d->buf, 0, ac-1); - } -} - -static void dir_load(t_dir *x){ - x->x_dir = opendir(x->x_directory); - x->x_n = 0; - struct dirent *result = NULL; - while((result = readdir(x->x_dir))){ - if(strncmp(result->d_name, ".", 1)){ - if(x->x_ext == &s_){ - SETSYMBOL(x->x_files + x->x_n, gensym(result->d_name)); - x->x_n++; - } - else{ - int extlen = strlen(x->x_ext->s_name); - int len = strlen(result->d_name); - const char *extension = &result->d_name[len-extlen]; - if(!strcmp(extension, x->x_ext->s_name)){ - SETSYMBOL(x->x_files+x->x_n, gensym(result->d_name)); - x->x_n++; - } - } - } - } - closedir(x->x_dir); - dir_sort(x, &x->x_inbuf, x->x_inbuf.n = x->x_n, x->x_files); -} - -static void dir_loadir(t_dir *x, t_symbol *dirname, int init){ - post("loadir dirname (%s) init (%d)", dirname->s_name, init); - char tempdir[MAXPDSTRING]; - strcpy(tempdir, x->x_directory); // tempdir = x->x_directory - if(!strcmp(dirname->s_name, "")){ - pd_error(x, "[dir]: no symbol given to 'open'"); - return; - } - else if(dirname == x->x_getdir || !strcmp(dirname->s_name, ".")){ // do nothing - post("do nothing"); - } - else if(!strcmp(dirname->s_name, "..")){ // parent dir - post("parent"); - char *last_slash; - last_slash = strrchr(x->x_directory, '/'); - *last_slash = '\0'; - if(!strcmp(x->x_directory, "")) - strcpy(x->x_directory, "/"); - } - else if(!strncmp(dirname->s_name, "/", 1) || !strncmp(dirname->s_name, ":", 2)){ // absolute - post("absolute path"); - strncpy(x->x_directory, dirname->s_name, MAXPDSTRING); - post("x->x_directory = %s", x->x_directory); - } - else{ // relative to current dir - post("relative"); - sprintf(x->x_directory, "%s/%s", x->x_directory, dirname->s_name); - post("x->x_directory = %s", x->x_directory); - } -// search - DIR *temp = opendir(x->x_directory); - if(!temp){ // didn't find - post("didn't find"); - temp = NULL; // ??? - strcpy(x->x_directory, tempdir); // restore original directory - if(init){ - pd_error(x, "[dir]: cannot open '%s', opening '%s' instead", - dirname->s_name, x->x_directory); - dir_load(x); - } - else - outlet_float(x->x_out4, 0); - return; - } - else{ - post("found"); - closedir(temp); - dir_load(x); - if(!init) - outlet_float(x->x_out4, 1); - } -} - -static void dir_open(t_dir *x, t_symbol *dirname){ - post("open %s", dirname->s_name); - dir_loadir(x, dirname, 0); -} - -static void dir_ext(t_dir *x, t_symbol *ext){ - if(x->x_ext != ext){ - x->x_ext = ext; - dir_load(x); // reload - } -} - -static void dir_seek(t_dir *x, t_float f){ - int i = (int)f; - if(i < 1) - i = 1; - if(x->x_n){ - x->x_seek = i = ((i-1) % x->x_n) + 1; - outlet_list(((t_object *)x)->ob_outlet, &s_list, 1, x->x_inbuf.buf+i-1); - } - else - post("[dir]: no files found to seek for"); -} - -static void dir_next(t_dir *x){ - dir_seek(x, x->x_seek+1); -} - -static void dir_n(t_dir *x){ - outlet_float(x->x_out3, x->x_n); -} - -static void dir_reset(t_dir *x){ // reset to default - strncpy(x->x_directory, x->x_getdir->s_name, MAXPDSTRING); - dir_loadir(x, x->x_getdir, 1); -} - -static void dir_dump(t_dir *x){ - if(x->x_inbuf.n){ - for(int i = 0; i < x->x_inbuf.n; i++) - outlet_list(((t_object *)x)->ob_outlet, &s_list, 1, x->x_inbuf.buf+i); - } - else - post("[dir]: no files found"); -} - -static void dir_dir(t_dir *x){ - outlet_symbol(x->x_out2, gensym(x->x_directory)); -} - -static void dir_bang(t_dir *x){ - dir_n(x); - dir_dir(x); - dir_dump(x); -} - -static void sortdata_free(t_sortdata *d){ - if(d->buf != d->bufini) - freebytes(d->buf, d->maxn*sizeof(*d->buf)); -} - -static void dir_free(t_dir *x){ - sortdata_free(&x->x_inbuf); - outlet_free(x->x_out1); - outlet_free(x->x_out2); - outlet_free(x->x_out3); - outlet_free(x->x_out4); -} - -static void sortdata_init(t_sortdata *d){ - d->n = 0; - d->maxn = MAXN; - d->buf = d->bufini; -} - -static void *dir_new(t_symbol *s, int ac, t_atom* av){ - t_dir *x = (t_dir *)pd_new(dir_class); - s = NULL; // get rid of warning - sortdata_init(&x->x_inbuf); - x->x_seek = 0; - t_symbol *dirname = x->x_ext = &s_; - int symarg = 0, flag = 0, depth = 0; - while(ac > 0){ - if(av->a_type == A_FLOAT && !symarg && !flag){ - depth = (int)atom_getfloatarg(0, ac, av); - ac--, av++; - } - else if(av->a_type == A_SYMBOL){ - if(!symarg) symarg = 1; - t_symbol *cursym = atom_getsymbolarg(0, ac, av); - if(!strcmp(cursym->s_name, "-ext") && !flag){ - flag = 1; - if(ac == 2 && (av+1)->a_type == A_SYMBOL){ - x->x_ext = atom_getsymbolarg(1, ac, av); - ac-=2, av+=2; - } - else goto errstate; - } - else if(!flag){ - if(!symarg) symarg = 1; - dirname = cursym; - ac--, av++; - } - else goto errstate; - } - else goto errstate; - } - t_canvas *canvas = canvas_getrootfor(canvas_getcurrent()); - if(depth < 0) - depth = 0; - while(depth-- && canvas->gl_owner) - canvas = canvas_getrootfor(canvas->gl_owner); - x->x_getdir = canvas_getdir(canvas); // default - strncpy(x->x_directory, x->x_getdir->s_name, MAXPDSTRING); // default - dirname == &s_ ? dir_loadir(x, x->x_getdir, 1) : dir_loadir(x, dirname, 1); - x->x_out1 = outlet_new(&x->x_obj, &s_anything); - x->x_out2 = outlet_new(&x->x_obj, &s_symbol); - x->x_out3 = outlet_new(&x->x_obj, &s_float); - x->x_out4 = outlet_new(&x->x_obj, &s_float); - post("dir debug"); - return(x); -errstate: - pd_error(x, "[dir]: improper args"); - return NULL; -} - -void dir_setup(void){ - dir_class = class_new(gensym("dir"), (t_newmethod)dir_new, (t_method)dir_free, - sizeof(t_dir), 0, A_GIMME, 0); - class_addbang(dir_class, dir_bang); - class_addmethod(dir_class, (t_method)dir_n, gensym("n"), 0); - class_addmethod(dir_class, (t_method)dir_dir, gensym("dir"), 0); - class_addmethod(dir_class, (t_method)dir_dump, gensym("dump"), 0); - class_addmethod(dir_class, (t_method)dir_reset, gensym("reset"), 0); - class_addmethod(dir_class, (t_method)dir_next, gensym("next"), 0);; - class_addmethod(dir_class, (t_method)dir_load, gensym("reopen"), 0); - class_addmethod(dir_class, (t_method)dir_open, gensym("open"), A_DEFSYMBOL, 0); - class_addmethod(dir_class, (t_method)dir_ext, gensym("ext"), A_DEFSYMBOL, 0); - class_addmethod(dir_class, (t_method)dir_seek, gensym("seek"), A_DEFFLOAT, 0); -} diff --git a/30/dir.o b/30/dir.o deleted file mode 100644 index 60c68a7728759aeb7979b6e1cab1dd8b8c8feb1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20140 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 3.81 required. -# -# -#=== characteristics =========================================================== -# -# -# - defines build settings based on autodetected OS and architecture -# - defines rules to build Pd class- or lib executables from C or C++ sources -# - defines rules for libdir installation -# - defines convenience targets for developer and user -# - evaluates implicit dependencies for non-clean builds -# -# -#=== basic usage =============================================================== -# -# -# In your Makefile, define your Pd lib name and class files, and include -# Makefile.pdlibbuilder at the end of the Makefile. Like so: -# -# ________________________________________________________________________ -# -# # Makefile for mylib -# -# lib.name = mylib -# -# class.sources = myclass1.c myclass2.c -# -# datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt -# -# include Makefile.pdlibbuilder -# ________________________________________________________________________ -# -# -# For files in class.sources it is assumed that class basename == source file -# basename. The default target builds all classes as individual executables -# with Pd's default extension for the platform. For anything more than the -# most basic usage, continue reading. -# -# -#=== list of Makefile.pdlibbuilder API variables =============================== -# -# -# Variables available for definition in your library Makefile: -# -# - lib.name -# - lib.setup.sources -# - class.sources -# - common.sources -# - shared.sources -# - .class.sources -# - .class.ldflags -# - .class.ldlibs -# - cflags -# - ldflags -# - ldlibs -# - datafiles -# - datadirs -# - makefiles -# - makefiledirs -# - externalsdir -# -# Optional multiline defines evaluated per operating system: -# -# - forLinux -# - forDarwin -# - forWindows -# -# Variables available for your makefile or make command line: -# -# - make-lib-executable -# - suppress-wunused -# -# Path variables for make command line or environment: -# -# - PDDIR -# - PDINCLUDEDIR -# - PDBINDIR -# - PDLIBDIR -# -# Standard make variables for make command line or environment: -# -# - CPPFLAGS -# - CFLAGS -# - LDFLAGS -# - CC -# - CXX -# - INSTALL -# - DESTDIR -# -# Deprecated path variables: -# -# - PD_PATH -# - pdincludepath -# - pdbinpath -# - objectsdir -# -# -#=== descriptions of Makefile.pdlibbuilder API variables ======================= -# -# -# lib.name: -# Name of the library directory as it will be installed / distributed. Also the -# name of the lib executable in the case where all classes are linked into -# a single binary. -# -# lib.setup.sources: -# Source file(s) (C or C++) which must be compiled only when linking all classes -# into a single lib binary. -# -# class.sources: -# All sources files (C or C++) for which the condition holds that -# class name == source file basename. -# -# .class.sources: -# Source file(s) (C or C++) specific to class . Use this for -# multiple-source classes or when class name != source file basename. -# -# common.sources: -# Source file(s) which must be statically linked to each class in the library. -# -# shared.sources: -# Source file(s) (C or C++) to build a shared dynamic link lib, to be linked -# with all class executables. -# -# cflags, ldflags, ldlibs: -# Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic -# link libs) for the whole library. These flags are added to platform-specific -# flags defined by Makefile.pdlibbuilder. -# -# .class.ldflags and .class.ldlibs: -# Define ldflags resp. ldlibs specific to class . These flags are -# added to platform-specific flags defined by Makefile.pdlibbuilder, and flags -# defined in your Makefile for the whole library. Note: cflags can not be -# defined per class in the current implementation. -# -# datafiles and datadirs: -# All extra files you want to include in binary distributions of the -# library: abstractions and help patches, example patches, meta patch, readme -# and license texts, manuals, sound files, etcetera. Use 'datafiles' for all -# files that should go into your lib rootdir and 'datadirs' for complete -# directories you want to copy from source to distribution. -# -# forLinux, forDarwin, forWindows: -# Shorthand for 'variable definitions for Linux only' etc. Use like: -# define forLinux -# cflags += -DLINUX -# class.sources += linuxthing.c -# endef -# -# makefiles and makefiledirs: -# Extra makefiles or directories with makefiles that should be made in sub-make -# processes. -# -# make-lib-executable: -# When this variable is defined 'yes' in your makefile or as command argument, -# Makefile.pdlibbuilder will try to build all classes into a single library -# executable (but it will force exit if lib.setup.sources is undefined). -# If your makefile defines 'make-lib-executable=yes' as the library default, -# this can still be overriden with 'make-lib-executable=no' as command argument -# to build individual class executables (the Makefile.pdlibbuilder default.) -# -# suppress-wunused: -# When this variable is defined ('yes' or any other value), -Wunused-variable, -# -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, -# but the other warnings from -Wall are retained. -# -# PDDIR: -# Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -# PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. -# -# PDINCLUDEDIR: -# Directory where Pd API m_pd.h should be found, and other Pd header files. -# Overrides the default search path. -# -# PDBINDIR: -# Directory where pd.dll should be found for linking (Windows only). Overrides -# the default search path. -# -# PDLIBDIR: -# Root directory for installation of Pd library directories. Overrides the -# default install location. -# -# DESTDIR: -# Prepended path component for staged install. -# -# CPPFLAGS: -# Preprocessor flags which are not strictly required for building. -# -# CFLAGS: -# Compiler flags which are not strictly required for building. Compiler flags -# defined by Makefile.pdlibbuilder for warning, optimization and architecture -# specification are overriden by CFLAGS. -# -# LDFLAGS: -# Linker flags which are not strictly required for building. Linker flags -# defined by Makefile.pdlibbuilder for architecture specification are overriden -# by LDFLAGS. -# -# CC and CXX: -# C and C++ compiler programs as defined in your build environment. -# -# INSTALL -# Definition of install program. -# -# PD_PATH: -# Equivalent to PDDIR. Supported for compatibility with pd-extended central -# makefile, but deprecated otherwise. -# -# objectsdir: -# Root directory for installation of Pd library directories, like PDLIBDIR but -# not overridable by environment. Supported for compatibility with pd-extended -# central makefile, but deprecated otherwise. -# -# pdincludepath, pdbinpath: -# As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated -# as user variables. -# -# -#=== paths ===================================================================== -# -# -# Source files in directories other than current working directory must be -# prefixed with their relative path. Do not rely on VPATH or vpath. -# Object (.o) files are built in the directory of their source files. -# Executables are built in current working directory. -# -# Default search path for m_pd.h and other API header files is platform -# dependent, and overridable by PDINCLUDEDIR: -# -# Linux: /usr/include/pd -# -# OSX: /Applications/Pd*.app/Contents/Resources/src -# -# Windows: %PROGRAMFILES%/pd/src -# -# Default location to install pd libraries is platform dependent, and -# overridable by PDLIBDIR: -# -# Linux: /usr/local/lib/pd-externals -# OSX: ~/Library/Pd -# Windows: %APPDATA%/Pd -# -# https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files -# The rationale for not installing to ~/pd-externals by default on Linux -# is that some people share the home dir between 32 and 64 bit installations. -# -# -#=== targets =================================================================== -# -# -# all: build $(executables) plus optional post target -# post: target to build after $(executables) -# alldebug: build all with -g option turned on for debug symbols -# : force clean build of an individual class -# .pre: make preprocessor output file in current working directory -# .lst: make asm/source output file in current working directory -# -# install: install executables and data files -# clean: remove build products from source tree -# -# help: print help text -# vars: print makefile variables -# allvars: print all variables -# depend: print generated prerequisites -# coffee: dummy target -# -# Variable $(executables) expands to class executables plus optional shared lib, -# or alternatively to single lib executable when make-lib-executable=true. -# Targets pre and post can be defined by library makefile. Make sure to include -# Makefile.pdlibbuilder first so default target all will not be redefined. -# -# -#=== 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. It does not automatically include such files in libdir installations. -# Data files you want to include in distributions must be defined explicitly in -# your Makefile. -# -# -#=== Makefile.pdlibbuilder 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. -# -# 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. -# Words in variables expressing a function or command are separated by dashes, -# like in 'make-lib-executable'. -# -# -#=== useful make options ======================================================= -# -# -# Use 'make -d ' to print debug details of the make process. -# Use 'make -p ' to print make's database. -# -# -#=== TODO ====================================================================== -# -# -# - decide whether to use -static-libgcc or shared dll in MinGW -# - cygwin support -# - android support -# - Windows 64 bit support -# - figure out how to handle '$' in filenames -# - add makefile template targets dpkg-source dist libdir distclean tags? -# -# -#=== end of documentation sections ============================================= -# -# -################################################################################ -################################################################################ -################################################################################ - - -# 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 externals root dir in multi-lib source tree like -# pd-extended SVN. Default is parent of current working directory. May be -# defined differently in including makefile. -externalsdir ?= .. - -# variable you can use to check if Makefile.pdlibbuilder is already included -Makefile.pdlibbuilder = true - - -################################################################################ -### variables: library name and version ######################################## -################################################################################ - - -# strip possibles spaces from lib.name, they mess up calculated file names -lib.name := $(strip $(lib.name)) - -# if meta file exists, check library version -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' \ - $(metafile)) -endif - - -################################################################################ -### variables: files ########################################################### -################################################################################ - - -#=== sources =================================================================== - - -# (re)define .class.sources using file names in 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) - - -#=== object files ============================================================== - - -# 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) - - -#=== executables =============================================================== - - -# use recursive variables here because executable extension is not yet known - -# construct class executable names from class names -classes.executables = $(addsuffix .$(extension), $(classes)) - -# construct shared lib executable name if shared sources are defined -ifdef shared.sources - shared.lib = lib$(lib.name).$(shared.extension) -else - shared.lib = -endif - - -################################################################################ -### platform detection ######################################################### -################################################################################ - - -#=== operating system ========================================================== - - -# The following systems are defined: Linux, Darwin, Windows. GNU and -# GNU/kFreeBSD are treated as Linux to get the same options. - -uname := $(shell uname) - -ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) - system = Linux -endif - -ifeq ($(uname), Darwin) - system = Darwin -endif - -ifeq ($(filter MINGW% MSYS, $(uname)), $(uname)) - system = Windows -endif - -# Unfortunately not all Mingw versions provide a link cc > gcc, therefore -# gcc is hardcoded here (but not if CC is redefined). -ifeq ($(system), Windows) - ifeq ($(origin CC), default) - CC = gcc - endif -endif - -# evaluate possible system-specific multiline defines from library makefile -$(eval $(for$(system))) - - -# TODO: Cygwin, Android - - -#=== architecture ============================================================== - - -# native architecture of the build machine -build.arch := $(shell uname -m) - -# Target architecture as reported by compiler. Give precedence to eventual -# user-defined compiler. The first field of -- is extracted. -ifneq ($(origin CXX), default) - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CXX) -dumpmachine))) -else - dumpmachine.cpu = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine))) -endif - -# Target architecture as reported by compiler is only used for Windows at the -# moment. For other systems this still has to be tested. -ifeq ($(system), Windows) - target.arch = $(dumpmachine.cpu) -else - target.arch = $(build.arch) -endif - - -################################################################################ -### variables per platform ##################################################### -################################################################################ - - -#=== flags per architecture ==================================================== - - -# Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, -# arch.c.flags are overriden below. - -# Raspberry Pi 1st generation -ifeq ($(target.arch), armv6l) - arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard - -# Beagle, Udoo, RPi2 etc. -else ifeq ($(target.arch), armv7l) - arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard - -# Intel 32 bit, build with SSE and SSE2 instructions -else ifeq ($(findstring $(target.arch), i386 i686), $(target.arch)) - arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 - -# Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions -else ifeq ($(findstring $(target.arch), x86_64), $(target.arch)) - arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 - -# if none of the above architectures detected -else - arch.c.flags = -endif - - -#=== flags and paths for Linux ================================================= - - -ifeq ($(system), Linux) - prefix = /usr/local - libdir := $(prefix)/lib - pkglibdir = $(libdir)/pd-externals - pdincludepath := $(wildcard /usr/include/pd) - 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. -# LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for -# OSX x86_64. - - -ifeq ($(system), Darwin) - pkglibdir = $(HOME)/Library/Pd - pdincludepath := $(firstword $(wildcard \ - /Applications/Pd*.app/Contents/Resources/src)) - extension = pd_darwin - 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 - version.flag := $(filter $(cflags), -mmacosx-version-min=%) - ifeq ($(target.arch), i386) - cxx.flags := -fcheck-new - arch := ppc i386 x86_64 - version.flag ?= -mmacosx-version-min=10.4 - endif - ifeq ($(target.arch), x86_64) - arch := i386 x86_64 - version.flag ?= -mmacosx-version-min=10.5 - endif - arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) - arch.ld.flags := $(arch.c.flags) -endif - - -#=== flags and paths for Windows =============================================== - - -# Standard paths on Windows contain spaces, and GNU make functions treat such -# paths as lists, with unintended effects. Therefore we must use shell function -# ls instead of make's wildcard, and probe for each standard path individually. -# Using double quotes around paths with spaces is obligatory. Since some path -# variables are assembled or re-expanded later, great care must be taken to put -# quotes at appropriate points throughout the makefile. Thanks, Bill. - -# paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) -ifeq ($(system), Windows) - pkglibdir := $(APPDATA)/Pd - ifndef pdbinpath - pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") - endif - ifndef pdincludepath - pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") - endif -endif - -# TODO: decide whether -mms-bitfields should be specified. -ifeq ($(system), Windows) - cpp.flags := -DMSW -DNT - ifeq ($(filter i%86 mingw32, $(target.arch)), $(target.arch)) - arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse - else ifeq (x86_64, $(target.arch)) - cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 - arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse - else - arch.c.flags = - endif - extension = dll - c.flags := - c.ldflags = -static-libgcc -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - c.ldlibs := - cxx.flags := -fcheck-new - cxx.ldflags = -static-libstdc++ -shared \ - -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" - cxx.ldlibs := - shared.extension = dll - shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" - stripflags = --strip-unneeded -R .note -R .comment -endif - - -#=== paths ===================================================================== - - -# Platform-dependent default paths are specified above, but overridable. -# Path variables in upper case can be defined as make command argument or in the -# environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with -# the build system that pd-l2ork has inherited from pd-extended. - -PDDIR ?= $(PD_PATH) -PDINCLUDEDIR ?= $(pdincludepath) -PDBINDIR ?= $(pdbinpath) -PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) - -ifneq ($(PDDIR),) - PDINCLUDEDIR := $(wildcard $(PDDIR)/src) - PDBINDIR := $(wildcard $(PDDIR)/bin) -endif - -# base path where all components of the lib will be installed by default -installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) - -# check if include path contains spaces (as is often the case on Windows) -# if so, store the path so we can later do checks with it -pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) - - -#=== accumulated build flags =================================================== - - -# From GNU make docs: 'Users expect to be able to specify CFLAGS freely -# themselves.' So we use CFLAGS to define options which are not strictly -# required for compilation: optimizations, architecture specifications, and -# warnings. CFLAGS can be safely overriden using a make command argument. -# Variables cflags, ldflags and ldlibs may be defined in including makefile. - -optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer -warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing - -# suppress -Wunused-variable & Co if you don't want to clutter a build log -ifdef suppress-wunused - warn.flags += $(addprefix -Wno-unused-, function parameter value variable) -endif - -CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) - -# preprocessor flags -cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) - -# flags for dependency checking (cflags from makefile may define -I options) -depcheck.flags := $(cpp.flags) $(cflags) - -# architecture specifications for linker are overridable by LDFLAGS -LDFLAGS := $(arch.ld.flags) - -# now add the same ld flags to shared dynamic lib -shared.ldflags := $(shared.ldflags) $(LDFLAGS) - -# accumulated flags for C compiler / linker -c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) -c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) -c.ldlibs := $(c.ldlibs) $(ldlibs) - -# accumulated flags for C++ compiler / linker -cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) -cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) -cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) - - -################################################################################ -### variables: tools ########################################################### -################################################################################ - - -# aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument -compile-c := $(CC) -compile-cxx := $(CXX) - - -################################################################################ -### checks ##################################################################### -################################################################################ - - -# At this point most variables are defined. Now do some checks and info's -# before rules begin. - -# '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 - -# store path to Pd API m_pd.h if it is found -ifdef PDINCLUDEDIR - mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") -endif - -# print Makefile.pdlibbuilder version -$(info ++++ info: using Makefile.pdlibbuilder version $(version)) - -# when making target all, check if m_pd.h is found and print info about it -ifeq ($(goals), all) - $(if $(mpdh), \ - $(info ++++ info: using Pd API $(mpdh)), \ - $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) -endif - -# print target info -$(info ++++ info: making target $(goals) $(if $(lib.name),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 - - -################################################################################ -### 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 post build-lib \ - $(classes) $(makefiledirs) $(makefiles) \ - install install-executables install-datafiles install-datadirs \ - force clean vars allvars depend help - - -################################################################################ -### rules: build targets ####################################################### -################################################################################ - - -# Target all forces the build of targets [$(executables) post] in -# deterministic order. Target $(executables) builds class executables plus -# optional shared lib or alternatively a single lib executable when -# make-lib-executable=true. Target post is optionally defined by -# library makefile. - -all: post -post: $(executables) - -all: - $(info ++++info: target all in lib $(lib.name) completed) - -# build all with -g option turned on for debug symbols -alldebug: c.flags += -g -alldebug: cxx.flags += -g -alldebug: all - - -#=== class executable ========================================================== - - -# recipe for linking objects in class executable -# argument $1 = compiler type (c or cxx) -# argument $2 = class basename -define link-class - $(compile-$1) \ - $($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) \ - $($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) \ - $(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 file from source -# argument $1 is compiler type (c or cxx) -define make-object-file - $(info ++++ info: making $@ in lib $(lib.name)) - $(compile-$1) \ - $($1.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. - -# When the Pd include path contains spaces it will mess up the implicit -# prerequisites rules. -disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) - -ifndef disable-dependency-tracking - must-build-everything := $(filter all, $(goals)) - must-build-class := $(filter $(classes), $(goals)) - must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) -endif - -# declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' -# argument $1 is input source file(s) -# dir is explicitly added because option -MM strips it by default -define declare-object-target -$(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.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) \ - $< > $(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. - - -# -p = preserve time stamps -# -m = set permission mode (as in chmod) -# -d = create all components of specified directories -INSTALL = install -INSTALL_PROGRAM := $(INSTALL) -p -m 644 -INSTALL_DATA := $(INSTALL) -p -m 644 -INSTALL_DIR := $(INSTALL) -m 755 -d - -# 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)" - $(foreach v, $(executables), \ - $(INSTALL_PROGRAM) '$v' "$(installpath)";) - $(info ++++ info: executables of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datafiles: all - $(INSTALL_DIR) -v "$(installpath)" - $(foreach v, $(datafiles), \ - $(INSTALL_DATA) '$(v)' "$(installpath)";) - $(info ++++ info: data files of lib $(lib.name) installed \ - from $(CURDIR) to $(installpath)) - -install-datadirs: all - $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) - $(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. Useful when you want to quickly find -# out which sub-makes from a large set will succeed. -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 - - -# 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 ============================================================ - - -# brief info about targets and paths - -ifdef mpdh - mpdhinfo := $(mpdh) -else - mpdhinfo := m_pd.h was not found. Is Pd installed? -endif - -help: - @echo - @echo " Main targets:" - @echo " all: build executables (default target)" - @echo " install: install all components of the library" - @echo " vars: print makefile variables for troubleshooting" - @echo " allvars: print all variables for troubleshooting" - @echo " help: print this help text" - @echo - @echo " Pd API m_pd.h:" - @echo " $(mpdhinfo)" - @echo " You may specify your preferred Pd include directory as argument" - @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." - @echo - @echo " Path for installation of your libdir(s):" - @echo " $(PDLIBDIR)" - @echo " Alternatively you may specify your path for installation as argument" - @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." - @echo - @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." - @echo - - -#=== dummy target ============================================================== - - -coffee: - @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." - - -################################################################################ -### end of rules sections ###################################################### -################################################################################ - - -# for syntax highlighting in vim and github -# vim: set filetype=make: - diff --git a/30/pd-lib-builder/README.md b/30/pd-lib-builder/README.md deleted file mode 100644 index 75e070e60..000000000 --- a/30/pd-lib-builder/README.md +++ /dev/null @@ -1,113 +0,0 @@ - - -### Makefile.pdlibbuilder ### - -Helper makefile for Pure Data external libraries. -Written by Katja Vetter March-June 2015 for the public domain. No warranties. -Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's -ShakeNMake. - -GNU make version >= 3.81 required. - - -### characteristics ### - - -* defines build settings based on autodetected OS and architecture -* defines rules to build Pd class- or lib executables from C or C++ sources -* defines rules for libdir installation -* defines convenience targets for developer and user -* evaluates implicit dependencies for non-clean builds - - -### basic usage ### - - -In your Makefile, define your Pd lib name and class files, and include -Makefile.pdlibbuilder at the end of the Makefile. Like so: - - - # Makefile for mylib - - lib.name = mylib - - class.sources = myclass1.c myclass2.c - - datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt - - include Makefile.pdlibbuilder - - -For files in class.sources it is assumed that class name == source file -basename. The default target builds all classes as individual executables -with Pd's default extension for the platform. For anything more than the -most basic usage, read the documentation sections in Makefile.pdlibbuilder. - - -### paths ### - - -Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be -defined not only as make command argument but also in the environment, to -override platform-dependent defaults: - -PDDIR: -Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and -PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. - -PDINCLUDEDIR: -Directory where Pd API m_pd.h should be found, and other Pd header files. -Overrides the default search path. - -PDBINDIR: -Directory where pd.dll should be found for linking (Windows only). Overrides -the default search path. - -PDLIBDIR: -Root directory for installation of Pd library directories. Overrides the -default install location. - - -### documentation ### - - -This README.md provides only basic information. A large comment section inside -Makefile.pdlibbuilder lists and explains the available user variables, default -paths, and targets. The internal documentation reflects the exact functionality -of the particular version. A tips&tricks page is in the works. - - -### versioning ### - - -The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), -and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers -are invited to regulary check for updates, and to contribute and discuss -improvements here. If you really need to distribute a personalized version with -your library, rename Makefile.pdlibbuilder to avoid confusion. - - -### examples ### - - -Here are a few projects using the Makefile.pdlibbuilder approach: - -https://github.com/pure-data/helloworld - -https://github.com/electrickery/pd-cyclone (stable) - -https://github.com/porres/pd-cyclone (experimental) - -https://git.iem.at/pd/iemguts - -https://git.iem.at/pd/iemnet - -https://git.iem.at/pd/iem_ambi - -https://git.iem.at/pd/mediasettings - -https://git.iem.at/pd-gui/punish - -https://github.com/residuum/PuRestJson - -More examples will be referenced here when they are available. diff --git a/30/test/test2.pd b/30/test/test2.pd deleted file mode 100644 index e83299e1a..000000000 --- a/30/test/test2.pd +++ /dev/null @@ -1,11 +0,0 @@ -#N canvas 171 212 323 395 10; -#X obj 121 118 inlet; -#X obj 178 228 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 -1; -#X msg 151 157 open ./; -#X obj 178 259 print; -#X obj 121 200 ./dir test; -#X connect 0 0 4 0; -#X connect 1 0 3 0; -#X connect 2 0 4 0; -#X connect 4 3 1 0; diff --git a/Classes/Source/dir.c b/Classes/Source/dir.c index 26a326b92..a018148bb 100644 --- a/Classes/Source/dir.c +++ b/Classes/Source/dir.c @@ -108,7 +108,21 @@ static void dir_load(t_dir *x){ static void dir_loadir(t_dir *x, t_symbol *dirname, int init){ char tempdir[MAXPDSTRING]; strcpy(tempdir, x->x_directory); // tempdir = x->x_directory - if(!strcmp(dirname->s_name, "")){ + DIR *temp; + // check if absolute for windows + char *pch = strchr(dirname->s_name, ':'); + while(pch != NULL){ + if(pch-dirname->s_name == 1){ + strncpy(x->x_directory, dirname->s_name, MAXPDSTRING); + goto search; + } + pch=strchr(pch+1, 's'); + } + if(!strncmp(dirname->s_name, "/", 1)){ // absolute mac/linux + strncpy(x->x_directory, dirname->s_name, MAXPDSTRING); + goto search; + } + else if(!strcmp(dirname->s_name, "")){ pd_error(x, "[dir]: no symbol given to 'open'"); return; } @@ -121,12 +135,11 @@ static void dir_loadir(t_dir *x, t_symbol *dirname, int init){ if(!strcmp(x->x_directory, "")) strcpy(x->x_directory, "/"); } - else if(!strncmp(dirname->s_name, "/", 1) || !strncmp(dirname->s_name, ":", 2)) // absolute - strncpy(x->x_directory, dirname->s_name, MAXPDSTRING); - else // relative to current dir - sprintf(x->x_directory, "%s/%s", x->x_directory, dirname->s_name ); -// search - DIR *temp = opendir(x->x_directory); + else{ // relative to current dir + sprintf(x->x_directory, "%s/%s", x->x_directory, dirname->s_name); + }; + search: + temp = opendir(x->x_directory); if(!temp){ // didn't find temp = NULL; // ??? strcpy(x->x_directory, tempdir); // restore original directory @@ -135,8 +148,10 @@ static void dir_loadir(t_dir *x, t_symbol *dirname, int init){ dirname->s_name, x->x_directory); dir_load(x); } - else + else{ + post("[dir]: cannot open '%s'", dirname->s_name); outlet_float(x->x_out4, 0); + } return; } else{