Adding support for z/OS in gnupg and related libraries

Werner Koch wk at
Thu Jul 30 15:58:28 CEST 2009

On Wed, 29 Jul 2009 20:40, amul.shah at said:

> Please excuse the cross-post.  Some of the hoops that I jumped through

gnupg-devel is fine.  We can drop gcrypt-devel.

> gnupg              1.4.9
> libgpg-errors   1.7
> libgcrypt          1.4.4
> libgpgme         1.1.8

Is there a reason why you work on 1.4.x and libgcrypt?  Libgcrypt is
only required for 2.x.

> Services.  The platform's native character encoding (aka code page or
> code set) is not ASCII, but EBCDIC.  The US dialect of EBCDIC is

FWIW, once upon a time gpg had some limited support for EBCDIC but that
was later dropped.

> USS program are compiled as 31bit EBCDIC with no Unicode capabilities. 

What does USS mean in this context?

> autotools is weak. Where I wanted to build shared libraries, I compiled
> archives.  I unpacked the archives and converted them to shared libs

Support for shared libraries needs to be added to libtool; that is a
wrapper to abstarct the building of shared libs. It is quite possible
that it does not yet support zOS - I have not checked.

> Configuration options:
> ./configure CC=xlc CFLAGS="-qchars=signed -qascii -q64 -qlanglvl=extc99
> -qexportall -qrent -qnocsect -W l,DLL -D_XOPEN_SOURCE=600
> -D_OPEN_MSGQ_EXT" LD=xlc LDFLAGS="-qascii -q64 -W l,DLL" CXX=xlc++
> --enable-shared --prefix=/usr/local

In general those required options should go into  We can
test there for the zOS and apply specific options.

What is the reason that you used CC=xls?  Is there another C compiler
which can't be used?  The configure script should be able to detect the

> There is an issue with the xlc configuration that defaults to picking up
> include files from '.' (current working directory) and /usr/include
> before picking up command line options. Since the z/OS system has two
> headers with the same name as headers in libgcrypt, we link them into

Doesn't xlc support the -I option?  "-I ." should pick up the packages
header files first.

> -- gnupg-1.4.9
> Apply the attached patch gnupg-1.4.9.patch which applies to gnupg
> 1.4.9.  I will need help migrating this to the v2 line of gnupg

Is your target GnuPG-1.4 or GnuPG-2?  If at all possible I would suggest
to target GnuPG-2.

> Configuration options:
> ./configure CC=xlc CFLAGS="-qchars=signed -qascii -q64 -qlanglvl=extc99
> -qexportall -qrent -qnocsect -W l,DLL -D_XOPEN_SOURCE=600
> -D_OPEN_MSGQ_EXT" LD=xlc LDFLAGS="-qascii -q64 -W l,DLL" CXX=xlc++
> --without-pth --without-libassuan --without-ksba --prefix=/usr/local

The --without-* options are not needed but they don't harm for 1.4.
--prefix=/usr/local is anyway the default.

> -- Generating Shared Libs from archives

Weel, we need to look into libtool.

> diff -purN gnupg-1.4.9.orig/checks/conventional-mdc.test gnupg-1.4.9.working-20090430/checks/conventional-mdc.test
> --- gnupg-1.4.9.orig/checks/conventional-mdc.test	Tue Oct 23 04:53:20 2007
> +++ gnupg-1.4.9.working-20090430/checks/conventional-mdc.test	Wed Apr 29 16:29:29 2009
> @@ -9,8 +9,10 @@ for ciph in `all_cipher_algos`; do
>      # *BSD's dd can't cope with a count of 0
>      if test "$i" = "0"; then
>          : >z
> +	chtag -tc ISO8859-1 z

This is a platform specific tool.  It needs to be changed to a shell
fucntion which figures out the the latform and calls it only if needed.
Not a big deal.

> diff -purN gnupg-1.4.9.orig/g10/gpg.c gnupg-1.4.9.working-20090430/g10/gpg.c
> --- gnupg-1.4.9.orig/g10/gpg.c	Thu Mar 20 05:06:43 2008
> +++ gnupg-1.4.9.working-20090430/g10/gpg.c	Thu Apr 30 13:02:17 2009
> @@ -18,6 +18,7 @@
>   * along with this program; if not, see <>.
>   */
> +#include "platform_pragma.h"
>  #include <config.h>

This platform_pragma.h file should be included by config.h  so that
there is no need to chnage all source files.  config.h is created by

> --- gnupg-1.4.9.orig/g10/	Wed Mar 26 13:30:47 2008
> +++ gnupg-1.4.9.working-20090430/g10/	Thu Apr 30 10:05:30 2009
Don't chnage; the source is

>  clean-generic:
> +	rm -f *.dbg *.x

This is done using a CLEAN target in

> +/* platform_pragma.h - platform specific pragmas
> + * Copyright (C) 2009 Fidelity Information Services, Inc

One imortant point to get your code into GnuPG.  We require copyright
assignments to the FSF.  We should discuss the terms off-list.

> diff -purN gnupg-1.4.9.orig/intl/bindtextdom.c gnupg-1.4.9.working-20090430/intl/bindtextdom.c
> --- gnupg-1.4.9.orig/intl/bindtextdom.c	Tue Oct 23 05:25:01 2007
> +++ gnupg-1.4.9.working-20090430/intl/bindtextdom.c	Mon Apr 27 14:38:32 2009

These are files installed from the gettext package.  It is possible to
change that in GnuPG but the next time we update the gettext stuff it
will be lost.  Thus it needs to be integrated into gettext proper.

> +int zos_getpccsid(int fd)
> +{

The GNU project uses a different indendation;  The important part is
to align the function name to the first column:

  zos_getpccsid(int fd)

> diff -purN gnupg-1.4.9.orig/util/ gnupg-1.4.9.working-20090430/util/

Well, ;-)

> diff -pruN libgcrypt-1.4.4.orig/src/ath.c
> --- libgcrypt-1.4.4.orig/src/ath.c	Wed Sep  3 06:04:42 2008
> +++	Thu Apr 30 11:16:28 2009
> @@ -30,6 +30,9 @@
>  # include <sys/time.h>
>  #endif
>  #include <sys/types.h>
> +#if defined(__MVS__)
> +#include <sys/msg.h>
> +#endif

This is better handled using a configure test. 



Die Gedanken sind frei.  Auschnahme regelt ein Bundeschgesetz.

More information about the Gcrypt-devel mailing list