Skip to content

Commit

Permalink
Fix #9405 - cfg and nims run in sync
Browse files Browse the repository at this point in the history
genotrance authored and Araq committed Feb 27, 2020
1 parent 73f5f1e commit 96bffad
Showing 2 changed files with 31 additions and 28 deletions.
29 changes: 2 additions & 27 deletions compiler/cmdlinehelper.nim
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@
## Helpers for binaries that use compiler passes, eg: nim, nimsuggest, nimfix

import
options, idents, nimconf, scriptconfig, extccomp, commands, msgs,
options, idents, nimconf, extccomp, commands, msgs,
lineinfos, modulegraphs, condsyms, os, pathutils

from strutils import normalize
@@ -43,45 +43,20 @@ proc processCmdLineAndProjectPath*(self: NimProg, conf: ConfigRef) =
conf.projectPath = AbsoluteDir canonicalizePath(conf, AbsoluteFile getCurrentDir())

proc loadConfigsAndRunMainCommand*(self: NimProg, cache: IdentCache; conf: ConfigRef): bool =
loadConfigs(DefaultConfig, cache, conf) # load all config files
if self.suggestMode:
conf.command = "nimsuggest"
loadConfigs(DefaultConfig, cache, conf) # load all config files

template runNimScriptIfExists(path: AbsoluteFile) =
let p = path # eval once
if fileExists(p):
runNimScript(cache, p, freshDefines = false, conf)

# Caution: make sure this stays in sync with `loadConfigs`
if optSkipSystemConfigFile notin conf.globalOptions:
runNimScriptIfExists(getSystemConfigPath(conf, DefaultConfigNims))

if optSkipUserConfigFile notin conf.globalOptions:
runNimScriptIfExists(getUserConfigPath(DefaultConfigNims))

if optSkipParentConfigFiles notin conf.globalOptions:
for dir in parentDirs(conf.projectPath.string, fromRoot = true, inclusive = false):
runNimScriptIfExists(AbsoluteDir(dir) / DefaultConfigNims)

if optSkipProjConfigFile notin conf.globalOptions:
runNimScriptIfExists(conf.projectPath / DefaultConfigNims)
block:
let scriptFile = conf.projectFull.changeFileExt("nims")
if not self.suggestMode:
runNimScriptIfExists(scriptFile)
# 'nim foo.nims' means to just run the NimScript file and do nothing more:
if fileExists(scriptFile) and scriptFile == conf.projectFull:
if conf.command == "":
conf.command = "e"
return false
elif conf.command.normalize == "e":
return false
else:
if scriptFile != conf.projectFull:
runNimScriptIfExists(scriptFile)
else:
# 'nimsuggest foo.nims' means to just auto-complete the NimScript file
discard

# now process command line arguments again, because some options in the
# command line can overwrite the config file's settings
30 changes: 29 additions & 1 deletion compiler/nimconf.nim
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@

import
llstream, commands, os, strutils, msgs, lexer,
options, idents, wordrecg, strtabs, lineinfos, pathutils
options, idents, wordrecg, strtabs, lineinfos, pathutils, scriptconfig

# ---------------- configuration file parser -----------------------------
# we use Nim's scanner here to save space and work
@@ -248,17 +248,31 @@ proc loadConfigs*(cfg: RelativeFile; cache: IdentCache; conf: ConfigRef) =
if readConfigFile(configPath, cache, conf):
configFiles.add(configPath)

template runNimScriptIfExists(path: AbsoluteFile) =
let p = path # eval once
if fileExists(p):
runNimScript(cache, p, freshDefines = false, conf)

if optSkipSystemConfigFile notin conf.globalOptions:
readConfigFile(getSystemConfigPath(conf, cfg))

if cfg == DefaultConfig:
runNimScriptIfExists(getSystemConfigPath(conf, DefaultConfigNims))

if optSkipUserConfigFile notin conf.globalOptions:
readConfigFile(getUserConfigPath(cfg))

if cfg == DefaultConfig:
runNimScriptIfExists(getUserConfigPath(DefaultConfigNims))

let pd = if not conf.projectPath.isEmpty: conf.projectPath else: AbsoluteDir(getCurrentDir())
if optSkipParentConfigFiles notin conf.globalOptions:
for dir in parentDirs(pd.string, fromRoot=true, inclusive=false):
readConfigFile(AbsoluteDir(dir) / cfg)

if cfg == DefaultConfig:
runNimScriptIfExists(AbsoluteDir(dir) / DefaultConfigNims)

if optSkipProjConfigFile notin conf.globalOptions:
readConfigFile(pd / cfg)

@@ -269,6 +283,20 @@ proc loadConfigs*(cfg: RelativeFile; cache: IdentCache; conf: ConfigRef) =
projectConfig = changeFileExt(conf.projectFull, "nim.cfg")
readConfigFile(projectConfig)

if cfg == DefaultConfig:
runNimScriptIfExists(pd / DefaultConfigNims)

for filename in configFiles:
# delayed to here so that `hintConf` is honored
rawMessage(conf, hintConf, filename.string)

block:
let scriptFile = conf.projectFull.changeFileExt("nims")
if conf.command != "nimsuggest":
runNimScriptIfExists(scriptFile)
else:
if scriptFile != conf.projectFull:
runNimScriptIfExists(scriptFile)
else:
# 'nimsuggest foo.nims' means to just auto-complete the NimScript file
discard

0 comments on commit 96bffad

Please sign in to comment.