summaryrefslogtreecommitdiff
path: root/Ubuntu
diff options
context:
space:
mode:
Diffstat (limited to 'Ubuntu')
-rwxr-xr-xUbuntu/README.md32
-rw-r--r--Ubuntu/eSim.spec34
-rw-r--r--Ubuntu/executable.md101
-rwxr-xr-xUbuntu/install-eSim.sh388
4 files changed, 555 insertions, 0 deletions
diff --git a/Ubuntu/README.md b/Ubuntu/README.md
new file mode 100755
index 00000000..b4a6cb8b
--- /dev/null
+++ b/Ubuntu/README.md
@@ -0,0 +1,32 @@
+eSim Installer (Ubuntu OS)
+====
+
+It contains the documentation to packaging eSim and making binaries for distribution.
+
+> Note: If planning to freeze the eSim source code for a target platform (Ubuntu OS), then refer this [documentation](executable.md).
+
+
+## How to package eSim for Ubuntu OS?
+
+1. Take the `master` branch containing the source code. Rename the folder to `eSim-<version>`.
+
+2. Add the installer script `install-eSim.sh` in `eSim-<version>` folder.
+
+3. Add the eSim executable (if available) in `eSim-<version>` folder. Also, remove following files from the folder:
+ - `.git` folder
+ - `code` folder
+ - `src` folder (Applicable only if eSim executable is used)
+ - conf.py
+ - setup.py
+ - index.rst
+ - requirement.txt
+ - .gitignore
+ - .travis.yml
+
+4. Add the zip file of `NGHDL` (`nghdl.zip`) in the eSim folder.
+
+> Note: Refer this [documentation](https://github.com/fossee/nghdl/tree/installers/Ubuntu/README.md) on packaging of NGHDL for Ubuntu OS.
+
+5. Compress `kicadLibrary` folder to a `tar.xz` format.
+
+6. Compress `eSim-<version>` to a zip format for distribution.
diff --git a/Ubuntu/eSim.spec b/Ubuntu/eSim.spec
new file mode 100644
index 00000000..15061f6b
--- /dev/null
+++ b/Ubuntu/eSim.spec
@@ -0,0 +1,34 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+block_cipher = None
+
+a = Analysis(['eSim-2.0/src/frontEnd/Application.py'],
+ pathex=['/home/rahul/Music'],
+ binaries=[],
+ datas=[],
+ hiddenimports=['PyQt4.sip'],
+ hookspath=[],
+ runtime_hooks=[],
+ excludes=[],
+ win_no_prefer_redirects=False,
+ win_private_assemblies=False,
+ cipher=block_cipher,
+ noarchive=False)
+pyz = PYZ(a.pure, a.zipped_data,
+ cipher=block_cipher)
+exe = EXE(pyz,
+ a.scripts,
+ a.binaries,
+ a.zipfiles,
+ a.datas,
+ [],
+ name='eSim',
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=True,
+ upx_exclude=[],
+ runtime_tmpdir=None,
+ console=True,
+ version='eSim-2.0/VERSION',
+ icon='eSim-2.0/images/logo.png')
diff --git a/Ubuntu/executable.md b/Ubuntu/executable.md
new file mode 100644
index 00000000..435ed88a
--- /dev/null
+++ b/Ubuntu/executable.md
@@ -0,0 +1,101 @@
+eSim 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 eSim executable using PyInstaller on Ubuntu 16.04 and above.
+
+
+## Freeze eSim source code:
+
+> Note: pip tool corresponds to Python-3.5.2 on Ubuntu 16.04 and Python-3.6.9 on Ubuntu 18.04
+
+1. Download `virtualenv` package and create virtual environment as:
+
+ $ pip install virtualenv
+ $ virtualenv -p /usr/bin/python3 eSim
+
+ OR
+
+ $ sudo apt install -y python3-venv
+ $ python3 -m venv eSim
+
+2. Activate the virtual environment as:
+
+ $ source eSim/bin/activate
+
+3. Install all Python dependencies for eSim within the virtual environment as:
+
+ $ pip install wheel
+ $ pip install pyinstaller
+ $ pip install --upgrade 'matplotlib==3.0.3'
+ $ pip install tornado
+ $ pip install --upgrade 'setuptools<45.0.0'
+ $ sudo apt install build-essential python3-dev libqt4-dev qt4-dev-tools
+ $ mkdir eSim/build
+ $ cd eSim/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. Test whether only eSim dependencies are available or not:
+
+ $ pip freeze
+
+> Note : Following dependencies should be available -
+> - PyQt4
+> - matplotlib
+> - numpy
+> - dateutil
+> - pyparsing
+> - six
+> - cycler.py
+
+5. Create spec file as:
+
+ $ pyi-makespec --onefile -n eSim <path_to_eSim>/src/frontEnd/Application.py
+
+6. Add `PyQt4.sip` as hiddenimports in the generated spec file.
+
+7. Create onefile executable using pyinstaller as:
+
+ $ pyinstaller -F --clean eSim.spec
+
+8. Verify whether all eSim `src` files (`*.py`) have been included in `Analysis-00.toc` file under the build folder generated by PyInstaller.
+
+
+## Fully-Static Bundling of eSim Executable:
+
+1. To create a [fully-static bundled version](https://github.com/pyinstaller/pyinstaller/wiki/FAQ#GNULinux) of eSim (through PyInstaller), use a tool like [StaticX](https://github.com/JonathonReinhart/staticx/).
+
+2. To create fully-static eSim :
+
+ - Activate the virtual environment as:
+
+ $ source eSim/bin/activate
+
+ - Install StaticX as:
+
+ $ pip install staticx
+ $ pip install patchelf-wrapper
+
+ - Create static eSim as:
+
+ $ staticx /path/to/executable/eSim /path/to/output/executable/eSim
+
+3. To verify if all dynamic libraries are removed :
+
+ - Type following command in a terminal :
+
+ $ ldd path/to/output/executable/eSim
+
+ - Output of above command should be similar to ` not a dynamic executable`
diff --git a/Ubuntu/install-eSim.sh b/Ubuntu/install-eSim.sh
new file mode 100755
index 00000000..74d59992
--- /dev/null
+++ b/Ubuntu/install-eSim.sh
@@ -0,0 +1,388 @@
+#!/bin/bash
+#===============================================================================
+# FILE: install-eSim.sh
+#
+# USAGE: ./install-eSim.sh --install
+# OR
+# ./install-eSim.sh --uninstall
+#
+# DESCRIPTION: Installation script for eSim EDA Suite
+#
+# OPTIONS: ---
+# REQUIREMENTS: ---
+# BUGS: ---
+# NOTES: ---
+# AUTHOR: Fahim Khan, Rahul Paknikar, Saurabh Bansode
+# ORGANIZATION: eSim Team, FOSSEE, IIT Bombay
+# CREATED: Wednesday 15 July 2015 15:26
+# REVISION: Sunday 02 August 2020 01:26
+#===============================================================================
+
+set -e # Set exit option immediately on error
+set -E # inherit ERR trap by shell functions
+
+error_exit() {
+ echo -e "\n\nError! Kindly resolve above error(s) and try again."
+ echo -e "\nAborting Installation...\n"
+}
+
+# Trap on function error_exit before exiting on error
+trap error_exit ERR
+
+
+# All variables goes here
+config_dir="$HOME/.esim"
+config_file="config.ini"
+eSim_Home=`pwd`
+ngspiceFlag=0
+
+## All Functions goes here
+
+function createConfigFile
+{
+
+ # Creating config.ini file and adding configuration information
+ # Check if config file is present
+ if [ -d $config_dir ];then
+ rm $config_dir/$config_file && touch $config_dir/$config_file
+ else
+ mkdir $config_dir && touch $config_dir/$config_file
+ fi
+
+ echo "[eSim]" >> $config_dir/$config_file
+ echo "eSim_HOME = $eSim_Home" >> $config_dir/$config_file
+ echo "LICENSE = %(eSim_HOME)s/LICENSE" >> $config_dir/$config_file
+ echo "KicadLib = %(eSim_HOME)s/library/kicadLibrary.tar.xz" >> $config_dir/$config_file
+ echo "IMAGES = %(eSim_HOME)s/images" >> $config_dir/$config_file
+ echo "VERSION = %(eSim_HOME)s/VERSION" >> $config_dir/$config_file
+ echo "MODELICA_MAP_JSON = %(eSim_HOME)s/library/ngspicetoModelica/Mapping.json" >> $config_dir/$config_file
+
+}
+
+
+function installNghdl
+{
+
+ echo "Installing NGHDL..........................."
+ unzip -o nghdl.zip
+ cd nghdl/
+ chmod +x install-nghdl.sh
+
+ # Do not trap on error of any command. Let NGHDL script handle its own errors.
+ trap "" ERR
+
+ ./install-nghdl.sh --install # Install NGHDL
+
+ # Set trap again to error_exit function to exit on errors
+ trap error_exit ERR
+
+ ngspiceFlag=1
+ cd ..
+
+}
+
+
+function addKicadPPA
+{
+
+ #sudo add-apt-repository ppa:js-reynaud/ppa-kicad
+ kicadppa="reynaud/kicad-4"
+ findppa=$(grep -h -r "^deb.*$kicadppa*" /etc/apt/sources.list* > /dev/null 2>&1 || test $? = 1)
+ if [ -z "$findppa" ]; then
+ echo "Adding KiCad-4 PPA to local apt-repository"
+ if [[ $(lsb_release -rs) == 20.* ]]; then
+ sudo add-apt-repository --yes "deb http://ppa.launchpad.net/js-reynaud/kicad-4/ubuntu bionic main"
+ sudo touch /etc/apt/preferences.d/preferences
+ echo "Package: kicad" | sudo tee -a /etc/apt/preferences.d/preferences > /dev/null
+ echo "Pin: version 4.0.7*" | sudo tee -a /etc/apt/preferences.d/preferences > /dev/null
+ echo "Pin-Priority: 501" | sudo tee -a /etc/apt/preferences.d/preferences > /dev/null
+ sudo add-apt-repository --yes "deb http://in.archive.ubuntu.com/ubuntu/ bionic main universe"
+ else
+ sudo add-apt-repository --yes ppa:js-reynaud/kicad-4
+ fi
+ else
+ echo "KiCad-4 is available in synaptic"
+ fi
+
+}
+
+
+function installDependency
+{
+
+ #Update apt repository
+ echo "Updating apt index files..................."
+ sudo apt-get update
+
+ echo "Installing Xterm..........................."
+ sudo apt-get install -y xterm
+
+ echo "Installing PyQt5..........................."
+ sudo apt-get install -y python3-pyqt5
+
+ echo "Installing Matplotlib......................"
+ sudo apt-get install -y python3-matplotlib
+
+ if [[ $(lsb_release -rs) != 16.* ]]; then
+ echo "Installing Distutils......................."
+ sudo apt-get install python3-distutils
+ fi
+
+ echo "Installing KiCad..........................."
+ sudo apt-get install -y --no-install-recommends kicad
+ if [[ $(lsb_release -rs) == 20.* ]]; then
+ sudo add-apt-repository -r "deb http://in.archive.ubuntu.com/ubuntu/ bionic main universe"
+ fi
+
+}
+
+
+function copyKicadLibrary
+{
+
+ if [ -d ~/.config/kicad ];then
+ echo "kicad folder already exists"
+ else
+ echo ".config/kicad does not exist"
+ mkdir ~/.config/kicad
+ fi
+
+ # Dump KiCad config path
+ echo "$HOME/.config/kicad" > $eSim_Home/library/supportFiles/kicad_config_path.txt
+
+ #Copy fp-lib-table for switching modes
+ cp -r library/supportFiles/fp-lib-table ~/.config/kicad/
+ cp -r library/supportFiles/fp-lib-table-online ~/.config/kicad/
+ echo "fp-lib-table copied in the directory"
+
+ #Extract custom KiCad Library
+ tar -xJf library/kicadLibrary.tar.xz
+
+ #Copy KiCad libraries
+ echo "Copying KiCad libraries...................."
+
+ sudo cp -r kicadLibrary/library /usr/share/kicad/
+ sudo cp -r kicadLibrary/modules /usr/share/kicad/
+ sudo cp -r kicadLibrary/template/* /usr/share/kicad/template/
+
+ #Copy KiCad library made for eSim
+ sudo cp -r kicadLibrary/kicad_eSim-Library/* /usr/share/kicad/library/
+
+ # Full path of 'kicad.pro file'
+ KICAD_PRO="/usr/share/kicad/template/kicad.pro"
+ KICAD_ORIGINAL="/usr/share/kicad/template/kicad.pro.original"
+
+ if [ -f "$KICAD_ORIGINAL" ];then
+ echo "kicad.pro.original file found"
+ sudo cp -rv kicadLibrary/template/kicad.pro ${KICAD_PRO}
+ else
+ echo "Making copy of original file"
+ sudo cp -rv ${KICAD_PRO}{,.original}
+ sudo cp -rv kicadLibrary/template/kicad.pro ${KICAD_PRO}
+ fi
+
+ set +e # Temporary disable exit on error
+ trap "" ERR # Do not trap on error of any command
+
+ # Remove extracted KiCad Library - not needed anymore
+ rm -rf kicadLibrary
+
+ set -e # Re-enable exit on error
+ trap error_exit ERR
+
+ #Change ownership from Root to the User
+ sudo chown -R $USER:$USER /usr/share/kicad/library/
+
+}
+
+
+function createDesktopStartScript
+{
+ # Generating new esim-start.sh
+ echo '#!/bin/bash' > esim-start.sh
+ echo "cd $eSim_Home/src/frontEnd" >> esim-start.sh
+ echo "python3 Application.py" >> esim-start.sh
+
+ # Make it executable
+ sudo chmod 755 esim-start.sh
+ # Copy esim start script
+ sudo cp -vp esim-start.sh /usr/bin/esim
+ # Remove local copy of esim start script
+ rm esim-start.sh
+
+ # Generating esim.desktop file
+ echo "[Desktop Entry]" > esim.desktop
+ echo "Version=1.0" >> esim.desktop
+ echo "Name=eSim" >> esim.desktop
+ echo "Comment=EDA Tool" >> esim.desktop
+ echo "GenericName=eSim" >> esim.desktop
+ echo "Keywords=eda-tools" >> esim.desktop
+ echo "Exec=esim %u" >> esim.desktop
+ echo "Terminal=true" >> esim.desktop
+ echo "X-MultipleArgs=false" >> esim.desktop
+ echo "Type=Application" >> esim.desktop
+ getIcon="$config_dir/logo.png"
+ echo "Icon=$getIcon" >> esim.desktop
+ echo "Categories=Development;" >> esim.desktop
+ echo "MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;x-scheme-handler/chrome;video/webm;application/x-xpinstall;" >> esim.desktop
+ echo "StartupNotify=true" >> esim.desktop
+
+ # Make esim.desktop file executable
+ sudo chmod 755 esim.desktop
+ # Copy desktop icon file to share applications
+ sudo cp -vp esim.desktop /usr/share/applications/
+ # Copy desktop icon file to Desktop
+ cp -vp esim.desktop $HOME/Desktop/
+
+ set +e # Temporary disable exit on error
+ trap "" ERR # Do not trap on error of any command
+
+ # Check if the target OS is Ubuntu 18 or not
+ if [[ $(lsb_release -rs) == 18.* || $(lsb_release -rs) == 20.* ]]; then
+ # Make esim.desktop file as trusted application
+ gio set $HOME/Desktop/esim.desktop "metadata::trusted" true
+ # Set Permission and Execution bit
+ chmod a+x $HOME/Desktop/esim.desktop
+ fi
+
+ # Remove local copy of esim.desktop file
+ rm esim.desktop
+
+ set -e # Re-enable exit on error
+ trap error_exit ERR
+
+ # Copying logo.png to .esim directory to access as icon
+ cp -vp images/logo.png $config_dir
+
+}
+
+
+####################################################################
+# MAIN START FROM HERE #
+####################################################################
+
+### Checking if file is passsed as argument to script
+
+if [ "$#" -eq 1 ];then
+ option=$1
+else
+ echo "USAGE : "
+ echo "./install-eSim.sh --install"
+ echo "./install-eSim.sh --uninstall"
+ exit 1;
+fi
+
+## Checking flags
+
+if [ $option == "--install" ];then
+ echo "Enter proxy details if you are connected to internet thorugh proxy"
+
+ echo -n "Is your internet connection behind proxy? (y/n): "
+ read getProxy
+ if [ $getProxy == "y" -o $getProxy == "Y" ];then
+ echo -n 'Proxy Hostname :'
+ read proxyHostname
+
+ echo -n 'Proxy Port :'
+ read proxyPort
+
+ echo -n username@$proxyHostname:$proxyPort :
+ read username
+
+ echo -n 'Password :'
+ read -s passwd
+
+ unset http_proxy
+ unset https_proxy
+ unset HTTP_PROXY
+ unset HTTPS_PROXY
+ unset ftp_proxy
+ unset FTP_PROXY
+
+ export http_proxy=http://$username:$passwd@$proxyHostname:$proxyPort
+ export https_proxy=http://$username:$passwd@$proxyHostname:$proxyPort
+ export https_proxy=http://$username:$passwd@$proxyHostname:$proxyPort
+ export HTTP_PROXY=http://$username:$passwd@$proxyHostname:$proxyPort
+ export HTTPS_PROXY=http://$username:$passwd@$proxyHostname:$proxyPort
+ export ftp_proxy=http://$username:$passwd@$proxyHostname:$proxyPort
+ export FTP_PROXY=http://$username:$passwd@$proxyHostname:$proxyPort
+
+ echo "Install with proxy"
+ # Calling functions
+ createConfigFile
+ addKicadPPA
+ installDependency
+ copyKicadLibrary
+ installNghdl
+ createDesktopStartScript
+
+ elif [ $getProxy == "n" -o $getProxy == "N" ];then
+ echo "Install without proxy"
+
+ # Calling functions
+ createConfigFile
+ addKicadPPA
+ installDependency
+ copyKicadLibrary
+ installNghdl
+ createDesktopStartScript
+
+ if [ $? -ne 0 ];then
+ echo -e "\n\n\nFreeEDA ERROR: Unable to install required packages. Please check your internet connection.\n\n"
+ exit 0
+ fi
+
+ echo "-----------------eSim Installed Successfully-----------------"
+ echo "Type \"esim\" in Terminal to launch it"
+ echo "or double click on \"eSim\" icon placed on Desktop"
+
+ else
+ echo "Please select the right option"
+ exit 0
+ fi
+
+
+elif [ $option == "--uninstall" ];then
+ echo -n "Are you sure? It will remove eSim completely including KiCad, Ngspice and NGHDL along with their models and libraries (y/n):"
+ read getConfirmation
+ if [ $getConfirmation == "y" -o $getConfirmation == "Y" ];then
+ echo "Removing eSim............................"
+ sudo rm -rf $HOME/.esim $HOME/Desktop/esim.desktop /usr/bin/esim /usr/share/applications/esim.desktop
+ echo "Removing KiCad..........................."
+ sudo apt purge -y kicad
+ sudo rm -rf /usr/share/kicad
+ sudo rm -rf $HOME/.config/kicad
+ rm -f $eSim_Home/library/supportFiles/kicad_config_path.txt
+
+ if [[ $(lsb_release -rs) == 20.* ]]; then
+ sudo sed -i '/Package: kicad/{:label;N;/Pin-Priority: 501/!blabel};/Pin: version 4.0.7*/d' /etc/apt/preferences.d/preferences
+ fi
+
+ echo "Removing NGHDL..........................."
+ rm -rf library/modelParamXML/Nghdl/*
+ cd nghdl/
+ if [ $? -eq 0 ];then
+ chmod +x install-nghdl.sh
+ ./install-nghdl.sh --uninstall
+ cd ../
+ rm -rf nghdl
+ if [ $? -eq 0 ];then
+ echo -e "----------------eSim Uninstalled Successfully----------------"
+ else
+ echo -e "\nError while removing some files/directories in \"nghdl\". Please remove it manually"
+ fi
+ else
+ echo -e "\nCannot find \"nghdl\" directory. Please remove it manually"
+ fi
+ elif [ $getConfirmation == "n" -o $getConfirmation == "N" ];then
+ exit 0
+ else
+ echo "Please select the right option."
+ exit 0
+ fi
+
+else
+ echo "Please select the proper operation."
+ echo "--install"
+ echo "--uninstall"
+fi