# vim: ft=make ts=4 sw=4 noet
.DEFAULT_GOAL := all

NAME    = gcc
VERSION = 12.5.0
GARTYPE = v2

DESCRIPTION = GNU Compiler Collection 12.x
define BLURB
  GCC 12.x C, C++, and Fortran compiler. Builds into /opt/ozsw using
  GCC 9.x (OZSWgcc9) as the bootstrap compiler.
  After installation, update GCC12_CC_HOME = /opt/ozsw in garrc and set
  GARCOMPILER = GCC12.
endef

MASTER_SITES  = http://ftp.gnu.org/gnu/gcc/gcc-$(VERSION)/
DISTFILES    += $(DISTNAME).tar.gz

LICENSE = COPYING3

BUILD_DEP_PKGS += OZSWbinutils OZSWzlib OZSWgcc9

# -----------------------------------------------------------------------
# OZSWgcc12rt - GCC 12 runtime libraries only.
# -----------------------------------------------------------------------
PACKAGES                   += OZSWgcc12rt
SPKG_DESC_OZSWgcc12rt       = GCC 12.x runtime libraries (libgcc_s, libstdc++, libgfortran, libgomp, ...)
CATALOGNAME_OZSWgcc12rt     = gcc12rt
RUNTIME_DEP_PKGS_OZSWgcc12rt += OZSWzlib
PKGFILES_OZSWgcc12rt  = .*/lib/libgcc_s\.so.*
PKGFILES_OZSWgcc12rt += .*/lib/libstdc\+\+\.so.*
PKGFILES_OZSWgcc12rt += .*/lib/libgfortran\.so.*
PKGFILES_OZSWgcc12rt += .*/lib/libgomp\.so.*
PKGFILES_OZSWgcc12rt += .*/lib/libquadmath\.so.*
PKGFILES_OZSWgcc12rt += .*/lib/libitm\.so.*
PKGFILES_OZSWgcc12rt += .*/lib/libatomic\.so.*
PKGFILES_OZSWgcc12rt += .*/lib/libssp\.so.*

# -----------------------------------------------------------------------
# OZSWgcc12 - the compiler, headers, static support libs, and tools.
# -----------------------------------------------------------------------
PACKAGES             += OZSWgcc12
SPKG_DESC_OZSWgcc12   = GNU Compiler Collection 12.x (C, C++, Fortran) - compiler
CATALOGNAME_OZSWgcc12 = gcc12
RUNTIME_DEP_PKGS_OZSWgcc12 += OZSWgcc12rt OZSWzlib

# -----------------------------------------------------------------------
# Build configuration
# -----------------------------------------------------------------------

OBJDIR = ../gcc-build

PARALLELMFLAGS = -j4

# Expose madvise, O_CLOEXEC, etc. from Solaris system headers
EXTENSIONS = 1

POSIX_HDR = \#ifndef _XOPEN_SOURCE\n\#define _XOPEN_SOURCE 600\n\#endif\n\#ifndef _POSIX_C_SOURCE\n\#define _POSIX_C_SOURCE 200112L\n\#endif\n\#include <sys/types.h>\n\#include <sys/stat.h>\n\#include <unistd.h>
SUN_PROC_STUB = \#ifdef __sun\n\#define PROC_UNSUPPORTED 1\n\#endif

post-extract:
	@echo "==> Applying Solaris libiberty compatibility fixes"
	@for f in getpwd.c pex-common.c pex-common.h unlink-if-ordinary.c; do \
		gsed -i "1s|^|$(POSIX_HDR)\n|" $(WORKSRC)/libiberty/$$f; \
	done
	@for f in pex-unix.c regex.c; do \
		gsed -i "1s|^|$(SUN_PROC_STUB)\n\n|" $(WORKSRC)/libiberty/$$f; \
	done
	@echo "==> Applying Solaris c++tools/module compatibility fixes"
	@gsed -i '1s|^|#ifndef O_DIRECTORY\n# define O_DIRECTORY 0\n#endif\n|' \
		$(WORKSRC)/c++tools/resolver.cc
	@echo "==> Creating libiberty/ansidecl.h shim (modern OZSWbinutils ansidecl.h dropped PTR)"
	@printf '#ifndef PTR\n# define PTR void *\n#endif\n#include_next "ansidecl.h"\n' \
		> $(WORKSRC)/libiberty/ansidecl.h
	@gsed -i 's|^/\* Some open(2) flag differences|/* Solaris: madvise() and MADV_RANDOM are hidden when _POSIX_C_SOURCE > 2\n * or _XPG4_2 is defined (the POSIX mmap path). Add explicit declarations. */\n#if defined (__sun) \&\& MAPPED_READING\nextern "C" int madvise (char *, size_t, int);\n# ifndef MADV_RANDOM\n#  define MADV_RANDOM 1\n# endif\n#endif\n\n/* Some open(2) flag differences|' \
		$(WORKSRC)/gcc/cp/module.cc
	@$(MAKECOOKIE)

post-configure:
	@echo "==> Reordering COMPILE.c in libiberty Makefiles (INCDIR before CPPFLAGS)"
	@for mk in \
	    $(OBJDIR)/libiberty/Makefile \
	    $(OBJDIR)/build-i386-pc-solaris2.11/libiberty/Makefile; do \
	    test -f $$mk && \
	    gsed -i 's|^\(COMPILE.c = \$$(CC) -c -DHAVE_CONFIG_H \$$(CFLAGS)\) \$$(CPPFLAGS) \(-I. -I\$$(INCDIR)\)|\1 \2 $$(CPPFLAGS)|' $$mk || true; \
	done
	@echo "==> Patching runtime_sysinfo.go: add _O_CLOEXEC=0 (absent from snv_111b fcntl.h)"
	@gsed -i '/^const _FD_CLOEXEC/a const _O_CLOEXEC = 0' \
	    $(OBJDIR)/i386-pc-solaris2.11/libgo/runtime_sysinfo.go || true
	@$(MAKECOOKIE)

# Download GCC prerequisites (GMP, MPFR, MPC, ISL) into the source tree.
# Patch the script to use ftp:// and gtar (required on OpenSolaris).
pre-configure:
	@echo "==> Patching contrib/download_prerequisites for OpenSolaris"
	gsed -i 's|https\?:|ftp:|g' $(WORKSRC)/contrib/download_prerequisites
	gsed -i 's/tar -x/gtar -x/g' $(WORKSRC)/contrib/download_prerequisites
	cd $(WORKSRC) && sh contrib/download_prerequisites --no-verify
	@$(MAKECOOKIE)

CONFIGURE_ARGS  = --prefix=$(prefix)
CONFIGURE_ARGS += --enable-languages=c,c++,fortran
CONFIGURE_ARGS += --with-gnu-as
CONFIGURE_ARGS += --with-as=$(bindir)/as
CONFIGURE_ARGS += --with-gnu-ld
CONFIGURE_ARGS += --with-ld=$(bindir)/ld
CONFIGURE_ARGS += --disable-libsanitizer
CONFIGURE_ARGS += --disable-multilib
CONFIGURE_ARGS += --with-zlib=$(BUILD_PREFIX)
CONFIGURE_ARGS += LDFLAGS_FOR_TARGET="-Wl,-R,$(BUILD_PREFIX)/lib"

# Keep GCC's internal static libs in OZSWgcc12
MERGE_EXCLUDE_STATICLIBS =

EXTRA_CC_FLAGS  = -fPIC
EXTRA_CXX_FLAGS = -fPIC

include gar/category.mk
