From: Bruno Haible Date: Thu, 10 Jan 2002 14:23:16 +0000 (+0000) Subject: Improved OS/2 support. X-Git-Tag: v0.11~83 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6f8f12c909e457290bb27598311c13e8e17274ef;p=thirdparty%2Fgettext.git Improved OS/2 support. --- diff --git a/ChangeLog b/ChangeLog index a9441a0de..5c0c9228f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2002-01-10 Bruno Haible + + * acconfig.h [OS/2]: Include intl/os2compat.h, not os2/os2compat.h. + * Makefile.am (EXTRA_DIST): Remove os2/os2compat.h. + +2002-01-10 Andrew Zabolotny + + * os2/README.OS2: Update. + * os2/Makefile: Heavily reworked. + * os2/iconv/iconv.c: Bug fixes. + 2002-01-07 Bruno Haible * config.rpath [IRIX]: Fix typo. diff --git a/Makefile.am b/Makefile.am index 4ffc0427a..60695e7d8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ ## Makefile for the toplevel directory of the GNU NLS Utilities -## Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. +## Copyright (C) 1995-1999, 2000-2002 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 @@ -31,7 +31,7 @@ EXTRA_DIST = config.rpath BUGS DISCLAIM README.gemtext README-alpha \ djgpp/config.bat djgpp/config.in djgpp/config.sed \ djgpp/config.site djgpp/edtests.bat djgpp/fnchange.in \ djgpp/fnchange.lst djgpp/tscript.sed \ - os2/README.OS2 os2/Makefile os2/os2compat.h os2/backward.def \ + os2/README.OS2 os2/Makefile os2/backward.def \ os2/iconv/README os2/iconv/iconv.h os2/iconv/iconv.c ABOUT-NLS: $(srcdir)/doc/nls.texi $(srcdir)/doc/matrix.texi diff --git a/acconfig.h b/acconfig.h index 994b6d976..2407bc32b 100644 --- a/acconfig.h +++ b/acconfig.h @@ -47,5 +47,5 @@ /* Extra OS/2 (emx+gcc) defines. */ #ifdef __EMX__ -# include "os2/os2compat.h" +# include "intl/os2compat.h" #endif diff --git a/intl/ChangeLog b/intl/ChangeLog index d9e9a653b..ddb7823a3 100644 --- a/intl/ChangeLog +++ b/intl/ChangeLog @@ -1,3 +1,16 @@ +2002-01-10 Andrew Zabolotny + Bruno Haible + + * dcigettext.c (_nl_default_dirname): On OS/2, declare, not define. + * localcharset.c: Rework OS/2 support. + * config.charset: Add OS/2 support. + * os2compat.c: Renamed from os2.c. + (_nl_default_dirname): Define here. + * os2compat.h: Moved here from ../os2/. + * osdep.c: Update. + * Makefile.in (COMHDRS): Add os2compat.h. + (COMSRCS): Add os2compat.c, remove os2.c. + 2002-01-05 Bruno Haible * Makefile.in (libintl.la): Add -lc. Needed on AIX. diff --git a/intl/Makefile.in b/intl/Makefile.in index a483f1d29..9a8d294dd 100644 --- a/intl/Makefile.in +++ b/intl/Makefile.in @@ -60,12 +60,12 @@ LDFLAGS = @LDFLAGS@ COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) HEADERS = $(COMHDRS) libgnuintl.h loadinfo.h -COMHDRS = gmo.h gettextP.h hash-string.h plural-exp.h plural-eval.c +COMHDRS = gmo.h gettextP.h hash-string.h plural-exp.h plural-eval.c os2compat.h SOURCES = $(COMSRCS) intl-compat.c COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ explodename.c dcigettext.c dcngettext.c dngettext.c ngettext.c plural.y \ -plural-exp.c localcharset.c localename.c osdep.c os2.c +plural-exp.c localcharset.c localename.c osdep.c os2compat.c OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ explodename.$lo dcigettext.$lo dcngettext.$lo dngettext.$lo ngettext.$lo \ diff --git a/intl/config.charset b/intl/config.charset index f4f2611c5..b91e0591b 100755 --- a/intl/config.charset +++ b/intl/config.charset @@ -1,7 +1,7 @@ #! /bin/sh # Output a system dependent table of character encoding aliases. # -# Copyright (C) 2000-2001 Free Software Foundation, Inc. +# Copyright (C) 2000-2002 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published @@ -235,10 +235,12 @@ case "$os" in #echo "sun_eu_greek ?" # what is this? echo "UTF-8 UTF-8" ;; - freebsd*) + freebsd* | os2*) # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. + # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just + # reuse FreeBSD's locale data for OS/2. echo "C ASCII" echo "US-ASCII ASCII" for l in la_LN lt_LN; do diff --git a/intl/dcigettext.c b/intl/dcigettext.c index e627b75a7..de60d9fbf 100644 --- a/intl/dcigettext.c +++ b/intl/dcigettext.c @@ -1,5 +1,5 @@ /* Implementation of the internal dcigettext function. - Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published @@ -265,7 +265,11 @@ const char _nl_default_default_domain[] = "messages"; const char *_nl_current_default_domain = _nl_default_default_domain; /* Contains the default location of the message catalogs. */ +#if defined __EMX__ +extern const char _nl_default_dirname[]; +#else const char _nl_default_dirname[] = LOCALEDIR; +#endif /* List with bindings of specific domains created by bindtextdomain() calls. */ diff --git a/intl/localcharset.c b/intl/localcharset.c index 624a808b5..bc5587bf6 100644 --- a/intl/localcharset.c +++ b/intl/localcharset.c @@ -1,6 +1,6 @@ /* Determine a canonical name for the current locale's character encoding. - Copyright (C) 2000-2001 Free Software Foundation, Inc. + Copyright (C) 2000-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published @@ -47,7 +47,7 @@ # define OS2 #endif -#if !(defined WIN32 || defined OS2) +#if !defined WIN32 # if HAVE_LANGINFO_CODESET # include # else @@ -58,7 +58,8 @@ #elif defined WIN32 # define WIN32_LEAN_AND_MEAN # include -#elif defined OS2 +#endif +#if defined OS2 # define INCL_DOS # include #endif @@ -104,7 +105,7 @@ get_charset_aliases () cp = charset_aliases; if (cp == NULL) { -#if !(defined WIN32 || defined OS2) +#if !defined WIN32 FILE *fp; const char *dir = LIBDIR; const char *base = "charset.alias"; @@ -201,10 +202,6 @@ get_charset_aliases () # if defined WIN32 cp = "CP936" "\0" "GBK" "\0" "CP1361" "\0" "JOHAB" "\0"; - -# elif defined OS2 - cp = ""; - # endif #endif @@ -266,7 +263,7 @@ locale_charset () # endif -#elif WIN32 +#elif defined WIN32 static char buf[2 + 10 + 1]; @@ -274,19 +271,57 @@ locale_charset () sprintf (buf, "CP%u", GetACP ()); codeset = buf; -#elif OS2 +#elif defined OS2 + const char *locale; static char buf[2 + 10 + 1]; ULONG cp[3]; ULONG cplen; - /* OS/2 has a function returning the locale's codepage as a number. */ - if (DosQueryCp (sizeof (cp), cp, &cplen)) - codeset = ""; + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } else { - sprintf (buf, "CP%u", cp[0]); - codeset = buf; + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } } #endif diff --git a/intl/os2compat.c b/intl/os2compat.c index ef62ea312..5959ef5c0 100644 --- a/intl/os2compat.c +++ b/intl/os2compat.c @@ -1,5 +1,5 @@ /* OS/2 compatibility functions. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published @@ -37,6 +37,18 @@ _nl_getenv (const char *name) return value; } +char _nl_default_dirname[] = /* a 260+1 bytes large buffer */ + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0" +#define LOCALEDIR_MAX 260 + char *_os2_libdir = NULL; char *_os2_localealiaspath = NULL; char *_os2_localedir = NULL; diff --git a/intl/osdep.c b/intl/osdep.c index c374c95d3..b37259838 100644 --- a/intl/osdep.c +++ b/intl/osdep.c @@ -1,5 +1,5 @@ /* OS dependent parts of libintl. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published @@ -17,7 +17,7 @@ USA. */ #if defined __EMX__ -# include "os2.c" +# include "os2compat.c" #else /* Avoid AIX compiler warning. */ typedef int dummy; diff --git a/lib/ChangeLog b/lib/ChangeLog index c263c4173..04a8de9f1 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,9 @@ +2002-01-10 Andrew Zabolotny + Bruno Haible + + * localcharset.c: Rework OS/2 support. + * config.charset: Add OS/2 support. + 2002-01-09 Bruno Haible * setenv.h: Make it possible to include this file from C++. diff --git a/lib/config.charset b/lib/config.charset index f4f2611c5..b91e0591b 100755 --- a/lib/config.charset +++ b/lib/config.charset @@ -1,7 +1,7 @@ #! /bin/sh # Output a system dependent table of character encoding aliases. # -# Copyright (C) 2000-2001 Free Software Foundation, Inc. +# Copyright (C) 2000-2002 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published @@ -235,10 +235,12 @@ case "$os" in #echo "sun_eu_greek ?" # what is this? echo "UTF-8 UTF-8" ;; - freebsd*) + freebsd* | os2*) # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. + # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just + # reuse FreeBSD's locale data for OS/2. echo "C ASCII" echo "US-ASCII ASCII" for l in la_LN lt_LN; do diff --git a/lib/localcharset.c b/lib/localcharset.c index 624a808b5..bc5587bf6 100644 --- a/lib/localcharset.c +++ b/lib/localcharset.c @@ -1,6 +1,6 @@ /* Determine a canonical name for the current locale's character encoding. - Copyright (C) 2000-2001 Free Software Foundation, Inc. + Copyright (C) 2000-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published @@ -47,7 +47,7 @@ # define OS2 #endif -#if !(defined WIN32 || defined OS2) +#if !defined WIN32 # if HAVE_LANGINFO_CODESET # include # else @@ -58,7 +58,8 @@ #elif defined WIN32 # define WIN32_LEAN_AND_MEAN # include -#elif defined OS2 +#endif +#if defined OS2 # define INCL_DOS # include #endif @@ -104,7 +105,7 @@ get_charset_aliases () cp = charset_aliases; if (cp == NULL) { -#if !(defined WIN32 || defined OS2) +#if !defined WIN32 FILE *fp; const char *dir = LIBDIR; const char *base = "charset.alias"; @@ -201,10 +202,6 @@ get_charset_aliases () # if defined WIN32 cp = "CP936" "\0" "GBK" "\0" "CP1361" "\0" "JOHAB" "\0"; - -# elif defined OS2 - cp = ""; - # endif #endif @@ -266,7 +263,7 @@ locale_charset () # endif -#elif WIN32 +#elif defined WIN32 static char buf[2 + 10 + 1]; @@ -274,19 +271,57 @@ locale_charset () sprintf (buf, "CP%u", GetACP ()); codeset = buf; -#elif OS2 +#elif defined OS2 + const char *locale; static char buf[2 + 10 + 1]; ULONG cp[3]; ULONG cplen; - /* OS/2 has a function returning the locale's codepage as a number. */ - if (DosQueryCp (sizeof (cp), cp, &cplen)) - codeset = ""; + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } else { - sprintf (buf, "CP%u", cp[0]); - codeset = buf; + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } } #endif diff --git a/os2/Makefile b/os2/Makefile index 94e11f659..a598737ab 100644 --- a/os2/Makefile +++ b/os2/Makefile @@ -1,268 +1,467 @@ -# OS/2 GNU Makefile for building gettext with GNU Make and GNU C compiler -# -# OS/2 still supports the regular configure/make building mechanism, but its -# way more clumsy, complicated and error prone. It is highly recommended to -# use this makefile instead, because : -# - this makefile builds an optimized static and dynamic version of the -# library -# - it is able to build both optimized and debug versions of the library -# without any reconfiguring -# - it is able to generate a complete OS/2 binary distribution (make distr) -# - besides its simply alot faster than configure generated makefiles -# -# The makefile is designed to be more or less gettext version independent, -# so it is likely to work with future versions of gettext as well. However, -# please inspect the pre-built config.h file (if you haven't built one with -# configure) so that VERSION macro contains the correct value. -# - -# Use CMD.EXE as shell since its way faster -SHELL = $(COMSPEC) -# An Unix-like shell (needed for running config.charset) -UNIXSHELL = sh.exe - -# Debug mode (1) or optimize mode (0) -DEBUG = 0 - -# The version of INTL.DLL (the name suffix) -INTLDLLVER = - -# Pack the DLL and executables with lxlite -LXLITE = 1 - -# Output directory -OUT = out/$(OUT.SUFFIX)/ -# Root package directory -ROOT = ../ -# The base directory for distribution archive (emx/ or usr/) -INST = emx/ -# A shortcut for emx/src/gettext-version/ -INSTSRC = $(INST)src/gettext-$(VERSION)/ - -# Tools -CC = gcc -c -CFLAGS = -Wall -Zmt $(INCLUDE) $(DEFS) -INCLUDE = -I. -I$(ROOT) -I$(ROOT)intl -I$(ROOT)src -I$(ROOT)lib -DEFS = -DHAVE_CONFIG_H -DLIBDIR=\"/usr/lib\" \ - -DLOCALEDIR=\"/usr/share/locale\" -DLOCALE_ALIAS_PATH=\"/usr/share/locale\" - -LD = gcc -LDFLAGS = -Zmt -Zcrtdll -LDFLAGS.SHARED = -Zmt -Zcrtdll -Zdll -LIBS = -liberty -lgcc - -AR = ar -ARFLAGS = crs - -MKDIR = mkdir.exe -p -COPY = cp -p - -LINKINTL = $(OUT)intl.a - -ifeq ($(DEBUG),0) - CFLAGS += -s -O2 - LDFLAGS += -s -Zexe - LDFLAGS.SHARED += -s - OUT.SUFFIX = release -else - CFLAGS += -g -Zomf - LDFLAGS += -g -Zexe -Zomf - LDFLAGS.SHARED += -g -Zomf - OUT.SUFFIX = debug - LXLITE := 0 - LINKINTL = $(OUT)intl_s.a -endif - -# The list of languages to be included in binary distribution -LINGUAS = cs da de el es fr gl id it nl nn no pl pt pt_BR ru sl sv tr -# The following languages don't work with OS/2 iconv: -#en@boldquot en@quot et ja ko zh - -VERSION = $(shell sed config.h -ne "/VERSION/{" -e "s/.*VERSION[ ]*//" -e 's/"//g' -e "p" -e "}") - -# Fetch the list of source files for libintl from intl/Makefile.in -INTL.SOURCES = $(addprefix $(ROOT)intl/,\ - $(subst $$lo,c,\ - $(subst @INTLOS2OBJS@,os2compat.c,\ - $(subst @INTLOBJS@,intl-compat.c,\ - $(subst OBJECTS = ,,\ - $(subst \,,\ - $(shell sed $(ROOT)intl/Makefile.in -ne "/^OBJECTS =/,/[^\]$$/p"))))))) -INTL.OBJECTS = $(addprefix $(OUT),$(subst $(ROOT),,$(INTL.SOURCES:.c=.o))) - -PROGRAMS = gettext ngettext msgcmp msgfmt msgmerge msgunfmt xgettext msgcomm -PROGRAMS.EXE = $(addprefix $(OUT),$(addsuffix .exe,$(PROGRAMS))) -SRC.SOURCES = $(filter-out $(addprefix $(ROOT)src/,$(addsuffix .c,$(PROGRAMS))),\ - $(wildcard $(ROOT)src/*.c)) -SRC.OBJECTS = $(addprefix $(OUT),$(subst $(ROOT),,$(SRC.SOURCES:.c=.o))) -LIB.SOURCES = $(addprefix $(ROOT)lib/,basename.c error.c stpcpy.c stpncpy.c \ - concatpath.c mbswidth.c fstrcmp.c hash.c printf-prs.c c-ctype.c linebreak.c \ - getline.c) -LIB.OBJECTS = $(addprefix $(OUT),$(subst $(ROOT),,$(LIB.SOURCES:.c=.o))) - -OUTDIRS = $(OUT) $(sort $(dir $(INTL.OBJECTS) $(SRC.OBJECTS) $(LIB.OBJECTS) $(INSTALL.FILES))) - -INSTALL.FILES = $(addprefix $(INST)bin/,$(addsuffix .exe,$(PROGRAMS))) \ - $(INST)lib/intl.a $(INST)lib/intl_s.a $(INST)dll/intl.dll $(INST)include/libintl.h \ - $(INST)share/locale/charset.alias $(INST)share/locale/locale.alias \ - $(INST)doc/gettext-$(VERSION)/README.OS2 \ - $(INST)doc/gettext-$(VERSION)/COPYING $(INST)doc/gettext-$(VERSION)/README \ - $(INST)include/iconv.h $(INST)include/langinfo.h \ - $(addsuffix /LC_MESSAGES/gettext.mo,$(addprefix $(INST)share/locale/,$(LINGUAS))) \ - $(INSTALL.DIFF) - -# The diff and source files which we want in binary distribution (do we?) -INSTALL.DIFF = $(INSTSRC)gettext-$(VERSION).diff \ - $(addprefix $(INSTSRC)os2/,$(wildcard *.c *.h *.def) Makefile README.OS2) \ - $(INSTSRC)intl/os2compat.c - -.SUFFIXES: -.SUFFIXES: .o .a .def .exe .dll .po .mo -.PRECIOUS: $(OUT)%.o - -.PHONY: all depend clean distr rmzip - -$(OUT)%.o: $(ROOT)%.c - $(CC) $(CFLAGS) -o $@ $< - -# To avoid playing with object file lists for every program we will build -# instead a library containing all the object files from src directory, and -# then link the library against the main program module, so that linker can -# pull all the required functions from there -$(OUT)%.exe: $(OUT)src/%.o $(OUT)util.a $(LINKINTL) - $(LD) $(LDFLAGS) -o $@ $^ $(LIBS) -ifeq ($(LXLITE),1) - lxlite $@ -endif - -all: $(OUTDIRS) $(ROOT)src/po-gram-gen2.h $(ROOT)intl/libintl.h \ - $(OUT)intl.a $(OUT)intl_s.a $(OUT)intl$(INTLDLLVER).dll $(PROGRAMS.EXE) - -depend: $(INTL.SOURCES) $(SRC.SOURCES) - makedep $(INCLUDE) $(DEFS) -p $$(OUT) -r $^ - -clean: - rm -rf out emx - -distr: all rmzip gettext-os2-$(VERSION)-bin.zip - -rmzip: - rm -f gettext-os2-$(VERSION)-bin.zip - -$(OUTDIRS): - $(MKDIR) $(@:/=) - -$(OUT)intl_s.a: $(INTL.OBJECTS) - $(AR) $(ARFLAGS) $@ $^ - -$(OUT)intl.def: $(INTL.OBJECTS) - @echo LIBRARY INTL$(INTLDLLVER) INITINSTANCE TERMINSTANCE>$@ - @echo DESCRIPTION "GNU gettext internationalization library version $(VERSION)">>$@ - @echo DATA MULTIPLE NONSHARED>>$@ - @echo EXPORTS>>$@ - type backward.def>>$@ - emxexp $^ >>$@ - -$(OUT)intl$(INTLDLLVER).dll: $(INTL.OBJECTS) $(OUT)intl.def - @echo ********************************************************* - @echo *** YOU CAN SAFELY IGNORE WARNINGS FROM EMXBIND BELOW *** - @echo ********************************************************* - $(LD) $(LDFLAGS.SHARED) -o $@ $^ $(LIBS) -ifeq ($(LXLITE),1) - lxlite $@ -endif - -# Remove the ordinals from exports so that newer programs import by name -$(OUT)intl.a: $(OUT)intl.def - emximp -o $@ $< - -$(OUT)util.a: $(SRC.OBJECTS) $(LIB.OBJECTS) - $(AR) $(ARFLAGS) $@ $^ - -$(ROOT)src/po-gram-gen2.h: $(ROOT)src/po-gram-gen.h - sed -e "s/[yY][yY]/po_gram_/g" $< > $@ - -$(ROOT)intl/libintl.h: $(ROOT)intl/libgnuintl.h - $(COPY) $< $@ - -gettext-os2-$(VERSION)-bin.zip: $(INSTALL.FILES) - @rm -f $@ - zip -9XD $@ $^ - -# The following rules are for `make distr' target only - -$(INST)share/locale/charset.alias: $(ROOT)lib/config.charset - $(UNIXSHELL) $< i386-pc-os2-emx >$@ -$(INST)share/locale/locale.alias: $(ROOT)intl/locale.alias - $(COPY) $< $@ -$(INST)bin/% $(INST)lib/% $(INST)dll/%: $(OUT)% - $(COPY) $< $@ -$(INST)include/%: $(ROOT)intl/% - $(COPY) $< $@ -$(INST)doc/gettext-$(VERSION)/%: $(ROOT)% - $(COPY) $< $@ -$(INST)doc/gettext-$(VERSION)/% $(INSTSRC)% $(INSTSRC)os2/% $(INST)include/%: % - $(COPY) $< $@ -$(INSTSRC)%: $(ROOT)% - $(COPY) $< $@ -$(INST)share/locale/%/LC_MESSAGES/gettext.mo: $(ROOT)po/%.po - $(MKDIR) $(dir $@) - $(COMSPEC) /c "$(subst /,\\,set BEGINLIBPATH=$(OUT:/=) && \ - $(OUT)msgfmt.exe) --statistics --verbose -o $@ $<" - -# DO NOT DELETE this line -- makedep depends on it - -$(OUT)intl-compat.o: ../intl/libgnuintl.h ../intl/gettextP.h \ - ../intl/loadinfo.h ../intl/gettext.h -$(OUT)bindtextdom.o: ../intl/libgnuintl.h ../intl/gettextP.h \ - ../intl/loadinfo.h ../intl/gettext.h -$(OUT)dcgettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h ../intl/libgnuintl.h -$(OUT)dgettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h ../intl/libgnuintl.h -$(OUT)gettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h ../intl/libgnuintl.h -$(OUT)finddomain.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h ../intl/libgnuintl.h -$(OUT)loadmsgcat.o: ../intl/gettext.h ../intl/gettextP.h \ - ../intl/loadinfo.h -$(OUT)localealias.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h -$(OUT)textdomain.o: ../intl/libgnuintl.h ../intl/gettextP.h \ - ../intl/loadinfo.h ../intl/gettext.h -$(OUT)l10nflist.o: ../intl/loadinfo.h -$(OUT)explodename.o: ../intl/loadinfo.h -$(OUT)dcigettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h ../intl/libgnuintl.h ../intl/hash-string.h -$(OUT)dcngettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h ../intl/libgnuintl.h -$(OUT)dngettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h ../intl/libgnuintl.h -$(OUT)ngettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h ../intl/libgnuintl.h -$(OUT)plural.o: ../intl/gettextP.h ../intl/loadinfo.h \ - ../intl/gettext.h -$(OUT)os2compat.o: ../os2/iconv.c -$(OUT)dir-list.o: ../lib/system.h ../src/dir-list.h \ - ../src/str-list.h -$(OUT)message.o: ../lib/fstrcmp.h ../src/message.h ../src/str-list.h \ - ../src/pos.h ../lib/system.h -$(OUT)open-po.o: ../src/open-po.h ../src/dir-list.h ../lib/error.h \ - ../lib/system.h ../lib/gettext.h -$(OUT)po-gram-gen.o: ../src/po-lex.h ../lib/error.h ../src/pos.h \ - ../src/po-gram.h ../lib/system.h ../lib/gettext.h \ - ../src/po.h -$(OUT)po-hash-gen.o: ../src/po-hash.h ../src/po.h ../src/po-lex.h \ - ../lib/error.h ../src/pos.h -$(OUT)po-lex.o: ../lib/gettext.h ../src/po-lex.h ../lib/error.h \ - ../src/pos.h ../src/open-po.h ../src/po-gram-gen2.h -$(OUT)po.o: ../src/po.h ../src/po-lex.h ../lib/error.h \ - ../src/pos.h ../src/po-hash.h ../lib/mbswidth.h \ - ../lib/gettext.h -$(OUT)str-list.o: ../src/str-list.h -$(OUT)write-po.o: ../src/write-po.h ../src/message.h \ - ../src/str-list.h ../src/pos.h ../lib/c-ctype.h \ - ../lib/linebreak.h ../lib/error.h ../lib/gettext.h -$(OUT)xget-lex.o: ../src/dir-list.h ../lib/error.h \ - ../lib/gettext.h ../lib/hash.h ../src/str-list.h \ - ../src/xget-lex.h +# +# OS/2 GNU Makefile for building gettext with GNU Make and GNU C compiler +# +# OS/2 still supports the regular configure/make building mechanism, but its +# way more clumsy, complicated and error prone. It is highly recommended to +# use this makefile instead, because : +# - this makefile builds an optimized static and dynamic version of the +# library +# - it is able to build both optimized and debug versions of the library +# without any reconfiguring +# - this makefile builds an backward compatible DLL. When building with +# configure you will get a DLL which is compatible only with the 0.10.40 +# and later DLLs of gettext; this makefile builds a DLL which is binary +# compatible with gettext 0.10.35 (exports by ordinal matter). +# - it is able to generate a complete OS/2 binary distribution (make distr) +# - besides its simply alot faster than configure generated makefiles +# +# The makefile is designed to be more or less gettext version independent, +# so it is likely to work with future versions of gettext as well. +# + +# Use CMD.EXE as shell since its way faster +SHELL = $(COMSPEC) +# An Unix-like shell (needed for running config.charset) +UNIXSHELL = sh.exe + +# Debug mode (1) or optimize mode (0) +DEBUG = 0 + +# The version of INTL.DLL (the name suffix) +INTLDLLVER = + +# Pack the DLL and executables with lxlite +LXLITE = 1 + +# Output directory +OUT = out/$(OUT.SUFFIX)/ +# Root package directory +ROOT = ../ +# The base directory for distribution archive (emx/ or usr/) +INST = emx/ + +# Tools +CC = gcc -c +CFLAGS = -Wall -Zmt $(INCLUDE) $(DEFS) +INCLUDE = -I. -I$(ROOT) -I$(ROOT)intl -I$(ROOT)src -I$(ROOT)lib +DEFS = -DHAVE_CONFIG_H -DLIBDIR=\"/usr/lib\" \ + -DLOCALEDIR=\"/usr/share/locale\" -DLOCALE_ALIAS_PATH=\"/usr/share/locale\" \ + -DPROJECTSDIR=\"/usr/share/gettext/projects\" \ + -DGETTEXTJAR=\"/usr/share/gettext/gettext.jar\" + +LD = gcc +LDFLAGS = -Zmt -Zcrtdll +LDFLAGS.SHARED = -Zmt -Zcrtdll -Zdll +LIBS = -liberty -lgcc + +AR = ar +ARFLAGS = crs + +MKDIR = mkdir.exe -p +COPY = cp -p + +LINKINTL = $(OUT)intl.a + +ifeq ($(DEBUG),0) + CFLAGS += -s -O2 + LDFLAGS += -s -Zexe + LDFLAGS.SHARED += -s + OUT.SUFFIX = release +else + CFLAGS += -g + LDFLAGS += -g -Zexe + LDFLAGS.SHARED += -g + OUT.SUFFIX = debug + LXLITE := 0 + LINKINTL = $(OUT)intl_s.a +endif + +# Languages with encodings unsupported by OS/2 API (BIG5) +BAD.LINGUAS=zh + +# The list of languages to be included in binary distribution +LINGUAS = $(filter-out $(BAD.LINGUAS),$(shell sed -e "/^\#/d" $(ROOT)po/LINGUAS)) + +# Fetch version number from configure.in +VERSION = $(shell sed ../configure.in -ne "/AM_INIT_AUTOMAKE/{" -e "s/.*(gettext, *\\(.*\\))/\\1/" -e "p" -e "}") + +# Fetch the list of source files for libintl from intl/Makefile.in +INTL.SOURCES = $(addprefix $(ROOT)intl/,\ + $(subst $$lo,c,\ + $(subst @INTLOBJS@,intl-compat.c,\ + $(subst OBJECTS = ,,\ + $(subst \,,\ + $(shell sed $(ROOT)intl/Makefile.in -ne "/^OBJECTS =/,/[^\]$$/p")))))) +INTL.OBJECTS = $(addprefix $(OUT),$(subst $(ROOT),,$(INTL.SOURCES:.c=.o))) + +PROGRAMS = $(addsuffix .exe,$(subst bin_PROGRAMS = ,,\ + $(subst \,,\ + $(shell sed $(ROOT)src/Makefile.am -ne "/^bin_PROGRAMS =/,/[^\]$$/p")))) +PROGRAMS.EXE = $(addprefix $(OUT),$(PROGRAMS)) +SRC.SOURCES = $(filter-out $(addprefix $(ROOT)src/,$(PROGRAMS:.exe=.c)),\ + $(wildcard $(ROOT)src/*.c)) +SRC.OBJECTS = $(addprefix $(OUT),$(subst $(ROOT),,$(SRC.SOURCES:.c=.o))) +LIB.SOURCES = $(addprefix $(ROOT)lib/, error.c stpcpy.c stpncpy.c mkdtemp.c getline.c \ + $(subst libgettextlib_la_SOURCES = ,,\ + $(subst \,,\ + $(patsubst getopt%.c,,\ + $(shell sed $(ROOT)lib/Makefile.am -ne "/^libgettextlib_la_SOURCES =/,/[^\]$$/p"))))) +LIB.OBJECTS = $(addprefix $(OUT),$(subst $(ROOT),,$(LIB.SOURCES:.c=.o))) + +OUTDIRS = $(OUT) $(sort $(dir $(INTL.OBJECTS) $(SRC.OBJECTS) $(LIB.OBJECTS) $(INSTALL.FILES))) + +INSTALL.FILES = $(addprefix $(INST)bin/,$(PROGRAMS)) \ + $(INST)lib/intl.a $(INST)lib/intl_s.a $(INST)lib/iconv.a \ + $(INST)include/libintl.h $(INST)include/iconv.h $(INST)dll/intl.dll \ + $(INST)share/locale/charset.alias $(INST)share/locale/locale.alias \ + $(INST)doc/gettext-$(VERSION)/README.OS2 \ + $(INST)doc/gettext-$(VERSION)/COPYING $(INST)doc/gettext-$(VERSION)/README \ + $(addsuffix /LC_MESSAGES/gettext.mo,$(addprefix $(INST)share/locale/,$(LINGUAS))) \ + $(INSTALL.DIFF) + +.SUFFIXES: +.SUFFIXES: .o .a .def .exe .dll .po .mo +.PRECIOUS: $(OUT)%.o $(OUT)%.a + +.PHONY: all depend clean distr rmzip + +$(OUT)%.o: $(ROOT)%.c + $(CC) $(CFLAGS) -o $@ $< + +# To avoid playing with object file lists for every program we will build +# instead a library containing all the object files from src directory, and +# then link the library against the main program module, so that linker can +# pull all the required functions from there +$(OUT)%.exe: $(OUT)src/%.o $(OUT)util.a $(LINKINTL) + $(LD) $(LDFLAGS) -o $@ $^ $(LIBS) +ifeq ($(LXLITE),1) + lxlite /b- $@ +endif + +all: config.h $(OUTDIRS) $(ROOT)src/po-gram-gen2.h $(ROOT)intl/libintl.h \ + $(OUT)intl.a $(OUT)intl_s.a $(OUT)intl$(INTLDLLVER).dll $(PROGRAMS.EXE) + +define MAKEDEP + echo $(OUT)PATH = FILENAME + makedep $(INCLUDE) $(DEFS) -p $$(OUT)PATH -r -a FILENAME + +endef + +depend: $(INTL.SOURCES) $(SRC.SOURCES) +# Remove all dependencies + @makedep os2compat.h +# Build dependencies, by one file (to avoid 1024 chars command line length limit) + @$(foreach fn,$^,$(subst PATH,$(subst ../,,$(dir $(fn))),$(subst FILENAME,$(fn),$(MAKEDEP)))) + @rm -f __tmp__ + +clean: + rm -rf out emx + +distr: all rmzip gettext-os2-$(VERSION)-bin.zip + +rmzip: + rm -f gettext-os2-$(VERSION)-bin.zip + +# How to configure without configure... +config.h: ../config.h.in ./configure.awk + gawk -f configure.awk -v PACKAGE=gettext -v VERSION=$(VERSION) $< >config.h + +$(OUTDIRS): + $(MKDIR) $(@:/=) + +$(OUT)intl_s.a: $(INTL.OBJECTS) + $(AR) $(ARFLAGS) $@ $^ + +$(OUT)intl.def: $(INTL.OBJECTS) + @echo LIBRARY INTL$(INTLDLLVER) INITINSTANCE TERMINSTANCE>$@ + @echo DESCRIPTION "GNU gettext internationalization library version $(VERSION)">>$@ + @echo DATA MULTIPLE NONSHARED>>$@ + @echo EXPORTS>>$@ + type backward.def>>$@ + emxexp $^ >>$@ + +$(OUT)intl$(INTLDLLVER).dll: $(INTL.OBJECTS) $(OUT)intl.def + @echo ********************************************************* + @echo *** YOU CAN SAFELY IGNORE WARNINGS FROM EMXBIND BELOW *** + @echo ********************************************************* + $(LD) $(LDFLAGS.SHARED) -o $@ $^ $(LIBS) +ifeq ($(LXLITE),1) + lxlite $@ +endif + +# How to build an import library from a .DEF file +$(OUT)%.a: $(OUT)%.def + emximp -o $@ $< + +# iconv.a is just a subset of intl.a (imports from INTL.DLL) +$(OUT)iconv.def: + @echo LIBRARY INTL$(INTLDLLVER) INITINSTANCE TERMINSTANCE>$@ + @echo EXPORTS>>$@ + @echo iconv_open>>$@ + @echo iconv>>$@ + @echo iconv_close>>$@ + +$(OUT)util.a: $(SRC.OBJECTS) $(LIB.OBJECTS) + $(AR) $(ARFLAGS) $@ $^ + +$(ROOT)src/po-gram-gen2.h: $(ROOT)src/po-gram-gen.h + sed -e "s/[yY][yY]/po_gram_/g" $< > $@ + +$(ROOT)intl/libintl.h: $(ROOT)intl/libgnuintl.h + $(COPY) $< $@ + +gettext-os2-$(VERSION)-bin.zip: $(INSTALL.FILES) + @rm -f $@ + zip -9XD $@ $^ + +# The following rules are for `make distr' target only + +$(INST)share/locale/charset.alias: $(ROOT)lib/config.charset + $(UNIXSHELL) $< i386-pc-os2-emx >$@ +$(INST)share/locale/locale.alias: $(ROOT)intl/locale.alias + $(COPY) $< $@ +$(INST)bin/% $(INST)lib/% $(INST)dll/%: $(OUT)% + $(COPY) $< $@ +$(INST)include/%: $(ROOT)intl/% + $(COPY) $< $@ +$(INST)doc/gettext-$(VERSION)/%: $(ROOT)% + $(COPY) $< $@ +$(INST)doc/gettext-$(VERSION)/% $(INST)include/%: % + $(COPY) $< $@ +$(INST)share/locale/%/LC_MESSAGES/gettext.mo: $(ROOT)po/%.po + $(MKDIR) $(dir $@) + $(COMSPEC) /c "$(subst /,\\,set BEGINLIBPATH=$(OUT:/=) && \ + $(OUT)msgfmt.exe) --statistics --verbose -o $@ $<" + +# DO NOT DELETE this line -- makedep depends on it! + +$(OUT)intl/intl-compat.o: ../intl/libgnuintl.h ../intl/gettextP.h \ + ../intl/loadinfo.h ../intl/gettext.h + +$(OUT)intl/bindtextdom.o: ../intl/libgnuintl.h ../intl/gettextP.h \ + ../intl/loadinfo.h ../intl/gettext.h + +$(OUT)intl/dcgettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ + ../intl/gettext.h ../intl/libgnuintl.h + +$(OUT)intl/dgettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ + ../intl/gettext.h ../intl/libgnuintl.h + +$(OUT)intl/gettext.o: ../intl/gettextP.h ../intl/loadinfo.h ../intl/gettext.h \ + ../intl/libgnuintl.h + +$(OUT)intl/finddomain.o: ../intl/gettextP.h ../intl/loadinfo.h \ + ../intl/gettext.h ../intl/libgnuintl.h + +$(OUT)intl/loadmsgcat.o: ../intl/gettext.h ../intl/gettextP.h \ + ../intl/loadinfo.h ../intl/plural-exp.h + +$(OUT)intl/localealias.o: ../intl/gettextP.h ../intl/loadinfo.h \ + ../intl/gettext.h + +$(OUT)intl/textdomain.o: ../intl/libgnuintl.h ../intl/gettextP.h \ + ../intl/loadinfo.h ../intl/gettext.h + +$(OUT)intl/l10nflist.o: ../intl/loadinfo.h + +$(OUT)intl/explodename.o: ../intl/loadinfo.h + +$(OUT)intl/dcigettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ + ../intl/gettext.h ../intl/plural-exp.h ../intl/libgnuintl.h \ + ../intl/hash-string.h ../intl/plural-eval.c + +$(OUT)intl/dcngettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ + ../intl/gettext.h ../intl/libgnuintl.h + +$(OUT)intl/dngettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ + ../intl/gettext.h ../intl/libgnuintl.h + +$(OUT)intl/ngettext.o: ../intl/gettextP.h ../intl/loadinfo.h \ + ../intl/gettext.h ../intl/libgnuintl.h + +$(OUT)intl/plural.o: ../intl/plural-exp.h + +$(OUT)intl/plural-exp.o: ../intl/plural-exp.h + +$(OUT)intl/osdep.o: os2compat.c iconv.c iconv.h + +$(OUT)src/dir-list.o: config.h ../os2/os2compat.h ../src/dir-list.h \ + ../lib/system.h ../src/str-list.h + +$(OUT)src/file-list.o: config.h ../os2/os2compat.h ../src/file-list.h \ + ../src/str-list.h ../lib/error.h ../lib/system.h ../lib/getline.h \ + ../intl/libgettext.h + +$(OUT)src/format-c.o: ../src/format.h ../src/pos.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h ../lib/xmalloc.h ../lib/error.h \ + ../lib/progname.h ../intl/libgettext.h + +$(OUT)src/format-java.o: ../src/format.h ../src/pos.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h ../lib/c-ctype.h ../lib/xmalloc.h \ + ../lib/error.h ../lib/progname.h ../intl/libgettext.h + +$(OUT)src/format-librep.o: ../src/format.h ../src/pos.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h ../lib/xmalloc.h ../lib/error.h \ + ../lib/progname.h ../intl/libgettext.h + +$(OUT)src/format-lisp.o: ../src/format.h ../src/pos.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h ../lib/c-ctype.h ../lib/gcd.h \ + ../lib/xmalloc.h ../lib/system.h ../lib/error.h ../lib/progname.h \ + ../intl/libgettext.h + +$(OUT)src/format-pascal.o: ../src/format.h ../src/pos.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h ../lib/c-ctype.h ../lib/xmalloc.h \ + ../lib/error.h ../lib/progname.h ../intl/libgettext.h + +$(OUT)src/format-python.o: ../src/format.h ../src/pos.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h ../lib/xmalloc.h ../lib/error.h \ + ../lib/progname.h ../intl/libgettext.h + +$(OUT)src/format-ycp.o: ../src/format.h ../src/pos.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h ../lib/xmalloc.h ../lib/error.h \ + ../lib/progname.h ../intl/libgettext.h + +$(OUT)src/format.o: ../src/format.h ../src/pos.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h + +$(OUT)src/hostname.o: config.h ../os2/os2compat.h ../lib/error.h \ + ../lib/progname.h ../lib/basename.h ../lib/xmalloc.h ../lib/system.h \ + ../intl/libgettext.h + +$(OUT)src/message.o: ../src/message.h ../src/str-list.h ../src/pos.h \ + ../lib/hash.h ../lib/fstrcmp.h ../src/format.h ../lib/xmalloc.h \ + ../lib/strstr.h ../lib/system.h + +$(OUT)src/msgl-ascii.o: config.h ../os2/os2compat.h ../src/msgl-ascii.h \ + ../src/message.h ../src/str-list.h ../src/pos.h ../lib/hash.h \ + ../lib/c-ctype.h + +$(OUT)src/msgl-cat.o: config.h ../os2/os2compat.h ../src/msgl-cat.h \ + ../src/message.h ../src/str-list.h ../src/pos.h ../lib/hash.h \ + ../lib/error.h ../lib/xerror.h ../src/read-po.h ../src/po-charset.h \ + ../src/msgl-ascii.h ../src/msgl-equal.h ../src/msgl-iconv.h \ + ../lib/xmalloc.h ../lib/strstr.h ../lib/basename.h ../lib/system.h \ + ../intl/libgettext.h + +$(OUT)src/msgl-charset.o: config.h ../os2/os2compat.h ../src/msgl-charset.h \ + ../src/message.h ../src/str-list.h ../src/pos.h ../lib/hash.h \ + ../src/po-charset.h ../lib/error.h ../lib/progname.h ../lib/basename.h \ + ../lib/xerror.h ../lib/strstr.h ../lib/system.h ../intl/libgettext.h + +$(OUT)src/msgl-english.o: config.h ../os2/os2compat.h ../src/msgl-english.h \ + ../src/message.h ../src/str-list.h ../src/pos.h ../lib/hash.h \ + ../lib/xmalloc.h + +$(OUT)src/msgl-equal.o: config.h ../os2/os2compat.h ../src/msgl-equal.h \ + ../src/message.h ../src/str-list.h ../src/pos.h ../lib/hash.h + +$(OUT)src/msgl-iconv.o: config.h ../os2/os2compat.h ../src/msgl-iconv.h \ + ../src/message.h ../src/str-list.h ../src/pos.h ../lib/hash.h \ + ../lib/error.h ../lib/progname.h ../lib/basename.h ../src/po-charset.h \ + ../src/msgl-ascii.h ../lib/xmalloc.h ../lib/strstr.h ../lib/system.h \ + ../intl/libgettext.h + +$(OUT)src/open-po.o: ../src/open-po.h ../src/dir-list.h ../lib/error.h \ + ../lib/system.h ../intl/libgettext.h + +$(OUT)src/plural-eval.o: ../intl/plural-exp.h ../intl/plural-eval.c + +$(OUT)src/plural.o: ../intl/plural.c ../intl/plural-exp.h \ + ../intl/plural-exp.c + +$(OUT)src/po-charset.o: config.h ../os2/os2compat.h ../src/po-charset.h \ + ../lib/error.h ../lib/xerror.h ../lib/basename.h ../lib/strstr.h \ + ../lib/system.h ../intl/libgettext.h + +$(OUT)src/po-gram-gen.o: config.h ../os2/os2compat.h ../src/po-gram.h \ + ../src/str-list.h ../src/po-lex.h ../lib/error.h ../lib/progname.h \ + ../src/pos.h ../lib/xerror.h ../lib/xmalloc.h ../intl/libgettext.h \ + ../src/po.h ../src/message.h ../lib/hash.h + +$(OUT)src/po-hash-gen.o: config.h ../os2/os2compat.h ../src/po-hash.h \ + ../lib/xmalloc.h ../src/po.h ../src/po-lex.h ../lib/error.h \ + ../lib/progname.h ../src/pos.h ../lib/xerror.h ../src/message.h \ + ../src/str-list.h ../lib/hash.h + +$(OUT)src/po-lex.o: config.h ../os2/os2compat.h ../src/po-lex.h \ + ../lib/error.h ../lib/progname.h ../src/pos.h ../lib/xerror.h \ + ../lib/c-ctype.h ../lib/linebreak.h ../intl/libgettext.h \ + ../src/str-list.h ../src/po-charset.h ../lib/xmalloc.h ../lib/system.h \ + ../src/open-po.h ../src/po-gram-gen2.h ../lib/utf8-ucs4.h + +$(OUT)src/po-time.o: ../src/po-time.h ../lib/xerror.h ../lib/error.h + +$(OUT)src/po.o: config.h ../os2/os2compat.h ../src/po.h ../src/po-lex.h \ + ../lib/error.h ../lib/progname.h ../src/pos.h ../lib/xerror.h \ + ../src/message.h ../src/str-list.h ../lib/hash.h ../src/po-charset.h \ + ../src/po-hash.h ../lib/xmalloc.h + +$(OUT)src/read-java.o: ../src/read-java.h ../src/message.h ../src/str-list.h \ + ../src/pos.h ../lib/hash.h ../src/msgunfmt.h ../lib/javaexec.h \ + ../lib/pipe.h ../lib/wait-process.h ../src/read-po.h ../lib/error.h \ + ../lib/system.h ../intl/libgettext.h + +$(OUT)src/read-mo.o: ../src/read-mo.h ../src/message.h ../src/str-list.h \ + ../src/pos.h ../lib/hash.h ../intl/gettext.h ../lib/error.h \ + ../lib/xmalloc.h ../lib/system.h ../intl/libgettext.h + +$(OUT)src/read-po.o: ../src/read-po.h ../src/message.h ../src/str-list.h \ + ../src/pos.h ../lib/hash.h ../src/po.h ../src/po-lex.h ../lib/error.h \ + ../lib/progname.h ../lib/xerror.h ../lib/xmalloc.h ../intl/libgettext.h + +$(OUT)src/str-list.o: config.h ../os2/os2compat.h ../src/str-list.h \ + ../lib/xmalloc.h + +$(OUT)src/urlget.o: config.h ../os2/os2compat.h ../lib/error.h \ + ../lib/progname.h ../lib/basename.h ../lib/full-write.h ../lib/execute.h \ + ../lib/javaexec.h ../lib/system.h ../intl/libgettext.h + +$(OUT)src/write-java.o: ../src/write-java.h ../src/message.h \ + ../src/str-list.h ../src/pos.h ../lib/hash.h ../lib/c-ctype.h \ + ../lib/error.h ../lib/javacomp.h ../lib/mkdtemp.h ../src/msgfmt.h \ + ../src/msgl-iconv.h ../lib/pathmax.h ../intl/plural-exp.h \ + ../src/po-charset.h ../lib/xmalloc.h ../lib/system.h ../lib/tmpdir.h \ + ../lib/utf8-ucs4.h ../intl/libgettext.h + +$(OUT)src/write-mo.o: ../src/write-mo.h ../src/message.h ../src/str-list.h \ + ../src/pos.h ../lib/hash.h ../src/msgfmt.h ../intl/gettext.h \ + ../intl/hash-string.h ../lib/error.h ../lib/system.h ../intl/libgettext.h + +$(OUT)src/write-po.o: ../src/write-po.h ../src/message.h ../src/str-list.h \ + ../src/pos.h ../lib/hash.h ../lib/c-ctype.h ../lib/linebreak.h \ + ../src/msgl-ascii.h ../lib/xmalloc.h ../lib/strstr.h ../lib/system.h \ + ../lib/error.h ../lib/xerror.h ../intl/libgettext.h + +$(OUT)src/x-c.o: config.h ../os2/os2compat.h ../src/message.h \ + ../src/str-list.h ../src/pos.h ../lib/hash.h ../src/x-c.h \ + ../src/xgettext.h ../lib/error.h ../lib/progname.h ../lib/xmalloc.h \ + ../lib/system.h ../intl/libgettext.h + +$(OUT)src/x-java.o: ../src/message.h ../src/str-list.h ../src/pos.h \ + ../lib/hash.h ../src/x-java.h ../src/xgettext.h ../lib/xmalloc.h \ + ../lib/strstr.h + +$(OUT)src/x-librep.o: config.h ../os2/os2compat.h ../src/message.h \ + ../src/str-list.h ../src/pos.h ../lib/hash.h ../src/x-librep.h \ + ../src/xgettext.h ../lib/error.h ../lib/xmalloc.h ../lib/system.h \ + ../intl/libgettext.h + +$(OUT)src/x-lisp.o: config.h ../os2/os2compat.h ../src/message.h \ + ../src/str-list.h ../src/pos.h ../lib/hash.h ../src/x-lisp.h \ + ../src/xgettext.h ../lib/error.h ../lib/xmalloc.h ../lib/system.h \ + ../intl/libgettext.h + +$(OUT)src/x-po.o: ../src/message.h ../src/str-list.h ../src/pos.h \ + ../lib/hash.h ../src/x-po.h ../src/xgettext.h ../lib/xmalloc.h \ + ../src/po.h ../src/po-lex.h ../lib/error.h ../lib/progname.h \ + ../lib/xerror.h ../intl/libgettext.h + +$(OUT)src/x-rst.o: config.h ../os2/os2compat.h ../src/message.h \ + ../src/str-list.h ../src/pos.h ../lib/hash.h ../src/x-rst.h \ + ../src/xgettext.h ../lib/error.h ../lib/progname.h ../lib/xmalloc.h \ + ../lib/system.h ../intl/libgettext.h + +$(OUT)src/x-ycp.o: config.h ../os2/os2compat.h ../src/message.h \ + ../src/str-list.h ../src/pos.h ../lib/hash.h ../src/x-ycp.h \ + ../src/xgettext.h ../lib/error.h ../lib/xmalloc.h ../lib/system.h \ + ../intl/libgettext.h diff --git a/os2/README.OS2 b/os2/README.OS2 index e3934b85b..1b2cb0fb4 100644 --- a/os2/README.OS2 +++ b/os2/README.OS2 @@ -12,8 +12,9 @@ The library has been compiled with -Zmt flag, but it doesn't matter as soon as you use the EMX single-threaded runtime fix (emx-strt-fix-0.0.2.zip). The library is fully compatible with the previous port of gettext library -which is largely used especialy by XFree86 programs. All the old programs -that I have with gettext support run fine with the new version of the DLL. +(0.10.35) which is largely used especialy by XFree86/2 programs. All the +old programs that I have with gettext support run fine with the new version +of the DLL. Installation @@ -28,8 +29,14 @@ If you use the UNIXROOT environment variable, the default catalogue search paths will be like on Unices, e.g. $(UNIXROOT)/usr/lib and $(UNIXROOT)/usr/share/locale. GNULOCALEDIR always overrides this. -Also this port supports character set conversions. This means that if your -.mo files were written using new gettext guidelines, e.g. they contain a +Now if you haven't did it earlier, set the language identifier that you use. +This is done by adding a "SET LANG=xxx" environment setting to your CONFIG.SYS, +where xxx is the identifier of your language (example: en_UK for English in UK, +ru_RU for Russian in Russia. Also you can use names like "russian", "italian" +and so on - see the share/locale/locale.alias file). + +This port of gettext supports character set conversions. This means that if +your .mo files were written using new gettext guidelines, e.g. they contain a message like this: msgid "" @@ -43,21 +50,22 @@ performs the translation from CP878 -> CP866 for every message. If you want to override the character set used to output messages (for example in XFree86 for Russian the KOI8-R encoding (codepage 878) is used) you can -set the OUTPUT_CHARSET environment variable like this: +set the output character set by adding a postfix to the LANG environment +variable, this way: -set OUTPUT_CHARSET=KOI8-R +set LANG=ru_RU.KOI8-R or (equivalent): -set OUTPUT_CHARSET=CP878 +set LANG=ru_RU.CP878 or (same effect): -set OUTPUT_CHARSET=IBM-878 +set LANG=ru_RU.IBM-878 -Note that you don't need to set the OUTPUT_CHARSET initially; you may want to -set it just if you want to override the OS/2 active codepage (for example, -you can put it into your XFree86 startup script). +If the output character set is ommited from the LANG variable, the default +codepage is queried by using the OS/2 API; you may want to set it just if you +want to override the OS/2 active codepage. XFree86 setup @@ -68,7 +76,7 @@ XFree86 default character set (e.g. for Russain CP866 vs KOI8-R), you can add the following (or similar) statement to your startx.cmd file (after the commands dealing with HOME and X11SHELL): -call VALUE 'OUTPUT_CHARSET', 'KOI8-R', env +call VALUE 'LANG', 'ru_RU.KOI8-R', env Otherwise you can get incorrect (wrong codepage) output from programs that previously worked (e.g. GIMP 1.22). This is because earlier versions of gettext @@ -80,12 +88,17 @@ Implementation remarks The codepage conversion code uses OS/2 Unicode API, thus it falls under the limits that OS/2 Unicode API has. For example, OS/2 Unicode API does not -support the BIG5 Chinese character set nor ISO-8859-X where X > 9 (at least -with Warp4 with fixpack 14 that I have). Also libintl relies on a feature of -the GNU iconv which works differently in OS/2 Unicode API (well, someone may -call it even a bug in OS/2 API); as a results it is impossible to msgfmt any -.po files written in the UTF-8 character set; if someone is interested I can -explain the bug more detailed. +support the BIG5 East Asian character set nor ISO-8859-X where X > 9 (at +least with Warp4 with fixpack 14 that I have). If someone knows the +OS/2 API identifiers for BIG5 or ISO8859-10,... encodings, please tell me! + +Since gettext 0.11 iconv emulation layer supports correctly UTF-8. Also +I have added theoretical support for the following East Asian encodings: +EUC-JP, EUC-KR, EUC-TW, EUC-CN. However, these encodings are (I believe) +supported only on East Asian editions of OS/2. The code pages for them are +listed in the \language\codepage\ucstbl.lst file but the codepage files +themselves are missing; I believe they are ommited from European OS/2's +due to their large size. Additional API @@ -97,48 +110,50 @@ to convert text between various codepages. The intl.h header file contains the prototypes and definitions needed for iconv(); if you configure software with autoconf it possibly will find intl.h and set up the software accordingly. -Also it provides an limited implementation of the nl_langinfo function which -is used for querying the active system codepage. Other software may find it -useful as well. - -All these functions are exported from INTL.DLL, thus if you use either iconv -or nl_langinfo you should link with it (-lintl). +All these functions are exported from INTL.DLL. The iconv.a import library +imports all the iconv* functions from INTL.DLL. So, like on Unix, now you can +#include , then link with -liconv and you will get a fully functional +iconv implementation. Rebuilding the library ====================== -The library is quite easy to rebuild. First of all, get and install the -original source code package, as of today it is gettext-0.10.40. Now copy -the contents of the src/gettext-$(VERSION)/ directory on top of the source -tree, e.g. intl/os2compat.c goes into the respective intl/ directory of the -original source package. As of today the support/ directory is missing from -the gettext source tree, thus you should just copy it recursively into the -root directory of the source code. +The library is quite easy to rebuild. Since the OS/2 support is provided now +out-of-the-box in gettext, you just have to download and unpack the source +archive. Now there are two ways to rebuild the gettext library: + +1. If you're a masochist you can go the clumsy configure/make Unix way. This +is not recommended however as I found no way to tell libtool to generate a +slightly non-standard DLL which will be backward compatible with gettext +0.10.35. The compatibility is achieved by prepending backward.def to the +export definition file generated with emximp or somehow else. Thus it is +highly recommended you build using the second way, if it is possible. + +2. Go to os2 and just run `make'. If you have all the required tools, +it should painlessly compile. Finally, if you want a binary distribution +archive, do `make distr'. The weak side of building this way is that makefile +is somewhat fragile. This means that if the makefile is left unmodified and +a new version of gettext is rolled out, it *may* not work. But every possible +attempt was made to ensure that the makefile takes most important build +parameters from their autoconf counterparts. + +WARNING: Due to bugs in GNU Make 3.76.1 (at least in its OS/2 port) you can +get sometimes (depending on make version and makefile modification :) funny +messages like these: -Now apply the diff file, and resolve any conflicts (if you happen to compile -a newer version than the one the diff is supplied for). - -Now if you're a masochist you can go the clumsy configure/make Unix way, but -it is highly recommended to use an alternate way: go to support/os2 and just -run `make'. If you have all the required tools, it should painlessly compile. -Now if you want a binary distribution archive, do `make distr'. +zip warning: name not matched: emx/src/gettext-0.10.40/support/os2/iconv.h -WARNING: Due to a bug in GNU Make 3.76.1 (at least in its OS/2 port) you will -have to do sometimes "make distr" twice to get a complete distribution archive; -if you see warnings from zip like these: +or even: -zip warning: name not matched: emx/src/gettext-0.10.40/support/os2/iconv.h -zip warning: name not matched: emx/src/gettext-0.10.40/support/os2/langinfo.h +*** No rule to make target `out/release/intl.a', needed by `all'. Stop. -it is best to interrupt zip and re-run make distr once more time. This happens -because make fails to execute two different rules that tells him to make two -different destination files from the same source file (e.g. iconv.h is copied -both to emx/src/gettext/support/os2 and to emx/include). +Such messages are a bad joke. Ignore it, and re-run make. This is a +long-standing bug in GNU make, alas. -If you want a debug version of library, you can do `make install DEBUG=1'. +If you want a debug version of library, you can do `make DEBUG=1'. -If you have no LxLite tool installed, do `make LXLITE=0' +If you don't have the LxLite tool installed, do `make LXLITE=0' NB: For best results, it is highly recommended that you use at least emxbind.exe and ld.exe from gcc 3.0.2 or later, since they contain a number of fixes that diff --git a/os2/configure.awk b/os2/configure.awk new file mode 100644 index 000000000..08127ac64 --- /dev/null +++ b/os2/configure.awk @@ -0,0 +1,83 @@ +#!/usr/bin/gawk -f +# A script for emulating configure on OS/2 without having even a Unix-like +# shell. Designed specifically for compiling libgettext with gcc+emx. + +BEGIN{ + print "/* config.h. Generated automatically by configure.awk. */" + + cfg["HAVE_ALLOCA"] = 1; + cfg["HAVE_ALLOCA_H"] = 1; + cfg["HAVE_LONG_FILE_NAMES"] = 1; + cfg["HAVE_VPRINTF"] = 1; + cfg["STDC_HEADERS"] = 1; + cfg["HAVE_GETCWD"] = 1; + cfg["HAVE_GETEGID"] = 1; + cfg["HAVE_GETEUID"] = 1; + cfg["HAVE_GETGID"] = 1; + cfg["HAVE_GETPAGESIZE"] = 1; + cfg["HAVE_GETUID"] = 1; + cfg["HAVE_ISASCII"] = 1; + cfg["HAVE_MBLEN"] = 1; + cfg["HAVE_MEMCPY"] = 1; + cfg["HAVE_MEMMOVE"] = 1; + cfg["HAVE_MEMSET"] = 1; + cfg["HAVE_PUTENV"] = 1; + cfg["HAVE_SETLOCALE"] = 1; + cfg["HAVE_STRCHR"] = 1; + cfg["HAVE_STRCSPN"] = 1; + cfg["HAVE_STRDUP"] = 1; + cfg["HAVE_STRERROR"] = 1; + cfg["HAVE_STRSTR"] = 1; + cfg["HAVE_STRTOUL"] = 1; + cfg["HAVE_UNAME"] = 1; + cfg["HAVE_LIMITS_H"] = 1; + cfg["HAVE_LOCALE_H"] = 1; + cfg["HAVE_MALLOC_H"] = 1; + cfg["HAVE_STDDEF_H"] = 1; + cfg["HAVE_STDLIB_H"] = 1; + cfg["HAVE_STRING_H"] = 1; + cfg["HAVE_SYS_PARAM_H"] = 1; + cfg["HAVE_UNISTD_H"] = 1; + cfg["HAVE_GETTIMEOFDAY"] = 1; + cfg["HAVE_PATHCONF"] = 1; + cfg["HAVE_RAISE"] = 1; + cfg["HAVE_SELECT"] = 1; + cfg["HAVE_STRPBRK"] = 1; + cfg["HAVE_UTIME"] = 1; + cfg["HAVE_UTIMES"] = 1; + cfg["HAVE_WAITPID"] = 1; + cfg["HAVE_ARPA_INET_H"] = 1; + cfg["HAVE_DIRENT_H"] = 1; + cfg["HAVE_FCNTL_H"] = 1; + cfg["HAVE_SYS_TIME_H"] = 1; + cfg["HAVE_TIME_H"] = 1; + cfg["HAVE_POSIX_SIGNALBLOCKING"] = 1; + cfg["HAVE_ERRNO_DECL"] = 1; + cfg["HAVE_ICONV"] = 1; + cfg["ICONV_CONST"] = "const"; + cfg["_GNU_SOURCE"] = 1; + cfg["HAVE_C_BACKSLASH_A"] = 1; + cfg["HAVE_UNSIGNED_LONG_LONG"] = 1; + cfg["HAVE_PTRDIFF_T"] = 1; + cfg["vfork"] = "fork"; + cfg["uintmax_t"] = "unsigned long long"; + cfg["HAVE_DECL_WCWIDTH"] = 0; + cfg["mbstate_t"] = "int"; + cfg["SETLOCALE_CONST"] = "const"; + cfg["ENABLE_NLS"] = 1; + + cfg["PACKAGE"] = "\""PACKAGE"\""; + cfg["VERSION"] = "\""VERSION"\""; +} + +/^#undef/ { + if (cfg[$2] != "") + print "#define "$2" "cfg[$2]; + else + print "/* #undef "$2" */"; + next +} + +{ + print $0 +} diff --git a/os2/iconv/iconv.c b/os2/iconv/iconv.c index b098a9666..f26ab456d 100644 --- a/os2/iconv/iconv.c +++ b/os2/iconv/iconv.c @@ -1,5 +1,5 @@ /* OS/2 iconv() implementation through OS/2 Unicode API - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published @@ -24,14 +24,15 @@ typedef struct _iconv_t { - UconvObject from; - UconvObject to; + UconvObject from; /* "From" conversion handle */ + UconvObject to; /* "To" conversion handle */ } *iconv_t; /* Tell "iconv.h" to not define iconv_t by itself. */ #define _ICONV_T #include "iconv.h" +#include #include /* Convert an encoding name to te form understood by UniCreateUconvObject. */ @@ -40,19 +41,30 @@ cp_convert (const char *cp, UniChar *ucp) { size_t sl = 0; - /* Transform CPXXX naming style to IBM-XXX style */ - if ((cp[0] == 'C' || cp[0] == 'c') && (cp[1] == 'P' || cp[1] == 'p')) + if (!strcasecmp (cp, "EUC-JP")) + memcpy (ucp, L"IBM-954", 8*2); + else if (!strcasecmp (cp, "EUC-KR")) + memcpy (ucp, L"IBM-970", 8*2); + else if (!strcasecmp (cp, "EUC-TW")) + memcpy (ucp, L"IBM-964", 8*2); + else if (!strcasecmp (cp, "EUC-CN")) + memcpy (ucp, L"IBM-1383", 9*2); + else { - ucp[sl++] = 'I'; - ucp[sl++] = 'B'; - ucp[sl++] = 'M'; - ucp[sl++] = '-'; - cp += 2; - } + /* Transform CPXXX naming style to IBM-XXX style */ + if ((cp[0] == 'C' || cp[0] == 'c') && (cp[1] == 'P' || cp[1] == 'p')) + { + ucp[sl++] = 'I'; + ucp[sl++] = 'B'; + ucp[sl++] = 'M'; + ucp[sl++] = '-'; + cp += 2; + } - while (*cp != '\0') - ucp[sl++] = *cp++; - ucp[sl] = 0; + while (*cp != '\0') + ucp[sl++] = *cp++; + ucp[sl] = 0; + } } iconv_t @@ -60,6 +72,7 @@ iconv_open (const char *cp_to, const char *cp_from) { UniChar *ucp; iconv_t conv; + uconv_attribute_t attr; conv = (iconv_t) malloc (sizeof (struct _iconv_t)); if (conv == NULL) @@ -87,6 +100,16 @@ iconv_open (const char *cp_to, const char *cp_from) return (iconv_t)(-1); } + UniQueryUconvObject (conv->from, &attr, sizeof (attr), NULL, NULL, NULL); + /* Do not treat 0x7f as a control character + (don't understand what it exactly means but without it MBCS prefix + character detection sometimes could fail (when 0x7f is a prefix)). + And don't treat the string as a path (the docs also don't explain + what it exactly means, but I'm pretty sure converted texts will + mostly not be paths). */ + attr.converttype &= ~(CVTTYPE_CTRL7F | CVTTYPE_PATH); + UniSetUconvObject (conv->from, &attr); + return conv; } @@ -95,23 +118,24 @@ iconv (iconv_t conv, const char **in, size_t *in_left, char **out, size_t *out_left) { - size_t bytes_converted = 0; int rc; size_t sl = *in_left, nonid; UniChar *ucs = (UniChar *) alloca (sl * sizeof (UniChar)); UniChar *orig_ucs = ucs; + size_t retval = 0; - rc = UniUconvToUcs (conv->from, (void **)in, in_left, &ucs, &sl, &nonid); + rc = UniUconvToUcs (conv->from, (void **)in, in_left, &ucs, &sl, &retval); if (rc) goto error; sl = ucs - orig_ucs; ucs = orig_ucs; - /* Uh-oh, seems like a bug in UniUconvFromUcs, at least when - translating from KOI8-R to KOI8-R (null translation) */ -#if 0 + /* UniUconvFromUcs will stop at first NULL byte + while we want ALL the bytes converted. */ +#if 1 rc = UniUconvFromUcs (conv->to, &ucs, &sl, (void **)out, out_left, &nonid); if (rc) goto error; + retval += nonid; #else while (sl) { @@ -121,6 +145,7 @@ iconv (iconv_t conv, rc = UniUconvFromUcs (conv->to, &ucs, &usl, (void **)out, out_left, &nonid); if (rc) goto error; + retval += nonid; if (sl && *out_left) { *(*out)++ = 0; @@ -130,8 +155,24 @@ iconv (iconv_t conv, } #endif return 0; - error: - errno = EILSEQ; + +error: + /* Convert OS/2 error code to errno. */ + switch (rc) + { + case ULS_ILLEGALSEQUENCE: + errno = EILSEQ; + break; + case ULS_INVALID: + errno = EINVAL; + break; + case ULS_BUFFERFULL: + errno = E2BIG; + break; + default: + errno = EBADF; + break; + } return (size_t)(-1); }