| INSTALLATION OVERVIEW |
| ===================== |
| |
| Once libmtp is built and installed, you will have the following files |
| ($PREFIX is the --prefix option given to the "configure" script and |
| defaults to /usr/local/): |
| |
| $PREFIX/lib/libmtp.a Static C library |
| $PREFIX/lib/libmtp.so.x.y.z Dynamic C library |
| $PREFIX/lib/libmtp.so.x A link to the library |
| $PREFIX/lib/libmtp.so A link to the library |
| $PREFIX/include/libmtp.h C header file for libmtp API |
| $PREFIX/lib/pkgconfig/libmtp.pc pkg-config configuration file |
| |
| Sample programs will be built in the "example" directory, and should |
| help you get used to using the libmtp API, as well as provide some |
| immediate gratification. Links to other programs using the libmtp |
| API may be found at the homepage: http://libmtp.sourceforge.net/ |
| |
| |
| Install From Distribution |
| ------------------------- |
| |
| You should probably prefer to install libmtp from the distribution |
| source you're using. Last time we checked, libmtp was part of Ubuntu, |
| Fedora, OpenSUSE, Debian testing, Gentoo, FreeBSD ports and OpenBSD |
| packages/ports. |
| |
| |
| Dependencies |
| ------------ |
| |
| To build libmtp you should only need development files for libusb. |
| (Often named libusb-devel or similar.) For working with CVS versions |
| you may need autoconf, automake, libtool, gettext(-devel). |
| |
| To enable the optional MTPZ support using libgcrypt you need the |
| libgcrypt library installed as well. |
| |
| |
| Shared Library Support |
| ---------------------- |
| |
| Shared library linking is supported. You will need to 'make install' |
| the library before you can execute the sample binaries, and add the |
| libmtp install directory to your shared library search path. |
| |
| On Linux, you would add the line "/usr/local/lib" to your |
| "/etc/ld.so.conf" or as a oneliner in for example a |
| "/etc/ld.so.conf.d/local.conf" file and run the |
| program "ldconfig" to scan in the shared libraries at |
| the new path. This is a part of the Linux shared library |
| loader actually. |
| |
| To access the library from real odd locations you can use |
| the LD_LIBRARY_PATH environment variable by setting it before |
| you run your program, for example: |
| |
| % export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib |
| % my_program |
| |
| To check whether you need to do something this: |
| |
| % ldd /usr/lib/rhytmbox/plugins/mtpdevice/libmtpdevice.so | grep mtp |
| % ldd /usr/bin/gnomad2 | grep mtp |
| |
| If the program is linking to a packaged version of libmtp |
| it will likely say something like this: |
| |
| libmtp.so.N => /usr/lib/libmtp.so.N (0xb4e4b000) |
| |
| In this case you may have your freshly compiled library in |
| /usr/local/lib or something like that, and you need to do the |
| LD_LIBRARY_PATH trick. Verify by using "ldd" again. |
| |
| This way of enabling the library to link is a workaround hack. |
| Note that the LD_LIBRARY_PATH is actually supposed to be used for |
| testing, not production systems or distributions. It is commonly |
| used as a workaround when a user is installing libraries in her/his |
| home directory however. Read more about this environment variable |
| here: http://www.visi.com/~barr/ldpath.html |
| |
| The shared library comes with different interface version numbers, |
| for example libmtp.so.4, libmtp.so.5 and so forth. This is used so |
| that both old and new libmtp libraries shall be able to coexist on |
| the same system. When you compile your programs they will typically |
| bind to the latest version of the shared library. A link to the |
| latest version is always provided as $PREFIX/lib/libmtp.so. |
| |
| libusb support |
| -------------- |
| |
| This package depends on libusb. Get libusb from sourceforge at: |
| |
| http://www.sourceforge.net/projects/libusb/ |
| |
| libusb 1.0 and later is preferred for libmtp, but currently also |
| older 0.1.x versions of libusb are supported. |
| |
| |
| libgcrypt support |
| ----------------- |
| |
| The MTPZ extension to libmtp requires libgcrypt to be installed. |
| |
| http://www.gnu.org/software/libgcrypt/ |
| |
| MTPZ support will not be built unless the configure script finds |
| libgcrypt. |
| |
| |
| BASIC BUILD PROCEDURE |
| ===================== |
| |
| To build the package: |
| |
| % ./configure |
| % make |
| % make install |
| |
| By default, libmtp will add the program-prefix "mtp-" to all the |
| example programs prior to installation. The program-prefix option |
| makes libmtp sample programs avoid collision with other programs like |
| sox' "play" program. If the default prefix for some reason fail, |
| try to tag on "--program-prefix=mtp-" to the "configure" command. |
| |
| The "libexedir" in the configure file is hardcoded to /lib/udev to |
| make the mtp-probe (which is built for Linux only) install into |
| that directory. This is the only location that makes sens for this |
| executable. |
| |
| if you want to install the documentation type: |
| |
| % make install-docs |
| |
| if you checked out the sources from CVS, you must first run the |
| autogen.sh script that generates all the GNU autotools files. |
| Notice that this requires GNU autoconf, automake and libtool and |
| possibly some other packages like gettext, readline, intltool and |
| other M4 macro sources. This is done with: |
| |
| % ./autogen.sh |
| |
| |
| Linux hotplugging |
| ----------------- |
| |
| After compilation and installation you may (and should) add hotplugging |
| support by running the hotplug script, if your distribution supports |
| hotplugging (all do). This typically means you have something |
| in /etc/hotplug and that hotplugging is started when you boot your |
| machine in a script named /etc/init.d/hotplug or similar. |
| |
| Activate hotplugging by running: |
| |
| %./hotplug.sh |
| |
| Hotplug will (typically) use the device map file installed by hotplug.sh |
| at /etc/hotplug/usb/libmtp.usermap to lift the device to userspace for the |
| current user by running the script /etc/hotplug/usb/libmtp.sh. If |
| you have the program "resmgr" installed (currently used only by SuSE to |
| our knowledge) that program will be used for enabling desktop user |
| access, otherwise the current user of the desktop will be determined |
| from files in /var/run. (See the script "libmtp.sh" for details.) |
| |
| |
| Linux udev hotplugging |
| ---------------------- |
| |
| Newer Linux distributions have dropped support for the old hotplug system |
| and rely solely on udev, and rules stored below /etc/udev/rules.d to |
| handle permissions and actions on device connections. It's quite solid |
| but the whole thing is rather shaky when it comes to such things as |
| custom devices handled solely by libusb, which is what libmtp and for |
| example SANE backends use. |
| |
| The libmtp.rules file that comes with libmtp can be used as a starter. |
| |
| This will set the environment variables ID_MEDIA_PLAYER and |
| ID_MTP_DEVICE to "1" and the former one will be recognized by the |
| scripts distributed by recent versions of udev to be a |
| console-writable device that should be accessible for all |
| users. |
| |
| Ancient udev, HAL, libusb |
| ------------------------- |
| |
| The old script for udev used to set the device access to "666" |
| which is rather nasty (not that big security issue, unless you |
| think someone will break into your jukebox) some systems used |
| to let PAM do this by placing a configuration file in |
| /etc/security/ somewhere. Then it was replaced with simple |
| udev rules. |
| |
| At one point HAL was used to take devices detected by udev and |
| signal to userspace that they were available and provide some |
| information about them. This was unnecessary middleware, it has |
| been killed and most userspace applications now get their |
| information directly from udev instead. |
| |
| In old libusb first you need a crazy rule that creates a device |
| node in the /dev/bus/usb hierarchy whenever any USB device is |
| connected. The script has this at the top, you can comment it |
| in if your distribution does not already create these device |
| nodes. |
| |
| Then libusb may need to be patched to recognize this hierarchy. |
| The 0.1.12 version is the first which is properly fixed. |
| |
| |
| |
| If you cannot run hotplugging |
| ----------------------------- |
| |
| If you have a distro without hotplugging enabled try this as root: |
| |
| % chmod -R a+w /dev/bus/usb |
| |
| Or if it's *really* ancient you could try: |
| |
| % chmod -R a+w /proc/bus/usb |
| |
| You have to do this again every time you unplug/replug your USB cable |
| or restart the jukebox, every time you quit libnjb and restart it, |
| etc etc etc an alternative is to run libmtp as root which works just fine. |
| The problem is to somehow assure that you (ie the current user) always |
| has write access to these files. |
| |
| You can find the Linux hotplug project at: |
| http://linux-hotplug.sourceforge.net/ |
| |
| |
| Compilation for embedded devices |
| -------------------------------- |
| |
| Problems with Autoconf complaining about a missing malloc() function |
| during cross-compilation can be solved with this hack if you're using |
| glibc: |
| |
| % export ac_cv_func_malloc_0_nonnull=yes |
| % ./configure |
| |
| If you're using uclibc you may have to smack in a custom rpl_malloc() |
| function in your program, see the Autoconf texinfo documentation. |
| |
| See further: |
| http://wiki.buici.com/wiki/Autoconf_and_RPL_MALLOC |
| |
| Compilation for Solaris/SunOS |
| ----------------------------- |
| |
| libmtp builds on Solaris/SunOS with either gcc or SunStudio 12. It does |
| require GNU Make (aka gmake) to be installed. Building libmtp on Solaris |
| 10 and Solaris 11 differ slightly, so alternate instructions are provided |
| for each Solaris version. |
| |
| For Solaris 10 |
| -------------- |
| |
| To build using GCC: |
| |
| % CFLAGS="I/usr/sfw/lib -L/usr/sfw/lib -R/usr/sfw/lib" MAKE=gmake \ |
| INSTALL=/usr/ucb/install ./configure |
| % gmake |
| % gmake install |
| |
| Custom CLFAGS are required for libusb.so as it lives in /usr/sfw/lib, |
| and this path is not in the default search path for ld. If these |
| CFLAGS are not set, several components of ./configure will fail leading |
| to a failed build. |
| |
| To build using SunStudio 12: |
| |
| % CFLAGS="I/usr/sfw/lib -L/usr/sfw/lib -R/usr/sfw/lib" MAKE=gmake \ |
| INSTALL=/usr/ucb/install CC=cc ./configure |
| % gmake |
| % gmake install |
| |
| |
| General Notes: |
| All MTP devices on Solaris 10u2+ are driven by the usb_mid driver, which |
| will automatically export ugen device interfaces with the correct device |
| permissions. No special configuration is required. See the usb_mid(7D) |
| and ugen(7D) manpages and /usr/sfw/share/doc/libusb/libusb.txt for |
| more information. |
| |
| For Solaris 11 |
| -------------- |
| |
| Building libmtp on Solaris 11 is very similar to those instructions for |
| Solaris 10, however libusb now lives in /usr/lib, and openusb is also |
| available as an alternative USB library. Oracle does not provide a |
| libusb v1.0 API compatible version of libusb, instead providing the older |
| v0.1 API interface version of libusb. As mentioned, Oracle also provides |
| the OpenUSB USB library as an alternate to libusb v1.0, however OpenUSB is |
| not source or binary compatible with libusb. |
| |
| Before building/installing libmtp there are some components missing from |
| the base Solaris 11 installation, and are required to be installed prior |
| to building/installing libmtp. The 'libusbugen' package must be installed |
| before libusb itself is usable on Solaris 11, alternatively the 'openusb' |
| package may be used. |
| |
| To build using GCC: |
| % ./configure |
| % gmake |
| % sudo gmake install |
| |
| To build using SunStudio 12: |
| % CC=cc ./configure |
| % gmake |
| % sudo gmake install |
| |
| |
| General Notes: |
| All MTP devices on Solaris 11+ are driven by the usb_mid driver, which |
| will automatically export ugen device interfaces with the correct device |
| permissions. No special configuration is required. See the usb_mid(7D) |
| and ugen(7D) manpages and /usr/share/doc/libusb/libusb.txt for more |
| information. |