| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- # This script is used to build the uos app package
- # Usage:
- # Just modify the app_name, app_version, app_description, app_author, app_email etc.
- # Rename this file to package_your_app.py (optional)
- # Open command and input 'python3 package_your_app.py'
- # Then the deb file will create in ./bin directory
- # Warning:
- # Your computer should installed 'dh_make', 'python3' and 'linuxdeployqt'
- # If your app_path have directory lib, it won't exec linuxdeployqt~
- # Datetime: 2024/10/17
- import os
- import json
- import shutil
- import glob
- # define your app information
- class App(object):
- app_name = 'SafeBroadClient'
- app_chn_name = 'EQM安播客户端'
- app_id = 'com.hzlh.cas-sbc' # not support upper,just lowwer and digit!
- app_version = '1.0.1.0'
- app_description = '联汇国产化智慧播控系统(EQM)'
- app_author = 'wangfang'
- app_email = 'wangfang@hzlh.com'
- icon_size = '200x200' # support 16/24/32/48/128/256/512
- icon_name = 'logo.ico' # should put it in 'app_path/bin'
- app_path = '/SRC/' # your application path should be 'app_path/bin'!!!
- home_page = 'https://www.hzlh.com'
- depend_lib_path = '' # if needed, it'll add to Environment Path
- # global var
- ROOT_DIR = os.getcwd()
- CURRENT_USER = os.getenv("USER") or os.getenv("LOGNAME")
- #HOME_PATH = os.path.expanduser('~')
- def add_depend_libs_path():
- if App.depend_lib_path != '':
- os.system('export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:' + App.depend_lib_path)
- # switch to directory
- def switch_to_dir(dir_name):
- if not os.path.exists(dir_name):
- os.makedirs(dir_name)
- os.chdir(dir_name)
- # create target directory
- def create_target_dir(dir_name):
- target_dir = dir_name
- if not os.path.exists(target_dir):
- os.makedirs(target_dir)
- return target_dir
- # create a file
- def create_file(file_name):
- with open(file_name, 'w') as f:
- f.write('')
- # create your_app_id-6.0.0 directory
- # it always like ./bin/your_app_id-6.0.0
- def create_app_dir():
- app_dir = os.path.join(ROOT_DIR, 'bin', App.app_id + '-' + App.app_version)
- return create_target_dir(app_dir)
- # create a file nemed info
- def create_info_file():
- data = {
- "appid": App.app_id,
- "name": App.app_name,
- "version": App.app_version,
- "arch": ["amd64"],
- "permissions": {
- "autostart": False,
- "notification": False,
- "trayicon": False,
- "clipboard": True,
- "account": False,
- "bluetooth": False,
- "camera": False,
- "audio_record": False,
- "installed_apps": False
- }
- }
- with open('info', 'w') as json_file:
- json.dump(data, json_file, indent=4)
-
- # create a file named your_app_id.desktop
- # Icon=/opt/apps/{App.app_id}/files/bin/{App.app_name}.png
- def create_desktop_entry_file(file_name):
- content = f"""[Desktop Entry]
- Name={App.app_name}
- Name[zh_CN]={App.app_chn_name}
- Comment={App.app_description}
- Exec=/opt/apps/{App.app_id}/files/AppRun
- Icon=/opt/apps/{App.app_id}/files/bin/{App.icon_name}
- Terminal=false
- Categories=Utility
- Type=Application
- """
-
- with open(file_name, 'w') as file:
- file.write(content)
- def create_apprun_file():
- content = f"""#!/bin/bash
- SELF=$(readlink -f "$0")
- HERE=${{SELF%/*}}
- ARCH="x86_64-linux-gnu"
- #ARCH="aarch64-linux-gnu"
- export PATH="${{HERE}}/bin:${{PATH:+:$PATH}}:$PATH"
- export LD_LIBRARY_PATH="${{HERE}}/lib"
- export XDG_DATA_DIRS="${{HERE}}/share:/usr/share"
- exec {App.app_name} $*
- """
- with open('AppRun', 'w') as file:
- file.write(content)
- os.system('chmod 755 AppRun')
- def get_desktop_path():
- user_dirs_path = os.path.expanduser('~/.config/user-dirs.dirs')
- desktop_path = os.path.expanduser('~/Desktop') # default
- if os.path.exists(user_dirs_path):
- with open(user_dirs_path) as f:
- for line in f:
- if "XDG_DESKTOP_DIR" in line:
- desktop_path = line.split("=")[1].strip().strip('"')
- desktop_path = desktop_path.replace('$HOME', os.path.expanduser('~'))
- break
- return desktop_path
- def create_install_file():
- desktop_path = get_desktop_path()
- print('This user home path is ' + desktop_path)
- with open('install', 'w') as f:
- f.write(f'{App.app_id}/ /opt/apps\n')
- f.write(f'{App.app_id}/entries/applications/{App.app_id}.desktop /usr/share/applications\n')
- #f.write(f'{App.app_id}/entries/applications/{App.app_id}.desktop {desktop_path}\n')
- #f.write(f'{App.app_id}/files/lib/* /usr/lib\n')
- def modify_rules_file():
- # append "xxx" to the rules file
- with open('rules', 'a') as f:
- f.write("""
- override_dh_auto_build:
-
- override_dh_shlibdeps:
- --dpkg-shlibdeps-params=--ignore-missing-info
-
- override_dh_strip:""")
- def modify_control_file():
- with open('control', 'r+') as f:
- data = f.read()
- start_pos = data.find('Description:')
- if start_pos != -1:
- insert_pos = start_pos + len('Description:')
- new_text = data[:insert_pos] + App.app_description + '\n'
- else:
- new_text = data
- line_datas = new_text.split('\n')
- new_datas = []
- for line in line_datas:
- if line.startswith('Maintainer:'):
- new_datas.append(f'Maintainer:{App.app_author} {App.app_email}')
- elif line.startswith('Homepage:'):
- new_datas.append(f'Homepage:{App.home_page}')
- else:
- new_datas.append(line)
- f.seek(0)
- f.truncate()
- f.write('\n'.join(new_datas))
- def create_postinst_file():
- with open('postinst', 'w') as f:
- f.write(f'''
- #!/bin/bash
- set -e
- #chown -R {CURRENT_USER}:{CURRENT_USER} /opt/apps/{App.app_id}/files/bin || true
- chmod -R 777 /opt/apps/{App.app_id}/files/bin
- exit 0''')
- os.system('chmod 755 postinst')
- def is_bin_exists():
- if not os.path.exists('bin'):
- return False
- return True
- # copy ./bin/your_app to ./your_app
- def copy_file_to_target_dir(src_path, target_path):
- shutil.copy(src_path, target_path)
- def circulate_copy_to_target_dir(src_path, target_path):
- for file in glob.glob(src_path):
- des = target_path + '/' + file.split('/')[-1]
- shutil.copy(file, des)
- # remove all files below this directory
- def remove_files_in_current_dir(current_dir):
- for item in os.listdir(current_dir): # 遍历当前目录下的所有文件和目录
- item_path = os.path.join(current_dir, item) # 获取完整路径
- if os.path.isfile(item_path): # 如果是文件
- os.remove(item_path) # 删除文件
- def is_packaged():
- if os.path.exists('lib'):
- return True
- else:
- return False
- def package_app():
- command = f"linuxdeployqt ./bin/{App.app_name} -appimage"
- os.system(command)
- if __name__ == '__main__':
- print('Start to build uos app package...')
- add_depend_libs_path()
- app_bin_dir = ROOT_DIR + App.app_path
- switch_to_dir(app_bin_dir)
- if not is_bin_exists():
- print('The bin directory is not exists!')
- exit(1)
- if not is_packaged():
- package_app()
- switch_to_dir(ROOT_DIR)
- app_dir = create_app_dir()
- switch_to_dir(app_dir)
- create_target_dir(App.app_id)
- data_dir = app_dir + '/' + App.app_id
- switch_to_dir(data_dir)
- # create entries and files directory
- create_target_dir('entries')
- create_target_dir('files')
- # create a file named info
- create_info_file()
- entries_dir = data_dir + '/entries'
- switch_to_dir(entries_dir)
- create_target_dir('applications')
- app_desktop_file = 'applications/' + App.app_id + '.desktop'
- create_file(app_desktop_file)
- create_desktop_entry_file(app_desktop_file)
- # create icons directory
- icon_path = 'icons/hicolor/' + App.icon_size + '/apps'
- create_target_dir(icon_path)
- # copy the icon file to the icons directory
- app_path = ROOT_DIR + App.app_path
- icon_file = app_path + 'bin/' + App.icon_name
- os.system(f'cp {icon_file} {icon_path}/{App.app_id}.png')
-
- files_dir = data_dir + '/files'
- # copy the app directory to the files directory
- os.system(f'cp -r {app_path}/* {files_dir}')
- switch_to_dir(files_dir)
- create_apprun_file()
- switch_to_dir(app_dir)
- # make debian directory,just exec 'dh_make --createorig -s' or 'apt install dh-make' first
- # if command'dh_make' not found
-
- os.system('dh_make --createorig -s -y')
- # if command dh_make not found, you can exec 'apt install dh-make' to install it
- # create install file, just like 'touch install':
- # install file format
- # com.hzlh.cas10m/ /opt/apps
- # com.hzlh.cas10m/entries/applications/cas10m.desktop /usr/share/applications
- # //com.hzlh.cas10m/files/lib/ /usr/lib
- debian_dir = app_dir + '/debian'
- switch_to_dir(debian_dir)
- create_install_file()
- # just for log and config file
- create_postinst_file()
- # modify the control file, like depends, description, etc.
- modify_control_file()
- # modify changelog file, read all data then replace 'app_version-1' to 'app_version'
- with open('changelog', 'r+') as f:
- data = f.read()
- data = data.replace(App.app_version + '-1', App.app_version)
- f.seek(0)
- f.truncate()
- f.write(data)
- # remove ex or EX files, just exec 'rm *.ex *.EX'
- os.system('rm *.ex *.EX')
- # modify the rules file
- modify_rules_file()
- switch_to_dir(app_dir)
- # make deb package, just exec 'dpkg-buildpackage -tc -uc -us -b -d'
- os.system('dpkg-buildpackage -tc -uc -us -b -d')
|