238a6053c4
Co-authored-by: Robin Gloster <mail@glob.in> stdenv: print message if structuredAttrs is enabled stdenv: add _append reduces the chance of a user doing it wrong fix nix develop issue output hooks don't work yet in nix develop though making $outputs be the same on non-structuredAttrs and structuredAttrs is too much trouble. lets instead make a function that gets the output names reading environment file '/nix/store/2x7m69a2sm2kh0r6v0q5s9z1dh41m4xf-xz-5.2.5-env-bin' nix: src/nix/develop.cc:299: std::string Common::makeRcScript(nix::ref<nix::Store>, const BuildEnvironment&, const Path&): Assertion `outputs != buildEnvironment.vars.end()' failed. use a function to get all output names instead of using $outputs copy env functionality from https://github.com/NixOS/nixpkgs/pull/76732/commits
45 lines
1.6 KiB
Bash
45 lines
1.6 KiB
Bash
|
|
fixupOutputHooks+=(_linkDLLs)
|
|
|
|
# For every *.{exe,dll} in $output/bin/ we try to find all (potential)
|
|
# transitive dependencies and symlink those DLLs into $output/bin
|
|
# so they are found on invocation.
|
|
# (DLLs are first searched in the directory of the running exe file.)
|
|
# The links are relative, so relocating whole /nix/store won't break them.
|
|
_linkDLLs() {
|
|
(
|
|
if [ ! -d "$prefix/bin" ]; then exit; fi
|
|
cd "$prefix/bin"
|
|
|
|
# Compose path list where DLLs should be located:
|
|
# prefix $PATH by currently-built outputs
|
|
local DLLPATH=""
|
|
local outName
|
|
for outName in $(getAllOutputNames); do
|
|
addToSearchPath DLLPATH "${!outName}/bin"
|
|
done
|
|
DLLPATH="$DLLPATH:$PATH"
|
|
|
|
echo DLLPATH="'$DLLPATH'"
|
|
|
|
linkCount=0
|
|
# Iterate over any DLL that we depend on.
|
|
local dll
|
|
for dll in $($OBJDUMP -p *.{exe,dll} | sed -n 's/.*DLL Name: \(.*\)/\1/p' | sort -u); do
|
|
if [ -e "./$dll" ]; then continue; fi
|
|
# Locate the DLL - it should be an *executable* file on $DLLPATH.
|
|
local dllPath="$(PATH="$DLLPATH" type -P "$dll")"
|
|
if [ -z "$dllPath" ]; then continue; fi
|
|
# That DLL might have its own (transitive) dependencies,
|
|
# so add also all DLLs from its directory to be sure.
|
|
local dllPath2
|
|
for dllPath2 in "$dllPath" "$(dirname $(readlink "$dllPath" || echo "$dllPath"))"/*.dll; do
|
|
if [ -e ./"$(basename "$dllPath2")" ]; then continue; fi
|
|
CYGWIN+=\ winsymlinks:nativestrict ln -sr "$dllPath2" .
|
|
linkCount=$(($linkCount+1))
|
|
done
|
|
done
|
|
echo "Created $linkCount DLL link(s) in $prefix/bin"
|
|
)
|
|
}
|
|
|