diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 0000000..d1c6055 --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,46 @@ +#---------------------------------------------------------------------------- +# Makefile for VapourSynth-Retinex, modified based on d2vsource/GNUmakefile +#---------------------------------------------------------------------------- + +include config.mak + +vpath %.cpp $(SRCDIR) +vpath %.h $(SRCDIR) + +SRCS = source/VSPlugin.cpp source/Gaussian.cpp source/MSR.cpp source/MSRCP.cpp + +OBJS = $(SRCS:%.cpp=%.o) + +.PHONY: all install clean distclean dep + +all: $(LIBNAME) + +$(LIBNAME): $(OBJS) + $(LD) -o $@ $(LDFLAGS) $^ $(LIBS) + -@ $(if $(STRIP), $(STRIP) -x $@) + +%.o: %.cpp .depend + $(CXX) $(CXXFLAGS) -c $< -o $@ + +install: all + install -d $(libdir) + install -m 755 $(LIBNAME) $(libdir) + +clean: + $(RM) *.dll *.so *.dylib $(OBJS) .depend + +distclean: clean + $(RM) config.* + +dep: .depend + +ifneq ($(wildcard .depend),) +include .depend +endif + +.depend: config.mak + @$(RM) .depend + @$(foreach SRC, $(SRCS:%=$(SRCDIR)/%), $(CXX) $(SRC) $(CXXFLAGS) -MT $(SRC:$(SRCDIR)/%.cpp=%.o) -MM >> .depend;) + +config.mak: + ./configure diff --git a/configure b/configure new file mode 100644 index 0000000..90f1af0 --- /dev/null +++ b/configure @@ -0,0 +1,253 @@ +#!/bin/sh + +#---------------------------------------------------------------------------- +# configure script for VapourSynth-Retinex +#---------------------------------------------------------------------------- + +## This script was modified based on d2vsource/configure. + +# -- help ------------------------------------------------------------------- +if test x"$1" = x"-h" -o x"$1" = x"--help" ; then +cat << EOF +Usage: [PKG_CONFIG_PATH=/foo/bar/lib/pkgconfig] ./configure [options] +options: + -h, --help print help (this) + + --install=PATH set dir for install library + [/usr/local/lib/vapoursynth] + + --clang, --gcc compile by g++ or clang++ [clang] + --target-os=OS build programs to run on OS [auto] + --cross-prefix=PREFIX use PREFIX for compilation tools + --sysroot=SYSROOT root of cross-build tree + --enable-debug compile with debug symbols and never strip + + --extra-cxxflags=XCXXFLAGS add XCXXFLAGS to CXXFLAGS + --extra-ldflags=XLDFLAGS add XLDFLAGS to LDFLAGS + --extra-libs=XLIBS add XLIBS to LIBS + + --target=TARGET set target instruction set [sse2] + +EOF +exit 1 +fi + +#-- func -------------------------------------------------------------------- +error_exit() +{ + echo error: $1 + exit 1 +} +log_echo() +{ + echo $1 + echo >> config.log + echo --------------------------------- >> config.log + echo $1 >> config.log +} + +cc_check() +{ + rm -f conftest.c + if [ -n "$3" ]; then + echo "#include <$3>" >> config.log + echo 'extern "C" {' > conftest.cpp + echo "#include <$3>" >> conftest.cpp + echo } >> conftest.cpp + fi + echo "int main(void){$4 return 0;}" >> config.log + echo "int main(void){$4 return 0;}" >> conftest.cpp + echo $CXX conftest.cpp -o conftest -Werror $1 $2 >> config.log + $CXX conftest.cpp -o conftest -Werror $1 $2 2>> config.log + ret=$? + echo $ret >> config.log + rm -f conftest* + return $ret +} +#---------------------------------------------------------------------------- +rm -f config.* .depend + +SRCDIR="$(cd $(dirname $0); pwd)" +test "$SRCDIR" = "$(pwd)" && SRCDIR=. +test -n "$(echo $SRCDIR | grep ' ')" && \ + error_exit "out-of-tree builds are impossible with whitespace in source path" + +# -- init ------------------------------------------------------------------- +libdir="/usr/local/lib/vapoursynth" + +TARGET_OS="" +CROSS="" + +SYSROOT="" +CXX="clang++" +LD="clang++" +STRIP="strip" + +test -n "$(which $CXX 2> /dev/null)" || CXX="g++" +test -n "$(which $LD 2> /dev/null)" || LD="g++" + +DEBUG="" + +LIBNAME="" + +CXXFLAGS="-std=c++11 -Wall -I. -I$SRCDIR/include" +LDFLAGS="" +SOFLAGS="-shared -Wl,-Bsymbolic" +DEPLIBS="" +TARGET="-msse2" + +# -- options ---------------------------------------------------------------- +echo all command lines: > config.log +echo "$*" >> config.log + +for opt; do + optarg="${opt#*=}" + case "$opt" in + --install=*) + libdir="$optarg" + ;; + --enable-debug) + DEBUG="enabled" + XCXXFLAGS="$XCXXFLAGS -g" + ;; + --cxx=*) + CXX="$optarg" + ;; + --extra-cxxflags=*) + XCXXFLAGS="$optarg" + ;; + --extra-ldflags=*) + XLDFLAGS="$optarg" + ;; + --extra-libs=*) + XLIBS="$optarg" + ;; + --target-os=*) + TARGET_OS="$optarg" + ;; + --cross-prefix=*) + CROSS="$optarg" + ;; + --sysroot=*) + CXXFLAGS="$CXXFLAGS --sysroot=$optarg" + LDFLAGS="$LDFLAGS --sysroot=$optarg" + ;; + --gcc) + CXX="g++" + LD="g++" + ;; + --clang) + CXX="clang++" + LD="clang++" + ;; + --target=*) + TARGET="-m$optarg" + ;; + *) + error_exit "unknown option $opt" + ;; + esac +done + +CXXFLAGS="$CXXFLAGS $XCXXFLAGS $TARGET" +LDFLAGS="$LDFLAGS $XLDFLAGS" + +CXX="${CROSS}${CXX}" +LD="${CROSS}${LD}" +STRIP="${CROSS}${STRIP}" +for f in "$CXX" "$LD" "$STRIP"; do + test -n "$(which $f 2> /dev/null)" || error_exit "$f is not executable" +done + +if test -n "$TARGET_OS"; then + TARGET_OS=$(echo $TARGET_OS | tr '[A-Z]' '[a-z]') +else + TARGET_OS=$($CXX -dumpmachine | tr '[A-Z]' '[a-z]') +fi +case "$TARGET_OS" in + *mingw*) + LIBNAME="Retinex.dll" + SOFLAGS="$SOFLAGS -Wl,--dll,--add-stdcall-alias" + ;; + *darwin*) + LIBNAME="libretinex.dylib" + DEPLIBS="$DEPLIBS vapoursynth" + SOFLAGS="$SOFLAGS -dynamiclib -Wl,-undefined,suppress -Wl,-read_only_relocs,suppress -Wl,-flat_namespace" + ;; + *linux*) + LIBNAME="libretinex.so" + DEPLIBS="$DEPLIBS vapoursynth" + CXXFLAGS="$CXXFLAGS -fPIC" + SOFLAGS="$SOFLAGS -fPIC" + ;; + *) + error_exit "target is unsupported system" +esac + + +log_echo "CXXFLAGS/LDFLAGS checking..." +if ! cc_check "$CXXFLAGS" "$LDFLAGS"; then + error_exit "invalid CXXFLAGS/LDFLAGS" +fi +if cc_check "-Os -ffast-math $CXXFLAGS" "$LDFLAGS"; then + CXXFLAGS="-Os -ffast-math $CXXFLAGS" +fi +if cc_check "$CXXFLAGS -fexcess-precision=fast" "$LDFLAGS"; then + CXXFLAGS="$CXXFLAGS -fexcess-precision=fast" +fi + +PKGCONFIGBIN="pkg-config" +test -n "$(which ${CROSS}${PKGCONFIGBIN} 2> /dev/null)" && \ + PKGCONFIGBIN=${CROSS}${PKGCONFIGBIN} + +if $PKGCONFIGBIN --exists $DEPLIBS 2> /dev/null; then + LIBS="$($PKGCONFIGBIN --libs $DEPLIBS)" + CXXFLAGS="$CXXFLAGS $($PKGCONFIGBIN --cflags $DEPLIBS)" +else + for lib in $DEPLIBS; do + LIBS="$LIBS -l${lib#lib}" + done + log_echo "warning: pkg-config or pc files not found, lib detection may be inaccurate." +fi + +LDFLAGS="$SOFLAGS $LDFLAGS" +LIBS="$LIBS $XLIBS" + + +cat >> config.mak << EOF +CXX = $CXX +LD = $LD +STRIP = $STRIP +CXXFLAGS = $CXXFLAGS +LDFLAGS = $LDFLAGS +LIBS = $LIBS +SRCDIR = $SRCDIR +LIBNAME = $LIBNAME +libdir = $libdir +EOF + +cat >> config.log << EOF +--------------------------------- + setting +--------------------------------- +EOF +cat config.mak >> config.log + +cat << EOF + +settings... +CXX = $CXX +LD = $LD +STRIP = $STRIP +CXXFLAGS = $CXXFLAGS +LDFLAGS = $LDFLAGS +LIBS = $LIBS +LIBNAME = $LIBNAME +install path = $libdir +EOF + +test "$SRCDIR" = "." || ln -sf $SRCDIR/GNUmakefile . + +echo configure finished. + +exit 0