diff options
Diffstat (limited to 'Ubuntu')
-rwxr-xr-x | Ubuntu/README.md | 32 | ||||
-rw-r--r-- | Ubuntu/eSim.spec | 34 | ||||
-rw-r--r-- | Ubuntu/executable.md | 101 | ||||
-rwxr-xr-x | Ubuntu/install-eSim.sh | 388 |
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 |