summaryrefslogtreecommitdiffstats
path: root/tools/copydlldeps.md
blob: 3b63a0395ea9846b8839116af8a6d12382ba1e01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
README of copydlldeps.sh
========================
This document belongs to copydlldeps.sh and is a part of the MXE project.

It can be invoked on the command line like:

```
/share/mxe/tools/copydlldeps.sh --infile /home/mxeuser/test/i686-w64-mingw32.shared/Application.exe \
				--destdir /home/mxeuser/testdlls/   \
				--recursivesrcdir /home/mxeuser/mxe/usr/i686-w64-mingw32.shared/ \
				--srcdir /home/mxeuser/test/ \
				--copy \
				--enforcedir /home/mxeuser/mxe/usr/i686-w64-mingw32.shared/qt5/plugins/platforms/ \
				--objdump /home/mxeuser/mxe/usr/bin/i686-w64-mingw32.shared-objdump
```

It got embedded in a build script like:

```
MXEPATH=/path/to/mxe
compiler=i686-w64-mingw32.shared
orgDir=/path/to/my/nsis/dll # nsis is then copying all dlls in there to the place where the exe is located

if [ ! $( echo $compiler | grep -q "shared" ) ]; then
	echo "\$compiler=$compiler and contains the word 'shared'" | tee -a $CURLOG

	echo "+-----------------------------------------------+ " | tee -a $CURLOG
	echo "| Starting new MXE copydlldeps.sh by LHE DL5RCW | " | tee -a $CURLOG
	echo "+-----------------------------------------------+ " | tee -a $CURLOG
	echo "currently working in $( pwd ) " | tee -a $CURLOG
	executable=$( find . -name "*.exe" | tail -n 1 )
	sharedLibsDir="${orgDir}/nsis/sharedLibs"
	echo "populating dir $sharedLibsDir with dll dependencies of $executable" | tee -a $CURLOG
	OBJDUMP=objdump
	if [ -e "$MXEPATH/usr/bin/$compiler-objdump" ]; then
		OBJDUMP="$MXEPATH/usr/bin/$compiler-objdump"
	fi
	$MXEPATH/tools/copydlldeps.sh 	--infile $executable \
					--destdir "$sharedLibsDir" \
					--recursivesrcdir "$MXEPATH/usr/$compiler/" \
					--enforcedir "$MXEPATH/usr/$compiler/qt5/plugins/platforms/" \
					--copy \
					--objdump "$OBJDUMP" \
					| tee -a $CURLOG
fi
```

Additional hints
================

objdump
-------
I checked if there is a mxe objdump. If not, I took the native one on my server.
I actually do not know the difference but decided to include it in the script
in case it is important to someone.

whitelist
---------
I added a whitelist of *dll files that are widely used and very common on windows systems. Most of them are not to be found on MXE, but on native machines. As they are listed as dependencies, they might create warnings. To avoid anxiety, I introduced str_whiteListDlls. Those will create info instead of warning messages. Do not worry about them any longer. It works anyway as those are to be expected on your windows installation.

exclude directory pattern
-------------------------
excludedir was added as an aditional option. You may call it multiple times like
    --excludepattern /path/folder1/ --excludepattern /path/folder2/ -X /path/folder3/
Try to make it as explicit as possible. If you choose a generic pattern, you may exclude more paths than you intend to. Actually any pattern will work.
    -X pattern1 -X pattern2
This was introduced upon the request to have the script avoid /(PREFIX)/(TARGET)/apps/. You may now pass this as an 'excludepattern' option.

enforcedir
----------
My application is using Qt5 and objdump did not return the needed qwindows.dll -
so I enforce the platform folder. You may add multiple --enforcedir directories using
`--enforcedir /path/folder1 --enforcedir /path/folder2 --enforcedir /path/folder3`.

They are NOT recursively copied, only flat. See:

```bash
    string=$( find $enforcedDirectory -maxdepth 1 -iregex '.*\(dll\|exe\)' | tr '\n' ' ' )
```

If you would remove the `-maxdepth 1`, it would become recoursive.

February, 2, 2016. Lars Holger Engelhard aka [DL5RCW](https://github.com/dl5rcw).