summaryrefslogtreecommitdiff
path: root/Ubuntu/executable.md
blob: 9ac54a16c93e885995e6c8f13e75e37b87bcab2d (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
84
85
86
87
88
89
90
91
92
93
94
NGHDL Executable (Ubuntu OS)
====

> Note: It is not updated for the recently ported GUI to PyQt5 and Ubuntu 20.04 LTS. Currently, packaging for Ubuntu OS is done directly with the source code and not the executable.

It contains the documentation for making NGHDL executable using PyInstaller on Ubuntu 16.04 and above.


## Freeze NGHDL source code:

1. Download `virtualenv` package and create virtual environment as:

        $ pip install virtualenv
        $ virtualenv -p /usr/bin/python3 nghdl

            OR
        
        $ sudo apt install -y python3-venv
        $ python3 -m venv nghdl

2. Activate the virtual environment as:
    
        $ source nghdl/bin/activate

3. Install all Python dependencies for NGHDL within the virtual environment as:

        $ pip install wheel
        $ pip install pyinstaller
        $ pip install --upgrade 'setuptools<45.0.0'
        $ sudo apt install build-essential python3-dev libqt4-dev qt4-dev-tools
        $ mkdir nghdl/build
        $ cd nghdl/build/
        $ wget http://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.12.3/PyQt4_gpl_x11-4.12.3.tar.gz
        $ wget https://www.riverbankcomputing.com/static/Downloads/sip/4.19.21/sip-4.19.21.tar.gz
        $ tar xzvf sip-4.19.21.tar.gz
        $ tar xvzf PyQt4_gpl_x11-4.12.3.tar.gz
        $ cd sip-4.19.21/
        $ python configure.py --sip-module PyQt4.sip
        $ make
        $ make install
        $ cd ../PyQt4_gpl_x11-4.12.3/
        $ python configure.py
        $ make
        $ make install

4. Now uninstall PyQt4, sip, matplotlib, numpy, dateutil and cycler globally (if any).

5. Test whether only NGHDL dependencies are available or not:

        $ pip freeze

> Note : Following dependencies should be available -
>   - PyQt4
>   - sip

6. Create spec file as:

        $ pyi-makespec --onefile -n nghdl <path_to_nghdl>/src/ngspice_ghdl.py

7. Add `PyQt4.sip` as hiddenimports in the generated spec file.

8. Create onefile executable using pyinstaller as:
        
        $ pyinstaller -F --clean nghdl.spec

9. Verify whether all NGHDL `src` files (`*.py`) have been included in `Analysis-00.toc` file under the build folder generated by PyInstaller.


## Fully-Static Bundled Version of NGHDL:

1. To create a [fully-static bundled version](https://github.com/pyinstaller/pyinstaller/wiki/FAQ#GNULinux) of NGHDL (through PyInstaller), use a tool like [StaticX](https://github.com/JonathonReinhart/staticx/).

2. To create fully-static NGHDL :

    - Activate the virtual environment as:
    
        $ source nghdl/bin/activate

    - Install StaticX as:

        $ pip install staticx
        $ pip install patchelf-wrapper

    - Create static NGHDL as:

        $ staticx /path/to/executable/nghdl /path/to/output/executable/nghdl

3. To verify if all dynamic libraries are removed :
    
    - Type following command in a terminal :

        $ ldd path/to/output/executable/nghdl

    - Output of above command should be similar to `    not a dynamic executable`