PORTNAME=	deno
DISTVERSIONPREFIX=	v
DISTVERSION=	2.9.1
PORTREVISION=	2
CATEGORIES=	www

MAINTAINER=	ports@FreeBSD.org
COMMENT=	Secure JavaScript and TypeScript runtime
WWW=		https://deno.com/runtime

LICENSE=	MIT
LICENSE_FILE=	${WRKSRC}/LICENSE.md

BROKEN_i386=	cargo:warning=c/freebsd.c:31:10: error: conflicting types for 'get_cpu_speed'

BUILD_DEPENDS=	bindgen:devel/rust-bindgen-cli \
		gn:devel/gn \
		protoc:devel/protobuf
LIB_DEPENDS=	libdbus-1.so:devel/dbus \
		liblcms2.so:graphics/lcms2 \
		libzstd.so:archivers/zstd

USES=		cargo cpe gmake llvm:min=21,build ninja:build pkgconfig python:build
USE_GITHUB=	yes
GH_ACCOUNT=	denoland
GH_TUPLE=	denoland:deno_lsp_benchdata:a787434:denolsp/tests/bench/testdata/lsp_benchdata \
		denoland:node_test:195065d:nodetest/tests/node_compat/runner/suite \
		denoland:std:9c5b710:denostd/tests/util/std \
		web-platform-tests:wpt:d85e753e65ee8e9654e76a2b4d62b9b5a0ac51e7:webp/tests/wpt/suite
USE_LDCONFIG=	yes

CARGO_INSTALL=	no
CARGO_ENV+=	V8_FROM_SOURCE=1 \
		GN=${PREFIX}/bin/gn \
		NINJA=${NINJA_CMD} \
		CLANG_BASE_PATH=/usr \
		LCMS2_INCLUDE_DIR="${LOCALBASE}/include" \
		LCMS2_LIB_DIR="${LOCALBASE}/lib" \
		CARGO_PROFILE_RELEASE_LTO="false" \
		GN_ARGS="clang_use_chrome_plugins=false \
		extra_cppflags=\"-idirafter ${LOCALBASE}/include\" \
		extra_ldflags=\"-L${LOCALBASE}/lib\" \
		fatal_linker_warnings=false \
		is_clang=true \
		use_custom_libcxx=true \
		use_custom_libunwind=true \
		use_libcxx_modules=false \
		use_udev=true \
		use_sysroot=false \
		use_glib=false \
		v8_enable_cet_ibt=true"

WITHOUT_LTO=	yes

BINARY_ALIAS=	python3=${PYTHON_CMD}

PLIST_FILES=	bin/${PORTNAME} \
		bin/denort \
		lib/libdenort.so

DENO_CORE_ICUDATA_V=	0.77.0
V8_CARGO_V=		149.4.0

V8_DISTDIR=	${CARGO_VENDOR_DIR}/v8-${V8_CARGO_V}
V8_BPGO_DIR=	${V8_DISTDIR}/v8/tools/builtins-pgo

post-patch:
	${REINPLACE_CMD} "s|%%PREFIX%%|${PREFIX}|g" \
		${WRKSRC}/cli/task_runner.rs \
		${WRKSRC}/ext/os/lib.rs
	${REINPLACE_CMD} "s|%%LOCALBASE%%|${LOCALBASE}|g" \
		${WRKSRC}/tests/unit_node/process_test.ts
	${REINPLACE_CMD} "s|%%LLVM_PREFIX%%|${LLVM_PREFIX}|g" \
		${WRKSRC}/cargo-crates/v8-${V8_CARGO_V}/build/toolchain/gcc_toolchain.gni
	${REINPLACE_CMD} "s|linux|freebsd|g" \
		${WRKSRC}/tests/ffi/testdata/ffi_callback_errors.ts \
		${WRKSRC}/tests/ffi/testdata/test.js \
		${WRKSRC}/tests/ffi/testdata/bench.js \
		${WRKSRC}/tests/ffi/testdata/event_loop_integration.ts \
		${WRKSRC}/tests/ffi/testdata/thread_safe_test_worker.js \
		${WRKSRC}/tests/ffi/testdata/thread_safe_test.js \
		${WRKSRC}/tests/integration/cache_tests.rs \
		${WRKSRC}/tests/napi/common.js \
		${WRKSRC}/tests/unit/build_test.ts \
		${WRKSRC}/tests/unit/dir_test.ts \
		${WRKSRC}/tests/specs/mod.rs

	${MKDIR} ${V8_BPGO_DIR}/arm64.profile ${V8_BPGO_DIR}/x64.profile

	${CP} ${WRKSRC}/ext/napi/generated_symbol_exports_list_linux.def \
		${WRKSRC}/ext/napi/generated_symbol_exports_list_freebsd.def

	${MKDIR} ${V8_DISTDIR}/third_party/icu/common
	${CP} ${CARGO_VENDOR_DIR}/deno_core_icudata-${DENO_CORE_ICUDATA_V}/src/icudtl.dat \
		${V8_DISTDIR}/third_party/icu/common/

do-install:
	${INSTALL_PROGRAM} \
		${CARGO_TARGET_DIR}/*/deno \
		${CARGO_TARGET_DIR}/*/denort ${STAGEDIR}${PREFIX}/bin
	${INSTALL_LIB} ${CARGO_TARGET_DIR}/*/libdenort.so ${STAGEDIR}${PREFIX}/lib

# do not pass RUST_BACKTRACE=1 to cargo test as some tests fails if it's there
do-test:
	(cd ${WRKSRC} && \
		${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${CARGO_ENV:S/RUST_BACKTRACE=1//g} \
			${CARGO} test -vv ${CARGO_BUILD_ARGS})

.include <bsd.port.mk>
