Discussion:
[MacPorts] #57695: Set AR, NM and RANLIB env. variables
MacPorts
2018-11-28 10:05:27 UTC
Permalink
#57695: Set AR, NM and RANLIB env. variables
-------------------------+--------------------
Reporter: RJVB | Owner: (none)
Type: enhancement | Status: new
Priority: Normal | Milestone:
Component: base | Version:
Keywords: | Port:
-------------------------+--------------------
I like to use link time optimisation where feasible and have learned
through experience that this can cause link failures in projects that use
static libraries (intermediate/private and/or public). This can be avoided
by using a more homogeneous toolchain, i.e.

{{{
if {[string match *clang++-mp* ${configure.cxx}]} {
configure.env-append \
AR="[string map {"clang++" "llvm-ar"} ${configure.cxx}]" \
NM="[string map {"clang++" "llvm-nm"} ${configure.cxx}]" \
RANLIB="[string map {"clang++" "llvm-ranlib"}
${configure.cxx}]"
} elseif {[string match *clang-mp* ${configure.cc}]} {
configure.env-append \
AR="[string map {"clang" "llvm-ar"} ${configure.cc}]" \
NM="[string map {"clang" "llvm-nm"} ${configure.cc}]" \
RANLIB="[string map {"clang" "llvm-ranlib"}
${configure.cc}]"
}
}}}

The mentioned experience comes from Linux but I don't see why similar
issues couldn't arise on Mac, for similar reasons (the default ar and/or
ranlib not being able to create a usable static library from llvm
objects). I think it shouldn't hurt to set the AR, NM and RANLIB env.
variables as shown above from "base", along with CC, CXX etc.

Equivalent for in the cmake PortGroup (pre-configure block):

{{{
if {[string match *clang++-mp* ${configure.cxx}]} {
if {[string first "DCMAKE_AR=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_AR=[string map {"clang++" "llvm-
ar"} ${configure.cxx}]
}
if {[string first "DCMAKE_NM=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_NM=[string map {"clang++" "llvm-
nm"} ${configure.cxx}]
}
if {[string first "DCMAKE_RANLIB=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_RANLIB=[string map {"clang++"
"llvm-ranlib"} ${configure.cxx}]
}
} elseif {[string match *clang-mp* ${configure.cc}]} {
if {[string first "DCMAKE_AR=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_AR=[string map {"clang" "llvm-ar"}
${configure.cc}]
}
if {[string first "DCMAKE_NM=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_NM=[string map {"clang" "llvm-nm"}
${configure.cc}]
}
if {[string first "DCMAKE_RANLIB=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_RANLIB=[string map {"clang" "llvm-
ranlib"} ${configure.cc}]
}
}
}}}
--
Ticket URL: <https://trac.macports.org/ticket/57695>
MacPorts <https://www.macports.org/>
Ports system for macOS
MacPorts
2018-11-28 10:06:38 UTC
Permalink
#57695: Set AR, NM and RANLIB env. variables
--------------------------+--------------------
Reporter: RJVB | Owner: (none)
Type: enhancement | Status: new
Priority: Normal | Milestone:
Component: base | Version:
Resolution: | Keywords:
Port: |
--------------------------+--------------------
Post by MacPorts
I like to use link time optimisation where feasible and have learned
through experience that this can cause link failures in projects that use
static libraries (intermediate/private and/or public). This can be
avoided by using a more homogeneous toolchain, i.e.
{{{
if {[string match *clang++-mp* ${configure.cxx}]} {
configure.env-append \
AR="[string map {"clang++" "llvm-ar"} ${configure.cxx}]" \
NM="[string map {"clang++" "llvm-nm"} ${configure.cxx}]" \
RANLIB="[string map {"clang++" "llvm-ranlib"}
${configure.cxx}]"
} elseif {[string match *clang-mp* ${configure.cc}]} {
configure.env-append \
AR="[string map {"clang" "llvm-ar"} ${configure.cc}]" \
NM="[string map {"clang" "llvm-nm"} ${configure.cc}]" \
RANLIB="[string map {"clang" "llvm-ranlib"}
${configure.cc}]"
}
}}}
The mentioned experience comes from Linux but I don't see why similar
issues couldn't arise on Mac, for similar reasons (the default ar and/or
ranlib not being able to create a usable static library from llvm
objects). I think it shouldn't hurt to set the AR, NM and RANLIB env.
variables as shown above from "base", along with CC, CXX etc.
{{{
if {[string match *clang++-mp* ${configure.cxx}]} {
if {[string first "DCMAKE_AR=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_AR=[string map {"clang++" "llvm-
ar"} ${configure.cxx}]
}
if {[string first "DCMAKE_NM=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_NM=[string map {"clang++" "llvm-
nm"} ${configure.cxx}]
}
if {[string first "DCMAKE_RANLIB=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_RANLIB=[string map {"clang++"
"llvm-ranlib"} ${configure.cxx}]
}
} elseif {[string match *clang-mp* ${configure.cc}]} {
if {[string first "DCMAKE_AR=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_AR=[string map {"clang" "llvm-
ar"} ${configure.cc}]
}
if {[string first "DCMAKE_NM=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_NM=[string map {"clang" "llvm-
nm"} ${configure.cc}]
}
if {[string first "DCMAKE_RANLIB=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_RANLIB=[string map {"clang"
"llvm-ranlib"} ${configure.cc}]
}
}
}}}
New description:

I like to use link time optimisation where feasible and have learned
through experience that this can cause link failures in projects that use
static libraries (intermediate/private and/or public). This can be avoided
by using a more homogeneous toolchain, i.e.

{{{
if {[string match *clang++-mp* ${configure.cxx}]} {
configure.env-append \
AR="[string map {"clang++" "llvm-ar"} ${configure.cxx}]" \
NM="[string map {"clang++" "llvm-nm"} ${configure.cxx}]" \
RANLIB="[string map {"clang++" "llvm-ranlib"}
${configure.cxx}]"
} elseif {[string match *clang-mp* ${configure.cc}]} {
configure.env-append \
AR="[string map {"clang" "llvm-ar"} ${configure.cc}]" \
NM="[string map {"clang" "llvm-nm"} ${configure.cc}]" \
RANLIB="[string map {"clang" "llvm-ranlib"}
${configure.cc}]"
}
}}}

The mentioned experience comes from Linux but I don't see why similar
issues couldn't arise on Mac, for similar reasons (the default ar and/or
ranlib not being able to create a usable static library from llvm
objects). I think it shouldn't hurt to set the AR, NM and RANLIB env.
variables as shown above from "base", along with CC, CXX etc. Or add
`configure.ar`, `configure.nm` and `configure.ranlib` option variables?

Equivalent for in the cmake PortGroup (pre-configure block):

{{{
if {[string match *clang++-mp* ${configure.cxx}]} {
if {[string first "DCMAKE_AR=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_AR=[string map {"clang++" "llvm-
ar"} ${configure.cxx}]
}
if {[string first "DCMAKE_NM=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_NM=[string map {"clang++" "llvm-
nm"} ${configure.cxx}]
}
if {[string first "DCMAKE_RANLIB=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_RANLIB=[string map {"clang++"
"llvm-ranlib"} ${configure.cxx}]
}
} elseif {[string match *clang-mp* ${configure.cc}]} {
if {[string first "DCMAKE_AR=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_AR=[string map {"clang" "llvm-ar"}
${configure.cc}]
}
if {[string first "DCMAKE_NM=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_NM=[string map {"clang" "llvm-nm"}
${configure.cc}]
}
if {[string first "DCMAKE_RANLIB=" ${configure.args}] eq -1} {
configure.args-append \
-DCMAKE_RANLIB=[string map {"clang" "llvm-
ranlib"} ${configure.cc}]
}
}
}}}

--
--
Ticket URL: <https://trac.macports.org/ticket/57695#comment:1>
MacPorts <https://www.macports.org/>
Ports system for macOS
Loading...