Skip to content

Commit

Permalink
lang/gcc15-devel: Add port
Browse files Browse the repository at this point in the history
GCC, the GNU Compiler Collection, supports a number of languages.
This port installs the C, C++, and Fortran front ends as gcc15, g++15,
and gfortran15, respectively.

This is the first snapshot from trunk with the GCC 15 designation. It
largely is a copy of lang/gcc14-devel.
  • Loading branch information
lsalvadore committed Apr 29, 2024
1 parent 76cc0f4 commit 220cbe0
Show file tree
Hide file tree
Showing 15 changed files with 532 additions and 0 deletions.
1 change: 1 addition & 0 deletions lang/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
SUBDIR += gcc13
SUBDIR += gcc13-devel
SUBDIR += gcc14-devel
SUBDIR += gcc15-devel
SUBDIR += gcc48
SUBDIR += gcc6-aux
SUBDIR += gcc9
Expand Down
189 changes: 189 additions & 0 deletions lang/gcc15-devel/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
PORTNAME= gcc
PORTVERSION= 15.0.0.s20240428
CATEGORIES= lang
MASTER_SITES= GCC/snapshots/${DIST_VERSION}
PKGNAMESUFFIX= ${SUFFIX}-devel
DISTNAME= gcc-${DIST_VERSION}

MAINTAINER= salvadore@FreeBSD.org
COMMENT= GNU Compiler Collection 15
WWW= https://gcc.gnu.org

LICENSE= GPLv3 GPLv3RLE
LICENSE_COMB= multi

ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 powerpc powerpc64 powerpc64le

LIB_DEPENDS= libgmp.so:math/gmp \
libmpfr.so:math/mpfr \
libmpc.so:math/mpc
BUILD_DEPENDS+= ${LOCALBASE}/bin/as:devel/binutils
RUN_DEPENDS+= ${LOCALBASE}/bin/as:devel/binutils
.if defined(MAINTAINER_MODE)
BUILD_DEPENDS+= runtest:misc/dejagnu
.endif

USES= compiler:c++11-lang cpe gmake iconv libtool makeinfo perl5 tar:xz
USE_BINUTILS= yes
USE_PERL5= build

CPE_VENDOR= gnu
CPE_VERSION= ${GCC_VERSION}

# DIST_VERSION relates to downloads, GCC_VERSION and SUFFIX to names
# of executables and directories once installed. A PORTVERSION of
# Y.2.1.s20140817 results in values of Y-20140817, Y.2.1, and Y
# for these three.
DIST_VERSION= ${PORTVERSION:C/([0-9]+).*\.s([0-9]+)/\1-\2/}
GCC_VERSION= ${PORTVERSION:C/(.+)\.s[0-9]{8}/\1/}
SUFFIX= ${PORTVERSION:C/([0-9]+).*/\1/}
CFLAGS:= ${CFLAGS:N-mretpoline} -D__USE_ISOC11
CXXFLAGS:= ${CXXFLAGS:N-mretpoline}

OPTIONS_DEFINE= GRAPHITE
OPTIONS_DEFAULT_aarch64=STANDARD_BOOTSTRAP
OPTIONS_DEFAULT_amd64= STANDARD_BOOTSTRAP
OPTIONS_DEFAULT_i386= STANDARD_BOOTSTRAP
OPTIONS_DEFAULT_powerpc=LTO_BOOTSTRAP
OPTIONS_DEFAULT_powerpc64=LTO_BOOTSTRAP
OPTIONS_DEFAULT_powerpc64le=LTO_BOOTSTRAP
OPTIONS_SINGLE= BOOTSTRAP
OPTIONS_SINGLE_BOOTSTRAP= LTO_BOOTSTRAP STANDARD_BOOTSTRAP
LTO_BOOTSTRAP_DESC= Build using a full LTO bootstrap
STANDARD_BOOTSTRAP_DESC= Build using a full bootstrap without LTO
GRAPHITE_DESC= Support for Graphite loop optimizations

.if exists(/usr/lib32/libc.so)
OPTIONS_DEFINE_amd64+= MULTILIB
OPTIONS_DEFAULT_amd64+= MULTILIB
OPTIONS_DEFINE_powerpc64+= MULTILIB
#OPTIONS_DEFAULT_powerpc64+= MULTILIB # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105010
MULTILIB_DESC= Build support for 32-bit and 64-bit targets
MULTILIB_CONFIGURE_ENABLE= multilib
.else
CONFIGURE_ARGS+= --disable-multilib
.endif

.if defined(CPUTYPE) && ${CPUTYPE:Mg[3-5]}
CFLAGS:= ${CFLAGS:S/mcpu=g/mcpu=G/}
CXXFLAGS:= ${CFLAGS:S/mcpu=g/mcpu=G/}
.endif

.include <bsd.port.pre.mk>

.if ${ARCH} == amd64
CONFIGURE_TARGET= x86_64-portbld-${OPSYS:tl}${OSREL}

.elif ${ARCH} == powerpc64
CONFIGURE_ARGS+= --with-abi=elfv2
USE_GCC= yes

.elif ${ARCH} == powerpc64le
USE_GCC= yes
.endif

.if ${ARCH} == i386
LANGUAGES:= c,c++,objc,fortran
.else
LANGUAGES:= c,c++,objc,fortran,jit
.endif
TARGLIB= ${PREFIX}/lib/gcc${SUFFIX}
TARGLIB32= ${PREFIX}/lib32 # The version information is added later
LIBEXEC= ${PREFIX}/libexec/gcc${SUFFIX}
GNU_CONFIGURE= yes
GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
CONFIGURE_OUTSOURCE= yes
.if ${PORT_OPTIONS:MLTO_BOOTSTRAP}
CONFIGURE_ARGS+=--with-build-config=bootstrap-lto-noplugin
ALL_TARGET= bootstrap-lean
PIE_UNSAFE= yes
.else
CONFIGURE_ARGS+=--with-build-config=bootstrap-debug
ALL_TARGET= bootstrap-lean
PIE_UNSAFE= yes
.endif
INSTALL_TARGET= install-strip
.if ${UID} != 0
BINMODE= 755
.endif
CONFIGURE_ARGS+=--disable-nls \
--enable-gnu-indirect-function \
--enable-host-shared \
--enable-plugin \
--libdir=${TARGLIB} \
--libexecdir=${LIBEXEC} \
--program-suffix=${SUFFIX} \
--with-as=${LOCALBASE}/bin/as \
--with-gmp=${LOCALBASE} \
--with-gxx-include-dir=${TARGLIB}/include/c++/ \
--with-gxx-libcxx-include-dir=/usr/include/c++/v1 \
--with-ld=${LOCALBASE}/bin/ld \
${ICONV_CONFIGURE_ARG} \
--with-pkgversion="FreeBSD Ports Collection" \
--with-system-zlib \
--without-zstd
MAKE_ARGS+= MAKEINFOFLAGS="--no-split"
USE_LDCONFIG= ${TARGLIB}
PLIST_SUB+= GCC_VERSION=${GCC_VERSION} \
GNU_HOST=${CONFIGURE_TARGET} \
SUFFIX=${SUFFIX}
INFO= gcc${SUFFIX}/cpp \
gcc${SUFFIX}/cppinternals \
gcc${SUFFIX}/gcc \
gcc${SUFFIX}/gccinstall \
gcc${SUFFIX}/gccint \
gcc${SUFFIX}/gfortran \
gcc${SUFFIX}/libgccjit \
gcc${SUFFIX}/libgomp
.if ${ARCH} == amd64 || ${ARCH} == i386
INFO+= gcc${SUFFIX}/libquadmath
.endif
.if ${ARCH} == amd64 || ${ARCH} == i386 || ${ARCH} == aarch64
INFO+= gcc${SUFFIX}/libitm
.endif
SUB_FILES= pkg-message
SUB_LIST+= TARGLIB=${TARGLIB}

.if ${PORT_OPTIONS:MGRAPHITE}
LIB_DEPENDS+= libisl.so:devel/isl
CONFIGURE_ARGS+=--with-isl=${LOCALBASE}
.endif

CONFIGURE_ARGS+=--enable-languages=${LANGUAGES}

pre-everything::
@${ECHO_MSG} "Making GCC ${PORTVERSION} for ${CONFIGURE_TARGET} [${LANGUAGES}]"

pre-configure:
cd ${WRKSRC} ; contrib/gcc_update --touch
@${RM} ${WRKSRC}/gcc/*/*.info*

.if defined(MAINTAINER_MODE)
full-regression-test: build
cd ${TEST_WRKSRC}; ${MAKE_CMD} -sk check \
; ${WRKSRC}/contrib/test_summary
.endif

post-stage:
${RM} ${STAGEDIR}${PREFIX}/share/man/man7/*
${RM} -r ${STAGEDIR}${TARGLIB}/gcc/*/${GCC_VERSION}/include-fixed/
# Install ISO_Fortran_binding.h in an easily findable directory
${MKDIR} ${STAGEDIR}${PREFIX}/include/gcc${SUFFIX}
${INSTALL_DATA} ${STAGEDIR}${PREFIX}/lib/gcc${SUFFIX}/gcc/${CONFIGURE_TARGET}/${GCC_VERSION}/include/ISO_Fortran_binding.h \
${STAGEDIR}${PREFIX}/include/gcc${SUFFIX}
# Add target libraries and include files to packaging list.
${RM} ${WRKDIR}/PLIST.lib

.if (${ARCH} == amd64 || ${ARCH} == powerpc64) && ${PORT_OPTIONS:MMULTILIB}
${MKDIR} ${STAGEDIR}${TARGLIB32}
${MV} ${STAGEDIR}${PREFIX}/lib/lib32 ${STAGEDIR}${TARGLIB32}/gcc${SUFFIX}
.endif

.for d in ${TARGLIB:S/^${PREFIX}\///} ${TARGLIB32:S/^${PREFIX}\///} ${LIBEXEC:S/^${PREFIX}\///}
cd ${STAGEDIR}${PREFIX} ; if [ -d $d ]; then \
${FIND} $d -type f -o -type l >>${WRKDIR}/PLIST.lib ;\
fi
.endfor
cd ${WRKDIR} ; ${SED} -i -e "/PLIST.lib/ r PLIST.lib" ${TMPPLIST}

.include <bsd.port.post.mk>
3 changes: 3 additions & 0 deletions lang/gcc15-devel/distinfo
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
TIMESTAMP = 1714396941
SHA256 (gcc-15-20240428.tar.xz) = e31cdd424a22d132bbe66bb1a2d061033e5e5d5b62d82a1cd3e0711665b87f26
SIZE (gcc-15-20240428.tar.xz) = 87999896
106 changes: 106 additions & 0 deletions lang/gcc15-devel/files/patch-arm-unwind-cxx-support
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
--- UTC
Index: gcc/ginclude/unwind-arm-common.h
===================================================================
--- gcc/ginclude/unwind-arm-common.h (revision 219113)
+++ gcc/ginclude/unwind-arm-common.h (working copy)
@@ -82,7 +82,11 @@

struct _Unwind_Control_Block
{
+#ifdef __FreeBSD__
+ unsigned exception_class __attribute__((__mode__(__DI__)));
+#else
char exception_class[8];
+#endif
void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *);
/* Unwinder cache, private fields for the unwinder's use */
struct
@@ -181,7 +185,11 @@

/* Support functions for the PR. */
#define _Unwind_Exception _Unwind_Control_Block
+#ifdef __FreeBSD__
+ typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__)));
+#else
typedef char _Unwind_Exception_Class[8];
+#endif

void * _Unwind_GetLanguageSpecificData (_Unwind_Context *);
_Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *);
Index: libstdc++-v3/libsupc++/unwind-cxx.h
===================================================================
--- libstdc++-v3/libsupc++/unwind-cxx.h (revision 219147)
+++ libstdc++-v3/libsupc++/unwind-cxx.h (working copy)
@@ -235,7 +235,7 @@
return reinterpret_cast<__cxa_dependent_exception *>(exc + 1) - 1;
}

-#ifdef __ARM_EABI_UNWINDER__
+#if defined(__ARM_EABI_UNWINDER__) && !defined(__FreeBSD__)
static inline bool
__is_gxx_exception_class(_Unwind_Exception_Class c)
{
@@ -309,13 +309,7 @@
c[6] = 'R';
c[7] = '\0';
}
-
-static inline void*
-__gxx_caught_object(_Unwind_Exception* eo)
-{
- return (void*)eo->barrier_cache.bitpattern[0];
-}
-#else // !__ARM_EABI_UNWINDER__
+#else // !__ARM_EABI_UNWINDER__ || __FreeBSD__
// This is the primary exception class we report -- "GNUCC++\0".
const _Unwind_Exception_Class __gxx_primary_exception_class
= ((((((((_Unwind_Exception_Class) 'G'
@@ -339,6 +333,16 @@
<< 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '\x01');

+const _Unwind_Exception_Class __gxx_forced_unwind_class
+= ((((((((_Unwind_Exception_Class) 'G'
+ << 8 | (_Unwind_Exception_Class) 'N')
+ << 8 | (_Unwind_Exception_Class) 'U')
+ << 8 | (_Unwind_Exception_Class) 'C')
+ << 8 | (_Unwind_Exception_Class) 'F')
+ << 8 | (_Unwind_Exception_Class) 'O')
+ << 8 | (_Unwind_Exception_Class) 'R')
+ << 8 | (_Unwind_Exception_Class) '\0');
+
static inline bool
__is_gxx_exception_class(_Unwind_Exception_Class c)
{
@@ -346,6 +350,12 @@
|| c == __gxx_dependent_exception_class;
}

+static inline bool
+__is_gxx_forced_unwind_class(_Unwind_Exception_Class c)
+{
+ return c == __gxx_forced_unwind_class;
+}
+
// Only checks for primary or dependent, but not that it is a C++ exception at
// all.
static inline bool
@@ -357,7 +367,18 @@
#define __GXX_INIT_PRIMARY_EXCEPTION_CLASS(c) c = __gxx_primary_exception_class
#define __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(c) \
c = __gxx_dependent_exception_class
+#define __GXX_INIT_FORCED_UNWIND_CLASS(c) c = __gxx_forced_unwind_class
+#endif // __ARM_EABI_UNWINDER__ && !__FreeBSD__

+#ifdef __ARM_EABI_UNWINDER__
+static inline void*
+__gxx_caught_object(_Unwind_Exception* eo)
+{
+ return (void*)eo->barrier_cache.bitpattern[0];
+}
+
+#else // !__ARM_EABI_UNWINDER__
+
// GNU C++ personality routine, Version 0.
extern "C" _Unwind_Reason_Code __gxx_personality_v0
(int, _Unwind_Action, _Unwind_Exception_Class,
19 changes: 19 additions & 0 deletions lang/gcc15-devel/files/patch-gcc_Makefile.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
--- gcc/Makefile.in.orig 2024-02-25 22:32:27 UTC
+++ gcc/Makefile.in
@@ -671,6 +671,8 @@ libsubdir = $(libdir)/gcc/$(real_target_noncanonical)/

# Directory in which the compiler finds libraries etc.
libsubdir = $(libdir)/gcc/$(real_target_noncanonical)/$(version)$(accel_dir_suffix)
+# Directory in which the compiler finds headers.
+libsubincludedir = $(libdir)/gcc/$(target_alias)/$(version)/include
# Directory in which the compiler finds executables
libexecsubdir = $(libexecdir)/gcc/$(real_target_noncanonical)/$(version)$(accel_dir_suffix)
# Directory in which all plugin resources are installed
@@ -3821,6 +3823,7 @@ installdirs:
# $(libdir)/gcc/include isn't currently searched by cpp.
installdirs:
$(mkinstalldirs) $(DESTDIR)$(libsubdir)
+ $(mkinstalldirs) $(DESTDIR)$(libsubincludedir)
$(mkinstalldirs) $(DESTDIR)$(libexecsubdir)
$(mkinstalldirs) $(DESTDIR)$(bindir)
$(mkinstalldirs) $(DESTDIR)$(includedir)
22 changes: 22 additions & 0 deletions lang/gcc15-devel/files/patch-gcc_configure
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
Enable support for .init_array and .fini_array, which FreeBSD supports
since commit 83aa9cc00c2d83d05a0efe7a1496d8aab4a153bb in the src
repository.

There __FreeBSD_version is 1000009, so we start enabling the support
from __FreeBSD_version == 1000010.
--- gcc/configure.orig 2023-05-11 22:33:34 UTC
+++ gcc/configure
@@ -24214,6 +24214,13 @@ EOF
#else
# if defined __sun__ && defined __svr4__
/* Solaris ld.so.1 supports .init_array/.fini_array since Solaris 8. */
+# elif defined __FreeBSD__
+# include <sys/param.h>
+# if __FreeBSD_version >= 1000010
+ /* FreeBSD supports .init_array/.fini_array since FreeBSD 10. */
+# else
+# error The C library not known to support .init_array/.fini_array
+# endif
# else
# error The C library not known to support .init_array/.fini_array
# endif
14 changes: 14 additions & 0 deletions lang/gcc15-devel/files/patch-gcc_jit_Make-lang.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
--- gcc/jit/Make-lang.in.orig 2024-02-25 22:32:31 UTC
+++ gcc/jit/Make-lang.in
@@ -360,9 +360,9 @@ jit.install-headers: installdirs
# Install hooks:
jit.install-headers: installdirs
$(INSTALL_DATA) $(srcdir)/jit/libgccjit.h \
- $(DESTDIR)$(includedir)/libgccjit.h
+ $(DESTDIR)$(libsubincludedir)/libgccjit.h
$(INSTALL_DATA) $(srcdir)/jit/libgccjit++.h \
- $(DESTDIR)$(includedir)/libgccjit++.h
+ $(DESTDIR)$(libsubincludedir)/libgccjit++.h

ifneq (,$(findstring mingw,$(target)))
jit.install-common: installdirs jit.install-headers

0 comments on commit 220cbe0

Please sign in to comment.