Skip to content

Commit

Permalink
Improve LD support for macOS
Browse files Browse the repository at this point in the history
  • Loading branch information
17451k committed Jun 21, 2022
1 parent e796814 commit bdab832
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 7 deletions.
12 changes: 9 additions & 3 deletions clade/extensions/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import sys

from clade.extensions.abstract import Extension
from clade.extensions.opts import requires_value
from clade.extensions.opts import requires_value, requires_mult_values
from clade.cmds import iter_cmds_by_which, number_of_cmds_by_which


Expand Down Expand Up @@ -111,8 +111,14 @@ def parse_cmd(self, cmd, cmd_type):
opts = iter(cmd["command"][1:])

for opt in opts:
# Options with values.
if opt in requires_value[cmd_type]:
# Options with multiple values.
if opt in requires_mult_values[cmd_type].keys():
vals = []
for _ in range(requires_mult_values[cmd_type][opt]):
vals.append(next(opts))
parsed_cmd["opts"].extend([opt] + vals)
# Options with single values.
elif opt in requires_value[cmd_type]:
# Value is the next option.
val = next(opts)
if opt == "-o":
Expand Down
24 changes: 21 additions & 3 deletions clade/extensions/ld.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import re

from clade.extensions.common import Common
from clade.extensions.opts import requires_value


class LD(Common):
Expand Down Expand Up @@ -47,6 +48,8 @@ def __parse_opts(self, parsed_cmd):
name = next(opts)

self.__find_archive(name, searchdirs, parsed_cmd)
elif opt in requires_value[self.name]:
continue
elif opt.startswith("-l") or opt.startswith("--library="):
name = re.sub(r"^-l", "", opt)
name = re.sub(r"^--library=", "", name)
Expand All @@ -73,7 +76,21 @@ def __get_searchdirs(self, parsed_cmd):
path = os.path.normpath(os.path.join(parsed_cmd["cwd"], path))
searchdirs.append(os.path.normpath(path))

return searchdirs
syslibroot = self.__get_syslibroot(parsed_cmd)

return [syslibroot + s for s in searchdirs]

def __get_syslibroot(self, parsed_cmd):
syslibroot = "/"

opts = iter(parsed_cmd["opts"])

for opt in opts:
if opt == "-syslibroot":
syslibroot = next(opts)
break

return syslibroot

def __find_archive(self, name, searchdirs, parsed_cmd):
if not searchdirs:
Expand All @@ -86,13 +103,14 @@ def __find_archive(self, name, searchdirs, parsed_cmd):
names.append(name[1:])
else:
names.append("lib" + name + ".dylib") # macOS
names.append("lib" + name + ".tbd") # macOS, "text-based stub libraries"
names.append("lib" + name + ".so")
names.append("lib" + name + ".a")
names.append(name + ".a")

for searchdir in searchdirs:
for name in names:
archive = os.path.normpath(os.path.join(searchdir, name))
for basename in names:
archive = os.path.normpath(os.path.join(searchdir, basename))
if os.path.exists(archive):
if archive not in parsed_cmd["in"]:
parsed_cmd["in"].append(archive)
Expand Down
11 changes: 11 additions & 0 deletions clade/extensions/opts.py
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,17 @@
"Link": set(),
}

# Some options require multiple values
requires_mult_values = {
"CC": dict(),
"CXX": dict(),
"LD": {"-platform_version": 3},
"AS": dict(),
"Objcopy": dict(),
"CL": dict(),
"Link": dict(),
}

include_opts = [
"-include",
"-I",
Expand Down
2 changes: 1 addition & 1 deletion clade/extensions/presets/presets.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"CC.ignore_cc1": true,
"CC.with_system_header_files": true,
"CL.pre_encoding": null,
"LD.searchdirs": [],
"LD.searchdirs": ["/usr/lib"],
"Compiler.deps_encoding": null,
"Compiler.get_deps": true,
"Compiler.store_deps": true,
Expand Down

0 comments on commit bdab832

Please sign in to comment.