diff options
author | alaviss <alaviss@users.noreply.github.com> | 2020-01-20 09:51:21 +0000 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2020-01-20 10:51:21 +0100 |
commit | 470faa97c60aa5d8153f00083913aca4f0dc1fdf (patch) | |
tree | 6512d3029c96fa0fb28b86f3f3393ab15ecbdd37 | |
parent | da1bddb084443f7f386a04c853eb5c1c03b28ce4 (diff) | |
download | Nim-470faa97c60aa5d8153f00083913aca4f0dc1fdf.tar.gz |
compiler/ccgtypes: hide exportc proc unless it has dynlib (#13199)
This hides most of stdlib's internal functions from resulting binaries/libraries, where they aren't needed on *nix. Static libraries are not affected by this change (visibility doesn't apply to them).
-rw-r--r-- | compiler/ccgtypes.nim | 2 | ||||
-rw-r--r-- | testament/categories.nim | 4 | ||||
-rw-r--r-- | tests/dll/visibility.nim | 19 |
3 files changed, 24 insertions, 1 deletions
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 905f8999e..59f47b02d 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -954,7 +954,7 @@ proc genProcHeader(m: BModule, prc: PSym, asPtr: bool = false): Rope = result.add "N_LIB_EXPORT " elif prc.typ.callConv == ccInline or asPtr or isNonReloadable(m, prc): result.add "static " - elif {sfImportc, sfExportc} * prc.flags == {}: + elif sfImportc notin prc.flags: result.add "N_LIB_PRIVATE " var check = initIntSet() fillLoc(prc.loc, locProc, prc.ast[namePos], mangleName(m, prc), OnUnknown) diff --git a/testament/categories.nim b/testament/categories.nim index 98ddd7e10..f8cc625c4 100644 --- a/testament/categories.nim +++ b/testament/categories.nim @@ -128,6 +128,9 @@ proc runBasicDLLTest(c, r: var TResults, cat: Category, options: string) = var test3 = makeTest("lib/nimhcr.nim", options & " --outdir:tests/dll" & rpath, cat) test3.spec.action = actionCompile testSpec c, test3 + var test4 = makeTest("tests/dll/visibility.nim", options & " --app:lib" & rpath, cat) + test4.spec.action = actionCompile + testSpec c, test4 # windows looks in the dir of the exe (yay!): when not defined(Windows): @@ -141,6 +144,7 @@ proc runBasicDLLTest(c, r: var TResults, cat: Category, options: string) = testSpec r, makeTest("tests/dll/client.nim", options & " --threads:on" & rpath, cat) testSpec r, makeTest("tests/dll/nimhcr_unit.nim", options & rpath, cat) + testSpec r, makeTest("tests/dll/visibility.nim", options & rpath, cat) if "boehm" notin options: # force build required - see the comments in the .nim file for more details diff --git a/tests/dll/visibility.nim b/tests/dll/visibility.nim new file mode 100644 index 000000000..7341e3311 --- /dev/null +++ b/tests/dll/visibility.nim @@ -0,0 +1,19 @@ +discard """ + output: "could not import: foo" + exitcode: 1 +""" + +const LibName {.used.} = + when defined(windows): + "visibility.dll" + elif defined(macosx): + "libvisibility.dylib" + else: + "libvisibility.so" + +when compileOption("app", "lib"): + proc foo() {.exportc.} = + echo "failed" +elif isMainModule: + proc foo() {.importc, dynlib: LibName.} + foo() |