The common case ./autogen.sh && ./configure && make If something fails read the last lines. Typical reason to fail is a missing dependency, such as libtool or gettext. Autotools `./autogen.sh' generates all files needed to compile and install the code (run it after checkout from git) `make distclean' removes all unnecessary files, but the code can still be recompiled with "./configure; make" `make dist-gzip' (or -bzip2) creates a tarball that can be configured and compiled without running `./autogen.sh' Compiling Use SUID_CFLAGS and SUID_LDFLAGS when you want to define special compiler options for typical suid programs, for example: ./configure SUID_CFLAGS="-fpie" SUID_LDFLAGS="-pie" The SUID_* feature is currently supported for chfn, chsh, newgrp, su, write, mount, and umount. Use DAEMON_CFLAGS and DAEMON_LDFLAGS when you want to define special compiler options for daemons; supported for uuidd. Use SOLIB_CFLAGS and SOLIB_LDFLAGS when you want to define special compiler options for shared libraries; supported for libmount, libblkid and libuuid. FIXME: add notes about klib and uClib. Compile certain portion See ./configure --help and use --disable-* and --enable-* options. It's also possible to disable all the programs and enable only wanted. For example: ./configure --disable-all-programs --enable-fallocate Note that the configure script tracks dependencies between libs and tools. Always see warning messages and follow error messages if any dependence is necessary. For example to compile mount(8) you need also libmount, libblkid and libuuid: ./configure --disable-all-programs --enable-mount --enable-libmount \ --enable-libblkid --enable-libuuid Static linking Use --enable-static-programs[=LIST] configure option when you want to use statically linked programs. Note, mount(8) uses get{pw,gr}nam() and getpwuid() functions for translation from username and groupname to UID and GID. These functions could be implemented by dynamically loaded independent modules (NSS) in your libc (e.g. glibc). These modules are not statically linked to mount(8) and mount.static is still using dlopen() like dynamically linked version. The translation won't work in environment where NSS modules are not installed. For example normal system (NSS modules are available): # ./mount.static -v -f -n -ouid=kzak /mnt/foo LABEL=/mnt/foo on /mnt/foo type vfat (rw,uid=500) ^^^^^^^ and without NSS modules: # chroot . ./mount.static -v -f -n -ouid=kzak /mnt/win LABEL=/mnt/win on /mnt/win type vfat (rw,uid=kzak) ^^^^^^^^