Draft
This commit is contained in:
parent
9326392bb3
commit
c1c47d4e19
|
@ -20,3 +20,7 @@ Thumbs.db
|
||||||
.Trashes
|
.Trashes
|
||||||
|
|
||||||
.clang-format
|
.clang-format
|
||||||
|
|
||||||
|
.idea
|
||||||
|
src_orig
|
||||||
|
cmake-build-*
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
cmake_minimum_required(VERSION 2.8.11)
|
||||||
|
project(caesium_clt)
|
||||||
|
|
||||||
|
add_subdirectory(src)
|
|
@ -1,2 +0,0 @@
|
||||||
SUBDIRS = src
|
|
||||||
dist_doc_DATA = README.md
|
|
803
Makefile.in
803
Makefile.in
|
@ -1,803 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.15 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
|
||||||
am__is_gnu_make = { \
|
|
||||||
if test -z '$(MAKELEVEL)'; then \
|
|
||||||
false; \
|
|
||||||
elif test -n '$(MAKE_HOST)'; then \
|
|
||||||
true; \
|
|
||||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
|
||||||
true; \
|
|
||||||
else \
|
|
||||||
false; \
|
|
||||||
fi; \
|
|
||||||
}
|
|
||||||
am__make_running_with_option = \
|
|
||||||
case $${target_option-} in \
|
|
||||||
?) ;; \
|
|
||||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
|
||||||
"target option '$${target_option-}' specified" >&2; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
has_opt=no; \
|
|
||||||
sane_makeflags=$$MAKEFLAGS; \
|
|
||||||
if $(am__is_gnu_make); then \
|
|
||||||
sane_makeflags=$$MFLAGS; \
|
|
||||||
else \
|
|
||||||
case $$MAKEFLAGS in \
|
|
||||||
*\\[\ \ ]*) \
|
|
||||||
bs=\\; \
|
|
||||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
|
||||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
|
||||||
esac; \
|
|
||||||
fi; \
|
|
||||||
skip_next=no; \
|
|
||||||
strip_trailopt () \
|
|
||||||
{ \
|
|
||||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
|
||||||
}; \
|
|
||||||
for flg in $$sane_makeflags; do \
|
|
||||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
|
||||||
case $$flg in \
|
|
||||||
*=*|--*) continue;; \
|
|
||||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
|
||||||
-*I?*) strip_trailopt 'I';; \
|
|
||||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
|
||||||
-*O?*) strip_trailopt 'O';; \
|
|
||||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
|
||||||
-*l?*) strip_trailopt 'l';; \
|
|
||||||
-[dEDm]) skip_next=yes;; \
|
|
||||||
-[JT]) skip_next=yes;; \
|
|
||||||
esac; \
|
|
||||||
case $$flg in \
|
|
||||||
*$$target_option*) has_opt=yes; break;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
test $$has_opt = yes
|
|
||||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
|
||||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
subdir = .
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
|
||||||
$(am__configure_deps) $(dist_doc_DATA) $(am__DIST_COMMON)
|
|
||||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
|
||||||
configure.lineno config.status.lineno
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
|
||||||
am__v_P_0 = false
|
|
||||||
am__v_P_1 = :
|
|
||||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
|
||||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
|
||||||
am__v_GEN_0 = @echo " GEN " $@;
|
|
||||||
am__v_GEN_1 =
|
|
||||||
AM_V_at = $(am__v_at_@AM_V@)
|
|
||||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
|
||||||
am__v_at_0 = @
|
|
||||||
am__v_at_1 =
|
|
||||||
SOURCES =
|
|
||||||
DIST_SOURCES =
|
|
||||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
|
||||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
|
||||||
install-data-recursive install-dvi-recursive \
|
|
||||||
install-exec-recursive install-html-recursive \
|
|
||||||
install-info-recursive install-pdf-recursive \
|
|
||||||
install-ps-recursive install-recursive installcheck-recursive \
|
|
||||||
installdirs-recursive pdf-recursive ps-recursive \
|
|
||||||
tags-recursive uninstall-recursive
|
|
||||||
am__can_run_installinfo = \
|
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
|
||||||
n|no|NO) false;; \
|
|
||||||
*) (install-info --version) >/dev/null 2>&1;; \
|
|
||||||
esac
|
|
||||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
|
||||||
am__vpath_adj = case $$p in \
|
|
||||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
|
||||||
*) f=$$p;; \
|
|
||||||
esac;
|
|
||||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
|
||||||
am__install_max = 40
|
|
||||||
am__nobase_strip_setup = \
|
|
||||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
|
||||||
am__nobase_strip = \
|
|
||||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
|
||||||
am__nobase_list = $(am__nobase_strip_setup); \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
|
||||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
|
||||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
|
||||||
if (++n[$$2] == $(am__install_max)) \
|
|
||||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
|
||||||
END { for (dir in files) print dir, files[dir] }'
|
|
||||||
am__base_list = \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
|
||||||
am__uninstall_files_from_dir = { \
|
|
||||||
test -z "$$files" \
|
|
||||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
|
||||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
|
||||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
|
||||||
}
|
|
||||||
am__installdirs = "$(DESTDIR)$(docdir)"
|
|
||||||
DATA = $(dist_doc_DATA)
|
|
||||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
|
||||||
distclean-recursive maintainer-clean-recursive
|
|
||||||
am__recursive_targets = \
|
|
||||||
$(RECURSIVE_TARGETS) \
|
|
||||||
$(RECURSIVE_CLEAN_TARGETS) \
|
|
||||||
$(am__extra_recursive_targets)
|
|
||||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
|
||||||
cscope distdir dist dist-all distcheck
|
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
|
||||||
# Read a list of newline-separated strings from the standard input,
|
|
||||||
# and print each of them once, without duplicates. Input order is
|
|
||||||
# *not* preserved.
|
|
||||||
am__uniquify_input = $(AWK) '\
|
|
||||||
BEGIN { nonempty = 0; } \
|
|
||||||
{ items[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in items) print i; }; } \
|
|
||||||
'
|
|
||||||
# Make sure the list of sources is unique. This is necessary because,
|
|
||||||
# e.g., the same source file might be shared among _SOURCES variables
|
|
||||||
# for different programs/libraries.
|
|
||||||
am__define_uniq_tagged_files = \
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | $(am__uniquify_input)`
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
CSCOPE = cscope
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/tools/compile \
|
|
||||||
$(top_srcdir)/tools/install-sh $(top_srcdir)/tools/missing \
|
|
||||||
AUTHORS COPYING INSTALL tools/compile tools/depcomp \
|
|
||||||
tools/install-sh tools/missing
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
distdir = $(PACKAGE)-$(VERSION)
|
|
||||||
top_distdir = $(distdir)
|
|
||||||
am__remove_distdir = \
|
|
||||||
if test -d "$(distdir)"; then \
|
|
||||||
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
|
||||||
&& rm -rf "$(distdir)" \
|
|
||||||
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
|
||||||
else :; fi
|
|
||||||
am__post_remove_distdir = $(am__remove_distdir)
|
|
||||||
am__relativize = \
|
|
||||||
dir0=`pwd`; \
|
|
||||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
|
||||||
sed_rest='s,^[^/]*/*,,'; \
|
|
||||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
|
||||||
sed_butlast='s,/*[^/]*$$,,'; \
|
|
||||||
while test -n "$$dir1"; do \
|
|
||||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first" != "."; then \
|
|
||||||
if test "$$first" = ".."; then \
|
|
||||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
|
||||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
|
||||||
else \
|
|
||||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first2" = "$$first"; then \
|
|
||||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
|
||||||
else \
|
|
||||||
dir2="../$$dir2"; \
|
|
||||||
fi; \
|
|
||||||
dir0="$$dir0"/"$$first"; \
|
|
||||||
fi; \
|
|
||||||
fi; \
|
|
||||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
|
||||||
done; \
|
|
||||||
reldir="$$dir2"
|
|
||||||
DIST_ARCHIVES = $(distdir).tar.gz
|
|
||||||
GZIP_ENV = --best
|
|
||||||
DIST_TARGETS = dist-gzip
|
|
||||||
distuninstallcheck_listfiles = find . -type f -print
|
|
||||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
|
||||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
|
||||||
distcleancheck_listfiles = find . -type f -print
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
GREP = @GREP@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
builddir = @builddir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
SUBDIRS = src
|
|
||||||
dist_doc_DATA = README.md
|
|
||||||
all: all-recursive
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
am--refresh: Makefile
|
|
||||||
@:
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
|
|
||||||
$(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
|
|
||||||
&& exit 0; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --foreign Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
echo ' $(SHELL) ./config.status'; \
|
|
||||||
$(SHELL) ./config.status;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
$(SHELL) ./config.status --recheck
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
install-dist_docDATA: $(dist_doc_DATA)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
|
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
|
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-dist_docDATA:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
|
|
||||||
|
|
||||||
# This directory's subdirectories are mostly independent; you can cd
|
|
||||||
# into them and run 'make' without going through this Makefile.
|
|
||||||
# To change the values of 'make' variables: instead of editing Makefiles,
|
|
||||||
# (1) if the variable is set in 'config.status', edit 'config.status'
|
|
||||||
# (which will cause the Makefiles to be regenerated when you run 'make');
|
|
||||||
# (2) otherwise, pass the desired values on the 'make' command line.
|
|
||||||
$(am__recursive_targets):
|
|
||||||
@fail=; \
|
|
||||||
if $(am__make_keepgoing); then \
|
|
||||||
failcom='fail=yes'; \
|
|
||||||
else \
|
|
||||||
failcom='exit 1'; \
|
|
||||||
fi; \
|
|
||||||
dot_seen=no; \
|
|
||||||
target=`echo $@ | sed s/-recursive//`; \
|
|
||||||
case "$@" in \
|
|
||||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
|
||||||
*) list='$(SUBDIRS)' ;; \
|
|
||||||
esac; \
|
|
||||||
for subdir in $$list; do \
|
|
||||||
echo "Making $$target in $$subdir"; \
|
|
||||||
if test "$$subdir" = "."; then \
|
|
||||||
dot_seen=yes; \
|
|
||||||
local_target="$$target-am"; \
|
|
||||||
else \
|
|
||||||
local_target="$$target"; \
|
|
||||||
fi; \
|
|
||||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
|
||||||
|| eval $$failcom; \
|
|
||||||
done; \
|
|
||||||
if test "$$dot_seen" = "no"; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
|
||||||
fi; test -z "$$fail"
|
|
||||||
|
|
||||||
ID: $(am__tagged_files)
|
|
||||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
|
||||||
tags: tags-recursive
|
|
||||||
TAGS: tags
|
|
||||||
|
|
||||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
|
||||||
include_option=--etags-include; \
|
|
||||||
empty_fix=.; \
|
|
||||||
else \
|
|
||||||
include_option=--include; \
|
|
||||||
empty_fix=; \
|
|
||||||
fi; \
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
test ! -f $$subdir/TAGS || \
|
|
||||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
$(am__define_uniq_tagged_files); \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: ctags-recursive
|
|
||||||
|
|
||||||
CTAGS: ctags
|
|
||||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
|
||||||
$(am__define_uniq_tagged_files); \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
cscope: cscope.files
|
|
||||||
test ! -s cscope.files \
|
|
||||||
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
|
||||||
clean-cscope:
|
|
||||||
-rm -f cscope.files
|
|
||||||
cscope.files: clean-cscope cscopelist
|
|
||||||
cscopelist: cscopelist-recursive
|
|
||||||
|
|
||||||
cscopelist-am: $(am__tagged_files)
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
case "$(srcdir)" in \
|
|
||||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
|
||||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
|
||||||
esac; \
|
|
||||||
for i in $$list; do \
|
|
||||||
if test -f "$$i"; then \
|
|
||||||
echo "$(subdir)/$$i"; \
|
|
||||||
else \
|
|
||||||
echo "$$sdir/$$i"; \
|
|
||||||
fi; \
|
|
||||||
done >> $(top_builddir)/cscope.files
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
$(am__remove_distdir)
|
|
||||||
test -d "$(distdir)" || mkdir "$(distdir)"
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
$(am__make_dryrun) \
|
|
||||||
|| test -d "$(distdir)/$$subdir" \
|
|
||||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
|
||||||
|| exit 1; \
|
|
||||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
|
||||||
$(am__relativize); \
|
|
||||||
new_distdir=$$reldir; \
|
|
||||||
dir1=$$subdir; dir2="$(top_distdir)"; \
|
|
||||||
$(am__relativize); \
|
|
||||||
new_top_distdir=$$reldir; \
|
|
||||||
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
|
||||||
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
|
||||||
($(am__cd) $$subdir && \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
top_distdir="$$new_top_distdir" \
|
|
||||||
distdir="$$new_distdir" \
|
|
||||||
am__remove_distdir=: \
|
|
||||||
am__skip_length_check=: \
|
|
||||||
am__skip_mode_fix=: \
|
|
||||||
distdir) \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
-test -n "$(am__skip_mode_fix)" \
|
|
||||||
|| find "$(distdir)" -type d ! -perm -755 \
|
|
||||||
-exec chmod u+rwx,go+rx {} \; -o \
|
|
||||||
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
|
||||||
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
|
||||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
|
||||||
|| chmod -R a+r "$(distdir)"
|
|
||||||
dist-gzip: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
dist-bzip2: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
dist-lzip: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
dist-xz: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
dist-tarZ: distdir
|
|
||||||
@echo WARNING: "Support for distribution archives compressed with" \
|
|
||||||
"legacy program 'compress' is deprecated." >&2
|
|
||||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
|
||||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
dist-shar: distdir
|
|
||||||
@echo WARNING: "Support for shar distribution archives is" \
|
|
||||||
"deprecated." >&2
|
|
||||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
|
||||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
dist-zip: distdir
|
|
||||||
-rm -f $(distdir).zip
|
|
||||||
zip -rq $(distdir).zip $(distdir)
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
dist dist-all:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
# This target untars the dist file and tries a VPATH configuration. Then
|
|
||||||
# it guarantees that the distribution is self-contained by making another
|
|
||||||
# tarfile.
|
|
||||||
distcheck: dist
|
|
||||||
case '$(DIST_ARCHIVES)' in \
|
|
||||||
*.tar.gz*) \
|
|
||||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
|
||||||
*.tar.bz2*) \
|
|
||||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
|
||||||
*.tar.lz*) \
|
|
||||||
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
|
||||||
*.tar.xz*) \
|
|
||||||
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
|
||||||
*.tar.Z*) \
|
|
||||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
|
||||||
*.shar.gz*) \
|
|
||||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
|
||||||
*.zip*) \
|
|
||||||
unzip $(distdir).zip ;;\
|
|
||||||
esac
|
|
||||||
chmod -R a-w $(distdir)
|
|
||||||
chmod u+w $(distdir)
|
|
||||||
mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
|
|
||||||
chmod a-w $(distdir)
|
|
||||||
test -d $(distdir)/_build || exit 0; \
|
|
||||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
|
||||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
|
||||||
&& am__cwd=`pwd` \
|
|
||||||
&& $(am__cd) $(distdir)/_build/sub \
|
|
||||||
&& ../../configure \
|
|
||||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
|
||||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
|
||||||
--srcdir=../.. --prefix="$$dc_install_base" \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
|
||||||
distuninstallcheck \
|
|
||||||
&& chmod -R a-w "$$dc_install_base" \
|
|
||||||
&& ({ \
|
|
||||||
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
|
||||||
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
|
||||||
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
|
||||||
&& rm -rf "$$dc_destdir" \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
|
||||||
&& rm -rf $(DIST_ARCHIVES) \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
|
||||||
&& cd "$$am__cwd" \
|
|
||||||
|| exit 1
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
@(echo "$(distdir) archives ready for distribution: "; \
|
|
||||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
|
||||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
|
||||||
distuninstallcheck:
|
|
||||||
@test -n '$(distuninstallcheck_dir)' || { \
|
|
||||||
echo 'ERROR: trying to run $@ with an empty' \
|
|
||||||
'$$(distuninstallcheck_dir)' >&2; \
|
|
||||||
exit 1; \
|
|
||||||
}; \
|
|
||||||
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
|
||||||
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
|
||||||
exit 1; \
|
|
||||||
}; \
|
|
||||||
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
|
||||||
|| { echo "ERROR: files left after uninstall:" ; \
|
|
||||||
if test -n "$(DESTDIR)"; then \
|
|
||||||
echo " (check DESTDIR support)"; \
|
|
||||||
fi ; \
|
|
||||||
$(distuninstallcheck_listfiles) ; \
|
|
||||||
exit 1; } >&2
|
|
||||||
distcleancheck: distclean
|
|
||||||
@if test '$(srcdir)' = . ; then \
|
|
||||||
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
|
||||||
exit 1 ; \
|
|
||||||
fi
|
|
||||||
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
|
||||||
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
|
||||||
$(distcleancheck_listfiles) ; \
|
|
||||||
exit 1; } >&2
|
|
||||||
check-am: all-am
|
|
||||||
check: check-recursive
|
|
||||||
all-am: Makefile $(DATA)
|
|
||||||
installdirs: installdirs-recursive
|
|
||||||
installdirs-am:
|
|
||||||
for dir in "$(DESTDIR)$(docdir)"; do \
|
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
|
||||||
done
|
|
||||||
install: install-recursive
|
|
||||||
install-exec: install-exec-recursive
|
|
||||||
install-data: install-data-recursive
|
|
||||||
uninstall: uninstall-recursive
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-recursive
|
|
||||||
install-strip:
|
|
||||||
if test -z '$(STRIP)'; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
install; \
|
|
||||||
else \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
|
||||||
fi
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-recursive
|
|
||||||
|
|
||||||
clean-am: clean-generic mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-recursive
|
|
||||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-generic distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-recursive
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-recursive
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-recursive
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am: install-dist_docDATA
|
|
||||||
|
|
||||||
install-dvi: install-dvi-recursive
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am:
|
|
||||||
|
|
||||||
install-html: install-html-recursive
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-recursive
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-recursive
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-recursive
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-recursive
|
|
||||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
|
||||||
-rm -rf $(top_srcdir)/autom4te.cache
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-recursive
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-generic
|
|
||||||
|
|
||||||
pdf: pdf-recursive
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-recursive
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am: uninstall-dist_docDATA
|
|
||||||
|
|
||||||
.MAKE: $(am__recursive_targets) install-am install-strip
|
|
||||||
|
|
||||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
|
||||||
am--refresh check check-am clean clean-cscope clean-generic \
|
|
||||||
cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
|
|
||||||
dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
|
|
||||||
distcheck distclean distclean-generic distclean-tags \
|
|
||||||
distcleancheck distdir distuninstallcheck dvi dvi-am html \
|
|
||||||
html-am info info-am install install-am install-data \
|
|
||||||
install-data-am install-dist_docDATA install-dvi \
|
|
||||||
install-dvi-am install-exec install-exec-am install-html \
|
|
||||||
install-html-am install-info install-info-am install-man \
|
|
||||||
install-pdf install-pdf-am install-ps install-ps-am \
|
|
||||||
install-strip installcheck installcheck-am installdirs \
|
|
||||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
|
||||||
mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
|
|
||||||
tags-am uninstall uninstall-am uninstall-dist_docDATA
|
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
File diff suppressed because it is too large
Load Diff
63
configure.ac
63
configure.ac
|
@ -1,63 +0,0 @@
|
||||||
# -*- Autoconf -*-
|
|
||||||
# Process this file with autoconf to produce a configure script.
|
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
|
||||||
AC_INIT([caesiumclt], [0.9.1-beta], [caesium@saerasoft.com])
|
|
||||||
AC_CONFIG_SRCDIR([src/])
|
|
||||||
AC_CONFIG_AUX_DIR(tools)
|
|
||||||
AM_INIT_AUTOMAKE(-Wall -Werror foreign)
|
|
||||||
|
|
||||||
# Checks for programs.
|
|
||||||
AC_PROG_CC
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
|
||||||
Makefile
|
|
||||||
src/Makefile
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
AC_ARG_WITH(libjpeg, [ --libjpeg=DIR libjpeg is installed in ],
|
|
||||||
[if test $withval != yes; then
|
|
||||||
jpeginfo_cv_libjpeg=$withval
|
|
||||||
fi
|
|
||||||
if test -d "${jpeginfo_cv_libjpeg}/lib"; then
|
|
||||||
LDFLAGS="-L${jpeginfo_cv_libjpeg}/lib $LDFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS -I${jpeginfo_cv_libjpeg}/include"
|
|
||||||
else
|
|
||||||
LDFLAGS="-L${jpeginfo_cv_libjpeg} $LDFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS -I${jpeginfo_cv_libjpeg}"
|
|
||||||
fi])
|
|
||||||
|
|
||||||
# Checks for libraries.
|
|
||||||
AC_CHECK_LIB(jpeg, jpeg_stdio_src, ,[
|
|
||||||
echo "Cannot find libjpeg."
|
|
||||||
exit 1
|
|
||||||
])
|
|
||||||
AC_CHECK_LIB(turbojpeg, tjInitCompress, ,[
|
|
||||||
echo "Cannot find libturbojpeg."
|
|
||||||
exit 1
|
|
||||||
])
|
|
||||||
AC_CHECK_LIB(zopflipng, CZopfliPNGOptimize, ,[
|
|
||||||
echo "Cannot find libzopflipng."
|
|
||||||
exit 1
|
|
||||||
])
|
|
||||||
|
|
||||||
# Checks for header files.
|
|
||||||
AC_CHECK_HEADERS([limits.h stdlib.h string.h getopt.h stdio.h sys/stats.h dirent.h])
|
|
||||||
AC_CHECK_HEADERS(jpeglib.h,,[
|
|
||||||
echo "Cannot find jpeglib.h."
|
|
||||||
exit 1
|
|
||||||
])
|
|
||||||
AC_CHECK_HEADERS(zopflipng/zopflipng_lib.h,,[
|
|
||||||
echo "Cannot find zopflipng/zopflipng_lib.h."
|
|
||||||
exit 1
|
|
||||||
])
|
|
||||||
|
|
||||||
# Checks for typedefs, structures, and compiler characteristics.
|
|
||||||
AC_TYPE_OFF_T
|
|
||||||
|
|
||||||
# Checks for library functions.
|
|
||||||
AC_FUNC_MALLOC
|
|
||||||
AC_CHECK_FUNCS([mkdir strrchr strtol])
|
|
||||||
|
|
||||||
AC_OUTPUT
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
FILE(GLOB CSources *.c)
|
||||||
|
FILE(GLOB CHeaders *.h)
|
||||||
|
|
||||||
|
add_executable(caesiumclt ${CSources} ${CHeaders})
|
||||||
|
|
||||||
|
find_library(caesium caesium /usr/local/lib)
|
||||||
|
target_link_libraries(caesiumclt LINK_PUBLIC caesium)
|
||||||
|
|
||||||
|
install(TARGETS caesiumclt DESTINATION bin)
|
|
@ -1,4 +0,0 @@
|
||||||
bin_PROGRAMS = caesiumclt
|
|
||||||
caesiumclt_SOURCES = main.c jpeg.c compresshelper.c utils.c png.c lodepng.c error.c
|
|
||||||
caesiumclt_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -std=c99 -Wl,-rpath,/opt/mozjpeg/lib64
|
|
||||||
caesiumclt_LDADD = -lm
|
|
674
src/Makefile.in
674
src/Makefile.in
|
@ -1,674 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.15 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
|
||||||
am__is_gnu_make = { \
|
|
||||||
if test -z '$(MAKELEVEL)'; then \
|
|
||||||
false; \
|
|
||||||
elif test -n '$(MAKE_HOST)'; then \
|
|
||||||
true; \
|
|
||||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
|
||||||
true; \
|
|
||||||
else \
|
|
||||||
false; \
|
|
||||||
fi; \
|
|
||||||
}
|
|
||||||
am__make_running_with_option = \
|
|
||||||
case $${target_option-} in \
|
|
||||||
?) ;; \
|
|
||||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
|
||||||
"target option '$${target_option-}' specified" >&2; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
has_opt=no; \
|
|
||||||
sane_makeflags=$$MAKEFLAGS; \
|
|
||||||
if $(am__is_gnu_make); then \
|
|
||||||
sane_makeflags=$$MFLAGS; \
|
|
||||||
else \
|
|
||||||
case $$MAKEFLAGS in \
|
|
||||||
*\\[\ \ ]*) \
|
|
||||||
bs=\\; \
|
|
||||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
|
||||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
|
||||||
esac; \
|
|
||||||
fi; \
|
|
||||||
skip_next=no; \
|
|
||||||
strip_trailopt () \
|
|
||||||
{ \
|
|
||||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
|
||||||
}; \
|
|
||||||
for flg in $$sane_makeflags; do \
|
|
||||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
|
||||||
case $$flg in \
|
|
||||||
*=*|--*) continue;; \
|
|
||||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
|
||||||
-*I?*) strip_trailopt 'I';; \
|
|
||||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
|
||||||
-*O?*) strip_trailopt 'O';; \
|
|
||||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
|
||||||
-*l?*) strip_trailopt 'l';; \
|
|
||||||
-[dEDm]) skip_next=yes;; \
|
|
||||||
-[JT]) skip_next=yes;; \
|
|
||||||
esac; \
|
|
||||||
case $$flg in \
|
|
||||||
*$$target_option*) has_opt=yes; break;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
test $$has_opt = yes
|
|
||||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
|
||||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
bin_PROGRAMS = caesiumclt$(EXEEXT)
|
|
||||||
subdir = src
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
am__installdirs = "$(DESTDIR)$(bindir)"
|
|
||||||
PROGRAMS = $(bin_PROGRAMS)
|
|
||||||
am_caesiumclt_OBJECTS = caesiumclt-main.$(OBJEXT) \
|
|
||||||
caesiumclt-jpeg.$(OBJEXT) caesiumclt-compresshelper.$(OBJEXT) \
|
|
||||||
caesiumclt-utils.$(OBJEXT) caesiumclt-png.$(OBJEXT) \
|
|
||||||
caesiumclt-lodepng.$(OBJEXT) caesiumclt-error.$(OBJEXT)
|
|
||||||
caesiumclt_OBJECTS = $(am_caesiumclt_OBJECTS)
|
|
||||||
caesiumclt_DEPENDENCIES =
|
|
||||||
caesiumclt_LINK = $(CCLD) $(caesiumclt_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
|
||||||
$(LDFLAGS) -o $@
|
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
|
||||||
am__v_P_0 = false
|
|
||||||
am__v_P_1 = :
|
|
||||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
|
||||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
|
||||||
am__v_GEN_0 = @echo " GEN " $@;
|
|
||||||
am__v_GEN_1 =
|
|
||||||
AM_V_at = $(am__v_at_@AM_V@)
|
|
||||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
|
||||||
am__v_at_0 = @
|
|
||||||
am__v_at_1 =
|
|
||||||
DEFAULT_INCLUDES = -I.@am__isrc@
|
|
||||||
depcomp = $(SHELL) $(top_srcdir)/tools/depcomp
|
|
||||||
am__depfiles_maybe = depfiles
|
|
||||||
am__mv = mv -f
|
|
||||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
|
||||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
|
||||||
am__v_lt_0 = --silent
|
|
||||||
am__v_lt_1 =
|
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
|
||||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
|
||||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
|
||||||
am__v_CC_0 = @echo " CC " $@;
|
|
||||||
am__v_CC_1 =
|
|
||||||
CCLD = $(CC)
|
|
||||||
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
|
||||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
|
||||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
|
||||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
|
||||||
am__v_CCLD_1 =
|
|
||||||
SOURCES = $(caesiumclt_SOURCES)
|
|
||||||
DIST_SOURCES = $(caesiumclt_SOURCES)
|
|
||||||
am__can_run_installinfo = \
|
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
|
||||||
n|no|NO) false;; \
|
|
||||||
*) (install-info --version) >/dev/null 2>&1;; \
|
|
||||||
esac
|
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
|
||||||
# Read a list of newline-separated strings from the standard input,
|
|
||||||
# and print each of them once, without duplicates. Input order is
|
|
||||||
# *not* preserved.
|
|
||||||
am__uniquify_input = $(AWK) '\
|
|
||||||
BEGIN { nonempty = 0; } \
|
|
||||||
{ items[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in items) print i; }; } \
|
|
||||||
'
|
|
||||||
# Make sure the list of sources is unique. This is necessary because,
|
|
||||||
# e.g., the same source file might be shared among _SOURCES variables
|
|
||||||
# for different programs/libraries.
|
|
||||||
am__define_uniq_tagged_files = \
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | $(am__uniquify_input)`
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/tools/depcomp
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
GREP = @GREP@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
builddir = @builddir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
caesiumclt_SOURCES = main.c jpeg.c compresshelper.c utils.c png.c lodepng.c error.c
|
|
||||||
caesiumclt_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -std=c99 -Wl,-rpath,/opt/mozjpeg/lib64
|
|
||||||
caesiumclt_LDADD = -lm
|
|
||||||
all: all-am
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .c .o .obj
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --foreign src/Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
install-binPROGRAMS: $(bin_PROGRAMS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
|
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
|
||||||
sed 's/$(EXEEXT)$$//' | \
|
|
||||||
while read p p1; do if test -f $$p \
|
|
||||||
; then echo "$$p"; echo "$$p"; else :; fi; \
|
|
||||||
done | \
|
|
||||||
sed -e 'p;s,.*/,,;n;h' \
|
|
||||||
-e 's|.*|.|' \
|
|
||||||
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
|
|
||||||
sed 'N;N;N;s,\n, ,g' | \
|
|
||||||
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
|
|
||||||
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
|
||||||
if ($$2 == $$4) files[d] = files[d] " " $$1; \
|
|
||||||
else { print "f", $$3 "/" $$4, $$1; } } \
|
|
||||||
END { for (d in files) print "f", d, files[d] }' | \
|
|
||||||
while read type dir files; do \
|
|
||||||
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
|
||||||
test -z "$$files" || { \
|
|
||||||
echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
|
|
||||||
$(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
|
|
||||||
} \
|
|
||||||
; done
|
|
||||||
|
|
||||||
uninstall-binPROGRAMS:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo "$$p"; done | \
|
|
||||||
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
|
|
||||||
-e 's/$$/$(EXEEXT)/' \
|
|
||||||
`; \
|
|
||||||
test -n "$$list" || exit 0; \
|
|
||||||
echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(bindir)" && rm -f $$files
|
|
||||||
|
|
||||||
clean-binPROGRAMS:
|
|
||||||
-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
|
|
||||||
|
|
||||||
caesiumclt$(EXEEXT): $(caesiumclt_OBJECTS) $(caesiumclt_DEPENDENCIES) $(EXTRA_caesiumclt_DEPENDENCIES)
|
|
||||||
@rm -f caesiumclt$(EXEEXT)
|
|
||||||
$(AM_V_CCLD)$(caesiumclt_LINK) $(caesiumclt_OBJECTS) $(caesiumclt_LDADD) $(LIBS)
|
|
||||||
|
|
||||||
mostlyclean-compile:
|
|
||||||
-rm -f *.$(OBJEXT)
|
|
||||||
|
|
||||||
distclean-compile:
|
|
||||||
-rm -f *.tab.c
|
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caesiumclt-compresshelper.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caesiumclt-error.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caesiumclt-jpeg.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caesiumclt-lodepng.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caesiumclt-main.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caesiumclt-png.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caesiumclt-utils.Po@am__quote@
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
|
||||||
|
|
||||||
.c.obj:
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
|
||||||
|
|
||||||
caesiumclt-main.o: main.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-main.o -MD -MP -MF $(DEPDIR)/caesiumclt-main.Tpo -c -o caesiumclt-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-main.Tpo $(DEPDIR)/caesiumclt-main.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='caesiumclt-main.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
|
|
||||||
|
|
||||||
caesiumclt-main.obj: main.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-main.obj -MD -MP -MF $(DEPDIR)/caesiumclt-main.Tpo -c -o caesiumclt-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-main.Tpo $(DEPDIR)/caesiumclt-main.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='caesiumclt-main.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
|
|
||||||
|
|
||||||
caesiumclt-jpeg.o: jpeg.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-jpeg.o -MD -MP -MF $(DEPDIR)/caesiumclt-jpeg.Tpo -c -o caesiumclt-jpeg.o `test -f 'jpeg.c' || echo '$(srcdir)/'`jpeg.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-jpeg.Tpo $(DEPDIR)/caesiumclt-jpeg.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jpeg.c' object='caesiumclt-jpeg.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-jpeg.o `test -f 'jpeg.c' || echo '$(srcdir)/'`jpeg.c
|
|
||||||
|
|
||||||
caesiumclt-jpeg.obj: jpeg.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-jpeg.obj -MD -MP -MF $(DEPDIR)/caesiumclt-jpeg.Tpo -c -o caesiumclt-jpeg.obj `if test -f 'jpeg.c'; then $(CYGPATH_W) 'jpeg.c'; else $(CYGPATH_W) '$(srcdir)/jpeg.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-jpeg.Tpo $(DEPDIR)/caesiumclt-jpeg.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jpeg.c' object='caesiumclt-jpeg.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-jpeg.obj `if test -f 'jpeg.c'; then $(CYGPATH_W) 'jpeg.c'; else $(CYGPATH_W) '$(srcdir)/jpeg.c'; fi`
|
|
||||||
|
|
||||||
caesiumclt-compresshelper.o: compresshelper.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-compresshelper.o -MD -MP -MF $(DEPDIR)/caesiumclt-compresshelper.Tpo -c -o caesiumclt-compresshelper.o `test -f 'compresshelper.c' || echo '$(srcdir)/'`compresshelper.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-compresshelper.Tpo $(DEPDIR)/caesiumclt-compresshelper.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compresshelper.c' object='caesiumclt-compresshelper.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-compresshelper.o `test -f 'compresshelper.c' || echo '$(srcdir)/'`compresshelper.c
|
|
||||||
|
|
||||||
caesiumclt-compresshelper.obj: compresshelper.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-compresshelper.obj -MD -MP -MF $(DEPDIR)/caesiumclt-compresshelper.Tpo -c -o caesiumclt-compresshelper.obj `if test -f 'compresshelper.c'; then $(CYGPATH_W) 'compresshelper.c'; else $(CYGPATH_W) '$(srcdir)/compresshelper.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-compresshelper.Tpo $(DEPDIR)/caesiumclt-compresshelper.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compresshelper.c' object='caesiumclt-compresshelper.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-compresshelper.obj `if test -f 'compresshelper.c'; then $(CYGPATH_W) 'compresshelper.c'; else $(CYGPATH_W) '$(srcdir)/compresshelper.c'; fi`
|
|
||||||
|
|
||||||
caesiumclt-utils.o: utils.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-utils.o -MD -MP -MF $(DEPDIR)/caesiumclt-utils.Tpo -c -o caesiumclt-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-utils.Tpo $(DEPDIR)/caesiumclt-utils.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='caesiumclt-utils.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
|
|
||||||
|
|
||||||
caesiumclt-utils.obj: utils.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-utils.obj -MD -MP -MF $(DEPDIR)/caesiumclt-utils.Tpo -c -o caesiumclt-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-utils.Tpo $(DEPDIR)/caesiumclt-utils.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='caesiumclt-utils.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
|
|
||||||
|
|
||||||
caesiumclt-png.o: png.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-png.o -MD -MP -MF $(DEPDIR)/caesiumclt-png.Tpo -c -o caesiumclt-png.o `test -f 'png.c' || echo '$(srcdir)/'`png.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-png.Tpo $(DEPDIR)/caesiumclt-png.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='png.c' object='caesiumclt-png.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-png.o `test -f 'png.c' || echo '$(srcdir)/'`png.c
|
|
||||||
|
|
||||||
caesiumclt-png.obj: png.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-png.obj -MD -MP -MF $(DEPDIR)/caesiumclt-png.Tpo -c -o caesiumclt-png.obj `if test -f 'png.c'; then $(CYGPATH_W) 'png.c'; else $(CYGPATH_W) '$(srcdir)/png.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-png.Tpo $(DEPDIR)/caesiumclt-png.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='png.c' object='caesiumclt-png.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-png.obj `if test -f 'png.c'; then $(CYGPATH_W) 'png.c'; else $(CYGPATH_W) '$(srcdir)/png.c'; fi`
|
|
||||||
|
|
||||||
caesiumclt-lodepng.o: lodepng.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-lodepng.o -MD -MP -MF $(DEPDIR)/caesiumclt-lodepng.Tpo -c -o caesiumclt-lodepng.o `test -f 'lodepng.c' || echo '$(srcdir)/'`lodepng.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-lodepng.Tpo $(DEPDIR)/caesiumclt-lodepng.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lodepng.c' object='caesiumclt-lodepng.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-lodepng.o `test -f 'lodepng.c' || echo '$(srcdir)/'`lodepng.c
|
|
||||||
|
|
||||||
caesiumclt-lodepng.obj: lodepng.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-lodepng.obj -MD -MP -MF $(DEPDIR)/caesiumclt-lodepng.Tpo -c -o caesiumclt-lodepng.obj `if test -f 'lodepng.c'; then $(CYGPATH_W) 'lodepng.c'; else $(CYGPATH_W) '$(srcdir)/lodepng.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-lodepng.Tpo $(DEPDIR)/caesiumclt-lodepng.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lodepng.c' object='caesiumclt-lodepng.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-lodepng.obj `if test -f 'lodepng.c'; then $(CYGPATH_W) 'lodepng.c'; else $(CYGPATH_W) '$(srcdir)/lodepng.c'; fi`
|
|
||||||
|
|
||||||
caesiumclt-error.o: error.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-error.o -MD -MP -MF $(DEPDIR)/caesiumclt-error.Tpo -c -o caesiumclt-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-error.Tpo $(DEPDIR)/caesiumclt-error.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error.c' object='caesiumclt-error.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c
|
|
||||||
|
|
||||||
caesiumclt-error.obj: error.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -MT caesiumclt-error.obj -MD -MP -MF $(DEPDIR)/caesiumclt-error.Tpo -c -o caesiumclt-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/caesiumclt-error.Tpo $(DEPDIR)/caesiumclt-error.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error.c' object='caesiumclt-error.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(caesiumclt_CFLAGS) $(CFLAGS) -c -o caesiumclt-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi`
|
|
||||||
|
|
||||||
ID: $(am__tagged_files)
|
|
||||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
|
||||||
tags: tags-am
|
|
||||||
TAGS: tags
|
|
||||||
|
|
||||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
$(am__define_uniq_tagged_files); \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: ctags-am
|
|
||||||
|
|
||||||
CTAGS: ctags
|
|
||||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
|
||||||
$(am__define_uniq_tagged_files); \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
cscopelist: cscopelist-am
|
|
||||||
|
|
||||||
cscopelist-am: $(am__tagged_files)
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
case "$(srcdir)" in \
|
|
||||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
|
||||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
|
||||||
esac; \
|
|
||||||
for i in $$list; do \
|
|
||||||
if test -f "$$i"; then \
|
|
||||||
echo "$(subdir)/$$i"; \
|
|
||||||
else \
|
|
||||||
echo "$$sdir/$$i"; \
|
|
||||||
fi; \
|
|
||||||
done >> $(top_builddir)/cscope.files
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
check-am: all-am
|
|
||||||
check: check-am
|
|
||||||
all-am: Makefile $(PROGRAMS)
|
|
||||||
installdirs:
|
|
||||||
for dir in "$(DESTDIR)$(bindir)"; do \
|
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
|
||||||
done
|
|
||||||
install: install-am
|
|
||||||
install-exec: install-exec-am
|
|
||||||
install-data: install-data-am
|
|
||||||
uninstall: uninstall-am
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-am
|
|
||||||
install-strip:
|
|
||||||
if test -z '$(STRIP)'; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
install; \
|
|
||||||
else \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
|
||||||
fi
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-am
|
|
||||||
|
|
||||||
clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
-rm -rf ./$(DEPDIR)
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-compile distclean-generic \
|
|
||||||
distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-am
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am:
|
|
||||||
|
|
||||||
install-dvi: install-dvi-am
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am: install-binPROGRAMS
|
|
||||||
|
|
||||||
install-html: install-html-am
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-am
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-am
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
|
||||||
-rm -rf ./$(DEPDIR)
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-am
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic
|
|
||||||
|
|
||||||
pdf: pdf-am
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-am
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am: uninstall-binPROGRAMS
|
|
||||||
|
|
||||||
.MAKE: install-am install-strip
|
|
||||||
|
|
||||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
|
|
||||||
clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \
|
|
||||||
distclean distclean-compile distclean-generic distclean-tags \
|
|
||||||
distdir dvi dvi-am html html-am info info-am install \
|
|
||||||
install-am install-binPROGRAMS install-data install-data-am \
|
|
||||||
install-dvi install-dvi-am install-exec install-exec-am \
|
|
||||||
install-html install-html-am install-info install-info-am \
|
|
||||||
install-man install-pdf install-pdf-am install-ps \
|
|
||||||
install-ps-am install-strip installcheck installcheck-am \
|
|
||||||
installdirs maintainer-clean maintainer-clean-generic \
|
|
||||||
mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
|
|
||||||
ps ps-am tags tags-am uninstall uninstall-am \
|
|
||||||
uninstall-binPROGRAMS
|
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
|
@ -1,41 +0,0 @@
|
||||||
#ifndef CCLT_CCLTYPES
|
|
||||||
#define CCLT_CCLTYPES
|
|
||||||
|
|
||||||
typedef struct cclt_jpeg_parameters {
|
|
||||||
int quality;
|
|
||||||
int width;
|
|
||||||
int height;
|
|
||||||
int color_space;
|
|
||||||
int dct_method;
|
|
||||||
bool exif_copy;
|
|
||||||
bool lossless;
|
|
||||||
enum TJSAMP subsample;
|
|
||||||
} cclt_jpeg_parameters;
|
|
||||||
|
|
||||||
typedef struct cclt_png_parameters {
|
|
||||||
int iterations;
|
|
||||||
int iterations_large;
|
|
||||||
int block_split_strategy;
|
|
||||||
bool lossy_8;
|
|
||||||
bool transparent;
|
|
||||||
int auto_filter_strategy;
|
|
||||||
} cclt_png_parameters;
|
|
||||||
|
|
||||||
typedef struct cclt_parameters {
|
|
||||||
cclt_jpeg_parameters jpeg;
|
|
||||||
cclt_png_parameters png;
|
|
||||||
|
|
||||||
char* output_folder;
|
|
||||||
char** input_files;
|
|
||||||
int input_files_count;
|
|
||||||
bool recursive;
|
|
||||||
bool structure;
|
|
||||||
} cclt_parameters;
|
|
||||||
|
|
||||||
enum image_type {
|
|
||||||
JPEG,
|
|
||||||
PNG,
|
|
||||||
UNKN,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,267 +0,0 @@
|
||||||
#include <setjmp.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <jpeglib.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <turbojpeg.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <libgen.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include "utils.h"
|
|
||||||
#include "jpeg.h"
|
|
||||||
#include "png.h"
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
void initialize_jpeg_parameters(cclt_parameters* par) {
|
|
||||||
par->jpeg.quality = 0;
|
|
||||||
par->jpeg.width = 0;
|
|
||||||
par->jpeg.height = 0;
|
|
||||||
par->jpeg.color_space = TJCS_RGB;
|
|
||||||
par->jpeg.dct_method = TJFLAG_FASTDCT;
|
|
||||||
par->jpeg.exif_copy = false;
|
|
||||||
par->jpeg.lossless = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void initialize_png_parameters(cclt_parameters* par) {
|
|
||||||
par->png.iterations = 10;
|
|
||||||
par->png.iterations_large = 5;
|
|
||||||
par->png.block_split_strategy = 4;
|
|
||||||
par->png.lossy_8 = true;
|
|
||||||
par->png.transparent = true;
|
|
||||||
par->png.auto_filter_strategy = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cclt_parameters initialize_compression_parameters() {
|
|
||||||
cclt_parameters par;
|
|
||||||
|
|
||||||
initialize_jpeg_parameters(&par);
|
|
||||||
initialize_png_parameters(&par);
|
|
||||||
|
|
||||||
par.output_folder = NULL;
|
|
||||||
par.input_files_count = 0;
|
|
||||||
par.recursive = 0;
|
|
||||||
par.input_files = NULL;
|
|
||||||
par.structure = false;
|
|
||||||
|
|
||||||
return par;
|
|
||||||
}
|
|
||||||
|
|
||||||
void validate_parameters(cclt_parameters* pars) {
|
|
||||||
//Either -l or -q must be set but not together
|
|
||||||
if (!((pars->jpeg.lossless) ^ (pars->jpeg.quality > 0))) {
|
|
||||||
//Both or none are set
|
|
||||||
if (pars->jpeg.lossless && pars->jpeg.quality > 0) {
|
|
||||||
trigger_error(1, true);
|
|
||||||
} else if (!pars->jpeg.lossless && pars->jpeg.quality <= 0) {
|
|
||||||
trigger_error(2, true);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//One of them is set
|
|
||||||
//If -q is set check it is within the 1-100 range
|
|
||||||
if (!(pars->jpeg.quality >= 1 && pars->jpeg.quality <= 100) && pars->jpeg.lossless == 0) {
|
|
||||||
trigger_error(3, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check if you set the input files
|
|
||||||
if (pars->input_files_count == 0) {
|
|
||||||
trigger_error(9, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check if the output folder is set
|
|
||||||
if (pars->output_folder == NULL) {
|
|
||||||
trigger_error(4, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cclt_parameters parse_arguments(int argc, char* argv[]) {
|
|
||||||
|
|
||||||
//Initialize default params
|
|
||||||
cclt_parameters parameters = initialize_compression_parameters();
|
|
||||||
int c;
|
|
||||||
|
|
||||||
while (optind < argc) {
|
|
||||||
if ((c = getopt (argc, argv, "q:velo:s:hR")) != -1) {
|
|
||||||
switch (c) {
|
|
||||||
case 'v':
|
|
||||||
printf("%s-%d\n", APP_VERSION, BUILD);
|
|
||||||
exit(0);
|
|
||||||
case '?':
|
|
||||||
if (optopt == 'q' || optopt == 'o' || optopt == 's') {
|
|
||||||
trigger_error(6, true, optopt);
|
|
||||||
}
|
|
||||||
else if (isprint(optopt)) {
|
|
||||||
trigger_error(100, false, optopt);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
trigger_error(101, false, optopt);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ':':
|
|
||||||
trigger_error(102, false);
|
|
||||||
break;
|
|
||||||
case 'q':
|
|
||||||
parameters.jpeg.quality = string_to_int(optarg);
|
|
||||||
break;
|
|
||||||
case 'e':
|
|
||||||
parameters.jpeg.exif_copy = true;
|
|
||||||
break;
|
|
||||||
case 'l':
|
|
||||||
parameters.jpeg.lossless = true;
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
parameters.output_folder = optarg;
|
|
||||||
break;
|
|
||||||
case 'h':
|
|
||||||
print_help();
|
|
||||||
break;
|
|
||||||
case 'R':
|
|
||||||
parameters.recursive = true;
|
|
||||||
break;
|
|
||||||
case 'S':
|
|
||||||
parameters.structure = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int i = 0;
|
|
||||||
parameters.input_files = (char**) malloc ((argc - optind) * sizeof (char*));
|
|
||||||
while (optind < argc) {
|
|
||||||
if (is_directory(argv[optind])) {
|
|
||||||
if (i != 0) {
|
|
||||||
//TODO This error appears also if there a value to the -l parameter
|
|
||||||
trigger_error(20, true);
|
|
||||||
} else if (i == 0 && argc - optind > 1) {
|
|
||||||
trigger_error(103, false);
|
|
||||||
}
|
|
||||||
scan_folder(¶meters, argv[optind], parameters.recursive);
|
|
||||||
return parameters;
|
|
||||||
} else {
|
|
||||||
parameters.input_files[i] = (char*) malloc (strlen(argv[optind]) * sizeof(char)); //TODO Necessary??
|
|
||||||
parameters.input_files[i] = argv[optind];
|
|
||||||
i++;
|
|
||||||
parameters.input_files_count = i;
|
|
||||||
optind++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check if all parameters are poperly set
|
|
||||||
validate_parameters(¶meters);
|
|
||||||
|
|
||||||
return parameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cclt_compress_routine(char* input, char* output, cclt_parameters* pars) {
|
|
||||||
//Detect which image type are we compressing
|
|
||||||
enum image_type type = detect_image_type(input);
|
|
||||||
char* exif_orig = (char*) malloc(strlen(input) * sizeof(char));
|
|
||||||
strcpy(exif_orig, input);
|
|
||||||
|
|
||||||
if (type == JPEG) {
|
|
||||||
//Lossy processing just uses the compression method before optimizing
|
|
||||||
if (!pars->jpeg.lossless) {
|
|
||||||
cclt_jpeg_compress(output, cclt_jpeg_decompress(input, &pars->jpeg), &pars->jpeg);
|
|
||||||
//TODO Check memory leaks
|
|
||||||
//If we are using lossy compression, the input file is the output of
|
|
||||||
//the previous function
|
|
||||||
//Exif must be copied from the original thou
|
|
||||||
input = output;
|
|
||||||
}
|
|
||||||
//Optimize
|
|
||||||
cclt_jpeg_optimize(input, output, pars->jpeg.exif_copy, exif_orig);
|
|
||||||
} else if (type == PNG) {
|
|
||||||
cclt_png_optimize(input, output, &pars->png);
|
|
||||||
} else {
|
|
||||||
trigger_error(104, false, input);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cclt_start(cclt_parameters* pars, off_t* i_t_size, off_t* o_t_size) {
|
|
||||||
|
|
||||||
struct stat st_buf;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
//Creates the output folder (which will always be needed)
|
|
||||||
if (mkpath(pars->output_folder, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) {
|
|
||||||
if (errno != EEXIST) {
|
|
||||||
trigger_error(5, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (i < pars->input_files_count) {
|
|
||||||
|
|
||||||
off_t i_size, o_size;
|
|
||||||
int status; //Pointer for stat() call
|
|
||||||
|
|
||||||
char* output_filename = (char*) malloc ((strlen(pars->output_folder) + 1) * sizeof(char));
|
|
||||||
|
|
||||||
strcpy(output_filename, pars->output_folder);
|
|
||||||
|
|
||||||
//Append / if was not entered by user
|
|
||||||
if (output_filename[strlen(pars->output_folder) - 1] != '/') {
|
|
||||||
strcat(output_filename, "/");
|
|
||||||
}
|
|
||||||
|
|
||||||
output_filename = realloc(output_filename, (strlen(output_filename) + strlen(basename(pars->input_files[i]))) * sizeof(char));
|
|
||||||
output_filename = strcat(output_filename, basename(pars->input_files[i]));
|
|
||||||
|
|
||||||
//Get input stats
|
|
||||||
status = stat(pars->input_files[i], &st_buf);
|
|
||||||
if (status != 0) {
|
|
||||||
trigger_error(11, true, pars->input_files[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check if we ran into a folder
|
|
||||||
//TODO Check symlinks too
|
|
||||||
if (is_directory(pars->input_files[i])) {
|
|
||||||
//Folder found, but we don't need it here
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get input file size
|
|
||||||
i_size = st_buf.st_size;
|
|
||||||
*(i_t_size) += i_size;
|
|
||||||
|
|
||||||
//TODO Do we want a more verbose output?
|
|
||||||
fprintf(stdout, "(%d/%d) %s -> %s\n",
|
|
||||||
i + 1,
|
|
||||||
pars->input_files_count,
|
|
||||||
pars->input_files[i],
|
|
||||||
output_filename);
|
|
||||||
|
|
||||||
int routine = cclt_compress_routine(pars->input_files[i], output_filename, pars);
|
|
||||||
if (routine == -1) {
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get output stats
|
|
||||||
status = stat(output_filename, &st_buf);
|
|
||||||
if (status != 0) {
|
|
||||||
//TODO This is not critical, but still something to be tracked
|
|
||||||
trigger_error(12, true, output_filename);
|
|
||||||
}
|
|
||||||
o_size = st_buf.st_size;
|
|
||||||
*(o_t_size) += o_size;
|
|
||||||
|
|
||||||
fprintf(stdout, "%s -> %s [%.2f%%]\n",
|
|
||||||
get_human_size(i_size),
|
|
||||||
get_human_size(o_size),
|
|
||||||
((float) o_size - i_size) * 100 / i_size);
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
#ifndef CCLT_COMPRESSHELPER
|
|
||||||
#define CCLT_COMPRESSHELPER
|
|
||||||
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
cclt_parameters initialize_compression_parameters();
|
|
||||||
cclt_parameters parse_arguments(int argc, char* argv[]);
|
|
||||||
int cclt_compress_routine(char* input, char* output, cclt_parameters* pars); //Returns -1 if the file type is unknown
|
|
||||||
void cclt_start(cclt_parameters* pars, off_t* i_t_size, off_t* o_t_size);
|
|
||||||
//TODO Maybe it's better to return a int
|
|
||||||
void validate_parameters(cclt_parameters* pars);
|
|
||||||
|
|
||||||
#endif
|
|
120
src/error.c
120
src/error.c
|
@ -1,120 +0,0 @@
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We could leave error messages where they happens,
|
|
||||||
* but I want a more centralized way to track what went wrong
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define parse_error_level(level) ((level) ? "ERROR" : "WARNING")
|
|
||||||
|
|
||||||
void trigger_error(int code, bool is_critical, ...) {
|
|
||||||
va_list args;
|
|
||||||
va_start(args, is_critical);
|
|
||||||
|
|
||||||
fprintf(stderr, "%s - %d: ",
|
|
||||||
parse_error_level(is_critical),
|
|
||||||
code);
|
|
||||||
|
|
||||||
switch (code) {
|
|
||||||
case 1:
|
|
||||||
fprintf(stderr,
|
|
||||||
"-l option can't be used with -q. Either use one or the other.");
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
fprintf(stderr,
|
|
||||||
"Either -l or -q must be set.");
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
fprintf(stderr,
|
|
||||||
"Quality must be within a [1-100] range.");
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
fprintf(stderr,
|
|
||||||
"No -o option pointing to the destination folder.");
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
fprintf(stderr,
|
|
||||||
"Failed to create output directory. Permission issue?");
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Option -%c requires an argument.", args);
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
fprintf(stderr,
|
|
||||||
"No input files.");
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Failed to get input file stats: %s", args);
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Failed to get output file stats: %s", args);
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Failed to open file (markers): %s", args);
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Failed to open PNG file: %s", args);
|
|
||||||
break;
|
|
||||||
case 17:
|
|
||||||
fprintf(stderr,
|
|
||||||
"Error while optimizing PNG.");
|
|
||||||
break;
|
|
||||||
case 18:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Error while writing PNG: %s", args);
|
|
||||||
case 20:
|
|
||||||
fprintf(stderr,
|
|
||||||
"Found folder along with input files.");
|
|
||||||
case 100:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Unknown option `-%c'.", args);
|
|
||||||
break;
|
|
||||||
case 101:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Unknown option character `\\x%x'.", args);
|
|
||||||
break;
|
|
||||||
case 102:
|
|
||||||
fprintf(stderr,
|
|
||||||
"Parameter expected.");
|
|
||||||
break;
|
|
||||||
case 103:
|
|
||||||
fprintf(stderr,
|
|
||||||
"Folder found, skipping all other inputs.");
|
|
||||||
break;
|
|
||||||
case 104:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Unknown file type: %s", args);
|
|
||||||
break;
|
|
||||||
case 105:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Failed to open file (input): %s", args);
|
|
||||||
break;
|
|
||||||
case 106:
|
|
||||||
vfprintf(stderr,
|
|
||||||
"Failed to open file (output): %s", args);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//Every unlisted code is critical
|
|
||||||
is_critical = true;
|
|
||||||
fprintf(stderr,
|
|
||||||
"Cs-137 spreading out. Good luck.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
if (is_critical) {
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef CCLT_ERROR
|
|
||||||
#define CCLT_ERROR
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
void trigger_error(int code, bool is_critical, ...);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "helper.h"
|
||||||
|
#include "optparse.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
void initialize_jpeg_parameters(cs_image_pars *options)
|
||||||
|
{
|
||||||
|
options->jpeg.quality = 65;
|
||||||
|
options->jpeg.exif_copy = false;
|
||||||
|
options->jpeg.dct_method = 2048;
|
||||||
|
options->jpeg.width = 0;
|
||||||
|
options->jpeg.height = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void initialize_png_parameters(cs_image_pars *par)
|
||||||
|
{
|
||||||
|
par->png.iterations = 10;
|
||||||
|
par->png.iterations_large = 5;
|
||||||
|
par->png.block_split_strategy = 4;
|
||||||
|
par->png.lossy_8 = true;
|
||||||
|
par->png.transparent = true;
|
||||||
|
par->png.auto_filter_strategy = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cs_image_pars initialize_parameters()
|
||||||
|
{
|
||||||
|
cs_image_pars options;
|
||||||
|
|
||||||
|
initialize_jpeg_parameters(&options);
|
||||||
|
initialize_png_parameters(&options);
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
cs_image_pars parse_arguments(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct optparse options;
|
||||||
|
//Initialize the default parameters
|
||||||
|
cs_image_pars result = initialize_parameters();
|
||||||
|
|
||||||
|
//Parse command line args
|
||||||
|
optparse_init(&options, argv);
|
||||||
|
struct optparse_long longopts[] = {
|
||||||
|
{"quality", 'q', OPTPARSE_REQUIRED},
|
||||||
|
{"exif", 'e', OPTPARSE_NONE},
|
||||||
|
{"output", 'o', OPTPARSE_REQUIRED},
|
||||||
|
{"lossless", 'l', OPTPARSE_NONE},
|
||||||
|
{"recursive", 'R', OPTPARSE_NONE},
|
||||||
|
{"keep-structure", 'S', OPTPARSE_NONE},
|
||||||
|
{"version", 'v', OPTPARSE_NONE},
|
||||||
|
{"help", 'h', OPTPARSE_NONE},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
int option;
|
||||||
|
|
||||||
|
while ((option = optparse_long(&options, longopts, NULL)) != -1) {
|
||||||
|
switch (option) {
|
||||||
|
case 'q':
|
||||||
|
result.jpeg.quality = atoi(options.optarg);
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
result.jpeg.exif_copy = true;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
//TODO General args
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
result.jpeg.quality = 0;
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
//TODO General args
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
//TODO General args
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
fprintf(stdout,
|
||||||
|
"%s-%d\n", APP_VERSION_STRING, BUILD);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
case 'h':
|
||||||
|
print_help();
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "%s: %s\n", argv[0], options.errmsg);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print remaining arguments. */
|
||||||
|
char *arg;
|
||||||
|
while ((arg = optparse_arg(&options)))
|
||||||
|
printf("%s\n", arg);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef CAESIUM_CLT_HELPER_H
|
||||||
|
#define CAESIUM_CLT_HELPER_H
|
||||||
|
|
||||||
|
#include <caesium.h>
|
||||||
|
|
||||||
|
void initialize_jpeg_parameters(cs_image_pars *options);
|
||||||
|
|
||||||
|
void initialize_png_parameters(cs_image_pars *options);
|
||||||
|
|
||||||
|
cs_image_pars initialize_parameters();
|
||||||
|
|
||||||
|
cs_image_pars parse_arguments(int argc, char *argv[]);
|
||||||
|
|
||||||
|
#endif //CAESIUM_CLT_HELPER_H
|
266
src/jpeg.c
266
src/jpeg.c
|
@ -1,266 +0,0 @@
|
||||||
#include <setjmp.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <jpeglib.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <turbojpeg.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "jpeg.h"
|
|
||||||
#include "utils.h"
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
//TODO Error handling
|
|
||||||
|
|
||||||
struct jpeg_decompress_struct cclt_get_markers(char* input) {
|
|
||||||
FILE* fp;
|
|
||||||
struct jpeg_decompress_struct einfo;
|
|
||||||
struct jpeg_error_mgr eerr;
|
|
||||||
einfo.err = jpeg_std_error(&eerr);
|
|
||||||
|
|
||||||
jpeg_create_decompress(&einfo);
|
|
||||||
|
|
||||||
//Open the input file
|
|
||||||
fp = fopen(input, "r");
|
|
||||||
|
|
||||||
//Check for errors
|
|
||||||
//TODO Use UNIX error messages
|
|
||||||
if (fp == NULL) {
|
|
||||||
trigger_error(13, true, input);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create the IO instance for the input file
|
|
||||||
jpeg_stdio_src(&einfo, fp);
|
|
||||||
|
|
||||||
//Save EXIF info
|
|
||||||
for (int m = 0; m < 16; m++) {
|
|
||||||
jpeg_save_markers(&einfo, JPEG_APP0 + m, 0xFFFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
jpeg_read_header(&einfo, TRUE);
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
return einfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cclt_jpeg_optimize(char* input_file, char* output_file, int exif_flag, char* exif_src) {
|
|
||||||
//TODO Bug on normal compress: the input file is a bogus long string
|
|
||||||
// Happened with a (bugged) server connection
|
|
||||||
//File pointer for both input and output
|
|
||||||
FILE* fp;
|
|
||||||
|
|
||||||
//Those will hold the input/output structs
|
|
||||||
struct jpeg_decompress_struct srcinfo;
|
|
||||||
struct jpeg_compress_struct dstinfo;
|
|
||||||
|
|
||||||
//Error handling
|
|
||||||
struct jpeg_error_mgr jsrcerr, jdsterr;
|
|
||||||
|
|
||||||
//Input/Output array coefficents
|
|
||||||
jvirt_barray_ptr* src_coef_arrays;
|
|
||||||
jvirt_barray_ptr* dst_coef_arrays;
|
|
||||||
|
|
||||||
//Set errors and create the compress/decompress istances
|
|
||||||
srcinfo.err = jpeg_std_error(&jsrcerr);
|
|
||||||
jpeg_create_decompress(&srcinfo);
|
|
||||||
dstinfo.err = jpeg_std_error(&jdsterr);
|
|
||||||
jpeg_create_compress(&dstinfo);
|
|
||||||
|
|
||||||
|
|
||||||
//Open the input file
|
|
||||||
fp = fopen(input_file, "r");
|
|
||||||
|
|
||||||
//Check for errors
|
|
||||||
//TODO Use UNIX error messages
|
|
||||||
if (fp == NULL) {
|
|
||||||
trigger_error(105, true, input_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create the IO istance for the input file
|
|
||||||
jpeg_stdio_src(&srcinfo, fp);
|
|
||||||
|
|
||||||
//Save EXIF info
|
|
||||||
if (exif_flag) {
|
|
||||||
for (int m = 0; m < 16; m++) {
|
|
||||||
jpeg_save_markers(&srcinfo, JPEG_APP0 + m, 0xFFFF);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Read the input headers
|
|
||||||
(void) jpeg_read_header(&srcinfo, TRUE);
|
|
||||||
|
|
||||||
|
|
||||||
//Read input coefficents
|
|
||||||
src_coef_arrays = jpeg_read_coefficients(&srcinfo);
|
|
||||||
//jcopy_markers_setup(&srcinfo, copyoption);
|
|
||||||
|
|
||||||
//Copy parameters
|
|
||||||
jpeg_copy_critical_parameters(&srcinfo, &dstinfo);
|
|
||||||
|
|
||||||
//Set coefficents array to be the same
|
|
||||||
dst_coef_arrays = src_coef_arrays;
|
|
||||||
|
|
||||||
//We don't need the input file anymore
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
//Open the output one instead
|
|
||||||
fp = fopen(output_file, "w+");
|
|
||||||
//Check for errors
|
|
||||||
//TODO Use UNIX error messages
|
|
||||||
if (fp == NULL) {
|
|
||||||
trigger_error(106, true, output_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
//CRITICAL - This is the optimization step
|
|
||||||
dstinfo.optimize_coding = TRUE;
|
|
||||||
//Progressive
|
|
||||||
jpeg_simple_progression(&dstinfo);
|
|
||||||
|
|
||||||
//Set the output file parameters
|
|
||||||
jpeg_stdio_dest(&dstinfo, fp);
|
|
||||||
|
|
||||||
//Actually write the coefficents
|
|
||||||
jpeg_write_coefficients(&dstinfo, dst_coef_arrays);
|
|
||||||
|
|
||||||
//Write EXIF
|
|
||||||
if (exif_flag == 1) {
|
|
||||||
if (strcmp(input_file, exif_src) == 0) {
|
|
||||||
jcopy_markers_execute(&srcinfo, &dstinfo);
|
|
||||||
} else {
|
|
||||||
//For standard compression EXIF data
|
|
||||||
struct jpeg_decompress_struct einfo = cclt_get_markers(exif_src);
|
|
||||||
jcopy_markers_execute(&einfo, &dstinfo);
|
|
||||||
jpeg_destroy_decompress(&einfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Finish and free
|
|
||||||
jpeg_finish_compress(&dstinfo);
|
|
||||||
jpeg_destroy_compress(&dstinfo);
|
|
||||||
(void) jpeg_finish_decompress(&srcinfo);
|
|
||||||
jpeg_destroy_decompress(&srcinfo);
|
|
||||||
|
|
||||||
//Close the output file
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cclt_jpeg_compress(char* output_file, unsigned char* image_buffer, cclt_jpeg_parameters* pars) {
|
|
||||||
FILE* fp;
|
|
||||||
tjhandle tjCompressHandle;
|
|
||||||
unsigned char* output_buffer;
|
|
||||||
unsigned long output_size = 0;
|
|
||||||
|
|
||||||
fp = fopen(output_file, "wb");
|
|
||||||
|
|
||||||
//Check for errors
|
|
||||||
//TODO Use UNIX error messages
|
|
||||||
if (fp == NULL) {
|
|
||||||
trigger_error(106, true, output_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
output_buffer = NULL;
|
|
||||||
tjCompressHandle = tjInitCompress();
|
|
||||||
|
|
||||||
//TODO Error checks
|
|
||||||
tjCompress2(tjCompressHandle,
|
|
||||||
image_buffer,
|
|
||||||
pars->width,
|
|
||||||
0,
|
|
||||||
pars->height,
|
|
||||||
pars->color_space,
|
|
||||||
&output_buffer,
|
|
||||||
&output_size,
|
|
||||||
pars->subsample,
|
|
||||||
pars->quality,
|
|
||||||
pars->dct_method);
|
|
||||||
|
|
||||||
fwrite(output_buffer, output_size, 1, fp);
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
tjDestroy(tjCompressHandle);
|
|
||||||
tjFree(output_buffer);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char* cclt_jpeg_decompress(char* fileName, cclt_jpeg_parameters* pars) {
|
|
||||||
|
|
||||||
//TODO I/O Error handling
|
|
||||||
|
|
||||||
FILE *file = NULL;
|
|
||||||
int res = 0;
|
|
||||||
long int sourceJpegBufferSize = 0;
|
|
||||||
unsigned char* sourceJpegBuffer = NULL;
|
|
||||||
tjhandle tjDecompressHandle;
|
|
||||||
int fileWidth = 0, fileHeight = 0, jpegSubsamp = 0, colorSpace = 0;
|
|
||||||
|
|
||||||
//TODO No error checks here
|
|
||||||
file = fopen(fileName, "rb");
|
|
||||||
res = fseek(file, 0, SEEK_END);
|
|
||||||
sourceJpegBufferSize = ftell(file);
|
|
||||||
sourceJpegBuffer = tjAlloc(sourceJpegBufferSize);
|
|
||||||
|
|
||||||
res = fseek(file, 0, SEEK_SET);
|
|
||||||
res = fread(sourceJpegBuffer, (long)sourceJpegBufferSize, 1, file);
|
|
||||||
tjDecompressHandle = tjInitDecompress();
|
|
||||||
res = tjDecompressHeader3(tjDecompressHandle, sourceJpegBuffer, sourceJpegBufferSize, &fileWidth, &fileHeight, &jpegSubsamp, &colorSpace);
|
|
||||||
|
|
||||||
pars->width = fileWidth;
|
|
||||||
pars->height = fileHeight;
|
|
||||||
|
|
||||||
pars->subsample = jpegSubsamp;
|
|
||||||
pars->color_space = colorSpace;
|
|
||||||
|
|
||||||
unsigned char* temp = tjAlloc(pars->width * pars->height * tjPixelSize[pars->color_space]);
|
|
||||||
|
|
||||||
res = tjDecompress2(tjDecompressHandle,
|
|
||||||
sourceJpegBuffer,
|
|
||||||
sourceJpegBufferSize,
|
|
||||||
temp,
|
|
||||||
pars->width,
|
|
||||||
0,
|
|
||||||
pars->height,
|
|
||||||
pars->color_space,
|
|
||||||
pars->dct_method);
|
|
||||||
|
|
||||||
//fwrite(temp, pars->width * pars->height * tjPixelSize[pars->color_space], 1, fopen("/Users/lymphatus/Desktop/tmp/compresse/ccc", "w"));
|
|
||||||
|
|
||||||
tjDestroy(tjDecompressHandle);
|
|
||||||
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void jcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo) {
|
|
||||||
jpeg_saved_marker_ptr marker;
|
|
||||||
|
|
||||||
/* In the current implementation, we don't actually need to examine the
|
|
||||||
* option flag here; we just copy everything that got saved.
|
|
||||||
* But to avoid confusion, we do not output JFIF and Adobe APP14 markers
|
|
||||||
* if the encoder library already wrote one.
|
|
||||||
*/
|
|
||||||
for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) {
|
|
||||||
if (dstinfo->write_JFIF_header &&
|
|
||||||
marker->marker == JPEG_APP0 &&
|
|
||||||
marker->data_length >= 5 &&
|
|
||||||
GETJOCTET(marker->data[0]) == 0x4A &&
|
|
||||||
GETJOCTET(marker->data[1]) == 0x46 &&
|
|
||||||
GETJOCTET(marker->data[2]) == 0x49 &&
|
|
||||||
GETJOCTET(marker->data[3]) == 0x46 &&
|
|
||||||
GETJOCTET(marker->data[4]) == 0)
|
|
||||||
continue; /* reject duplicate JFIF */
|
|
||||||
if (dstinfo->write_Adobe_marker &&
|
|
||||||
marker->marker == JPEG_APP0+14 &&
|
|
||||||
marker->data_length >= 5 &&
|
|
||||||
GETJOCTET(marker->data[0]) == 0x41 &&
|
|
||||||
GETJOCTET(marker->data[1]) == 0x64 &&
|
|
||||||
GETJOCTET(marker->data[2]) == 0x6F &&
|
|
||||||
GETJOCTET(marker->data[3]) == 0x62 &&
|
|
||||||
GETJOCTET(marker->data[4]) == 0x65)
|
|
||||||
continue; /* reject duplicate Adobe */
|
|
||||||
jpeg_write_marker(dstinfo, marker->marker,
|
|
||||||
marker->data, marker->data_length);
|
|
||||||
}
|
|
||||||
}
|
|
15
src/jpeg.h
15
src/jpeg.h
|
@ -1,15 +0,0 @@
|
||||||
#ifndef CCLT_JPEG
|
|
||||||
#define CCLT_JPEG
|
|
||||||
|
|
||||||
#include <jpeglib.h>
|
|
||||||
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
int cclt_jpeg_optimize(char* input_file, char* output_file, int exif_flag, char* exif_src);
|
|
||||||
struct jpeg_decompress_struct cclt_get_markers(char* input);
|
|
||||||
void cclt_jpeg_compress(char* output_file, unsigned char* image_buffer, cclt_jpeg_parameters* pars);
|
|
||||||
unsigned char* cclt_jpeg_decompress(char* fileName, cclt_jpeg_parameters* pars);
|
|
||||||
void jcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
6251
src/lodepng.c
6251
src/lodepng.c
File diff suppressed because it is too large
Load Diff
893
src/lodepng.h
893
src/lodepng.h
|
@ -1,893 +0,0 @@
|
||||||
/*
|
|
||||||
LodePNG version 20131222
|
|
||||||
|
|
||||||
Copyright (c) 2005-2013 Lode Vandevenne
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef LODEPNG_H
|
|
||||||
#define LODEPNG_H
|
|
||||||
|
|
||||||
#include <string.h> /*for size_t*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#endif /*__cplusplus*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
The following #defines are used to create code sections. They can be disabled
|
|
||||||
to disable code sections, which can give faster compile time and smaller binary.
|
|
||||||
The "NO_COMPILE" defines are designed to be used to pass as defines to the
|
|
||||||
compiler command to disable them without modifying this header, e.g.
|
|
||||||
-DLODEPNG_NO_COMPILE_ZLIB for gcc.
|
|
||||||
*/
|
|
||||||
/*deflate & zlib. If disabled, you must specify alternative zlib functions in
|
|
||||||
the custom_zlib field of the compress and decompress settings*/
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_ZLIB
|
|
||||||
#define LODEPNG_COMPILE_ZLIB
|
|
||||||
#endif
|
|
||||||
/*png encoder and png decoder*/
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_PNG
|
|
||||||
#define LODEPNG_COMPILE_PNG
|
|
||||||
#endif
|
|
||||||
/*deflate&zlib decoder and png decoder*/
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_DECODER
|
|
||||||
#define LODEPNG_COMPILE_DECODER
|
|
||||||
#endif
|
|
||||||
/*deflate&zlib encoder and png encoder*/
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_ENCODER
|
|
||||||
#define LODEPNG_COMPILE_ENCODER
|
|
||||||
#endif
|
|
||||||
/*the optional built in harddisk file loading and saving functions*/
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_DISK
|
|
||||||
#define LODEPNG_COMPILE_DISK
|
|
||||||
#endif
|
|
||||||
/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS
|
|
||||||
#define LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
|
||||||
#endif
|
|
||||||
/*ability to convert error numerical codes to English text string*/
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT
|
|
||||||
#define LODEPNG_COMPILE_ERROR_TEXT
|
|
||||||
#endif
|
|
||||||
/*Compile the default allocators (C's free, malloc and realloc). If you disable this,
|
|
||||||
you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your
|
|
||||||
source files with custom allocators.*/
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_ALLOCATORS
|
|
||||||
#define LODEPNG_COMPILE_ALLOCATORS
|
|
||||||
#endif
|
|
||||||
/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_CPP
|
|
||||||
#define LODEPNG_COMPILE_CPP
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_PNG
|
|
||||||
/*The PNG color types (also used for raw).*/
|
|
||||||
typedef enum LodePNGColorType
|
|
||||||
{
|
|
||||||
LCT_GREY = 0, /*greyscale: 1,2,4,8,16 bit*/
|
|
||||||
LCT_RGB = 2, /*RGB: 8,16 bit*/
|
|
||||||
LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/
|
|
||||||
LCT_GREY_ALPHA = 4, /*greyscale with alpha: 8,16 bit*/
|
|
||||||
LCT_RGBA = 6 /*RGB with alpha: 8,16 bit*/
|
|
||||||
} LodePNGColorType;
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
/*
|
|
||||||
Converts PNG data in memory to raw pixel data.
|
|
||||||
out: Output parameter. Pointer to buffer that will contain the raw pixel data.
|
|
||||||
After decoding, its size is w * h * (bytes per pixel) bytes larger than
|
|
||||||
initially. Bytes per pixel depends on colortype and bitdepth.
|
|
||||||
Must be freed after usage with free(*out).
|
|
||||||
Note: for 16-bit per channel colors, uses big endian format like PNG does.
|
|
||||||
w: Output parameter. Pointer to width of pixel data.
|
|
||||||
h: Output parameter. Pointer to height of pixel data.
|
|
||||||
in: Memory buffer with the PNG file.
|
|
||||||
insize: size of the in buffer.
|
|
||||||
colortype: the desired color type for the raw output image. See explanation on PNG color types.
|
|
||||||
bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types.
|
|
||||||
Return value: LodePNG error code (0 means no error).
|
|
||||||
*/
|
|
||||||
unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h,
|
|
||||||
const unsigned char* in, size_t insize,
|
|
||||||
LodePNGColorType colortype, unsigned bitdepth);
|
|
||||||
|
|
||||||
/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/
|
|
||||||
unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h,
|
|
||||||
const unsigned char* in, size_t insize);
|
|
||||||
|
|
||||||
/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/
|
|
||||||
unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h,
|
|
||||||
const unsigned char* in, size_t insize);
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DISK
|
|
||||||
/*
|
|
||||||
Load PNG from disk, from file with given name.
|
|
||||||
Same as the other decode functions, but instead takes a filename as input.
|
|
||||||
*/
|
|
||||||
unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h,
|
|
||||||
const char* filename,
|
|
||||||
LodePNGColorType colortype, unsigned bitdepth);
|
|
||||||
|
|
||||||
/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/
|
|
||||||
unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h,
|
|
||||||
const char* filename);
|
|
||||||
|
|
||||||
/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/
|
|
||||||
unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h,
|
|
||||||
const char* filename);
|
|
||||||
#endif /*LODEPNG_COMPILE_DISK*/
|
|
||||||
#endif /*LODEPNG_COMPILE_DECODER*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
/*
|
|
||||||
Converts raw pixel data into a PNG image in memory. The colortype and bitdepth
|
|
||||||
of the output PNG image cannot be chosen, they are automatically determined
|
|
||||||
by the colortype, bitdepth and content of the input pixel data.
|
|
||||||
Note: for 16-bit per channel colors, needs big endian format like PNG does.
|
|
||||||
out: Output parameter. Pointer to buffer that will contain the PNG image data.
|
|
||||||
Must be freed after usage with free(*out).
|
|
||||||
outsize: Output parameter. Pointer to the size in bytes of the out buffer.
|
|
||||||
image: The raw pixel data to encode. The size of this buffer should be
|
|
||||||
w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth.
|
|
||||||
w: width of the raw pixel data in pixels.
|
|
||||||
h: height of the raw pixel data in pixels.
|
|
||||||
colortype: the color type of the raw input image. See explanation on PNG color types.
|
|
||||||
bitdepth: the bit depth of the raw input image. See explanation on PNG color types.
|
|
||||||
Return value: LodePNG error code (0 means no error).
|
|
||||||
*/
|
|
||||||
unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize,
|
|
||||||
const unsigned char* image, unsigned w, unsigned h,
|
|
||||||
LodePNGColorType colortype, unsigned bitdepth);
|
|
||||||
|
|
||||||
/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/
|
|
||||||
unsigned lodepng_encode32(unsigned char** out, size_t* outsize,
|
|
||||||
const unsigned char* image, unsigned w, unsigned h);
|
|
||||||
|
|
||||||
/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/
|
|
||||||
unsigned lodepng_encode24(unsigned char** out, size_t* outsize,
|
|
||||||
const unsigned char* image, unsigned w, unsigned h);
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DISK
|
|
||||||
/*
|
|
||||||
Converts raw pixel data into a PNG file on disk.
|
|
||||||
Same as the other encode functions, but instead takes a filename as output.
|
|
||||||
NOTE: This overwrites existing files without warning!
|
|
||||||
*/
|
|
||||||
unsigned lodepng_encode_file(const char* filename,
|
|
||||||
const unsigned char* image, unsigned w, unsigned h,
|
|
||||||
LodePNGColorType colortype, unsigned bitdepth);
|
|
||||||
|
|
||||||
/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/
|
|
||||||
unsigned lodepng_encode32_file(const char* filename,
|
|
||||||
const unsigned char* image, unsigned w, unsigned h);
|
|
||||||
|
|
||||||
/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/
|
|
||||||
unsigned lodepng_encode24_file(const char* filename,
|
|
||||||
const unsigned char* image, unsigned w, unsigned h);
|
|
||||||
#endif /*LODEPNG_COMPILE_DISK*/
|
|
||||||
#endif /*LODEPNG_COMPILE_ENCODER*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_CPP
|
|
||||||
namespace lodepng
|
|
||||||
{
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
/*Same as lodepng_decode_memory, but decodes to an std::vector.*/
|
|
||||||
unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
|
|
||||||
const unsigned char* in, size_t insize,
|
|
||||||
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
|
|
||||||
unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
|
|
||||||
const std::vector<unsigned char>& in,
|
|
||||||
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
|
|
||||||
#ifdef LODEPNG_COMPILE_DISK
|
|
||||||
/*
|
|
||||||
Converts PNG file from disk to raw pixel data in memory.
|
|
||||||
Same as the other decode functions, but instead takes a filename as input.
|
|
||||||
*/
|
|
||||||
unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
|
|
||||||
const std::string& filename,
|
|
||||||
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
|
|
||||||
#endif //LODEPNG_COMPILE_DISK
|
|
||||||
#endif //LODEPNG_COMPILE_DECODER
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
/*Same as lodepng_encode_memory, but encodes to an std::vector.*/
|
|
||||||
unsigned encode(std::vector<unsigned char>& out,
|
|
||||||
const unsigned char* in, unsigned w, unsigned h,
|
|
||||||
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
|
|
||||||
unsigned encode(std::vector<unsigned char>& out,
|
|
||||||
const std::vector<unsigned char>& in, unsigned w, unsigned h,
|
|
||||||
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
|
|
||||||
#ifdef LODEPNG_COMPILE_DISK
|
|
||||||
/*
|
|
||||||
Converts 32-bit RGBA raw pixel data into a PNG file on disk.
|
|
||||||
Same as the other encode functions, but instead takes a filename as output.
|
|
||||||
NOTE: This overwrites existing files without warning!
|
|
||||||
*/
|
|
||||||
unsigned encode(const std::string& filename,
|
|
||||||
const unsigned char* in, unsigned w, unsigned h,
|
|
||||||
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
|
|
||||||
unsigned encode(const std::string& filename,
|
|
||||||
const std::vector<unsigned char>& in, unsigned w, unsigned h,
|
|
||||||
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
|
|
||||||
#endif //LODEPNG_COMPILE_DISK
|
|
||||||
#endif //LODEPNG_COMPILE_ENCODER
|
|
||||||
} //namespace lodepng
|
|
||||||
#endif /*LODEPNG_COMPILE_CPP*/
|
|
||||||
#endif /*LODEPNG_COMPILE_PNG*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ERROR_TEXT
|
|
||||||
/*Returns an English description of the numerical error code.*/
|
|
||||||
const char* lodepng_error_text(unsigned code);
|
|
||||||
#endif /*LODEPNG_COMPILE_ERROR_TEXT*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
/*Settings for zlib decompression*/
|
|
||||||
typedef struct LodePNGDecompressSettings LodePNGDecompressSettings;
|
|
||||||
struct LodePNGDecompressSettings
|
|
||||||
{
|
|
||||||
unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/
|
|
||||||
|
|
||||||
/*use custom zlib decoder instead of built in one (default: null)*/
|
|
||||||
unsigned (*custom_zlib)(unsigned char**, size_t*,
|
|
||||||
const unsigned char*, size_t,
|
|
||||||
const LodePNGDecompressSettings*);
|
|
||||||
/*use custom deflate decoder instead of built in one (default: null)
|
|
||||||
if custom_zlib is used, custom_deflate is ignored since only the built in
|
|
||||||
zlib function will call custom_deflate*/
|
|
||||||
unsigned (*custom_inflate)(unsigned char**, size_t*,
|
|
||||||
const unsigned char*, size_t,
|
|
||||||
const LodePNGDecompressSettings*);
|
|
||||||
|
|
||||||
const void* custom_context; /*optional custom settings for custom functions*/
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const LodePNGDecompressSettings lodepng_default_decompress_settings;
|
|
||||||
void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings);
|
|
||||||
#endif /*LODEPNG_COMPILE_DECODER*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
/*
|
|
||||||
Settings for zlib compression. Tweaking these settings tweaks the balance
|
|
||||||
between speed and compression ratio.
|
|
||||||
*/
|
|
||||||
typedef struct LodePNGCompressSettings LodePNGCompressSettings;
|
|
||||||
struct LodePNGCompressSettings /*deflate = compress*/
|
|
||||||
{
|
|
||||||
/*LZ77 related settings*/
|
|
||||||
unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/
|
|
||||||
unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/
|
|
||||||
unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Typical value: 2048.*/
|
|
||||||
unsigned minmatch; /*mininum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/
|
|
||||||
unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/
|
|
||||||
unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/
|
|
||||||
|
|
||||||
/*use custom zlib encoder instead of built in one (default: null)*/
|
|
||||||
unsigned (*custom_zlib)(unsigned char**, size_t*,
|
|
||||||
const unsigned char*, size_t,
|
|
||||||
const LodePNGCompressSettings*);
|
|
||||||
/*use custom deflate encoder instead of built in one (default: null)
|
|
||||||
if custom_zlib is used, custom_deflate is ignored since only the built in
|
|
||||||
zlib function will call custom_deflate*/
|
|
||||||
unsigned (*custom_deflate)(unsigned char**, size_t*,
|
|
||||||
const unsigned char*, size_t,
|
|
||||||
const LodePNGCompressSettings*);
|
|
||||||
|
|
||||||
const void* custom_context; /*optional custom settings for custom functions*/
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const LodePNGCompressSettings lodepng_default_compress_settings;
|
|
||||||
void lodepng_compress_settings_init(LodePNGCompressSettings* settings);
|
|
||||||
#endif /*LODEPNG_COMPILE_ENCODER*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_PNG
|
|
||||||
/*
|
|
||||||
Color mode of an image. Contains all information required to decode the pixel
|
|
||||||
bits to RGBA colors. This information is the same as used in the PNG file
|
|
||||||
format, and is used both for PNG and raw image data in LodePNG.
|
|
||||||
*/
|
|
||||||
typedef struct LodePNGColorMode
|
|
||||||
{
|
|
||||||
/*header (IHDR)*/
|
|
||||||
LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/
|
|
||||||
unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
palette (PLTE and tRNS)
|
|
||||||
|
|
||||||
Dynamically allocated with the colors of the palette, including alpha.
|
|
||||||
When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use
|
|
||||||
lodepng_palette_clear, then for each color use lodepng_palette_add.
|
|
||||||
If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette.
|
|
||||||
|
|
||||||
When decoding, by default you can ignore this palette, since LodePNG already
|
|
||||||
fills the palette colors in the pixels of the raw RGBA output.
|
|
||||||
|
|
||||||
The palette is only supported for color type 3.
|
|
||||||
*/
|
|
||||||
unsigned char* palette; /*palette in RGBARGBA... order. When allocated, must be either 0, or have size 1024*/
|
|
||||||
size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
transparent color key (tRNS)
|
|
||||||
|
|
||||||
This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit.
|
|
||||||
For greyscale PNGs, r, g and b will all 3 be set to the same.
|
|
||||||
|
|
||||||
When decoding, by default you can ignore this information, since LodePNG sets
|
|
||||||
pixels with this key to transparent already in the raw RGBA output.
|
|
||||||
|
|
||||||
The color key is only supported for color types 0 and 2.
|
|
||||||
*/
|
|
||||||
unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/
|
|
||||||
unsigned key_r; /*red/greyscale component of color key*/
|
|
||||||
unsigned key_g; /*green component of color key*/
|
|
||||||
unsigned key_b; /*blue component of color key*/
|
|
||||||
} LodePNGColorMode;
|
|
||||||
|
|
||||||
/*init, cleanup and copy functions to use with this struct*/
|
|
||||||
void lodepng_color_mode_init(LodePNGColorMode* info);
|
|
||||||
void lodepng_color_mode_cleanup(LodePNGColorMode* info);
|
|
||||||
/*return value is error code (0 means no error)*/
|
|
||||||
unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source);
|
|
||||||
|
|
||||||
void lodepng_palette_clear(LodePNGColorMode* info);
|
|
||||||
/*add 1 color to the palette*/
|
|
||||||
unsigned lodepng_palette_add(LodePNGColorMode* info,
|
|
||||||
unsigned char r, unsigned char g, unsigned char b, unsigned char a);
|
|
||||||
|
|
||||||
/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/
|
|
||||||
unsigned lodepng_get_bpp(const LodePNGColorMode* info);
|
|
||||||
/*get the amount of color channels used, based on colortype in the struct.
|
|
||||||
If a palette is used, it counts as 1 channel.*/
|
|
||||||
unsigned lodepng_get_channels(const LodePNGColorMode* info);
|
|
||||||
/*is it a greyscale type? (only colortype 0 or 4)*/
|
|
||||||
unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info);
|
|
||||||
/*has it got an alpha channel? (only colortype 2 or 6)*/
|
|
||||||
unsigned lodepng_is_alpha_type(const LodePNGColorMode* info);
|
|
||||||
/*has it got a palette? (only colortype 3)*/
|
|
||||||
unsigned lodepng_is_palette_type(const LodePNGColorMode* info);
|
|
||||||
/*only returns true if there is a palette and there is a value in the palette with alpha < 255.
|
|
||||||
Loops through the palette to check this.*/
|
|
||||||
unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info);
|
|
||||||
/*
|
|
||||||
Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image.
|
|
||||||
Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels).
|
|
||||||
Returns false if the image can only have opaque pixels.
|
|
||||||
In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values,
|
|
||||||
or if "key_defined" is true.
|
|
||||||
*/
|
|
||||||
unsigned lodepng_can_have_alpha(const LodePNGColorMode* info);
|
|
||||||
/*Returns the byte size of a raw image buffer with given width, height and color mode*/
|
|
||||||
size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color);
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
|
||||||
/*The information of a Time chunk in PNG.*/
|
|
||||||
typedef struct LodePNGTime
|
|
||||||
{
|
|
||||||
unsigned year; /*2 bytes used (0-65535)*/
|
|
||||||
unsigned month; /*1-12*/
|
|
||||||
unsigned day; /*1-31*/
|
|
||||||
unsigned hour; /*0-23*/
|
|
||||||
unsigned minute; /*0-59*/
|
|
||||||
unsigned second; /*0-60 (to allow for leap seconds)*/
|
|
||||||
} LodePNGTime;
|
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
|
||||||
|
|
||||||
/*Information about the PNG image, except pixels, width and height.*/
|
|
||||||
typedef struct LodePNGInfo
|
|
||||||
{
|
|
||||||
/*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/
|
|
||||||
unsigned compression_method;/*compression method of the original file. Always 0.*/
|
|
||||||
unsigned filter_method; /*filter method of the original file*/
|
|
||||||
unsigned interlace_method; /*interlace method of the original file*/
|
|
||||||
LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
|
||||||
/*
|
|
||||||
suggested background color chunk (bKGD)
|
|
||||||
This color uses the same color mode as the PNG (except alpha channel), which can be 1-bit to 16-bit.
|
|
||||||
|
|
||||||
For greyscale PNGs, r, g and b will all 3 be set to the same. When encoding
|
|
||||||
the encoder writes the red one. For palette PNGs: When decoding, the RGB value
|
|
||||||
will be stored, not a palette index. But when encoding, specify the index of
|
|
||||||
the palette in background_r, the other two are then ignored.
|
|
||||||
|
|
||||||
The decoder does not use this background color to edit the color of pixels.
|
|
||||||
*/
|
|
||||||
unsigned background_defined; /*is a suggested background color given?*/
|
|
||||||
unsigned background_r; /*red component of suggested background color*/
|
|
||||||
unsigned background_g; /*green component of suggested background color*/
|
|
||||||
unsigned background_b; /*blue component of suggested background color*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
non-international text chunks (tEXt and zTXt)
|
|
||||||
|
|
||||||
The char** arrays each contain num strings. The actual messages are in
|
|
||||||
text_strings, while text_keys are keywords that give a short description what
|
|
||||||
the actual text represents, e.g. Title, Author, Description, or anything else.
|
|
||||||
|
|
||||||
A keyword is minimum 1 character and maximum 79 characters long. It's
|
|
||||||
discouraged to use a single line length longer than 79 characters for texts.
|
|
||||||
|
|
||||||
Don't allocate these text buffers yourself. Use the init/cleanup functions
|
|
||||||
correctly and use lodepng_add_text and lodepng_clear_text.
|
|
||||||
*/
|
|
||||||
size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/
|
|
||||||
char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/
|
|
||||||
char** text_strings; /*the actual text*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
international text chunks (iTXt)
|
|
||||||
Similar to the non-international text chunks, but with additional strings
|
|
||||||
"langtags" and "transkeys".
|
|
||||||
*/
|
|
||||||
size_t itext_num; /*the amount of international texts in this PNG*/
|
|
||||||
char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/
|
|
||||||
char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/
|
|
||||||
char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/
|
|
||||||
char** itext_strings; /*the actual international text - UTF-8 string*/
|
|
||||||
|
|
||||||
/*time chunk (tIME)*/
|
|
||||||
unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/
|
|
||||||
LodePNGTime time;
|
|
||||||
|
|
||||||
/*phys chunk (pHYs)*/
|
|
||||||
unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/
|
|
||||||
unsigned phys_x; /*pixels per unit in x direction*/
|
|
||||||
unsigned phys_y; /*pixels per unit in y direction*/
|
|
||||||
unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
unknown chunks
|
|
||||||
There are 3 buffers, one for each position in the PNG where unknown chunks can appear
|
|
||||||
each buffer contains all unknown chunks for that position consecutively
|
|
||||||
The 3 buffers are the unknown chunks between certain critical chunks:
|
|
||||||
0: IHDR-PLTE, 1: PLTE-IDAT, 2: IDAT-IEND
|
|
||||||
Do not allocate or traverse this data yourself. Use the chunk traversing functions declared
|
|
||||||
later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct.
|
|
||||||
*/
|
|
||||||
unsigned char* unknown_chunks_data[3];
|
|
||||||
size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/
|
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
|
||||||
} LodePNGInfo;
|
|
||||||
|
|
||||||
/*init, cleanup and copy functions to use with this struct*/
|
|
||||||
void lodepng_info_init(LodePNGInfo* info);
|
|
||||||
void lodepng_info_cleanup(LodePNGInfo* info);
|
|
||||||
/*return value is error code (0 means no error)*/
|
|
||||||
unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source);
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
|
||||||
void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/
|
|
||||||
unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/
|
|
||||||
|
|
||||||
void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/
|
|
||||||
unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag,
|
|
||||||
const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/
|
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Converts raw buffer from one color type to another color type, based on
|
|
||||||
LodePNGColorMode structs to describe the input and output color type.
|
|
||||||
See the reference manual at the end of this header file to see which color conversions are supported.
|
|
||||||
return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported)
|
|
||||||
The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel
|
|
||||||
of the output color type (lodepng_get_bpp)
|
|
||||||
The fix_png value works as described in struct LodePNGDecoderSettings.
|
|
||||||
Note: for 16-bit per channel colors, uses big endian format like PNG does.
|
|
||||||
*/
|
|
||||||
unsigned lodepng_convert(unsigned char* out, const unsigned char* in,
|
|
||||||
LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in,
|
|
||||||
unsigned w, unsigned h, unsigned fix_png);
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
/*
|
|
||||||
Settings for the decoder. This contains settings for the PNG and the Zlib
|
|
||||||
decoder, but not the Info settings from the Info structs.
|
|
||||||
*/
|
|
||||||
typedef struct LodePNGDecoderSettings
|
|
||||||
{
|
|
||||||
LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/
|
|
||||||
|
|
||||||
unsigned ignore_crc; /*ignore CRC checksums*/
|
|
||||||
/*
|
|
||||||
The fix_png setting, if 1, makes the decoder tolerant towards some PNG images
|
|
||||||
that do not correctly follow the PNG specification. This only supports errors
|
|
||||||
that are fixable, were found in images that are actually used on the web, and
|
|
||||||
are silently tolerated by other decoders as well. Currently only one such fix
|
|
||||||
is implemented: if a palette index is out of bounds given the palette size,
|
|
||||||
interpret it as opaque black.
|
|
||||||
By default this value is 0, which makes it stop with an error on such images.
|
|
||||||
*/
|
|
||||||
unsigned fix_png;
|
|
||||||
unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
|
||||||
unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/
|
|
||||||
/*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/
|
|
||||||
unsigned remember_unknown_chunks;
|
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
|
||||||
} LodePNGDecoderSettings;
|
|
||||||
|
|
||||||
void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings);
|
|
||||||
#endif /*LODEPNG_COMPILE_DECODER*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/
|
|
||||||
typedef enum LodePNGFilterStrategy
|
|
||||||
{
|
|
||||||
/*every filter at zero*/
|
|
||||||
LFS_ZERO,
|
|
||||||
/*Use filter that gives minumum sum, as described in the official PNG filter heuristic.*/
|
|
||||||
LFS_MINSUM,
|
|
||||||
/*Use the filter type that gives smallest Shannon entropy for this scanline. Depending
|
|
||||||
on the image, this is better or worse than minsum.*/
|
|
||||||
LFS_ENTROPY,
|
|
||||||
/*
|
|
||||||
Brute-force-search PNG filters by compressing each filter for each scanline.
|
|
||||||
Experimental, very slow, and only rarely gives better compression than MINSUM.
|
|
||||||
*/
|
|
||||||
LFS_BRUTE_FORCE,
|
|
||||||
/*use predefined_filters buffer: you specify the filter type for each scanline*/
|
|
||||||
LFS_PREDEFINED
|
|
||||||
} LodePNGFilterStrategy;
|
|
||||||
|
|
||||||
/*automatically use color type with less bits per pixel if losslessly possible. Default: LAC_AUTO*/
|
|
||||||
typedef enum LodePNGAutoConvert
|
|
||||||
{
|
|
||||||
LAC_NO, /*use color type user requested*/
|
|
||||||
LAC_ALPHA, /*use color type user requested, but if only opaque pixels and RGBA or grey+alpha, use RGB or grey*/
|
|
||||||
LAC_AUTO, /*use PNG color type that can losslessly represent the uncompressed image the smallest possible*/
|
|
||||||
/*
|
|
||||||
like AUTO, but do not choose 1, 2 or 4 bit per pixel types.
|
|
||||||
sometimes a PNG image compresses worse if less than 8 bits per pixels.
|
|
||||||
*/
|
|
||||||
LAC_AUTO_NO_NIBBLES,
|
|
||||||
/*
|
|
||||||
like AUTO, but never choose palette color type. For small images, encoding
|
|
||||||
the palette may take more bytes than what is gained. Note that AUTO also
|
|
||||||
already prevents encoding the palette for extremely small images, but that may
|
|
||||||
not be sufficient because due to the compression it cannot predict when to
|
|
||||||
switch.
|
|
||||||
*/
|
|
||||||
LAC_AUTO_NO_PALETTE,
|
|
||||||
LAC_AUTO_NO_NIBBLES_NO_PALETTE
|
|
||||||
} LodePNGAutoConvert;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Automatically chooses color type that gives smallest amount of bits in the
|
|
||||||
output image, e.g. grey if there are only greyscale pixels, palette if there
|
|
||||||
are less than 256 colors, ...
|
|
||||||
The auto_convert parameter allows limiting it to not use palette, ...
|
|
||||||
*/
|
|
||||||
unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out,
|
|
||||||
const unsigned char* image, unsigned w, unsigned h,
|
|
||||||
const LodePNGColorMode* mode_in,
|
|
||||||
LodePNGAutoConvert auto_convert);
|
|
||||||
|
|
||||||
/*Settings for the encoder.*/
|
|
||||||
typedef struct LodePNGEncoderSettings
|
|
||||||
{
|
|
||||||
LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/
|
|
||||||
|
|
||||||
LodePNGAutoConvert auto_convert; /*how to automatically choose output PNG color type, if at all*/
|
|
||||||
|
|
||||||
/*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than
|
|
||||||
8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to
|
|
||||||
completely follow the official PNG heuristic, filter_palette_zero must be true and
|
|
||||||
filter_strategy must be LFS_MINSUM*/
|
|
||||||
unsigned filter_palette_zero;
|
|
||||||
/*Which filter strategy to use when not using zeroes due to filter_palette_zero.
|
|
||||||
Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/
|
|
||||||
LodePNGFilterStrategy filter_strategy;
|
|
||||||
/*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with
|
|
||||||
the same length as the amount of scanlines in the image, and each value must <= 5. You
|
|
||||||
have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero
|
|
||||||
must be set to 0 to ensure this is also used on palette or low bitdepth images.*/
|
|
||||||
const unsigned char* predefined_filters;
|
|
||||||
|
|
||||||
/*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette).
|
|
||||||
If colortype is 3, PLTE is _always_ created.*/
|
|
||||||
unsigned force_palette;
|
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
|
||||||
/*add LodePNG identifier and version as a text chunk, for debugging*/
|
|
||||||
unsigned add_id;
|
|
||||||
/*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/
|
|
||||||
unsigned text_compression;
|
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
|
||||||
} LodePNGEncoderSettings;
|
|
||||||
|
|
||||||
void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings);
|
|
||||||
#endif /*LODEPNG_COMPILE_ENCODER*/
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER)
|
|
||||||
/*The settings, state and information for extended encoding and decoding.*/
|
|
||||||
typedef struct LodePNGState
|
|
||||||
{
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
LodePNGDecoderSettings decoder; /*the decoding settings*/
|
|
||||||
#endif /*LODEPNG_COMPILE_DECODER*/
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
LodePNGEncoderSettings encoder; /*the encoding settings*/
|
|
||||||
#endif /*LODEPNG_COMPILE_ENCODER*/
|
|
||||||
LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/
|
|
||||||
LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/
|
|
||||||
unsigned error;
|
|
||||||
#ifdef LODEPNG_COMPILE_CPP
|
|
||||||
//For the lodepng::State subclass.
|
|
||||||
virtual ~LodePNGState(){}
|
|
||||||
#endif
|
|
||||||
} LodePNGState;
|
|
||||||
|
|
||||||
/*init, cleanup and copy functions to use with this struct*/
|
|
||||||
void lodepng_state_init(LodePNGState* state);
|
|
||||||
void lodepng_state_cleanup(LodePNGState* state);
|
|
||||||
void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source);
|
|
||||||
#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
/*
|
|
||||||
Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and
|
|
||||||
getting much more information about the PNG image and color mode.
|
|
||||||
*/
|
|
||||||
unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h,
|
|
||||||
LodePNGState* state,
|
|
||||||
const unsigned char* in, size_t insize);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Read the PNG header, but not the actual data. This returns only the information
|
|
||||||
that is in the header chunk of the PNG, such as width, height and color type. The
|
|
||||||
information is placed in the info_png field of the LodePNGState.
|
|
||||||
*/
|
|
||||||
unsigned lodepng_inspect(unsigned* w, unsigned* h,
|
|
||||||
LodePNGState* state,
|
|
||||||
const unsigned char* in, size_t insize);
|
|
||||||
#endif /*LODEPNG_COMPILE_DECODER*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/
|
|
||||||
unsigned lodepng_encode(unsigned char** out, size_t* outsize,
|
|
||||||
const unsigned char* image, unsigned w, unsigned h,
|
|
||||||
LodePNGState* state);
|
|
||||||
#endif /*LODEPNG_COMPILE_ENCODER*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
The lodepng_chunk functions are normally not needed, except to traverse the
|
|
||||||
unknown chunks stored in the LodePNGInfo struct, or add new ones to it.
|
|
||||||
It also allows traversing the chunks of an encoded PNG file yourself.
|
|
||||||
|
|
||||||
PNG standard chunk naming conventions:
|
|
||||||
First byte: uppercase = critical, lowercase = ancillary
|
|
||||||
Second byte: uppercase = public, lowercase = private
|
|
||||||
Third byte: must be uppercase
|
|
||||||
Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*get the length of the data of the chunk. Total chunk length has 12 bytes more.*/
|
|
||||||
unsigned lodepng_chunk_length(const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*puts the 4-byte type in null terminated string*/
|
|
||||||
void lodepng_chunk_type(char type[5], const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*check if the type is the given type*/
|
|
||||||
unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type);
|
|
||||||
|
|
||||||
/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/
|
|
||||||
unsigned char lodepng_chunk_ancillary(const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*0: public, 1: private (see PNG standard)*/
|
|
||||||
unsigned char lodepng_chunk_private(const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/
|
|
||||||
unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*get pointer to the data of the chunk, where the input points to the header of the chunk*/
|
|
||||||
unsigned char* lodepng_chunk_data(unsigned char* chunk);
|
|
||||||
const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/
|
|
||||||
unsigned lodepng_chunk_check_crc(const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/
|
|
||||||
void lodepng_chunk_generate_crc(unsigned char* chunk);
|
|
||||||
|
|
||||||
/*iterate to next chunks. don't use on IEND chunk, as there is no next chunk then*/
|
|
||||||
unsigned char* lodepng_chunk_next(unsigned char* chunk);
|
|
||||||
const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Appends chunk to the data in out. The given chunk should already have its chunk header.
|
|
||||||
The out variable and outlength are updated to reflect the new reallocated buffer.
|
|
||||||
Returns error code (0 if it went ok)
|
|
||||||
*/
|
|
||||||
unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Appends new chunk to out. The chunk to append is given by giving its length, type
|
|
||||||
and data separately. The type is a 4-letter string.
|
|
||||||
The out variable and outlength are updated to reflect the new reallocated buffer.
|
|
||||||
Returne error code (0 if it went ok)
|
|
||||||
*/
|
|
||||||
unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length,
|
|
||||||
const char* type, const unsigned char* data);
|
|
||||||
|
|
||||||
|
|
||||||
/*Calculate CRC32 of buffer*/
|
|
||||||
unsigned lodepng_crc32(const unsigned char* buf, size_t len);
|
|
||||||
#endif /*LODEPNG_COMPILE_PNG*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ZLIB
|
|
||||||
/*
|
|
||||||
This zlib part can be used independently to zlib compress and decompress a
|
|
||||||
buffer. It cannot be used to create gzip files however, and it only supports the
|
|
||||||
part of zlib that is required for PNG, it does not support dictionaries.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/
|
|
||||||
unsigned lodepng_inflate(unsigned char** out, size_t* outsize,
|
|
||||||
const unsigned char* in, size_t insize,
|
|
||||||
const LodePNGDecompressSettings* settings);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Decompresses Zlib data. Reallocates the out buffer and appends the data. The
|
|
||||||
data must be according to the zlib specification.
|
|
||||||
Either, *out must be NULL and *outsize must be 0, or, *out must be a valid
|
|
||||||
buffer and *outsize its size in bytes. out must be freed by user after usage.
|
|
||||||
*/
|
|
||||||
unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize,
|
|
||||||
const unsigned char* in, size_t insize,
|
|
||||||
const LodePNGDecompressSettings* settings);
|
|
||||||
#endif /*LODEPNG_COMPILE_DECODER*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
/*
|
|
||||||
Compresses data with Zlib. Reallocates the out buffer and appends the data.
|
|
||||||
Zlib adds a small header and trailer around the deflate data.
|
|
||||||
The data is output in the format of the zlib specification.
|
|
||||||
Either, *out must be NULL and *outsize must be 0, or, *out must be a valid
|
|
||||||
buffer and *outsize its size in bytes. out must be freed by user after usage.
|
|
||||||
*/
|
|
||||||
unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize,
|
|
||||||
const unsigned char* in, size_t insize,
|
|
||||||
const LodePNGCompressSettings* settings);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Find length-limited Huffman code for given frequencies. This function is in the
|
|
||||||
public interface only for tests, it's used internally by lodepng_deflate.
|
|
||||||
*/
|
|
||||||
unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies,
|
|
||||||
size_t numcodes, unsigned maxbitlen);
|
|
||||||
|
|
||||||
/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/
|
|
||||||
unsigned lodepng_deflate(unsigned char** out, size_t* outsize,
|
|
||||||
const unsigned char* in, size_t insize,
|
|
||||||
const LodePNGCompressSettings* settings);
|
|
||||||
|
|
||||||
#endif /*LODEPNG_COMPILE_ENCODER*/
|
|
||||||
#endif /*LODEPNG_COMPILE_ZLIB*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DISK
|
|
||||||
/*
|
|
||||||
Load a file from disk into buffer. The function allocates the out buffer, and
|
|
||||||
after usage you should free it.
|
|
||||||
out: output parameter, contains pointer to loaded buffer.
|
|
||||||
outsize: output parameter, size of the allocated out buffer
|
|
||||||
filename: the path to the file to load
|
|
||||||
return value: error code (0 means ok)
|
|
||||||
*/
|
|
||||||
unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Save a file from buffer to disk. Warning, if it exists, this function overwrites
|
|
||||||
the file without warning!
|
|
||||||
buffer: the buffer to write
|
|
||||||
buffersize: size of the buffer to write
|
|
||||||
filename: the path to the file to save to
|
|
||||||
return value: error code (0 means ok)
|
|
||||||
*/
|
|
||||||
unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename);
|
|
||||||
#endif /*LODEPNG_COMPILE_DISK*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_CPP
|
|
||||||
//The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers.
|
|
||||||
namespace lodepng
|
|
||||||
{
|
|
||||||
#ifdef LODEPNG_COMPILE_PNG
|
|
||||||
class State : public LodePNGState
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
State();
|
|
||||||
State(const State& other);
|
|
||||||
virtual ~State();
|
|
||||||
State& operator=(const State& other);
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
//Same as other lodepng::decode, but using a State for more settings and information.
|
|
||||||
unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
|
|
||||||
State& state,
|
|
||||||
const unsigned char* in, size_t insize);
|
|
||||||
unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
|
|
||||||
State& state,
|
|
||||||
const std::vector<unsigned char>& in);
|
|
||||||
#endif /*LODEPNG_COMPILE_DECODER*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
//Same as other lodepng::encode, but using a State for more settings and information.
|
|
||||||
unsigned encode(std::vector<unsigned char>& out,
|
|
||||||
const unsigned char* in, unsigned w, unsigned h,
|
|
||||||
State& state);
|
|
||||||
unsigned encode(std::vector<unsigned char>& out,
|
|
||||||
const std::vector<unsigned char>& in, unsigned w, unsigned h,
|
|
||||||
State& state);
|
|
||||||
#endif /*LODEPNG_COMPILE_ENCODER*/
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_DISK
|
|
||||||
/*
|
|
||||||
Load a file from disk into an std::vector. If the vector is empty, then either
|
|
||||||
the file doesn't exist or is an empty file.
|
|
||||||
*/
|
|
||||||
void load_file(std::vector<unsigned char>& buffer, const std::string& filename);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Save the binary data in an std::vector to a file on disk. The file is overwritten
|
|
||||||
without warning.
|
|
||||||
*/
|
|
||||||
void save_file(const std::vector<unsigned char>& buffer, const std::string& filename);
|
|
||||||
#endif //LODEPNG_COMPILE_DISK
|
|
||||||
#endif //LODEPNG_COMPILE_PNG
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ZLIB
|
|
||||||
#ifdef LODEPNG_COMPILE_DECODER
|
|
||||||
//Zlib-decompress an unsigned char buffer
|
|
||||||
unsigned decompress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,
|
|
||||||
const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings);
|
|
||||||
|
|
||||||
//Zlib-decompress an std::vector
|
|
||||||
unsigned decompress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,
|
|
||||||
const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings);
|
|
||||||
#endif //LODEPNG_COMPILE_DECODER
|
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
|
||||||
//Zlib-compress an unsigned char buffer
|
|
||||||
unsigned compress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,
|
|
||||||
const LodePNGCompressSettings& settings = lodepng_default_compress_settings);
|
|
||||||
|
|
||||||
//Zlib-compress an std::vector
|
|
||||||
unsigned compress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,
|
|
||||||
const LodePNGCompressSettings& settings = lodepng_default_compress_settings);
|
|
||||||
#endif //LODEPNG_COMPILE_ENCODER
|
|
||||||
#endif //LODEPNG_COMPILE_ZLIB
|
|
||||||
} //namespace lodepng
|
|
||||||
#endif /*LODEPNG_COMPILE_CPP*/
|
|
||||||
|
|
||||||
#endif /*LODEPNG_H inclusion guard*/
|
|
58
src/main.c
58
src/main.c
|
@ -1,53 +1,27 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <libgen.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include "jpeg.h"
|
#include <errno.h>
|
||||||
#include "compresshelper.h"
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
/* PARAMETERS:
|
|
||||||
-q quality v
|
|
||||||
-e exif v
|
|
||||||
-o output folder v
|
|
||||||
-v version v
|
|
||||||
-l lossless v
|
|
||||||
-h help v
|
|
||||||
-R recursive v
|
|
||||||
-S keep folder structure
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TODO If the output is INSIDE the folder we are passing as input, ignore it or
|
int main(int argc, char* argv[]) {
|
||||||
// we're gonna go in a infinite loop
|
|
||||||
// TODO Trigger a warning if you are overwriting files
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
off_t i_t_size = 0, o_t_size = 0;
|
long execution_ms = 0;
|
||||||
// Parse arguments
|
//TODO Parse arguments
|
||||||
cclt_parameters pars = parse_arguments(argc, argv);
|
|
||||||
|
|
||||||
// Start a timer
|
//Start a timer before calling the compression
|
||||||
clock_t start = clock(), diff;
|
clock_t start = clock(), diff;
|
||||||
// We need the file list right here
|
|
||||||
cclt_start(&pars, &i_t_size, &o_t_size);
|
|
||||||
|
|
||||||
|
//TODO Compress here
|
||||||
|
//start(input_files, output_folder, options);
|
||||||
|
|
||||||
|
//Get the difference
|
||||||
diff = clock() - start;
|
diff = clock() - start;
|
||||||
long msec = diff * 1000 / CLOCKS_PER_SEC;
|
execution_ms = diff * 1000 / CLOCKS_PER_SEC;
|
||||||
|
|
||||||
fprintf(stdout, "-------------------------------\nCompression completed in "
|
//Output the compression results
|
||||||
"%lum%lus%lums\n%s -> %s [%.2f%% | %s]\n",
|
fprintf(stdout,
|
||||||
msec / 1000 / 60, msec / 1000 % 60, msec % 1000,
|
"Performed in %lum%lus%lums\n",
|
||||||
get_human_size((long)i_t_size), get_human_size((long)o_t_size),
|
execution_ms / 1000 / 60, execution_ms / 1000 % 60, execution_ms % 1000);
|
||||||
((float)o_t_size - i_t_size) * 100 / i_t_size,
|
}
|
||||||
get_human_size(((long)o_t_size - i_t_size)));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -0,0 +1,264 @@
|
||||||
|
#include "optparse.h"
|
||||||
|
|
||||||
|
#define MSG_INVALID "invalid option"
|
||||||
|
#define MSG_MISSING "option requires an argument"
|
||||||
|
#define MSG_TOOMANY "option takes no arguments"
|
||||||
|
|
||||||
|
static int
|
||||||
|
opterror(struct optparse *options, const char *message, const char *data)
|
||||||
|
{
|
||||||
|
unsigned p = 0;
|
||||||
|
while (*message)
|
||||||
|
options->errmsg[p++] = *message++;
|
||||||
|
const char *sep = " -- '";
|
||||||
|
while (*sep)
|
||||||
|
options->errmsg[p++] = *sep++;
|
||||||
|
while (p < sizeof(options->errmsg) - 2 && *data)
|
||||||
|
options->errmsg[p++] = *data++;
|
||||||
|
options->errmsg[p++] = '\'';
|
||||||
|
options->errmsg[p++] = '\0';
|
||||||
|
return '?';
|
||||||
|
}
|
||||||
|
|
||||||
|
void optparse_init(struct optparse *options, char **argv)
|
||||||
|
{
|
||||||
|
options->argv = argv;
|
||||||
|
options->permute = 1;
|
||||||
|
options->optind = 1;
|
||||||
|
options->subopt = 0;
|
||||||
|
options->optarg = 0;
|
||||||
|
options->errmsg[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
is_dashdash(const char *arg)
|
||||||
|
{
|
||||||
|
return arg != 0 && arg[0] == '-' && arg[1] == '-' && arg[2] == '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
is_shortopt(const char *arg)
|
||||||
|
{
|
||||||
|
return arg != 0 && arg[0] == '-' && arg[1] != '-' && arg[1] != '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
is_longopt(const char *arg)
|
||||||
|
{
|
||||||
|
return arg != 0 && arg[0] == '-' && arg[1] == '-' && arg[2] != '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
permute(struct optparse *options, int index)
|
||||||
|
{
|
||||||
|
char *nonoption = options->argv[index];
|
||||||
|
for (int i = index; i < options->optind - 1; i++)
|
||||||
|
options->argv[i] = options->argv[i + 1];
|
||||||
|
options->argv[options->optind - 1] = nonoption;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
argtype(const char *optstring, char c)
|
||||||
|
{
|
||||||
|
if (c == ':')
|
||||||
|
return -1;
|
||||||
|
for (; *optstring && c != *optstring; optstring++);
|
||||||
|
if (!*optstring)
|
||||||
|
return -1;
|
||||||
|
int count = OPTPARSE_NONE;
|
||||||
|
if (optstring[1] == ':')
|
||||||
|
count += optstring[2] == ':' ? 2 : 1;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int optparse(struct optparse *options, const char *optstring)
|
||||||
|
{
|
||||||
|
options->errmsg[0] = '\0';
|
||||||
|
options->optopt = 0;
|
||||||
|
options->optarg = 0;
|
||||||
|
char *option = options->argv[options->optind];
|
||||||
|
if (option == 0) {
|
||||||
|
return -1;
|
||||||
|
} else if (is_dashdash(option)) {
|
||||||
|
options->optind++; /* consume "--" */
|
||||||
|
return -1;
|
||||||
|
} else if (!is_shortopt(option)) {
|
||||||
|
if (options->permute) {
|
||||||
|
int index = options->optind;
|
||||||
|
options->optind++;
|
||||||
|
int r = optparse(options, optstring);
|
||||||
|
permute(options, index);
|
||||||
|
options->optind--;
|
||||||
|
return r;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
option += options->subopt + 1;
|
||||||
|
options->optopt = option[0];
|
||||||
|
int type = argtype(optstring, option[0]);
|
||||||
|
char *next = options->argv[options->optind + 1];
|
||||||
|
switch (type) {
|
||||||
|
case -1: {
|
||||||
|
options->optind++;
|
||||||
|
char str[2] = {option[0]};
|
||||||
|
return opterror(options, MSG_INVALID, str);
|
||||||
|
}
|
||||||
|
case OPTPARSE_NONE:
|
||||||
|
if (option[1]) {
|
||||||
|
options->subopt++;
|
||||||
|
} else {
|
||||||
|
options->subopt = 0;
|
||||||
|
options->optind++;
|
||||||
|
}
|
||||||
|
return option[0];
|
||||||
|
case OPTPARSE_REQUIRED:
|
||||||
|
options->subopt = 0;
|
||||||
|
options->optind++;
|
||||||
|
if (option[1]) {
|
||||||
|
options->optarg = option + 1;
|
||||||
|
} else if (next != 0) {
|
||||||
|
options->optarg = next;
|
||||||
|
options->optind++;
|
||||||
|
} else {
|
||||||
|
options->optarg = 0;
|
||||||
|
char str[2] = {option[0]};
|
||||||
|
return opterror(options, MSG_MISSING, str);
|
||||||
|
}
|
||||||
|
return option[0];
|
||||||
|
case OPTPARSE_OPTIONAL:
|
||||||
|
options->subopt = 0;
|
||||||
|
options->optind++;
|
||||||
|
if (option[1])
|
||||||
|
options->optarg = option + 1;
|
||||||
|
else
|
||||||
|
options->optarg = 0;
|
||||||
|
return option[0];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *optparse_arg(struct optparse *options)
|
||||||
|
{
|
||||||
|
options->subopt = 0;
|
||||||
|
char *option = options->argv[options->optind];
|
||||||
|
if (option != 0)
|
||||||
|
options->optind++;
|
||||||
|
return option;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
longopts_end(const struct optparse_long *longopts, int i)
|
||||||
|
{
|
||||||
|
return !longopts[i].longname && !longopts[i].shortname;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
optstring_from_long(const struct optparse_long *longopts, char *optstring)
|
||||||
|
{
|
||||||
|
char *p = optstring;
|
||||||
|
for (int i = 0; !longopts_end(longopts, i); i++) {
|
||||||
|
if (longopts[i].shortname) {
|
||||||
|
*p++ = longopts[i].shortname;
|
||||||
|
for (int a = 0; a < (int)longopts[i].argtype; a++)
|
||||||
|
*p++ = ':';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unlike strcmp(), handles options containing "=". */
|
||||||
|
static int
|
||||||
|
longopts_match(const char *longname, const char *option)
|
||||||
|
{
|
||||||
|
if (longname == 0)
|
||||||
|
return 0;
|
||||||
|
const char *a = option, *n = longname;
|
||||||
|
for (; *a && *n && *a != '='; a++, n++)
|
||||||
|
if (*a != *n)
|
||||||
|
return 0;
|
||||||
|
return *n == '\0' && (*a == '\0' || *a == '=');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the part after "=", or NULL. */
|
||||||
|
static char *
|
||||||
|
longopts_arg(char *option)
|
||||||
|
{
|
||||||
|
for (; *option && *option != '='; option++);
|
||||||
|
if (*option == '=')
|
||||||
|
return option + 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
long_fallback(struct optparse *options,
|
||||||
|
const struct optparse_long *longopts,
|
||||||
|
int *longindex)
|
||||||
|
{
|
||||||
|
char optstring[96 * 3 + 1]; /* 96 ASCII printable characters */
|
||||||
|
optstring_from_long(longopts, optstring);
|
||||||
|
int result = optparse(options, optstring);
|
||||||
|
if (longindex != 0) {
|
||||||
|
*longindex = -1;
|
||||||
|
if (result != -1)
|
||||||
|
for (int i = 0; !longopts_end(longopts, i); i++)
|
||||||
|
if (longopts[i].shortname == options->optopt)
|
||||||
|
*longindex = i;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
optparse_long(struct optparse *options,
|
||||||
|
const struct optparse_long *longopts,
|
||||||
|
int *longindex)
|
||||||
|
{
|
||||||
|
char *option = options->argv[options->optind];
|
||||||
|
if (option == 0) {
|
||||||
|
return -1;
|
||||||
|
} else if (is_dashdash(option)) {
|
||||||
|
options->optind++; /* consume "--" */
|
||||||
|
return -1;
|
||||||
|
} else if (is_shortopt(option)) {
|
||||||
|
return long_fallback(options, longopts, longindex);
|
||||||
|
} else if (!is_longopt(option)) {
|
||||||
|
if (options->permute) {
|
||||||
|
int index = options->optind;
|
||||||
|
options->optind++;
|
||||||
|
int r = optparse_long(options, longopts, longindex);
|
||||||
|
permute(options, index);
|
||||||
|
options->optind--;
|
||||||
|
return r;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse as long option. */
|
||||||
|
options->errmsg[0] = '\0';
|
||||||
|
options->optopt = 0;
|
||||||
|
options->optarg = 0;
|
||||||
|
option += 2; /* skip "--" */
|
||||||
|
options->optind++;
|
||||||
|
for (int i = 0; !longopts_end(longopts, i); i++) {
|
||||||
|
const char *name = longopts[i].longname;
|
||||||
|
if (longopts_match(name, option)) {
|
||||||
|
if (longindex)
|
||||||
|
*longindex = i;
|
||||||
|
options->optopt = longopts[i].shortname;
|
||||||
|
char *arg = longopts_arg(option);
|
||||||
|
if (longopts[i].argtype == OPTPARSE_NONE && arg != 0) {
|
||||||
|
return opterror(options, MSG_TOOMANY, name);
|
||||||
|
} if (arg != 0) {
|
||||||
|
options->optarg = arg;
|
||||||
|
} else if (longopts[i].argtype == OPTPARSE_REQUIRED) {
|
||||||
|
options->optarg = options->argv[options->optind++];
|
||||||
|
if (options->optarg == 0)
|
||||||
|
return opterror(options, MSG_MISSING, name);
|
||||||
|
}
|
||||||
|
return options->optopt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return opterror(options, MSG_INVALID, option);
|
||||||
|
}
|
|
@ -0,0 +1,102 @@
|
||||||
|
#ifndef OPTPARSE_H
|
||||||
|
#define OPTPARSE_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optparse -- portable, reentrant, embeddable, getopt-like option parser
|
||||||
|
*
|
||||||
|
* The POSIX getopt() option parser has three fatal flaws. These flaws
|
||||||
|
* are solved by Optparse.
|
||||||
|
*
|
||||||
|
* 1) Parser state is stored entirely in global variables, some of
|
||||||
|
* which are static and inaccessible. This means only one thread can
|
||||||
|
* use getopt(). It also means it's not possible to recursively parse
|
||||||
|
* nested sub-arguments while in the middle of argument parsing.
|
||||||
|
* Optparse fixes this by storing all state on a local struct.
|
||||||
|
*
|
||||||
|
* 2) The POSIX standard provides no way to properly reset the parser.
|
||||||
|
* This means for portable code that getopt() is only good for one
|
||||||
|
* run, over one argv with one optstring. It also means subcommand
|
||||||
|
* options cannot be processed with getopt(). Most implementations
|
||||||
|
* provide a method to reset the parser, but it's not portable.
|
||||||
|
* Optparse provides an optparse_arg() function for stepping over
|
||||||
|
* subcommands and continuing parsing of options with another
|
||||||
|
* optstring. The Optparse struct itself can be passed around to
|
||||||
|
* subcommand handlers for additional subcommand option parsing. A
|
||||||
|
* full reset can be achieved by with an additional optparse_init().
|
||||||
|
*
|
||||||
|
* 3) Error messages are printed to stderr. This can be disabled with
|
||||||
|
* opterr, but the messages themselves are still inaccessible.
|
||||||
|
* Optparse solves this by writing an error message in its errmsg
|
||||||
|
* field. The downside to Optparse is that this error message will
|
||||||
|
* always be in English rather than the current locale.
|
||||||
|
*
|
||||||
|
* Optparse should be familiar with anyone accustomed to getopt(), and
|
||||||
|
* it could be a nearly drop-in replacement. The optstring is the same
|
||||||
|
* and the fields have the same names as the getopt() global variables
|
||||||
|
* (optarg, optind, optopt).
|
||||||
|
*
|
||||||
|
* Optparse also supports GNU-style long options with optparse_long().
|
||||||
|
* The interface is slightly different and simpler than getopt_long().
|
||||||
|
*
|
||||||
|
* By default, argv is permuted as it is parsed, moving non-option
|
||||||
|
* arguments to the end. This can be disabled by setting the `permute`
|
||||||
|
* field to 0 after initialization.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct optparse {
|
||||||
|
char **argv;
|
||||||
|
int permute;
|
||||||
|
int optind;
|
||||||
|
int optopt;
|
||||||
|
char *optarg;
|
||||||
|
char errmsg[64];
|
||||||
|
int subopt;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum optparse_argtype { OPTPARSE_NONE, OPTPARSE_REQUIRED, OPTPARSE_OPTIONAL };
|
||||||
|
|
||||||
|
struct optparse_long {
|
||||||
|
const char *longname;
|
||||||
|
int shortname;
|
||||||
|
enum optparse_argtype argtype;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the parser state.
|
||||||
|
*/
|
||||||
|
void optparse_init(struct optparse *options, char **argv);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the next option in the argv array.
|
||||||
|
* @param optstring a getopt()-formatted option string.
|
||||||
|
* @return the next option character, -1 for done, or '?' for error
|
||||||
|
*
|
||||||
|
* Just like getopt(), a character followed by no colons means no
|
||||||
|
* argument. One colon means the option has a required argument. Two
|
||||||
|
* colons means the option takes an optional argument.
|
||||||
|
*/
|
||||||
|
int optparse(struct optparse *options, const char *optstring);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles GNU-style long options in addition to getopt() options.
|
||||||
|
* This works a lot like GNU's getopt_long(). The last option in
|
||||||
|
* longopts must be all zeros, marking the end of the array. The
|
||||||
|
* longindex argument may be NULL.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
optparse_long(struct optparse *options,
|
||||||
|
const struct optparse_long *longopts,
|
||||||
|
int *longindex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used for stepping over non-option arguments.
|
||||||
|
* @return the next non-option argument, or -1 for no more arguments
|
||||||
|
*
|
||||||
|
* Argument parsing can continue with optparse() after using this
|
||||||
|
* function. That would be used to parse the options for the
|
||||||
|
* subcommand returned by optparse_arg(). This function allows you to
|
||||||
|
* ignore the value of optind.
|
||||||
|
*/
|
||||||
|
char *optparse_arg(struct optparse *options);
|
||||||
|
|
||||||
|
#endif
|
50
src/png.c
50
src/png.c
|
@ -1,50 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "lodepng.h"
|
|
||||||
#include <zopflipng/zopflipng_lib.h>
|
|
||||||
#include "png.h"
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
void cclt_png_optimize(char* input, char* output, cclt_png_parameters* pars) {
|
|
||||||
//TODO Error handling
|
|
||||||
CZopfliPNGOptions png_options;
|
|
||||||
|
|
||||||
CZopfliPNGSetDefaults(&png_options);
|
|
||||||
|
|
||||||
unsigned char* orig_buffer;
|
|
||||||
size_t orig_buffer_size;
|
|
||||||
|
|
||||||
unsigned char* resultpng;
|
|
||||||
size_t resultpng_size;
|
|
||||||
|
|
||||||
png_options.num_iterations = pars->iterations;
|
|
||||||
png_options.num_iterations_large = pars->iterations_large;
|
|
||||||
png_options.block_split_strategy = pars->block_split_strategy;
|
|
||||||
|
|
||||||
png_options.lossy_8bit = pars->lossy_8;
|
|
||||||
png_options.lossy_transparent = pars->transparent;
|
|
||||||
|
|
||||||
png_options.auto_filter_strategy = pars->auto_filter_strategy;
|
|
||||||
|
|
||||||
if (lodepng_load_file(&orig_buffer, &orig_buffer_size, input) != 0) {
|
|
||||||
trigger_error(16, true, input);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CZopfliPNGOptimize(orig_buffer,
|
|
||||||
orig_buffer_size,
|
|
||||||
&png_options,
|
|
||||||
0,
|
|
||||||
&resultpng,
|
|
||||||
&resultpng_size) != 0) {
|
|
||||||
trigger_error(17, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lodepng_save_file(resultpng, resultpng_size, output) != 0) {
|
|
||||||
trigger_error(18, true, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(orig_buffer);
|
|
||||||
free(resultpng);
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef CCLT_PNG
|
|
||||||
#define CCLT_PNG
|
|
||||||
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
void cclt_png_optimize(char* input, char* output, cclt_png_parameters* pars);
|
|
||||||
|
|
||||||
#endif
|
|
210
src/utils.c
210
src/utils.c
|
@ -1,198 +1,24 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <setjmp.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#ifdef __linux
|
|
||||||
#include <linux/limits.h>
|
|
||||||
#elif __APPLE__
|
|
||||||
#include <sys/syslimits.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
int string_to_int(char* in_string) {
|
void print_help()
|
||||||
long value = 0;
|
{
|
||||||
char* endptr;
|
|
||||||
errno = 0; //Error checking
|
|
||||||
|
|
||||||
value = strtol(in_string, &endptr, 0); //Convert the string
|
|
||||||
|
|
||||||
//Check errors
|
|
||||||
if ((errno == ERANGE) || (errno != 0 && value == 0)) {
|
|
||||||
fprintf(stderr, "[ERROR] Cannot parse quality value.\n");
|
|
||||||
exit(-8);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (endptr == in_string) {
|
|
||||||
fprintf(stderr, "[ERROR] Parse error. No digits were found for -q option.\n");
|
|
||||||
exit(-7);
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_help() {
|
|
||||||
fprintf(stdout,
|
fprintf(stdout,
|
||||||
"CaesiumCLT - Caesium Command Line Tools\n\n"
|
"CaesiumCLT - Caesium Command Line Tools\n\n"
|
||||||
"Usage: caesiumclt [OPTIONS] INPUT...\n"
|
"Usage: caesiumclt [OPTIONS] INPUT...\n"
|
||||||
"Compress your pictures up to 90%% without visible quality loss.\n\n"
|
"Compress your pictures up to 90%% without visible quality loss.\n\n"
|
||||||
|
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
"\t-q\tset output file quality between [1-100], JPEG only\n"
|
"\t-q, --quality\t\t\tset output file quality between [1-100], JPEG only\n"
|
||||||
"\t-e\tkeeps EXIF info during compression\n"
|
"\t-e, --exif\t\t\t\tkeeps EXIF info during compression\n"
|
||||||
"\t-o\toutput folder\n"
|
"\t-o, --output\t\t\toutput folder\n"
|
||||||
"\t-l\tuse lossless optimization\n"
|
"\t-l, --lossless\t\t\tuse lossless optimization\n"
|
||||||
"\t-R\tif input is a folder, scan subfolders too\n"
|
"\t-R, --recursive\t\t\tif input is a folder, scan subfolders too\n"
|
||||||
//TODO Remove this warning
|
//TODO Remove this warning
|
||||||
"\t-S\tkeep the folder structure [Not active yet]\n"
|
"\t-S, --keep-structure\tkeep the folder structure [Not active yet]\n"
|
||||||
"\t-h\tdisplay this help and exit\n"
|
"\t-h, --help\t\t\t\tdisplay this help and exit\n"
|
||||||
"\t-v\toutput version information and exit\n\n");
|
"\t-v, --version\t\t\toutput version information and exit\n\n");
|
||||||
exit(0);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO Recheck
|
|
||||||
int mkpath(const char *pathname, mode_t mode) {
|
|
||||||
|
|
||||||
char parent[PATH_MAX], *p;
|
|
||||||
/* make a parent directory path */
|
|
||||||
strncpy(parent, pathname, sizeof(parent));
|
|
||||||
parent[sizeof(parent) - 1] = '\0';
|
|
||||||
for (p = parent + strlen(parent); *p != '/' && p != parent; p--);
|
|
||||||
*p = '\0';
|
|
||||||
/* try make parent directory */
|
|
||||||
if(p != parent && mkpath(parent, mode) != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* make this one if parent has been made */
|
|
||||||
if(mkdir(pathname, mode) == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* if it already exists that is fine */
|
|
||||||
if (errno == EEXIST) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void scan_folder(cclt_parameters* parameters, char* basedir, int recur) {
|
|
||||||
//TODO CRITIAL Pass list as 1st parameter
|
|
||||||
DIR *dir;
|
|
||||||
struct dirent *ent;
|
|
||||||
char* entpath = NULL;
|
|
||||||
struct stat s;
|
|
||||||
|
|
||||||
char absolute_path[PATH_MAX];
|
|
||||||
char* ptr = realpath(basedir, absolute_path);
|
|
||||||
|
|
||||||
dir = opendir(ptr);
|
|
||||||
|
|
||||||
if (dir != NULL) {
|
|
||||||
while ((ent = readdir(dir)) != NULL) {
|
|
||||||
// Do not allow "." or ".."
|
|
||||||
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO allocate for this entry
|
|
||||||
//Basedir + filename + separator
|
|
||||||
entpath = realloc(entpath, (strlen(ptr) + strlen(ent->d_name) + 1) * sizeof(char));
|
|
||||||
strcpy(entpath, ptr);
|
|
||||||
//Append separator
|
|
||||||
strcat(entpath, "/");
|
|
||||||
//Append the name
|
|
||||||
strcat(entpath, ent->d_name);
|
|
||||||
|
|
||||||
//Gets stats
|
|
||||||
stat(entpath, &s);
|
|
||||||
|
|
||||||
if (S_ISDIR(s.st_mode) && recur != 0) {
|
|
||||||
// Directory, walk it if recursive is set
|
|
||||||
scan_folder(parameters, entpath, recur);
|
|
||||||
} else {
|
|
||||||
//File, add to the list
|
|
||||||
//New entry in the array
|
|
||||||
int n = parameters->input_files_count;
|
|
||||||
parameters->input_files_count++;
|
|
||||||
//Alloc new room for the array
|
|
||||||
parameters->input_files = realloc(parameters->input_files, (n + 1) * sizeof(char*));
|
|
||||||
parameters->input_files[n] = (char*) malloc(strlen(entpath) * sizeof(char));
|
|
||||||
//Copy the file path in the array
|
|
||||||
parameters->input_files[n] = strcpy(parameters->input_files[n], entpath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
closedir(dir);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "[ERROR] Failed to open folder.\n");
|
|
||||||
exit(-19);
|
|
||||||
}
|
|
||||||
free(entpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum image_type detect_image_type(char* path) {
|
|
||||||
//Open the file
|
|
||||||
FILE* fp;
|
|
||||||
unsigned char* type_buffer = (unsigned char*) malloc(2);
|
|
||||||
|
|
||||||
fp = fopen(path, "r");
|
|
||||||
|
|
||||||
if (fp == NULL) {
|
|
||||||
fprintf(stderr, "[ERROR] Cannot open input file for type detection.\n");
|
|
||||||
exit(-14);
|
|
||||||
}
|
|
||||||
//Read enough bytes
|
|
||||||
if (fread(type_buffer, 1, 2, fp) < 2) {
|
|
||||||
fprintf(stderr, "[ERROR] Cannot read file type.\n");
|
|
||||||
exit(-15);
|
|
||||||
}
|
|
||||||
//We don't need it anymore
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
//Check the bytes against the JPEG and PNG specs
|
|
||||||
if (((int) type_buffer[0] == 0xFF) && ((int) type_buffer[1] == 0xD8)) {
|
|
||||||
free(type_buffer);
|
|
||||||
return JPEG;
|
|
||||||
} else if (((int) type_buffer[0] == 0x89) && ((int) type_buffer[1] == 0x50)) {
|
|
||||||
free(type_buffer);
|
|
||||||
return PNG;
|
|
||||||
} else {
|
|
||||||
free(type_buffer);
|
|
||||||
return UNKN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int is_directory(const char *file_path) {
|
|
||||||
struct stat s;
|
|
||||||
stat(file_path, &s);
|
|
||||||
return S_ISDIR(s.st_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* get_human_size(long size) {
|
|
||||||
//We should not get more than TB images
|
|
||||||
char* unit[5] = {"B", "KB", "MB", "GB", "TB"};
|
|
||||||
//Index of the array containing the correct unit
|
|
||||||
double order = floor(log2(labs(size)) / 10);
|
|
||||||
//Alloc enough size for the final string
|
|
||||||
char* final = (char*) malloc(((int) (floor(log10(labs(size))) + 4)) * sizeof(char));
|
|
||||||
|
|
||||||
//If the order exceeds 4, something is fishy
|
|
||||||
if (order > 4) {
|
|
||||||
fprintf(stdout, "[WARNING] Do you really have such a huge file?\n");
|
|
||||||
order = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Copy the formatted string into the buffer
|
|
||||||
sprintf(final, "%.2f %s", size / (pow(1024, order)), unit[(int)order]);
|
|
||||||
//And return it
|
|
||||||
return final;
|
|
||||||
}
|
|
25
src/utils.h
25
src/utils.h
|
@ -1,21 +1,14 @@
|
||||||
#ifndef CCLT_UTILS
|
//
|
||||||
#define CCLT_UTILS
|
// Created by Matteo Paonessa on 15/12/16.
|
||||||
|
//
|
||||||
|
|
||||||
#include <jpeglib.h>
|
#ifndef CAESIUM_CLT_UTILS_H
|
||||||
#include <turbojpeg.h>
|
#define CAESIUM_CLT_UTILS_H
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "ccltypes.h"
|
|
||||||
|
|
||||||
#define APP_VERSION "0.9.1"
|
#define APP_VERSION_STRING "0.10.0"
|
||||||
#define BUILD 20160808
|
#define APP_VERSION_NUMBER 0100
|
||||||
|
#define BUILD 20161215
|
||||||
|
|
||||||
int string_to_int(char* in_string);
|
|
||||||
void print_help();
|
void print_help();
|
||||||
int mkpath(const char *pathname, mode_t mode);
|
|
||||||
enum image_type detect_image_type(char* path);
|
|
||||||
int is_directory(const char *file_path);
|
|
||||||
void scan_folder(cclt_parameters* parameters, char* basedir, int recur);
|
|
||||||
char* get_human_size(long size);
|
|
||||||
|
|
||||||
#endif
|
#endif //CAESIUM_CLT_UTILS_H
|
||||||
|
|
347
tools/compile
347
tools/compile
|
@ -1,347 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2012-10-14.11; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
|
|
||||||
# We need space, tab and new line, in precisely that order. Quoting is
|
|
||||||
# there to prevent tools from complaining about whitespace usage.
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
file_conv=
|
|
||||||
|
|
||||||
# func_file_conv build_file lazy
|
|
||||||
# Convert a $build file to $host form and store it in $file
|
|
||||||
# Currently only supports Windows hosts. If the determined conversion
|
|
||||||
# type is listed in (the comma separated) LAZY, no conversion will
|
|
||||||
# take place.
|
|
||||||
func_file_conv ()
|
|
||||||
{
|
|
||||||
file=$1
|
|
||||||
case $file in
|
|
||||||
/ | /[!/]*) # absolute file, and not a UNC file
|
|
||||||
if test -z "$file_conv"; then
|
|
||||||
# lazily determine how to convert abs files
|
|
||||||
case `uname -s` in
|
|
||||||
MINGW*)
|
|
||||||
file_conv=mingw
|
|
||||||
;;
|
|
||||||
CYGWIN*)
|
|
||||||
file_conv=cygwin
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
file_conv=wine
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
case $file_conv/,$2, in
|
|
||||||
*,$file_conv,*)
|
|
||||||
;;
|
|
||||||
mingw/*)
|
|
||||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
|
||||||
;;
|
|
||||||
cygwin/*)
|
|
||||||
file=`cygpath -m "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
wine/*)
|
|
||||||
file=`winepath -w "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashL linkdir
|
|
||||||
# Make cl look for libraries in LINKDIR
|
|
||||||
func_cl_dashL ()
|
|
||||||
{
|
|
||||||
func_file_conv "$1"
|
|
||||||
if test -z "$lib_path"; then
|
|
||||||
lib_path=$file
|
|
||||||
else
|
|
||||||
lib_path="$lib_path;$file"
|
|
||||||
fi
|
|
||||||
linker_opts="$linker_opts -LIBPATH:$file"
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashl library
|
|
||||||
# Do a library search-path lookup for cl
|
|
||||||
func_cl_dashl ()
|
|
||||||
{
|
|
||||||
lib=$1
|
|
||||||
found=no
|
|
||||||
save_IFS=$IFS
|
|
||||||
IFS=';'
|
|
||||||
for dir in $lib_path $LIB
|
|
||||||
do
|
|
||||||
IFS=$save_IFS
|
|
||||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.dll.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/$lib.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/lib$lib.a"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/lib$lib.a
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS=$save_IFS
|
|
||||||
|
|
||||||
if test "$found" != yes; then
|
|
||||||
lib=$lib.lib
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_wrapper cl arg...
|
|
||||||
# Adjust compile command to suit cl
|
|
||||||
func_cl_wrapper ()
|
|
||||||
{
|
|
||||||
# Assume a capable shell
|
|
||||||
lib_path=
|
|
||||||
shared=:
|
|
||||||
linker_opts=
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.[oO][bB][jJ])
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fo"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fe"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
-I)
|
|
||||||
eat=1
|
|
||||||
func_file_conv "$2" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-I*)
|
|
||||||
func_file_conv "${1#-I}" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashl "$2"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l*)
|
|
||||||
func_cl_dashl "${1#-l}"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-L)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashL "$2"
|
|
||||||
;;
|
|
||||||
-L*)
|
|
||||||
func_cl_dashL "${1#-L}"
|
|
||||||
;;
|
|
||||||
-static)
|
|
||||||
shared=false
|
|
||||||
;;
|
|
||||||
-Wl,*)
|
|
||||||
arg=${1#-Wl,}
|
|
||||||
save_ifs="$IFS"; IFS=','
|
|
||||||
for flag in $arg; do
|
|
||||||
IFS="$save_ifs"
|
|
||||||
linker_opts="$linker_opts $flag"
|
|
||||||
done
|
|
||||||
IFS="$save_ifs"
|
|
||||||
;;
|
|
||||||
-Xlinker)
|
|
||||||
eat=1
|
|
||||||
linker_opts="$linker_opts $2"
|
|
||||||
;;
|
|
||||||
-*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
|
||||||
func_file_conv "$1"
|
|
||||||
set x "$@" -Tp"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
|
||||||
func_file_conv "$1" mingw
|
|
||||||
set x "$@" "$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
if test -n "$linker_opts"; then
|
|
||||||
linker_opts="-link$linker_opts"
|
|
||||||
fi
|
|
||||||
exec "$@" $linker_opts
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
eat=
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
||||||
arguments, and rename the output as expected.
|
|
||||||
|
|
||||||
If you are trying to build a whole package this is not the
|
|
||||||
right script to run: please start by reading the file 'INSTALL'.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
|
||||||
func_cl_wrapper "$@" # Doesn't return...
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ofile=
|
|
||||||
cfile=
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
# So we strip '-o arg' only if arg is an object.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.obj)
|
|
||||||
ofile=$2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" -o "$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.c)
|
|
||||||
cfile=$1
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$ofile" || test -z "$cfile"; then
|
|
||||||
# If no '-o' option was seen then we might have been invoked from a
|
|
||||||
# pattern rule where we don't need one. That is ok -- this is a
|
|
||||||
# normal compilation that the losing compiler can handle. If no
|
|
||||||
# '.c' file was seen then we are probably linking. That is also
|
|
||||||
# ok.
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Name of file we expect compiler to create.
|
|
||||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
|
||||||
|
|
||||||
# Create the lock directory.
|
|
||||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
|
||||||
# that we are using for the .o file. Also, base the name on the expected
|
|
||||||
# object file name, since that is what matters with a parallel build.
|
|
||||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
|
||||||
while true; do
|
|
||||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
# FIXME: race condition here if user kills between mkdir and trap.
|
|
||||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
||||||
|
|
||||||
# Run the compile.
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if test -f "$cofile"; then
|
|
||||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
|
||||||
elif test -f "${cofile}bj"; then
|
|
||||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rmdir "$lockdir"
|
|
||||||
exit $ret
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
791
tools/depcomp
791
tools/depcomp
|
@ -1,791 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2013-05-30.07; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by 'PROGRAMS ARGS'.
|
|
||||||
object Object file output by 'PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputting dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Get the directory component of the given path, and save it in the
|
|
||||||
# global variables '$dir'. Note that this directory component will
|
|
||||||
# be either empty or ending with a '/' character. This is deliberate.
|
|
||||||
set_dir_from ()
|
|
||||||
{
|
|
||||||
case $1 in
|
|
||||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
|
||||||
*) dir=;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get the suffix-stripped basename of the given path, and save it the
|
|
||||||
# global variable '$base'.
|
|
||||||
set_base_from ()
|
|
||||||
{
|
|
||||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
|
||||||
}
|
|
||||||
|
|
||||||
# If no dependency file was actually created by the compiler invocation,
|
|
||||||
# we still have to create a dummy depfile, to avoid errors with the
|
|
||||||
# Makefile "include basename.Plo" scheme.
|
|
||||||
make_dummy_depfile ()
|
|
||||||
{
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Factor out some common post-processing of the generated depfile.
|
|
||||||
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
|
||||||
aix_post_process_depfile ()
|
|
||||||
{
|
|
||||||
# If the compiler actually managed to produce a dependency file,
|
|
||||||
# post-process it.
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
# Each line is of the form 'foo.o: dependency.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# $object: dependency.h
|
|
||||||
# and one to simply output
|
|
||||||
# dependency.h:
|
|
||||||
# which is needed to avoid the deleted-header problem.
|
|
||||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
|
||||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
|
||||||
} > "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# A tabulation character.
|
|
||||||
tab=' '
|
|
||||||
# A newline character.
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
# Character ranges might be problematic outside the C locale.
|
|
||||||
# These definitions help.
|
|
||||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
||||||
lower=abcdefghijklmnopqrstuvwxyz
|
|
||||||
digits=0123456789
|
|
||||||
alpha=${upper}${lower}
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Avoid interferences from the environment.
|
|
||||||
gccflag= dashmflag=
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
cygpath_u="cygpath -u -f -"
|
|
||||||
if test "$depmode" = msvcmsys; then
|
|
||||||
# This is just like msvisualcpp but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u='sed s,\\\\,/,g'
|
|
||||||
depmode=msvisualcpp
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = msvc7msys; then
|
|
||||||
# This is just like msvc7 but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u='sed s,\\\\,/,g'
|
|
||||||
depmode=msvc7
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = xlc; then
|
|
||||||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
|
||||||
gccflag=-qmakedep=gcc,-MF
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
|
||||||
## the command line argument order; so add the flags where they
|
|
||||||
## appear in depend2.am. Note that the slowdown incurred here
|
|
||||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
|
||||||
*) set fnord "$@" "$arg" ;;
|
|
||||||
esac
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
done
|
|
||||||
"$@"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
|
||||||
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
|
||||||
## (see the conditional assignment to $gccflag above).
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
|
||||||
## supported by the other compilers which use the 'gcc' depmode.
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# The second -e expression handles DOS-style file names with drive
|
|
||||||
# letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the "deleted header file" problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
## Some versions of gcc put a space before the ':'. On the theory
|
|
||||||
## that the space means something, we add a space to the output as
|
|
||||||
## well. hp depmode also adds that space, but also prefixes the VPATH
|
|
||||||
## to the object. Take care to not repeat it in the output.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like '#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
|
||||||
| tr "$nl" ' ' >> "$depfile"
|
|
||||||
echo >> "$depfile"
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> "$depfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
xlc)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts '$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$base.u
|
|
||||||
tmpdepfile3=$dir.libs/$base.u
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$dir$base.u
|
|
||||||
tmpdepfile3=$dir$base.u
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
aix_post_process_depfile
|
|
||||||
;;
|
|
||||||
|
|
||||||
tcc)
|
|
||||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
|
||||||
# FIXME: That version still under development at the moment of writing.
|
|
||||||
# Make that this statement remains true also for stable, released
|
|
||||||
# versions.
|
|
||||||
# It will wrap lines (doesn't matter whether long or short) with a
|
|
||||||
# trailing '\', as in:
|
|
||||||
#
|
|
||||||
# foo.o : \
|
|
||||||
# foo.c \
|
|
||||||
# foo.h \
|
|
||||||
#
|
|
||||||
# It will put a trailing '\' even on the last line, and will use leading
|
|
||||||
# spaces rather than leading tabs (at least since its commit 0394caf7
|
|
||||||
# "Emit spaces for -MD").
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
|
||||||
# We have to change lines of the first kind to '$object: \'.
|
|
||||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
|
||||||
# And for each line of the second kind, we have to emit a 'dep.h:'
|
|
||||||
# dummy dependency, to avoid the deleted-header problem.
|
|
||||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
## The order of this option in the case statement is important, since the
|
|
||||||
## shell code in configure will try each of these formats in the order
|
|
||||||
## listed in this file. A plain '-MD' option would be understood by many
|
|
||||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
|
||||||
pgcc)
|
|
||||||
# Portland's C compiler understands '-MD'.
|
|
||||||
# Will always output deps to 'file.d' where file is the root name of the
|
|
||||||
# source file under compilation, even if file resides in a subdirectory.
|
|
||||||
# The object file name does not affect the name of the '.d' file.
|
|
||||||
# pgcc 10.2 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using '\' :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
set_dir_from "$object"
|
|
||||||
# Use the source, not the object, to determine the base name, since
|
|
||||||
# that's sadly what pgcc will do too.
|
|
||||||
set_base_from "$source"
|
|
||||||
tmpdepfile=$base.d
|
|
||||||
|
|
||||||
# For projects that build the same source file twice into different object
|
|
||||||
# files, the pgcc approach of using the *source* file root name can cause
|
|
||||||
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
|
||||||
# the same $tmpdepfile.
|
|
||||||
lockdir=$base.d-lock
|
|
||||||
trap "
|
|
||||||
echo '$0: caught signal, cleaning up...' >&2
|
|
||||||
rmdir '$lockdir'
|
|
||||||
exit 1
|
|
||||||
" 1 2 13 15
|
|
||||||
numtries=100
|
|
||||||
i=$numtries
|
|
||||||
while test $i -gt 0; do
|
|
||||||
# mkdir is a portable test-and-set.
|
|
||||||
if mkdir "$lockdir" 2>/dev/null; then
|
|
||||||
# This process acquired the lock.
|
|
||||||
"$@" -MD
|
|
||||||
stat=$?
|
|
||||||
# Release the lock.
|
|
||||||
rmdir "$lockdir"
|
|
||||||
break
|
|
||||||
else
|
|
||||||
# If the lock is being held by a different process, wait
|
|
||||||
# until the winning process is done or we timeout.
|
|
||||||
while test -d "$lockdir" && test $i -gt 0; do
|
|
||||||
sleep 1
|
|
||||||
i=`expr $i - 1`
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
i=`expr $i - 1`
|
|
||||||
done
|
|
||||||
trap - 1 2 13 15
|
|
||||||
if test $i -le 0; then
|
|
||||||
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
|
||||||
echo "$0: check lockdir '$lockdir'" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp2)
|
|
||||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
|
||||||
# compilers, which have integrated preprocessors. The correct option
|
|
||||||
# to use with these is +Maked; it writes dependencies to a file named
|
|
||||||
# 'foo.d', which lands next to the object file, wherever that
|
|
||||||
# happens to be.
|
|
||||||
# Much of this is similar to the tru64 case; see comments there.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir.libs/$base.d
|
|
||||||
"$@" -Wc,+Maked
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
"$@" +Maked
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
|
||||||
# Add 'dependent.h:' lines.
|
|
||||||
sed -ne '2,${
|
|
||||||
s/^ *//
|
|
||||||
s/ \\*$//
|
|
||||||
s/$/:/
|
|
||||||
p
|
|
||||||
}' "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in 'foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# Libtool generates 2 separate objects for the 2 libraries. These
|
|
||||||
# two compilations output dependencies in $dir.libs/$base.o.d and
|
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
|
||||||
# one of the two compilations can be disabled. We should prefer
|
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
|
||||||
# the former would cause a distcleancheck panic.
|
|
||||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
|
||||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
tmpdepfile3=$dir$base.d
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
# Same post-processing that is required for AIX mode.
|
|
||||||
aix_post_process_depfile
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvc7)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
showIncludes=-Wc,-showIncludes
|
|
||||||
else
|
|
||||||
showIncludes=-showIncludes
|
|
||||||
fi
|
|
||||||
"$@" $showIncludes > "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
grep -v '^Note: including file: ' "$tmpdepfile"
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# The first sed program below extracts the file names and escapes
|
|
||||||
# backslashes for cygpath. The second sed program outputs the file
|
|
||||||
# name when reading, but also accumulates all include files in the
|
|
||||||
# hold buffer in order to output them again at the end. This only
|
|
||||||
# works with sed implementations that can handle large buffers.
|
|
||||||
sed < "$tmpdepfile" -n '
|
|
||||||
/^Note: including file: *\(.*\)/ {
|
|
||||||
s//\1/
|
|
||||||
s/\\/\\\\/g
|
|
||||||
p
|
|
||||||
}' | $cygpath_u | sort -u | sed -n '
|
|
||||||
s/ /\\ /g
|
|
||||||
s/\(.*\)/'"$tab"'\1 \\/p
|
|
||||||
s/.\(.*\) \\/\1:/
|
|
||||||
H
|
|
||||||
$ {
|
|
||||||
s/.*/'"$tab"'/
|
|
||||||
G
|
|
||||||
p
|
|
||||||
}' >> "$depfile"
|
|
||||||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvc7msys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
#nosideeffect)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove '-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for ':'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no eat=no
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
if test $eat = yes; then
|
|
||||||
eat=no
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-arch)
|
|
||||||
eat=yes ;;
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$depfile"
|
|
||||||
# makedepend may prepend the VPATH from the source file name to the object.
|
|
||||||
# No need to regex-escape $object, excess matching of '.' is harmless.
|
|
||||||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed '1,2d' "$tmpdepfile" \
|
|
||||||
| tr ' ' "$nl" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove '-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E \
|
|
||||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E 2>/dev/null |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
|
||||||
echo "$tab" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvcmsys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
501
tools/install-sh
501
tools/install-sh
|
@ -1,501 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2013-12-25.23; # UTC
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# 'make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch.
|
|
||||||
|
|
||||||
tab=' '
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
IFS=" $tab$nl"
|
|
||||||
|
|
||||||
# Set DOITPROG to "echo" to test this script.
|
|
||||||
|
|
||||||
doit=${DOITPROG-}
|
|
||||||
doit_exec=${doit:-exec}
|
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
|
||||||
# or use environment vars.
|
|
||||||
|
|
||||||
chgrpprog=${CHGRPPROG-chgrp}
|
|
||||||
chmodprog=${CHMODPROG-chmod}
|
|
||||||
chownprog=${CHOWNPROG-chown}
|
|
||||||
cmpprog=${CMPPROG-cmp}
|
|
||||||
cpprog=${CPPROG-cp}
|
|
||||||
mkdirprog=${MKDIRPROG-mkdir}
|
|
||||||
mvprog=${MVPROG-mv}
|
|
||||||
rmprog=${RMPROG-rm}
|
|
||||||
stripprog=${STRIPPROG-strip}
|
|
||||||
|
|
||||||
posix_mkdir=
|
|
||||||
|
|
||||||
# Desired mode of installed file.
|
|
||||||
mode=0755
|
|
||||||
|
|
||||||
chgrpcmd=
|
|
||||||
chmodcmd=$chmodprog
|
|
||||||
chowncmd=
|
|
||||||
mvcmd=$mvprog
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
stripcmd=
|
|
||||||
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dst_arg=
|
|
||||||
|
|
||||||
copy_on_change=false
|
|
||||||
is_target_a_directory=possibly
|
|
||||||
|
|
||||||
usage="\
|
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
-c (ignored)
|
|
||||||
-C install only if different (preserve the last data modification time)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
|
||||||
RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case $1 in
|
|
||||||
-c) ;;
|
|
||||||
|
|
||||||
-C) copy_on_change=true;;
|
|
||||||
|
|
||||||
-d) dir_arg=true;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) mode=$2
|
|
||||||
case $mode in
|
|
||||||
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
|
||||||
exit 1;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
|
||||||
|
|
||||||
-t)
|
|
||||||
is_target_a_directory=always
|
|
||||||
dst_arg=$2
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $dst_arg in
|
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-T) is_target_a_directory=never;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
|
||||||
|
|
||||||
--) shift
|
|
||||||
break;;
|
|
||||||
|
|
||||||
-*) echo "$0: invalid option: $1" >&2
|
|
||||||
exit 1;;
|
|
||||||
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
# We allow the use of options -d and -T together, by making -d
|
|
||||||
# take the precedence; this is for compatibility with GNU install.
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
echo "$0: target directory not allowed when installing a directory." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dst_arg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dst_arg=$arg
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $dst_arg in
|
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call 'install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
|
||||||
if test ! -d "$dst_arg"; then
|
|
||||||
echo "$0: $dst_arg: Is not a directory." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
do_exit='(exit $ret); exit $ret'
|
|
||||||
trap "ret=129; $do_exit" 1
|
|
||||||
trap "ret=130; $do_exit" 2
|
|
||||||
trap "ret=141; $do_exit" 13
|
|
||||||
trap "ret=143; $do_exit" 15
|
|
||||||
|
|
||||||
# Set umask so as not to create temps with too-generous modes.
|
|
||||||
# However, 'strip' requires both read and write access to temps.
|
|
||||||
case $mode in
|
|
||||||
# Optimize common cases.
|
|
||||||
*644) cp_umask=133;;
|
|
||||||
*755) cp_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw='% 200'
|
|
||||||
fi
|
|
||||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
|
||||||
*)
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw=,u+rw
|
|
||||||
fi
|
|
||||||
cp_umask=$mode$u_plus_rw;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $src in
|
|
||||||
-* | [=\(\)!]) src=./$src;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
dstdir=$dst
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dst_arg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dst=$dst_arg
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test "$is_target_a_directory" = never; then
|
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dstdir=$dst
|
|
||||||
dst=$dstdir/`basename "$src"`
|
|
||||||
dstdir_status=0
|
|
||||||
else
|
|
||||||
dstdir=`dirname "$dst"`
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
obsolete_mkdir_used=false
|
|
||||||
|
|
||||||
if test $dstdir_status != 0; then
|
|
||||||
case $posix_mkdir in
|
|
||||||
'')
|
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
|
||||||
# Otherwise, rely on $mkdir_umask.
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
mkdir_mode=-m$mode
|
|
||||||
else
|
|
||||||
mkdir_mode=
|
|
||||||
fi
|
|
||||||
|
|
||||||
posix_mkdir=false
|
|
||||||
case $umask in
|
|
||||||
*[123567][0-7][0-7])
|
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
|
||||||
|
|
||||||
if (umask $mkdir_umask &&
|
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
if test -z "$dir_arg" || {
|
|
||||||
# Check for POSIX incompatibilities with -m.
|
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
|
||||||
# other-writable bit of parent directory when it shouldn't.
|
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
|
||||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
|
||||||
case $ls_ld_tmpdir in
|
|
||||||
d????-?r-*) different_mode=700;;
|
|
||||||
d????-?--*) different_mode=755;;
|
|
||||||
*) false;;
|
|
||||||
esac &&
|
|
||||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
|
||||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
then posix_mkdir=:
|
|
||||||
fi
|
|
||||||
rmdir "$tmpdir/d" "$tmpdir"
|
|
||||||
else
|
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
|
||||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
|
||||||
fi
|
|
||||||
trap '' 0;;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if
|
|
||||||
$posix_mkdir && (
|
|
||||||
umask $mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
|
||||||
)
|
|
||||||
then :
|
|
||||||
else
|
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
|
||||||
# or it failed possibly due to a race condition. Create the
|
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
/*) prefix='/';;
|
|
||||||
[-=\(\)!]*) prefix='./';;
|
|
||||||
*) prefix='';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
IFS=/
|
|
||||||
set -f
|
|
||||||
set fnord $dstdir
|
|
||||||
shift
|
|
||||||
set +f
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
prefixes=
|
|
||||||
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
test X"$d" = X && continue
|
|
||||||
|
|
||||||
prefix=$prefix$d
|
|
||||||
if test -d "$prefix"; then
|
|
||||||
prefixes=
|
|
||||||
else
|
|
||||||
if $posix_mkdir; then
|
|
||||||
(umask=$mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
test -d "$prefix" || exit 1
|
|
||||||
else
|
|
||||||
case $prefix in
|
|
||||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
|
||||||
*) qprefix=$prefix;;
|
|
||||||
esac
|
|
||||||
prefixes="$prefixes '$qprefix'"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
prefix=$prefix/
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "$prefixes"; then
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
(umask $mkdir_umask &&
|
|
||||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
|
||||||
test -d "$dstdir" || exit 1
|
|
||||||
obsolete_mkdir_used=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
|
||||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
|
||||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
|
||||||
else
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# If -C, don't bother to copy if it wouldn't change the file.
|
|
||||||
if $copy_on_change &&
|
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
|
||||||
set -f &&
|
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
|
||||||
set +f &&
|
|
||||||
test "$old" = "$new" &&
|
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
rm -f "$dsttmp"
|
|
||||||
else
|
|
||||||
# Rename the file to the real destination.
|
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
|
||||||
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
{
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
test ! -f "$dst" ||
|
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
|
||||||
} ||
|
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dst"
|
|
||||||
}
|
|
||||||
fi || exit 1
|
|
||||||
|
|
||||||
trap '' 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
215
tools/missing
215
tools/missing
|
@ -1,215 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Common wrapper for a few potentially missing GNU programs.
|
|
||||||
|
|
||||||
scriptversion=2013-10-28.13; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
|
||||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
echo 1>&2 "Try '$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
|
|
||||||
--is-lightweight)
|
|
||||||
# Used by our autoconf macros to check whether the available missing
|
|
||||||
# script is modern enough.
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
|
|
||||||
--run)
|
|
||||||
# Back-compat with the calling convention used by older automake.
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
|
||||||
echo "\
|
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
|
||||||
|
|
||||||
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
|
||||||
to PROGRAM being missing or too old.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help display this help and exit
|
|
||||||
-v, --version output version information and exit
|
|
||||||
|
|
||||||
Supported PROGRAM values:
|
|
||||||
aclocal autoconf autoheader autom4te automake makeinfo
|
|
||||||
bison yacc flex lex help2man
|
|
||||||
|
|
||||||
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
|
||||||
'g' are ignored when checking the name.
|
|
||||||
|
|
||||||
Send bug reports to <bug-automake@gnu.org>."
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
|
||||||
echo "missing $scriptversion (GNU Automake)"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
echo 1>&2 "$0: unknown '$1' option"
|
|
||||||
echo 1>&2 "Try '$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Run the given program, remember its exit status.
|
|
||||||
"$@"; st=$?
|
|
||||||
|
|
||||||
# If it succeeded, we are done.
|
|
||||||
test $st -eq 0 && exit 0
|
|
||||||
|
|
||||||
# Also exit now if we it failed (or wasn't found), and '--version' was
|
|
||||||
# passed; such an option is passed most likely to detect whether the
|
|
||||||
# program is present and works.
|
|
||||||
case $2 in --version|--help) exit $st;; esac
|
|
||||||
|
|
||||||
# Exit code 63 means version mismatch. This often happens when the user
|
|
||||||
# tries to use an ancient version of a tool on a file that requires a
|
|
||||||
# minimum version.
|
|
||||||
if test $st -eq 63; then
|
|
||||||
msg="probably too old"
|
|
||||||
elif test $st -eq 127; then
|
|
||||||
# Program was missing.
|
|
||||||
msg="missing on your system"
|
|
||||||
else
|
|
||||||
# Program was found and executed, but failed. Give up.
|
|
||||||
exit $st
|
|
||||||
fi
|
|
||||||
|
|
||||||
perl_URL=http://www.perl.org/
|
|
||||||
flex_URL=http://flex.sourceforge.net/
|
|
||||||
gnu_software_URL=http://www.gnu.org/software
|
|
||||||
|
|
||||||
program_details ()
|
|
||||||
{
|
|
||||||
case $1 in
|
|
||||||
aclocal|automake)
|
|
||||||
echo "The '$1' program is part of the GNU Automake package:"
|
|
||||||
echo "<$gnu_software_URL/automake>"
|
|
||||||
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
|
||||||
echo "<$gnu_software_URL/autoconf>"
|
|
||||||
echo "<$gnu_software_URL/m4/>"
|
|
||||||
echo "<$perl_URL>"
|
|
||||||
;;
|
|
||||||
autoconf|autom4te|autoheader)
|
|
||||||
echo "The '$1' program is part of the GNU Autoconf package:"
|
|
||||||
echo "<$gnu_software_URL/autoconf/>"
|
|
||||||
echo "It also requires GNU m4 and Perl in order to run:"
|
|
||||||
echo "<$gnu_software_URL/m4/>"
|
|
||||||
echo "<$perl_URL>"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
give_advice ()
|
|
||||||
{
|
|
||||||
# Normalize program name to check for.
|
|
||||||
normalized_program=`echo "$1" | sed '
|
|
||||||
s/^gnu-//; t
|
|
||||||
s/^gnu//; t
|
|
||||||
s/^g//; t'`
|
|
||||||
|
|
||||||
printf '%s\n' "'$1' is $msg."
|
|
||||||
|
|
||||||
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
|
||||||
case $normalized_program in
|
|
||||||
autoconf*)
|
|
||||||
echo "You should only need it if you modified 'configure.ac',"
|
|
||||||
echo "or m4 files included by it."
|
|
||||||
program_details 'autoconf'
|
|
||||||
;;
|
|
||||||
autoheader*)
|
|
||||||
echo "You should only need it if you modified 'acconfig.h' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'autoheader'
|
|
||||||
;;
|
|
||||||
automake*)
|
|
||||||
echo "You should only need it if you modified 'Makefile.am' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'automake'
|
|
||||||
;;
|
|
||||||
aclocal*)
|
|
||||||
echo "You should only need it if you modified 'acinclude.m4' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'aclocal'
|
|
||||||
;;
|
|
||||||
autom4te*)
|
|
||||||
echo "You might have modified some maintainer files that require"
|
|
||||||
echo "the 'autom4te' program to be rebuilt."
|
|
||||||
program_details 'autom4te'
|
|
||||||
;;
|
|
||||||
bison*|yacc*)
|
|
||||||
echo "You should only need it if you modified a '.y' file."
|
|
||||||
echo "You may want to install the GNU Bison package:"
|
|
||||||
echo "<$gnu_software_URL/bison/>"
|
|
||||||
;;
|
|
||||||
lex*|flex*)
|
|
||||||
echo "You should only need it if you modified a '.l' file."
|
|
||||||
echo "You may want to install the Fast Lexical Analyzer package:"
|
|
||||||
echo "<$flex_URL>"
|
|
||||||
;;
|
|
||||||
help2man*)
|
|
||||||
echo "You should only need it if you modified a dependency" \
|
|
||||||
"of a man page."
|
|
||||||
echo "You may want to install the GNU Help2man package:"
|
|
||||||
echo "<$gnu_software_URL/help2man/>"
|
|
||||||
;;
|
|
||||||
makeinfo*)
|
|
||||||
echo "You should only need it if you modified a '.texi' file, or"
|
|
||||||
echo "any other file indirectly affecting the aspect of the manual."
|
|
||||||
echo "You might want to install the Texinfo package:"
|
|
||||||
echo "<$gnu_software_URL/texinfo/>"
|
|
||||||
echo "The spurious makeinfo call might also be the consequence of"
|
|
||||||
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
|
||||||
echo "want to install GNU make:"
|
|
||||||
echo "<$gnu_software_URL/make/>"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "You might have modified some files without having the proper"
|
|
||||||
echo "tools for further handling them. Check the 'README' file, it"
|
|
||||||
echo "often tells you about the needed prerequisites for installing"
|
|
||||||
echo "this package. You may also peek at any GNU archive site, in"
|
|
||||||
echo "case some other package contains this missing '$1' program."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
|
||||||
-e '2,$s/^/ /' >&2
|
|
||||||
|
|
||||||
# Propagate the correct exit status (expected to be 127 for a program
|
|
||||||
# not found, 63 for a program that failed due to version mismatch).
|
|
||||||
exit $st
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
Loading…
Reference in New Issue