From b08116668531f8959de9d54009956f9ed21cbab9 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Sat, 21 Dec 2019 20:59:08 +0100 Subject: [PATCH] fixes #12735 on osx, call dsymutil for debug builds (#12931) * fix #12735 osx: dsymutil needs to be called for debug builds * also write dsymutil command to extraCmds in json build file --- compiler/extccomp.nim | 21 +++++++++++++++++++++ compiler/options.nim | 1 + 2 files changed, 22 insertions(+) diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim index 69b97177a6..5db719f852 100644 --- a/compiler/extccomp.nim +++ b/compiler/extccomp.nim @@ -838,6 +838,15 @@ proc execLinkCmd(conf: ConfigRef; linkCmd: string) = execExternalProgram(conf, linkCmd, if optListCmd in conf.globalOptions or conf.verbosity > 1: hintExecuting else: hintLinking) +proc maybeRunDsymutil(conf: ConfigRef; exe: AbsoluteFile) = + when defined(osx): + if optCDebug notin conf.globalOptions: return + # if needed, add an option to skip or override location + let cmd = "dsymutil " & $(exe).quoteShell + conf.extraCmds.add cmd + tryExceptOSErrorMessage(conf, "invocation of dsymutil failed."): + execExternalProgram(conf, cmd, hintExecuting) + proc execCmdsInParallel(conf: ConfigRef; cmds: seq[string]; prettyCb: proc (idx: int)) = let runCb = proc (idx: int, p: Process) = let exitCode = p.peekExitCode @@ -979,6 +988,7 @@ proc callCCompiler*(conf: ConfigRef) = linkViaResponseFile(conf, linkCmd) else: execLinkCmd(conf, linkCmd) + maybeRunDsymutil(conf, mainOutput) else: linkCmd = "" if optGenScript in conf.globalOptions: @@ -1066,6 +1076,9 @@ proc writeJsonBuildInstructions*(conf: ConfigRef) = lit "],\L\"linkcmd\": " str getLinkCmd(conf, conf.absOutFile, objfiles) + lit ",\L\"extraCmds\": " + lit $(%* conf.extraCmds) + if optRun in conf.globalOptions or isDefined(conf, "nimBetterRun"): lit ",\L\"cmdline\": " str conf.commandLine @@ -1131,6 +1144,14 @@ proc runJsonBuildInstructions*(conf: ConfigRef; projectfile: AbsoluteFile) = let linkCmd = data["linkcmd"] doAssert linkCmd.kind == JString execLinkCmd(conf, linkCmd.getStr) + if data.hasKey("extraCmds"): + let extraCmds = data["extraCmds"] + doAssert extraCmds.kind == JArray + for cmd in extraCmds: + doAssert cmd.kind == JString, $cmd.kind + let cmd2 = cmd.getStr + execExternalProgram(conf, cmd2, hintExecuting) + except: when declared(echo): echo getCurrentException().getStackTrace() diff --git a/compiler/options.nim b/compiler/options.nim index ed3ee030d3..443b2a1b6b 100644 --- a/compiler/options.nim +++ b/compiler/options.nim @@ -249,6 +249,7 @@ type command*: string # the main command (e.g. cc, check, scan, etc) commandArgs*: seq[string] # any arguments after the main command commandLine*: string + extraCmds*: seq[string] # for writeJsonBuildInstructions keepComments*: bool # whether the parser needs to keep comments implicitImports*: seq[string] # modules that are to be implicitly imported implicitIncludes*: seq[string] # modules that are to be implicitly included