From 6354132959f3018883d7b93dbd6af8bbddff5b0e Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Tue, 9 Jan 2018 22:32:08 +0000 Subject: [PATCH] Implement nimLibPrefix config var and add better messages for it. --- readme.markdown | 6 +++++- src/nimblepkg/config.nim | 5 +++++ src/nimblepkg/nimscriptsupport.nim | 16 ++++++++++++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/readme.markdown b/readme.markdown index 4ebadcf..02d3583 100644 --- a/readme.markdown +++ b/readme.markdown @@ -358,6 +358,9 @@ You can currently configure the following in this file: Nimble will also attempt to read the ``http_proxy`` and ``https_proxy`` environment variables. **Default: ""** +* ``nimLibPrefix`` - Specifies the Nim standard library prefix to help Nimble + find the Nim standard library. + **Default: ""** ## Creating Packages @@ -841,7 +844,8 @@ Make sure that you are running at least version 0.16.0 of Nim (or the latest nig Nimble cannot find the Nim standard library. This is considered a bug so please report it. As a workaround you can set the ``NIM_LIB_PREFIX`` environment variable to the directory where ``lib/system.nim`` (and other standard library -files) are found. +files) are found. Alternatively you can also configure this in Nimble's +config file. ## Repository information diff --git a/src/nimblepkg/config.nim b/src/nimblepkg/config.nim index 45f8154..78e3950 100644 --- a/src/nimblepkg/config.nim +++ b/src/nimblepkg/config.nim @@ -11,6 +11,7 @@ type packageLists*: Table[string, PackageList] ## Names -> packages.json files cloneUsingHttps*: bool # Whether to replace git:// for https:// httpProxy*: Uri # Proxy for package list downloads. + nimLibPrefix*: string # Nim stdlib prefix. PackageList* = object name*: string @@ -33,6 +34,8 @@ proc initConfig(): Config = ]) result.packageLists["official"] = defaultPkgList + result.nimLibPrefix = "" + proc initPackageList(): PackageList = result.name = "" result.urls = @[] @@ -110,6 +113,8 @@ proc parseConfig*(): Config = else: currentPackageList.path = e.value else: assert false + of "nimlibprefix": + result.nimLibPrefix = e.value else: raise newException(NimbleError, "Unable to parse config file:" & " Unknown key: " & e.key) diff --git a/src/nimblepkg/nimscriptsupport.nim b/src/nimblepkg/nimscriptsupport.nim index e0576df..f86eb69 100644 --- a/src/nimblepkg/nimscriptsupport.nim +++ b/src/nimblepkg/nimscriptsupport.nim @@ -191,11 +191,19 @@ proc setupVM(module: PSym; scriptName: string, flags: Flags): PEvalContext = proc isValidLibPath(lib: string): bool = return fileExists(lib / "system.nim") -proc getNimPrefixDir: string = +proc getNimPrefixDir(options: Options): string = let env = getEnv("NIM_LIB_PREFIX") if env != "": + let msg = "Using env var NIM_LIB_PREFIX: " & env + display("Warning:", msg, Warning, HighPriority) return env + if options.config.nimLibPrefix != "": + result = options.config.nimLibPrefix + let msg = "Using Nim stdlib prefix from Nimble config file: " & result + display("Warning:", msg, Warning, HighPriority) + return + result = splitPath(findExe("nim")).head.parentDir # The above heuristic doesn't work for 'choosenim' proxies. Thankfully in # that case the `nimble` binary is beside the `nim` binary so things should @@ -222,10 +230,14 @@ proc execScript(scriptName: string, flags: Flags, options: Options): PSym = compiler_options.implicitImports.add("nimblepkg/nimscriptapi") # Ensure the compiler can find its standard library #220. - compiler_options.gPrefixDir = getNimPrefixDir() + compiler_options.gPrefixDir = getNimPrefixDir(options) + display("Setting", "Nim stdlib prefix to " & compiler_options.gPrefixDir, + priority=LowPriority) # Verify that lib path points to existing stdlib. compiler_options.setDefaultLibpath() + display("Setting", "Nim stdlib path to " & compiler_options.libpath, + priority=LowPriority) if not isValidLibPath(compiler_options.libpath): let msg = "Nimble cannot find Nim's standard library.\nLast try in:\n - $1" % compiler_options.libpath