# $NetBSD: Makefile,v 1.9 2025/10/20 14:22:51 dkazankov Exp $

DISTNAME=	gcc-${PKGVERSION_NOREV}
PKGNAME=	gcc14-gnat-14.3.0
PKGREVISION=	3
CATEGORIES=	lang
MASTER_SITES=	${MASTER_SITE_GNU:=gcc/${DISTNAME}/}
EXTRACT_SUFX=	.tar.xz

MAINTAINER=	dkazankov@NetBSD.org
HOMEPAGE=	https://gcc.gnu.org/
COMMENT=	GNAT Compiler and Ada tools
LICENSE=	gnu-gpl-v2 AND gnu-gpl-v3 AND gnu-lgpl-v2 AND gnu-lgpl-v3

DISTFILES=	${DEFAULT_DISTFILES}

# The list is copy of one from gcc6-aux as it used as a bootstrapper
ONLY_FOR_PLATFORM=	DragonFly-*-x86_64   \
		FreeBSD-*-i386       \
		FreeBSD-*-x86_64     \
		SunOS-5.1[1-9]*-i386 \
		SunOS-5.1[1-9]*-x86_64 \
		NetBSD-*-i386   \
		NetBSD-*-x86_64

# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114065
BROKEN_ON_PLATFORM=	*-*-i386

CHECK_PIE_SUPPORTED=	no
CHECK_RELRO_SUPPORTED=	no

USE_LANGUAGES=		#empty
USE_TOOLS+=		gmake makeinfo sed perl
USE_TOOLS.NetBSD+=	gsed

INFO_FILES=		yes
GNU_CONFIGURE=		yes
GNU_CONFIGURE_STRICT=	no

.include "../../mk/bsd.prefs.mk"

UNLIMIT_RESOURCES+=	datasize
UNLIMIT_RESOURCES+=	stacksize

CHECK_PORTABILITY_SKIP+=	contrib/*
CHECK_PORTABILITY_SKIP+=	gcc/configure.orig_dist

USE_GCC_BOOTSTRAP=	no

# New bootstrapper works starting from 10.0 only - needs __sigaction_siginfo
.if ${OPSYS} == NetBSD && ${OPSYS_VERSION} >= 099982
BOOT_DISTNAME=		gcc-bootstrap-${MACHINE_GNU_PLATFORM}-10.5.0.tar.bz2
SITES.${BOOT_DISTNAME}=	${MASTER_SITE_BACKUP}

USE_GCC_BOOTSTRAP=	yes
.endif

.if ${USE_GCC_BOOTSTRAP:U:tl} == "yes"
DISTFILES+=	${BOOT_DISTNAME}
CC=		${WRKDIR}/gcc-bootstrap/bin/gcc
CXX=		${WRKDIR}/gcc-bootstrap/bin/g++
.else
TOOL_DEPENDS+=	gcc10-aux-[0-9]*:../../lang/gcc10-aux
CC=		${PREFIX}/gcc10-aux/bin/gcc
CXX=		${PREFIX}/gcc10-aux/bin/g++
.endif

## Build outside ${WRKSRC}
OBJDIR=			${WRKDIR}/build
CONFIGURE_DIRS=		${OBJDIR}
CONFIGURE_SCRIPT=	${WRKSRC}/configure
GNU_CONFIGURE_PREFIX=	${PREFIX}/${PKGBASE}

.include "options.mk"

# Use C preprocessed symbols on NetBSD (only)
.if ${OPSYS} == "NetBSD"
SUBST_CLASSES+=		patch1
SUBST_MESSAGE.patch1=	Replace nanosleep, gettimeofday in ${SUBST_FILES.patch1}
SUBST_STAGE.patch1=	pre-configure
SUBST_FILES.patch1=	gcc/ada/libgnat/s-osprim__posix.adb
SUBST_SED.patch1=	-e "s,\"nanosleep\",\"__gnat_nanosleep\","
SUBST_SED.patch1+=	-e "s,\"gettimeofday\",\"__gnat_gettimeofday\","

SUBST_CLASSES+=		patch2
SUBST_MESSAGE.patch2=	Replace select with __gnat_select in ${SUBST_FILES.patch2}
SUBST_STAGE.patch2=	pre-configure
SUBST_FILES.patch2=	gcc/ada/libgnat/g-socthi.ads
SUBST_SED.patch2=	-e "s,\"select\",\"__gnat_select\","

SUBST_CLASSES+=		patch3
SUBST_MESSAGE.patch3=	Replace socket with __gnat_socket in ${SUBST_FILES.patch3}
SUBST_STAGE.patch3=	pre-configure
SUBST_FILES.patch3=	gcc/ada/libgnat/g-socthi__bsd.adb
SUBST_SED.patch3=	-e "s,\"socket\",\"__gnat_socket\","
.endif

CONFIGURE_ARGS+=	--disable-libstdcxx-pch

.if ${MACHINE_PLATFORM:MDarwin-*-aarch64}
BUILDLINK_TRANSFORM+=	rm:-nodefaultrpaths
CONFIGURE_ARGS+=	--disable-darwin-at-rpath
.endif

# In some cases LINKER_RPATH_FLAG needs a trailing space.
LINKER_RPATH_FLAG:=	${LINKER_RPATH_FLAG:S/-rpath/& /}

## The Library rpath to use in end programs.
LDFLAGS_FOR_TARGET=	${COMPILER_RPATH_FLAG}${PREFIX}/${PKGBASE}/${MACHINE_GNU_PLATFORM}/lib
LDFLAGS_FOR_TARGET+=	${COMPILER_RPATH_FLAG}${PREFIX}/${PKGBASE}/lib
LDFLAGS_FOR_TARGET+=	${COMPILER_RPATH_FLAG}${PREFIX}/${PKGBASE}/lib/gcc/${MACHINE_GNU_PLATFORM}/${PKGVERSION_NOREV}/adalib
LDFLAGS_FOR_TARGET+=	${COMPILER_RPATH_FLAG}${PREFIX}/lib

# The "-static-libstdc++ -static-libgcc" flags are normally added to the
# boot-ldflags by configure but because we are supply the boot-ldflags
# we mash supply them.
BOOT_LDFLAGS=		-static-libstdc++ -static-libgcc
BOOT_LDFLAGS+=		${COMPILER_RPATH_FLAG}${PREFIX}/${PKGBASE}/lib
BOOT_LDFLAGS+=		${COMPILER_RPATH_FLAG}${PREFIX}/${PKGBASE}/lib/gcc/${MACHINE_GNU_PLATFORM}/${PKGVERSION_NOREV}/adalib

# Needed on Darwin when LDFLAGS point to a SDK
.if !empty(OSX_SDK_PATH)
BOOT_LDFLAGS+=	${LDFLAGS:M-Wl,-syslibroot*}
.endif

## For target librarys and libjava programs.
CONFIGURE_ENV+=		LDFLAGS_FOR_TARGET=${LDFLAGS_FOR_TARGET:Q}

# GCC does not understand this option; remove it, or stage build will fail
BUILDLINK_TRANSFORM+=	rm:-stdlib=libc++

# Disable fixincludes on SmartOS, header changes result in broken includes
# being generated, see https://github.com/joyent/pkgsrc-legacy/issues/270
.if ${OS_VARIANT} == "SmartOS"
SUBST_CLASSES+=		fixinc
SUBST_STAGE.fixinc=	pre-configure
SUBST_FILES.fixinc=	gcc/Makefile.in
SUBST_SED.fixinc=	-e "s,\./fixinc.sh,-c true,"
.endif

.if ${MACHINE_PLATFORM:MNetBSD-*-*}
# on NetBSD, use the native SSP code in libc
CONFIGURE_ARGS+=	--disable-libssp
# Match base libstdc++ major
SUBST_CLASSES+=		libstdc
SUBST_STAGE.libstdc=	pre-configure
SUBST_FILES.libstdc=	libstdc++-v3/configure
SUBST_MESSAGE.libstdc=	Bumping libstdc++ major to 7
SUBST_SED.libstdc=	-e 's,libtool_VERSION=6:,libtool_VERSION=7:,g'
.else
CONFIGURE_ARGS+=	--enable-libssp
.endif

.if ${USE_CROSS_COMPILE:U:tl} == "yes"
CONFIGURE_ENV+=	CC_FOR_BUILD=${NATIVE_CC:Q}
CONFIGURE_ENV+=	CXX_FOR_BUILD=${NATIVE_CXX:Q}
.endif

CONFIGURE_ARGS+=	--enable-languages=ada,c,c++
# This will create slightly slower compiler
CONFIGURE_ARGS+=	--enable-shared
CONFIGURE_ARGS+=	--enable-host-shared
CONFIGURE_ARGS+=	--enable-long-long
CONFIGURE_ARGS+=	--with-local-prefix=${PREFIX}/${PKGBASE}
CONFIGURE_ARGS+=	--with-gxx-include-dir='${PREFIX}/${PKGBASE}/include/c++'
CONFIGURE_ARGS+=	--enable-__cxa_atexit
CONFIGURE_ARGS+=	--enable-threads=posix
CONFIGURE_ARGS+=	--with-boot-ldflags=${BOOT_LDFLAGS:Q}
# causes build errors even when using lang/gcc14 to self host
CONFIGURE_ARGS.SunOS+=	--disable-libsanitizer
# multilib on Darwin requires fat-binaries
CONFIGURE_ARGS.Darwin+=	--disable-multilib
.if !empty(OSX_SDK_PATH)
CONFIGURE_ARGS.Darwin+=	--with-sysroot=${OSX_SDK_PATH}
.endif
CONFIGURE_ARGS.NetBSD+=	--with-gnu-ld --with-ld=/usr/bin/ld
CONFIGURE_ARGS.NetBSD+=	--with-gnu-as --with-as=/usr/bin/as
MAKE_ENV.NetBSD+=	ac_cv_func_clock_gettime=yes
MAKE_ENV.NetBSD+=	ac_cv_func_gethostbyname_r=no
MAKE_ENV.NetBSD+=	ac_cv_func_freelocale=no
MAKE_ENV.NetBSD+=	ac_cv_func_newlocale=no
MAKE_ENV.NetBSD+=	ac_cv_func_uselocale=no
MAKE_ENV.SunOS+=	ac_cv_func_mkostemp=no

.if !empty(PKGSRC_COMPILER:Mclang) || ${OPSYS} == "DragonFly"
CONFIGURE_ARGS+=	--disable-bootstrap
.endif

.if ${MACHINE_PLATFORM:MNetBSD-*-i386} || ${MACHINE_PLATFORM:MLinux-*-i386}
CONFIGURE_ARGS+=	--with-arch=i486 --with-tune=i486
.endif

.if ${MACHINE_PLATFORM:MNetBSD-*-x86_64} || ${MACHINE_PLATFORM:MLinux-*-x86_64}
CONFIGURE_ARGS+=	--with-arch=nocona --with-tune=nocona --with-fpmath=sse
.endif

.if ${MACHINE_PLATFORM:MDarwin-[0-8].*-*}
CONFIGURE_ARGS+=	--with-dwarf2
.endif

# ${WRKSRC}/fixincludes/ looks for sed and compiles the path to sed into
# a binary so we need to make sure we give it the installed sed and not
# the tool wrapped one.
MAKE_ENV+=		ac_cv_path_SED=${TOOLS_SED}
MAKE_ENV+=		lt_cv_path_SED=${TOOLS_SED}

# Determine whether to use binutils
.if ${OPSYS} == "SunOS"
.  if exists(/usr/sfw/bin/gobjdump)
CONFIGURE_ENV+=		OBJDUMP=/usr/sfw/bin/gobjdump
.  endif
.  if exists(/usr/bin/ld)
CONFIGURE_ARGS+=	--without-gnu-ld --with-ld=/usr/bin/ld
.  else
CONFIGURE_ARGS+=	--without-gnu-ld --with-ld=/usr/ccs/bin/ld
.  endif
.  if exists(/usr/sfw/bin/gas)
CONFIGURE_ARGS+=	--with-gnu-as --with-as=/usr/sfw/bin/gas
.  elif exists(/usr/ccs/bin/as)
CONFIGURE_ARGS+=	--without-gnu-as --with-as=/usr/ccs/bin/as
.  else
BUILDLINK_DEPMETHOD.binutils=	full
.    include "../../devel/binutils/buildlink3.mk"
CONFIGURE_ARGS+=	--with-gnu-as --with-as=${PREFIX}/bin/gas
.  endif
.endif

.if ${OPSYS} == "Linux"
# glibc limitations, needs at least -O1
FORTIFY_SUPPORTED=	no
.endif

.if ${OS_VARIANT} == "SmartOS"
SUBST_CLASSES+=		ccs
SUBST_STAGE.ccs=	pre-configure
SUBST_FILES.ccs=	contrib/make_sunver.pl
SUBST_SED.ccs=		-e 's,/usr/ccs/bin,/usr/bin,g'
.endif

# DO NOT REMOVE THIS SUBST.  If it fails, the corruption to
# patch-gcc_Makefile.in chronicled in PR pkg/58963 `gcc:
# LINK_LIBGCC_SPEC snafu' <https://gnats.NetBSD.org/58963> probably got
# replicated yet again.  You must make sure that LINK_LIBGCC_SPEC is
# appropriately set with @GCC_TARGET_MACHINE@ in patch-gcc_Makefile.in
# or similar, or confirm with a discussion on tech-pkg@ that it is no
# longer relevant before you remove this SUBST.
SUBST_CLASSES+=		vars
SUBST_MESSAGE.vars=	Setting target machine name path in ${SUBST_FILES.vars}
SUBST_STAGE.vars=	pre-configure
SUBST_FILES.vars=	gcc/Makefile.in
SUBST_VARS.vars=	GCC_TARGET_MACHINE

GCC_TARGET_MACHINE?=	${MACHINE_GNU_PLATFORM}
BUILD_DEFS+=		GCC_TARGET_MACHINE

CTF_FILES_SKIP+=	*/gengtype	# CPU limit exceeded

TEST_TARGET=	-j ${MAKE_JOBS} -k check || ${TRUE}
TEST_DEPENDS+=	dejagnu-[0-9]*:../../devel/dejagnu

pre-configure:
	${RUN} cd ${WRKSRC} && ${MKDIR} ${OBJDIR}

post-test:
	${RUN} cd ${WRKSRC} && cd ${OBJDIR} &&	\
	${SHELL} ${WRKSRC}/contrib/test_summary >${WRKDIR}/test_summary.log
	${INFO_MSG} "Test summary are available in ${WRKDIR}/test_summary.log"

post-install:
# Fix group write mode
	${CHMOD} g-w ${DESTDIR}${PREFIX}/${PKGBASE}/lib/gcc/${MACHINE_GNU_PLATFORM}/${PKGVERSION_NOREV}/adainclude/standard.ads.h
# Create old name that modern gnat no longer provides
	${TEST} -f ${DESTDIR}${PREFIX}/${PKGBASE}/bin/gnat && \
		( ${RUN} cd ${DESTDIR}${PREFIX}/${PKGBASE}/bin && ${LN} -f gnat ada )
.if ${MACHINE_PLATFORM:MSunOS-*-*86*} && ${OS_VERSION} != "5.11"
	${SH} files/values.c ${DESTDIR}${PREFIX}/${PKGBASE}/bin/gcc -m32 || ${TRUE}
	${SH} files/values.c ${DESTDIR}${PREFIX}/${PKGBASE}/bin/gcc -m64 || ${TRUE}
.endif

GENERATE_PLIST+= \
	cd ${DESTDIR}${PREFIX} && \
	${FIND} ${PKGBASE} \( -type f -or -type l \) -print | ${SORT};

CHECK_BUILTIN.zlib:= yes
.include "../../devel/zlib/builtin.mk"
CHECK_BUILTIN.zlib:= no
.if ${USE_BUILTIN.zlib:tl} == yes
CONFIGURE_ARGS+=	--with-system-zlib
.else
CONFIGURE_ARGS+=	--without-system-zlib
.endif

#.include "../../archivers/zstd/buildlink3.mk"
#CONFIGURE_ARGS+=	--with-zstd=${BUILDLINK_PREFIX.zstd}

.include "../../mk/dlopen.buildlink3.mk"
.include "../../mk/pthread.buildlink3.mk"

.include "../../mk/bsd.pkg.mk"

.if ${USE_GCC_BOOTSTRAP:U:tl} == "yes"
PREPEND_PATH+=	${WRKDIR}/gcc-bootstrap/bin
.else
PREPEND_PATH+=	${PREFIX}/gcc10-aux/bin
.endif

CFLAGS=		-O2
CPPFLAGS=	#empty
CXXFLAGS=	-O2
LDFLAGS=	-static-libstdc++ -static-libgcc
