[PD] linking libs in extern development

david medine dmedine at ucsd.edu
Fri Jan 21 04:34:44 CET 2011


Sorry to have cluttered the list with all this nonsense, but I solved my 
problem all by my lonesome. It is all kludge, but it works. The elegant 
solution (I think) is to write a nice .configure script that will 
generate exactly the right makefile regardless of os and configuration, 
but I don't know how to do that.

So, in the meantime one way to link libraries when building Pd externs 
(this is for Mac, but it should be pretty much the same on any Unix 
outfit) is like this:
modify the file

'/'whatever'/Pd.etc/Contents/Resources/extra/makefile'

so that the first line reads:

'current: pd_darwin'

then in the section that sets the rules and recipes for building on make 
it looks so:

'pd_darwin: $(NAME).pd_darwin

.SUFFIXES: .pd_darwin

DARWINCFLAGS = -DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \
     -Wno-unused -Wno-parentheses -Wno-switch

.c.pd_darwin:
     $(CC) -arch i386  $(DARWINCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c
     $(CC) -arch i386 $(LIBS) -bundle -undefined suppress -flat_namespace \
         -o $*.pd_darwin $*.o
     rm -f $*.o'

I took out all the '.d_ppc' and '-arch ppc' stuff that's in the makefile 
that comes with Pd (vanilla) because I have an intel core so ppc junk is 
irrelevant. I changed .d_fat to .pd_darwin, because somebody who 
actually knows stuff (unlike me) told me that .pd_darwin is the current 
convention. The variable 'LINUXINCLUDE' is simply '-I../../src' and is 
here recycled from a previous definition in the makefile. It has nothing 
to do with linux whatsoever. It just tells the compiler to look at the 
Pd source code when you hit make on your external. The other big change 
I made is inserting the 'LIBS' variable in the second build phase 
instruction which I shall explain below. It is a simple matter to 
implement analogous modifications in the other unix-ish portions of the 
makefile, but I haven't tested it yet. I don't know anything about 
Windows...

Now that the pd makefile is ready to go, go into your extern project 
directory and make a makefile there that looks like so:

'NAME=awesomeExtern
CSYM=awesomeExtern

include /'whatever'/Pd.etc/Contents/Resources/extra/makefile

DARWINCFLAGS += -I/path/to/awesome-library/headers etc.
LIBS = -L/path/to/awesome-library -lawesomelibrary etc.'

I put 'etc.' in there because there may be more than one header file or 
library that you want to use. You can discover what you need by putting

'pkg-config --cflags awesomelibraryA awesomelibraryB etc.'

into the command line. These return values are what you want to /add/ 
(note the '+=') to the 'DARWINCFLAGS' variable. Likewise the return of

'pkg-config --libs awesomelibraryA awesomelibraryB etc.'

is what you want to be associated with the 'LIBS' variable. On Mac osx 5 
(don't know about 6), the path is usually /opt/local/include and 
/opt/local/lib. On Unix/Linux I believe it is typically 
/usr/local/include and /usr/local/lib where libraries get installed.

Sorry if this is old-hat to all the C honchos out there and irrelevant 
to everyone else (as I suspect is the case). I'm sure it is about a 
million times easier if you use Xcode to develop your externs, but then 
you would have to use Xcode. If this is helpful/relevant to people I'd 
be happy to clean up this little tutorial and post it to the Pd wiki.

Best,
David


On 1/20/11 4:55 PM, david medine wrote:
>
> OK, nuts to that. First, I must correct myself, the makefile I am 
> referring to is in the Pd.etc.app/Contents/Resources/extra folder. (By 
> the way, I am at home working on my Mac right now, I haven't tried 
> this on my beastly linux box at all yet and so I am not sure what all 
> the details of this issue are there off the top of my head.)
>
> Also, I went ahead and dropped the -c flag from the makefile (this 
> flag stops linking altogether when make is run) and apparently when 
> you do this, the extern won't build at all! I think this has something 
> to do with the fact that in this mode, gcc needs to link with all the 
> Pd objects also, (because terminal tells me so...) but this 
> explanation doesn't really make sense to me.
>
> Does anyone know how to tweak the makefile (or any clean method, for 
> that matter) so that one can link libraries to externals?
> Thanks again,
> David
>
> On 1/20/11 4:02 PM, david medine wrote:
>> Dear folks,
>> Does anybody know a good way to link libraries in a Pd extern build? 
>> I am using plain ol' command line and makefiles. It would be nice to 
>> be able to do this without modifying the Makefile in the 
>> Pd.etc./Contents/Resources/ directory, but due to my general 
>> ignorance of programming lore, I don't really know how to do this. 
>> Any suggestions?
>> Thanks,
>> David Medine
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-list/attachments/20110120/edf7e4b9/attachment.htm>


More information about the Pd-list mailing list