1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 04:31:29 +00:00

Bundling update for macOS

This commit is contained in:
dmiller
2023-03-01 22:05:40 +00:00
parent 3b4065a156
commit 3b3a4fa46a
7 changed files with 179 additions and 143 deletions

View File

@@ -2,9 +2,8 @@
# Zenmap, Ncat, and Ndiff.
export NMAP_VERSION := $(shell echo NMAP_VERSION | $(CPP) -imacros ../nmap.h - | sed -n '$$s/[" ]//g;$$p')
#OSX_VERSION=$(shell sw_vers -productVersion | cut -d'.' -f1,2 | tr -d ' ')
OSX_VERSION=10.11
OSX_MIN_VERSION = 10.9
OSX_VERSION=$(shell sw_vers -productVersion | cut -d'.' -f1,2 | tr -d ' ')
OSX_MIN_VERSION = 10.15
NAME_VERSION = nmap-$(NMAP_VERSION)$(if $(APPENDAGE),-$(APPENDAGE))
@@ -42,34 +41,11 @@ EXTRA_DIST = README.md ../LICENSE ../docs/3rd-party-licenses.txt ../docs/license
CONFIGURE_ARGS = --prefix="$(PREFIX)" --with-libdnet=included --with-libpcap=included --with-libpcre=included --with-liblua=included CC="$(CC)" CXX="$(CXX)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" PYTHON="$(PYTHON)"
# Flags for building universal binaries. See
# http://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/compiling/chapter_4_section_3.html.
UNIVERSAL_CONFIGURE_ARGS = --disable-dependency-tracking
UNIVERSAL_CC = gcc
UNIVERSAL_CXX = g++
# Setting ARCHFLAGS separately is required. distutils.util.get_platform
# sniffs it to determine whether to return a universal architecture
# ("fat" or "universal") or a single one ("i386" or "ppc"). py2app in
# turn uses the arch value to decide which of its bootstrappers to
# install.
UNIVERSAL_ARCHFLAGS = -arch x86_64
UNIVERSAL_CPPFLAGS = -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(OSX_VERSION).sdk
UNIVERSAL_CFLAGS = $(UNIVERSAL_CPPFLAGS) -mmacosx-version-min=$(OSX_MIN_VERSION) $(UNIVERSAL_ARCHFLAGS)
UNIVERSAL_CXXFLAGS = $(UNIVERSAL_CFLAGS)
# https://stackoverflow.com/questions/19637164/c-linking-error-after-upgrading-to-mac-os-x-10-9-xcode-5-0-1/19637199#19637199
UNIVERSAL_LDFLAGS = -stdlib=libstdc++ -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(OSX_VERSION).sdk -mmacosx-version-min=$(OSX_MIN_VERSION) $(UNIVERSAL_ARCHFLAGS)
CC = $(UNIVERSAL_CC)
CXX = $(UNIVERSAL_CXX)
ARCHFLAGS += $(UNIVERSAL_ARCHFLAGS)
CONFIGURE_ARGS += $(UNIVERSAL_CONFIGURE_ARGS)
CPPFLAGS += $(UNIVERSAL_CPPFLAGS)
CFLAGS += $(UNIVERSAL_CFLAGS)
CXXFLAGS += $(UNIVERSAL_CXXFLAGS)
LDFLAGS += $(UNIVERSAL_LDFLAGS)
CFLAGS = -mmacosx-version-min=$(OSX_MIN_VERSION)
CXXFLAGS = -mmacosx-version-min=$(OSX_MIN_VERSION)
# Jhbuild static libraries
PYTHON = $(JHBUILD_PREFIX)/bin/python2.7
PYTHON = $(JHBUILD_PREFIX)/bin/python3
OPENSSL_STATIC = $(JHBUILD_PREFIX)/lib/libssl.a $(JHBUILD_PREFIX)/lib/libcrypto.a
LIBZ_STATIC = $(JHBUILD_PREFIX)/lib/libz.a
@@ -135,7 +111,7 @@ $(IMAGE_STAGING_DIR)/$(PKG_NAME): check-nmap check-ncat check-ndiff check-zenmap
mv $(NAME_VERSION).mpkg $(NAME_VERSION)/$(NAME_VERSION).mpkg
check-%: stage-%
if (find $*-root -perm -a+x -type f | xargs otool -L | grep -F "$(JHBUILD_PREFIX)"); then false; else echo "Libs are clean"; fi
(find $*-root -perm -a+x -type f | xargs otool -L | awk '/:$$/{e=$$0}index($$0,"$(JHBUILD_PREFIX)"){x=1;print e; print}END{exit x}') && echo "Libs are clean"
export-%:
rm -rf $*

View File

@@ -1,6 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE moduleset SYSTEM "moduleset.dtd" [
<!ENTITY nmap_version "7.92">
<!ENTITY nmap_version "7.93SVN">
<!ENTITY openssl_version "3.0.8">
]>
<?xml-stylesheet type="text/xsl" href="moduleset.xsl"?>
<moduleset>
@@ -17,14 +18,14 @@
<!-- MODULES -->
<!-- no-asm added to support building OpenSSL 3.0 on HighSierra. When upgrading to newer build system, remove it. -->
<autotools id="openssl" autogen-sh="Configure" autogenargs="shared no-asm enable-ssl3 enable-ssl3-method enable-weak-ssl-ciphers"
<autotools id="openssl" autogen-sh="Configure" autogenargs="shared enable-ssl3 enable-ssl3-method enable-weak-ssl-ciphers"
autogen-template="%(srcdir)s/%(autogen-sh)s --prefix=%(prefix)s
--openssldir=%(prefix)s/etc/ssl %(autogenargs)s"
makeargs="depend all"
makeinstallargs="INSTALL_PREFIX='$(DESTDIR)' install_dev"
supports-parallel-builds="no"
supports-non-srcdir-builds="no">
<branch repo="openssl" version="3.0.5" module="openssl-3.0.5.tar.gz"/>
<branch repo="openssl" version="&openssl_version;" module="openssl-&openssl_version;.tar.gz"/>
</autotools>
<autotools id="nmap" supports-non-srcdir-builds="no"

View File

@@ -1,4 +1,4 @@
#!/bin/sh -e
#!/bin/bash -e
set -x
test "x$UNDER_JHBUILD" = "x" && exit 1
@@ -14,49 +14,69 @@ export ZENMAP_BUILD_DIR
BASE=$ZENMAP_DIST_DIR/$APP_NAME.app/Contents
SCRIPT_DIR=`dirname "$0"`
CC=${CC:-clang}
CFLAGS=${CFLAGS:--Wall -arch i386}
echo "Running $0."
echo "Removing old build."
rm -rf "$ZENMAP_DIST_DIR" "$ZENMAP_BUILD_DIR"
echo "Building bundle"
gtk-mac-bundler "$SCRIPT_DIR/zenmap.bundle"
echo "Building python-launcher"
$CC $CPPFLAGS $CFLAGS $LDFLAGS -L$PREFIX/lib `python3-config --cflags --ldflags --embed` \
-o $PREFIX/bin/zenmap-launcher \
~/gtk-mac-bundler/examples/python-launcher.c
echo "Generating dependencies"
# Have to run this with ~/gtk/inst/python3 or deps have wrong paths
python3 "$SCRIPT_DIR/../utils/get_deps.py" "$SCRIPT_DIR/pyreqs.xml"
# gtk-mac-bundler (xml.dom.minidom) doesn't expand external entities
xmllint --format --noent "$SCRIPT_DIR/zenmap.bundle" > "$SCRIPT_DIR/tmp.bundle"
echo "Building bundle"
gtk-mac-bundler "$SCRIPT_DIR/tmp.bundle"
echo "Removing unneeded items"
# GIR files not needed, only typelib
rm -rf $BASE/Resources/share/gir-1.0/
echo "Creating caches"
pushd "$BASE/Resources"
export GDK_PIXBUF_MODULEDIR=$(ls - lib/gdk-pixbuf-2.0/2.*/loaders)
gdk-pixbuf-query-loaders > "$GDK_PIXBUF_MODULEDIR".cache
gtk-update-icon-cache share/icons/hicolor
popd
# echo "Compiling Python to bytecode"
PYTHONLIB=$(ls -d $BASE/Resources/lib/python3.*)
# Remove compiled bytecode, recompile in legacy locations, allowing for removal of source.
# See PEP-3147
find "$PYTHONLIB" -depth \( -name 'zenmap*' -o -name 'radialnet' \) -prune -o -name __pycache__ -exec rm -rf '{}' \;
python -m compileall -b -x 'zenmapGUI|zenmapCore|radialnet' "$PYTHONLIB"
# Remove source if compiled is available, except for Zenmap itself:
find "$PYTHONLIB" \( -name 'zenmap*' -o -name 'radialnet' \) -prune -o \( -name '*.pyc' -print \) | while read pyc; do
rm -f "${pyc%.pyc}.py"
done
# Now compile Zenmap using default (not legacy) location.
# If we had used legacy location, python.exe tries to write out the PEP-3147
# location anyway when source is available.
python -m compileall "$PYTHONLIB"/site-packages #|| true
echo "Stripping unoptimized Python libraries"
#Remove some stuff that is unneeded. This cuts 40M off the installed size.
rm -rf $BASE/Resources/lib/python2.7/test/
rm -rf $BASE/Resources/lib/python2.7/config/
rm -rf $BASE/Resources/lib/python2.7/idlelib/
rm -rf $BASE/Resources/lib/python2.7/lib-tk/
rm -rf $BASE/Resources/lib/python2.7/lib2to3/
rm -f $BASE/Resources/lib/python2.7/site-packages/*.a
find "$BASE/Resources/lib/python2.7" -type f -name '*.py' | while read py; do
# If the .pyc exists, delete the .py
test -f "${py}c" && rm -v "$py"
done
find "$BASE/Resources/lib/python2.7" -type f -name '*.pyo' | while read py; do
# If the .pyc exists, delete the .pyo
test -f "${py/%o/c}" && rm -v "$py"
done
echo "Building using distutils"
python setup.py build --executable "/usr/bin/env python"
python setup.py install vanilla --prefix "$BASE/Resources"
$PYTHON setup.py build --executable "/usr/bin/env python3"
$PYTHON setup.py install vanilla --prefix "$BASE/Resources"
echo "Renaming main Zenmap executable."
mv $BASE/MacOS/$APP_NAME $BASE/MacOS/zenmap.bin
# This is a dummy script, so we'll clean it up:
rm $BASE/MacOS/$APP_NAME-bin
#rm $BASE/MacOS/$APP_NAME-bin
echo "Compiling and installing authorization wrapper."
echo $CC $CPPFLAGS $CFLAGS $LDFLAGS -v "$SCRIPT_DIR/zenmap_auth.m" -lobjc -framework Foundation -o "$BASE/MacOS/$APP_NAME"
$CC $CPPFLAGS $CFLAGS $LDFLAGS -v "$SCRIPT_DIR/zenmap_auth.m" -lobjc -framework Foundation -o "$BASE/MacOS/$APP_NAME"
echo $CC $CPPFLAGS $OBJCFLAGS $LDFLAGS -v "$SCRIPT_DIR/zenmap_auth.m" -lobjc -framework Foundation -o "$BASE/MacOS/$APP_NAME"
$CC $CPPFLAGS $OBJCFLAGS $LDFLAGS -v "$SCRIPT_DIR/zenmap_auth.m" -lobjc -framework Foundation -o "$BASE/MacOS/$APP_NAME"
echo "Filling out Info.plist"
python - "$SCRIPT_DIR/Info.plist" >"$BASE/Info.plist" <<'EOF'
$PYTHON - "$SCRIPT_DIR/Info.plist" >"$BASE/Info.plist" <<'EOF'
import sys
from string import Template
from zenmapCore.Version import *

View File

@@ -1,4 +1,8 @@
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE app-bundle [
<!ENTITY PYVER "3.10">
<!ENTITY pyreqs SYSTEM "pyreqs.xml">
]>
<app-bundle>
<meta>
@@ -23,14 +27,14 @@
<!-- Comment this out to keep the install names in binaries. -->
<run-install-name-tool/>
<!--A launcher script is pretty much mandatory here so that we can
<!-- REMOVED: A launcher script is pretty much mandatory here so that we can
set $PYTHON to point to the python in the bundle.
-->
<launcher-script>${project}/launcher.sh</launcher-script>
-->
<!-- Indicate the active gtk version to use. This is needed only
for gtk+-3.0 projects. -->
<!--gtk>gtk+-2.0</gtk-->
<gtk>gtk+-3.0</gtk>
</meta>
<!-- The special macro "${project}" refers to the directory where
@@ -39,92 +43,83 @@
-->
<plist>${project}/Info.plist</plist>
<!-- This is mandatory, and the result gets named to the appname from
Info.plist with bin tacked on the end, in this example,
PyGtkDemo-bin. Bundler won't let us use the one from $project,
so we use the original and ignore it. If your original will work
in the bundle, you can use this instead.-->
<!-- See examples/python-launcher.bundle for info on entitlements if needed -->
<!-- NEW! -->
<!-- Build gramps-launcher with:
gcc -L$PREFIX/lib `python-config -\-cflags -\-ldflags` \
-o $PREFIX/bin/python-launcher \
path/to/gtk-mac-bundler/examples/python-launcher.c
with the obvious substitution.
-->
<main-binary>
${prefix}/bin/pygtk-demo
${prefix}/bin/zenmap-launcher
</main-binary>
<!-- We need to pack our own Python to avoid compatibility problems. -->
<binary dest="${bundle}/Contents/MacOS">
${prefix}/bin/python
${prefix}/bin/python3
</binary>
<!-- Copy in libpyglib, which will pull in other dependencies we need -->
<binary>
${prefix}/lib/libpyglib-2.0-python2.0.dylib
</binary>
<!-- Gtk+ is required by python modules which aren't searched for
dependencies, so we have to pull it in explicitly. It will
bring Pango and Cairo with it. Note the use of ${gtkversion},
which expands to either 2.0 or 3.0, depending on which value of
gtk is specified.-->
<binary>
${prefix}/lib/libgtk-quartz-${gtkversion}.0.dylib
</binary>
<!-- Copy in GTK+ modules. Note the ${gtkdir} macro, which expands
to the correct library subdirectory for the specified gtk
version.
-->
<binary>
${prefix}/lib/${gtkdir}/modules/*.so
</binary>
<!-- Copy in GTK+ theme engines and print backends. Note the use of the
<!-- Copy in GTK+ modules. Note the use of the
"${pkg:module:variable}" macro, which evaluates to a pkg-config
variable in the specified module. Note that any libraries that
binaries link to are also copied in automatically. Note also
the included ${gtk} macro, which gets the correct package name
to get. -->
binaries link to are also copied in automatically.
-->
<!-- PNG is built-in -->
<binary>
${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/engines/*.so
${prefix}/lib/gdk-pixbuf-2.0/${pkg:gdk-pixbuf-2.0:gdk_pixbuf_binary_version}/loaders/libpixbufloader-gif.so
</binary>
<!-- Copy in the quartz input method. The rest aren't used on MacOS. -->
<binary>
${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/immodules/im-quartz.so
</binary>
<!-- And the print backends -->
<binary>
${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/printbackends/*.so
</binary>
<!-- Starting with 2.24, gdk-pixbuf installs into its own directory. -->
<!-- Python modules other than tnese are grabbed with get_deps.py -->
<binary>
${prefix}/lib/gdk-pixbuf-2.0/${pkg:gdk-pixbuf-2.0:gdk_pixbuf_binary_version}/loaders/*.so
${prefix}/lib/python&PYVER;/site-packages/gi/*.so
</binary>
<binary>
${prefix}/lib/python&PYVER;/site-packages/cairo/*.so
</binary>
<!-- Translation filenames, one for each program or library that you
want to copy in to the bundle. The "dest" attribute is
optional, as usual. Bundler will find all translations of that
library/program under the indicated directory and copy them.-->
<translations name="gtk20">
${prefix}/share/locale
</translations>
&pyreqs;
<binary>
${prefix}/lib/libgtkmacintegration-gtk3.dylib
</binary>
<!-- We have to pull in the python modules, which are mixed python
and loadable modules. -->
<binary>${prefix}/lib/python2.7/lib-dynload/*.so</binary>
<binary>${prefix}/lib/python2.7/site-packages/*.so</binary>
<binary>${prefix}/lib/python2.7/site-packages/cairo/*.so</binary>
<binary>${prefix}/lib/python2.7/site-packages/glib/*.so</binary>
<binary>${prefix}/lib/python2.7/site-packages/gobject/*.so</binary>
<binary>${prefix}/lib/python2.7/site-packages/gtk-2.0/*.so</binary>
<binary>${prefix}/lib/python2.7/site-packages/gtk-2.0/gio/*.so</binary>
<binary>${prefix}/lib/python2.7/site-packages/gtk-2.0/gtk/*.so</binary>
<binary>${prefix}/lib/python2.7/site-packages/gtkosx_application/*.so</binary>
<!-- Pending this pull request: https://github.com/GNOME/gtk-mac-bundler/pull/1
Without it, this data block will overwrite the binaries above, undoing
the work of the run-install-name-tool option. -->
<data>
${prefix}/lib/python2.7/
<gir> ${prefix}/share/gir-1.0/Atk-1.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/GLib-2.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/GModule-2.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/GObject-2.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/Gdk-3.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/GdkPixbuf-2.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/Gio-2.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/Gtk-3.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/HarfBuzz-0.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/Pango-1.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/PangoCairo-1.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/PangoOT-1.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/cairo-1.0.gir </gir>
<gir> ${prefix}/share/gir-1.0/freetype2-2.0.gir </gir>
<!-- This python file sets up all of the environment variables
needed to run your program. The example contains those
necessary for running a basic Gtk program. -->
<data dest="${bundle}/Contents/Resources">
${project}/zenmap_launcher.py
</data>
<!-- Copy in the themes data. You may want to trim this to save space
in your bundle. -->
<data>
${prefix}/share/themes
${prefix}/share/glib-2.0/schemas
</data>
<!-- Copy icons. Note that the .icns file is an Apple format which
contains up to 4 sizes of icon. You can use
/Developer/Applications/Utilities/Icon Composer.app to import
@@ -133,14 +128,6 @@
${project}/zenmap.icns
</data>
<!-- This is where theme commands go. You can copy them in from your
theme of choice if they provide and example, or you can just
change the source path. -->
<data dest="${bundle}/Contents/Resources/etc/${gtkdir}/gtkrc">
${project}/gtkrc
</data>
<!-- Icon themes to copy. The "icons" property can be either of
"auto", "all", or "none". All or none should be
self-explanatory, while auto means that the script will try to
@@ -150,7 +137,7 @@
if you want just the index.theme file but no icons, mostly
needed for the "hicolor" base theme.
>
<icon-theme icons="auto">
<icon-theme icons="none">
Tango
</icon-theme -->

View File

@@ -0,0 +1,43 @@
from os.path import join, dirname, abspath, normpath
import sys, os
import platform
bundlepath = sys.argv[0]
bundle_contents = join(bundlepath, 'Contents')
bundle_res = join(bundle_contents, 'Resources')
bundle_lib = join(bundle_res, 'lib')
bundle_bin = join(bundle_res, 'bin')
bundle_data = join(bundle_res, 'share')
bundle_etc = join(bundle_res, 'etc')
os.environ['XDG_DATA_DIRS'] = bundle_data
os.environ['DYLD_LIBRARY_PATH'] = bundle_lib
os.environ['LD_LIBRARY_PATH'] = bundle_lib
os.environ['GTK_DATA_PREFIX'] = bundle_res
os.environ['GTK_EXE_PREFIX'] = bundle_res
os.environ['GTK_PATH'] = bundle_res
os.environ['PANGO_RC_FILE'] = join(bundle_etc, 'pango', 'pangorc')
os.environ['PANGO_SYSCONFDIR'] = bundle_etc
os.environ['PANGO_LIBDIR'] = bundle_lib
os.environ['GDK_PIXBUF_MODULE_FILE'] = join(bundle_lib, 'gdk-pixbuf-2.0',
'2.10.0', 'loaders.cache')
if int(platform.release().split('.')[0]) > 10:
os.environ['GTK_IM_MODULE_FILE'] = join(bundle_etc, 'gtk-3.0',
'gtk.immodules')
os.environ['GI_TYPELIB_PATH'] = join(bundle_lib, 'girepository-1.0')
#Set $PYTHON to point inside the bundle
PYVER = 'python3.10'
sys.path.append(bundle_res)
os.environ['USERPROFILE'] = os.environ['HOME']
os.environ['APPDATA'] = join(os.environ['HOME'], 'Library', 'Application Support')
# Replace my_app with the file or module with your main() function.
from zenmapGUI import App
App.run()

View File

@@ -7,16 +7,16 @@ import os.path
import site
import encodings
site_package_deps = ("zenmapCore", "zenmapGUI", "radialnet", "gi", "cairo")
site_package_deps = ("gi", "cairo")
# These items are unneeded, large, and on macOS _ssl causes dependency problems.
pyd_remove = ("_decimal", "_ssl", "_testcapi")
pyd_remove = ("_decimal", "_ssl", "_testcapi", "_hashlib")
def module_paths(mods):
for m in mods:
if m.__name__ in pyd_remove:
continue
elif getattr(m, "__file__", None) and ('..' not in m.__file__):
elif getattr(m, "__file__", None) and not m.__file__.endswith("zenmap"):
yield m.__file__
def get_deps():
@@ -31,12 +31,12 @@ def get_deps():
# Now use modulefinder to get the rest
mfind = modulefinder.ModuleFinder()
mfind.run_script('../../zenmap')
mfind.run_script(os.path.normpath(__file__ + '/../../../zenmap'))
for path in module_paths(mfind.modules.values()):
parent = os.path.dirname(path)
found_parent = False
# If a parent dir is already included, don't bother listing the file.
while parent not in sys.path:
while parent not in sys.path and len(parent) > 2:
if parent in files:
found_parent = True
break
@@ -59,6 +59,14 @@ def update_cfg(cfg, files):
oldvalue = cfg.get('bundle', 'nodelete')
cfg.set('bundle', 'nodelete', oldvalue + "\nmingw*" + filestr)
def write_xml(filename, files):
with open(filename, "w") as f:
for file in files:
fname = r"${prefix}" + file.removeprefix(sys.prefix)
fmt = "<data>{}</data>"
if file.endswith(".so"):
fmt = "<binary>{}</binary>"
print(fmt.format(fname), file=f)
if __name__ == "__main__":
files = get_deps()
@@ -66,6 +74,7 @@ if __name__ == "__main__":
cfg = read_cfg(sys.argv[2])
update_cfg(cfg, files)
write_cfg(cfg, sys.argv[1])
#elif sys.platform == "darwin":
elif sys.platform == "darwin":
write_xml(sys.argv[1], files)
else:
raise NotImplementedError

View File

@@ -145,15 +145,15 @@ nodelete =
# Zenmap's files (mostly in site-packages above)
mingw*/share/zenmap
# mingw*/bin/zenmap
mingw*/lib/python3.*/site-packages/zenmapCore
mingw*/lib/python3.*/site-packages/zenmapGUI
mingw*/lib/python3.*/site-packages/radialnet
# The python modules here will be added by script:
# mingw*/lib/python3.*
# mingw*/lib/python3.*/encodings
# mingw*/lib/python3.*/site.py
# mingw*/lib/python3.*/_sitebuiltins.py
# mingw*/lib/python3.*/site-packages/zenmapCore
# mingw*/lib/python3.*/site-packages/zenmapGUI
# mingw*/lib/python3.*/site-packages/radialnet
# mingw*/lib/python3.*/site-packages/gi
# mingw*/lib/python3.*/site-packages/cairo