Files

386 lines
15 KiB
Tcl

# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
PortSystem 1.0
name cctools
# Xcode 11.3.1
version 949.0.1
set ld64_version 530
revision 3
# simulate stealth update; remove with next version change
dist_subdir ${name}/${version}_1
categories devel
maintainers {jeremyhu @jeremyhu} openmaintainer
license {APSL-2 GPL-2+}
installs_libs no
description Compiler Tools for Mac OS X and Darwin
long_description A set of essential tools to support development \
on Mac OS X and Darwin. Conceptually similar \
to binutils on other platforms.
homepage https://opensource.apple.com/source/${name}/
distfiles ${name}-${version}.tar.gz:main \
ld64-${ld64_version}.tar.gz:ld64
master_sites https://github.com/apple-oss-distributions/cctools/archive/:main \
https://github.com/apple-oss-distributions/ld64/archive/ld64-${ld64_version}:ld64
checksums cctools-949.0.1.tar.gz \
rmd160 54a8e318087547b827eee4e5dbb21a8f3956402f \
sha256 8b2d8dc371a57e42852fa6102efaf324ef004adf86072bf9957e2ac9005326c1 \
size 1967695 \
ld64-530.tar.gz \
rmd160 57d6629f31180b53f6f6a324a28e723611bd3cfb \
sha256 a21de4c2d4cd3ebf13c887eebbafc4b58ff0ee5bb07e592ba12690fb28a9cb17 \
size 729897
patchfiles cctools-829-lto.patch \
PR-37520.patch \
PR-12400897.patch \
cctools-862-prunetrie.patch \
cctools-921-noavx512.patch \
as-try-clang.patch \
cctools-949-libstuff-add-args-c.diff \
cctools-949-redo_prebinding-add-segg-addr-table-header.diff \
cctools-949-build-with-SDKs-older-than-1012.diff \
cctools-949-nm-allow-no-lto-support.diff \
cctools-949-write_object-fix.diff \
cctools-949-missed-stdio.diff \
cctools-949-lipo-segalign-log2fix.diff
# lipo-segalign-log2fix https://trac.macports.org/ticket/63164
# small fixes and sdk adjustments made to 949 but
# there is a bug in cctools as/write_object.c in 949 that needs upstreaming
# see https://github.com/macports/macports-ports/pull/9796
post-patch {
if {![variant_isset xcode] && ![variant_isset xtools]} {
system "cd ${workpath}/ld64-${ld64_version} && patch -p0 < ${filespath}/ld64-512-work-around-older-compilers-without-has-include.diff"
}
}
if {${os.major} < 11} {
patchfiles-append snowleopard-strnlen.patch
}
set all_llvm_variants [list llvm16 llvm15 llvm14 llvm13 llvm12 llvm11 llvm10 llvmdev]
if {${os.major} < 12} {
lappend all_llvm_variants llvm34
}
if {${os.major} < 14} {
lappend all_llvm_variants llvm37
}
if {${os.major} < 19} {
lappend all_llvm_variants llvm50 llvm60 llvm70 llvm80 llvm90
}
array set llvm_variant_version [list llvm34 3.4 llvm37 3.7 llvm50 5.0 \
llvm60 6.0 llvm70 7.0 llvm80 8.0 llvm90 9.0 llvm10 10 llvm11 11 \
llvm12 12 llvm13 13 llvm14 14 llvm15 15 llvm16 16 llvmdev devel]
set llvm_version {}
foreach variantname $all_llvm_variants {
set this_llvm_version $llvm_variant_version($variantname)
variant $variantname conflicts xcode xtools {*}[ldelete $all_llvm_variants $variantname] description "Use llvm-${this_llvm_version} for libLTO, llvm-mc, llvm-size, and llvm-nm" "
set llvm_version $this_llvm_version
depends_lib-append port:llvm-${this_llvm_version}
"
}
proc some_llvm_variant_set {} {
global all_llvm_variants
foreach variantname $all_llvm_variants {
if {[variant_isset $variantname]} {
return yes
}
}
return no
}
if { ![some_llvm_variant_set] && ![variant_isset xcode] && ![variant_isset xtools] } {
# Xcode 11 has a newer cctools than the current cctools port
# Check if Xcode is 11 or newer, or if not installed if the CLT is 11 or newer
# This +xcode cutoff can be moved up as the cctools port is updated
set xcode_ok [expr { ${xcodeversion} ne "none" && [vercmp ${xcodeversion} >= "11.0"] } ]
set clt_ok [expr { ${xcodeversion} eq "none" && ${xcodecltversion} ne "none" && [vercmp ${xcodecltversion} >= "11.0"] } ]
if { ${xcode_ok} || ${clt_ok} } {
default_variants +xcode
} elseif {${os.major} >= 16} {
# llvm-11 changed the arguments accepted by llvm-objdump
# this causes a number of errors in scripts that still use the old arguments
# we will default to +llvm11 when xcode changes to require the new arguments
# see https://reviews.llvm.org/D92310 and https://trac.macports.org/ticket/61852
default_variants +llvm10
} elseif {${os.major} >= 14} {
# llvm-9.0 is the newest llvm the system toolchain can build on these systems
default_variants +llvm90
} elseif {${os.major} >= 12} {
# llvm-3.7 is the newest llvm the system toolchain can build on these systems
default_variants +llvm37
} elseif {${os.major} >= 9 && ${build_arch} ni [list ppc ppc64]} {
# llvm-3.4 is the newest llvm the system toolchain can build on these systems
default_variants +llvm34
}
# we purposefully don't force an llvm variant on cctools for < darwin10
# to avoid a dependency loop. Folks who want LTO support on
# systems prior to darwin10 can reinstall cctools with an llvm variant manually
# see https://trac.macports.org/ticket/52091
# If a default llvm is still not set, use +llvm10
# this fail-safe ensures some cctools variant can build
if {![some_llvm_variant_set] && ![variant_isset xcode] && ${os.major} >= 10 && ${build_arch} ni [list ppc ppc64]} {
default_variants +llvm10
}
}
if {[variant_isset llvm34] && ${os.major} < 11} {
# This port is used by clang-3.4 to bootstrap libcxx
configure.cxx_stdlib libstdc++
}
variant xcode description "Use Xcode supplied cctools" {
supported_archs noarch
platforms {darwin any}
patchfiles
distfiles
build {}
destroot {
set xcode_cmds {bitcode-strip nm nm-classic as ar otool ranlib lipo libtool segedit strip size size-classic strings objdump}
foreach xcode_cmd $xcode_cmds {
set mp_cmd ${destroot}${prefix}/bin/${xcode_cmd}
# Create script that uses xcrun to run the Xcode provided command
system "echo '#!/bin/bash' > ${mp_cmd}"
system "echo 'if \[\[ \-x \/usr\/bin\/xcrun \]\] \; then' >> ${mp_cmd}"
system "echo ' exec \/usr\/bin\/xcrun ${xcode_cmd} \"\$\{\@\}\"' >> ${mp_cmd}"
system "echo 'elif \[\[ \-x \/usr\/bin\/${xcode_cmd} \]\] \; then' >> ${mp_cmd}"
system "echo ' exec \/usr\/bin/${xcode_cmd} \"\$\{\@\}\"' >> ${mp_cmd}"
system "echo 'else' >> ${mp_cmd}"
system "echo ' exec ${xcode_cmd} \"\$\{\@\}\"' >> ${mp_cmd}"
system "echo 'fi' >> ${mp_cmd}"
# make executable
system "chmod +x ${mp_cmd}"
}
}
}
variant xtools description "Use darwin-xtools as cctools" {
configure.cxx_stdlib
depends_run port:darwin-xtools
supported_archs noarch
platforms {darwin any}
patchfiles
distfiles
build {}
destroot {
set xtools_cmds {nm as ar otool ranlib lipo libtool segedit strip size strings}
foreach xtools_cmd $xtools_cmds {
ln -s ../libexec/darwin-xtools/bin/${xtools_cmd} ${destroot}${prefix}/bin/${xtools_cmd}
}
}
}
destroot.args RAW_DSTROOT=${destroot} DSTROOT=${destroot}${prefix} RC_ProjectSourceVersion=${version}
# reconfirmed 20210818 - cctools +llvm10 will not build universal on BigSur
if {${os.major} >= 20} {
universal_variant no
} else {
universal_variant yes
}
if {![variant_isset xcode] && ![variant_isset xtools]} {
depends_build port:libunwind-headers
}
post-extract {
if {![variant_isset xcode] && ![variant_isset xtools]} {
move ${workpath}/cctools-cctools-${version} ${workpath}/cctools-${version}
move ${workpath}/ld64-ld64-${ld64_version} ${workpath}/ld64-${ld64_version}
file copy ${worksrcpath}/../ld64-${ld64_version}/src/other/PruneTrie.cpp ${worksrcpath}/misc
system "touch ${worksrcpath}/../ld64-${ld64_version}/src/abstraction/configure.h"
}
}
post-patch {
if {![variant_isset xcode] && ![variant_isset xtools]} {
# We don't want to build cctools ld. We want to use ld64
reinplace "/^SUBDIRS_32/s/ld//" ${worksrcpath}/Makefile
reinplace "/^COMMON_SUBDIRS/s/ ld / /" ${worksrcpath}/Makefile
# Use our chosen version of llvm
if {${llvm_version} ne ""} {
reinplace "s:\"llvm-objdump\":\"llvm-objdump-mp-${llvm_version}\":" ${worksrcpath}/otool/main.c
reinplace "s:\"llvm-mc\":\"llvm-mc-mp-${llvm_version}\":" ${worksrcpath}/as/driver.c
reinplace "s:@@LLVM_LIBDIR@@:${prefix}/libexec/llvm-${llvm_version}/lib:" ${worksrcpath}/libstuff/lto.c
}
# List of clang versions to search for at runtime internally by 'as'
# Build list from llvm variants, excluding clang < 5 and devel version
# (unless devel variant is used in which case it is included first)
set as_comps ""
foreach variantname ${all_llvm_variants} {
set ver $llvm_variant_version($variantname)
# Use all non-devel and clang > 4 versions
if { ${ver} ne "devel" && ${ver} > 4.999 } {
if { ${as_comps} ne "" } {
set as_comps ",${as_comps}"
}
set as_comps "\"clang-mp-${ver}\"${as_comps}"
}
}
# If llvmdev variant is active, include at start of list
if {[variant_isset llvmdev]} {
set as_comps "\"clang-mp-devel\",${as_comps}"
}
ui_debug "as compiler list ${as_comps}"
reinplace "s:__MP_CLANG_NAMES__:${as_comps}:" ${worksrcpath}/as/driver.c
if {${os.major} >= 11} {
set try_system_clang 1
} else {
# clang's integrated assembler may not work well on 10.6 and doesn't
# exist on older OS versions.
set try_system_clang 0
}
reinplace "s:__TRY_SYSTEM_CLANG__:${try_system_clang}:" ${worksrcpath}/as/driver.c
foreach file [glob ${worksrcpath}/{*/,}Makefile] {
reinplace -q "s:/usr/local:@PREFIX@:g" ${file}
reinplace -q "s:/usr:@PREFIX@:g" ${file}
reinplace -q "s:@PREFIX@:${prefix}:g" ${file}
reinplace -q "s:${prefix}/efi:${prefix}:g" ${file}
reinplace -q "s:/Developer${prefix}:${prefix}:g" ${file}
reinplace -q "s:${prefix}/man:${prefix}/share/man:g" ${file}
# Don't strip installed binaries
reinplace -q "s:\\(install .*\\)-s :\\1:g" ${file}
if {${os.major} < 10} {
reinplace -q "s:${prefix}/bin/mig:/usr/bin/mig:g" ${file}
}
}
# macOS 10.14's SDKs have newer versions that are needed to compile
if {${os.major} > 17} {
file delete -force ${worksrcpath}/include/mach/i386
}
}
}
use_configure no
# https://trac.macports.org/ticket/43745
configure.cflags-append -std=gnu99
build.target all
set cxx_stdlibflags {}
if {[string match *clang* ${configure.cxx}] && ${configure.cxx_stdlib} ne ""} {
set cxx_stdlibflags -stdlib=${configure.cxx_stdlib}
}
configure.cppflags-append \
-I${worksrcpath}/../ld64-${ld64_version}/src/abstraction \
-I${worksrcpath}/../ld64-${ld64_version}/src/other \
-I${worksrcpath}/include
pre-build {
if {![variant_isset xcode] && ![variant_isset xtools]} {
build.args-append \
RC_ProjectSourceVersion=${version} \
USE_DEPENDENCY_FILE=NO \
BUILD_DYLIBS=NO \
CC="${configure.cc} ${configure.cflags}" \
CXX="${configure.cxx} ${configure.cxxflags}" \
CXXLIB="${cxx_stdlibflags}" \
TRIE=-DTRIE_SUPPORT \
RC_ARCHS="[get_canonical_archs]" \
SDK="${configure.cppflags}"
if {${llvm_version} ne ""} {
build.args-append \
LTO=-DLTO_SUPPORT \
RC_CFLAGS="[get_canonical_archflags] `llvm-config-mp-${llvm_version} --cflags`" \
LLVM_MC="llvm-mc-mp-${llvm_version}"
} else {
build.args-append \
LTO= \
RC_CFLAGS="[get_canonical_archflags]"
}
}
}
pre-destroot {
if {![variant_isset xcode] && ![variant_isset xtools]} {
destroot.args-append \
RC_ProjectSourceVersion=${version} \
USE_DEPENDENCY_FILE=NO \
BUILD_DYLIBS=NO \
CC="${configure.cc} ${configure.cflags}" \
CXX="${configure.cxx} ${configure.cxxflags}" \
CXXLIB="${cxx_stdlibflags}" \
TRIE=-DTRIE_SUPPORT \
RC_ARCHS="[get_canonical_archs]" \
SDK="${configure.cppflags}"
if {${llvm_version} ne ""} {
destroot.args-append \
LTO=-DLTO_SUPPORT \
RC_CFLAGS="[get_canonical_archflags] `llvm-config-mp-${llvm_version} --cflags`" \
LLVM_MC="llvm-mc-mp-${llvm_version}"
} else {
destroot.args-append \
LTO= \
RC_CFLAGS="[get_canonical_archflags]"
}
}
}
platform macosx {
build.args-append RC_OS="macos"
destroot.args-append RC_OS="macos"
}
destroot.target install_tools
destroot.args-append DSTROOT=${destroot}
post-destroot {
if {![variant_isset xcode] && ![variant_isset xtools]} {
file delete -force ${destroot}${prefix}/OpenSourceLicenses
file delete -force ${destroot}${prefix}/OpenSourceVersions
file delete -force ${destroot}${prefix}/RelNotes
if {${os.major} < 10} {
file delete -force ${destroot}/Developer
}
# Provided by port:cctools-headers
file delete -force ${destroot}${prefix}/include
# Older versions of llvm either don't have some tools, or they're not compatible
file delete -force ${destroot}${prefix}/bin/nm
file delete -force ${destroot}${prefix}/bin/size
if {${llvm_version} eq "3.4" || ${llvm_version} eq "3.7" || ${llvm_version} eq ""} {
ln -s nm-classic ${destroot}${prefix}/bin/nm
ln -s size-classic ${destroot}${prefix}/bin/size
# https://trac.macports.org/ticket/53099
file delete -force ${destroot}${prefix}/bin/otool
file delete -force ${destroot}${prefix}/bin/llvm-otool
ln -s otool-classic ${destroot}${prefix}/bin/otool
} else {
ln -s llvm-nm-mp-${llvm_version} ${destroot}${prefix}/bin/nm
ln -s llvm-size-mp-${llvm_version} ${destroot}${prefix}/bin/size
}
}
}
livecheck.type regex
livecheck.regex "${name}-(\[\\d.\]+)"