# $NetBSD: Makefile,v 1.166 2025/04/17 22:03:48 wiz Exp $

DISTNAME=	icu4c-77_1-src
PKGNAME=	${DISTNAME:S/4c//:S/-src//:S/_/./g}
CATEGORIES=	textproc
MASTER_SITES=	${MASTER_SITE_GITHUB:=unicode-org/}
GITHUB_PROJECT=	icu
GITHUB_RELEASE=	release-77-1
EXTRACT_SUFX=	.tgz

MAINTAINER=	pkgsrc-users@NetBSD.org
HOMEPAGE=	https://icu.unicode.org/
COMMENT=	Robust and full-featured Unicode services
LICENSE=	unicode-v3 AND modified-bsd AND mit

POLICY_UPDATE_LIMITED=	abi

WRKSRC=			${WRKDIR}/icu/source
USE_LANGUAGES=		c c++
USE_CC_FEATURES=	c11
USE_CXX_FEATURES=	c++17
USE_TOOLS+=		gmake pkg-config
TEST_TARGET=		check
UNLIMIT_RESOURCES+=	datasize
GNU_CONFIGURE=		yes
CONFIGURE_ARGS+=	--enable-static
CONFIGURE_ENV+=		U_MAKE=${TOOLS_GMAKE}
# Avoid Python; not really needed for build.
# Fixes circular dependency on Python and Sqlite3 with ICU.
CONFIGURE_ENV+=		ac_cv_prog_PYTHON=""

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

.if ${USE_CROSS_COMPILE:tl} == "yes"

TOOL_DEPENDS+=		${PKGNAME}:../../${PKGPATH}

ICU_CROSS_DIR=		${WRKDIR}/.icu_cross
ICU_CROSS_COOKIE=	${ICU_CROSS_DIR}/.cookie

CONFIGURE_ARGS+=	--with-cross-build=${ICU_CROSS_DIR}
pre-configure: ${ICU_CROSS_COOKIE}

ICU_CROSS_TOOLS=	\
	${HOST_PKG_INFO} -qL ${PKGNAME} \
	| ${GREP} -e '^'${TOOLBASE}/bin -e '^'${TOOLBASE}/sbin

show-icu-cross-tools: .PHONY
	@${ICU_CROSS_TOOLS}

icu-cross-clean: .PHONY
	${RUN}${RM} -f ${ICU_CROSS_COOKIE}
icu-cross-tools: .PHONY ${ICU_CROSS_COOKIE}
${ICU_CROSS_COOKIE}:
	@${STEP_MSG} Faking ICU cross-build directory
	${RUN}${TEST} -d ${ICU_CROSS_DIR} || ${MKDIR} ${ICU_CROSS_DIR}
.  for d in bin config lib
	${RUN}${TEST} -d ${ICU_CROSS_DIR}/${d} || \
		${MKDIR} ${ICU_CROSS_DIR}/${d}
.  endfor
	${RUN}cd ${ICU_CROSS_DIR} && ${ICU_CROSS_TOOLS} \
	| while read f; do \
		${LN} -sfn "$$f" bin/; \
	done
	${RUN} {							\
		${ECHO} CROSS_ICU_VERSION=${PKGREVISION_NOREV};		\
		${ECHO} TOOLEXEEXT=;					\
		${ECHO} TOOLBINDIR='$$(cross_buildroot)/bin';		\
		${ECHO} TOOLLIBDIR='$$(cross_buildroot)/lib';		\
		${ECHO} INVOKE=;					\
		${ECHO} PKGDATA_INVOKE=;				\
	} >${ICU_CROSS_DIR}/config/icucross.mk
	${RUN}${ECHO} ${:UCURR_FULL_DIR?=$$(shell pwd | sed 's/ /\\ /g'):Q} \
		>${ICU_CROSS_DIR}/config/icucross.inc
	${RUN}${ECHO} > ${.TARGET}

.endif

CHECK_SSP_SKIP=		lib/libicudata.so*

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

.if defined(PTHREAD_TYPE) && ${PTHREAD_TYPE} != "native"
CONFIGURE_ARGS+=	--disable-threads
.endif

.include "../../mk/compiler.mk"

# from ICU_CHECK_MH_FRAG in source/acinclude.m4
.if ${OPSYS} == "SunOS"
.  if ${PKGSRC_COMPILER:Mclang} || ${PKGSRC_COMPILER:Mgcc}
PLIST_SUBST+=		MH_NAME=mh-solaris-gcc
.  else
PLIST_SUBST+=		MH_NAME=mh-solaris
.  endif
.  if ${CC_VERSION:Mgcc-4.[6-9].*}
BUILDLINK_TRANSFORM+=	rm:-D__STDC__=0
.  endif
BUILDLINK_TRANSFORM+=	rm:-ansi
.elif ${MACHINE_PLATFORM:MLinux-*-alpha}
.  if ${CC_VERSION:Mgcc*}
PLIST_SUBST+=		MH_NAME=mh-alpha-linux-gcc
.  else
PLIST_SUBST+=		MH_NAME=mh-alpha-linux-cc
.  endif
.elif ${MACHINE_PLATFORM:MLinux-*-powerpc*}
.  if ${CC_VERSION:Mgcc*}
PLIST_SUBST+=		MH_NAME=mh-linux
.  else
PLIST_SUBST+=		MH_NAME=mh-linux-va
.  endif
.elif ${OPSYS} == "Linux"
PLIST_SUBST+=		MH_NAME=mh-linux
.elif ${OPSYS} == "Cygwin"
PLIST_SUBST+=		MH_NAME=mh-cygwin
.elif ${OPSYS:M*BSD*} || ${OPSYS} == "DragonFly"
PLIST_SUBST+=		MH_NAME=mh-bsd-gcc
.elif ${OPSYS} == "AIX"
.  if ${CC_VERSION:Mgcc*}
PLIST_SUBST+=		MH_NAME=mh-aix-gcc
.  else
PLIST_SUBST+=		MH_NAME=mh-aix-va
.  endif
.elif ${OPSYS} == "HPUX"
.  if ${CC_VERSION:Mgcc*}
PLIST_SUBST+=		MH_NAME=mh-hpux-gcc
.  else
PLIST_SUBST+=		MH_NAME=mh-hpux-acc
.  endif
.elif ${OPSYS} == "Darwin"
PLIST_SUBST+=		MH_NAME=mh-darwin
.elif ${OPSYS} == "Haiku"
PLIST_SUBST+=		MH_NAME=mh-haiku
.elif ${OPSYS} == "IRIX"
PLIST_SUBST+=		MH_NAME=mh-irix
.elif ${OPSYS} == "Cygwin"
PLIST_SUBST+=		MH_NAME=mh-cygwin
.elif ${OS_VARIANT} == "SCOOSR5"
PLIST_SUBST+=		MH_NAME=mh-scoosr5
.elif ${OPSYS} == "OSF1"
PLIST_SUBST+=		MH_NAME=mh-alpha-osf
.elif ${OPSYS} == "QNX"
PLIST_SUBST+=		MH_NAME=mh-qnx
.else
# For unknown systems, set the filename to mh-unknown so that the user
# gets a warning about missing files.
PLIST_SUBST+=		MH_NAME=mh-unknown
.endif

PKGCONFIG_OVERRIDE+=		config/icu*.pc
PKGCONFIG_OVERRIDE_STAGE=	post-build

REPLACE_SH=	config/icu-config-top

# work around ICU-20533 (build failure on big endian machines)
post-configure:
	${MKDIR} ${WRKSRC}/data/out

.if ${OPSYS} == "Cygwin"
INSTALL_UNSTRIPPED=	yes
SO_MAJOR=		${PKGVERSION_NOREV:R}
.  for l in data i18n io le lx test tu uc
GENERATE_PLIST+=	${ECHO} bin/cygicu${l}${SO_MAJOR}.dll;
GENERATE_PLIST+=	${ECHO} lib/libicu${l}${SO_MAJOR}.dll.a;
.  endfor

post-install:
	mv ${DESTDIR}${PREFIX}/lib/cygicu*.dll ${DESTDIR}${PREFIX}/bin/
.  for l in data i18n io le lx test tu uc
	${LN} -s libicu${l}${SO_MAJOR}.dll.a ${DESTDIR}${PREFIX}/lib/libicu${l}.dll.a
.  endfor

SUBST_CLASSES+=		icu-config
SUBST_STAGE.icu-config=	post-install
SUBST_FILES.icu-config=	${DESTDIR}${PREFIX}/bin/icu-config
SUBST_SED.icu-config+=	-e '/^ICUUC_FILE=/ s/libdir/bindir/'
SUBST_SED.icu-config+=	-e 's/l$${LIBICU}/l$${ICUPREFIX}/g'
SUBST_SED.icu-config+=	-e '/l$${ICUPREFIX}/ s/$${ICULIBSUFFIX_VERSION}//g'
.endif

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