320 lines
11 KiB
Text
320 lines
11 KiB
Text
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.
|