## Makefile for the gettext-tools/libgettextpo subdirectory of GNU gettext
## Copyright (C) 1995-1998, 2000-2016, 2019-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.5 gnits no-dependencies subdir-objects
EXTRA_DIST =
BUILT_SOURCES =
MOSTLYCLEANFILES = core *.stackdump
MOSTLYCLEANDIRS =
CLEANFILES =
DISTCLEANFILES =
MAINTAINERCLEANFILES =
SUFFIXES =

lib_LTLIBRARIES = libgettextpo.la

nodist_include_HEADERS = gettext-po.h

noinst_LTLIBRARIES =

nodist_noinst_HEADERS = config.h

AM_CPPFLAGS = \
  -I. -I$(srcdir) \
  -I.. -I$(top_srcdir) \
  -I../src -I$(top_srcdir)/src \
  -I../../gettext-runtime/intl -I$(top_srcdir)/../gettext-runtime/intl

DEFS = -DIN_LIBGETTEXTPO=1 -DOMIT_SETLOCALE_LOCK=1 @DEFS@

# libgettextpo contains the public API for PO files.
libgettextpo_la_SOURCES = \
  gettext-po.c \
  $(libgettextpo_la_AUXSOURCES)
# These are auxiliary sources whose symbols should not be exported.
libgettextpo_la_AUXSOURCES = \
  ../src/str-list.c \
  ../src/dir-list.c \
  ../src/message.c \
  ../src/pos.c \
  ../src/msgl-ascii.c \
  ../src/po-error.c \
  ../src/po-xerror.c \
  ../src/write-catalog.c \
  ../src/write-po.c \
  ../src/open-catalog.c \
  ../src/po-charset.c \
  ../src/po-lex.c \
  ../src/po-gram-gen.c \
  ../src/read-po.c \
  ../src/read-catalog-abstract.c \
  ../src/read-catalog.c \
  ../src/plural-table.c \
  ../src/format-c.c \
  ../src/format-python.c \
  ../src/format-python-brace.c \
  ../src/format-java.c \
  ../src/format-java-printf.c \
  ../src/format-csharp.c \
  ../src/format-javascript.c \
  ../src/format-scheme.c \
  ../src/format-lisp.c \
  ../src/format-elisp.c \
  ../src/format-librep.c \
  ../src/format-ruby.c \
  ../src/format-sh.c \
  ../src/format-awk.c \
  ../src/format-lua.c \
  ../src/format-pascal.c \
  ../src/format-smalltalk.c \
  ../src/format-qt.c \
  ../src/format-qt-plural.c \
  ../src/format-kde.c \
  ../src/format-kde-kuit.c \
  ../src/format-boost.c \
  ../src/format-tcl.c \
  ../src/format-perl.c \
  ../src/format-perl-brace.c \
  ../src/format-php.c \
  ../src/format-gcc-internal.c \
  ../src/format-gfc-internal.c \
  ../src/format.c \
  ../src/plural-exp.c \
  ../src/plural-eval.c \
  ../src/msgl-check.c \
  ../src/sentence.c

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

# How to build libgettextpo.la.
# Don't make it depend on libgettextsrc.la or libgettextlib.la, since they
# define an uncontrolled amount of symbols.
libgettextpo_la_LIBADD = libgnu.la $(WOE32_LIBADD) $(LTLIBUNISTRING)
libgettextpo_la_LDFLAGS = \
  -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
  -rpath $(libdir) \
  @LTLIBINTL@ @LTLIBICONV@ -lc -no-undefined

# Tell the mingw or Cygwin linker which symbols to export.
if WOE32DLL
libgettextpo_la_SOURCES += ../woe32dll/gettextpo-exports.c
libgettextpo_la_LDFLAGS += -Wl,--export-all-symbols
endif

# OS/2 does not support a DLL name longer than 8 characters.
if OS2
libgettextpo_la_LDFLAGS += -os2dllname gtpo
endif

# Specify installation directory, for --enable-relocatable.
if RELOCATABLE_VIA_LD
# This is needed, because libgettextpo depends on libintl.
libgettextpo_la_LDFLAGS += `$(RELOCATABLE_LDFLAGS) $(libdir)`
endif

# Support for relocatability.
RELOCATABLE_LIBRARY_PATH = $(libdir)

# Version information according to Woe32 conventions.
EXTRA_DIST += libgettextpo.rc
if WOE32
WOE32_LIBADD = libgettextpo.res.lo
libgettextpo.res.lo : $(srcdir)/libgettextpo.rc
	$(LIBTOOL) --tag=RC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(RC) `$(SHELL) $(top_srcdir)/../windows/windres-options --escape $(VERSION)` -i $(srcdir)/libgettextpo.rc -o libgettextpo.res.lo --output-format=coff
MOSTLYCLEANFILES += libgettextpo.res.lo
else
WOE32_LIBADD =
endif

# Hide symbols that are defined by libgettextpo_la_AUXSOURCES or libgnu.la
# from the global namespace, by prefixing them with "libgettextpo_".
all check install: config.h
config.h: $(BUILT_SOURCES)
	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
	  : "Avoid double inclusion, to avoid a warning about redefinition of DLL_VARIABLE."; \
	  echo '#ifndef GTPO_CONFIG_H'; \
	  echo '#define GTPO_CONFIG_H'; \
	  echo; \
	  echo '#include "../config.h"'; \
	  : "We use gnulib module 'getcwd-lgpl' here, not module 'getcwd'."; \
	  echo '#undef GNULIB_GETCWD'; \
	  : "We don't use gnulib module 'fchdir' here."; \
	  echo '#undef REPLACE_FCHDIR'; \
	  : "Turn all gettext() calls into dgettext() calls."; \
	  echo '#define DEFAULT_TEXT_DOMAIN "gettext-tools"'; \
	  : "All code is collected in a single library,"; \
	  : "No references to variables in other libraries exist."; \
	  echo '#undef DLL_VARIABLE'; \
	  echo '#define DLL_VARIABLE'; \
	  echo; \
	  echo '#endif /* GTPO_CONFIG_H */'; \
	} > config.h && \
	if test -n "$(HAVE_GLOBAL_SYMBOL_PIPE)"; then \
	  { \
	    for f in $(libgettextpo_la_AUXSOURCES) $(libgnu_la_SOURCES) $(libgnu_la_LIBADD); do \
	      case $$f in \
	        *.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); \
	          $(COMPILE) $(DEFS) -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 \
	    | sed -e 's,^obstack_free$$,__obstack_free,' \
	    | sed -e 's,^\(.*\)$$,#define \1 libgettextpo_\1,' > config.h-t && \
	  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

# Special rules for installable include files that export variables.

EXTRA_DIST += gettext-po.in.h
BUILT_SOURCES += gettext-po.h
CLEANFILES += gettext-po.h
gettext-po.h: gettext-po.in.h
if WOE32DLL
	sed -e 's/extern \([^()]*\);/extern __declspec (dllimport) \1;/' $(srcdir)/gettext-po.in.h > gettext-po.h-tmp
else
	cp $(srcdir)/gettext-po.in.h gettext-po.h-tmp
endif
	mv gettext-po.h-tmp gettext-po.h

# Allow users to use "gnulib-tool --update".
EXTRA_DIST += gnulib-m4/gnulib-cache.m4

# A small set of gnulib modules is needed here as well.
include Makefile.gnulib
