diff --git a/README.md b/README.md
index e3f0d86..29b24be 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ Visit the [wiki](https://github.com/webcamoid/akvirtualcamera/wiki) for a compre
[![Build Status](https://travis-ci.org/webcamoid/akvirtualcamera.svg?branch=master)](https://travis-ci.org/webcamoid/akvirtualcamera)
[![Build status](https://ci.appveyor.com/api/projects/status/rwd4of9casmfmmys?svg=true)](https://ci.appveyor.com/project/hipersayanX/akvirtualcamera)
-[![Codacy Badge](https://app.codacy.com/project/badge/Grade/1cee2645a3604633a506a203fb8c3161)](https://www.codacy.com/gh/webcamoid/akvirtualcamera?utm_source=github.com&utm_medium=referral&utm_content=webcamoid/akvirtualcamera&utm_campaign=Badge_Grade)
+[![Codacy Badge](https://app.codacy.com/project/badge/Grade/1cee2645a3604633a506a203fb8c3161)](https://www.codacy.com/gh/webcamoid/akvirtualcamera/dashboard?utm_source=github.com&utm_medium=referral&utm_content=webcamoid/akvirtualcamera&utm_campaign=Badge_Grade)
[![Daily Build](https://api.bintray.com/packages/webcamoid/webcamoid/akvirtualcamera/images/download.svg?version=daily)](https://bintray.com/webcamoid/webcamoid/akvirtualcamera/daily)
## Reporting Bugs ##
diff --git a/ports/deploy/deploy_android.py b/ports/deploy/deploy_android.py
deleted file mode 100644
index 9e8ed63..0000000
--- a/ports/deploy/deploy_android.py
+++ /dev/null
@@ -1,634 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Webcamoid, webcam capture application.
-# Copyright (C) 2019 Gonzalo Exequiel Pedone
-#
-# Webcamoid is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Webcamoid is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Webcamoid. If not, see .
-#
-# Web-Site: http://webcamoid.github.io/
-
-import json
-import math
-import os
-import re
-import shutil
-import subprocess # nosec
-import sys
-import threading
-import zipfile
-
-import deploy_base
-import tools.android
-import tools.binary_elf
-import tools.qt5
-
-
-class Deploy(deploy_base.DeployBase,
- tools.qt5.DeployToolsQt,
- tools.android.AndroidTools):
- def __init__(self):
- super().__init__()
- self.targetSystem = 'android'
- self.installDir = os.path.join(self.buildDir, 'ports/deploy/temp_priv')
- self.pkgsDir = os.path.join(self.buildDir, 'ports/deploy/packages_auto/android')
- self.standAloneDir = os.path.join(self.buildDir, 'StandAlone')
- self.detectQt(self.standAloneDir)
- self.programName = 'webcamoid'
- self.binarySolver = tools.binary_elf.DeployToolsBinary()
- self.detectAndroidPlatform(self.standAloneDir)
- binary = self.detectTargetBinaryFromQt5Make(self.standAloneDir)
- self.targetArch = self.binarySolver.machineEMCode(binary)
- self.androidArchMap = {'AARCH64': 'arm64-v8a',
- 'ARM' : 'armeabi-v7a',
- '386' : 'x86',
- 'X86_64' : 'x86_64'}
-
- if self.targetArch in self.androidArchMap:
- self.targetArch = self.androidArchMap[self.targetArch]
-
- self.binarySolver.sysBinsPath = self.detectBinPaths() + self.binarySolver.sysBinsPath
- self.binarySolver.libsSeachPaths = self.detectLibPaths()
- self.rootInstallDir = os.path.join(self.installDir, self.programName)
- self.libInstallDir = os.path.join(self.rootInstallDir,
- 'libs',
- self.targetArch)
- self.binaryInstallDir = self.libInstallDir
- self.assetsIntallDir = os.path.join(self.rootInstallDir,
- 'assets',
- 'android_rcc_bundle')
- self.qmlInstallDir = os.path.join(self.assetsIntallDir, 'qml')
- self.pluginsInstallDir = os.path.join(self.assetsIntallDir, 'plugins')
- self.qtConf = os.path.join(self.binaryInstallDir, 'qt.conf')
- self.qmlRootDirs = ['StandAlone/share/qml', 'libAvKys/Plugins']
- self.mainBinary = os.path.join(self.binaryInstallDir, os.path.basename(binary))
- self.programVersion = self.detectVersion(os.path.join(self.rootDir, 'commons.pri'))
- self.detectMake()
- self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/exclude.android.txt'))
- self.binarySolver.libsSeachPaths += [self.qmakeQuery(var='QT_INSTALL_LIBS')]
- self.packageConfig = os.path.join(self.rootDir, 'ports/deploy/package_info.conf')
- self.dependencies = []
-
- @staticmethod
- def removeUnneededFiles(path):
- afiles = set()
-
- for root, _, files in os.walk(path):
- for f in files:
- if f.endswith('.jar'):
- afiles.add(os.path.join(root, f))
-
- for afile in afiles:
- os.remove(afile)
-
- def prepare(self):
- print('Executing make install')
- self.makeInstall(self.buildDir, self.rootInstallDir)
- self.binarySolver.detectStrip()
-
- if 'PACKAGES_MERGE' in os.environ \
- and len(os.environ['PACKAGES_MERGE']) > 0:
- self.outPackage = \
- os.path.join(self.pkgsDir,
- '{}-{}.apk'.format(self.programName,
- self.programVersion))
- else:
- self.outPackage = \
- os.path.join(self.pkgsDir,
- '{}-{}-{}.apk'.format(self.programName,
- self.programVersion,
- self.targetArch))
-
- print('Copying Qml modules\n')
- self.solvedepsQml()
- print('\nCopying required plugins\n')
- self.solvedepsPlugins()
- print('\nRemoving unused architectures')
- self.removeInvalidArchs()
- print('Fixing Android libs\n')
- self.fixQtLibs()
-
- try:
- shutil.rmtree(self.pluginsInstallDir)
- except:
- pass
-
- print('\nCopying required libs\n')
- self.solvedepsLibs()
- print('\nSolving Android dependencies\n')
- self.solvedepsAndroid()
- print('\nCopying Android build templates')
- self.copyAndroidTemplates()
- print('Fixing libs.xml file')
- self.fixLibsXml()
- print('Creating .rcc bundle file')
- self.createRccBundle()
- print('Stripping symbols')
- self.binarySolver.stripSymbols(self.rootInstallDir)
- print('Removing unnecessary files')
- self.removeUnneededFiles(self.libInstallDir)
- print('Writting build system information\n')
- self.writeBuildInfo()
-
- def removeInvalidArchs(self):
- suffix = '_{}.so'.format(self.targetArch)
-
- if not self.mainBinary.endswith(suffix):
- return
-
- for root, dirs, files in os.walk(self.assetsIntallDir):
- for f in files:
- if f.endswith('.so') and not f.endswith(suffix):
- os.remove(os.path.join(root, f))
-
- def solvedepsLibs(self):
- qtLibsPath = self.qmakeQuery(var='QT_INSTALL_LIBS')
- self.binarySolver.ldLibraryPath.append(qtLibsPath)
- self.qtLibs = sorted(self.binarySolver.scanDependencies(self.rootInstallDir))
-
- for dep in self.qtLibs:
- depPath = os.path.join(self.libInstallDir, os.path.basename(dep))
-
- if dep != depPath:
- print(' {} -> {}'.format(dep, depPath))
- self.copy(dep, depPath, True)
- self.dependencies.append(dep)
-
- def searchPackageFor(self, path):
- os.environ['LC_ALL'] = 'C'
- pacman = self.whereBin('pacman')
-
- if len(pacman) > 0:
- process = subprocess.Popen([pacman, '-Qo', path], # nosec
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- stdout, _ = process.communicate()
-
- if process.returncode != 0:
- return ''
-
- info = stdout.decode(sys.getdefaultencoding()).split(' ')
-
- if len(info) < 2:
- return ''
-
- package, version = info[-2:]
-
- return ' '.join([package.strip(), version.strip()])
-
- dpkg = self.whereBin('dpkg')
-
- if len(dpkg) > 0:
- process = subprocess.Popen([dpkg, '-S', path], # nosec
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- stdout, _ = process.communicate()
-
- if process.returncode != 0:
- return ''
-
- package = stdout.split(b':')[0].decode(sys.getdefaultencoding()).strip()
-
- process = subprocess.Popen([dpkg, '-s', package], # nosec
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- stdout, _ = process.communicate()
-
- if process.returncode != 0:
- return ''
-
- for line in stdout.decode(sys.getdefaultencoding()).split('\n'):
- line = line.strip()
-
- if line.startswith('Version:'):
- return ' '.join([package, line.split()[1].strip()])
-
- return ''
-
- rpm = self.whereBin('rpm')
-
- if len(rpm) > 0:
- process = subprocess.Popen([rpm, '-qf', path], # nosec
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- stdout, _ = process.communicate()
-
- if process.returncode != 0:
- return ''
-
- return stdout.decode(sys.getdefaultencoding()).strip()
-
- return ''
-
- def commitHash(self):
- try:
- process = subprocess.Popen(['git', 'rev-parse', 'HEAD'], # nosec
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- cwd=self.rootDir)
- stdout, _ = process.communicate()
-
- if process.returncode != 0:
- return ''
-
- return stdout.decode(sys.getdefaultencoding()).strip()
- except:
- return ''
-
- @staticmethod
- def sysInfo():
- info = ''
-
- for f in os.listdir('/etc'):
- if f.endswith('-release'):
- with open(os.path.join('/etc' , f)) as releaseFile:
- info += releaseFile.read()
-
- return info
-
- def writeBuildInfo(self):
- shareDir = os.path.join(self.rootInstallDir, 'assets')
-
- try:
- os.makedirs(self.pkgsDir)
- except:
- pass
-
- depsInfoFile = os.path.join(shareDir, 'build-info.txt')
-
- if not os.path.exists(shareDir):
- os.makedirs(shareDir)
-
- # Write repository info.
-
- with open(depsInfoFile, 'w') as f:
- commitHash = self.commitHash()
-
- if len(commitHash) < 1:
- commitHash = 'Unknown'
-
- print(' Commit hash: ' + commitHash)
- f.write('Commit hash: ' + commitHash + '\n')
-
- buildLogUrl = ''
-
- if 'TRAVIS_BUILD_WEB_URL' in os.environ:
- buildLogUrl = os.environ['TRAVIS_BUILD_WEB_URL']
- elif 'APPVEYOR_ACCOUNT_NAME' in os.environ and 'APPVEYOR_PROJECT_NAME' in os.environ and 'APPVEYOR_JOB_ID' in os.environ:
- buildLogUrl = 'https://ci.appveyor.com/project/{}/{}/build/job/{}'.format(os.environ['APPVEYOR_ACCOUNT_NAME'],
- os.environ['APPVEYOR_PROJECT_SLUG'],
- os.environ['APPVEYOR_JOB_ID'])
-
- if len(buildLogUrl) > 0:
- print(' Build log URL: ' + buildLogUrl)
- f.write('Build log URL: ' + buildLogUrl + '\n')
-
- print()
- f.write('\n')
-
- # Write host info.
-
- info = self.sysInfo()
-
- with open(depsInfoFile, 'a') as f:
- for line in info.split('\n'):
- if len(line) > 0:
- print(' ' + line)
- f.write(line + '\n')
-
- print()
- f.write('\n')
-
- # Write SDK and NDK info.
-
- sdkInfoFile = os.path.join(self.androidSDK, 'tools', 'source.properties')
- ndkInfoFile = os.path.join(self.androidNDK, 'source.properties')
-
- with open(depsInfoFile, 'a') as f:
- platform = self.androidPlatform
- print(' Android Platform: {}'.format(platform))
- f.write('Android Platform: {}\n'.format(platform))
- print(' SDK Info: \n')
- f.write('SDK Info: \n\n')
-
- with open(sdkInfoFile) as sdkf:
- for line in sdkf:
- if len(line) > 0:
- print(' ' + line.strip())
- f.write(' ' + line)
-
- print('\n NDK Info: \n')
- f.write('\nNDK Info: \n\n')
-
- with open(ndkInfoFile) as ndkf:
- for line in ndkf:
- if len(line) > 0:
- print(' ' + line.strip())
- f.write(' ' + line)
-
- print()
- f.write('\n')
-
- # Write binary dependencies info.
-
- packages = set()
-
- for dep in self.dependencies:
- packageInfo = self.searchPackageFor(dep)
-
- if len(packageInfo) > 0:
- packages.add(packageInfo)
-
- packages = sorted(packages)
-
- with open(depsInfoFile, 'a') as f:
- for packge in packages:
- print(' ' + packge)
- f.write(packge + '\n')
-
- @staticmethod
- def hrSize(size):
- i = int(math.log(size) // math.log(1024))
-
- if i < 1:
- return '{} B'.format(size)
-
- units = ['KiB', 'MiB', 'GiB', 'TiB']
- sizeKiB = size / (1024 ** i)
-
- return '{:.2f} {}'.format(sizeKiB, units[i - 1])
-
- def printPackageInfo(self, path):
- if os.path.exists(path):
- print(' ',
- os.path.basename(path),
- self.hrSize(os.path.getsize(path)))
- print(' sha256sum:', Deploy.sha256sum(path))
- else:
- print(' ',
- os.path.basename(path),
- 'FAILED')
-
- def alignPackage(self, package):
- deploymentSettingsPath = ''
-
- for f in os.listdir(self.standAloneDir):
- if re.match('^android-.+-deployment-settings.json$' , f):
- deploymentSettingsPath = os.path.join(self.standAloneDir, f)
-
- break
-
- if len(deploymentSettingsPath) < 1:
- return
-
- with open(deploymentSettingsPath) as f:
- deploymentSettings = json.load(f)
-
- zipalign = os.path.join(self.androidSDK,
- 'build-tools',
- deploymentSettings['sdkBuildToolsRevision'],
- 'zipalign')
-
- if self.system == 'windows':
- zipalign += '.exe'
-
- alignedPackage = os.path.join(os.path.dirname(package),
- 'aligned-' + os.path.basename(package))
- process = subprocess.Popen([zipalign, # nosec
- '-v',
- '-f', '4',
- package,
- alignedPackage],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- process.communicate()
-
- if process.returncode != 0:
- return False
-
- self.move(alignedPackage, package)
-
- return True
-
- def apkSignPackage(self, package, keystore):
- if not self.alignPackage(package):
- return False
-
- deploymentSettingsPath = ''
-
- for f in os.listdir(self.standAloneDir):
- if re.match('^android-.+-deployment-settings.json$' , f):
- deploymentSettingsPath = os.path.join(self.standAloneDir, f)
-
- break
-
- if len(deploymentSettingsPath) < 1:
- return
-
- with open(deploymentSettingsPath) as f:
- deploymentSettings = json.load(f)
-
- apkSigner = os.path.join(self.androidSDK,
- 'build-tools',
- deploymentSettings['sdkBuildToolsRevision'],
- 'apksigner')
-
- if self.system == 'windows':
- apkSigner += '.exe'
-
- process = subprocess.Popen([apkSigner, # nosec
- 'sign',
- '-v',
- '--ks', keystore,
- '--ks-pass', 'pass:android',
- '--ks-key-alias', 'androiddebugkey',
- '--key-pass', 'pass:android',
- package],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- process.communicate()
-
- return process.returncode == 0
-
- def jarSignPackage(self, package, keystore):
- jarSigner = 'jarsigner'
-
- if self.system == 'windows':
- jarSigner += '.exe'
-
- jarSignerPath = ''
-
- if 'JAVA_HOME' in os.environ:
- jarSignerPath = os.path.join(os.environ['JAVA_HOME'],
- 'bin',
- jarSigner)
-
- if len(jarSignerPath) < 1 or not os.path.exists(jarSignerPath):
- jarSignerPath = self.whereBin(jarSigner)
-
- if len(jarSignerPath) < 1:
- return False
-
- signedPackage = os.path.join(os.path.dirname(package),
- 'signed-' + os.path.basename(package))
- process = subprocess.Popen([jarSignerPath, # nosec
- '-verbose',
- '-keystore', keystore,
- '-storepass', 'android',
- '-keypass', 'android',
- '-sigalg', 'SHA1withRSA',
- '-digestalg', 'SHA1',
- '-sigfile', 'CERT',
- '-signedjar', signedPackage,
- package,
- 'androiddebugkey'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- process.communicate()
-
- if process.returncode != 0:
- return False
-
- self.move(signedPackage, package)
-
- return self.alignPackage(package)
-
- def signPackage(self, package):
- keytool = 'keytool'
-
- if self.system == 'windows':
- keytool += '.exe'
-
- keytoolPath = ''
-
- if 'JAVA_HOME' in os.environ:
- keytoolPath = os.path.join(os.environ['JAVA_HOME'], 'bin', keytool)
-
- if len(keytoolPath) < 1 or not os.path.exists(keytoolPath):
- keytoolPath = self.whereBin(keytool)
-
- if len(keytoolPath) < 1:
- return False
-
- keystore = os.path.join(self.rootInstallDir, 'debug.keystore')
-
- if 'KEYSTORE_PATH' in os.environ:
- keystore = os.environ['KEYSTORE_PATH']
-
- if not os.path.exists(keystore):
- try:
- os.makedirs(os.path.dirname(keystore))
- except:
- pass
-
- process = subprocess.Popen([keytoolPath, # nosec
- '-genkey',
- '-v',
- '-storetype', 'pkcs12',
- '-keystore', keystore,
- '-storepass', 'android',
- '-alias', 'androiddebugkey',
- '-keypass', 'android',
- '-keyalg', 'RSA',
- '-keysize', '2048',
- '-validity', '10000',
- '-dname', 'CN=Android Debug,O=Android,C=US'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- process.communicate()
-
- if process.returncode != 0:
- return False
-
- if self.apkSignPackage(package, keystore):
- return True
-
- return self.jarSignPackage(package, keystore)
-
- def createApk(self, mutex):
- if 'PACKAGES_MERGE' in os.environ:
- print('Merging package data:\n')
-
- for path in os.environ['PACKAGES_MERGE'].split(':'):
- path = path.strip()
-
- if os.path.exists(path) and os.path.isdir(path):
- if path == self.buildDir:
- continue
-
- standAlonePath = os.path.join(path,
- os.path.relpath(self.standAloneDir,
- self.buildDir))
- binary = self.detectTargetBinaryFromQt5Make(standAlonePath)
- targetArch = self.binarySolver.machineEMCode(binary)
-
- if targetArch in self.androidArchMap:
- targetArch = self.androidArchMap[targetArch]
-
- libsPath = os.path.join(path,
- os.path.relpath(self.rootInstallDir,
- self.buildDir),
- 'libs',
- targetArch)
- dstLibPath = os.path.join(self.rootInstallDir,
- 'libs',
- targetArch)
- print(' {} -> {}'.format(libsPath, dstLibPath))
- self.copy(libsPath, dstLibPath)
-
- print()
-
- if not os.path.exists(self.pkgsDir):
- os.makedirs(self.pkgsDir)
-
- gradleSript = os.path.join(self.rootInstallDir, 'gradlew')
-
- if self.system == 'windows':
- gradleSript += '.bat'
-
- os.chmod(gradleSript, 0o744)
- process = subprocess.Popen([gradleSript, # nosec
- '--no-daemon',
- '--info',
- 'assembleRelease'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- cwd=self.rootInstallDir)
- process.communicate()
- apk = os.path.join(self.rootInstallDir,
- 'build',
- 'outputs',
- 'apk',
- 'release',
- '{}-release-unsigned.apk'.format(self.programName))
- self.signPackage(apk)
- self.copy(apk, self.outPackage)
-
- print('Created APK package:')
- self.printPackageInfo(self.outPackage)
-
- def package(self):
- mutex = threading.Lock()
-
- threads = [threading.Thread(target=self.createApk, args=(mutex,))]
- packagingTools = ['apk']
-
- if len(packagingTools) > 0:
- print('Detected packaging tools: {}\n'.format(', '.join(packagingTools)))
-
- for thread in threads:
- thread.start()
-
- for thread in threads:
- thread.join()
diff --git a/ports/deploy/deploy_mac.py b/ports/deploy/deploy_mac.py
index a154a49..affa234 100644
--- a/ports/deploy/deploy_mac.py
+++ b/ports/deploy/deploy_mac.py
@@ -40,6 +40,7 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
self.pkgsDir = os.path.join(self.buildDir, 'ports/deploy/packages_auto', self.targetSystem)
self.detectQt(os.path.join(self.buildDir, 'Manager'))
self.programName = 'AkVirtualCamera'
+ self.adminRights = True
self.rootInstallDir = os.path.join(self.installDir, 'Applications')
self.appBundleDir = os.path.join(self.rootInstallDir, self.programName + '.plugin')
self.execPrefixDir = os.path.join(self.appBundleDir, 'Contents')
@@ -48,12 +49,11 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
self.programVersion = self.detectVersion(os.path.join(self.rootDir, 'commons.pri'))
self.detectMake()
self.binarySolver = tools.binary_mach.DeployToolsBinary()
- self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/exclude.{}.{}.txt'.format(os.name, sys.platform)))
+ self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/tools/exclude/exclude.{}.{}.txt'.format(os.name, sys.platform)))
self.packageConfig = os.path.join(self.rootDir, 'ports/deploy/package_info.conf')
self.dependencies = []
self.installerConfig = os.path.join(self.installDir, 'installer/config')
self.installerPackages = os.path.join(self.installDir, 'installer/packages')
- self.appIcon = os.path.join(self.rootDir, 'share/icons/webcamoid.png')
self.licenseFile = os.path.join(self.rootDir, 'COPYING')
self.installerTargetDir = '@ApplicationsDir@/' + self.programName
self.installerScript = os.path.join(self.rootDir, 'ports/deploy/installscript.mac.qs')
@@ -64,7 +64,8 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
def prepare(self):
print('Executing make install')
- self.makeInstall(self.buildDir, self.installDir)
+ params = {'INSTALL_ROOT': self.installDir}
+ self.makeInstall(self.buildDir, params)
self.detectTargetArch()
print('Stripping symbols')
self.binarySolver.stripSymbols(self.installDir)
diff --git a/ports/deploy/deploy_posix.py b/ports/deploy/deploy_posix.py
index 15e9b8e..ee3c570 100644
--- a/ports/deploy/deploy_posix.py
+++ b/ports/deploy/deploy_posix.py
@@ -53,7 +53,7 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
self.targetSystem = 'android'
self.binarySolver = tools.binary_elf.DeployToolsBinary()
- self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/exclude.{}.{}.txt'.format(os.name, sys.platform)))
+ self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/tools/exclude/exclude.{}.{}.txt'.format(os.name, sys.platform)))
self.packageConfig = os.path.join(self.rootDir, 'ports/deploy/package_info.conf')
self.dependencies = []
self.installerConfig = os.path.join(self.installDir, 'installer/config')
diff --git a/ports/deploy/deploy_posix_windows.py b/ports/deploy/deploy_posix_windows.py
index f120d3c..191f331 100644
--- a/ports/deploy/deploy_posix_windows.py
+++ b/ports/deploy/deploy_posix_windows.py
@@ -39,6 +39,7 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
self.pkgsDir = os.path.join(self.buildDir, 'ports/deploy/packages_auto/windows')
self.detectQt(os.path.join(self.buildDir, 'Manager'))
self.programName = 'AkVirtualCamera'
+ self.adminRights = True
self.rootInstallDir = os.path.join(self.installDir, self.programName + '.plugin')
self.binaryInstallDir = os.path.join(self.rootInstallDir, 'bin')
self.mainBinary = os.path.join(self.binaryInstallDir, self.programName + '.exe')
@@ -46,12 +47,11 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
self.programVersion = self.detectVersion(os.path.join(self.rootDir, 'commons.pri'))
self.detectMake()
self.binarySolver = tools.binary_pecoff.DeployToolsBinary()
- self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/exclude.{}.{}.txt'.format(os.name, sys.platform)))
+ self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/tools/exclude/exclude.{}.{}.txt'.format(os.name, sys.platform)))
self.packageConfig = os.path.join(self.rootDir, 'ports/deploy/package_info.conf')
self.dependencies = []
self.installerConfig = os.path.join(self.installDir, 'installer/config')
self.installerPackages = os.path.join(self.installDir, 'installer/packages')
- self.appIcon = os.path.join(self.rootDir, 'share/icons/webcamoid.png')
self.licenseFile = os.path.join(self.rootDir, 'COPYING')
self.installerScript = os.path.join(self.rootDir, 'ports/deploy/installscript.windows.qs')
self.changeLog = os.path.join(self.rootDir, 'ChangeLog')
@@ -74,7 +74,8 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
def prepare(self):
print('Executing make install')
- self.makeInstall(self.buildDir, self.installDir)
+ params = {'INSTALL_ROOT': self.installDir}
+ self.makeInstall(self.buildDir, params)
if self.targetArch == '32bit':
self.binarySolver.sysBinsPath = ['/usr/i686-w64-mingw32/bin']
diff --git a/ports/deploy/deploy_windows.py b/ports/deploy/deploy_windows.py
index 1e7f571..38152fc 100644
--- a/ports/deploy/deploy_windows.py
+++ b/ports/deploy/deploy_windows.py
@@ -38,6 +38,7 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
self.installDir = os.path.join(self.buildDir, 'ports/deploy/temp_priv')
self.pkgsDir = os.path.join(self.buildDir, 'ports/deploy/packages_auto/windows')
self.detectQt(os.path.join(self.buildDir, 'Manager'))
+ self.adminRights = True
self.programName = 'AkVirtualCamera'
self.rootInstallDir = os.path.join(self.installDir, self.programName + '.plugin')
self.binaryInstallDir = os.path.join(self.rootInstallDir, 'bin')
@@ -46,12 +47,11 @@ class Deploy(deploy_base.DeployBase, tools.qt5.DeployToolsQt):
self.programVersion = self.detectVersion(os.path.join(self.rootDir, 'commons.pri'))
self.detectMake()
self.binarySolver = tools.binary_pecoff.DeployToolsBinary()
- self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/exclude.{}.{}.txt'.format(os.name, sys.platform)))
+ self.binarySolver.readExcludeList(os.path.join(self.rootDir, 'ports/deploy/tools/exclude/exclude.{}.{}.txt'.format(os.name, sys.platform)))
self.packageConfig = os.path.join(self.rootDir, 'ports/deploy/package_info.conf')
self.dependencies = []
self.installerConfig = os.path.join(self.installDir, 'installer/config')
self.installerPackages = os.path.join(self.installDir, 'installer/packages')
- self.appIcon = os.path.join(self.rootDir, 'share/icons/webcamoid.png')
self.licenseFile = os.path.join(self.rootDir, 'COPYING')
self.installerScript = os.path.join(self.rootDir, 'ports/deploy/installscript.windows.qs')
self.changeLog = os.path.join(self.rootDir, 'ChangeLog')
diff --git a/ports/deploy/package_info.conf b/ports/deploy/package_info.conf
index 639f115..a4b8530 100644
--- a/ports/deploy/package_info.conf
+++ b/ports/deploy/package_info.conf
@@ -2,5 +2,4 @@
appName = AkVirtualCamera
description = AkVirtualCamera, virtual camera for Mac and Windows
url = https://github.com/webcamoid/akvirtualcamera
-titleColor = #3F1F7F
licenseDescription = GNU General Public License v3.0
diff --git a/ports/deploy/exclude.nt.win32.txt b/ports/deploy/tools/exclude/exclude.nt.win32.txt
similarity index 100%
rename from ports/deploy/exclude.nt.win32.txt
rename to ports/deploy/tools/exclude/exclude.nt.win32.txt
diff --git a/ports/deploy/exclude.posix.darwin.txt b/ports/deploy/tools/exclude/exclude.posix.darwin.txt
similarity index 100%
rename from ports/deploy/exclude.posix.darwin.txt
rename to ports/deploy/tools/exclude/exclude.posix.darwin.txt
diff --git a/ports/deploy/exclude.posix.freebsd12.txt b/ports/deploy/tools/exclude/exclude.posix.freebsd12.txt
similarity index 100%
rename from ports/deploy/exclude.posix.freebsd12.txt
rename to ports/deploy/tools/exclude/exclude.posix.freebsd12.txt
diff --git a/ports/deploy/exclude.posix.linux.txt b/ports/deploy/tools/exclude/exclude.posix.linux.txt
similarity index 100%
rename from ports/deploy/exclude.posix.linux.txt
rename to ports/deploy/tools/exclude/exclude.posix.linux.txt
diff --git a/ports/deploy/tools/qt5.py b/ports/deploy/tools/qt5.py
index 28f382e..51d1a11 100644
--- a/ports/deploy/tools/qt5.py
+++ b/ports/deploy/tools/qt5.py
@@ -47,7 +47,9 @@ class DeployToolsQt(tools.utils.DeployToolsUtils):
self.dependencies = []
self.binarySolver = None
self.installerConfig = ''
+ self.appIcon = ''
self.installerRunProgram = ''
+ self.adminRights = False
def detectQt(self, path=''):
self.detectQmake(path)
@@ -446,9 +448,14 @@ class DeployToolsQt(tools.utils.DeployToolsUtils):
shutil.move(manifestTemp, manifest)
def writeQtConf(self):
- paths = {'Plugins': os.path.relpath(self.pluginsInstallDir, self.binaryInstallDir),
- 'Imports': os.path.relpath(self.qmlInstallDir, self.binaryInstallDir),
- 'Qml2Imports': os.path.relpath(self.qmlInstallDir, self.binaryInstallDir)}
+ prefix = self.binaryInstallDir
+
+ if self.targetSystem == 'mac':
+ prefix = os.path.abspath(os.path.join(self.binaryInstallDir, '..'))
+
+ paths = {'Plugins': os.path.relpath(self.pluginsInstallDir, prefix).replace('\\', '/'),
+ 'Imports': os.path.relpath(self.qmlInstallDir, prefix).replace('\\', '/'),
+ 'Qml2Imports': os.path.relpath(self.qmlInstallDir, prefix).replace('\\', '/')}
confPath = os.path.dirname(self.qtConf)
if not os.path.exists(confPath):
@@ -496,7 +503,7 @@ class DeployToolsQt(tools.utils.DeployToolsUtils):
packageConf.read(self.packageConfig, 'utf-8')
# Create layout
- componentName = 'com.webcamoidprj.{0}'.format(self.programName)
+ componentName = 'com.{0}prj.{0}'.format(self.programName)
packageDir = os.path.join(self.installerPackages, componentName)
if not os.path.exists(self.installerConfig):
@@ -511,8 +518,12 @@ class DeployToolsQt(tools.utils.DeployToolsUtils):
if not os.path.exists(metaDir):
os.makedirs(metaDir)
- self.copy(self.appIcon, self.installerConfig)
- iconName = os.path.splitext(os.path.basename(self.appIcon))[0]
+ iconName = ''
+
+ if self.appIcon != '' and os.path.exists(self.appIcon):
+ self.copy(self.appIcon, self.installerConfig)
+ iconName = os.path.splitext(os.path.basename(self.appIcon))[0]
+
licenseOutFile = os.path.basename(self.licenseFile)
if not '.' in licenseOutFile and \
@@ -539,16 +550,18 @@ class DeployToolsQt(tools.utils.DeployToolsUtils):
config.write('
{}\n'.format(packageConf['Package']['description'].strip()))
config.write(' {}\n'.format(appName))
config.write(' {}\n'.format(packageConf['Package']['url'].strip()))
- config.write(' {}\n'.format(iconName))
- config.write(' {}\n'.format(iconName))
- config.write(' {}\n'.format(iconName))
+
+ if iconName != '':
+ config.write(' {}\n'.format(iconName))
+ config.write(' {}\n'.format(iconName))
+ config.write(' {}\n'.format(iconName))
if self.installerRunProgram != '':
config.write(' {}\n'.format(self.installerRunProgram))
config.write(' {}\n'.format(packageConf['Package']['runMessage'].strip()))
config.write(' {}\n'.format(appName))
- config.write(' AkVirtualCameraUninstall\n')
+ config.write(' {}Uninstall\n'.format(appName))
config.write(' true\n')
config.write(' {}\n'.format(self.installerTargetDir))
config.write('\n')
@@ -585,7 +598,10 @@ class DeployToolsQt(tools.utils.DeployToolsUtils):
f.write(' true\n')
f.write(' true\n')
f.write(' false\n')
- f.write(' true\n')
+
+ if self.adminRights:
+ f.write(' true\n')
+
f.write('\n')
# Remove old file
diff --git a/ports/deploy/tools/utils.py b/ports/deploy/tools/utils.py
index ba14130..6f0edeb 100644
--- a/ports/deploy/tools/utils.py
+++ b/ports/deploy/tools/utils.py
@@ -212,16 +212,12 @@ class DeployToolsUtils:
break
- def makeInstall(self, buildDir, installRoot=''):
+ def makeInstall(self, buildDir, params={}):
previousDir = os.getcwd()
os.chdir(buildDir)
-
- if installRoot == '':
- process = subprocess.Popen([self.make, 'install'], # nosec
- stdout=subprocess.PIPE)
- else:
- process = subprocess.Popen([self.make, 'INSTALL_ROOT=' + installRoot, 'install'], # nosec
- stdout=subprocess.PIPE)
+ params_ = [key + '=' + params[key] for key in params]
+ process = subprocess.Popen([self.make, 'install'] + params_, # nosec
+ stdout=subprocess.PIPE)
process.communicate()
os.chdir(previousDir)
diff --git a/share/icons/webcamoid.png b/share/icons/webcamoid.png
deleted file mode 100644
index 930d545..0000000
Binary files a/share/icons/webcamoid.png and /dev/null differ