# $Id: Portfile 135516 2015-04-25 08:43:49Z jeremyhu@macports.org $ PortSystem 1.0 PortGroup compiler_blacklist_versions 1.0 name ld64 epoch 2 version 2 categories devel platforms darwin maintainers jeremyhu homepage http://opensource.apple.com/source/${name}/ master_sites http://opensource.apple.com/tarballs/${name}/ license APSL-2 description ld64 is the new mach-o linker long_description ld64 combines several object files and libraries, \ resolves references, and produces an ouput file. subport ld64-97 { # XCode 3.2.6 version 97.17 checksums ld64-97-standalone-libunwind-headers.patch \ rmd160 f6da71e097aa61b1055b3fdc12cd39aafed5f492 \ sha256 370d02757ea628b5dd145c099e42fc4eb88cc09cf459a59e32d14bbc9b4a105e \ ld64-97.17.tar.gz \ rmd160 d52df7d7f741c8bedd29cbac73dbb9db992b4795 \ sha256 02bd46af0809eaa415d096d7d41c3e8e7d80f7d8d181840866fb87f036b4e089 set makefile "Makefile-97" set ld64_ver 97 compiler.blacklist-append *clang* patchfiles \ ld64-version.patch \ ld64-97-no-LTO.patch \ ld64-97-ppc-branch-island.patch \ ld64-97-arm_types_PR38931.patch \ ld64-97-long-branch-warn.patch \ ld64-97-standalone-libunwind-headers.patch \ ld64-97-no-Availability.h.patch \ ld64-97-BaseAtomImplicitDecl.patch \ ld64-97-no-ppc-thread_status.patch if {${os.major} >= 14} { pre-fetch { ui_error "$subport is not supported on Yosemite or later." error "unsupported platform" } } } subport ld64-127 { # XCode 4.2 # This was the last ld64 release that supported linking ppc executables. version 127.2 revision 2 checksums rmd160 8ee709341549a1944732daef6ebab7ef1acfcc6e \ sha256 97b75547b2bd761306ab3e15ae297f01e7ab9760b922bc657f4ef72e4e052142 set makefile "Makefile-127" set ld64_ver 127 patchfiles-append \ ld64-version.patch \ ld64-134-missing-include.patch \ ld64-127-any-cctools.patch \ ld64-127-long-branch-warn.patch \ ld64-127-cxx_initializer_order_and_sim.patch \ ld64-127-ppc.patch \ ld64-97-no-Availability.h.patch \ PR-12249048.patch \ PR-12057707.patch \ PR-13282463.patch \ ld64-ppc-9610466.patch } subport ld64-136 { # XCode 4.6 version 136 revision 2 checksums rmd160 4a2930ccdd398b63a108810e90293ab96dc154a0 \ sha256 99d6c4acb6d4cdf45772951dd2308222aa966763170137459a9d276674645d9e set makefile "Makefile-133" set ld64_ver 136 patchfiles-append \ ld64-version.patch \ ld64-133-no-CrashReporterClient.h.patch \ ld64-134-missing-include.patch \ ld64-136-i386-badAddress.patch \ PR-13282463.patch \ ld64-ppc-9610466.patch if {${configure.cxx_stdlib} eq "libstdc++"} { patchfiles-append ld64-136-hash_set.patch } if {${os.major} <= 9} { pre-fetch { ui_error "$subport is not supported on Leopard or earlier. It requires the blocks runtime." error "unsupported platform" } } } subport ld64-236 { # XCode 5.1 version 236.3 checksums rmd160 6a3f44aa9ae57a60d2cff5b3d47be7972ad83029 \ sha256 8ef36729b643201081ab45ebd8586ede8f9968bc17614b679a940faa82875ca6 # http://trac.macports.org/ticket/43737 # < 100 is a guess. Xcode 4.1 might work, so I'm leaving it as an option unless someone reports a failure. compiler.blacklist-append *gcc* {clang < 100} set makefile "Makefile-133" set ld64_ver 236 patchfiles-append \ ld64-version.patch \ ld64-133-no-CrashReporterClient.h.patch \ ld64-134-missing-include.patch \ ld64-136-i386-badAddress.patch \ PR-16935960.patch \ PR-16936488.patch \ ld64-ppc-9610466.patch if {${configure.cxx_stdlib} eq "libstdc++"} { patchfiles-append ld64-236-hash_set.patch } if {${os.major} <= 9} { pre-fetch { ui_error "$subport is not supported on Leopard or earlier. It requires the blocks runtime." error "unsupported platform" } } } subport ld64-latest { # XCode 6.1 version 241.9 checksums rmd160 1ee4a7be89b96a8ce3ca6f6dc803dfd0852d29b8 \ sha256 3594e87c626c3b5abab6470cac6f27b367f1efcee60eb3d0f6b6d4ecf9b24230 # http://trac.macports.org/ticket/43737 # < 100 is a guess. Xcode 4.1 might work, so I'm leaving it as an option unless someone reports a failure. compiler.blacklist-append *gcc* {clang < 100} set makefile "Makefile-133" set ld64_ver latest patchfiles-append \ ld64-version.patch \ ld64-133-no-CrashReporterClient.h.patch \ ld64-134-missing-include.patch \ ld64-136-i386-badAddress.patch \ ld64-ppc-9610466.patch configure.cxx_stdlib libc++ depends_lib-append port:libcxx supported_archs i386 x86_64 pre-fetch { if {![file exists /usr/lib/libc++.dylib]} { ui_error "$name requires a C++11 runtime, which your configuration does not allow" error "unsupported configuration" } } } variant universal {} if {${subport} eq ${name}} { distfiles build {} use_configure no variant ld64_97 conflicts ld64_127 ld64_136 ld64_236 description {Use ld64-97 as the default linker (last version that works on Tiger)} {} variant ld64_127 conflicts ld64_97 ld64_136 ld64_236 description {Use ld64-127 as the default linker (last version to support ppc)} {} variant ld64_136 conflicts ld64_97 ld64_127 ld64_236 description {Use ld64-136 as the default linker (last version that works on Leopard)} {} variant ld64_236 conflicts ld64_97 ld64_127 ld64_136 description {Use ld64-236 as the default linker (last version that builds against OS X's libstdc++)} {} if {![variant_isset ld64_97] && ![variant_isset ld64_127] && ![variant_isset ld64_136]} { if {${os.major} < 9} { default_variants +ld64_97 } elseif {${os.major} < 10 || "ppc" in [get_canonical_archs]} { default_variants +ld64_127 } elseif {${os.major} < 11} { default_variants +ld64_136 } } if {[variant_isset ld64_97]} { set ld64_ver 97 } elseif {[variant_isset ld64_127]} { set ld64_ver 127 } elseif {[variant_isset ld64_136]} { set ld64_ver 136 } elseif {[variant_isset ld64_236]} { set ld64_ver 236 } else { set ld64_ver latest } depends_run port:ld64-${ld64_ver} destroot { ln -s dyldinfo-${ld64_ver} ${destroot}${prefix}/bin/dyldinfo ln -s ld-${ld64_ver} ${destroot}${prefix}/bin/ld ln -s machocheck-${ld64_ver} ${destroot}${prefix}/bin/machocheck ln -s ObjectDump-${ld64_ver} ${destroot}${prefix}/bin/ObjectDump ln -s rebase-${ld64_ver} ${destroot}${prefix}/bin/rebase ln -s unwinddump-${ld64_ver} ${destroot}${prefix}/bin/unwinddump file mkdir ${destroot}${prefix}/libexec/ld64 ln -s ld-${ld64_ver} ${destroot}${prefix}/libexec/ld64/ld } } else { depends_build path:include/mach-o/dyld_priv.h:dyld-headers \ path:include/mach-o/arm/reloc.h:libmacho-headers if {[string match macports-clang-* ${configure.compiler}]} { # For a new enough install_name_tool depends_build-append port:cctools } # We don't set llvmXX as the default variant on Tiger because it would introduce a # dependency cycle as llvm requires apple-gcc42 and ld64 to build correctly. Users # wanting LTO support in ld64 on Tiger can install the +llvm variant after llvm # has been installed. if {![variant_isset llvm33] && ![variant_isset llvm34] && ![variant_isset llvm35] && ![variant_isset llvm36] && ![variant_isset llvm37]} { if {${os.major} >= 13} { default_variants +llvm35 } elseif {${os.major} >= 10} { default_variants +llvm34 } elseif {${os.major} >= 9} { default_variants +llvm33 } if {![variant_isset llvm33] && ![variant_isset llvm34] && ![variant_isset llvm35] && ![variant_isset llvm36] && ![variant_isset llvm37] && ${os.major} >= 9} { ui_error "Your platform cannot be configured without LTO support in ld64. Please enable one of the llvmXX variants, and try again." return -code error "Your platform cannot be configured without LTO support in ld64. Please enable one of the llvmXX variants, and try again." } } set llvm_version {} variant llvm33 conflicts llvm34 llvm35 llvm36 llvm37 description {Use llvm-3.3 for libLTO} { set llvm_version 3.3 depends_lib-append port:llvm-${llvm_version} } variant llvm34 conflicts llvm33 llvm35 llvm36 llvm37 description {Use llvm-3.4 for libLTO} { set llvm_version 3.4 depends_lib-append port:llvm-${llvm_version} } variant llvm35 conflicts llvm33 llvm34 llvm36 llvm37 description {Use llvm-3.5 for libLTO} { set llvm_version 3.5 depends_lib-append port:llvm-${llvm_version} } variant llvm36 conflicts llvm33 llvm34 llvm35 llvm37 description {Use llvm-3.6 for libLTO} { set llvm_version 3.6 depends_lib-append port:llvm-${llvm_version} } variant llvm37 conflicts llvm33 llvm34 llvm35 llvm36 description {Use llvm-3.7 for libLTO} { set llvm_version 3.7 depends_lib-append port:llvm-${llvm_version} } if {${os.major} < 10} { # Leopard and earlier didn't have libunwind.h in the SDK depends_build-append path:include/libunwind.h:libunwind-headers } compiler.blacklist-append gcc-4.0 pre-fetch { if {${os.major} < 9} { if {${llvm_version} != ""} { if {![file exists ${prefix}/bin/llvm-config-mp-${llvm_version}]} { ui_error "You must first install ld64 without llvm support to build llvm. After llvm is installed, you can reinstall ld64 with the llvm variant." return -code error "You must first install ld64 without llvm support to build llvm. After llvm is installed, you can reinstall ld64 with the llvm variant." } } } } post-extract { file copy ${filespath}/${makefile} ${worksrcpath}/Makefile } post-patch { reinplace "s|@@VERSION@@|${version}|g" \ ${worksrcpath}/src/ld/Options.cpp if {${os.major} < 9} { # No CommonCrypto, use openssl reinplace "s:::" \ ${worksrcpath}/src/ld/MachOWriterExecutable.hpp reinplace "s:CC_MD5:MD5:" \ ${worksrcpath}/src/ld/MachOWriterExecutable.hpp reinplace "s:-Wl,-exported_symbol,__mh_execute_header::g" \ ${worksrcpath}/Makefile foreach reg {cr ctr eax ebp ebx ecx edi edx eip esi esp lr mq r0 r1 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r2 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r3 r30 r31 r4 r5 r6 r7 r8 r9 rax rbp rbx rcx rdi rdx rip rsi rsp srr0 srr1 vrsave xer} { reinplace "s|__${reg}|${reg}|g" ${worksrcpath}/src/ld/parsers/libunwind/Registers.hpp } } } configure { system "cd ${worksrcpath} && ${build.cmd} src/ld/configure.h" } set cxx_stdlibflags {} if {[string match *clang* ${configure.cxx}]} { set cxx_stdlibflags -stdlib=${configure.cxx_stdlib} } build.args \ CC="${configure.cc}" \ CXX="${configure.cxx}" \ OTHER_CPPFLAGS="${configure.cppflags}" \ OTHER_CFLAGS="${configure.cflags} [get_canonical_archflags cc]" \ OTHER_CXXFLAGS="${configure.cxxflags} ${cxx_stdlibflags} [get_canonical_archflags cxx]" \ OTHER_LDFLAGS="${configure.ldflags} ${cxx_stdlibflags} [get_canonical_archflags ld]" if {${os.major} >= 11} { build.args-append \ RC_SUPPORTED_ARCHS="armv6 armv7 i386 x86_64" } destroot.args \ PREFIX=${prefix} pre-build { if {${llvm_version} != ""} { build.args-append LLVM_CONFIG=${prefix}/bin/llvm-config-mp-${llvm_version} } if {${os.major} < 9} { build.args-append OTHER_LDFLAGS_LD64=-lcrypto } } post-destroot { # ${prefix}/bin/ld will always use the llvm we built against # ${prefix}/libexec/ld64/ld uses relative linking for use with the llvm ports file mkdir ${destroot}${prefix}/libexec/ld64 file copy ${destroot}${prefix}/bin/ld ${destroot}${prefix}/libexec/ld64/ld-${ld64_ver} file rename ${destroot}${prefix}/bin/dyldinfo ${destroot}${prefix}/bin/dyldinfo-${ld64_ver} file rename ${destroot}${prefix}/bin/ld ${destroot}${prefix}/bin/ld-${ld64_ver} file rename ${destroot}${prefix}/bin/machocheck ${destroot}${prefix}/bin/machocheck-${ld64_ver} file rename ${destroot}${prefix}/bin/ObjectDump ${destroot}${prefix}/bin/ObjectDump-${ld64_ver} file rename ${destroot}${prefix}/bin/rebase ${destroot}${prefix}/bin/rebase-${ld64_ver} file rename ${destroot}${prefix}/bin/unwinddump ${destroot}${prefix}/bin/unwinddump-${ld64_ver} eval delete [glob ${destroot}${prefix}/share/man/man1/*] if {${llvm_version} != ""} { system "install_name_tool -change ${prefix}/libexec/llvm-${llvm_version}/lib/libLTO.dylib \ @executable_path/../lib/libLTO.dylib ${destroot}${prefix}/libexec/ld64/ld-${ld64_ver}" } } } livecheck.type none