Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compile VAMP Plugins to iOS ARMV7

VAMP Plugins by Queen Mary University of London is an amazing collection of BSD licensed software. All these plugins are at the basis of the Sonic Visualizer software A plug Sdk to build plugins is available as well.

You can build the plugins for OSX / Linux / Win32 targets.

Queen Mart University explain well here the plugin architecture and how to build for different platforms specified above.

A Java version, jVamp is available as well. A Python wrapper also.

But, how to build for the iOS platform ?

So, I tried porting the Makefile to the iOS.

First I changed the file

build/osx/Makefile.osx

in this way:

CFLAGS := -O3 -ftree-vectorize -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch x86_64 -I../vamp-plugin-sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS

CXXFLAGS  := $(CFLAGS)

LDFLAGS   := -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch x86_64 -lqm-dsp ../vamp-plugin-sdk/libvamp-sdk.a -framework Accelerate -lpthread -exported_symbols_list=vamp-plugin.list -install_name qm-vamp-plugins.a

PLUGIN_EXT   := .a

include build/general/Makefile.inc

Then build

macbookproloreto:qm-vamp-plugins loreto$ make -f build/osx/Makefile.osx
cc -O3 -ftree-vectorize -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch x86_64 -I../vamp-plugin-sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS -I. -I../qm-dsp   -c -o g2cstubs.o g2cstubs.c
c++ -O3 -ftree-vectorize -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch x86_64 -I../vamp-plugin-sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS -I. -I../qm-dsp   -c -o plugins/AdaptiveSpectrogram.o plugins/AdaptiveSpectrogram.cpp
In file included from plugins/AdaptiveSpectrogram.cpp:15:
In file included from plugins/AdaptiveSpectrogram.h:18:
In file included from ../vamp-plugin-sdk/vamp-sdk/Plugin.h:40:
In file included from /usr/bin/../lib/c++/v1/string:430:
In file included from /usr/bin/../lib/c++/v1/iosfwd:90:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/wchar.h:70:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/_types.h:27:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/sys/_types.h:32:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/sys/cdefs.h:655:2: **error: Unsupported
      architecture
#error Unsupported architecture
 ^**

The first issue here is that there is a unsupported architecture.

So the plugins depends on the SDK I had to build that one first:

cd /Users/loreto/Projects/AUDIO/VAMP/vamp-plugin-sdk
make -f build/Makefile.osx

Different errors occurred since I had no OGG/VORBIS library and no LOGG library. So I slightly modified the Makefile.osx removing these dependencies in the HOST_LIB flags. I had to keep libsndfile anyway:

HOST_LIBS       = ./libvamp-hostsdk.a -L../10.8/inst/lib -lsndfile -ldl

So I was able to build the static libraries here:

macbookproloreto:vamp-plugin-sdk loreto$ ls -l *.a
-rw-r--r--  1 loreto  staff  709840 17 Ott 23:56 libvamp-hostsdk.a
-rw-r--r--  1 loreto  staff  183720 17 Ott 23:56 libvamp-sdk.a

Of course these static libs are targeted to arch x86_64 so I need to add armv7 arch:

ARCHFLAGS = -mmacosx-version-min=$(MINVERSION) -arch x86_64 -arch armv7

Then make clean and compile again

macbookproloreto:vamp-plugin-sdk loreto$ make -f build/Makefile.osx clean
macbookproloreto:vamp-plugin-sdk loreto$ make -f build/Makefile.osx
c++ -mmacosx-version-min=10.8 -arch x86_64 -arch armv7 -O2 -Wall -I. -I../10.8/inst/include -fPIC   -c -o src/vamp-sdk/PluginAdapter.o src/vamp-sdk/PluginAdapter.cpp
In file included from src/vamp-sdk/PluginAdapter.cpp:37:
In file included from ./vamp-sdk/PluginAdapter.h:40:
In file included from /usr/include/c++/4.2.1/map:64:
In file included from /usr/include/c++/4.2.1/bits/stl_tree.h:68:
In file included from /usr/include/c++/4.2.1/bits/stl_algobase.h:65:
In file included from /usr/include/c++/4.2.1/bits/c++config.h:41:
In file included from /usr/include/c++/4.2.1/bits/os_defines.h:61:
In file included from /usr/include/unistd.h:71:
In file included from /usr/include/_types.h:27:
In file included from /usr/include/sys/_types.h:33:
/usr/include/machine/_types.h:34:10: fatal error: 'arm/_types.h' file not found
#include "arm/_types.h"
         ^
1 error generated.
make: *** [src/vamp-sdk/PluginAdapter.o] Error 1

Type definitions for arm was not found! The problem here is that the right path was

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/arm/_types.h

Ok let's fix this in the Makefile.osx again:

ARCHFLAGS = -mmacosx-version-min=$(MINVERSION) -arch armv7
CFLAGS          = $(ARCHFLAGS) -fPIC --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/
CXXFLAGS        = $(ARCHFLAGS) -O2 -Wall -I. -fPIC
CPPFLAGS        ="-pipe -no-cpp-precomp -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/" -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk

then make the static targets:

make -f build/Makefile.osx sdkstatic

Wow it worked! I have a vamp host sdk .a for iOS! (I suppose to have let's say)

macbookproloreto:vamp-plugin-sdk loreto$ ls -l *.a
-rw-r--r--  1 loreto  staff  301176 18 Ott 00:35 libvamp-hostsdk.a
-rw-r--r--  1 loreto  staff   76024 18 Ott 00:35 libvamp-sdk.a

Ok but let's check with otool, since you never know:

macbookproloreto:vamp-plugin-sdk loreto$ otool -hv libvamp-sdk.a
Archive : libvamp-sdk.a
libvamp-sdk.a(PluginAdapter.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC     ARM         V7  0x00      OBJECT     4       1128 SUBSECTIONS_VIA_SYMBOLS
libvamp-sdk.a(RealTime.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC     ARM         V7  0x00      OBJECT     4       1060 SUBSECTIONS_VIA_SYMBOLS
libvamp-sdk.a(FFT.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC     ARM         V7  0x00      OBJECT     4        584 SUBSECTIONS_VIA_SYMBOLS
libvamp-sdk.a(acsymbols.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC     ARM         V7  0x00      OBJECT     3        500 SUBSECTIONS_VIA_SYMBOLS

Ok, that's the armv7 architecture.

Now, back to the plugins sdk again and change the

build/osx/Makefile.osx

as follows:

CFLAGS := -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -DUSE_PTHREADS

CXXFLAGS  := $(CFLAGS)

include build/general/Makefile.inc

Ok back again and make:

macbookproloreto:dsp loreto$ make -f build/osx/Makefile.osx

Boom! Another problem:

/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -DUSE_PTHREADS -I.   -c -o dsp/wavelet/Wavelet.o dsp/wavelet/Wavelet.cpp
cc -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -DUSE_PTHREADS -I.   -c -o hmm/hmm.o hmm/hmm.c
hmm/hmm.c:21:10: fatal error: 'clapack.h' file not found
#include <clapack.h>            /* LAPACK for matrix inversion */
         ^
1 error generated.
make: *** [hmm/hmm.o] Error 1
macbookproloreto:dsp loreto$ vi build/osx/Makefile.osx 

LAPACK not found.

But as for Apple Docs here, Apple introduced LAPACK in the Accelerate.frameworks since iOS4.0!

In fact clapack.h is here: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/clapack.h

So let's add this somewhere in the ../dsp/build/Makefile.osx

CFLAGS := -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS

And now let's make it again, but let me check the arch:

macbookproloreto:dsp loreto$ otool -hv libqm-dsp.a 
Archive : libqm-dsp.a
libqm-dsp.a(Pitch.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC     ARM         V7  0x00      OBJECT     4        516 SUBSECTIONS_VIA_SYMBOLS
libqm-dsp.a(Chromagram.o):
Mach header

Sound good! One level back in the plugins folder now and make

In file included from plugins/AdaptiveSpectrogram.cpp:15:
plugins/AdaptiveSpectrogram.h:22:10: fatal error: 'dsp/transforms/FFT.h' file not found
#include <dsp/transforms/FFT.h>
         ^
1 error generated.

Uhm ok the dsp/ misses the tranforms folder - gosh!

Another error:

clang: error: invalid argument '-install_name qm-vamp-plugins.a' only allowed with '-dynamiclib'
make: *** [qm-vamp-plugins.a] Error 1

Let's fix again the Makefile.osx:

CFLAGS := -O3 -ftree-vectorize -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch armv7 -I../vamp-plugin-sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS

CXXFLAGS  := $(CFLAGS)

LDFLAGS   := -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch armv7 -lqm-dsp ../vamp-plugin-sdk/libvamp-sdk.a -framework Accelerate -lpthread

Ok, now the error is architecture undefined symbol errors: to long look at the gist here like:

  "std::cerr", referenced from:
  "typeinfo for std::istream", referenced from:
  "std::ostream::put(char)""
  std::ostream::operator<<(int)",

This reminds me to the boost C++ libraries!

So I need to get boost, compile for iOS then include it in the Makefile and it should work, isn't it ? This could take long...

So do this by now

macbookproloreto:vamp-plugin-sdk loreto$ echo $'\360\237\215\272'

http://i.stack.imgur.com/ff3kp.png

After getting boost as iOS framework distribution from here and adding

-I/Users/loreto/Projects/AUDIO/LIBS/boost-ios/Dist/boost.framework/Headers/

I have the same error...uhm I suppose I'm missing the standard C++ library here!

macbookproloreto:Headers loreto$ locate libc++.dylib | grep iPhoneOS7.0
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/libc++.dylib

bingo!

So

-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/libc++.dylib

Error again (doh) !

Tried with no success

    -I/usr/lib/libstdc++.dylib
   -lstdc++

Stucked on a very simple linking issue.

Again.

macbookproloreto:vamp-plugin-sdk loreto$ echo $'\360\237\215\272'

http://i.stack.imgur.com/ff3kp.png

The most interesting part of the error is the first static library being compiled:

make -f build/osx/Makefile.osx

c++ -o qm-vamp-plugins.a g2cstubs.o plugins/AdaptiveSpectrogram.o plugins/BarBeatTrack.o plugins/BeatTrack.o plugins/DWT.o plugins/OnsetDetect.o plugins/ChromagramPlugin.o plugins/ConstantQSpectrogram.o plugins/KeyDetect.o plugins/MFCCPlugin.o plugins/SegmenterPlugin.o plugins/SimilarityPlugin.o plugins/TonalChangeDetect.o plugins/Transcription.o libmain.o -L../qm-dsp -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch armv7 -lqm-dsp ../vamp-plugin-sdk/libvamp-sdk.a -framework Accelerate -lpthread
Undefined symbols for architecture armv7:
  "std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const", referenced from:
      _VampPlugin::Vamp::RealTime::toString() const in libvamp-sdk.a(RealTime.o)
      _VampPlugin::Vamp::RealTime::toText(bool) const in libvamp-sdk.a(RealTime.o)
  "std::basic_ios<char, std::char_traits<char> >::widen(char) const", referenced from:
      _VampPlugin::Vamp::PluginAdapterBase::Impl::getDescriptor() in libvamp-sdk.a(PluginAdapter.o)

Here we can see that one of the static library compiled does not contain the right architecture.

I have two static libraries here:

lqm-dsp ../vamp-plugin-sdk/libvamp-sdk.a

If I run otool on that I can see that the cpu time is ARM7 for both of them:

macbookproloreto:qm-vamp-plugins loreto$ otool -hv ../vamp-plugin-sdk/libvamp-sdk.a
Archive : ../vamp-plugin-sdk/libvamp-sdk.a
../vamp-plugin-sdk/libvamp-sdk.a(PluginAdapter.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC     ARM         V7  0x00      OBJECT     4       1128 SUBSECTIONS_VIA_SYMBOLS

So what's the matter with Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/libc++.dylib ?

like image 604
loretoparisi Avatar asked Oct 18 '13 00:10

loretoparisi


1 Answers

Try commenting in the code the usage of the standard libraries.

It's probably only used for debug.

like image 91
delfinof Avatar answered Sep 18 '22 00:09

delfinof