summaryrefslogtreecommitdiff
blob: 9c2ab92a0fe81d782efb822b796014be88dc7bc4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# Copyright 2020-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

CMAKE_MAKEFILE_GENERATOR=emake  # keep dependencies down

inherit cmake

DESCRIPTION="Darwin Xtools matching Xcode Tools ${PN}"
HOMEPAGE="https://github.com/iains/darwin-xtools"
SRC_URI="https://github.com/grobian/darwin-xtools/archive/gentoo-${PVR}.tar.gz -> darwin-xtools-${PVR}.tar.gz"

LICENSE="APSL-2"
SLOT="8"
KEYWORDS="~arm64-macos ~ppc-macos ~x64-macos"

# xtools uses c++11 features, not available in gcc-apple, hence gcc/clang dep
DEPEND="sys-devel/binutils-config
	|| ( sys-devel/gcc:* sys-devel/clang:* )
	app-arch/xar
	dev-libs/libyaml"
RDEPEND="${DEPEND}"
BDEPEND=""

S="${WORKDIR}/darwin-xtools-gentoo-${PVR}"

src_prepare() {
	cmake_src_prepare
	# kill forced libstd=libc++ usage, breaks with GCC-13 which has
	# preliminary support for that
	# check_cxx_compiler_flag(-stdlib=libc++ # XTOOLS_CXX_HAS_STDLIB_FLAG)
	#
	sed -i -e '/check_cxx_compiler_flag/s/XTOOLS_CXX_HAS_STDLIB_FLAG/NO_&/' \
		cmake/config-ix.cmake || die
}

src_configure() {
	CTARGET=${CTARGET:-${CHOST}}
	if [[ ${CTARGET} == ${CHOST} ]] ; then
		if [[ ${CATEGORY} == cross-* ]] ; then
			export CTARGET=${CATEGORY#cross-}
		fi
	fi

	LIBPATH=/usr/$(get_libdir)/binutils/${CTARGET}/xtools-${PV}
	DATAPATH=/usr/share/binutils-data/${CTARGET}/xtools-${PV}
	if [[ ${CHOST} != ${CTARGET} ]] ; then
		BINPATH=/usr/${CHOST}/${CTARGET}/binutils-bin/xtools-${PV}
	else
		BINPATH=/usr/${CTARGET}/binutils-bin/xtools-${PV}
	fi

	is-host-64bit() {
		case ${CTARGET} in
			x86_64-*|powerpc64-*|arm64-*)   echo YES   ;;
			*)                              echo NO    ;;
		esac
	}

	local mycmakeargs=(
		-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET}
		-DPACKAGE_VERSION="Gentoo ${PN}-${PVR}"
		-DCMAKE_INSTALL_PREFIX="${EPREFIX}${BINPATH%/*}" # cmake insists on /bin
		-DCCTOOLS_LD_CLASSIC=NO  # fails to link, and is useless anyway
		-DXTOOLS_AS_USE_CLANG=YES  # default to host as for unsupported targets
		-DXTOOLS_AS_CLANG_USE_HOST=YES  # search for arch/as-host iso clang
		-DXTOOLS_AS_SUBDIR="${EPREFIX}${LIBPATH}/"
		-DXTOOLS_LTO_SUPPORT=NO
		-DXTOOLS_HAS_LIBPRUNETRIE=YES
		-DXTOOLS_TAPI_SUPPORT=ON
		-DXTOOLS_USE_TAPILITE=ON
		-DXTOOLS_HOST_IS_64B=$(is-host-64bit)
		-DXTOOLS_BUGURL="https://bugs.gentoo.org/"
	)

	cmake_src_configure
}

src_install() {
	cmake_src_install

	# cmake insists on installing in /bin, so move bins to the place we
	# want them
	mv "${ED}${BINPATH%/*}/bin" "${ED}${BINPATH}" || die

	# move as impls into LIBPATH, such that binutils-config doesn't
	# create links for this
	dodir "${LIBPATH}"
	local as
	for as in "${ED}${BINPATH}"/*/as ; do
		as=${as%/as}
		mv "${as}" "${ED}${LIBPATH}"/ || die
	done

	# provide as-host wrappers, used on "unsupported" platforms: x86,
	# x64, arm, arm64, the main reason here is missing support for
	# instructions, e.g. the as works fine, until newer instruction sets
	# are used like SSE4.1, AVX, etc.
	local arch
	for arch in i386 x86_64 arm arm64 ; do
		mkdir -p "${ED}${LIBPATH}"/${arch}
		as="${ED}${LIBPATH}"/${arch}/as-host
		rm -f "${as}"
		cat <<-EOF > "${as}"
			#!/usr/bin/env bash
			exec /usr/bin/as "\$@"
		EOF
		chmod 755 "${as}"
	done

	doman ld64/doc/man/man*/* cctools/man/*.[135]
	dodir "${DATAPATH}"
	mv "${ED}"/usr/share/man "${ED}/${DATAPATH}/" || die

	docompress "${DATAPATH}"/man

	cd "${S}"
	insinto /etc/env.d/binutils
	cat <<-EOF > env.d
		TARGET="${CHOST}"
		VER="xtools-${PV}"
		FAKE_TARGETS="${CHOST}"
	EOF
	newins env.d ${CHOST}-xtools-${PV}
}

pkg_postinst() {
	binutils-config ${CHOST}-xtools-${PV}
}