## Makefile for the lib subdirectory of GNU libtextstyle.
## Copyright (C) 2009-2021 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 3 of the License, 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 <https://www.gnu.org/licenses/>.

## Process this file with automake to produce Makefile.in.

AUTOMAKE_OPTIONS = 1.13 gnits subdir-objects no-dependencies
EXTRA_DIST =
BUILT_SOURCES =
MOSTLYCLEANFILES = core *.stackdump
MOSTLYCLEANDIRS =
CLEANFILES =
DISTCLEANFILES =
MAINTAINERCLEANFILES =
SUFFIXES =

lib_LTLIBRARIES = libtextstyle.la

noinst_LTLIBRARIES =

nobase_include_HEADERS = textstyle.h

nobase_nodist_include_HEADERS =

noinst_HEADERS = notinline.h

AM_CPPFLAGS = \
  -I. -I$(srcdir) \
  -I$(top_builddir) -I$(top_srcdir) \
  -Iglib \
  -DIN_LIBTEXTSTYLE

# Parameterization of the 'libxml' module:
# When building a shared library, don't export the variables
# xmlMalloc, xmlMallocAtomic, xmlRealloc, xmlFree, xmlMemStrdup.
if INCLUDED_LIBXML
AM_CPPFLAGS += -DLIBXML_STATIC
endif

if WOE32
# On mingw, disable the declarations of *printf functions as aliases to the
# corresponding __mingw_*printf functions, because they pull in a dependency
# to the libgcc_s_sjlj DLL (through the symbols __udivdi3, __umoddi3).
AM_CPPFLAGS += -D__USE_MINGW_ANSI_STDIO=0
endif

# Rules generated and collected by gnulib-tool.
include Makefile.gnulib

# Additional source files.
libtextstyle_la_SOURCES += \
  color.h color.c \
  misc.h misc.c \
  version.c

# The <stdbool.h> replacement that can be installed.
nobase_nodist_include_HEADERS += \
  textstyle/stdbool.h

# Produce a textstyle/stdbool.h that is not compiler dependent.
# GCC >= 2.95 has <stdbool.h>.
# AIX >= 5.3 has <stdbool.h>.
# Solaris 10 and some HP-UX 11 versions have <stdbool.h> but it does not
# necessarily work.
textstyle/stdbool.h : $(STDBOOL_H) stdbool.mini.h
	@MKDIR_P@ textstyle
	rm -f $@-t $@
	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
	  echo '#if !defined _GL_STDBOOL_H'; \
	  if test -f /usr/include/stdbool.h; then \
	    echo '#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) || defined _AIX'; \
	  else \
	    echo '#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))'; \
	  fi; \
	  echo '#include <stdbool.h>'; \
	  echo '#else'; \
	  cat $(srcdir)/stdbool.mini.h; \
	  echo '#endif'; \
	  echo '#endif'; \
	} > $@-t
	mv $@-t $@
BUILT_SOURCES    += textstyle/stdbool.h
MOSTLYCLEANFILES += textstyle/stdbool.h-t
CLEANFILES       += textstyle/stdbool.h
EXTRA_DIST       += stdbool.mini.h

# textstyle/version.h is public.
nobase_nodist_include_HEADERS += textstyle/version.h

# textstyle/woe32dll.h is not public, but is included by other header files.
nobase_nodist_include_HEADERS += textstyle/woe32dll.h

# Directories that contain some CLEANFILES.
CLEANDIRS =
CLEANDIRS_NOT_IN_SRCDIR =
clean-local: clean-generic
	@for dir in '' $(CLEANDIRS); do \
	  if test -n "$$dir" && test -d $$dir; then \
	    echo "rmdir $$dir"; rmdir $$dir; \
	  fi; \
	done; \
	if test '$(srcdir)' != '.'; then \
	  for dir in '' $(CLEANDIRS_NOT_IN_SRCDIR); do \
	    if test -n "$$dir" && test -d $$dir; then \
	      echo "rmdir $$dir"; rmdir $$dir; \
	    fi; \
	  done; \
	fi; \
        :

# Directories that contain some DISTCLEANFILES.
DISTCLEANDIRS = sys
DISTCLEANDIRS_NOT_IN_SRCDIR = textstyle
distclean-local: distclean-generic
	@for dir in '' $(DISTCLEANDIRS); do \
	  if test -n "$$dir" && test -d $$dir; then \
	    echo "rmdir $$dir"; rmdir $$dir; \
	  fi; \
	done; \
	if test '$(srcdir)' != '.'; then \
	  for dir in '' $(DISTCLEANDIRS_NOT_IN_SRCDIR); do \
	    if test -n "$$dir" && test -d $$dir; then \
	      echo "rmdir $$dir"; rmdir $$dir; \
	    fi; \
	  done; \
	fi; \
        :

# List of header files that get installed and that declare 'extern' symbols.
HEADERS_WITH_EXTERNS = \
  textstyle.h \
  textstyle/version.in.h

# List of declared exported symbols.
# We extract it from the header files that get installed.
# This file has the same format as the one expected by the libtool option
# '-export-symbols', but we don't use this option, because it may prevent us
# from building some of the unit tests.
$(srcdir)/libtextstyle.sym.in : $(HEADERS_WITH_EXTERNS)
	if \
	  for f in $(HEADERS_WITH_EXTERNS); do \
	    if test -f $$f; then \
	      cat $$f; \
	    else \
	      cat $(srcdir)/$$f; \
	    fi; \
	  done \
	  | $(srcdir)/declared.sh > $@-t1; \
	then \
	  LC_ALL=C sort < $@-t1 | LC_ALL=C uniq > $@-t2 && mv $@-t2 $@; \
	else \
	  if test -f $@; then \
	    echo "Continuing with existing libtextstyle.sym.in."; \
	  else \
	    exit 1; \
	  fi; \
	fi
# We distribute it because declared.sh relies on GNU sed.
# The GNU Coding Standards say in
# <https://www.gnu.org/prep/standards/html_node/Makefile-Basics.html>:
#   "GNU distributions usually contain some files which are not source files
#    ... . Since these files normally appear in the source directory, they
#    should always appear in the source directory, not in the build directory.
#    So Makefile rules to update them should put the updated files in the
#    source directory."
# Therefore we put this file in the source directory, not the build directory.
MOSTLYCLEANFILES     += libtextstyle.sym.in-t1 libtextstyle.sym.in-t2
MAINTAINERCLEANFILES += libtextstyle.sym.in
EXTRA_DIST           += libtextstyle.sym.in declared.sh

# List of exported symbols (platform dependent).
libtextstyle.sym : $(srcdir)/libtextstyle.sym.in
	cat $(srcdir)/libtextstyle.sym.in \
	  | case "@host_os@" in \
	      mingw*) cat ;; \
	      *) grep -v '^libtextstyle_isatty$$' ;; \
	    esac \
	  > $@-t
	mv $@-t $@
MOSTLYCLEANFILES += libtextstyle.sym libtextstyle.sym-t

# Hide undesired symbols that are defined by libtextstyle_la_SOURCES or
# gl_LIBOBJS or the dependency libraries from the global namespace,
# by prefixing them with "libtextstyle_".
all check install: config.h
COMPILATION_UNITS = $(libtextstyle_la_SOURCES) $(gl_LIBOBJS)
if INCLUDED_LIBCROCO
COMPILATION_UNITS += $(libcroco_rpl_la_SOURCES)
endif
if INCLUDED_LIBXML
COMPILATION_UNITS += $(libxml_rpl_la_SOURCES)
endif
if INCLUDED_LIBGLIB
COMPILATION_UNITS += $(libglib_rpl_la_SOURCES)
endif
config.h: $(BUILT_SOURCES) libtextstyle.sym
	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
	  : "Avoid double inclusion, to avoid a warning about redefinitions."; \
	  echo '#ifndef LIBTEXTSTYLE_CONFIG_H'; \
	  echo '#define LIBTEXTSTYLE_CONFIG_H'; \
	  echo; \
	  echo '#include "../config.h"'; \
	  echo; \
	  echo '#endif /* LIBTEXTSTYLE_CONFIG_H */'; \
	  case "@host_os@" in \
	    mingw*) echo '#define isatty libtextstyle_isatty' ;; \
	  esac; \
	} > config.h && \
	if test -n "$(NAMESPACING)" && test -n "$(HAVE_GLOBAL_SYMBOL_PIPE)"; then \
	  { \
	    { \
	      for f in $(COMPILATION_UNITS); do \
	        case $$f in \
	          *.res.lo ) ;; \
	          *.c | *.$(OBJEXT) | *.lo ) \
	            sf=`echo "$$f" | sed -e 's,\\.[^.]*$$,,'`.c; \
	            test -f $$sf || sf=$(srcdir)/$$sf; \
	            of=`echo "$$f" | sed -e 's,^.*/,,' -e 's,\\.[^.]*$$,,'`.$(OBJEXT); \
	            echo "$(COMPILE) -c $$sf" 1>&6; \
	            $(COMPILE) -c $$sf || { rm -f config.h; exit 1; }; \
	            sh ./exported.sh $$of 1>&5; \
	            rm -f $$of `echo "$$of" | sed -e 's,\\.$(OBJEXT)$$,.lo,'`; \
	            ;; \
	        esac; \
	      done; \
	    } 5>&1 1>&2 \
	      | sed -e 's,.* ,,' | grep -v '@' | LC_ALL=C sort | LC_ALL=C uniq \
	      | LC_ALL=C $(top_srcdir)/build-aux/join-v-1 - libtextstyle.sym \
	      | sed -e 's,^\(.*\)$$,#define \1 libtextstyle_\1,' > config.h-t; \
	  } 6>&1 && \
	  if test -f config.h; then \
	    cat config.h-t >> config.h; \
	    rm -f config.h-t; \
	  else \
	    rm -f config.h-t; \
	    exit 1; \
	  fi \
	fi
MOSTLYCLEANFILES += config.h config.h-t

# Version information according to Woe32 conventions.
EXTRA_DIST += libtextstyle.rc
if WOE32
WOE32_LIBADD = libtextstyle.res.lo
# This rule is executed only on Woe32 systems.
# Use $(RC) with libtool, $(WINDRES) when not using libtool.
# The following sed expressions come from the windres-options script. They are
# inlined here, so that they can be written in a Makefile without requiring a
# temporary file. They must contain literal newlines rather than semicolons,
# so that they work with the sed-3.02 that is shipped with MSYS.
libtextstyle.res.lo: $(srcdir)/libtextstyle.rc
	nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \
	sed_extract_major='/^[0-9]/{'$${nl}'s/^\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
	sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
	sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
	$(LIBTOOL) --tag=RC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(RC) \
	  "-DPACKAGE_VERSION_STRING=\\\"$(VERSION)\\\"" \
	  "-DPACKAGE_VERSION_MAJOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_major"` \
	  "-DPACKAGE_VERSION_MINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_minor"` \
	  "-DPACKAGE_VERSION_SUBMINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_subminor"` \
	  -i $(srcdir)/libtextstyle.rc -o libtextstyle.res.lo --output-format=coff
MOSTLYCLEANFILES += libtextstyle.res.lo
else
WOE32_LIBADD =
endif
libtextstyle_la_LIBADD       += $(WOE32_LIBADD)
libtextstyle_la_DEPENDENCIES += $(WOE32_LIBADD)

# Parametrization of the 'relocatable-lib-lgpl' module.
AM_CPPFLAGS += -DDEPENDS_ON_LIBICONV=1

# Libtool's library version information for libtextstyle.
# See the libtool documentation, section "Library interface versions".
LTV_CURRENT=1
LTV_REVISION=1
LTV_AGE=1

# How to build libtextstyle.la.
libtextstyle_la_LDFLAGS += \
  -no-undefined \
  -export-symbols libtextstyle.sym \
  -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
  -rpath $(libdir)
