diff -Nru pd-libdir-1.9/debian/changelog pd-libdir-1.10/debian/changelog --- pd-libdir-1.9/debian/changelog 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/changelog 2017-01-14 21:33:52.000000000 +0000 @@ -1,3 +1,26 @@ +pd-libdir (1.10-1) unstable; urgency=medium + + * New upstream version 1.10 + + [ Hans-Christoph Steiner ] + * Depends: puredata-core | pd, so the depends is not only on a virtual package + * Updated to copyright-format/1.0 + * Removed 'DM-Upload-Allowed: yes', its deprecated + + [ IOhannes m zmölnig ] + * Dropped patches + * Updated d/rules + * Updated d/control + * Dropped dependency on quilt + * Canonical Vcs-* stanzas (using https://) + * Added myself to uploaders + * Fixed d/copyright + * Updated d/watch to github + * Bumped dh-compat to 9 + * Bumped standards version to 3.9.8 + + -- IOhannes m zmölnig (Debian/GNU) Sat, 14 Jan 2017 22:33:52 +0100 + pd-libdir (1.9-3) unstable; urgency=low * bumped standards version to 3.9.2 diff -Nru pd-libdir-1.9/debian/compat pd-libdir-1.10/debian/compat --- pd-libdir-1.9/debian/compat 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/compat 2017-01-14 21:33:52.000000000 +0000 @@ -1 +1 @@ -7 +9 diff -Nru pd-libdir-1.9/debian/control pd-libdir-1.10/debian/control --- pd-libdir-1.9/debian/control 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/control 2017-01-14 21:33:52.000000000 +0000 @@ -2,22 +2,25 @@ Section: sound Priority: optional Maintainer: Debian Multimedia Maintainers -DM-Upload-Allowed: yes -Uploaders: Hans-Christoph Steiner -Build-Depends: debhelper (>= 7.0.50~), - puredata-dev | puredata (<< 0.43), - quilt (>= 0.46-7~) -Standards-Version: 3.9.2 +Uploaders: + Hans-Christoph Steiner , + IOhannes m zmölnig (Debian/GNU) , +Build-Depends: + debhelper, + puredata-dev | puredata (<< 0.43), +Standards-Version: 3.9.8 Homepage: http://puredata.info -Vcs-Git: git://git.debian.org/pkg-multimedia/pd-libdir.git -Vcs-Browser: http://git.debian.org/?p=pkg-multimedia/pd-libdir.git +Vcs-Git: https://anonscm.debian.org/git/pkg-multimedia/pd-libdir.git +Vcs-Browser: https://anonscm.debian.org/git/pkg-multimedia/pd-libdir.git Package: pd-libdir Architecture: any -Depends: ${shlibs:Depends}, - pd, - ${misc:Depends} -Recommends: pd-import +Depends: + ${shlibs:Depends}, + ${misc:Depends}, + puredata-core | pd, +Recommends: + pd-import, Enhances: puredata-core Description: provides support for the libdir library format for Pd The 'libdir' loader is a Pure Data loader which supports the libdir diff -Nru pd-libdir-1.9/debian/copyright pd-libdir-1.10/debian/copyright --- pd-libdir-1.9/debian/copyright 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/copyright 2017-01-14 21:33:52.000000000 +0000 @@ -1,16 +1,19 @@ -Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?rev=135 -Name: libdir -Maintainer: Hans-Christoph Steiner -Source: http://sourceforge.net/projects/pure-data/files/libraries/libdir/ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: libdir +Upstream-Contact: Hans-Christoph Steiner +Source: https://github.com/pure-data/libdir +Files: * Copyright: 2006-2010, Hans-Christoph Steiner -License: BSD + 2016, IOhannes m zmölnig +License: BSD-3-clause -Files: debian/patches/add_required_headers.patch -Copyright: 1997-2009, Miller Puckette -License: BSD +Files: debian/* +Copyright: 2006-2010, Hans-Christoph Steiner + 2016, IOhannes m zmölnig +License: BSD-3-clause -License: BSD +License: BSD-3-clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff -Nru pd-libdir-1.9/debian/patches/add_required_headers.patch pd-libdir-1.10/debian/patches/add_required_headers.patch --- pd-libdir-1.9/debian/patches/add_required_headers.patch 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/patches/add_required_headers.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,968 +0,0 @@ -Description: workaround for headers missing from 'puredata' - Currently the 'puredata' package only includes the header m_pd.h, but other - headers are need to build this package, specifically s_stuff.h and - g_canvas.h. This patch adds the two headers from 'puredata' version 0.42.6 - until the other headers are included in Debian. -Author: Hans-Christoph Steiner -Bug-Debian: http://bugs.debian.org/568770 -Forwarded: not-needed -Reviewed-By: Hans-Christoph Steiner -Last-Update: <2010-09-13> - ---- /dev/null -+++ pd-libdir-1.9/s_stuff.h -@@ -0,0 +1,333 @@ -+/* Copyright (c) 1997-1999 Miller Puckette. -+* For information on usage and redistribution, and for a DISCLAIMER OF ALL -+* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ -+ -+/* Audio and MIDI I/O, and other scheduling and system stuff. */ -+ -+/* NOTE: this file describes Pd implementation details which may change -+in future releases. The public (stable) API is in m_pd.h. */ -+ -+/* in s_path.c */ -+ -+typedef struct _namelist /* element in a linked list of stored strings */ -+{ -+ struct _namelist *nl_next; /* next in list */ -+ char *nl_string; /* the string */ -+} t_namelist; -+ -+t_namelist *namelist_append(t_namelist *listwas, const char *s, int allowdup); -+t_namelist *namelist_append_files(t_namelist *listwas, const char *s); -+void namelist_free(t_namelist *listwas); -+char *namelist_get(t_namelist *namelist, int n); -+void sys_setextrapath(const char *p); -+extern int sys_usestdpath; -+extern t_namelist *sys_externlist; -+extern t_namelist *sys_searchpath; -+extern t_namelist *sys_helppath; -+int sys_open_absolute(const char *name, const char* ext, -+ char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp); -+int sys_trytoopenone(const char *dir, const char *name, const char* ext, -+ char *dirresult, char **nameresult, unsigned int size, int bin); -+t_symbol *sys_decodedialog(t_symbol *s); -+ -+/* s_file.c */ -+ -+void sys_loadpreferences( void); -+void sys_savepreferences( void); -+extern int sys_defeatrt; -+extern t_symbol *sys_flags; -+ -+/* s_main.c */ -+extern int sys_debuglevel; -+extern int sys_verbose; -+extern int sys_noloadbang; -+extern int sys_nogui; -+extern char *sys_guicmd; -+ -+EXTERN int sys_nearestfontsize(int fontsize); -+EXTERN int sys_hostfontsize(int fontsize); -+ -+extern int sys_defaultfont; -+extern t_symbol *sys_libdir; /* library directory for auxilliary files */ -+extern t_symbol *sys_guidir; /* directory holding pd_gui, u_pdsend, etc */ -+ -+/* s_loader.c */ -+ -+typedef int (*loader_t)(t_canvas *canvas, char *classname); /* callback type */ -+EXTERN int sys_load_lib(t_canvas *canvas, char *filename); -+EXTERN void sys_register_loader(loader_t loader); -+ -+/* s_audio.c */ -+ -+#define SENDDACS_NO 0 /* return values for sys_send_dacs() */ -+#define SENDDACS_YES 1 -+#define SENDDACS_SLEPT 2 -+ -+#define DEFDACBLKSIZE 64 -+extern int sys_schedblocksize; /* audio block size for scheduler */ -+extern int sys_hipriority; /* real-time flag, true if priority boosted */ -+extern t_sample *sys_soundout; -+extern t_sample *sys_soundin; -+extern int sys_inchannels; -+extern int sys_outchannels; -+extern int sys_advance_samples; /* scheduler advance in samples */ -+extern int sys_blocksize; /* audio I/O block size in sample frames */ -+extern t_float sys_dacsr; -+extern int sys_schedadvance; -+extern int sys_sleepgrain; -+void sys_set_audio_settings(int naudioindev, int *audioindev, -+ int nchindev, int *chindev, -+ int naudiooutdev, int *audiooutdev, int nchoutdev, int *choutdev, -+ int srate, int advance, int callback); -+void sys_reopen_audio( void); -+void sys_close_audio(void); -+ -+ -+int sys_send_dacs(void); -+void sys_reportidle(void); -+void sys_set_priority(int higher); -+void sys_audiobuf(int nbufs); -+void sys_getmeters(t_sample *inmax, t_sample *outmax); -+void sys_listdevs(void); -+void sys_setblocksize(int n); -+ -+/* s_midi.c */ -+#define MAXMIDIINDEV 16 /* max. number of input ports */ -+#define MAXMIDIOUTDEV 16 /* max. number of output ports */ -+extern int sys_nmidiin; -+extern int sys_nmidiout; -+extern int sys_midiindevlist[]; -+extern int sys_midioutdevlist[]; -+ -+void sys_open_midi(int nmidiin, int *midiinvec, -+ int nmidiout, int *midioutvec, int enable); -+void sys_get_midi_params(int *pnmidiindev, int *pmidiindev, -+ int *pnmidioutdev, int *pmidioutdev); -+ -+void sys_get_midi_apis(char *buf); -+ -+void sys_reopen_midi( void); -+void sys_close_midi( void); -+EXTERN void sys_putmidimess(int portno, int a, int b, int c); -+EXTERN void sys_putmidibyte(int portno, int a); -+EXTERN void sys_poll_midi(void); -+EXTERN void sys_setmiditimediff(double inbuftime, double outbuftime); -+EXTERN void sys_midibytein(int portno, int byte); -+ -+ /* implemented in the system dependent MIDI code (s_midi_pm.c, etc. ) */ -+void midi_getdevs(char *indevlist, int *nindevs, -+ char *outdevlist, int *noutdevs, int maxndev, int devdescsize); -+void sys_do_open_midi(int nmidiindev, int *midiindev, -+ int nmidioutdev, int *midioutdev); -+ -+#ifdef USEAPI_ALSA -+EXTERN void sys_alsa_putmidimess(int portno, int a, int b, int c); -+EXTERN void sys_alsa_putmidibyte(int portno, int a); -+EXTERN void sys_alsa_poll_midi(void); -+EXTERN void sys_alsa_setmiditimediff(double inbuftime, double outbuftime); -+EXTERN void sys_alsa_midibytein(int portno, int byte); -+EXTERN void sys_alsa_close_midi( void); -+ -+ -+ /* implemented in the system dependent MIDI code (s_midi_pm.c, etc. ) */ -+void midi_alsa_getdevs(char *indevlist, int *nindevs, -+ char *outdevlist, int *noutdevs, int maxndev, int devdescsize); -+void sys_alsa_do_open_midi(int nmidiindev, int *midiindev, -+ int nmidioutdev, int *midioutdev); -+#endif -+ -+/* m_sched.c */ -+EXTERN void sys_log_error(int type); -+#define ERR_NOTHING 0 -+#define ERR_ADCSLEPT 1 -+#define ERR_DACSLEPT 2 -+#define ERR_RESYNC 3 -+#define ERR_DATALATE 4 -+ -+#define SCHED_AUDIO_NONE 0 -+#define SCHED_AUDIO_POLL 1 -+#define SCHED_AUDIO_CALLBACK 2 -+void sched_set_using_audio(int flag); -+ -+/* s_inter.c */ -+ -+EXTERN void sys_microsleep(int microsec); -+ -+EXTERN void sys_bail(int exitcode); -+EXTERN int sys_pollgui(void); -+ -+EXTERN_STRUCT _socketreceiver; -+#define t_socketreceiver struct _socketreceiver -+ -+typedef void (*t_socketnotifier)(void *x); -+typedef void (*t_socketreceivefn)(void *x, t_binbuf *b); -+ -+EXTERN t_socketreceiver *socketreceiver_new(void *owner, -+ t_socketnotifier notifier, t_socketreceivefn socketreceivefn, int udp); -+EXTERN void socketreceiver_read(t_socketreceiver *x, int fd); -+EXTERN void sys_sockerror(char *s); -+EXTERN void sys_closesocket(int fd); -+ -+typedef void (*t_fdpollfn)(void *ptr, int fd); -+EXTERN void sys_addpollfn(int fd, t_fdpollfn fn, void *ptr); -+EXTERN void sys_rmpollfn(int fd); -+#ifdef UNIX -+void sys_setalarm(int microsec); -+void sys_setvirtualalarm( void); -+#endif -+ -+#define API_NONE 0 -+#define API_ALSA 1 -+#define API_OSS 2 -+#define API_MMIO 3 -+#define API_PORTAUDIO 4 -+#define API_JACK 5 -+#define API_SGI 6 -+ -+#ifdef __linux__ -+#define API_DEFAULT API_OSS -+#define API_DEFSTRING "OSS" -+#endif -+#ifdef MSW -+#define API_DEFAULT API_MMIO -+#define API_DEFSTRING "MMIO" -+#endif -+#ifdef __APPLE__ -+#define API_DEFAULT API_PORTAUDIO -+#define API_DEFSTRING "portaudio" -+#endif -+#ifdef IRIX -+#define API_DEFAULT API_SGI -+#define API_DEFSTRING "SGI Digital Media" -+#endif -+#define DEFAULTAUDIODEV 0 -+ -+#define MAXAUDIOINDEV 4 -+#define MAXAUDIOOUTDEV 4 -+ -+#define DEFMIDIDEV 0 -+ -+#define DEFAULTSRATE 44100 -+#ifdef MSW -+#define DEFAULTADVANCE 70 -+#else -+#define DEFAULTADVANCE 50 -+#endif -+ -+typedef void (*t_audiocallback)(void); -+ -+int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin, -+ t_sample *soundout, int framesperbuf, int nbuffers, -+ int indeviceno, int outdeviceno, t_audiocallback callback); -+void pa_close_audio(void); -+int pa_send_dacs(void); -+void sys_reportidle(void); -+void pa_listdevs(void); -+void pa_getdevs(char *indevlist, int *nindevs, -+ char *outdevlist, int *noutdevs, int *canmulti, -+ int maxndev, int devdescsize); -+ -+int oss_open_audio(int naudioindev, int *audioindev, int nchindev, -+ int *chindev, int naudiooutdev, int *audiooutdev, int nchoutdev, -+ int *choutdev, int rate); -+void oss_close_audio(void); -+int oss_send_dacs(void); -+void oss_reportidle(void); -+void oss_getdevs(char *indevlist, int *nindevs, -+ char *outdevlist, int *noutdevs, int *canmulti, -+ int maxndev, int devdescsize); -+ -+int alsa_open_audio(int naudioindev, int *audioindev, int nchindev, -+ int *chindev, int naudiooutdev, int *audiooutdev, int nchoutdev, -+ int *choutdev, int rate); -+void alsa_close_audio(void); -+int alsa_send_dacs(void); -+void alsa_reportidle(void); -+void alsa_getdevs(char *indevlist, int *nindevs, -+ char *outdevlist, int *noutdevs, int *canmulti, -+ int maxndev, int devdescsize); -+ -+int jack_open_audio(int wantinchans, int wantoutchans, int srate); -+void jack_close_audio(void); -+int jack_send_dacs(void); -+void jack_reportidle(void); -+void jack_getdevs(char *indevlist, int *nindevs, -+ char *outdevlist, int *noutdevs, int *canmulti, -+ int maxndev, int devdescsize); -+void jack_listdevs(void); -+ -+int mmio_open_audio(int naudioindev, int *audioindev, -+ int nchindev, int *chindev, int naudiooutdev, int *audiooutdev, -+ int nchoutdev, int *choutdev, int rate); -+void mmio_close_audio( void); -+void mmio_reportidle(void); -+int mmio_send_dacs(void); -+void mmio_getdevs(char *indevlist, int *nindevs, -+ char *outdevlist, int *noutdevs, int *canmulti, -+ int maxndev, int devdescsize); -+ -+void sys_listmididevs(void); -+void sys_set_midi_api(int whichapi); -+void sys_set_audio_api(int whichapi); -+void sys_get_audio_apis(char *buf); -+extern int sys_audioapi; -+void sys_set_audio_state(int onoff); -+ -+/* API dependent audio flags and settings */ -+void oss_set32bit( void); -+void linux_alsa_devname(char *devname); -+ -+void sys_get_audio_params( -+ int *pnaudioindev, int *paudioindev, int *chindev, -+ int *pnaudiooutdev, int *paudiooutdev, int *choutdev, -+ int *prate, int *padvance, int *callback); -+void sys_save_audio_params( -+ int naudioindev, int *audioindev, int *chindev, -+ int naudiooutdev, int *audiooutdev, int *choutdev, -+ int rate, int advance, int callback); -+ -+/* s_file.c */ -+ -+typedef void (*t_printhook)(const char *s); -+extern t_printhook sys_printhook; /* set this to override printing */ -+extern int sys_printtostderr; -+ -+/* jsarlo { */ -+ -+EXTERN double sys_time; -+EXTERN double sys_time_per_dsp_tick; -+EXTERN int sys_externalschedlib; -+ -+EXTERN t_sample* get_sys_soundout(void ) ; -+EXTERN t_sample* get_sys_soundin(void ) ; -+EXTERN int* get_sys_main_advance(void ) ; -+EXTERN double* get_sys_time_per_dsp_tick(void ) ; -+EXTERN int* get_sys_schedblocksize(void ) ; -+EXTERN double* get_sys_time(void ) ; -+EXTERN t_float* get_sys_dacsr(void ) ; -+EXTERN int* get_sys_sleepgrain(void ) ; -+EXTERN int* get_sys_schedadvance(void ) ; -+ -+EXTERN void sys_clearhist(void ); -+EXTERN void sys_initmidiqueue(void ); -+EXTERN int sys_addhist(int phase); -+EXTERN void sys_setmiditimediff(double inbuftime, double outbuftime); -+EXTERN void sched_tick(double next_sys_time); -+EXTERN void sys_pollmidiqueue(void ); -+EXTERN int sys_pollgui(void ); -+EXTERN void sys_setchsr(int chin, int chout, int sr); -+ -+EXTERN void inmidi_noteon(int portno, int channel, int pitch, int velo); -+EXTERN void inmidi_controlchange(int portno, -+ int channel, -+ int ctlnumber, -+ int value); -+EXTERN void inmidi_programchange(int portno, int channel, int value); -+EXTERN void inmidi_pitchbend(int portno, int channel, int value); -+EXTERN void inmidi_aftertouch(int portno, int channel, int value); -+EXTERN void inmidi_polyaftertouch(int portno, -+ int channel, -+ int pitch, -+ int value); -+/* } jsarlo */ -+extern t_widgetbehavior text_widgetbehavior; ---- /dev/null -+++ pd-libdir-1.9/g_canvas.h -@@ -0,0 +1,618 @@ -+/* Copyright (c) 1997-1999 Miller Puckette. -+* For information on usage and redistribution, and for a DISCLAIMER OF ALL -+* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ -+ -+/* this file defines the structure for "glists" and related structures and -+functions. "Glists" and "canvases" and "graphs" used to be different -+structures until being unified in version 0.35. -+ -+A glist occupies its own window if the "gl_havewindow" flag is set. Its -+appearance on its "parent", also called "owner", (if it has one) is as a graph -+if "gl_isgraph" is set, and otherwise as a text box. -+ -+A glist is "root" if it has no owner, i.e., a document window. In this -+case "gl_havewindow" is always set. -+ -+We maintain a list of root windows, so that we can traverse the whole -+collection of everything in a Pd process. -+ -+If a glist has a window it may still not be "mapped." Miniaturized -+windows aren't mapped, for example, but a window is also not mapped -+immediately upon creation. In either case gl_havewindow is true but -+gl_mapped is false. -+ -+Closing a non-root window makes it invisible; closing a root destroys it. -+ -+A glist that's just a text object on its parent is always "toplevel." An -+embedded glist can switch back and forth to appear as a toplevel by double- -+clicking on it. Single-clicking a text box makes the toplevel become visible -+and raises the window it's in. -+ -+If a glist shows up as a graph on its parent, the graph is blanked while the -+glist has its own window, even if miniaturized. -+ -+*/ -+ -+/* NOTE: this file describes Pd implementation details which may change -+in future releases. The public (stable) API is in m_pd.h. */ -+ -+#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus) -+extern "C" { -+#endif -+ -+/* --------------------- geometry ---------------------------- */ -+#define IOWIDTH 7 /* width of an inlet/outlet in pixels */ -+#define IOMIDDLE ((IOWIDTH-1)/2) -+#define GLIST_DEFGRAPHWIDTH 200 -+#define GLIST_DEFGRAPHHEIGHT 140 -+/* ----------------------- data ------------------------------- */ -+ -+typedef struct _updateheader -+{ -+ struct _updateheader *upd_next; -+ unsigned int upd_array:1; /* true if array, false if glist */ -+ unsigned int upd_queued:1; /* true if we're queued */ -+} t_updateheader; -+ -+ /* types to support glists grabbing mouse motion or keys from parent */ -+typedef void (*t_glistmotionfn)(void *z, t_floatarg dx, t_floatarg dy); -+typedef void (*t_glistkeyfn)(void *z, t_floatarg key); -+ -+EXTERN_STRUCT _rtext; -+#define t_rtext struct _rtext -+ -+EXTERN_STRUCT _gtemplate; -+#define t_gtemplate struct _gtemplate -+ -+EXTERN_STRUCT _guiconnect; -+#define t_guiconnect struct _guiconnect -+ -+EXTERN_STRUCT _tscalar; -+#define t_tscalar struct _tscalar -+ -+EXTERN_STRUCT _canvasenvironment; -+#define t_canvasenvironment struct _canvasenvironment -+ -+EXTERN_STRUCT _fielddesc; -+#define t_fielddesc struct _fielddesc -+ -+typedef struct _selection -+{ -+ t_gobj *sel_what; -+ struct _selection *sel_next; -+} t_selection; -+ -+ /* this structure is instantiated whenever a glist becomes visible. */ -+typedef struct _editor -+{ -+ t_updateheader e_upd; /* update header structure */ -+ t_selection *e_updlist; /* list of objects to update */ -+ t_rtext *e_rtext; /* text responder linked list */ -+ t_selection *e_selection; /* head of the selection list */ -+ t_rtext *e_textedfor; /* the rtext if any that we are editing */ -+ t_gobj *e_grab; /* object being "dragged" */ -+ t_glistmotionfn e_motionfn; /* ... motion callback */ -+ t_glistkeyfn e_keyfn; /* ... keypress callback */ -+ t_binbuf *e_connectbuf; /* connections to deleted objects */ -+ t_binbuf *e_deleted; /* last stuff we deleted */ -+ t_guiconnect *e_guiconnect; /* GUI connection for filtering messages */ -+ struct _glist *e_glist; /* glist which owns this */ -+ int e_xwas; /* xpos on last mousedown or motion event */ -+ int e_ywas; /* ypos, similarly */ -+ int e_selectline_index1; /* indices for the selected line if any */ -+ int e_selectline_outno; /* (only valid if e_selectedline is set) */ -+ int e_selectline_index2; -+ int e_selectline_inno; -+ t_outconnect *e_selectline_tag; -+ unsigned int e_onmotion: 3; /* action to take on motion */ -+ unsigned int e_lastmoved: 1; /* one if mouse has moved since click */ -+ unsigned int e_textdirty: 1; /* one if e_textedfor has changed */ -+ unsigned int e_selectedline: 1; /* one if a line is selected */ -+} t_editor; -+ -+#define MA_NONE 0 /* e_onmotion: do nothing on mouse motion */ -+#define MA_MOVE 1 /* drag the selection around */ -+#define MA_CONNECT 2 /* make a connection */ -+#define MA_REGION 3 /* selection region */ -+#define MA_PASSOUT 4 /* send on to e_grab */ -+#define MA_DRAGTEXT 5 /* drag in text editor to alter selection */ -+ -+/* editor structure for "garrays". We don't bother to delete and regenerate -+this structure when the "garray" becomes invisible or visible, although we -+could do so if the structure gets big (like the "editor" above.) */ -+ -+typedef struct _arrayvis -+{ -+ t_updateheader av_upd; /* update header structure */ -+ t_garray *av_garray; /* owning structure */ -+} t_arrayvis; -+ -+/* the t_tick structure describes where to draw x and y "ticks" for a glist */ -+ -+typedef struct _tick /* where to put ticks on x or y axes */ -+{ -+ t_float k_point; /* one point to draw a big tick at */ -+ t_float k_inc; /* x or y increment per little tick */ -+ int k_lperb; /* little ticks per big; 0 if no ticks to draw */ -+} t_tick; -+ -+/* the t_glist structure, which describes a list of elements that live on an -+area of a window. -+ -+*/ -+ -+struct _glist -+{ -+ t_object gl_obj; /* header in case we're a glist */ -+ t_gobj *gl_list; /* the actual data */ -+ struct _gstub *gl_stub; /* safe pointer handler */ -+ int gl_valid; /* incremented when pointers might be stale */ -+ struct _glist *gl_owner; /* parent glist, supercanvas, or 0 if none */ -+ int gl_pixwidth; /* width in pixels (on parent, if a graph) */ -+ int gl_pixheight; -+ t_float gl_x1; /* bounding rectangle in our own coordinates */ -+ t_float gl_y1; -+ t_float gl_x2; -+ t_float gl_y2; -+ int gl_screenx1; /* screen coordinates when toplevel */ -+ int gl_screeny1; -+ int gl_screenx2; -+ int gl_screeny2; -+ int gl_xmargin; /* origin for GOP rectangle */ -+ int gl_ymargin; -+ t_tick gl_xtick; /* ticks marking X values */ -+ int gl_nxlabels; /* number of X coordinate labels */ -+ t_symbol **gl_xlabel; /* ... an array to hold them */ -+ t_float gl_xlabely; /* ... and their Y coordinates */ -+ t_tick gl_ytick; /* same as above for Y ticks and labels */ -+ int gl_nylabels; -+ t_symbol **gl_ylabel; -+ t_float gl_ylabelx; -+ t_editor *gl_editor; /* editor structure when visible */ -+ t_symbol *gl_name; /* symbol bound here */ -+ int gl_font; /* nominal font size in points, e.g., 10 */ -+ struct _glist *gl_next; /* link in list of toplevels */ -+ t_canvasenvironment *gl_env; /* root canvases and abstractions only */ -+ unsigned int gl_havewindow:1; /* true if we own a window */ -+ unsigned int gl_mapped:1; /* true if, moreover, it's "mapped" */ -+ unsigned int gl_dirty:1; /* (root canvas only:) patch has changed */ -+ unsigned int gl_loading:1; /* am now loading from file */ -+ unsigned int gl_willvis:1; /* make me visible after loading */ -+ unsigned int gl_edit:1; /* edit mode */ -+ unsigned int gl_isdeleting:1; /* we're inside glist_delete -- hack! */ -+ unsigned int gl_goprect:1; /* draw rectangle for graph-on-parent */ -+ unsigned int gl_isgraph:1; /* show as graph on parent */ -+ unsigned int gl_hidetext:1; /* hide object-name + args when doing graph on parent */ -+}; -+ -+#define gl_gobj gl_obj.te_g -+#define gl_pd gl_gobj.g_pd -+ -+/* a data structure to describe a field in a pure datum */ -+ -+#define DT_FLOAT 0 -+#define DT_SYMBOL 1 -+#define DT_LIST 2 -+#define DT_ARRAY 3 -+ -+typedef struct _dataslot -+{ -+ int ds_type; -+ t_symbol *ds_name; -+ t_symbol *ds_arraytemplate; /* filled in for arrays only */ -+} t_dataslot; -+ -+typedef struct _template -+{ -+ t_pd t_pdobj; /* header */ -+ struct _gtemplate *t_list; /* list of "struct"/gtemplate objects */ -+ t_symbol *t_sym; /* name */ -+ int t_n; /* number of dataslots (fields) */ -+ t_dataslot *t_vec; /* array of dataslots */ -+} t_template; -+ -+struct _array -+{ -+ int a_n; /* number of elements */ -+ int a_elemsize; /* size in bytes; LATER get this from template */ -+ char *a_vec; /* array of elements */ -+ t_symbol *a_templatesym; /* template for elements */ -+ int a_valid; /* protection against stale pointers into array */ -+ t_gpointer a_gp; /* pointer to scalar or array element we're in */ -+ t_gstub *a_stub; /* stub for pointing into this array */ -+}; -+ -+ /* structure for traversing all the connections in a glist */ -+typedef struct _linetraverser -+{ -+ t_canvas *tr_x; -+ t_object *tr_ob; -+ int tr_nout; -+ int tr_outno; -+ t_object *tr_ob2; -+ t_outlet *tr_outlet; -+ t_inlet *tr_inlet; -+ int tr_nin; -+ int tr_inno; -+ int tr_x11, tr_y11, tr_x12, tr_y12; -+ int tr_x21, tr_y21, tr_x22, tr_y22; -+ int tr_lx1, tr_ly1, tr_lx2, tr_ly2; -+ t_outconnect *tr_nextoc; -+ int tr_nextoutno; -+} t_linetraverser; -+ -+/* function types used to define graphical behavior for gobjs, a bit like X -+widgets. We don't use Pd methods because Pd's typechecking can't specify the -+types of pointer arguments. Also it's more convenient this way, since -+every "patchable" object can just get the "text" behaviors. */ -+ -+ /* Call this to get a gobj's bounding rectangle in pixels */ -+typedef void (*t_getrectfn)(t_gobj *x, struct _glist *glist, -+ int *x1, int *y1, int *x2, int *y2); -+ /* and this to displace a gobj: */ -+typedef void (*t_displacefn)(t_gobj *x, struct _glist *glist, int dx, int dy); -+ /* change color to show selection: */ -+typedef void (*t_selectfn)(t_gobj *x, struct _glist *glist, int state); -+ /* change appearance to show activation/deactivation: */ -+typedef void (*t_activatefn)(t_gobj *x, struct _glist *glist, int state); -+ /* warn a gobj it's about to be deleted */ -+typedef void (*t_deletefn)(t_gobj *x, struct _glist *glist); -+ /* making visible or invisible */ -+typedef void (*t_visfn)(t_gobj *x, struct _glist *glist, int flag); -+ /* field a mouse click (when not in "edit" mode) */ -+typedef int (*t_clickfn)(t_gobj *x, struct _glist *glist, -+ int xpix, int ypix, int shift, int alt, int dbl, int doit); -+ /* ... and later, resizing; getting/setting font or color... */ -+ -+struct _widgetbehavior -+{ -+ t_getrectfn w_getrectfn; -+ t_displacefn w_displacefn; -+ t_selectfn w_selectfn; -+ t_activatefn w_activatefn; -+ t_deletefn w_deletefn; -+ t_visfn w_visfn; -+ t_clickfn w_clickfn; -+}; -+ -+/* -------- behaviors for scalars defined by objects in template --------- */ -+/* these are set by "drawing commands" in g_template.c which add appearance to -+scalars, which live in some other window. If the scalar is just included -+in a canvas the "parent" is a misnomer. There is also a text scalar object -+which really does draw the scalar on the parent window; see g_scalar.c. */ -+ -+/* note how the click function wants the whole scalar, not the "data", so -+doesn't work on array elements... LATER reconsider this */ -+ -+ /* bounding rectangle: */ -+typedef void (*t_parentgetrectfn)(t_gobj *x, struct _glist *glist, -+ t_word *data, t_template *tmpl, t_float basex, t_float basey, -+ int *x1, int *y1, int *x2, int *y2); -+ /* displace it */ -+typedef void (*t_parentdisplacefn)(t_gobj *x, struct _glist *glist, -+ t_word *data, t_template *tmpl, t_float basex, t_float basey, -+ int dx, int dy); -+ /* change color to show selection */ -+typedef void (*t_parentselectfn)(t_gobj *x, struct _glist *glist, -+ t_word *data, t_template *tmpl, t_float basex, t_float basey, -+ int state); -+ /* change appearance to show activation/deactivation: */ -+typedef void (*t_parentactivatefn)(t_gobj *x, struct _glist *glist, -+ t_word *data, t_template *tmpl, t_float basex, t_float basey, -+ int state); -+ /* making visible or invisible */ -+typedef void (*t_parentvisfn)(t_gobj *x, struct _glist *glist, -+ t_word *data, t_template *tmpl, t_float basex, t_float basey, -+ int flag); -+ /* field a mouse click */ -+typedef int (*t_parentclickfn)(t_gobj *x, struct _glist *glist, -+ t_word *data, t_template *tmpl, t_scalar *sc, t_array *ap, -+ t_float basex, t_float basey, -+ int xpix, int ypix, int shift, int alt, int dbl, int doit); -+ -+struct _parentwidgetbehavior -+{ -+ t_parentgetrectfn w_parentgetrectfn; -+ t_parentdisplacefn w_parentdisplacefn; -+ t_parentselectfn w_parentselectfn; -+ t_parentactivatefn w_parentactivatefn; -+ t_parentvisfn w_parentvisfn; -+ t_parentclickfn w_parentclickfn; -+}; -+ -+ /* cursor definitions; used as return value for t_parentclickfn */ -+#define CURSOR_RUNMODE_NOTHING 0 -+#define CURSOR_RUNMODE_CLICKME 1 -+#define CURSOR_RUNMODE_THICKEN 2 -+#define CURSOR_RUNMODE_ADDPOINT 3 -+#define CURSOR_EDITMODE_NOTHING 4 -+#define CURSOR_EDITMODE_CONNECT 5 -+#define CURSOR_EDITMODE_DISCONNECT 6 -+EXTERN void canvas_setcursor(t_glist *x, unsigned int cursornum); -+ -+extern t_canvas *canvas_editing; /* last canvas to start text edting */ -+extern t_canvas *canvas_whichfind; /* last canvas we did a find in */ -+extern t_canvas *canvas_list; /* list of all root canvases */ -+extern t_class *vinlet_class, *voutlet_class; -+extern int glist_valid; /* incremented when pointers might be stale */ -+ -+#define PLOTSTYLE_POINTS 0 /* plotting styles for arrays */ -+#define PLOTSTYLE_POLY 1 -+#define PLOTSTYLE_BEZ 2 -+ -+/* ------------------- functions on any gobj ----------------------------- */ -+EXTERN void gobj_getrect(t_gobj *x, t_glist *owner, int *x1, int *y1, -+ int *x2, int *y2); -+EXTERN void gobj_displace(t_gobj *x, t_glist *owner, int dx, int dy); -+EXTERN void gobj_select(t_gobj *x, t_glist *owner, int state); -+EXTERN void gobj_activate(t_gobj *x, t_glist *owner, int state); -+EXTERN void gobj_delete(t_gobj *x, t_glist *owner); -+EXTERN void gobj_vis(t_gobj *x, t_glist *glist, int flag); -+EXTERN int gobj_click(t_gobj *x, struct _glist *glist, -+ int xpix, int ypix, int shift, int alt, int dbl, int doit); -+EXTERN void gobj_save(t_gobj *x, t_binbuf *b); -+EXTERN void gobj_properties(t_gobj *x, struct _glist *glist); -+EXTERN void gobj_save(t_gobj *x, t_binbuf *b); -+EXTERN int gobj_shouldvis(t_gobj *x, struct _glist *glist); -+ -+/* -------------------- functions on glists --------------------- */ -+EXTERN t_glist *glist_new( void); -+EXTERN void glist_init(t_glist *x); -+EXTERN void glist_add(t_glist *x, t_gobj *g); -+EXTERN void glist_cleanup(t_glist *x); -+EXTERN void glist_free(t_glist *x); -+ -+EXTERN void glist_clear(t_glist *x); -+EXTERN t_canvas *glist_getcanvas(t_glist *x); -+EXTERN int glist_isselected(t_glist *x, t_gobj *y); -+EXTERN void glist_select(t_glist *x, t_gobj *y); -+EXTERN void glist_deselect(t_glist *x, t_gobj *y); -+EXTERN void glist_noselect(t_glist *x); -+EXTERN void glist_selectall(t_glist *x); -+EXTERN void glist_delete(t_glist *x, t_gobj *y); -+EXTERN void glist_retext(t_glist *x, t_text *y); -+EXTERN void glist_grab(t_glist *x, t_gobj *y, t_glistmotionfn motionfn, -+ t_glistkeyfn keyfn, int xpos, int ypos); -+EXTERN int glist_isvisible(t_glist *x); -+EXTERN int glist_istoplevel(t_glist *x); -+EXTERN t_glist *glist_findgraph(t_glist *x); -+EXTERN int glist_getfont(t_glist *x); -+EXTERN void glist_sort(t_glist *canvas); -+EXTERN void glist_read(t_glist *x, t_symbol *filename, t_symbol *format); -+EXTERN void glist_mergefile(t_glist *x, t_symbol *filename, t_symbol *format); -+ -+EXTERN t_float glist_pixelstox(t_glist *x, t_float xpix); -+EXTERN t_float glist_pixelstoy(t_glist *x, t_float ypix); -+EXTERN t_float glist_xtopixels(t_glist *x, t_float xval); -+EXTERN t_float glist_ytopixels(t_glist *x, t_float yval); -+EXTERN t_float glist_dpixtodx(t_glist *x, t_float dxpix); -+EXTERN t_float glist_dpixtody(t_glist *x, t_float dypix); -+ -+EXTERN void glist_getnextxy(t_glist *gl, int *xval, int *yval); -+EXTERN void glist_glist(t_glist *g, t_symbol *s, int argc, t_atom *argv); -+EXTERN t_glist *glist_addglist(t_glist *g, t_symbol *sym, -+ t_float x1, t_float y1, t_float x2, t_float y2, -+ t_float px1, t_float py1, t_float px2, t_float py2); -+EXTERN void glist_arraydialog(t_glist *parent, t_symbol *name, -+ t_floatarg size, t_floatarg saveit, t_floatarg newgraph); -+EXTERN t_binbuf *glist_writetobinbuf(t_glist *x, int wholething); -+EXTERN int glist_isgraph(t_glist *x); -+EXTERN void glist_redraw(t_glist *x); -+EXTERN void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime, -+ char *tag, int x1, int y1, int x2, int y2); -+EXTERN void glist_eraseiofor(t_glist *glist, t_object *ob, char *tag); -+EXTERN void canvas_create_editor(t_glist *x); -+EXTERN void canvas_destroy_editor(t_glist *x); -+void canvas_deletelinesforio(t_canvas *x, t_text *text, -+ t_inlet *inp, t_outlet *outp); -+extern int glist_amreloadingabstractions; /* stop GUI changes while reloading */ -+ -+/* -------------------- functions on texts ------------------------- */ -+EXTERN void text_setto(t_text *x, t_glist *glist, char *buf, int bufsize); -+EXTERN void text_drawborder(t_text *x, t_glist *glist, char *tag, -+ int width, int height, int firsttime); -+EXTERN void text_eraseborder(t_text *x, t_glist *glist, char *tag); -+EXTERN int text_xcoord(t_text *x, t_glist *glist); -+EXTERN int text_ycoord(t_text *x, t_glist *glist); -+EXTERN int text_xpix(t_text *x, t_glist *glist); -+EXTERN int text_ypix(t_text *x, t_glist *glist); -+ -+/* -------------------- functions on rtexts ------------------------- */ -+#define RTEXT_DOWN 1 -+#define RTEXT_DRAG 2 -+#define RTEXT_DBL 3 -+#define RTEXT_SHIFT 4 -+ -+EXTERN t_rtext *rtext_new(t_glist *glist, t_text *who); -+EXTERN t_rtext *glist_findrtext(t_glist *gl, t_text *who); -+EXTERN void rtext_draw(t_rtext *x); -+EXTERN void rtext_erase(t_rtext *x); -+EXTERN t_rtext *rtext_remove(t_rtext *first, t_rtext *x); -+EXTERN int rtext_height(t_rtext *x); -+EXTERN void rtext_displace(t_rtext *x, int dx, int dy); -+EXTERN void rtext_select(t_rtext *x, int state); -+EXTERN void rtext_activate(t_rtext *x, int state); -+EXTERN void rtext_free(t_rtext *x); -+EXTERN void rtext_key(t_rtext *x, int n, t_symbol *s); -+EXTERN void rtext_mouse(t_rtext *x, int xval, int yval, int flag); -+EXTERN void rtext_retext(t_rtext *x); -+EXTERN int rtext_width(t_rtext *x); -+EXTERN int rtext_height(t_rtext *x); -+EXTERN char *rtext_gettag(t_rtext *x); -+EXTERN void rtext_gettext(t_rtext *x, char **buf, int *bufsize); -+EXTERN void rtext_getseltext(t_rtext *x, char **buf, int *bufsize); -+ -+/* -------------------- functions on canvases ------------------------ */ -+EXTERN t_class *canvas_class; -+ -+EXTERN t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv); -+EXTERN t_symbol *canvas_makebindsym(t_symbol *s); -+EXTERN void canvas_vistext(t_canvas *x, t_text *y); -+EXTERN void canvas_fixlinesfor(t_canvas *x, t_text *text); -+EXTERN void canvas_deletelinesfor(t_canvas *x, t_text *text); -+EXTERN void canvas_stowconnections(t_canvas *x); -+EXTERN void canvas_restoreconnections(t_canvas *x); -+EXTERN void canvas_redraw(t_canvas *x); -+ -+EXTERN t_inlet *canvas_addinlet(t_canvas *x, t_pd *who, t_symbol *sym); -+EXTERN void canvas_rminlet(t_canvas *x, t_inlet *ip); -+EXTERN t_outlet *canvas_addoutlet(t_canvas *x, t_pd *who, t_symbol *sym); -+EXTERN void canvas_rmoutlet(t_canvas *x, t_outlet *op); -+EXTERN void canvas_redrawallfortemplate(t_template *tmpl, int action); -+EXTERN void canvas_redrawallfortemplatecanvas(t_canvas *x, int action); -+EXTERN void canvas_zapallfortemplate(t_canvas *tmpl); -+EXTERN void canvas_setusedastemplate(t_canvas *x); -+EXTERN t_canvas *canvas_getcurrent(void); -+EXTERN void canvas_setcurrent(t_canvas *x); -+EXTERN void canvas_unsetcurrent(t_canvas *x); -+EXTERN t_symbol *canvas_realizedollar(t_canvas *x, t_symbol *s); -+EXTERN t_canvas *canvas_getrootfor(t_canvas *x); -+EXTERN void canvas_dirty(t_canvas *x, t_floatarg n); -+EXTERN int canvas_getfont(t_canvas *x); -+typedef int (*t_canvasapply)(t_canvas *x, t_int x1, t_int x2, t_int x3); -+ -+EXTERN t_int *canvas_recurapply(t_canvas *x, t_canvasapply *fn, -+ t_int x1, t_int x2, t_int x3); -+ -+EXTERN void canvas_resortinlets(t_canvas *x); -+EXTERN void canvas_resortoutlets(t_canvas *x); -+EXTERN void canvas_free(t_canvas *x); -+EXTERN void canvas_updatewindowlist( void); -+EXTERN void canvas_editmode(t_canvas *x, t_floatarg yesplease); -+EXTERN int canvas_isabstraction(t_canvas *x); -+EXTERN int canvas_istable(t_canvas *x); -+EXTERN int canvas_showtext(t_canvas *x); -+EXTERN void canvas_vis(t_canvas *x, t_floatarg f); -+EXTERN t_canvasenvironment *canvas_getenv(t_canvas *x); -+EXTERN void canvas_rename(t_canvas *x, t_symbol *s, t_symbol *dir); -+EXTERN void canvas_loadbang(t_canvas *x); -+EXTERN int canvas_hitbox(t_canvas *x, t_gobj *y, int xpos, int ypos, -+ int *x1p, int *y1p, int *x2p, int *y2p); -+EXTERN int canvas_setdeleting(t_canvas *x, int flag); -+ -+typedef void (*t_undofn)(t_canvas *canvas, void *buf, -+ int action); /* a function that does UNDO/REDO */ -+#define UNDO_FREE 0 /* free current undo/redo buffer */ -+#define UNDO_UNDO 1 /* undo */ -+#define UNDO_REDO 2 /* redo */ -+EXTERN void canvas_setundo(t_canvas *x, t_undofn undofn, void *buf, -+ const char *name); -+EXTERN void canvas_noundo(t_canvas *x); -+EXTERN int canvas_getindex(t_canvas *x, t_gobj *y); -+ -+EXTERN void canvas_connect(t_canvas *x, -+ t_floatarg fwhoout, t_floatarg foutno,t_floatarg fwhoin, t_floatarg finno); -+EXTERN void canvas_disconnect(t_canvas *x, -+ t_float index1, t_float outno, t_float index2, t_float inno); -+EXTERN int canvas_isconnected (t_canvas *x, -+ t_text *ob1, int n1, t_text *ob2, int n2); -+EXTERN void canvas_selectinrect(t_canvas *x, int lox, int loy, int hix, int hiy); -+ -+ -+/* ---- functions on canvasses as objects --------------------- */ -+ -+EXTERN void canvas_fattenforscalars(t_canvas *x, -+ int *x1, int *y1, int *x2, int *y2); -+EXTERN void canvas_visforscalars(t_canvas *x, t_glist *glist, int vis); -+EXTERN int canvas_clicksub(t_canvas *x, int xpix, int ypix, int shift, -+ int alt, int dbl, int doit); -+EXTERN t_glist *canvas_getglistonsuper(void); -+ -+EXTERN void linetraverser_start(t_linetraverser *t, t_canvas *x); -+EXTERN t_outconnect *linetraverser_next(t_linetraverser *t); -+EXTERN void linetraverser_skipobject(t_linetraverser *t); -+ -+/* --------- functions on garrays (graphical arrays) -------------------- */ -+ -+EXTERN t_template *garray_template(t_garray *x); -+ -+/* -------------------- arrays --------------------- */ -+EXTERN t_garray *graph_array(t_glist *gl, t_symbol *s, t_symbol *tmpl, -+ t_floatarg f, t_floatarg saveit); -+EXTERN t_array *array_new(t_symbol *templatesym, t_gpointer *parent); -+EXTERN void array_resize(t_array *x, int n); -+EXTERN void array_free(t_array *x); -+ -+/* --------------------- gpointers and stubs ---------------- */ -+EXTERN t_gstub *gstub_new(t_glist *gl, t_array *a); -+EXTERN void gstub_cutoff(t_gstub *gs); -+EXTERN void gpointer_setglist(t_gpointer *gp, t_glist *glist, t_scalar *x); -+EXTERN void gpointer_setarray(t_gpointer *gp, t_array *array, t_word *w); -+ -+/* --------------------- scalars ------------------------- */ -+EXTERN void word_init(t_word *wp, t_template *tmpl, t_gpointer *gp); -+EXTERN void word_restore(t_word *wp, t_template *tmpl, -+ int argc, t_atom *argv); -+EXTERN t_scalar *scalar_new(t_glist *owner, -+ t_symbol *templatesym); -+EXTERN void word_free(t_word *wp, t_template *tmpl); -+EXTERN void scalar_getbasexy(t_scalar *x, t_float *basex, t_float *basey); -+EXTERN void scalar_redraw(t_scalar *x, t_glist *glist); -+ -+/* ------helper routines for "garrays" and "plots" -------------- */ -+EXTERN int array_doclick(t_array *array, t_glist *glist, t_scalar *sc, t_array *ap, -+ t_symbol *elemtemplatesym, -+ t_float linewidth, t_float xloc, t_float xinc, t_float yloc, t_float scalarvis, -+ t_fielddesc *xfield, t_fielddesc *yfield, t_fielddesc *wfield, -+ int xpix, int ypix, int shift, int alt, int dbl, int doit); -+ -+EXTERN void array_getcoordinate(t_glist *glist, -+ char *elem, int xonset, int yonset, int wonset, int indx, -+ t_float basex, t_float basey, t_float xinc, -+ t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc, -+ t_float *xp, t_float *yp, t_float *wp); -+ -+EXTERN int array_getfields(t_symbol *elemtemplatesym, -+ t_canvas **elemtemplatecanvasp, -+ t_template **elemtemplatep, int *elemsizep, -+ t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc, -+ int *xonsetp, int *yonsetp, int *wonsetp); -+ -+/* --------------------- templates ------------------------- */ -+EXTERN t_template *template_new(t_symbol *sym, int argc, t_atom *argv); -+EXTERN void template_free(t_template *x); -+EXTERN int template_match(t_template *x1, t_template *x2); -+EXTERN int template_find_field(t_template *x, t_symbol *name, int *p_onset, -+ int *p_type, t_symbol **p_arraytype); -+EXTERN t_float template_getfloat(t_template *x, t_symbol *fieldname, t_word *wp, -+ int loud); -+EXTERN void template_setfloat(t_template *x, t_symbol *fieldname, t_word *wp, -+ t_float f, int loud); -+EXTERN t_symbol *template_getsymbol(t_template *x, t_symbol *fieldname, -+ t_word *wp, int loud); -+EXTERN void template_setsymbol(t_template *x, t_symbol *fieldname, -+ t_word *wp, t_symbol *s, int loud); -+ -+EXTERN t_template *gtemplate_get(t_gtemplate *x); -+EXTERN t_template *template_findbyname(t_symbol *s); -+EXTERN t_canvas *template_findcanvas(t_template *tmpl); -+EXTERN void template_notify(t_template *tmpl, -+ t_symbol *s, int argc, t_atom *argv); -+ -+EXTERN t_float template_getfloat(t_template *x, t_symbol *fieldname, -+ t_word *wp, int loud); -+EXTERN void template_setfloat(t_template *x, t_symbol *fieldname, -+ t_word *wp, t_float f, int loud); -+EXTERN t_symbol *template_getsymbol(t_template *x, t_symbol *fieldname, -+ t_word *wp, int loud); -+EXTERN void template_setsymbol(t_template *x, t_symbol *fieldname, -+ t_word *wp, t_symbol *s, int loud); -+EXTERN t_float fielddesc_getcoord(t_fielddesc *f, t_template *tmpl, -+ t_word *wp, int loud); -+EXTERN void fielddesc_setcoord(t_fielddesc *f, t_template *tmpl, -+ t_word *wp, t_float pix, int loud); -+EXTERN t_float fielddesc_cvttocoord(t_fielddesc *f, t_float val); -+EXTERN t_float fielddesc_cvtfromcoord(t_fielddesc *f, t_float coord); -+ -+ -+/* ----------------------- guiconnects, g_guiconnect.c --------- */ -+EXTERN t_guiconnect *guiconnect_new(t_pd *who, t_symbol *sym); -+EXTERN void guiconnect_notarget(t_guiconnect *x, double timedelay); -+ -+/* ------------- IEMGUI routines used in other g_ files ---------------- */ -+EXTERN t_symbol *iemgui_raute2dollar(t_symbol *s); -+EXTERN t_symbol *iemgui_dollar2raute(t_symbol *s); -+ -+#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus) -+} -+#endif diff -Nru pd-libdir-1.9/debian/patches/makefile_update_for_kfreebsd_and_hurd pd-libdir-1.10/debian/patches/makefile_update_for_kfreebsd_and_hurd --- pd-libdir-1.9/debian/patches/makefile_update_for_kfreebsd_and_hurd 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/patches/makefile_update_for_kfreebsd_and_hurd 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -Description: updated Makefile to build on kFreeBSD and Hurd - This patch takes the upstream template Makefile with new code for handling - building using kFreeBSD and Hurd kernels. This Makefile is already included - in the upstream SVN repository, but there is no new release yet. - -Author: Hans-Christoph Steiner -Bug-Debian: http://bugs.debian.org/605828 -Forwarded: not-needed -Reviewed-By: Hans-Christoph Steiner -Last-Update: <2010-12-09> - ---- pd-libdir-1.9.orig/Makefile -+++ pd-libdir-1.9/Makefile -@@ -1,4 +1,4 @@ --## Pd library template version 1.0.3 -+## Pd library template version 1.0.6 - # For instructions on how to use this template, see: - # http://puredata.info/docs/developer/MakefileTemplate - LIBRARY_NAME = libdir -@@ -31,7 +31,8 @@ - # - #------------------------------------------------------------------------------# - --CFLAGS = -DPD -I"$(PD_INCLUDE)" -Wall -W -g -+# -I"$(PD_INCLUDE)/pd" supports the header location for 0.43 -+CFLAGS = -I"$(PD_INCLUDE)/pd" -Wall -W -g - LDFLAGS = - LIBS = - -@@ -44,7 +45,7 @@ - # get library version from meta file - LIBRARY_VERSION = $(shell sed -n 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' $(LIBRARY_NAME)-meta.pd) - --CFLAGS += -DVERSION='"$(LIBRARY_VERSION)"' -+CFLAGS += -DPD -DVERSION='"$(LIBRARY_VERSION)"' - - PD_INCLUDE = $(PD_PATH)/include - # where to install the library, overridden below depending on platform -@@ -62,7 +63,7 @@ - $(SOURCES_iphoneos) $(SOURCES_linux) $(SOURCES_windows) - - DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION) --ORIGDIR=pd-$(LIBRARY_NAME)_$(LIBRARY_VERSION) -+ORIGDIR=pd-$(LIBRARY_NAME:~=)_$(LIBRARY_VERSION) - - UNAME := $(shell uname -s) - ifeq ($(UNAME),Darwin) -@@ -121,6 +122,34 @@ - STRIP = strip --strip-unneeded -R .note -R .comment - DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m) - endif -+ifeq ($(UNAME),GNU) -+ # GNU/Hurd, should work like GNU/Linux for basically all externals -+ CPU := $(shell uname -m) -+ SOURCES += $(SOURCES_linux) -+ EXTENSION = pd_linux -+ OS = linux -+ PD_PATH = /usr -+ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer -+ CFLAGS += -fPIC -+ LDFLAGS += -Wl,--export-dynamic -shared -fPIC -+ LIBS += -lc -+ STRIP = strip --strip-unneeded -R .note -R .comment -+ DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m) -+endif -+ifeq ($(UNAME),GNU/kFreeBSD) -+ # Debian GNU/kFreeBSD, should work like GNU/Linux for basically all externals -+ CPU := $(shell uname -m) -+ SOURCES += $(SOURCES_linux) -+ EXTENSION = pd_linux -+ OS = linux -+ PD_PATH = /usr -+ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer -+ CFLAGS += -fPIC -+ LDFLAGS += -Wl,--export-dynamic -shared -fPIC -+ LIBS += -lc -+ STRIP = strip --strip-unneeded -R .note -R .comment -+ DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m) -+endif - ifeq (CYGWIN,$(findstring CYGWIN,$(UNAME))) - CPU := $(shell uname -m) - SOURCES += $(SOURCES_cygwin) diff -Nru pd-libdir-1.9/debian/patches/series pd-libdir-1.10/debian/patches/series --- pd-libdir-1.9/debian/patches/series 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -add_required_headers.patch -makefile_update_for_kfreebsd_and_hurd diff -Nru pd-libdir-1.9/debian/rules pd-libdir-1.10/debian/rules --- pd-libdir-1.9/debian/rules 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/rules 2017-01-14 21:33:52.000000000 +0000 @@ -5,13 +5,33 @@ pkglibdir = /usr/lib/pd/extra %: - dh --with quilt $@ --buildsystem=makefile + dh $@ --buildsystem=makefile + +override_dh_auto_build: + dh_auto_build -- \ + arch.flags="" \ + CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS) -Wl,-as-needed" \ + $(empty) override_dh_auto_install: dh_auto_install -- prefix=/usr pkglibdir=$(pkglibdir) +# fix permissions + find $(CURDIR)/debian/$(PACKAGE) -name "*.pd_linux" -exec \ + chmod 0664 {} + # replace license file with link to the Debian license file rm -f -- $(CURDIR)/debian/$(PACKAGE)/$(pkglibdir)/$(LIBRARY_NAME)/LICENSE.txt override_dh_shlibdeps: - dpkg-shlibdeps $(CURDIR)/debian/$(PACKAGE)$(pkglibdir)/$(LIBRARY_NAME)/*.pd_linux \ - -T$(CURDIR)/debian/$(PACKAGE).substvars + find $(CURDIR)/debian/$(PACKAGE) -name "*.pd_linux" -exec \ + dpkg-shlibdeps \ + -T$(CURDIR)/debian/$(PACKAGE).substvars \ + {} + +override_dh_strip: + dh_strip + find $(CURDIR)/debian/$(PACKAGE) -name "*.pd_linux" -exec \ + strip \ + --remove-section=.comment \ + --remove-section=.note \ + --strip-unneeded \ + {} + diff -Nru pd-libdir-1.9/debian/watch pd-libdir-1.10/debian/watch --- pd-libdir-1.9/debian/watch 2011-06-11 22:56:03.000000000 +0000 +++ pd-libdir-1.10/debian/watch 2017-01-14 21:33:52.000000000 +0000 @@ -1,2 +1,3 @@ version=3 -http://sf.net/pure-data/libdir-(.*)\.tar\.gz +opts=dversionmangle=s/[~+](dfsg|repack)(\.[0-9]*)?$// \ + https://github.com/pure-data/libdir/releases .*/v?(\d\S*)\.tar\.gz diff -Nru pd-libdir-1.9/libdir.c pd-libdir-1.10/libdir.c --- pd-libdir-1.9/libdir.c 2010-09-13 18:19:48.000000000 +0000 +++ pd-libdir-1.10/libdir.c 2017-01-14 19:54:02.000000000 +0000 @@ -10,7 +10,7 @@ /* WARNING: KLUDGE! */ /* * this struct is not publically defined (its in g_canvas.c) so I need to - * include this here. Its from Pd 0.41-test03 2006-11-19. */ + * include this here. Its from Pd 0.47-0. */ struct _canvasenvironment { t_symbol *ce_dir; /* directory patch lives in */ @@ -21,7 +21,13 @@ }; -static char *version = "1.9"; +static char *version = +#ifdef VERSION + VERSION +#else + "unknown" +#endif + ; /* This loader opens a directory with a -meta.pd file as a library. In the * long run, the idea is that one folder will have all of objects files, all @@ -37,71 +43,124 @@ * to have one directory hold the objects, help files, manuals, * etc. making it a self-contained library. */ +/* + * TODO + * - get 'declare' messages from the meta-file, and send them to the current canvas + */ +static void libdir_get_fullname(char*dest, size_t size, const char*classname) { + snprintf(dest, size-1, "%s/%s-meta", classname, classname); + dest[size-1]=0; +} +static int libdir_add_to_path(const char*dirbuf, t_canvas*canvas) { + if(sys_isabsolutepath(dirbuf)) { // only include actual full paths + if (canvas) { + t_canvasenvironment *canvasenvironment = canvas_getenv(canvas); + canvasenvironment->ce_path = namelist_append(canvasenvironment->ce_path, + dirbuf, 0); + } else { + sys_searchpath = namelist_append(sys_searchpath, dirbuf, 0); + } + return 1; + } + return 0; +} -static int libdir_loader(t_canvas *canvas, char *classname) +static int libdir_loader_legacy(t_canvas *canvas, char *classname) { int fd = -1; - char helppathname[FILENAME_MAX]; char fullclassname[FILENAME_MAX], dirbuf[FILENAME_MAX]; char *nameptr; - t_canvasenvironment *canvasenvironment; /* look for meta file (classname)/(classname)-meta.pd */ - strncpy(fullclassname, classname, FILENAME_MAX - 6); - strcat(fullclassname, "/"); - strncat(fullclassname, classname, FILENAME_MAX - strlen(fullclassname) - 6); - strcat(fullclassname, "-meta"); - + libdir_get_fullname(fullclassname, FILENAME_MAX, classname); + /* if this is being called from a canvas, then add the library path to the * canvas-local path */ - if(canvas) - { - canvasenvironment = canvas_getenv(canvas); - /* setting the canvas to NULL causes it to ignore any canvas-local path */ - if ((fd = canvas_open(NULL, fullclassname, ".pd", - dirbuf, &nameptr, FILENAME_MAX, 0)) < 0) - { - return (0); - } - close(fd); - if(sys_isabsolutepath(dirbuf)) // only include actual full paths - canvasenvironment->ce_path = namelist_append(canvasenvironment->ce_path, - dirbuf, 0); - if(sys_verbose) - post("libdir_loader: added '%s' to the canvas-local objectclass path", - classname); - } + if(canvas) + /* setting the canvas to NULL causes it to ignore any canvas-local path */ + fd = canvas_open(NULL, fullclassname, ".pd", + dirbuf, &nameptr, FILENAME_MAX, 0); else + fd = open_via_path(".", fullclassname, ".pd", + dirbuf, &nameptr, FILENAME_MAX, 0); + if(fd < 0) { - if ((fd = open_via_path(".", fullclassname, ".pd", - dirbuf, &nameptr, FILENAME_MAX, 0)) < 0) - { - return (0); - } - close(fd); - sys_searchpath = namelist_append(sys_searchpath, dirbuf, 0); - strncpy(helppathname, sys_libdir->s_name, FILENAME_MAX-30); - helppathname[FILENAME_MAX-30] = 0; - strcat(helppathname, "/doc/5.reference/"); - strcat(helppathname, classname); - sys_helppath = namelist_append(sys_helppath, helppathname, 0); - post("libdir_loader: added '%s' to the global objectclass path", - classname); -// post("\tThis is deprecated behavior."); + return (0); + } + sys_close(fd); +#if 0 + if(!canvas) { + char helppathname[FILENAME_MAX]; + strncpy(helppathname, sys_libdir->s_name, FILENAME_MAX-30); + helppathname[FILENAME_MAX-30] = 0; + strcat(helppathname, "/doc/5.reference/"); + strcat(helppathname, classname); + sys_helppath = namelist_append(sys_helppath, helppathname, 0); + } +#endif + if(libdir_add_to_path(dirbuf, canvas)) + logpost(NULL, 3, "libdir_loader: added '%s' to the %s objectclass path", + classname, canvas?"canvas-local":"global"); + + /* post("libdir_loader loaded fullclassname: '%s'\n", fullclassname); */ + logpost(NULL, 14, "Loaded libdir '%s' from '%s'", classname, dirbuf); + + return (1); +} + +static int libdir_loader_pathwise(t_canvas *canvas, const char *classname, const char*path) +{ + int fd = -1; + char fullclassname[FILENAME_MAX], dirbuf[FILENAME_MAX]; + char *nameptr; + + if(!path) { + /* we already tried all paths, so skip this */ + return 0; + } + + /* look for meta file (classname)/(classname)-meta.pd */ + libdir_get_fullname(fullclassname, FILENAME_MAX, classname); + + if ((fd = sys_trytoopenone(path, fullclassname, ".pd", + dirbuf, &nameptr, FILENAME_MAX, 0)) < 0) { + return 0; } + sys_close(fd); + if(libdir_add_to_path(dirbuf, canvas)) + logpost(NULL, 3, "libdir_loader: added '%s' to the %s objectclass path", + classname, canvas?"canvas-local":"global"); + /* post("libdir_loader loaded fullclassname: '%s'\n", fullclassname); */ - if (sys_verbose) - post("Loaded libdir '%s' from '%s'", classname, dirbuf); + logpost(NULL, 14, "Loaded libdir '%s' from '%s'", classname, dirbuf); return (1); } +static t_class *libdir_class; +static void*libdir_new(void) +{ + t_pd *x = pd_new(libdir_class); + return (x); +} + void libdir_setup(void) { -/* relies on t.grill's loader functionality, fully added in 0.40 */ - sys_register_loader(libdir_loader); - post("libdir loader %s",version); - post("\tcompiled on "__DATE__" at "__TIME__ " "); - post("\tcompiled against Pd version %d.%d.%d.%s", PD_MAJOR_VERSION, - PD_MINOR_VERSION, PD_BUGFIX_VERSION, PD_TEST_VERSION); + int major, minor, bugfix; + sys_getversion(&major, &minor, &bugfix); + if (major>0 || minor >=47) { + sys_register_loader(libdir_loader_pathwise); + } else { + sys_register_loader(libdir_loader_legacy); + } + logpost(NULL, 3, "libdir loader %s",version); + logpost(NULL, 3, "\tcompiled on "__DATE__" at "__TIME__ " "); + logpost(NULL, 3, "\tcompiled against Pd version %d.%d.%d.%s", + PD_MAJOR_VERSION, PD_MINOR_VERSION, PD_BUGFIX_VERSION, PD_TEST_VERSION); + libdir_class = class_new(gensym("libdir"), libdir_new, 0, sizeof(t_object), CLASS_NOINLET, 0); +} + +void setup(void) +{ + libdir_setup(); } diff -Nru pd-libdir-1.9/libdir-help.pd pd-libdir-1.10/libdir-help.pd --- pd-libdir-1.9/libdir-help.pd 1970-01-01 00:00:00.000000000 +0000 +++ pd-libdir-1.10/libdir-help.pd 2017-01-14 19:54:02.000000000 +0000 @@ -0,0 +1,16 @@ +#N canvas 548 257 652 468 10; +#X text 75 37 libdir - loader for libraries adherent to the libdir +standard; +#X text 58 130 The 'libdir' loader is a Pd loader which supports the +libdir library format. The libdir library format aims to be a common +library format for Pd which works with objects written in any language +\, including Pd. This library format was designed to be easy to create +\, install \, and use. It should work when installed into the global +path (i.e. pd/extra) or when copied locally into a project folder. +It should work with objects written in any supported language (i.e. +binaries \, .pd \, and the various loaders like pdlua and tclpd). Also +\, starting with Pd 0.43 and Pd-extended 0.42 \, the Help Browser dynamically +builds itself based on the libraries that are installed.; +#X text 119 321 http://puredata.org/docs/developer/Libdir; +#X obj 73 374 libdir; +#X text 130 373 this object doesn't have any functionality.; diff -Nru pd-libdir-1.9/libdir-meta.pd pd-libdir-1.10/libdir-meta.pd --- pd-libdir-1.9/libdir-meta.pd 2010-09-11 17:24:40.000000000 +0000 +++ pd-libdir-1.10/libdir-meta.pd 2017-01-14 19:54:02.000000000 +0000 @@ -2,6 +2,6 @@ #N canvas 25 49 420 300 META 1; #X text 10 10 NAME libdir; #X text 10 30 AUTHOR hans@eds.org; -#X text 10 50 VERSION 1.9; +#X text 10 50 VERSION 1.10; #X text 10 70 LICENSE BSD; #X restore 10 10 pd META; diff -Nru pd-libdir-1.9/Makefile pd-libdir-1.10/Makefile --- pd-libdir-1.9/Makefile 2010-09-12 19:13:38.000000000 +0000 +++ pd-libdir-1.10/Makefile 2017-01-14 19:54:02.000000000 +0000 @@ -1,295 +1,33 @@ -## Pd library template version 1.0.3 -# For instructions on how to use this template, see: -# http://puredata.info/docs/developer/MakefileTemplate -LIBRARY_NAME = libdir - -# add your .c source files, one object per file, to the SOURCES -# variable, help files will be included automatically -SOURCES = libdir.c - -# list all pd objects (i.e. myobject.pd) files here, and their helpfiles will -# be included automatically -PDOBJECTS = - -# example patches and related files, in the 'examples' subfolder -EXAMPLES = - -# manuals and related files, in the 'manual' subfolder -MANUAL = - -# if you want to include any other files in the source and binary tarballs, -# list them here. This can be anything from header files, test patches, -# documentation, etc. README.txt and LICENSE.txt are required and therefore -# automatically included -EXTRA_DIST = TODO.txt - -# NOTE: removed help patch requirement, since this is a loader - -#------------------------------------------------------------------------------# -# -# things you might need to edit if you are using other C libraries -# -#------------------------------------------------------------------------------# - -CFLAGS = -DPD -I"$(PD_INCLUDE)" -Wall -W -g -LDFLAGS = -LIBS = - -#------------------------------------------------------------------------------# -# -# you shouldn't need to edit anything below here, if we did it right :) -# -#------------------------------------------------------------------------------# - -# get library version from meta file -LIBRARY_VERSION = $(shell sed -n 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' $(LIBRARY_NAME)-meta.pd) - -CFLAGS += -DVERSION='"$(LIBRARY_VERSION)"' - -PD_INCLUDE = $(PD_PATH)/include -# where to install the library, overridden below depending on platform -prefix = /usr/local -libdir = $(prefix)/lib -pkglibdir = $(libdir)/pd-externals -objectsdir = $(pkglibdir) - -INSTALL = install -INSTALL_PROGRAM = $(INSTALL) -p -m 644 -INSTALL_DATA = $(INSTALL) -p -m 644 -INSTALL_DIR = $(INSTALL) -p -m 755 -d - -ALLSOURCES := $(SOURCES) $(SOURCES_android) $(SOURCES_cygwin) $(SOURCES_macosx) \ - $(SOURCES_iphoneos) $(SOURCES_linux) $(SOURCES_windows) - -DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION) -ORIGDIR=pd-$(LIBRARY_NAME)_$(LIBRARY_VERSION) - -UNAME := $(shell uname -s) -ifeq ($(UNAME),Darwin) - CPU := $(shell uname -p) - ifeq ($(CPU),arm) # iPhone/iPod Touch - SOURCES += $(SOURCES_iphoneos) - EXTENSION = pd_darwin - OS = iphoneos - PD_PATH = /Applications/Pd-extended.app/Contents/Resources - IPHONE_BASE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin - CC=$(IPHONE_BASE)/gcc - CPP=$(IPHONE_BASE)/cpp - CXX=$(IPHONE_BASE)/g++ - ISYSROOT = -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk - IPHONE_CFLAGS = -miphoneos-version-min=3.0 $(ISYSROOT) -arch armv6 - OPT_CFLAGS = -fast -funroll-loops -fomit-frame-pointer - CFLAGS := $(IPHONE_CFLAGS) $(OPT_CFLAGS) $(CFLAGS) - LDFLAGS += -arch armv6 -bundle -undefined dynamic_lookup $(ISYSROOT) - LIBS += -lc - STRIP = strip -x - DISTBINDIR=$(DISTDIR)-$(OS) - else # Mac OS X - SOURCES += $(SOURCES_macosx) - EXTENSION = pd_darwin - OS = macosx - PD_PATH = /Applications/Pd-extended.app/Contents/Resources - OPT_CFLAGS = -ftree-vectorize -ftree-vectorizer-verbose=2 -fast -# build universal 32-bit on 10.4 and 32/64 on newer - ifeq ($(shell uname -r | sed 's|\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*|\1|'), 8) - FAT_FLAGS = -arch ppc -arch i386 -mmacosx-version-min=10.4 - else - FAT_FLAGS = -arch ppc -arch i386 -arch x86_64 -mmacosx-version-min=10.4 - SOURCES += $(SOURCES_iphoneos) - endif - CFLAGS += $(FAT_FLAGS) -fPIC -I/sw/include - LDFLAGS += $(FAT_FLAGS) -bundle -undefined dynamic_lookup -L/sw/lib - # if the 'pd' binary exists, check the linking against it to aid with stripping - LDFLAGS += $(shell test -e $(PD_PATH)/bin/pd && echo -bundle_loader $(PD_PATH)/bin/pd) - LIBS += -lc - STRIP = strip -x - DISTBINDIR=$(DISTDIR)-$(OS) -# install into ~/Library/Pd on Mac OS X since /usr/local isn't used much - pkglibdir=$(HOME)/Library/Pd - endif -endif -ifeq ($(UNAME),Linux) - CPU := $(shell uname -m) - SOURCES += $(SOURCES_linux) - EXTENSION = pd_linux - OS = linux - PD_PATH = /usr - OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer - CFLAGS += -fPIC - LDFLAGS += -Wl,--export-dynamic -shared -fPIC - LIBS += -lc - STRIP = strip --strip-unneeded -R .note -R .comment - DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m) -endif -ifeq (CYGWIN,$(findstring CYGWIN,$(UNAME))) - CPU := $(shell uname -m) - SOURCES += $(SOURCES_cygwin) - EXTENSION = dll - OS = cygwin - PD_PATH = $(cygpath $(PROGRAMFILES))/pd - OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer - CFLAGS += - LDFLAGS += -Wl,--export-dynamic -shared -L"$(PD_PATH)/src" -L"$(PD_PATH)/bin" - LIBS += -lc -lpd - STRIP = strip --strip-unneeded -R .note -R .comment - DISTBINDIR=$(DISTDIR)-$(OS) -endif -ifeq (MINGW,$(findstring MINGW,$(UNAME))) - CPU := $(shell uname -m) - SOURCES += $(SOURCES_windows) - EXTENSION = dll - OS = windows - PD_PATH = $(shell cd "$(PROGRAMFILES)"/pd && pwd) - OPT_CFLAGS = -O3 -funroll-loops -fomit-frame-pointer -march=i686 -mtune=pentium4 - CFLAGS += -mms-bitfields - LDFLAGS += -s -shared -Wl,--enable-auto-import - LIBS += -L"$(PD_PATH)/src" -L"$(PD_PATH)/bin" -L"$(PD_PATH)/obj" -lpd -lwsock32 -lkernel32 -luser32 -lgdi32 - STRIP = strip --strip-unneeded -R .note -R .comment - DISTBINDIR=$(DISTDIR)-$(OS) -endif - -# in case somebody manually set the HELPPATCHES above -HELPPATCHES ?= $(SOURCES:.c=-help.pd) $(PDOBJECTS:.c=-help.pd) - -CFLAGS += $(OPT_CFLAGS) - - -.PHONY = install libdir_install single_install install-doc install-exec install-examples install-manual clean dist etags $(LIBRARY_NAME) - -all: $(SOURCES:.c=.$(EXTENSION)) - -%.o: %.c - $(CC) $(CFLAGS) -o "$*.o" -c "$*.c" - -%.$(EXTENSION): %.o - $(CC) $(LDFLAGS) -o "$*.$(EXTENSION)" "$*.o" $(LIBS) - chmod a-x "$*.$(EXTENSION)" - -# this links everything into a single binary file -$(LIBRARY_NAME): $(SOURCES:.c=.o) $(LIBRARY_NAME).o - $(CC) $(LDFLAGS) -o $(LIBRARY_NAME).$(EXTENSION) $(SOURCES:.c=.o) $(LIBRARY_NAME).o $(LIBS) - chmod a-x $(LIBRARY_NAME).$(EXTENSION) - -install: libdir_install - -# The meta and help files are explicitly installed to make sure they are -# actually there. Those files are not optional, then need to be there. -libdir_install: $(SOURCES:.c=.$(EXTENSION)) install-doc install-examples install-manual - $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) - $(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd \ - $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) - test -z "$(strip $(SOURCES))" || (\ - $(INSTALL_PROGRAM) $(SOURCES:.c=.$(EXTENSION)) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) && \ - $(STRIP) $(addprefix $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/,$(SOURCES:.c=.$(EXTENSION)))) - test -z "$(strip $(PDOBJECTS))" || \ - $(INSTALL_DATA) $(PDOBJECTS) \ - $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) - -# install library linked as single binary -single_install: $(LIBRARY_NAME) install-doc install-exec - $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) - $(INSTALL_PROGRAM) $(LIBRARY_NAME).$(EXTENSION) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) - $(STRIP) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/$(LIBRARY_NAME).$(EXTENSION) - -install-doc: - $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) -# test -z "$(strip $(SOURCES) $(PDOBJECTS))" || \ -# $(INSTALL_DATA) $(HELPPATCHES) \ -# $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) - $(INSTALL_DATA) README.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/README.txt - $(INSTALL_DATA) LICENSE.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/LICENSE.txt - -install-examples: - test -z "$(strip $(EXAMPLES))" || \ - $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples && \ - for file in $(EXAMPLES); do \ - $(INSTALL_DATA) examples/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples; \ - done - -install-manual: - test -z "$(strip $(MANUAL))" || \ - $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual && \ - for file in $(MANUAL); do \ - $(INSTALL_DATA) manual/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual; \ - done - - -clean: - -rm -f -- $(SOURCES:.c=.o) $(SOURCES_LIB:.c=.o) - -rm -f -- $(SOURCES:.c=.$(EXTENSION)) - -rm -f -- $(LIBRARY_NAME).o - -rm -f -- $(LIBRARY_NAME).$(EXTENSION) - -distclean: clean - -rm -f -- $(DISTBINDIR).tar.gz - -rm -rf -- $(DISTBINDIR) - -rm -f -- $(DISTDIR).tar.gz - -rm -rf -- $(DISTDIR) - -rm -f -- $(ORIGDIR).tar.gz - -rm -rf -- $(ORIGDIR) - - -$(DISTBINDIR): - $(INSTALL_DIR) $(DISTBINDIR) - -$(DISTDIR): - $(INSTALL_DIR) $(DISTDIR) - -$(ORIGDIR): - $(INSTALL_DIR) $(ORIGDIR) - -dist: $(DISTDIR) - $(INSTALL_DATA) Makefile $(DISTDIR) - $(INSTALL_DATA) README.txt $(DISTDIR) - $(INSTALL_DATA) LICENSE.txt $(DISTDIR) - $(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd $(DISTDIR) - test -z "$(strip $(ALLSOURCES))" || \ - $(INSTALL_DATA) $(ALLSOURCES) $(DISTDIR) - test -z "$(strip $(PDOBJECTS))" || \ - $(INSTALL_DATA) $(PDOBJECTS) $(DISTDIR) -# test -z "$(strip $(HELPPATCHES))" || \ - $(INSTALL_DATA) $(HELPPATCHES) $(DISTDIR) - test -z "$(strip $(EXTRA_DIST))" || \ - $(INSTALL_DATA) $(EXTRA_DIST) $(DISTDIR) - test -z "$(strip $(EXAMPLES))" || \ - $(INSTALL_DIR) $(DISTDIR)/examples && \ - for file in $(EXAMPLES); do \ - $(INSTALL_DATA) examples/$$file $(DISTDIR)/examples; \ - done - test -z "$(strip $(MANUAL))" || \ - $(INSTALL_DIR) $(DISTDIR)/manual && \ - for file in $(MANUAL); do \ - $(INSTALL_DATA) manual/$$file $(DISTDIR)/manual; \ - done - tar --exclude-vcs -czpf $(DISTDIR).tar.gz $(DISTDIR) - -# make a Debian source package -dpkg-source: - debclean - make distclean dist - mv $(DISTDIR) $(ORIGDIR) - tar --exclude-vcs -czpf ../$(ORIGDIR).orig.tar.gz $(ORIGDIR) - rm -f -- $(DISTDIR).tar.gz - rm -rf -- $(DISTDIR) $(ORIGDIR) - cd .. && dpkg-source -b $(LIBRARY_NAME) - -etags: - etags *.h $(SOURCES) ../../pd/src/*.[ch] /usr/include/*.h /usr/include/*/*.h - -showsetup: - @echo "CFLAGS: $(CFLAGS)" - @echo "LDFLAGS: $(LDFLAGS)" - @echo "LIBS: $(LIBS)" - @echo "PD_INCLUDE: $(PD_INCLUDE)" - @echo "PD_PATH: $(PD_PATH)" - @echo "objectsdir: $(objectsdir)" - @echo "LIBRARY_NAME: $(LIBRARY_NAME)" - @echo "LIBRARY_VERSION: $(LIBRARY_VERSION)" - @echo "SOURCES: $(SOURCES)" - @echo "PDOBJECTS: $(PDOBJECTS)" - @echo "ALLSOURCES: $(ALLSOURCES)" - @echo "UNAME: $(UNAME)" - @echo "CPU: $(CPU)" - @echo "pkglibdir: $(pkglibdir)" - @echo "DISTDIR: $(DISTDIR)" - @echo "ORIGDIR: $(ORIGDIR)" +#!/usr/bin/make -f +# Makefile to the 'libdir' library for Pure Data. +# Needs Makefile.pdlibbuilder as helper makefile for platform-dependent build +# settings and rules (https://github.com/pure-data/pd-lib-builder). + +lib.name = libdir + +# special file that does not provide a class +lib.setup.sources = + +# all other C and C++ files in subdirs are source files per class +# (alternatively, enumerate them by hand) +class.sources = libdir.c + +datafiles = \ +TODO.txt \ +LICENSE.txt \ +README.txt \ +libdir-meta.pd + +datadirs = + +cflags = -DVERSION='"$(lib.version)"' + +################################################################################ +### pdlibbuilder ############################################################### +################################################################################ + +# This Makefile is based on the Makefile from pd-lib-builder written by +# Katja Vetter. You can get it from: +# https://github.com/pure-data/pd-lib-builder +PDLIBBUILDER_DIR=. +include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder diff -Nru pd-libdir-1.9/Makefile.pdlibbuilder pd-libdir-1.10/Makefile.pdlibbuilder --- pd-libdir-1.9/Makefile.pdlibbuilder 1970-01-01 00:00:00.000000000 +0000 +++ pd-libdir-1.10/Makefile.pdlibbuilder 2017-01-14 19:54:02.000000000 +0000 @@ -0,0 +1,1215 @@ +# Makefile.pdlibbuilder dated 2016-11-02 +version = 0.4.3 + +# 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 + + +################################################################################ +### variables per platform ##################################################### +################################################################################ + + +#=== flags per architecture ==================================================== + + +# Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, +# arch.c.flags are overriden below. + +machine := $(shell uname -m) + +# Raspberry Pi 1st generation +ifeq ($(machine), armv6l) + arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard +endif + +# Beagle, Udoo, RPi2 etc. +ifeq ($(machine), armv7l) + arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard +endif + +# Intel 32 bit, build with SSE and SSE2 instructions +ifeq ($(findstring $(machine), i386 i686), $(machine)) + arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 +endif + +# Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions +ifeq ($(findstring $(machine), ia64 x86_64), $(machine)) + arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 +endif + + +#=== operating system ========================================================== + + +# The following systems are defined: Linux, Darwin, Windows. GNU and +# GNU/kFreeBSD are treated as Linux to get the same options. System-specific +# multiline defines (optionally set in library makefile) are conditionally +# evaluated here. + +uname := $(shell uname) + +ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) + system = Linux + $(eval $(forLinux)) +endif + +ifeq ($(uname), Darwin) + system = Darwin + $(eval $(forDarwin)) +endif + +ifeq ($(findstring MINGW, $(uname)), MINGW) + system = Windows + $(eval $(forWindows)) +endif + +# TODO: Cygwin, Android + + +#=== 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 ($(machine), i386) + cxx.flags := -fcheck-new + arch := ppc i386 x86_64 + version.flag ?= -mmacosx-version-min=10.4 + endif + ifeq ($(machine), 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 + +# On Windows we build 32 bit by default to match Pd(-extended) binary +# distributions. This may change in the future. +# TODO: decide whether -mms-bitfields should be specified. +ifeq ($(system), Windows) + extension = dll + CC = gcc + CXX = g++ + arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse + cpp.flags := -DMSW -DNT + 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: +