2022-04-18 15:37:35 +08:00
#!/usr/bin/env python3
import os
2022-10-21 17:24:07 +08:00
import pathlib
2022-04-18 15:37:35 +08:00
import platform
2022-05-28 18:42:38 +08:00
import zipfile
import urllib . request
import shutil
2022-04-18 15:37:35 +08:00
import hashlib
2022-05-28 18:42:38 +08:00
import argparse
2022-12-02 11:41:22 +08:00
import sys
2022-04-18 15:37:35 +08:00
windows = platform . platform ( ) . startswith ( ' Windows ' )
2022-11-20 16:54:54 +08:00
osx = platform . platform ( ) . startswith (
' Darwin ' ) or platform . platform ( ) . startswith ( " macOS " )
2022-04-18 15:37:35 +08:00
hbb_name = ' rustdesk ' + ( ' .exe ' if windows else ' ' )
exe_path = ' target/release/ ' + hbb_name
2023-04-17 15:16:55 +08:00
if windows :
2024-02-11 00:15:11 +08:00
flutter_build_dir = ' build/windows/x64/runner/Release/ '
2023-04-17 15:16:55 +08:00
elif osx :
flutter_build_dir = ' build/macos/Build/Products/Release/ '
else :
flutter_build_dir = ' build/linux/x64/release/bundle/ '
flutter_build_dir_2 = f ' flutter/ { flutter_build_dir } '
2022-11-21 17:10:38 +08:00
skip_cargo = False
2022-04-18 15:37:35 +08:00
2023-10-30 00:06:53 +08:00
2024-07-01 11:01:35 +08:00
def get_deb_arch ( ) - > str :
custom_arch = os . environ . get ( " DEB_ARCH " )
2023-03-27 15:26:20 +08:00
if custom_arch is None :
return " amd64 "
return custom_arch
2024-07-30 14:52:06 +08:00
def get_deb_extra_depends ( ) - > str :
custom_arch = os . environ . get ( " DEB_ARCH " )
if custom_arch == " armhf " : # for arm32v7 libsciter-gtk.so
return " , libatomic1 "
return " "
2023-10-30 00:06:53 +08:00
2023-02-27 20:28:55 +08:00
def system2 ( cmd ) :
2024-04-15 00:52:27 +08:00
exit_code = os . system ( cmd )
if exit_code != 0 :
sys . stderr . write ( f " Error occurred when executing: ` { cmd } `. Exiting. \n " )
2022-12-02 11:41:22 +08:00
sys . exit ( - 1 )
2022-10-22 12:41:37 +08:00
2023-10-30 00:06:53 +08:00
2022-04-18 15:37:35 +08:00
def get_version ( ) :
2022-11-01 21:03:47 +08:00
with open ( " Cargo.toml " , encoding = " utf-8 " ) as fh :
2022-04-18 15:37:35 +08:00
for line in fh :
if line . startswith ( " version " ) :
return line . replace ( " version " , " " ) . replace ( " = " , " " ) . replace ( ' " ' , ' ' ) . strip ( )
return ' '
2022-07-22 12:41:49 +08:00
def parse_rc_features ( feature ) :
2024-07-20 23:49:40 +08:00
available_features = { }
2022-05-28 18:42:38 +08:00
apply_features = { }
if not feature :
2022-10-21 13:38:44 +08:00
feature = [ ]
2023-04-17 14:49:58 +08:00
def platform_check ( platforms ) :
if windows :
return ' windows ' in platforms
elif osx :
return ' osx ' in platforms
else :
return ' linux ' in platforms
2023-08-01 06:36:19 +08:00
2023-04-17 19:01:12 +08:00
def get_all_features ( ) :
features = [ ]
2023-04-17 14:49:58 +08:00
for ( feat , feat_info ) in available_features . items ( ) :
if platform_check ( feat_info [ ' platform ' ] ) :
2023-04-17 19:01:12 +08:00
features . append ( feat )
return features
2023-08-01 06:36:19 +08:00
2023-04-17 19:01:12 +08:00
if isinstance ( feature , str ) and feature . upper ( ) == ' ALL ' :
return get_all_features ( )
2022-05-28 18:42:38 +08:00
elif isinstance ( feature , list ) :
2023-04-17 14:49:58 +08:00
if windows :
2024-02-26 02:24:00 +08:00
# download third party is deprecated, we use github ci instead.
# feature.append('PrivacyMode')
pass
2022-05-28 18:42:38 +08:00
for feat in feature :
if isinstance ( feat , str ) and feat . upper ( ) == ' ALL ' :
2023-04-17 19:01:12 +08:00
return get_all_features ( )
2022-05-28 18:42:38 +08:00
if feat in available_features :
2023-04-17 14:49:58 +08:00
if platform_check ( available_features [ feat ] [ ' platform ' ] ) :
apply_features [ feat ] = available_features [ feat ]
2022-05-28 18:42:38 +08:00
else :
print ( f ' Unrecognized feature { feat } ' )
return apply_features
else :
raise Exception ( f ' Unsupported features param { feature } ' )
def make_parser ( ) :
parser = argparse . ArgumentParser ( description = ' Build script. ' )
parser . add_argument (
' -f ' ,
' --feature ' ,
dest = ' feature ' ,
metavar = ' N ' ,
type = str ,
nargs = ' + ' ,
default = ' ' ,
help = ' Integrate features, windows only. '
2024-07-20 23:49:40 +08:00
' Available: [Not used for now]. Special value is " ALL " and empty " " . Default is empty. ' )
2022-08-25 17:35:45 +08:00
parser . add_argument ( ' --flutter ' , action = ' store_true ' ,
help = ' Build flutter package ' , default = False )
2022-06-14 15:01:07 +08:00
parser . add_argument (
' --hwcodec ' ,
action = ' store_true ' ,
2022-10-22 12:41:37 +08:00
help = ' Enable feature hwcodec ' + (
' ' if windows or osx else ' , need libva-dev, libvdpau-dev. ' )
2022-06-14 15:01:07 +08:00
)
2024-01-02 16:58:10 +08:00
parser . add_argument (
2024-04-12 17:26:24 +08:00
' --vram ' ,
2024-01-02 16:58:10 +08:00
action = ' store_true ' ,
2024-04-12 17:26:24 +08:00
help = ' Enable feature vram, only available on windows now. '
2024-01-02 16:58:10 +08:00
)
2022-09-21 11:28:28 +08:00
parser . add_argument (
' --portable ' ,
action = ' store_true ' ,
help = ' Build windows portable '
)
2023-10-30 00:06:53 +08:00
parser . add_argument (
' --unix-file-copy-paste ' ,
action = ' store_true ' ,
help = ' Build with unix file copy paste feature '
)
2022-11-21 17:10:38 +08:00
parser . add_argument (
' --skip-cargo ' ,
action = ' store_true ' ,
help = ' Skip cargo build process, only flutter version + Linux supported currently '
)
2024-02-26 02:20:37 +08:00
if windows :
parser . add_argument (
' --skip-portable-pack ' ,
action = ' store_true ' ,
help = ' Skip packing, only flutter version + Windows supported '
)
2023-03-27 15:26:20 +08:00
parser . add_argument (
" --package " ,
type = str
)
2022-05-28 18:42:38 +08:00
return parser
2022-10-22 12:41:37 +08:00
# Generate build script for docker
#
# it assumes all build dependencies are installed in environments
# Note: do not use it in bare metal, or may break build environments
def generate_build_script_for_docker ( ) :
with open ( " /tmp/build.sh " , " w " ) as f :
f . write ( '''
#!/bin/bash
# environment
export CPATH = " $(clang -v 2>&1 | grep " Selected GCC installation : " | cut -d ' ' -f4-)/include "
# flutter
pushd / opt
wget https : / / storage . googleapis . com / flutter_infra_release / releases / stable / linux / flutter_linux_3 .0 .5 - stable . tar . xz
tar - xvf flutter_linux_3 .0 .5 - stable . tar . xz
export PATH = ` pwd ` / flutter / bin : $ PATH
popd
# flutter_rust_bridge
dart pub global activate ffigen - - version 5.0 .1
pushd / tmp & & git clone https : / / github . com / SoLongAndThanksForAllThePizza / flutter_rust_bridge - - depth = 1 & & popd
pushd / tmp / flutter_rust_bridge / frb_codegen & & cargo install - - path . & & popd
pushd flutter & & flutter pub get & & popd
~ / . cargo / bin / flutter_rust_bridge_codegen - - rust - input . / src / flutter_ffi . rs - - dart - output . / flutter / lib / generated_bridge . dart
# install vcpkg
pushd / opt
export VCPKG_ROOT = ` pwd ` / vcpkg
git clone https : / / github . com / microsoft / vcpkg
vcpkg / bootstrap - vcpkg . sh
popd
2023-11-01 17:37:39 +08:00
$ VCPKG_ROOT / vcpkg install - - x - install - root = " $VCPKG_ROOT/installed "
2022-10-22 12:41:37 +08:00
# build rustdesk
. / build . py - - flutter - - hwcodec
''' )
2023-02-27 20:28:55 +08:00
system2 ( " chmod +x /tmp/build.sh " )
system2 ( " bash /tmp/build.sh " )
2022-10-22 12:41:37 +08:00
2022-11-20 16:54:54 +08:00
2024-02-26 02:24:00 +08:00
# Downloading third party resources is deprecated.
# We can use this function in an offline build environment.
# Even in an online environment, we recommend building third-party resources yourself.
2022-05-28 18:42:38 +08:00
def download_extract_features ( features , res_dir ) :
2022-12-04 21:59:26 +08:00
import re
2022-10-22 12:41:37 +08:00
2022-12-04 21:59:26 +08:00
proxy = ' '
2023-10-30 00:06:53 +08:00
2022-10-21 13:38:44 +08:00
def req ( url ) :
if not proxy :
return url
else :
r = urllib . request . Request ( url )
r . set_proxy ( proxy , ' http ' )
r . set_proxy ( proxy , ' https ' )
return r
2022-05-28 18:42:38 +08:00
for ( feat , feat_info ) in features . items ( ) :
2022-12-04 21:59:26 +08:00
includes = feat_info [ ' include ' ] if ' include ' in feat_info and feat_info [ ' include ' ] else [ ]
2023-10-30 00:06:53 +08:00
includes = [ re . compile ( p ) for p in includes ]
2022-12-04 21:59:26 +08:00
excludes = feat_info [ ' exclude ' ] if ' exclude ' in feat_info and feat_info [ ' exclude ' ] else [ ]
2023-10-30 00:06:53 +08:00
excludes = [ re . compile ( p ) for p in excludes ]
2022-12-04 21:59:26 +08:00
2022-05-28 18:42:38 +08:00
print ( f ' { feat } download begin ' )
download_filename = feat_info [ ' zip_url ' ] . split ( ' / ' ) [ - 1 ]
2022-11-20 16:54:54 +08:00
checksum_md5_response = urllib . request . urlopen (
req ( feat_info [ ' checksum_url ' ] ) )
2022-10-21 13:38:44 +08:00
for line in checksum_md5_response . read ( ) . decode ( ' utf-8 ' ) . splitlines ( ) :
if line . split ( ) [ 1 ] == download_filename :
checksum_md5 = line . split ( ) [ 0 ]
2022-10-22 12:41:37 +08:00
filename , _headers = urllib . request . urlretrieve ( feat_info [ ' zip_url ' ] ,
download_filename )
2022-10-21 13:38:44 +08:00
md5 = hashlib . md5 ( open ( filename , ' rb ' ) . read ( ) ) . hexdigest ( )
if checksum_md5 != md5 :
raise Exception ( f ' { feat } download failed ' )
print ( f ' { feat } download end. extract bein ' )
zip_file = zipfile . ZipFile ( filename )
zip_list = zip_file . namelist ( )
for f in zip_list :
2022-12-04 21:59:26 +08:00
file_exclude = False
for p in excludes :
if p . match ( f ) is not None :
file_exclude = True
break
if file_exclude :
continue
file_include = False if includes else True
for p in includes :
if p . match ( f ) is not None :
file_include = True
break
if file_include :
print ( f ' extract file { f } ' )
zip_file . extract ( f , res_dir )
2022-10-21 13:38:44 +08:00
zip_file . close ( )
os . remove ( download_filename )
print ( f ' { feat } extract end ' )
2022-05-28 18:42:38 +08:00
2023-04-17 15:16:55 +08:00
def external_resources ( flutter , args , res_dir ) :
2022-07-22 12:41:49 +08:00
features = parse_rc_features ( args . feature )
2022-10-21 17:24:07 +08:00
if not features :
2023-04-17 14:18:00 +08:00
return
2022-10-21 17:24:07 +08:00
print ( f ' Build with features { list ( features . keys ( ) ) } ' )
if os . path . isdir ( res_dir ) and not os . path . islink ( res_dir ) :
shutil . rmtree ( res_dir )
elif os . path . exists ( res_dir ) :
raise Exception ( f ' Find file { res_dir } , not a directory ' )
os . makedirs ( res_dir , exist_ok = True )
download_extract_features ( features , res_dir )
2023-04-17 15:16:55 +08:00
if flutter :
os . makedirs ( flutter_build_dir_2 , exist_ok = True )
for f in pathlib . Path ( res_dir ) . iterdir ( ) :
print ( f ' { f } ' )
if f . is_file ( ) :
shutil . copy2 ( f , flutter_build_dir_2 )
else :
shutil . copytree ( f , f ' { flutter_build_dir_2 } { f . stem } ' )
2022-10-22 12:41:37 +08:00
2022-05-28 18:42:38 +08:00
2022-07-22 09:14:18 +08:00
def get_features ( args ) :
2022-11-20 16:54:54 +08:00
features = [ ' inline ' ] if not args . flutter else [ ]
2022-07-22 09:14:18 +08:00
if args . hwcodec :
features . append ( ' hwcodec ' )
2024-04-12 17:26:24 +08:00
if args . vram :
features . append ( ' vram ' )
2022-08-25 17:35:45 +08:00
if args . flutter :
features . append ( ' flutter ' )
2023-10-30 00:06:53 +08:00
if args . unix_file_copy_paste :
features . append ( ' unix-file-copy-paste ' )
2022-07-22 09:14:18 +08:00
print ( " features: " , features )
return features
2022-05-28 18:42:38 +08:00
2022-10-22 12:41:37 +08:00
2022-09-13 14:27:07 +08:00
def generate_control_file ( version ) :
2022-09-18 11:50:23 +08:00
control_file_path = " ../res/DEBIAN/control "
2023-02-27 20:28:55 +08:00
system2 ( ' /bin/rm -rf %s ' % control_file_path )
2022-09-13 14:27:07 +08:00
content = """ Package: rustdesk
2024-10-07 21:46:25 +08:00
Section : net
2022-09-13 14:27:07 +08:00
Version : % s
2023-03-27 15:26:20 +08:00
Architecture : % s
2023-04-10 08:52:44 +08:00
Maintainer : rustdesk < info @rustdesk.com >
2022-09-13 14:27:07 +08:00
Homepage : https : / / rustdesk . com
2024-09-15 14:33:59 +08:00
Depends : libgtk - 3 - 0 , libxcb - randr0 , libxdo3 , libxfixes3 , libxcb - shape0 , libxcb - xfixes0 , libasound2 , libsystemd0 , curl , libva - drm2 , libva - x11 - 2 , libvdpau1 , libgstreamer - plugins - base1 .0 - 0 , libpam0g , gstreamer1 .0 - pipewire % s
Recommends : libayatana - appindicator3 - 1
2022-09-13 14:27:07 +08:00
Description : A remote control software .
2024-07-30 14:52:06 +08:00
""" % (version, get_deb_arch(), get_deb_extra_depends())
2022-09-13 14:27:07 +08:00
file = open ( control_file_path , " w " )
file . write ( content )
file . close ( )
2022-08-25 18:36:44 +08:00
2022-10-22 12:41:37 +08:00
def ffi_bindgen_function_refactor ( ) :
2022-10-12 11:34:58 +08:00
# workaround ffigen
2023-02-27 20:28:55 +08:00
system2 (
2022-10-22 12:41:37 +08:00
' sed -i " s/ffi.NativeFunction<ffi.Bool Function(DartPort/ffi.NativeFunction<ffi.Uint8 Function(DartPort/g " flutter/lib/generated_bridge.dart ' )
def build_flutter_deb ( version , features ) :
2022-11-21 17:10:38 +08:00
if not skip_cargo :
2023-02-27 20:28:55 +08:00
system2 ( f ' cargo build --features { features } --lib --release ' )
2022-11-21 17:10:38 +08:00
ffi_bindgen_function_refactor ( )
2022-08-25 18:36:44 +08:00
os . chdir ( ' flutter ' )
2023-02-27 20:28:55 +08:00
system2 ( ' flutter build linux --release ' )
system2 ( ' mkdir -p tmpdeb/usr/bin/ ' )
system2 ( ' mkdir -p tmpdeb/usr/lib/rustdesk ' )
2023-03-23 18:40:25 +08:00
system2 ( ' mkdir -p tmpdeb/etc/rustdesk/ ' )
system2 ( ' mkdir -p tmpdeb/etc/pam.d/ ' )
2023-02-27 20:28:55 +08:00
system2 ( ' mkdir -p tmpdeb/usr/share/rustdesk/files/systemd/ ' )
2023-08-02 01:33:06 +08:00
system2 ( ' mkdir -p tmpdeb/usr/share/icons/hicolor/256x256/apps/ ' )
system2 ( ' mkdir -p tmpdeb/usr/share/icons/hicolor/scalable/apps/ ' )
2023-02-27 20:28:55 +08:00
system2 ( ' mkdir -p tmpdeb/usr/share/applications/ ' )
system2 ( ' mkdir -p tmpdeb/usr/share/polkit-1/actions ' )
system2 ( ' rm tmpdeb/usr/bin/rustdesk || true ' )
system2 (
2023-04-17 15:16:55 +08:00
f ' cp -r { flutter_build_dir } /* tmpdeb/usr/lib/rustdesk/ ' )
2023-02-27 20:28:55 +08:00
system2 (
2022-09-18 11:50:23 +08:00
' cp ../res/rustdesk.service tmpdeb/usr/share/rustdesk/files/systemd/ ' )
2023-02-27 20:28:55 +08:00
system2 (
2023-08-01 06:36:19 +08:00
' cp ../res/128x128@2x.png tmpdeb/usr/share/icons/hicolor/256x256/apps/rustdesk.png ' )
2023-08-01 06:54:21 +08:00
system2 (
' cp ../res/scalable.svg tmpdeb/usr/share/icons/hicolor/scalable/apps/rustdesk.svg ' )
2023-02-27 20:28:55 +08:00
system2 (
2022-09-18 11:50:23 +08:00
' cp ../res/rustdesk.desktop tmpdeb/usr/share/applications/rustdesk.desktop ' )
2023-02-27 20:28:55 +08:00
system2 (
2022-10-11 19:52:03 +08:00
' cp ../res/rustdesk-link.desktop tmpdeb/usr/share/applications/rustdesk-link.desktop ' )
2023-03-23 18:40:25 +08:00
system2 (
' cp ../res/startwm.sh tmpdeb/etc/rustdesk/ ' )
system2 (
' cp ../res/xorg.conf tmpdeb/etc/rustdesk/ ' )
system2 (
' cp ../res/pam.d/rustdesk.debian tmpdeb/etc/pam.d/rustdesk ' )
2023-02-27 20:28:55 +08:00
system2 (
2022-10-22 12:41:37 +08:00
" echo \" #!/bin/sh \" >> tmpdeb/usr/share/rustdesk/files/polkit && chmod a+x tmpdeb/usr/share/rustdesk/files/polkit " )
2022-09-14 10:30:57 +08:00
2023-02-27 20:28:55 +08:00
system2 ( ' mkdir -p tmpdeb/DEBIAN ' )
2022-09-13 14:27:07 +08:00
generate_control_file ( version )
2023-02-27 20:28:55 +08:00
system2 ( ' cp -a ../res/DEBIAN/* tmpdeb/DEBIAN/ ' )
2022-08-25 18:36:44 +08:00
md5_file ( ' usr/share/rustdesk/files/systemd/rustdesk.service ' )
2023-02-27 20:28:55 +08:00
system2 ( ' dpkg-deb -b tmpdeb rustdesk.deb; ' )
2022-09-13 14:27:07 +08:00
2023-02-27 20:28:55 +08:00
system2 ( ' /bin/rm -rf tmpdeb/ ' )
system2 ( ' /bin/rm -rf ../res/DEBIAN/control ' )
2022-08-25 18:36:44 +08:00
os . rename ( ' rustdesk.deb ' , ' ../rustdesk- %s .deb ' % version )
os . chdir ( " .. " )
2023-10-30 00:06:53 +08:00
2023-03-27 15:26:20 +08:00
def build_deb_from_folder ( version , binary_folder ) :
os . chdir ( ' flutter ' )
system2 ( ' mkdir -p tmpdeb/usr/bin/ ' )
system2 ( ' mkdir -p tmpdeb/usr/lib/rustdesk ' )
system2 ( ' mkdir -p tmpdeb/usr/share/rustdesk/files/systemd/ ' )
2023-08-02 01:33:06 +08:00
system2 ( ' mkdir -p tmpdeb/usr/share/icons/hicolor/256x256/apps/ ' )
system2 ( ' mkdir -p tmpdeb/usr/share/icons/hicolor/scalable/apps/ ' )
2023-03-27 15:26:20 +08:00
system2 ( ' mkdir -p tmpdeb/usr/share/applications/ ' )
system2 ( ' mkdir -p tmpdeb/usr/share/polkit-1/actions ' )
system2 ( ' rm tmpdeb/usr/bin/rustdesk || true ' )
system2 (
f ' cp -r ../ { binary_folder } /* tmpdeb/usr/lib/rustdesk/ ' )
system2 (
' cp ../res/rustdesk.service tmpdeb/usr/share/rustdesk/files/systemd/ ' )
system2 (
2023-08-01 06:36:19 +08:00
' cp ../res/128x128@2x.png tmpdeb/usr/share/icons/hicolor/256x256/apps/rustdesk.png ' )
2023-08-01 06:54:21 +08:00
system2 (
' cp ../res/scalable.svg tmpdeb/usr/share/icons/hicolor/scalable/apps/rustdesk.svg ' )
2023-03-27 15:26:20 +08:00
system2 (
' cp ../res/rustdesk.desktop tmpdeb/usr/share/applications/rustdesk.desktop ' )
system2 (
' cp ../res/rustdesk-link.desktop tmpdeb/usr/share/applications/rustdesk-link.desktop ' )
system2 (
" echo \" #!/bin/sh \" >> tmpdeb/usr/share/rustdesk/files/polkit && chmod a+x tmpdeb/usr/share/rustdesk/files/polkit " )
system2 ( ' mkdir -p tmpdeb/DEBIAN ' )
generate_control_file ( version )
system2 ( ' cp -a ../res/DEBIAN/* tmpdeb/DEBIAN/ ' )
md5_file ( ' usr/share/rustdesk/files/systemd/rustdesk.service ' )
system2 ( ' dpkg-deb -b tmpdeb rustdesk.deb; ' )
system2 ( ' /bin/rm -rf tmpdeb/ ' )
system2 ( ' /bin/rm -rf ../res/DEBIAN/control ' )
os . rename ( ' rustdesk.deb ' , ' ../rustdesk- %s .deb ' % version )
os . chdir ( " .. " )
2022-08-25 18:36:44 +08:00
2023-10-30 00:06:53 +08:00
2022-11-20 16:40:59 +08:00
def build_flutter_dmg ( version , features ) :
2022-11-21 17:10:38 +08:00
if not skip_cargo :
2023-01-06 10:23:46 +08:00
# set minimum osx build target, now is 10.14, which is the same as the flutter xcode project
2023-10-30 00:06:53 +08:00
system2 (
f ' MACOSX_DEPLOYMENT_TARGET=10.14 cargo build --features { features } --lib --release ' )
2022-11-20 16:54:54 +08:00
# copy dylib
2023-02-27 20:28:55 +08:00
system2 (
2022-11-20 16:54:54 +08:00
" cp target/release/liblibrustdesk.dylib target/release/librustdesk.dylib " )
2022-11-20 16:40:59 +08:00
os . chdir ( ' flutter ' )
2023-02-27 20:28:55 +08:00
system2 ( ' flutter build macos --release ' )
2024-03-24 14:04:05 +08:00
'''
2023-02-27 20:28:55 +08:00
system2 (
2023-02-28 19:25:14 +08:00
" create-dmg --volname \" RustDesk Installer \" --window-pos 200 120 --window-size 800 400 --icon-size 100 --app-drop-link 600 185 --icon RustDesk.app 200 190 --hide-extension RustDesk.app rustdesk.dmg ./build/macos/Build/Products/Release/RustDesk.app " )
2022-11-20 16:54:54 +08:00
os . rename ( " rustdesk.dmg " , f " ../rustdesk- { version } .dmg " )
2024-03-24 14:04:05 +08:00
'''
2022-11-20 16:54:54 +08:00
os . chdir ( " .. " )
2022-11-20 16:40:59 +08:00
2022-10-22 12:41:37 +08:00
def build_flutter_arch_manjaro ( version , features ) :
2022-11-21 17:10:38 +08:00
if not skip_cargo :
2023-02-27 20:28:55 +08:00
system2 ( f ' cargo build --features { features } --lib --release ' )
2022-10-22 12:41:37 +08:00
ffi_bindgen_function_refactor ( )
2022-08-25 18:36:44 +08:00
os . chdir ( ' flutter ' )
2023-02-27 20:28:55 +08:00
system2 ( ' flutter build linux --release ' )
2023-04-17 15:16:55 +08:00
system2 ( f ' strip { flutter_build_dir } /lib/librustdesk.so ' )
2022-10-22 12:41:37 +08:00
os . chdir ( ' ../res ' )
2023-02-27 20:28:55 +08:00
system2 ( ' HBB=`pwd`/.. FLUTTER=1 makepkg -f ' )
2022-10-22 12:41:37 +08:00
2022-08-25 18:36:44 +08:00
2024-02-26 02:20:37 +08:00
def build_flutter_windows ( version , features , skip_portable_pack ) :
2022-11-21 17:10:38 +08:00
if not skip_cargo :
2023-02-27 20:28:55 +08:00
system2 ( f ' cargo build --features { features } --lib --release ' )
2022-11-21 17:10:38 +08:00
if not os . path . exists ( " target/release/librustdesk.dll " ) :
print ( " cargo build failed, please check rust source code. " )
exit ( - 1 )
2022-09-21 11:28:28 +08:00
os . chdir ( ' flutter ' )
2023-02-27 20:28:55 +08:00
system2 ( ' flutter build windows --release ' )
2022-09-21 11:28:28 +08:00
os . chdir ( ' .. ' )
2022-11-20 16:54:54 +08:00
shutil . copy2 ( ' target/release/deps/dylib_virtual_display.dll ' ,
2023-04-17 15:16:55 +08:00
flutter_build_dir_2 )
2024-02-26 02:20:37 +08:00
if skip_portable_pack :
return
2022-10-21 17:24:07 +08:00
os . chdir ( ' libs/portable ' )
2023-02-27 20:28:55 +08:00
system2 ( ' pip3 install -r requirements.txt ' )
system2 (
2023-04-17 15:16:55 +08:00
f ' python3 ./generate.py -f ../../ { flutter_build_dir_2 } -o . -e ../../ { flutter_build_dir_2 } /rustdesk.exe ' )
2022-10-21 17:24:07 +08:00
os . chdir ( ' ../.. ' )
if os . path . exists ( ' ./rustdesk_portable.exe ' ) :
2022-11-20 16:54:54 +08:00
os . replace ( ' ./target/release/rustdesk-portable-packer.exe ' ,
' ./rustdesk_portable.exe ' )
2022-09-21 11:28:28 +08:00
else :
2022-11-20 16:54:54 +08:00
os . rename ( ' ./target/release/rustdesk-portable-packer.exe ' ,
' ./rustdesk_portable.exe ' )
print (
f ' output location: { os . path . abspath ( os . curdir ) } /rustdesk_portable.exe ' )
2022-10-21 17:24:07 +08:00
os . rename ( ' ./rustdesk_portable.exe ' , f ' ./rustdesk- { version } -install.exe ' )
2022-11-20 16:54:54 +08:00
print (
f ' output location: { os . path . abspath ( os . curdir ) } /rustdesk- { version } -install.exe ' )
2022-08-25 18:36:44 +08:00
2022-10-22 12:41:37 +08:00
2022-04-18 15:37:35 +08:00
def main ( ) :
2022-11-21 17:10:38 +08:00
global skip_cargo
2022-05-28 18:42:38 +08:00
parser = make_parser ( )
args = parser . parse_args ( )
2022-04-18 15:37:35 +08:00
if os . path . exists ( exe_path ) :
os . unlink ( exe_path )
if os . path . isfile ( ' /usr/bin/pacman ' ) :
2023-02-27 20:28:55 +08:00
system2 ( ' git checkout src/ui/common.tis ' )
2022-04-18 15:37:35 +08:00
version = get_version ( )
2022-10-21 17:24:07 +08:00
features = ' , ' . join ( get_features ( args ) )
2022-08-25 17:35:45 +08:00
flutter = args . flutter
2022-11-20 16:54:54 +08:00
if not flutter :
2023-02-27 20:28:55 +08:00
system2 ( ' python3 res/inline-sciter.py ' )
2022-11-21 17:10:38 +08:00
print ( args . skip_cargo )
if args . skip_cargo :
skip_cargo = True
2022-09-21 11:28:28 +08:00
portable = args . portable
2023-03-27 15:26:20 +08:00
package = args . package
if package :
build_deb_from_folder ( version , package )
return
2023-04-17 15:16:55 +08:00
res_dir = ' resources '
external_resources ( flutter , args , res_dir )
2022-04-18 15:37:35 +08:00
if windows :
2022-11-18 17:09:52 +08:00
# build virtual display dynamic library
os . chdir ( ' libs/virtual_display/dylib ' )
2023-02-27 20:28:55 +08:00
system2 ( ' cargo build --release ' )
2022-11-18 17:09:52 +08:00
os . chdir ( ' ../../.. ' )
2023-03-07 20:42:40 +08:00
2022-10-11 14:52:46 +08:00
if flutter :
2024-02-26 02:20:37 +08:00
build_flutter_windows ( version , features , args . skip_portable_pack )
2022-09-21 11:28:28 +08:00
return
2023-02-27 20:28:55 +08:00
system2 ( ' cargo build --release --features ' + features )
# system2('upx.exe target/release/rustdesk.exe')
system2 ( ' mv target/release/rustdesk.exe target/release/RustDesk.exe ' )
2022-05-01 23:39:03 +08:00
pa = os . environ . get ( ' P ' )
if pa :
2024-02-19 23:23:00 +08:00
# https://certera.com/kb/tutorial-guide-for-safenet-authentication-client-for-code-signing/
2023-02-27 20:28:55 +08:00
system2 (
2022-10-22 12:41:37 +08:00
f ' signtool sign /a /v /p { pa } /debug /f . \\ cert.pfx /t http://timestamp.digicert.com '
' target \\ release \\ rustdesk.exe ' )
2022-05-01 23:39:03 +08:00
else :
2022-05-28 18:42:38 +08:00
print ( ' Not signed ' )
2023-02-27 20:28:55 +08:00
system2 (
2023-04-17 15:16:55 +08:00
f ' cp -rf target/release/RustDesk.exe { res_dir } ' )
os . chdir ( ' libs/portable ' )
system2 ( ' pip3 install -r requirements.txt ' )
system2 (
2023-04-17 15:26:50 +08:00
f ' python3 ./generate.py -f ../../ { res_dir } -o . -e ../../ { res_dir } /rustdesk- { version } -win7-install.exe ' )
system2 ( ' mv ../../ {res_dir} /rustdesk- {version} -win7-install.exe ../.. ' )
2022-10-05 18:32:20 +08:00
elif os . path . isfile ( ' /usr/bin/pacman ' ) :
2022-09-12 19:17:46 +08:00
# pacman -S -needed base-devel
2023-02-27 20:28:55 +08:00
system2 ( " sed -i ' s/pkgver=.*/pkgver= %s /g ' res/PKGBUILD " % version )
2022-08-25 17:35:45 +08:00
if flutter :
2022-10-22 12:41:37 +08:00
build_flutter_arch_manjaro ( version , features )
2022-08-25 17:35:45 +08:00
else :
2023-02-27 20:28:55 +08:00
system2 ( ' cargo build --release --features ' + features )
system2 ( ' git checkout src/ui/common.tis ' )
system2 ( ' strip target/release/rustdesk ' )
system2 ( ' ln -s res/pacman_install && ln -s res/PKGBUILD ' )
system2 ( ' HBB=`pwd` makepkg -f ' )
system2 ( ' mv rustdesk- %s -0-x86_64.pkg.tar.zst rustdesk- %s -manjaro-arch.pkg.tar.zst ' % (
2022-11-20 16:54:54 +08:00
version , version ) )
2022-09-12 19:17:46 +08:00
# pacman -U ./rustdesk.pkg.tar.zst
2022-05-23 11:59:56 +08:00
elif os . path . isfile ( ' /usr/bin/yum ' ) :
2023-02-27 20:28:55 +08:00
system2 ( ' cargo build --release --features ' + features )
system2 ( ' strip target/release/rustdesk ' )
system2 (
2022-11-20 16:54:54 +08:00
" sed -i ' s/Version: .*/Version: %s /g ' res/rpm.spec " % version )
2023-02-27 20:28:55 +08:00
system2 ( ' HBB=`pwd` rpmbuild -ba res/rpm.spec ' )
system2 (
2022-10-22 12:41:37 +08:00
' mv $HOME/rpmbuild/RPMS/x86_64/rustdesk- %s -0.x86_64.rpm ./rustdesk- %s -fedora28-centos8.rpm ' % (
version , version ) )
2022-05-23 11:59:56 +08:00
# yum localinstall rustdesk.rpm
elif os . path . isfile ( ' /usr/bin/zypper ' ) :
2023-02-27 20:28:55 +08:00
system2 ( ' cargo build --release --features ' + features )
system2 ( ' strip target/release/rustdesk ' )
system2 (
2022-11-20 16:54:54 +08:00
" sed -i ' s/Version: .*/Version: %s /g ' res/rpm-suse.spec " % version )
2023-02-27 20:28:55 +08:00
system2 ( ' HBB=`pwd` rpmbuild -ba res/rpm-suse.spec ' )
system2 (
2022-10-22 12:41:37 +08:00
' mv $HOME/rpmbuild/RPMS/x86_64/rustdesk- %s -0.x86_64.rpm ./rustdesk- %s -suse.rpm ' % (
2022-11-20 16:54:54 +08:00
version , version ) )
2022-05-23 11:59:56 +08:00
# yum localinstall rustdesk.rpm
2022-04-18 15:37:35 +08:00
else :
2022-08-25 18:36:44 +08:00
if flutter :
if osx :
2022-11-20 16:40:59 +08:00
build_flutter_dmg ( version , features )
2022-08-25 18:36:44 +08:00
pass
2022-05-01 23:39:03 +08:00
else :
2023-02-27 20:28:55 +08:00
# system2(
2022-11-21 17:10:38 +08:00
# 'mv target/release/bundle/deb/rustdesk*.deb ./flutter/rustdesk.deb')
2022-10-22 12:41:37 +08:00
build_flutter_deb ( version , features )
2022-04-18 15:37:35 +08:00
else :
2023-02-27 20:28:55 +08:00
system2 ( ' cargo bundle --release --features ' + features )
2022-08-25 18:36:44 +08:00
if osx :
2023-02-27 20:28:55 +08:00
system2 (
2022-08-25 18:36:44 +08:00
' strip target/release/bundle/osx/RustDesk.app/Contents/MacOS/rustdesk ' )
2023-02-27 20:28:55 +08:00
system2 (
2022-08-25 18:36:44 +08:00
' cp libsciter.dylib target/release/bundle/osx/RustDesk.app/Contents/MacOS/ ' )
# https://github.com/sindresorhus/create-dmg
2023-02-27 20:28:55 +08:00
system2 ( ' /bin/rm -rf *.dmg ' )
2022-08-25 18:36:44 +08:00
pa = os . environ . get ( ' P ' )
if pa :
2023-02-27 20:28:55 +08:00
system2 ( '''
2022-08-25 18:36:44 +08:00
# buggy: rcodesign sign ... path/*, have to sign one by one
2023-01-05 21:04:40 +08:00
# install rcodesign via cargo install apple-codesign
2022-08-25 18:36:44 +08:00
#rcodesign sign --p12-file ~/.p12/rustdesk-developer-id.p12 --p12-password-file ~/.p12/.cert-pass --code-signature-flags runtime ./target/release/bundle/osx/RustDesk.app/Contents/MacOS/rustdesk
#rcodesign sign --p12-file ~/.p12/rustdesk-developer-id.p12 --p12-password-file ~/.p12/.cert-pass --code-signature-flags runtime ./target/release/bundle/osx/RustDesk.app/Contents/MacOS/libsciter.dylib
#rcodesign sign --p12-file ~/.p12/rustdesk-developer-id.p12 --p12-password-file ~/.p12/.cert-pass --code-signature-flags runtime ./target/release/bundle/osx/RustDesk.app
# goto "Keychain Access" -> "My Certificates" for below id which starts with "Developer ID Application:"
codesign - s " Developer ID Application: {0} " - - force - - options runtime . / target / release / bundle / osx / RustDesk . app / Contents / MacOS / *
codesign - s " Developer ID Application: {0} " - - force - - options runtime . / target / release / bundle / osx / RustDesk . app
''' .format(pa))
2023-10-30 00:06:53 +08:00
system2 (
' create-dmg " RustDesk %s .dmg " " target/release/bundle/osx/RustDesk.app " ' % version )
2022-08-25 18:36:44 +08:00
os . rename ( ' RustDesk %s .dmg ' %
version , ' rustdesk- %s .dmg ' % version )
if pa :
2023-02-27 20:28:55 +08:00
system2 ( '''
2023-01-05 17:45:41 +08:00
# https://pyoxidizer.readthedocs.io/en/apple-codesign-0.14.0/apple_codesign.html
# https://pyoxidizer.readthedocs.io/en/stable/tugger_code_signing.html
# https://developer.apple.com/developer-id/
# goto xcode and login with apple id, manager certificates (Developer ID Application and/or Developer ID Installer) online there (only download and double click (install) cer file can not export p12 because no private key)
2022-08-25 18:36:44 +08:00
#rcodesign sign --p12-file ~/.p12/rustdesk-developer-id.p12 --p12-password-file ~/.p12/.cert-pass --code-signature-flags runtime ./rustdesk-{1}.dmg
codesign - s " Developer ID Application: {0} " - - force - - options runtime . / rustdesk - { 1 } . dmg
2023-01-05 17:45:41 +08:00
# https://appstoreconnect.apple.com/access/api
2023-06-24 02:59:50 +08:00
# https://gregoryszorc.com/docs/apple-codesign/stable/apple_codesign_getting_started.html#apple-codesign-app-store-connect-api-key
# p8 file is generated when you generate api key (can download only once)
rcodesign notary - submit - - api - key - path . . / . p12 / api - key . json - - staple rustdesk - { 1 } . dmg
2022-08-25 18:36:44 +08:00
# verify: spctl -a -t exec -v /Applications/RustDesk.app
2023-06-24 02:59:50 +08:00
''' .format(pa, version))
2022-08-25 18:36:44 +08:00
else :
print ( ' Not signed ' )
else :
2023-10-28 16:57:50 +08:00
# build deb package
2023-02-27 20:28:55 +08:00
system2 (
2022-08-25 18:36:44 +08:00
' mv target/release/bundle/deb/rustdesk*.deb ./rustdesk.deb ' )
2023-02-27 20:28:55 +08:00
system2 ( ' dpkg-deb -R rustdesk.deb tmpdeb ' )
system2 ( ' mkdir -p tmpdeb/usr/share/rustdesk/files/systemd/ ' )
2023-08-02 01:33:06 +08:00
system2 ( ' mkdir -p tmpdeb/usr/share/icons/hicolor/256x256/apps/ ' )
system2 ( ' mkdir -p tmpdeb/usr/share/icons/hicolor/scalable/apps/ ' )
2023-02-27 20:28:55 +08:00
system2 (
2022-09-18 11:50:23 +08:00
' cp res/rustdesk.service tmpdeb/usr/share/rustdesk/files/systemd/ ' )
2023-02-27 20:28:55 +08:00
system2 (
2023-08-01 06:36:19 +08:00
' cp res/128x128@2x.png tmpdeb/usr/share/icons/hicolor/256x256/apps/rustdesk.png ' )
2023-08-01 06:54:21 +08:00
system2 (
' cp res/scalable.svg tmpdeb/usr/share/icons/hicolor/scalable/apps/rustdesk.svg ' )
2023-02-27 20:28:55 +08:00
system2 (
2022-09-18 11:50:23 +08:00
' cp res/rustdesk.desktop tmpdeb/usr/share/applications/rustdesk.desktop ' )
2023-02-27 20:28:55 +08:00
system2 (
2022-10-11 19:52:03 +08:00
' cp res/rustdesk-link.desktop tmpdeb/usr/share/applications/rustdesk-link.desktop ' )
2023-03-23 18:40:25 +08:00
os . system ( ' mkdir -p tmpdeb/etc/rustdesk/ ' )
os . system ( ' cp -a res/startwm.sh tmpdeb/etc/rustdesk/ ' )
os . system ( ' mkdir -p tmpdeb/etc/X11/rustdesk/ ' )
os . system ( ' cp res/xorg.conf tmpdeb/etc/X11/rustdesk/ ' )
os . system ( ' cp -a DEBIAN/* tmpdeb/DEBIAN/ ' )
os . system ( ' mkdir -p tmpdeb/etc/pam.d/ ' )
os . system ( ' cp pam.d/rustdesk.debian tmpdeb/etc/pam.d/rustdesk ' )
2023-02-27 20:28:55 +08:00
system2 ( ' strip tmpdeb/usr/bin/rustdesk ' )
system2 ( ' mkdir -p tmpdeb/usr/lib/rustdesk ' )
system2 ( ' mv tmpdeb/usr/bin/rustdesk tmpdeb/usr/lib/rustdesk/ ' )
system2 ( ' cp libsciter-gtk.so tmpdeb/usr/lib/rustdesk/ ' )
2022-08-25 18:36:44 +08:00
md5_file ( ' usr/share/rustdesk/files/systemd/rustdesk.service ' )
2023-03-23 18:40:25 +08:00
md5_file ( ' etc/rustdesk/startwm.sh ' )
md5_file ( ' etc/X11/rustdesk/xorg.conf ' )
md5_file ( ' etc/pam.d/rustdesk ' )
2022-08-25 18:36:44 +08:00
md5_file ( ' usr/lib/rustdesk/libsciter-gtk.so ' )
2023-02-27 20:28:55 +08:00
system2 ( ' dpkg-deb -b tmpdeb rustdesk.deb; /bin/rm -rf tmpdeb/ ' )
2022-08-25 18:36:44 +08:00
os . rename ( ' rustdesk.deb ' , ' rustdesk- %s .deb ' % version )
2022-04-18 15:37:35 +08:00
def md5_file ( fn ) :
md5 = hashlib . md5 ( open ( ' tmpdeb/ ' + fn , ' rb ' ) . read ( ) ) . hexdigest ( )
2023-02-27 20:28:55 +08:00
system2 ( ' echo " %s %s " >> tmpdeb/DEBIAN/md5sums ' % ( md5 , fn ) )
2022-04-18 15:37:35 +08:00
if __name__ == " __main__ " :
main ( )