1PORTNAME=	gcc
2PORTVERSION=	14.2.0
3PORTREVISION=	1
4CATEGORIES=	lang
5MASTER_SITES=	GCC
6PKGNAMESUFFIX=	${SUFFIX}
7
8MAINTAINER=	ports@MidnightBSD.org
9COMMENT=	GNU Compiler Collection 14
10WWW=		https://gcc.gnu.org
11
12LICENSE=	gpl3
13
14ONLY_FOR_ARCHS=	aarch64 amd64 armv6 armv7 i386 powerpc powerpc64 powerpc64le riscv64
15
16LIB_DEPENDS=	libgmp.so:math/gmp \
17		libmpfr.so:math/mpfr \
18		libmpc.so:math/mpc
19BUILD_DEPENDS+=	${LOCALBASE}/bin/as:devel/binutils
20RUN_DEPENDS+=	${LOCALBASE}/bin/as:devel/binutils
21.if defined(MAINTAINER_MODE)
22BUILD_DEPENDS+=	runtest:misc/dejagnu
23.endif
24
25USES=		compiler:c++11-lang cpe gmake iconv libtool makeinfo perl5 tar:xz
26USE_BINUTILS=	yes
27USE_PERL5=	build
28
29CONFLICTS=	gcc14-devel
30
31CPE_VENDOR=	gnu
32CPE_VERSION=	${GCC_VERSION}
33
34GCC_VERSION=	${PORTVERSION}
35SUFFIX=		${PORTVERSION:C/([0-9]+).*/\1/}
36CFLAGS:=	${CFLAGS:N-mretpoline} -D__USE_ISOC11
37CXXFLAGS:=	${CXXFLAGS:N-mretpoline}
38
39OPTIONS_DEFINE=		GRAPHITE
40OPTIONS_DEFAULT_aarch64=STANDARD_BOOTSTRAP
41OPTIONS_DEFAULT_amd64=	STANDARD_BOOTSTRAP
42OPTIONS_DEFAULT_i386=	STANDARD_BOOTSTRAP
43OPTIONS_DEFAULT_powerpc64=LTO_BOOTSTRAP
44OPTIONS_DEFAULT_powerpc64le=LTO_BOOTSTRAP
45OPTIONS_RADIO=	BOOTSTRAP
46OPTIONS_RADIO_BOOTSTRAP=	LTO_BOOTSTRAP STANDARD_BOOTSTRAP
47LTO_BOOTSTRAP_DESC=	Build using a full LTO bootstrap
48STANDARD_BOOTSTRAP_DESC=	Build using a full bootstrap without LTO
49GRAPHITE_DESC=		Support for Graphite loop optimizations
50
51.if exists(/usr/lib32/libc.so)
52OPTIONS_DEFINE_amd64+=		MULTILIB
53OPTIONS_DEFAULT_amd64+=	MULTILIB
54OPTIONS_DEFINE_powerpc64+=	MULTILIB
55#OPTIONS_DEFAULT_powerpc64+=	MULTILIB # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105010
56MULTILIB_DESC=		Build support for 32-bit and 64-bit targets
57MULTILIB_CONFIGURE_ENABLE=	multilib
58.else
59CONFIGURE_ARGS+=	--disable-multilib
60.endif
61
62.if defined(CPUTYPE) && ${CPUTYPE:Mg[3-5]}
63CFLAGS:=	${CFLAGS:S/mcpu=g/mcpu=G/}
64CXXFLAGS:=	${CFLAGS:S/mcpu=g/mcpu=G/}
65.endif
66
67.include <bsd.port.pre.mk>
68
69.if ${ARCH} == amd64
70ARCH_64=
71CONFIGURE_TARGET=       x86_64-portbld-freebsd12.4
72.else
73ARCH_64=@comment
74CONFIGURE_TARGET=       ${ARCH}-portbld-freebsd12.4
75.endif
76
77LANGUAGES:=	c,c++,objc,fortran,jit
78TARGLIB=	${PREFIX}/lib/gcc${SUFFIX}
79TARGLIB32=	${PREFIX}/lib32	# The version information is added later
80LIBEXEC=	${PREFIX}/libexec/gcc${SUFFIX}
81GNU_CONFIGURE=	yes
82GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
83CONFIGURE_OUTSOURCE=	yes
84.if empty(PORT_OPTIONS:M*BOOTSTRAP)
85CONFIGURE_ARGS+=--disable-bootstrap
86.elif ${PORT_OPTIONS:MLTO_BOOTSTRAP}
87CONFIGURE_ARGS+=--with-build-config=bootstrap-lto-noplugin
88ALL_TARGET=	bootstrap-lean
89PIE_UNSAFE=	yes
90.else
91CONFIGURE_ARGS+=--with-build-config=bootstrap-debug
92ALL_TARGET=	bootstrap-lean
93PIE_UNSAFE=	yes
94.endif
95INSTALL_TARGET=	install-strip
96.if ${UID} != 0
97BINMODE=	755
98.endif
99CONFIGURE_ARGS+=--disable-nls \
100		--disable-libssp \
101		--enable-gnu-indirect-function \
102		--enable-host-shared \
103		--enable-plugin \
104		--libdir=${TARGLIB} \
105		--libexecdir=${LIBEXEC} \
106		--program-suffix=${SUFFIX} \
107		--with-as=${LOCALBASE}/bin/as \
108		--with-gmp=${LOCALBASE} \
109		--with-gxx-include-dir=${TARGLIB}/include/c++/ \
110		--with-gxx-libcxx-include-dir=/usr/include/c++/v1 \
111		--with-ld=${LOCALBASE}/bin/ld \
112		${ICONV_CONFIGURE_ARG} \
113		--with-pkgversion="MidnightBSD Ports Collection" \
114		--with-system-zlib \
115		--without-zstd
116MAKE_ARGS+=	MAKEINFOFLAGS="--no-split"
117USE_LDCONFIG=	${TARGLIB}
118PLIST_SUB+=	GCC_VERSION=${GCC_VERSION} \
119		GNU_HOST=${CONFIGURE_TARGET} \
120		SUFFIX=${SUFFIX} \
121		ARCH_64=${ARCH_64}
122INFO=		gcc${SUFFIX}/cpp \
123		gcc${SUFFIX}/cppinternals \
124		gcc${SUFFIX}/gcc \
125		gcc${SUFFIX}/gccinstall \
126		gcc${SUFFIX}/gccint \
127		gcc${SUFFIX}/gfortran \
128		gcc${SUFFIX}/libgccjit \
129		gcc${SUFFIX}/libgomp
130# Release tarballs (as opposed to snapshots) always carry this.
131INFO+=		gcc${SUFFIX}/libquadmath \
132		gcc${SUFFIX}/libitm
133SUB_FILES=	pkg-message
134SUB_LIST+=	TARGLIB=${TARGLIB}
135
136.if ${PORT_OPTIONS:MGRAPHITE}
137LIB_DEPENDS+=	libisl.so:devel/isl
138CONFIGURE_ARGS+=--with-isl=${LOCALBASE}
139.endif
140
141CONFIGURE_ARGS+=--enable-languages=${LANGUAGES}
142
143pre-everything::
144	@${ECHO_MSG} "Making GCC ${PORTVERSION} for ${CONFIGURE_TARGET} [${LANGUAGES}]"
145
146pre-configure:
147	cd ${WRKSRC} ; contrib/gcc_update --touch
148	@${RM} ${WRKSRC}/gcc/*/*.info*
149
150.if defined(MAINTAINER_MODE)
151full-regression-test: build
152	cd ${TEST_WRKSRC}; ${MAKE_CMD} -sk check \
153	; ${WRKSRC}/contrib/test_summary
154.endif
155
156post-fake:
157	${RM} ${FAKE_DESTDIR}${PREFIX}/share/man/man7/*
158	${RM} -r ${FAKE_DESTDIR}${TARGLIB}/gcc/*/${GCC_VERSION}/include-fixed/
159	# Install ISO_Fortran_binding.h in an easily findable directory
160	${MKDIR} ${FAKE_DESTDIR}${PREFIX}/include/gcc${SUFFIX}
161	${INSTALL_DATA} ${FAKE_DESTDIR}${PREFIX}/lib/gcc${SUFFIX}/gcc/${CONFIGURE_TARGET}/${GCC_VERSION}/include/ISO_Fortran_binding.h	\
162		${FAKE_DESTDIR}${PREFIX}/include/gcc${SUFFIX}
163	# Add target libraries and include files to packaging list.
164	-${RM} ${WRKDIR}/PLIST.lib
165
166.if (${ARCH} == amd64 || ${ARCH} == powerpc64) && ${PORT_OPTIONS:MMULTILIB}
167	${MKDIR} ${FAKE_DESTDIR}${TARGLIB32}
168	${MV} ${FAKE_DESTDIR}${PREFIX}/lib/lib32 ${FAKE_DESTDIR}${TARGLIB32}/gcc${SUFFIX}
169.endif
170
171.for d in ${TARGLIB:S/^${PREFIX}\///} ${TARGLIB32:S/^${PREFIX}\///} ${LIBEXEC:S/^${PREFIX}\///}
172	cd ${FAKE_DESTDIR}${TRUE_PREFIX} ; if [ -d $d ]; then \
173	    ${FIND} $d -type f -o -type l >>${WRKDIR}/PLIST.lib ;\
174	fi
175.endfor
176	cd ${WRKDIR} ; ${SED} -i -e "/PLIST.lib/ r PLIST.lib" ${TMPPLIST}
177
178.include <bsd.port.post.mk>
179