diff --git a/.gitignore b/.gitignore index 3ab271b..17c4f3c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ version.h *.d *.o sxiv +config.mk diff --git a/Makefile b/Makefile index da6c209..23ed7b8 100644 --- a/Makefile +++ b/Makefile @@ -1,82 +1,90 @@ -version = 26 +# Include configure options +ifneq (clean,$(filter clean,$(MAKECMDGOALS))) +-include config.mk +endif -srcdir = . -VPATH = $(srcdir) +# sxiv version +VERSION = 26 -PREFIX = /usr/local +# PREFIX for install +PREFIX ?= /usr/local MANPREFIX = $(PREFIX)/share/man # autoreload backend: inotify/nop AUTORELOAD = inotify -# enable features requiring giflib (-lgif) -HAVE_GIFLIB = 1 +# CFLAGS, any optimization flags goes here +CFLAGS ?= -std=c99 -Wall -pedantic -# enable features requiring libexif (-lexif) -HAVE_LIBEXIF = 1 +ifeq ($(HAVE_LIBEXIF), 1) + OPTIONAL_LIBS += -lexif +else + HAVE_LIBEXIF = 0 +endif +ifeq ($(HAVE_LIBGIF), 1) + OPTIONAL_LIBS += -lgif +else + HAVE_LIBGIF = 0 +endif -cflags = -std=c99 -Wall -pedantic $(CFLAGS) -cppflags = -I. $(CPPFLAGS) -D_XOPEN_SOURCE=700 \ - -DHAVE_GIFLIB=$(HAVE_GIFLIB) -DHAVE_LIBEXIF=$(HAVE_LIBEXIF) \ +CPPFLAGS = -D_XOPEN_SOURCE=700 \ + -DHAVE_LIBGIF=$(HAVE_LIBGIF) -DHAVE_LIBEXIF=$(HAVE_LIBEXIF) \ -I/usr/include/freetype2 -I$(PREFIX)/include/freetype2 -lib_exif_0 = -lib_exif_1 = -lexif -lib_gif_0 = -lib_gif_1 = -lgif -ldlibs = $(LDLIBS) -lImlib2 -lX11 -lXft -lfontconfig \ - $(lib_exif_$(HAVE_LIBEXIF)) $(lib_gif_$(HAVE_GIFLIB)) +LDLIBS = -lImlib2 -lX11 -lXft -lfontconfig $(OPTIONAL_LIBS) -objs = autoreload_$(AUTORELOAD).o commands.o image.o main.o options.o \ +OBJS = autoreload_$(AUTORELOAD).o commands.o image.o main.o options.o \ thumbs.o util.o window.o -all: sxiv - .PHONY: all clean install uninstall .SUFFIXES: .SUFFIXES: .c .o -$(V).SILENT: -sxiv: $(objs) +all: sxiv + +sxiv: $(OBJS) @echo "LINK $@" - $(CC) $(LDFLAGS) -o $@ $(objs) $(ldlibs) - -$(objs): Makefile sxiv.h commands.lst config.h -options.o: version.h -window.o: icon/data.h + $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) .c.o: @echo "CC $@" - $(CC) $(cflags) $(cppflags) -c -o $@ $< + $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< + +$(OBJS): Makefile sxiv.h commands.lst config.h config.mk +options.o: version.h +window.o: icon/data.h + +config.mk: + @echo "GEN $@" + @echo "# 0 = disable, 1 = enable" > config.mk + @for lib in exif gif; do \ + if echo "int main(){}" | $(CC) "-l$$lib" -o /dev/null -x c - 2>/dev/null ; then \ + echo "HAVE_LIB$$lib=1" | tr '[:lower:]' '[:upper:]' >> config.mk ; \ + fi \ + done config.h: @echo "GEN $@" - cp $(srcdir)/config.def.h $@ + cp config.def.h $@ version.h: Makefile .git/index @echo "GEN $@" - v="$$(cd $(srcdir); git describe 2>/dev/null)"; \ - echo "#define VERSION \"$${v:-$(version)}\"" >$@ - -.git/index: + v="$$(git describe 2>/dev/null)"; \ + echo "#define VERSION \"$${v:-$(VERSION)}\"" >$@ clean: - rm -f *.o sxiv + $(RM) *.o sxiv install: all @echo "INSTALL bin/sxiv" - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp sxiv $(DESTDIR)$(PREFIX)/bin/ - chmod 755 $(DESTDIR)$(PREFIX)/bin/sxiv + install -Dt $(DESTDIR)$(PREFIX)/bin sxiv @echo "INSTALL sxiv.1" mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s!PREFIX!$(PREFIX)!g; s!VERSION!$(version)!g" sxiv.1 \ + sed "s!PREFIX!$(PREFIX)!g; s!VERSION!$(VERSION)!g" sxiv.1 \ >$(DESTDIR)$(MANPREFIX)/man1/sxiv.1 chmod 644 $(DESTDIR)$(MANPREFIX)/man1/sxiv.1 @echo "INSTALL share/sxiv/" - mkdir -p $(DESTDIR)$(PREFIX)/share/sxiv/exec - cp exec/* $(DESTDIR)$(PREFIX)/share/sxiv/exec/ - chmod 755 $(DESTDIR)$(PREFIX)/share/sxiv/exec/* + install -Dt $(DESTDIR)$(PREFIX)/share/sxiv/exec exec/* uninstall: @echo "REMOVE bin/sxiv" diff --git a/README.md b/README.md index 8795fb5..f2aba7a 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,8 @@ sxiv requires the following software to be installed: * Xft * freetype2 * fontconfig - * giflib (optional, disabled with `HAVE_GIFLIB=0`) - * libexif (optional, disabled with `HAVE_LIBEXIF=0`) + * giflib (optional, automatically enabled if installed) + * libexif (optional, automatically enabled if installed) Please make sure to install the corresponding development packages in case that you want to build sxiv on a distribution with separate runtime and development @@ -62,6 +62,15 @@ Please note, that the latter one requires root privileges. By default, sxiv is installed using the prefix "/usr/local", so the full path of the executable will be "/usr/local/bin/sxiv". +Running make will automatically detect if libexif and libgif are available and +enable them if so. CLI arguments will override any automatic detection. +For example: + + $ make HAVE_LIBGIF=0 + +will always disable libgif. +Alternatively, they can be disabled via editing `config.mk`. + You can install sxiv into a directory of your choice by changing the second command to: diff --git a/image.c b/image.c index 6f37f44..1c1e4d2 100644 --- a/image.c +++ b/image.c @@ -31,7 +31,7 @@ #include #endif -#if HAVE_GIFLIB +#if HAVE_LIBGIF #include enum { DEF_GIF_DELAY = 75 }; #endif @@ -115,7 +115,7 @@ void exif_auto_orientate(const fileinfo_t *file) } #endif -#if HAVE_GIFLIB +#if HAVE_LIBGIF bool img_load_gif(img_t *img, const fileinfo_t *file) { GifFileType *gif; @@ -295,7 +295,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) return !err; } -#endif /* HAVE_GIFLIB */ +#endif /* HAVE_LIBGIF */ Imlib_Image img_open(const fileinfo_t *file) { @@ -333,7 +333,7 @@ bool img_load(img_t *img, const fileinfo_t *file) #endif if ((fmt = imlib_image_format()) != NULL) { -#if HAVE_GIFLIB +#if HAVE_LIBGIF if (STREQ(fmt, "gif")) img_load_gif(img, file); #endif