From 732125b4a2bbb39e88c5121cbdabcd416f0796d7 Mon Sep 17 00:00:00 2001 From: Gorgone Date: Tue, 5 Feb 2019 20:43:10 +0100 Subject: [PATCH] Simplebuild RC4 First public RC --- s3 | 266 +++++++ support/configs/Makefile.master | 795 ++++++++++++++++++++ support/configs/compiler_option | 1 + support/configs/compiler_option.txt | 3 + support/configs/config.sh.master | 752 ++++++++++++++++++ support/configs/max_cpus | 1 + support/configs/max_cpus.txt | 5 + support/configs/simplebuild.config | 8 + support/configs/upx.txt | 16 + support/configs/upx_option | 1 + support/functions/_ansi | 39 + support/functions/_arrays | 54 ++ support/functions/_cmd_build | 203 +++++ support/functions/_compress | 93 +++ support/functions/_gui_build | 117 +++ support/functions/_help | 55 ++ support/functions/_logos | 29 + support/functions/_misc | 547 ++++++++++++++ support/functions/_patch | 102 +++ support/functions/_profiles | 104 +++ support/functions/_subversion | 193 +++++ support/functions/_sys_check | 122 +++ support/functions/_toolchain | 285 +++++++ support/functions/_translation | 51 ++ support/functions/_uploadcam | 55 ++ support/os/debian_ubuntu.install | 137 ++++ support/os/manjaro.install | 126 ++++ support/os/redhat_centos_fedora.install | 182 +++++ support/os/suse.install | 154 ++++ support/profiles/best.box.profile | 5 + support/stapi/liboscam_stapi.a | Bin 0 -> 21160 bytes support/stapi/liboscam_stapi5_OPENBOX.a | Bin 0 -> 64244 bytes support/stapi/liboscam_stapi5_UFS916.a | Bin 0 -> 64248 bytes support/stapi/liboscam_stapi5_UFS916_0.03.a | Bin 0 -> 62670 bytes support/toolchains.cfg/arm_s3_ssl098 | 19 + support/toolchains.cfg/arm_s3_ssl100 | 19 + support/toolchains.cfg/arm_s3_ssl102 | 19 + support/toolchains.cfg/mipsel_s3_ssl098 | 20 + support/toolchains.cfg/mipsel_s3_ssl100 | 20 + support/toolchains.cfg/mipsel_s3_ssl102 | 20 + support/toolchains.cfg/native | 12 + support/toolchains.cfg/openpli40 | 20 + support/toolchains.cfg/openwrt1505cc | 20 + support/toolchains.cfg/osmio4k | 18 + support/toolchains.cfg/solo4k | 18 + support/translation/de | 113 +++ support/translation/en | 100 +++ support/translation/fr | 158 ++++ support/translation/it | 149 ++++ support/translation/nl | 114 +++ support/translation/pl | 115 +++ support/translation/pt | 150 ++++ support/translation/tr | 115 +++ 53 files changed, 5720 insertions(+) create mode 100644 s3 create mode 100644 support/configs/Makefile.master create mode 100644 support/configs/compiler_option create mode 100644 support/configs/compiler_option.txt create mode 100644 support/configs/config.sh.master create mode 100644 support/configs/max_cpus create mode 100644 support/configs/max_cpus.txt create mode 100644 support/configs/simplebuild.config create mode 100644 support/configs/upx.txt create mode 100644 support/configs/upx_option create mode 100644 support/functions/_ansi create mode 100644 support/functions/_arrays create mode 100644 support/functions/_cmd_build create mode 100644 support/functions/_compress create mode 100644 support/functions/_gui_build create mode 100644 support/functions/_help create mode 100644 support/functions/_logos create mode 100644 support/functions/_misc create mode 100644 support/functions/_patch create mode 100644 support/functions/_profiles create mode 100644 support/functions/_subversion create mode 100644 support/functions/_sys_check create mode 100644 support/functions/_toolchain create mode 100644 support/functions/_translation create mode 100644 support/functions/_uploadcam create mode 100644 support/os/debian_ubuntu.install create mode 100644 support/os/manjaro.install create mode 100644 support/os/redhat_centos_fedora.install create mode 100644 support/os/suse.install create mode 100644 support/profiles/best.box.profile create mode 100644 support/stapi/liboscam_stapi.a create mode 100644 support/stapi/liboscam_stapi5_OPENBOX.a create mode 100644 support/stapi/liboscam_stapi5_UFS916.a create mode 100644 support/stapi/liboscam_stapi5_UFS916_0.03.a create mode 100644 support/toolchains.cfg/arm_s3_ssl098 create mode 100644 support/toolchains.cfg/arm_s3_ssl100 create mode 100644 support/toolchains.cfg/arm_s3_ssl102 create mode 100644 support/toolchains.cfg/mipsel_s3_ssl098 create mode 100644 support/toolchains.cfg/mipsel_s3_ssl100 create mode 100644 support/toolchains.cfg/mipsel_s3_ssl102 create mode 100644 support/toolchains.cfg/native create mode 100644 support/toolchains.cfg/openpli40 create mode 100644 support/toolchains.cfg/openwrt1505cc create mode 100644 support/toolchains.cfg/osmio4k create mode 100644 support/toolchains.cfg/solo4k create mode 100644 support/translation/de create mode 100644 support/translation/en create mode 100644 support/translation/fr create mode 100644 support/translation/it create mode 100644 support/translation/nl create mode 100644 support/translation/pl create mode 100644 support/translation/pt create mode 100644 support/translation/tr diff --git a/s3 b/s3 new file mode 100644 index 0000000..37d2d84 --- /dev/null +++ b/s3 @@ -0,0 +1,266 @@ +#!/bin/bash + +#VERSIONCOUNTER 20190205 +SIMPLEVERSION="3.0 RC4";OIFS=$IFS; +export NCURSES_NO_UTF8_ACS=1; + +#set dir_vars + workdir="$(pwd)"; + svndir="$workdir/oscam-svn"; + sdir="$workdir/support"; + osdir="$sdir/os"; + ldir="$sdir/logs"; + adir="$sdir/archive"; +configdir="$sdir/configs"; + pdir="$sdir/patches"; + profdir="$sdir/profiles"; + bdir="$sdir/binaries"; + dldir="$sdir/downloads"; + fdir="$sdir/functions"; + menudir="$sdir/menu_save"; + bsvn="$sdir/backup_svn"; + tcdir="$sdir/toolchains"; + tdir="$sdir/translation"; + tccfgdir="$sdir/toolchains.cfg"; + bindir="$sdir/upx";PATH="$bindir:$PATH"; + +# create folders +mkdir -p support/{archive,binaries,configs,downloads,functions,logs,os,patches,profiles,toolchains,toolchains.cfg,translation,backup_svn,menu_save,upx} 2>/dev/null; +mkdir -p "$tcdir/native/bin" 2>/dev/null; + +# create links +[ ! -L "$workdir/logs" ] && ln -sf "$ldir" "$workdir/logs" 2>/dev/null; +[ ! -L "$workdir/archive" ] && ln -sf "$adir" "$workdir/archive" 2>/dev/null; +[ ! -L "$workdir/patches" ] && ln -sf "$pdir" "$workdir/patches" 2>/dev/null; +[ ! -L "$workdir/binaries" ] && ln -sf "$bdir" "$workdir/binaries" 2>/dev/null; + +#set arrays +unset INTERNAL_MODULES; unset ENABLED_MODULES; unset SHORT_MODULENAMES; unset INST_TCLIST; +unset DISABLED_MODULES; unset AVAI_TCLIST; unset ALL_MODULES_LONG; unset MISS_TCLIST; +unset SHORT_PROTOCOLS; unset SHORT_READERS; unset SHORT_CARD_READERS; unset SHORT_ADDONS; +unset SSH_CONF_CONTENT; unset USE_vars; unset USE_vars_disable; + +declare -A USE_vars; +declare -A USE_vars_disable; +USE_vars[USE_TARGZ]=; +USE_vars[USE_PATCH]=; +USE_vars[USE_STAPI]=; +USE_vars[USE_STAPI5]=; +USE_vars[USE_CONFDIR]=; +USE_vars[USE_COMPRESS]=; + +declare -A s3cfg_vars; +s3cfg_vars[USE_TARGZ]=0; +s3cfg_vars[DIRECTMENU]=0; +s3cfg_vars[USE_VERBOSE]=0; +s3cfg_vars[USE_COMPRESS]=0; +s3cfg_vars[S3_UPDATE_CHECK]=1; +s3cfg_vars[SAVE_LISTSMARGO]=1; +s3cfg_vars[NO_SVN_AUTOUPDATE]=0; +s3cfg_vars[delete_oscamdebugbinary]=1; + +declare -a ENABLED_MODULES; declare -a DISABLED_MODULES; declare -a SHORT_MODULENAMES; +declare -a ALL_MODULES_LONG; declare -a AVAI_TCLIST; declare -a INST_TCLIST; +declare -a MISS_TCLIST; declare -a SHORT_ADDONS; declare -a SHORT_PROTOCOLS; +declare -a SHORT_READERS; declare -a SHORT_CARD_READERS; declare -A INTERNAL_MODULES; + +#filled arrays +config_cases=( all addons protocols readers card_readers ); +s3opts=( help cedit clean tccheck tcrepair upload lang_select loadonly checkout ssh_profiles syscheck sysinfo svnup menu get_patch tedit svnpatch profiles svnrestore ); # extendable with plugins +CUSTOM_CONFDIR="not_set"; + +#internal vars +OPENBOX=0;UFS916003=0;_verbose=""; +_t1e="VG9vbGNoYWluLQ=="; +_u1e="aHR0cDovL3N0cmVhbWJvYXJkLnR2L3diYjIvdHV0LXBpY3MvdG9vbGNoYWlucw=="; +cposx=0;cposy=0;off="_off";on="_on";pf="empty";file_exist="0";run="0"; +s3cfg="$configdir/simplebuild.config";loadprofile="no";menucall="no"; +# Compiler settings +cc_warn="-W -Wall -Wshadow -Wredundant-decls -Wstrict-prototypes -Wold-style-definition"; +cc_opts="-ggdb -pipe -ffunction-sections -fdata-sections"; + +#default url +trunkurl="http://www.streamboard.tv/svn/oscam/trunk";[ -f "$workdir/oscamsource.url" ] && source "$workdir/oscamsource.url"; +#trunkurl="http://www.streamboard.tv/svn/oscam-addons/modern";[ -f "$workdir/oscamsource.url" ] && source "$workdir/oscamsource.url"; + +#load translationlist +cd "$tdir";langsupport=(*); + +#load functions and plugins +if [ -d "$fdir" ];then + cd "$fdir"; + x=(*); + for i in "${x[@]}";do + source "$i"; + plugin=$(awk '/^#simplebuild_plugin/ {printf $2}' $i); + [ ! -z "$plugin" ] && s3opts+=($plugin); + done; +else + echo "fail functions"; +fi; + +#begin +initializeANSI; #load colors + +#check system +syscheck;[ ! "$sanity" == "1" ] && echo "sanity fail" && sleep 5 && bye; + +#initialize simplebuild +_create_native_profile; # put native datas to toolchains and configs +auto_langset; # echo "info $txt_load_ok"; +_get_config_con "$1"; # echo $addons;exit; +_create_module_arrays; # fill module arrays +_fill_tc_array; # get # AVAI_TCLIST # INST_TCLIST # MISS_TCLIST +read_s3cfg; # read simplebuild config +_set_dialog_types; # fill $gui vars +_systype; # check used uname + +if [ ! -n "$1" ];then + [ "${s3cfg_vars[DIRECTMENU]}" == "1" ] && _dialog_checkout && exit; + _help; + exit; +else + for e in "${s3opts[@]}";do + if [ "$e" == "$1" ];then + case $e in + svnrestore|\ + checkout|\ + upload_cam) if [ ! -n "$2" ];then + eval "$e"; + else + eval "$e" "$2"; + fi; + exit;; + menu) if [ ! -n "$2" ];then + _dialog_checkout; + else + _dialog_checkout "$2"; + fi;; + loadonly) if [ ! -n "$2" ];then + _nl; + clear; + s3logo; + echo -e "$r_l\n $txt_error: toolchain $txt_parameter $txt_missing\n""$w_l"; + _help_toolchain; + sleep 2; + exit; + else + for t in "${AVAI_TCLIST[@]}";do + _tmp="$2"; + [ "$t" == "$2" ] && _load_toolchain "$2" && break; + done; + if [ -f "$tc_dl" ];then + echo -e "$p_l\n\n toolchain for $_tmp loaded\n"; + else + _nl; + clear; + s3logo; + echo -e "$r_l toolchain missing/error\n"; + fi; + exit; + fi;; + tccheck) if [ ! -n "$2" ];then + _nl; + clear; + s3logo; + echo -e "$r_l\n $txt_error: toolchain $txt_parameter $txt_missing\n""$w_l"; + _help_toolchain;echo -e "$W"; + sleep 2; + exit; + else + for t in "${AVAI_TCLIST[@]}";do + [ "$t" == "$2" ] && _toolchain_check "$2" && break; + done; + _nl; + clear; + s3logo; + echo -e "$r_l\n toolchain missing/error\n$w_l"; + _help_toolchain;echo -e "$W"; + sleep 2; + exit; + fi;; + tcrepair) if [ ! -n "$2" ];then + _nl; + clear; + s3logo; + echo -e "$r_l\n $txt_error: toolchain $txt_parameter $txt_missing\n""$w_l"; + _help_toolchain;echo -e "$W"; + sleep 2; + exit; + else + _nl;clear;_toolchain_repair "$2";sleep 2;exit; + fi;; + upload) if [ ! -n "$2" ];then + _nl; + clear; + s3logo; + echo -e "$r_l\n $txt_error: $txt_parameter $txt_missing""$w_l"; + menucall="yes"; + ssh_profiles; + else + upload_cam "$2"; + fi; + exit;; + tedit) if [ -n "$2" ];then + for telement in ${INST_TCLIST[@]};do + if [ "$telement" == "$2" ];then + tedit $2; + exit; + fi; + done; + clear; + s3logo; + echo -e $w_l"\n $2 toolchain not installed\n"$W; + fi; + exit;; + help) _help; + exit;; + *) eval "$e" "$2"; + exit;; + esac; + fi; + done; + + for t in "${AVAI_TCLIST[@]}";do + if [ "$t" == "$1" ];then + if [ "${2:0:3}" == "-p=" ] || [ "${2:0:3}" == "-P=" ];then + if [ -f "$profdir/${2#*=}" ];then + pf=$(cat "$profdir/${2#*=}"); + pf_name="${2#*=}"; + fi; + fi; + [ "$pf" == "empty" ] && c_m_d="$*" || c_m_d="all_off $pf $*"; # set only active module with profiles + for cmd in $c_m_d;do + if [ "${cmd:0:3}" == "-c=" ] || [ "${cmd:0:3}" == "-C=" ];then + CUSTOM_CONFDIR="${cmd#*=}"; + fi; + for cc in "${config_cases[@]}"; + do + [ "$cmd" == "$cc$on" ] && all_cc+=($cc$on) && break; + [ "$cmd" == "$cc$off" ] && all_cc+=($cc$off) && break; + done; + for sm in "${SHORT_MODULENAMES[@]}"; + do + [ "$cmd" == "$sm" ] && all_cc+=($(get_module_name "$sm")$on) && break; + [ "$cmd" == "$sm$off" ] && all_cc+=($(get_module_name "$sm")$off) && break; + done; + for uvar in "${!USE_vars[@]}"; + do + [ "$cmd" == "$uvar" ] && USE_vars[$uvar]="$uvar=1" && break; + [ "$cmd" == "$uvar$off" ] && USE_vars_disable[$uvar]="$uvar=1" && break; + done; + case $cmd in + OPENBOX) OPENBOX=1;; + UFS916003) UFS916003=1;; + USE_VERBOSE) s3cfg_vars[USE_VERBOSE]=1;; + esac; + done; + _pre_build "$t"; + exit; + fi; + done; + _help; + +fi; + +exit; diff --git a/support/configs/Makefile.master b/support/configs/Makefile.master new file mode 100644 index 0000000..8ea5677 --- /dev/null +++ b/support/configs/Makefile.master @@ -0,0 +1,795 @@ +SHELL = /bin/sh + +.SUFFIXES: +.SUFFIXES: .o .c +.PHONY: all tests help README.build README.config simple default debug config menuconfig allyesconfig allnoconfig defconfig clean distclean + +VER := $(shell ./config.sh --oscam-version) +SVN_REV := $(shell ./config.sh --oscam-revision) + +uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') + +# This let's us use uname_S tests to detect cygwin +ifneq (,$(findstring CYGWIN,$(uname_S))) + uname_S := Cygwin +endif + +LINKER_VER_OPT:=-Wl,--version + +# Find OSX SDK +ifeq ($(uname_S),Darwin) + # Setting OSX_VER allows you to choose prefered version if you have + # two SDKs installed. For example if you have 10.6 and 10.5 installed + # you can choose 10.5 by using 'make USE_PCSC=1 OSX_VER=10.5' + # './config.sh --detect-osx-sdk-version' returns the newest SDK if + # SDK_VER is not set. + OSX_SDK := $(shell ./config.sh --detect-osx-sdk-version $(OSX_VER)) + LINKER_VER_OPT:=-Wl,-v +endif + +ifeq "$(shell ./config.sh --enabled WITH_SSL)" "Y" + override USE_SSL=1 + override USE_LIBCRYPTO=1 +endif +ifdef USE_SSL + override USE_LIBCRYPTO=1 +endif + +CONF_DIR = /usr/local/etc + +LIB_PTHREAD = -lpthread +LIB_DL = -ldl + +LIB_RT := +ifeq ($(uname_S),Linux) + ifeq "$(shell ./config.sh --enabled CLOCKFIX)" "Y" + LIB_RT := -lrt + endif +endif +ifeq ($(uname_S),FreeBSD) + LIB_DL := +endif + +override STD_LIBS := -lm $(LIB_PTHREAD) $(LIB_DL) $(LIB_RT) +override STD_DEFS := -D'CS_SVN_VERSION="$(SVN_REV)"' +override STD_DEFS += -D'CS_CONFDIR="$(CONF_DIR)"' + +# Compiler warnings +CC_WARN = -W -Wall -Wshadow -Wredundant-decls -Wstrict-prototypes -Wold-style-definition + +# Compiler optimizations +CC_OPTS = -O2 -ggdb -pipe -ffunction-sections -fdata-sections + +CC = $(CROSS_DIR)$(CROSS)gcc +STRIP = $(CROSS_DIR)$(CROSS)strip + +LDFLAGS = -Wl,--gc-sections + +# The linker for powerpc have bug that prevents --gc-sections from working +# Check for the linker version and if it matches disable --gc-sections +# For more information about the bug see: +# http://cygwin.com/ml/binutils/2005-01/msg00103.html +# The LD output is saved into variable and then processed, because if +# the output is piped directly into another command LD creates 4 files +# in your /tmp directory and doesn't delete them. +LINKER_VER := $(shell set -e; VER="`$(CC) $(LINKER_VER_OPT) 2>&1`"; echo $$VER | head -1 | cut -d' ' -f5) + +# dm500 toolchain +ifeq "$(LINKER_VER)" "20040727" + LDFLAGS := +endif +# dm600/7000/7020 toolchain +ifeq "$(LINKER_VER)" "20041121" + LDFLAGS := +endif +# The OS X linker do not support --gc-sections +ifeq ($(uname_S),Darwin) + LDFLAGS := +endif + +# The compiler knows for what target it compiles, so use this information +TARGET := $(shell $(CC) -dumpmachine 2>/dev/null) + +# Process USE_ variables +DEFAULT_STAPI_LIB = -L./stapi -loscam_stapi +DEFAULT_STAPI5_LIB = -L./stapi -loscam_stapi5 +DEFAULT_COOLAPI_LIB = -lnxp -lrt +DEFAULT_COOLAPI2_LIB = -llnxUKAL -llnxcssUsr -llnxscsUsr -llnxnotifyqUsr -llnxplatUsr -lrt +DEFAULT_SU980_LIB = -lentropic -lrt +DEFAULT_AZBOX_LIB = -Lextapi/openxcas -lOpenXCASAPI +DEFAULT_LIBCRYPTO_LIB = -lcrypto +DEFAULT_SSL_LIB = -lssl +ifeq ($(uname_S),Linux) + DEFAULT_LIBUSB_LIB = -lusb-1.0 -lrt +else + DEFAULT_LIBUSB_LIB = -lusb-1.0 +endif +# Since FreeBSD 8 (released in 2010) they are using their own +# libusb that is API compatible to libusb but with different soname +ifeq ($(uname_S),FreeBSD) + DEFAULT_LIBUSB_LIB = -lusb +endif +ifeq ($(uname_S),Darwin) + DEFAULT_LIBUSB_FLAGS = -I/opt/local/include + DEFAULT_LIBUSB_LIB = -L/opt/local/lib -lusb-1.0 + DEFAULT_PCSC_FLAGS = -isysroot $(OSX_SDK) + DEFAULT_PCSC_LIB = -isysroot $(OSX_SDK) -framework IOKit -framework CoreFoundation -framework PCSC +else + # Get the compiler's last include PATHs. Basicaly it is /usr/include + # but in case of cross compilation it might be something else. + # + # Since using -Iinc_path instructs the compiler to use inc_path + # (without add the toolchain system root) we need to have this hack + # to get the "real" last include path. Why we needs this? + # Well, the PCSC headers are broken and rely on having the directory + # that they are installed it to be in the include PATH. + # + # We can't just use -I/usr/include/PCSC because it won't work in + # case of cross compilation. + TOOLCHAIN_INC_DIR := $(strip $(shell echo | $(CC) -Wp,-v -xc - -fsyntax-only 2>&1 | grep include$ | tail -n 1)) + DEFAULT_PCSC_FLAGS = -I$(TOOLCHAIN_INC_DIR)/PCSC -I$(TOOLCHAIN_INC_DIR)/../local/include/PCSC + DEFAULT_PCSC_LIB = -lpcsclite +endif + +ifeq ($(uname_S),Cygwin) + DEFAULT_PCSC_LIB += -lwinscard +endif + +DEFAULT_UTF8_FLAGS = -DWITH_UTF8 + +# Function to initialize USE related variables +# Usage: $(eval $(call prepare_use_flags,FLAG_NAME,PLUS_TARGET_TEXT)) +define prepare_use_flags +override DEFAULT_$(1)_FLAGS:=$$(strip -DWITH_$(1)=1 $$(DEFAULT_$(1)_FLAGS)) +ifdef USE_$(1) + $(1)_FLAGS:=$$(DEFAULT_$(1)_FLAGS) + $(1)_CFLAGS:=$$($(1)_FLAGS) + $(1)_LDFLAGS:=$$($(1)_FLAGS) + $(1)_LIB:=$$(DEFAULT_$(1)_LIB) + ifneq "$(2)" "" + override PLUS_TARGET:=$$(PLUS_TARGET)-$(2) + endif + override USE_CFLAGS+=$$($(1)_CFLAGS) + override USE_LDFLAGS+=$$($(1)_LDFLAGS) + override USE_LIBS+=$$($(1)_LIB) + override USE_FLAGS+=$$(if $$(USE_$(1)),USE_$(1)) + endif +endef + +# Initialize USE variables +$(eval $(call prepare_use_flags,STAPI,stapi)) +$(eval $(call prepare_use_flags,STAPI5,stapi5)) +$(eval $(call prepare_use_flags,COOLAPI,coolapi)) +$(eval $(call prepare_use_flags,COOLAPI2,coolapi2)) +$(eval $(call prepare_use_flags,SU980,su980)) +$(eval $(call prepare_use_flags,AZBOX,azbox)) +$(eval $(call prepare_use_flags,MCA,mca)) +$(eval $(call prepare_use_flags,SSL,ssl)) +$(eval $(call prepare_use_flags,LIBCRYPTO,)) +$(eval $(call prepare_use_flags,LIBUSB,libusb)) +$(eval $(call prepare_use_flags,PCSC,pcsc)) +$(eval $(call prepare_use_flags,UTF8)) + +# Add PLUS_TARGET and EXTRA_TARGET to TARGET +ifdef NO_PLUS_TARGET + override TARGET := $(TARGET)$(EXTRA_TARGET) +else + override TARGET := $(TARGET)$(PLUS_TARGET)$(EXTRA_TARGET) +endif + +EXTRA_CFLAGS = $(EXTRA_FLAGS) +EXTRA_LDFLAGS = $(EXTRA_FLAGS) + +# Add USE_xxx, EXTRA_xxx and STD_xxx vars +override CC_WARN += $(EXTRA_CC_WARN) +override CC_OPTS += $(EXTRA_CC_OPTS) +override CFLAGS += $(USE_CFLAGS) $(EXTRA_CFLAGS) +override LDFLAGS += $(USE_LDFLAGS) $(EXTRA_LDFLAGS) +override LIBS += $(USE_LIBS) $(EXTRA_LIBS) $(STD_LIBS) + +override STD_DEFS += -D'CS_TARGET="$(TARGET)"' + +# Setup quiet build +Q = +SAY = @true +ifndef V + Q = @ + NP = --no-print-directory + SAY = @echo +endif + +BINDIR := Distribution +override BUILD_DIR := build +OBJDIR := $(BUILD_DIR)/$(TARGET) + +# Include config.mak which contains variables for all enabled modules +# These variables will be used to select only needed files for compilation +-include $(OBJDIR)/config.mak + +OSCAM_BIN := $(BINDIR)/oscam-$(VER)$(SVN_REV)-$(subst cygwin,cygwin.exe,$(TARGET)) +TESTS_BIN := tests.bin +LIST_SMARGO_BIN := $(BINDIR)/list_smargo-$(VER)$(SVN_REV)-$(subst cygwin,cygwin.exe,$(TARGET)) + +# Build list_smargo-.... only when WITH_LIBUSB build is requested. +ifndef USE_LIBUSB + override LIST_SMARGO_BIN = +endif + +SRC-$(CONFIG_LIB_AES) += cscrypt/aes.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_add.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_asm.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_ctx.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_div.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_exp.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_lib.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_mul.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_print.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_shift.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_sqr.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/bn_word.c +SRC-$(CONFIG_LIB_BIGNUM) += cscrypt/mem.c +SRC-$(CONFIG_LIB_DES) += cscrypt/des.c +SRC-$(CONFIG_LIB_IDEA) += cscrypt/i_cbc.c +SRC-$(CONFIG_LIB_IDEA) += cscrypt/i_ecb.c +SRC-$(CONFIG_LIB_IDEA) += cscrypt/i_skey.c +SRC-y += cscrypt/md5.c +SRC-$(CONFIG_LIB_RC6) += cscrypt/rc6.c +SRC-$(CONFIG_LIB_SHA1) += cscrypt/sha1.c +SRC-$(CONFIG_LIB_MDC2) += cscrypt/mdc2.c +SRC-$(CONFIG_LIB_FAST_AES) += cscrypt/fast_aes.c +SRC-$(CONFIG_LIB_SHA256) += cscrypt/sha256.c + +SRC-$(CONFIG_WITH_CARDREADER) += csctapi/atr.c +SRC-$(CONFIG_WITH_CARDREADER) += csctapi/icc_async.c +SRC-$(CONFIG_WITH_CARDREADER) += csctapi/io_serial.c +SRC-$(CONFIG_WITH_CARDREADER) += csctapi/protocol_t0.c +SRC-$(CONFIG_WITH_CARDREADER) += csctapi/protocol_t1.c +SRC-$(CONFIG_CARDREADER_INTERNAL_AZBOX) += csctapi/ifd_azbox.c +SRC-$(CONFIG_CARDREADER_INTERNAL_COOLAPI) += csctapi/ifd_cool.c +SRC-$(CONFIG_CARDREADER_INTERNAL_COOLAPI2) += csctapi/ifd_cool.c +SRC-$(CONFIG_CARDREADER_DB2COM) += csctapi/ifd_db2com.c +SRC-$(CONFIG_CARDREADER_MP35) += csctapi/ifd_mp35.c +SRC-$(CONFIG_CARDREADER_PCSC) += csctapi/ifd_pcsc.c +SRC-$(CONFIG_CARDREADER_PHOENIX) += csctapi/ifd_phoenix.c +SRC-$(CONFIG_CARDREADER_DRECAS) += csctapi/ifd_drecas.c +SRC-$(CONFIG_CARDREADER_SC8IN1) += csctapi/ifd_sc8in1.c +SRC-$(CONFIG_CARDREADER_INTERNAL_SCI) += csctapi/ifd_sci.c +SRC-$(CONFIG_CARDREADER_SMARGO) += csctapi/ifd_smargo.c +SRC-$(CONFIG_CARDREADER_SMART) += csctapi/ifd_smartreader.c +SRC-$(CONFIG_CARDREADER_STINGER) += csctapi/ifd_stinger.c +SRC-$(CONFIG_CARDREADER_STAPI) += csctapi/ifd_stapi.c +SRC-$(CONFIG_CARDREADER_STAPI5) += csctapi/ifd_stapi.c + +SRC-$(CONFIG_LIB_MINILZO) += minilzo/minilzo.c + +SRC-$(CONFIG_CS_ANTICASC) += module-anticasc.c +SRC-$(CONFIG_CS_CACHEEX) += module-cacheex.c +SRC-$(CONFIG_MODULE_CAMD33) += module-camd33.c +SRC-$(CONFIG_CS_CACHEEX) += module-camd35-cacheex.c +SRC-$(sort $(CONFIG_MODULE_CAMD35) $(CONFIG_MODULE_CAMD35_TCP)) += module-camd35.c +SRC-$(CONFIG_CS_CACHEEX) += module-cccam-cacheex.c +SRC-$(CONFIG_MODULE_CCCAM) += module-cccam.c +SRC-$(CONFIG_MODULE_CCCSHARE) += module-cccshare.c +SRC-$(CONFIG_MODULE_CONSTCW) += module-constcw.c +SRC-$(CONFIG_CS_CACHEEX) += module-csp.c +SRC-$(CONFIG_CW_CYCLE_CHECK) += module-cw-cycle-check.c +SRC-$(CONFIG_WITH_AZBOX) += module-dvbapi-azbox.c +SRC-$(CONFIG_WITH_MCA) += module-dvbapi-mca.c +### SRC-$(CONFIG_WITH_COOLAPI) += module-dvbapi-coolapi.c +### experimental reversed API +SRC-$(CONFIG_WITH_COOLAPI) += module-dvbapi-coolapi-legacy.c +SRC-$(CONFIG_WITH_COOLAPI2) += module-dvbapi-coolapi.c +SRC-$(CONFIG_WITH_SU980) += module-dvbapi-coolapi.c +SRC-$(CONFIG_WITH_STAPI) += module-dvbapi-stapi.c +SRC-$(CONFIG_WITH_STAPI5) += module-dvbapi-stapi5.c +SRC-$(CONFIG_HAVE_DVBAPI) += module-dvbapi-chancache.c +SRC-$(CONFIG_HAVE_DVBAPI) += module-dvbapi.c +SRC-$(CONFIG_MODULE_GBOX) += module-gbox-helper.c +SRC-$(CONFIG_MODULE_GBOX) += module-gbox-sms.c +SRC-$(CONFIG_MODULE_GBOX) += module-gbox-remm.c +SRC-$(CONFIG_MODULE_GBOX) += module-gbox-cards.c +SRC-$(CONFIG_MODULE_GBOX) += module-gbox.c +SRC-$(CONFIG_IRDETO_GUESSING) += module-ird-guess.c +SRC-$(CONFIG_LCDSUPPORT) += module-lcd.c +SRC-$(CONFIG_LEDSUPPORT) += module-led.c +SRC-$(CONFIG_MODULE_MONITOR) += module-monitor.c +SRC-$(CONFIG_MODULE_NEWCAMD) += module-newcamd.c +SRC-$(CONFIG_MODULE_NEWCAMD) += module-newcamd-des.c +SRC-$(CONFIG_MODULE_PANDORA) += module-pandora.c +SRC-$(CONFIG_MODULE_GHTTP) += module-ghttp.c +SRC-$(CONFIG_MODULE_RADEGAST) += module-radegast.c +SRC-$(CONFIG_MODULE_SCAM) += module-scam.c +SRC-$(CONFIG_MODULE_SERIAL) += module-serial.c +SRC-$(CONFIG_WITH_LB) += module-stat.c +SRC-$(CONFIG_WEBIF) += module-webif-lib.c +SRC-$(CONFIG_WEBIF) += module-webif-tpl.c +SRC-$(CONFIG_WEBIF) += module-webif.c +SRC-$(CONFIG_WEBIF) += webif/pages.c +SRC-$(CONFIG_WITH_CARDREADER) += reader-common.c +SRC-$(CONFIG_READER_BULCRYPT) += reader-bulcrypt.c +SRC-$(CONFIG_READER_CONAX) += reader-conax.c +SRC-$(CONFIG_READER_CRYPTOWORKS) += reader-cryptoworks.c +SRC-$(CONFIG_READER_DGCRYPT) += reader-dgcrypt.c +SRC-$(CONFIG_READER_DRE) += reader-dre.c +SRC-$(CONFIG_READER_DRE) += reader-dre-cas.c +SRC-$(CONFIG_READER_DRE) += reader-dre-common.c +SRC-$(CONFIG_READER_DRE) += reader-dre-st20.c +SRC-$(CONFIG_READER_GRIFFIN) += reader-griffin.c +SRC-$(CONFIG_READER_IRDETO) += reader-irdeto.c +SRC-$(CONFIG_READER_NAGRA_COMMON) += reader-nagra-common.c +SRC-$(CONFIG_READER_NAGRA) += reader-nagra.c +SRC-$(CONFIG_READER_NAGRA_MERLIN) += reader-nagracak7.c +SRC-$(CONFIG_READER_SECA) += reader-seca.c +SRC-$(CONFIG_READER_TONGFANG) += reader-tongfang.c +SRC-$(CONFIG_READER_VIACCESS) += reader-viaccess.c +SRC-$(CONFIG_READER_VIDEOGUARD) += reader-videoguard-common.c +SRC-$(CONFIG_READER_VIDEOGUARD) += reader-videoguard1.c +SRC-$(CONFIG_READER_VIDEOGUARD) += reader-videoguard12.c +SRC-$(CONFIG_READER_VIDEOGUARD) += reader-videoguard2.c +SRC-y += oscam-aes.c +SRC-y += oscam-array.c +SRC-y += oscam-hashtable.c +SRC-y += oscam-cache.c +SRC-y += oscam-chk.c +SRC-y += oscam-client.c +SRC-y += oscam-conf.c +SRC-y += oscam-conf-chk.c +SRC-y += oscam-conf-mk.c +SRC-y += oscam-config-account.c +SRC-y += oscam-config-global.c +SRC-y += oscam-config-reader.c +SRC-y += oscam-config.c +SRC-y += oscam-ecm.c +SRC-y += oscam-emm.c +SRC-y += oscam-emm-cache.c +SRC-y += oscam-failban.c +SRC-y += oscam-files.c +SRC-y += oscam-garbage.c +SRC-y += oscam-lock.c +SRC-y += oscam-log.c +SRC-y += oscam-log-reader.c +SRC-y += oscam-net.c +SRC-y += oscam-llist.c +SRC-y += oscam-reader.c +SRC-y += oscam-simples.c +SRC-y += oscam-string.c +SRC-y += oscam-time.c +SRC-y += oscam-work.c +SRC-y += oscam.c +# config.c is automatically generated by config.sh in OBJDIR +SRC-y += config.c +ifdef BUILD_TESTS + SRC-y += tests.c + override STD_DEFS += -DBUILD_TESTS=1 +endif + +SRC := $(SRC-y) +OBJ := $(addprefix $(OBJDIR)/,$(subst .c,.o,$(SRC))) +SRC := $(subst config.c,$(OBJDIR)/config.c,$(SRC)) + +# The default build target rebuilds the config.mak if needed and then +# starts the compilation. +all: + @./config.sh --use-flags "$(USE_FLAGS)" --objdir "$(OBJDIR)" --make-config.mak + @-mkdir -p $(OBJDIR)/cscrypt $(OBJDIR)/csctapi $(OBJDIR)/minilzo $(OBJDIR)/webif + @-printf "\ ++-------------------------------------------------------------------------------\n\ +| OSCam ver: $(VER) rev: $(SVN_REV) target: $(TARGET)\n\ +| Tools:\n\ +| CROSS = $(CROSS_DIR)$(CROSS)\n\ +| CC = $(CC)\n\ +| Settings:\n\ +| CONF_DIR = $(CONF_DIR)\n\ +| CC_OPTS = $(strip $(CC_OPTS))\n\ +| CC_WARN = $(strip $(CC_WARN))\n\ +| CFLAGS = $(strip $(CFLAGS))\n\ +| LDFLAGS = $(strip $(LDFLAGS))\n\ +| LIBS = $(strip $(LIBS))\n\ +| UseFlags = $(addsuffix =1,$(USE_FLAGS))\n\ +| Config:\n\ +| Addons : $(shell ./config.sh --use-flags "$(USE_FLAGS)" --show-enabled addons)\n\ +| Protocols: $(shell ./config.sh --use-flags "$(USE_FLAGS)" --show-enabled protocols | sed -e 's|MODULE_||g')\n\ +| Readers : $(shell ./config.sh --use-flags "$(USE_FLAGS)" --show-enabled readers | sed -e 's|READER_||g')\n\ +| CardRdrs : $(shell ./config.sh --use-flags "$(USE_FLAGS)" --show-enabled card_readers | sed -e 's|CARDREADER_||g')\n\ +| Compiler : $(shell $(CC) --version 2>/dev/null | head -n 1)\n\ +| Config : $(OBJDIR)/config.mak\n\ +| Binary : $(OSCAM_BIN)\n\ ++-------------------------------------------------------------------------------\n" +ifeq "$(shell ./config.sh --enabled WEBIF)" "Y" + @$(MAKE) --no-print-directory --quiet -C webif +endif + @$(MAKE) --no-print-directory $(OSCAM_BIN) $(LIST_SMARGO_BIN) + +$(OSCAM_BIN).debug: $(OBJ) + $(SAY) "LINK $@" + $(Q)$(CC) $(LDFLAGS) $(OBJ) $(LIBS) -o $@ + +$(OSCAM_BIN): $(OSCAM_BIN).debug + $(SAY) "STRIP $@" + $(Q)cp $(OSCAM_BIN).debug $(OSCAM_BIN) + $(Q)$(STRIP) $(OSCAM_BIN) + +$(LIST_SMARGO_BIN): utils/list_smargo.c + $(SAY) "BUILD $@" + $(Q)$(CC) $(STD_DEFS) $(CC_OPTS) $(CC_WARN) $(CFLAGS) $(LDFLAGS) utils/list_smargo.c $(LIBS) -o $@ + +$(OBJDIR)/config.o: $(OBJDIR)/config.c + $(SAY) "CONF $<" + $(Q)$(CC) $(STD_DEFS) $(CC_OPTS) $(CC_WARN) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/%.o: %.c Makefile + @$(CC) -MP -MM -MT $@ -o $(subst .o,.d,$@) $< + $(SAY) "CC $<" + $(Q)$(CC) $(STD_DEFS) $(CC_OPTS) $(CC_WARN) $(CFLAGS) -c $< -o $@ + +-include $(subst .o,.d,$(OBJ)) + +tests: + @-$(MAKE) --no-print-directory BUILD_TESTS=1 OSCAM_BIN=$(TESTS_BIN) + @-touch oscam.c +# The above is really hideous hack :-) If we don't force oscam.c recompilation +# after we've build the tests binary, the next "normal" compilation would fail +# because there would be no run_tests() function. So the touch is there to +# ensure oscam.c would be recompiled. + +config: + $(SHELL) ./config.sh --gui + +menuconfig: config + +allyesconfig: + @echo "Enabling all config options." + @-$(SHELL) ./config.sh --enable all + +allnoconfig: + @echo "Disabling all config options." + @-$(SHELL) ./config.sh --disable all + +defconfig: + @echo "Restoring default config." + @-$(SHELL) ./config.sh --restore + +clean: + @-for FILE in $(BUILD_DIR)/* $(TESTS_BIN) $(TESTS_BIN).debug; do \ + echo "RM $$FILE"; \ + rm -rf $$FILE; \ + done + @-rm -rf $(BUILD_DIR) lib + +distclean: clean + @-for FILE in $(BINDIR)/list_smargo-* $(BINDIR)/oscam-$(VER)*; do \ + echo "RM $$FILE"; \ + rm -rf $$FILE; \ + done + @-$(MAKE) --no-print-directory --quiet -C webif clean + +README.build: + @echo "Extracting 'make help' into $@ file." + @-printf "\ +** This file is generated from 'make help' output, do not edit it. **\n\ +\n\ +" > $@ + @-$(MAKE) --no-print-directory help >> $@ + @echo "Done." + +README.config: + @echo "Extracting 'config.sh --help' into $@ file." + @-printf "\ +** This file is generated from 'config.sh --help' output, do not edit it. **\n\ +\n\ +" > $@ + @-./config.sh --help >> $@ + @echo "Done." + +help: + @-printf "\ +OSCam build system documentation\n\ +================================\n\ +\n\ + Build variables:\n\ + The build variables are set on the make command line and control the build\n\ + process. Setting the variables lets you enable additional features, request\n\ + extra libraries and more. Currently recognized build variables are:\n\ +\n\ + CROSS=prefix - Set tools prefix. This variable is used when OScam is being\n\ + cross compiled. For example if you want to cross compile\n\ + for SH4 architecture you can run: 'make CROSS=sh4-linux-'\n\ + If you don't have the directory where cross compilers are\n\ + in your PATH you can run:\n\ + 'make CROSS=/opt/STM/STLinux-2.3/devkit/sh4/bin/sh4-linux-'\n\ +\n\ + CROSS_DIR=dir - Set tools directory. This variable is added in front of\n\ + CROSS variable. CROSS_DIR is useful if you want to use\n\ + predefined targets that are setting CROSS, but you don't have\n\ + the cross compilers in your PATH. For example:\n\ + 'make sh4 CROSS_DIR=/opt/STM/STLinux-2.3/devkit/sh4/bin/'\n\ + 'make dm500 CROSS_DIR=/opt/cross/dm500/cdk/bin/'\n\ +\n\ + CONF_DIR=/dir - Set OSCam config directory. For example to change config\n\ + directory to /etc run: 'make CONF_DIR=/etc'\n\ + The default config directory is: '$(CONF_DIR)'\n\ +\n\ + CC_OPTS=text - This variable holds compiler optimization parameters.\n\ + Default CC_OPTS value is:\n\ + '$(CC_OPTS)'\n\ + To add text to this variable set EXTRA_CC_OPTS=text.\n\ +\n\ + CC_WARN=text - This variable holds compiler warning parameters.\n\ + Default CC_WARN value is:\n\ + '$(CC_WARN)'\n\ + To add text to this variable set EXTRA_CC_WARN=text.\n\ +\n\ + V=1 - Request build process to print verbose messages. By\n\ + default the only messages that are shown are simple info\n\ + what is being compiled. To request verbose build run:\n\ + 'make V=1'\n\ +\n\ + Extra build variables:\n\ + These variables add text to build variables. They are useful if you want\n\ + to add additional options to already set variables without overwriting them\n\ + Currently defined EXTRA_xxx variables are:\n\ +\n\ + EXTRA_CC_OPTS - Add text to CC_OPTS.\n\ + Example: 'make EXTRA_CC_OPTS=-Os'\n\ +\n\ + EXTRA_CC_WARN - Add text to CC_WARN.\n\ + Example: 'make EXTRA_CC_WARN=-Wshadow'\n\ +\n\ + EXTRA_TARGET - Add text to TARGET.\n\ + Example: 'make EXTRA_TARGET=-private'\n\ +\n\ + EXTRA_CFLAGS - Add text to CFLAGS (affects compilation).\n\ + Example: 'make EXTRA_CFLAGS=\"-DBLAH=1 -I/opt/local\"'\n\ +\n\ + EXTRA_LDFLAGS - Add text to LDFLAGS (affects linking).\n\ + Example: 'make EXTRA_LDFLAGS=-Llibdir'\n\ +\n\ + EXTRA_FLAGS - Add text to both EXTRA_CFLAGS and EXTRA_LDFLAGS.\n\ + Example: 'make EXTRA_FLAGS=-DBLAH=1'\n\ +\n\ + EXTRA_LIBS - Add text to LIBS (affects linking).\n\ + Example: 'make EXTRA_LIBS=\"-L./stapi -loscam_stapi\"'\n\ +\n\ + Use flags:\n\ + Use flags are used to request additional libraries or features to be used\n\ + by OSCam. Currently defined USE_xxx flags are:\n\ +\n\ + USE_LIBUSB=1 - Request linking with libusb. The variables that control\n\ + USE_LIBUSB=1 build are:\n\ + LIBUSB_FLAGS='$(DEFAULT_LIBUSB_FLAGS)'\n\ + LIBUSB_CFLAGS='$(DEFAULT_LIBUSB_FLAGS)'\n\ + LIBUSB_LDFLAGS='$(DEFAULT_LIBUSB_FLAGS)'\n\ + LIBUSB_LIB='$(DEFAULT_LIBUSB_LIB)'\n\ + Using USE_LIBUSB=1 adds to '-libusb' to PLUS_TARGET.\n\ + To build with static libusb, set the variable LIBUSB_LIB\n\ + to contain full path of libusb library. For example:\n\ + make USE_LIBUSB=1 LIBUSB_LIB=/usr/lib/libusb-1.0.a\n\ +\n\ + USE_PCSC=1 - Request linking with PCSC. The variables that control\n\ + USE_PCSC=1 build are:\n\ + PCSC_FLAGS='$(DEFAULT_PCSC_FLAGS)'\n\ + PCSC_CFLAGS='$(DEFAULT_PCSC_FLAGS)'\n\ + PCSC_LDFLAGS='$(DEFAULT_PCSC_FLAGS)'\n\ + PCSC_LIB='$(DEFAULT_PCSC_LIB)'\n\ + Using USE_PCSC=1 adds to '-pcsc' to PLUS_TARGET.\n\ + To build with static PCSC, set the variable PCSC_LIB\n\ + to contain full path of PCSC library. For example:\n\ + make USE_PCSC=1 PCSC_LIB=/usr/local/lib/libpcsclite.a\n\ +\n\ + USE_STAPI=1 - Request linking with STAPI. The variables that control\n\ + USE_STAPI=1 build are:\n\ + STAPI_FLAGS='$(DEFAULT_STAPI_FLAGS)'\n\ + STAPI_CFLAGS='$(DEFAULT_STAPI_FLAGS)'\n\ + STAPI_LDFLAGS='$(DEFAULT_STAPI_FLAGS)'\n\ + STAPI_LIB='$(DEFAULT_STAPI_LIB)'\n\ + Using USE_STAPI=1 adds to '-stapi' to PLUS_TARGET.\n\ + In order for USE_STAPI to work you have to create stapi\n\ + directory and put liboscam_stapi.a file in it.\n\ +\n\ + USE_STAPI5=1 - Request linking with STAPI5. The variables that control\n\ + USE_STAPI5=1 build are:\n\ + STAPI5_FLAGS='$(DEFAULT_STAPI5_FLAGS)'\n\ + STAPI5_CFLAGS='$(DEFAULT_STAPI5_FLAGS)'\n\ + STAPI5_LDFLAGS='$(DEFAULT_STAPI5_FLAGS)'\n\ + STAPI5_LIB='$(DEFAULT_STAPI5_LIB)'\n\ + Using USE_STAPI5=1 adds to '-stapi' to PLUS_TARGET.\n\ + In order for USE_STAPI5 to work you have to create stapi\n\ + directory and put liboscam_stapi5.a file in it.\n\ +\n\ + USE_COOLAPI=1 - Request support for Coolstream API (libnxp) aka NeutrinoHD\n\ + box. The variables that control the build are:\n\ + COOLAPI_FLAGS='$(DEFAULT_COOLAPI_FLAGS)'\n\ + COOLAPI_CFLAGS='$(DEFAULT_COOLAPI_FLAGS)'\n\ + COOLAPI_LDFLAGS='$(DEFAULT_COOLAPI_FLAGS)'\n\ + COOLAPI_LIB='$(DEFAULT_COOLAPI_LIB)'\n\ + Using USE_COOLAPI=1 adds to '-coolapi' to PLUS_TARGET.\n\ + In order for USE_COOLAPI to work you have to have libnxp.so\n\ + library in your cross compilation toolchain.\n\ +\n\ + USE_COOLAPI2=1 - Request support for Coolstream API aka NeutrinoHD\n\ + box. The variables that control the build are:\n\ + COOLAPI_FLAGS='$(DEFAULT_COOLAPI2_FLAGS)'\n\ + COOLAPI_CFLAGS='$(DEFAULT_COOLAPI2_FLAGS)'\n\ + COOLAPI_LDFLAGS='$(DEFAULT_COOLAPI2_FLAGS)'\n\ + COOLAPI_LIB='$(DEFAULT_COOLAPI2_LIB)'\n\ + Using USE_COOLAPI2=1 adds to '-coolapi2' to PLUS_TARGET.\n\ + In order for USE_COOLAPI2 to work you have to have liblnxUKAL.so,\n\ + liblnxcssUsr.so, liblnxscsUsr.so, liblnxnotifyqUsr.so, liblnxplatUsr.so\n\ + library in your cross compilation toolchain.\n\ +\n\ + USE_SU980=1 - Request support for SU980 API (libentropic) aka Enimga2 arm\n\ + box. The variables that control the build are:\n\ + COOLAPI_FLAGS='$(DEFAULT_SU980_FLAGS)'\n\ + COOLAPI_CFLAGS='$(DEFAULT_SU980_FLAGS)'\n\ + COOLAPI_LDFLAGS='$(DEFAULT_SU980_FLAGS)'\n\ + COOLAPI_LIB='$(DEFAULT_SU980_LIB)'\n\ + Using USE_SU980=1 adds to '-su980' to PLUS_TARGET.\n\ + In order for USE_SU980 to work you have to have libentropic.a\n\ + library in your cross compilation toolchain.\n\ +\n\ + USE_AZBOX=1 - Request support for AZBOX (openxcas)\n\ + box. The variables that control the build are:\n\ + AZBOX_FLAGS='$(DEFAULT_AZBOX_FLAGS)'\n\ + AZBOX_CFLAGS='$(DEFAULT_AZBOX_FLAGS)'\n\ + AZBOX_LDFLAGS='$(DEFAULT_AZBOX_FLAGS)'\n\ + AZBOX_LIB='$(DEFAULT_AZBOX_LIB)'\n\ + Using USE_AZBOX=1 adds to '-azbox' to PLUS_TARGET.\n\ + extapi/openxcas/libOpenXCASAPI.a library that is shipped\n\ + with OSCam is compiled for MIPSEL.\n\ +\n\ + USE_MCA=1 - Request support for Matrix Cam Air (MCA).\n\ + The variables that control the build are:\n\ + MCA_FLAGS='$(DEFAULT_MCA_FLAGS)'\n\ + MCA_CFLAGS='$(DEFAULT_MCA_FLAGS)'\n\ + MCA_LDFLAGS='$(DEFAULT_MCA_FLAGS)'\n\ + Using USE_MCA=1 adds to '-mca' to PLUS_TARGET.\n\ +\n\ + USE_LIBCRYPTO=1 - Request linking with libcrypto instead of using OSCam\n\ + internal crypto functions. USE_LIBCRYPTO is automatically\n\ + enabled if the build is configured with SSL support. The\n\ + variables that control USE_LIBCRYPTO=1 build are:\n\ + LIBCRYPTO_FLAGS='$(DEFAULT_LIBCRYPTO_FLAGS)'\n\ + LIBCRYPTO_CFLAGS='$(DEFAULT_LIBCRYPTO_FLAGS)'\n\ + LIBCRYPTO_LDFLAGS='$(DEFAULT_LIBCRYPTO_FLAGS)'\n\ + LIBCRYPTO_LIB='$(DEFAULT_LIBCRYPTO_LIB)'\n\ +\n\ + USE_SSL=1 - Request linking with libssl. USE_SSL is automatically\n\ + enabled if the build is configured with SSL support. The\n\ + variables that control USE_SSL=1 build are:\n\ + SSL_FLAGS='$(DEFAULT_SSL_FLAGS)'\n\ + SSL_CFLAGS='$(DEFAULT_SSL_FLAGS)'\n\ + SSL_LDFLAGS='$(DEFAULT_SSL_FLAGS)'\n\ + SSL_LIB='$(DEFAULT_SSL_LIB)'\n\ + Using USE_SSL=1 adds to '-ssl' to PLUS_TARGET.\n\ +\n\ + USE_UTF8=1 - Request UTF-8 enabled webif by default.\n\ +\n\ + Automatically intialized variables:\n\ +\n\ + TARGET=text - This variable is auto detected by using the compiler's\n\ + -dumpmachine output. To see the target on your machine run:\n\ + 'gcc -dumpmachine'\n\ +\n\ + PLUS_TARGET - This variable is added to TARGET and it is set depending\n\ + on the chosen USE_xxx flags. To disable adding\n\ + PLUS_TARGET to TARGET, set NO_PLUS_TARGET=1\n\ +\n\ + BINDIR - The directory where final oscam binary would be put. The\n\ + default is: $(BINDIR)\n\ +\n\ + OSCAM_BIN=text - This variable controls how the oscam binary will be named.\n\ + Default OSCAM_BIN value is:\n\ + 'BINDIR/oscam-VERSVN_REV-TARGET'\n\ + Once the variables (BINDIR, VER, SVN_REV and TARGET) are\n\ + replaced, the resulting filename can look like this:\n\ + 'Distribution/oscam-1.20-unstable_svn7404-i486-slackware-linux-static'\n\ + For example you can run: 'make OSCAM_BIN=my-oscam'\n\ +\n\ + Binaries compiled and run during the OSCam build:\n\ +\n\ + OSCam builds webif/pages_gen binary that is run by the build system to\n\ + generate file that holds web pages. To build this binary two variables\n\ + are used:\n\ +\n\ + HOSTCC=gcc - The compiler used for building binaries that are run on\n\ + the build machine (the host). Default: gcc\n\ + To use clang for example run: make CC=clang HOSTCC=clang\n\ +\n\ + HOSTCFLAGS=xxx - The CFLAGS passed to HOSTCC. See webif/Makefile for the\n\ + default host cflags.\n\ +\n\ + Config targets:\n\ + make config - Start configuration utility.\n\ + make allyesconfig - Enable all configuration options.\n\ + make allnoconfig - Disable all configuration options.\n\ + make defconfig - Restore default configuration options.\n\ +\n\ + Cleaning targets:\n\ + make clean - Remove '$(BUILD_DIR)' directory which contains compiled\n\ + object files.\n\ + make distclean - Executes clean target and also removes binary files\n\ + located in '$(BINDIR)' directory.\n\ +\n\ + Build system files:\n\ + config.sh - OSCam configuration. Run 'config.sh --help' to see\n\ + available parameters or 'make config' to start GUI\n\ + configuratior.\n\ + Makefile - Main build system file.\n\ + Makefile.extra - Contains predefined targets. You can use this file\n\ + as example on how to use the build system.\n\ + Makefile.local - This file is included in Makefile and allows creation\n\ + of local build system targets. See Makefile.extra for\n\ + examples.\n\ +\n\ + Here are some of the interesting predefined targets in Makefile.extra.\n\ + To use them run 'make target ...' where ... can be any extra flag. For\n\ + example if you want to compile OSCam for Dreambox (DM500) but do not\n\ + have the compilers in the path, you can run:\n\ + make dm500 CROSS_DIR=/opt/cross/dm500/cdk/bin/\n\ +\n\ + Predefined targets in Makefile.extra:\n\ +\n\ + make libusb - Builds OSCam with libusb support\n\ + make pcsc - Builds OSCam with PCSC support\n\ + make pcsc-libusb - Builds OSCam with PCSC and libusb support\n\ + make dm500 - Builds OSCam for Dreambox (DM500)\n\ + make sh4 - Builds OSCam for SH4 boxes\n\ + make azbox - Builds OSCam for AZBox STBs\n\ + make mca - Builds OSCam for Matrix Cam Air (MCA)\n\ + make coolstream - Builds OSCam for Coolstream HD1\n\ + make coolstream2 - Builds OSCam for Coolstream HD2\n\ + make dockstar - Builds OSCam for Dockstar\n\ + make qboxhd - Builds OSCam for QBoxHD STBs\n\ + make opensolaris - Builds OSCam for OpenSolaris\n\ + make uclinux - Builds OSCam for m68k uClinux\n\ +\n\ + Predefined targets for static builds:\n\ + make static - Builds OSCam statically\n\ + make static-libusb - Builds OSCam with libusb linked statically\n\ + make static-libcrypto - Builds OSCam with libcrypto linked statically\n\ + make static-ssl - Builds OSCam with SSL support linked statically\n\ +\n\ + Developer targets:\n\ + make tests - Builds '$(TESTS_BIN)' binary\n\ +\n\ + Examples:\n\ + Build OSCam for SH4 (the compilers are in the path):\n\ + make CROSS=sh4-linux-\n\n\ + Build OSCam for SH4 (the compilers are in not in the path):\n\ + make sh4 CROSS_DIR=/opt/STM/STLinux-2.3/devkit/sh4/bin/\n\ + make CROSS_DIR=/opt/STM/STLinux-2.3/devkit/sh4/bin/ CROSS=sh4-linux-\n\ + make CROSS=/opt/STM/STLinux-2.3/devkit/sh4/bin/sh4-linux-\n\n\ + Build OSCam for SH4 with STAPI:\n\ + make CROSS=sh4-linux- USE_STAPI=1\n\n\ + Build OSCam for SH4 with STAPI and changed configuration directory:\n\ + make CROSS=sh4-linux- USE_STAPI=1 CONF_DIR=/var/tuxbox/config\n\n\ + Build OSCam for ARM with COOLAPI (coolstream aka NeutrinoHD):\n\ + make CROSS=arm-cx2450x-linux-gnueabi- USE_COOLAPI=1\n\n\ + Build OSCam for ARM with COOLAPI2 (coolstream aka NeutrinoHD):\n\ + make CROSS=arm-pnx8400-linux-uclibcgnueabi- USE_COOLAPI2=1\n\n\ + Build OSCam for MIPSEL with AZBOX support:\n\ + make CROSS=mipsel-linux-uclibc- USE_AZBOX=1\n\n\ + Build OSCam for ARM with MCA support:\n\ + make CROSS=arm-none-linux-gnueabi- USE_MCA=1\n\n\ + Build OSCam with libusb and PCSC:\n\ + make USE_LIBUSB=1 USE_PCSC=1\n\n\ + Build OSCam with static libusb:\n\ + make USE_LIBUSB=1 LIBUSB_LIB=\"/usr/lib/libusb-1.0.a\"\n\n\ + Build OSCam with static libcrypto:\n\ + make USE_LIBCRYPTO=1 LIBCRYPTO_LIB=\"/usr/lib/libcrypto.a\"\n\n\ + Build OSCam with static libssl and libcrypto:\n\ + make USE_SSL=1 SSL_LIB=\"/usr/lib/libssl.a\" LIBCRYPTO_LIB=\"/usr/lib/libcrypto.a\"\n\n\ + Build with verbose messages and size optimizations:\n\ + make V=1 CC_OPTS=-Os\n\n\ + Build and set oscam file name:\n\ + make OSCAM_BIN=oscam\n\n\ + Build and set oscam file name depending on revision:\n\ + make OSCAM_BIN=oscam-\`./config.sh -r\`\n\n\ +" + +simple: all +default: all +debug: all + +-include Makefile.extra +-include Makefile.local diff --git a/support/configs/compiler_option b/support/configs/compiler_option new file mode 100644 index 0000000..f8c5bfe --- /dev/null +++ b/support/configs/compiler_option @@ -0,0 +1 @@ +-O1 \ No newline at end of file diff --git a/support/configs/compiler_option.txt b/support/configs/compiler_option.txt new file mode 100644 index 0000000..11c062f --- /dev/null +++ b/support/configs/compiler_option.txt @@ -0,0 +1,3 @@ +-O0 optimization for time +-O2 optimization (oscam default) +-Os optimization for code size \ No newline at end of file diff --git a/support/configs/config.sh.master b/support/configs/config.sh.master new file mode 100644 index 0000000..5c34610 --- /dev/null +++ b/support/configs/config.sh.master @@ -0,0 +1,752 @@ +#!/bin/sh + +addons="WEBIF WEBIF_LIVELOG WEBIF_JQUERY TOUCH WITH_SSL HAVE_DVBAPI WITH_NEUTRINO READ_SDT_CHARSETS IRDETO_GUESSING CS_ANTICASC WITH_DEBUG MODULE_MONITOR WITH_LB CS_CACHEEX CW_CYCLE_CHECK LCDSUPPORT LEDSUPPORT CLOCKFIX IPV6SUPPORT" +protocols="MODULE_CAMD33 MODULE_CAMD35 MODULE_CAMD35_TCP MODULE_NEWCAMD MODULE_CCCAM MODULE_CCCSHARE MODULE_GBOX MODULE_RADEGAST MODULE_SCAM MODULE_SERIAL MODULE_CONSTCW MODULE_PANDORA MODULE_GHTTP" +readers="READER_NAGRA READER_NAGRA_MERLIN READER_IRDETO READER_CONAX READER_CRYPTOWORKS READER_SECA READER_VIACCESS READER_VIDEOGUARD READER_DRE READER_TONGFANG READER_BULCRYPT READER_GRIFFIN READER_DGCRYPT" +card_readers="CARDREADER_PHOENIX CARDREADER_INTERNAL CARDREADER_SC8IN1 CARDREADER_MP35 CARDREADER_SMARGO CARDREADER_DB2COM CARDREADER_STAPI CARDREADER_STAPI5 CARDREADER_STINGER CARDREADER_DRECAS" + +defconfig=" +CONFIG_WEBIF=y +CONFIG_WEBIF_LIVELOG=y +CONFIG_WEBIF_JQUERY=y +CONFIG_TOUCH=y +# CONFIG_WITH_SSL=n +CONFIG_HAVE_DVBAPI=y +# CONFIG_WITH_NEUTRINO=n +CONFIG_READ_SDT_CHARSETS=y +CONFIG_IRDETO_GUESSING=y +CONFIG_CS_ANTICASC=y +CONFIG_WITH_DEBUG=y +CONFIG_MODULE_MONITOR=y +CONFIG_WITH_LB=y +CONFIG_CS_CACHEEX=y +CONFIG_CW_CYCLE_CHECK=y +# CONFIG_LCDSUPPORT=n +# CONFIG_LEDSUPPORT=n +CONFIG_CLOCKFIX=y +# CONFIG_IPV6SUPPORT=n +# CONFIG_MODULE_CAMD33=n +CONFIG_MODULE_CAMD35=y +CONFIG_MODULE_CAMD35_TCP=y +CONFIG_MODULE_NEWCAMD=y +CONFIG_MODULE_CCCAM=y +CONFIG_MODULE_CCCSHARE=y +CONFIG_MODULE_GBOX=y +CONFIG_MODULE_RADEGAST=y +CONFIG_MODULE_SERIAL=y +CONFIG_MODULE_CONSTCW=y +CONFIG_MODULE_PANDORA=y +CONFIG_MODULE_SCAM=y +CONFIG_MODULE_GHTTP=y +CONFIG_WITH_CARDREADER=y +CONFIG_READER_NAGRA_COMMON=y +CONFIG_READER_NAGRA=y +CONFIG_READER_NAGRA_MERLIN=y +CONFIG_READER_IRDETO=y +CONFIG_READER_CONAX=y +CONFIG_READER_CRYPTOWORKS=y +CONFIG_READER_SECA=y +CONFIG_READER_VIACCESS=y +CONFIG_READER_VIDEOGUARD=y +CONFIG_READER_DRE=y +CONFIG_READER_TONGFANG=y +CONFIG_READER_BULCRYPT=y +CONFIG_READER_GRIFFIN=y +CONFIG_READER_DGCRYPT=y +CARDREADER_PHOENIX=y +CARDREADER_DRECAS=y +CARDREADER_INTERNAL=y +CARDREADER_SC8IN1=y +CARDREADER_MP35=y +CARDREADER_SMARGO=y +CARDREADER_DB2COM=y +CARDREADER_STAPI=y +# CARDREADER_STAPI5=n +CARDREADER_STINGER=y +" + +usage() { + echo \ +"OSCam config +Usage: `basename $0` [parameters] + + -g, --gui Start interactive configuration + + -s, --show-enabled [param] Show enabled configuration options. + -Z, --show-disabled [param] Show disabled configuration options. + -S, --show-valid [param] Show valid configuration options. + Possible params: all, addons, protocols, + readers, card_readers + + -l, --list-config List active configuration variables. + -e, --enabled [option] Check if certain option is enabled. + -d, --disabled [option] Check if certain option is disabled. + + -E, --enable [option] Enable config option. + -D, --disable [option] Disable config option. + + The following [option]s enable or disable multiple settings. + all - Everything. + addons - All addons. + protocols - All protocols. + readers - All readers. + card_readers - All card readers. + + -R, --restore Restore default config. + + -v, --oscam-version Display OSCam version. + -r, --oscam-revision Display OSCam SVN revision. + + -O, --detect-osx-sdk-version Find where OS X SDK is located + + -h, --help Display this help text. + +Examples: + # Enable WEBIF and SSL + ./config.sh --enable WEBIF WITH_SSL + + # Disable WEBIF but enable WITH_SSL + ./config.sh --disable WEBIF --enable WITH_SSL + + # Restore defaults and disable WEBIF and READER_NAGRA + ./config.sh --restore --disable WEBIF READER_NAGRA + + # Use default config with only one enabled reader + ./config.sh --restore --disable readers --enable READER_BULCRYPT + + # Disable everything and enable webif one module and one card reader + ./config.sh --disable all --enable WEBIF MODULE_NEWCAMD READER_BULCRYPT + + # Disable all card readers except INTERNAL + ./config.sh -D card_readers -E CARDREADER_INTERNAL + +Available options: + addons: $addons + protocols: $protocols + readers: $readers + card_readers: $card_readers +" +} + +# Output directory for config.mak set by --objdir parameter +OBJDIR=. + +# Use flags set by --use-flags parameter +USE_FLAGS= + +have_flag() { + for FLAG in $USE_FLAGS + do + [ "$FLAG" = "$1" ] && return 0 + done + return 1 +} + +have_all_flags() { + for opt ; do + have_flag $opt || return 1 + done + return 0 +} + +have_any_flags() { + for opt ; do + have_flag $opt && return 0 + done + return 1 +} + +not_have_flag() { + for FLAG in $USE_FLAGS + do + [ "$FLAG" = "$1" ] && return 1 + done + return 0 +} + +not_have_all_flags() { + for opt ; do + not_have_flag $opt || return 1 + done + return 0 +} + +not_have_any_flags() { + for opt ; do + not_have_flag $opt && return 0 + done + return 1 +} + +# Config functions +enabled() { + grep "^\#define $1 1$" config.h >/dev/null 2>/dev/null + return $? +} + +disabled() { + grep "^\#define $1 1$" config.h >/dev/null 2>/dev/null + test $? = 0 && return 1 + return 0 +} + +enabled_all() { + for opt ; do + enabled $opt || return 1 + done + return 0 +} + +disabled_all() { + for opt ; do + disabled $opt || return 1 + done + return 0 +} + +enabled_any() { + for opt ; do + enabled $opt && return 0 + done + return 1 +} + +disabled_any() { + for opt ; do + disabled $opt && return 0 + done + return 1 +} + +list_enabled() { + for OPT in $@ + do + enabled $OPT && echo $OPT + done +} + +list_disabled() { + for OPT in $@ + do + disabled $OPT && echo $OPT + done +} + +write_enabled() { + defined_file="webif/is_defined.txt" + pages_c="webif/pages.c" + rm -f $defined_file $pages_c 2>/dev/null + for OPT in $(get_opts) WITH_CARDREADER + do + enabled $OPT && printf "%s\n" $OPT >> $defined_file + done +} + +valid_opt() { + [ "$1" = "WITH_CARDREADER" ] && return 0 # Special case + echo $addons $protocols $readers $card_readers | grep -w "$1" >/dev/null + return $? +} + +enable_opt() { + valid_opt $1 && disabled $1 && { + sed -e "s|//#define $1 1$|#define $1 1|g" config.h > config.h.tmp && \ + mv config.h.tmp config.h + echo "Enable $1" + } +} + +enable_opts() { + for OPT in $@ + do + enable_opt $OPT + done +} + +disable_opt() { + valid_opt $1 && enabled $1 && { + sed -e "s|#define $1 1$|//#define $1 1|g" config.h > config.h.tmp && \ + mv config.h.tmp config.h + echo "Disable $1" + } +} + +disable_opts() { + for OPT in $@ + do + disable_opt $OPT + done +} + +get_opts() { + OPTS="" + case "$1" in + 'addons') OPTS="$addons" ; ;; + 'protocols') OPTS="$protocols" ; ;; + 'readers') OPTS="$readers" ; ;; + 'card_readers') OPTS="$card_readers" ; ;; + *) OPTS="$addons $protocols $readers $card_readers" ; ;; + esac + echo $OPTS +} + +update_deps() { + # Calculate dependencies + enabled_any $(get_opts readers) $(get_opts card_readers) && enable_opt WITH_CARDREADER >/dev/null + disabled_all $(get_opts readers) $(get_opts card_readers) && disable_opt WITH_CARDREADER >/dev/null + disabled WEBIF && disable_opt WEBIF_LIVELOG >/dev/null + disabled WEBIF && disable_opt WEBIF_JQUERY >/dev/null + enabled MODULE_CCCSHARE && enable_opt MODULE_CCCAM >/dev/null + enabled_any CARDREADER_DB2COM CARDREADER_MP35 CARDREADER_SC8IN1 CARDREADER_STINGER && enable_opt CARDREADER_PHOENIX >/dev/null +} + +list_config() { + update_deps + # Handle use flags + have_flag USE_STAPI && echo "CONFIG_WITH_STAPI=y" || echo "# CONFIG_WITH_STAPI=n" + have_flag USE_STAPI5 && echo "CONFIG_WITH_STAPI5=y" || echo "# CONFIG_WITH_STAPI5=n" + have_flag USE_COOLAPI && echo "CONFIG_WITH_COOLAPI=y" || echo "# CONFIG_WITH_COOLAPI=n" + have_flag USE_COOLAPI2 && echo "CONFIG_WITH_COOLAPI2=y" || echo "# CONFIG_WITH_COOLAPI2=n" + have_flag USE_SU980 && echo "CONFIG_WITH_SU980=y" || echo "# CONFIG_WITH_SU980=n" + have_flag USE_AZBOX && echo "CONFIG_WITH_AZBOX=y" || echo "# CONFIG_WITH_AZBOX=n" + have_flag USE_MCA && echo "CONFIG_WITH_MCA=y" || echo "# CONFIG_WITH_MCA=n" + have_flag USE_LIBCRYPTO && echo "CONFIG_WITH_LIBCRYPTO=y" || echo "# CONFIG_WITH_LIBCRYPTO=n" + for OPT in $addons $protocols WITH_CARDREADER $readers + do + enabled $OPT && echo "CONFIG_$OPT=y" || echo "# CONFIG_$OPT=n" + done + for OPT in $card_readers + do + if [ $OPT = CARDREADER_INTERNAL ] + then + # Internal card reader is actually three different readers depending on USE flags + enabled $OPT && have_flag USE_AZBOX && echo "CONFIG_${OPT}_AZBOX=y" || echo "# CONFIG_${OPT}_AZBOX=n" + enabled $OPT && have_any_flags USE_COOLAPI USE_SU980 && echo "CONFIG_${OPT}_COOLAPI=y" || echo "# CONFIG_${OPT}_COOLAPI=n" + enabled $OPT && have_flag USE_COOLAPI2 && echo "CONFIG_${OPT}_COOLAPI2=y" || echo "# CONFIG_${OPT}_COOLAPI2=n" + enabled $OPT && not_have_all_flags USE_AZBOX USE_COOLAPI USE_COOLAPI2 USE_SU980 && echo "CONFIG_${OPT}_SCI=y" || echo "# CONFIG_${OPT}_SCI=n" + continue + fi + if [ $OPT = CARDREADER_STAPI ] + then + # Enable CARDREADER_STAPI only if USE_STAPI is set + enabled $OPT && have_flag USE_STAPI && echo "CONFIG_$OPT=y" || echo "# CONFIG_$OPT=n" + continue + fi + if [ $OPT = CARDREADER_STAPI5 ] + then + # Enable CARDREADER_STAPI5 only if USE_STAPI5 is set + enabled $OPT && have_flag USE_STAPI5 && echo "CONFIG_$OPT=y" || echo "# CONFIG_$OPT=n" + continue + fi + enabled $OPT && echo "CONFIG_$OPT=y" || echo "# CONFIG_$OPT=n" + done + have_flag USE_LIBUSB && echo "CONFIG_CARDREADER_SMART=y" || echo "# CONFIG_CARDREADER_SMART=n" + have_flag USE_PCSC && echo "CONFIG_CARDREADER_PCSC=y" || echo "# CONFIG_CARDREADER_PCSC=n" + # Extra modules/libraries + enabled_any MODULE_GBOX WEBIF && echo "CONFIG_LIB_MINILZO=y" || echo "# CONFIG_LIB_MINILZO=n" + not_have_flag USE_LIBCRYPTO && echo "CONFIG_LIB_AES=y" || echo "# CONFIG_LIB_AES=n" + enabled MODULE_CCCAM && echo "CONFIG_LIB_RC6=y" || echo "# CONFIG_LIB_RC6=n" + not_have_flag USE_LIBCRYPTO && enabled MODULE_CCCAM && echo "CONFIG_LIB_SHA1=y" || echo "# CONFIG_LIB_SHA1=n" + enabled_any READER_DRE MODULE_SCAM READER_VIACCESS READER_NAGRA_MERLIN && echo "CONFIG_LIB_DES=y" || echo "# CONFIG_LIB_DES=n" + enabled_any MODULE_CCCAM READER_NAGRA READER_NAGRA_MERLIN READER_SECA && echo "CONFIG_LIB_IDEA=y" || echo "# CONFIG_LIB_IDEA=n" + not_have_flag USE_LIBCRYPTO && enabled_any READER_CONAX READER_CRYPTOWORKS READER_NAGRA READER_NAGRA_MERLIN && echo "CONFIG_LIB_BIGNUM=y" || echo "# CONFIG_LIB_BIGNUM=n" + enabled READER_NAGRA_MERLIN && echo "CONFIG_LIB_MDC2=y" || echo "# CONFIG_LIB_MDC2=n" + enabled READER_NAGRA_MERLIN && echo "CONFIG_LIB_FAST_AES=y" || echo "# CONFIG_LIB_FAST_AES=n" + enabled READER_NAGRA_MERLIN && echo "CONFIG_LIB_SHA256=y" || echo "# CONFIG_LIB_SHA256=n" + enabled_any READER_NAGRA READER_NAGRA_MERLIN && echo "CONFIG_READER_NAGRA_COMMON=y" || echo "# CONFIG_READER_NAGRA_COMMON=n" +} + +make_config_c() { + OPENSSL=$(which openssl 2>/dev/null) + if [ "$OPENSSL" = "" ] + then + echo "// openssl not found!" + echo "const char *config_mak = \"CFG: openssl not found in PATH!\";" + else + echo "// This file is generated by ./config.sh --objdir $OBJDIR --make-config.mak" + echo "const char *config_mak =" + printf " \"\\\nCFG: strings FILE | sed -n 's/^CFG~//p' | openssl enc -d -base64 | gzip -d\\\n\"\n" + gzip -9 < $OBJDIR/config.mak | $OPENSSL enc -base64 | while read LINE + do + printf " \"CFG~%s\\\\n\"\n" "$LINE" + done + echo " ;" + fi +} + +make_config_mak() { + TMPFILE=$(mktemp -t config.mak.XXXXXX) || exit 1 + list_config > $TMPFILE + [ ! -d $OBJDIR ] && mkdir -p $OBJDIR 2>/dev/null + cmp $TMPFILE $OBJDIR/config.mak >/dev/null 2>/dev/null + if [ $? != 0 ] + then + cat $TMPFILE > $OBJDIR/config.mak + make_config_c > $OBJDIR/config.c + else + make_config_c > $TMPFILE + cmp $TMPFILE $OBJDIR/config.c >/dev/null 2>/dev/null + [ $? != 0 ] && cat $TMPFILE > $OBJDIR/config.c + fi + rm -rf $TMPFILE +} + +check_test() { + if [ "$(cat $tempfileconfig | grep "^#define $1 1$")" != "" ]; then + echo "on" + else + echo "off" + fi +} + +disable_all() { + for i in $1; do + sed -e "s/^#define ${i} 1$/\/\/#define ${i} 1/g" $tempfileconfig > ${tempfileconfig}.tmp && \ + mv ${tempfileconfig}.tmp $tempfileconfig + done +} + +enable_package() { + for i in $(cat $tempfile); do + strip=$(echo $i | sed "s/\"//g") + sed -e "s/\/\/#define ${strip} 1$/#define ${strip} 1/g" $tempfileconfig > ${tempfileconfig}.tmp && \ + mv ${tempfileconfig}.tmp $tempfileconfig + done +} + +print_components() { + clear + echo "You have selected the following components:" + echo + echo "Add-ons:" + for i in $addons; do + printf "\t%-20s: %s\n" $i $(check_test "$i") + done + + echo + echo "Protocols:" + for i in $protocols; do + printf "\t%-20s: %s\n" $i $(check_test "$i") + done + + echo + echo "Readers:" + for i in $readers; do + printf "\t%-20s: %s\n" $i $(check_test "$i") + done + + echo + echo "Card readers:" + for i in $card_readers; do + printf "\t%-20s: %s\n" $i $(check_test "$i") + done + + cp -f $tempfileconfig $configfile +} + +menu_addons() { + ${DIALOG} --checklist "\nChoose add-ons:\n " $height $width $listheight \ + WEBIF "Web Interface" $(check_test "WEBIF") \ + WEBIF_LIVELOG "LiveLog" $(check_test "WEBIF_LIVELOG") \ + WEBIF_JQUERY "Jquery onboard (if disabled webload)" $(check_test "WEBIF_JQUERY") \ + TOUCH "Touch Web Interface" $(check_test "TOUCH") \ + WITH_SSL "OpenSSL support" $(check_test "WITH_SSL") \ + HAVE_DVBAPI "DVB API" $(check_test "HAVE_DVBAPI") \ + WITH_NEUTRINO "Neutrino support" $(check_test "WITH_NEUTRINO") \ + READ_SDT_CHARSETS "DVB API read-sdt charsets" $(check_test "READ_SDT_CHARSETS") \ + IRDETO_GUESSING "Irdeto guessing" $(check_test "IRDETO_GUESSING") \ + CS_ANTICASC "Anti cascading" $(check_test "CS_ANTICASC") \ + WITH_DEBUG "Debug messages" $(check_test "WITH_DEBUG") \ + MODULE_MONITOR "Monitor" $(check_test "MODULE_MONITOR") \ + WITH_LB "Loadbalancing" $(check_test "WITH_LB") \ + CS_CACHEEX "Cache exchange" $(check_test "CS_CACHEEX") \ + CW_CYCLE_CHECK "CW Cycle Check" $(check_test "CW_CYCLE_CHECK") \ + LCDSUPPORT "LCD support" $(check_test "LCDSUPPORT") \ + LEDSUPPORT "LED support" $(check_test "LEDSUPPORT") \ + CLOCKFIX "Clockfix (disable on old systems!)" $(check_test "CLOCKFIX") \ + IPV6SUPPORT "IPv6 support (experimental)" $(check_test "IPV6SUPPORT") \ + 2> ${tempfile} + + opt=${?} + if [ $opt != 0 ]; then return; fi + + disable_all "$addons" + enable_package +} + +menu_protocols() { + ${DIALOG} --checklist "\nChoose protocols:\n " $height $width $listheight \ + MODULE_CAMD33 "camd 3.3" $(check_test "MODULE_CAMD33") \ + MODULE_CAMD35 "camd 3.5 UDP" $(check_test "MODULE_CAMD35") \ + MODULE_CAMD35_TCP "camd 3.5 TCP" $(check_test "MODULE_CAMD35_TCP") \ + MODULE_NEWCAMD "newcamd" $(check_test "MODULE_NEWCAMD") \ + MODULE_CCCAM "CCcam" $(check_test "MODULE_CCCAM") \ + MODULE_CCCSHARE "CCcam share" $(check_test "MODULE_CCCSHARE") \ + MODULE_GBOX "gbox" $(check_test "MODULE_GBOX") \ + MODULE_RADEGAST "radegast" $(check_test "MODULE_RADEGAST") \ + MODULE_SERIAL "Serial" $(check_test "MODULE_SERIAL") \ + MODULE_CONSTCW "constant CW" $(check_test "MODULE_CONSTCW") \ + MODULE_PANDORA "Pandora" $(check_test "MODULE_PANDORA") \ + MODULE_GHTTP "Ghttp" $(check_test "MODULE_GHTTP") \ + MODULE_SCAM "scam" $(check_test "MODULE_SCAM") \ + 2> ${tempfile} + + opt=${?} + if [ $opt != 0 ]; then return; fi + + disable_all "$protocols" + enable_package +} + +menu_readers() { + ${DIALOG} --checklist "\nChoose readers (CA systems):\n " $height $width $listheight \ + READER_NAGRA "Nagravision" $(check_test "READER_NAGRA") \ + READER_NAGRA_MERLIN "Nagra Merlin" $(check_test "READER_NAGRA_MERLIN") \ + READER_IRDETO "Irdeto" $(check_test "READER_IRDETO") \ + READER_CONAX "Conax" $(check_test "READER_CONAX") \ + READER_CRYPTOWORKS "Cryptoworks" $(check_test "READER_CRYPTOWORKS") \ + READER_SECA "Seca" $(check_test "READER_SECA") \ + READER_VIACCESS "Viaccess" $(check_test "READER_VIACCESS") \ + READER_VIDEOGUARD "NDS Videoguard" $(check_test "READER_VIDEOGUARD") \ + READER_DRE "DRE Crypt" $(check_test "READER_DRE") \ + READER_TONGFANG "Tongfang" $(check_test "READER_TONGFANG") \ + READER_BULCRYPT "Bulcrypt" $(check_test "READER_BULCRYPT") \ + READER_GRIFFIN "Griffin" $(check_test "READER_GRIFFIN") \ + READER_DGCRYPT "DGCrypt" $(check_test "READER_DGCRYPT") \ + 2> ${tempfile} + + opt=${?} + if [ $opt != 0 ]; then return; fi + + disable_all "$readers" + enable_package +} + +menu_card_readers() { + ${DIALOG} --checklist "\nChoose card reader drivers:\n " $height $width $listheight \ + CARDREADER_PHOENIX "Phoenix/mouse" $(check_test "CARDREADER_PHOENIX") \ + CARDREADER_INTERNAL "Internal (Sci,Azbox,Cool)" $(check_test "CARDREADER_INTERNAL") \ + CARDREADER_SC8IN1 "SC8in1" $(check_test "CARDREADER_SC8IN1") \ + CARDREADER_MP35 "AD-Teknik MP 3.6/USB Phoenix" $(check_test "CARDREADER_MP35") \ + CARDREADER_SMARGO "Argolis Smargo Smartreader" $(check_test "CARDREADER_SMARGO") \ + CARDREADER_DB2COM "dbox2" $(check_test "CARDREADER_DB2COM") \ + CARDREADER_STAPI "STAPI" $(check_test "CARDREADER_STAPI") \ + CARDREADER_STAPI5 "STAPI5" $(check_test "CARDREADER_STAPI5") \ + CARDREADER_STINGER "STINGER" $(check_test "CARDREADER_STINGER") \ + CARDREADER_DRECAS "DRECAS" $(check_test "CARDREADER_DRECAS") \ + 2> ${tempfile} + + opt=${?} + if [ $opt != 0 ]; then return; fi + + disable_all "$card_readers" + enable_package +} + + +config_dialog() { + height=30 + width=65 + listheight=16 + + DIALOG=${DIALOG:-`which dialog`} + if [ -z "${DIALOG}" ]; then + echo "Please install dialog package." 1>&2 + exit 1 + fi + + configfile=config.h + tempfile=$(mktemp -t oscam-config.dialog.XXXXXX) || exit 1 + tempfileconfig=$(mktemp -t oscam-config.h.XXXXXX) || exit 1 + trap 'rm -f $tempfile $tempfileconfig $tempfileconfig.bak 2>/dev/null' INT TERM EXIT + cp -f $configfile $tempfileconfig + + while true; do + ${DIALOG} --menu "\nSelect category:\n " $height $width $listheight \ + Add-ons "Add-ons" \ + Protocols "Network protocols" \ + Readers "Readers (CA systems)" \ + CardReaders "Card reader drivers" \ + Save "Save" \ + 2> ${tempfile} + + opt=${?} + if [ $opt != 0 ]; then clear; exit; fi + + menuitem=$(cat $tempfile) + case $menuitem in + Add-ons) menu_addons ;; + Protocols) menu_protocols ;; + Readers) menu_readers ;; + CardReaders) menu_card_readers ;; + Save) + print_components + update_deps + write_enabled + exit 0 + ;; + esac + done +} + +# Change working directory to the directory where the script is +cd $(dirname $0) + +if [ $# = 0 ] +then + usage + exit 1 +fi + +while [ $# -gt 0 ] +do + case "$1" in + '-g'|'--gui'|'--config'|'--menuconfig') + config_dialog + break + ;; + '-s'|'--show-enabled'|'--show') + shift + list_enabled $(get_opts $1) + # Take special care of USE_xxx flags + if [ "$1" = "card_readers" ] + then + have_flag USE_LIBUSB && echo "CARDREADER_SMART" + have_flag USE_PCSC && echo "CARDREADER_PCSC" + fi + break + ;; + '-Z'|'--show-disabled') + shift + list_disabled $(get_opts $1) + break + ;; + '-S'|'--show-valid') + shift + for OPT in $(get_opts $1) + do + echo $OPT + done + break + ;; + '-E'|'--enable') + shift + while [ "$1" != "" ] + do + case "$1" in + -*) + update_deps + continue 2 + ;; + all|addons|protocols|readers|card_readers) + enable_opts $(get_opts $1) + ;; + *) + enable_opt "$1" + ;; + esac + shift + done + update_deps + write_enabled + ;; + '-D'|'--disable') + shift + while [ "$1" != "" ] + do + case "$1" in + -*) + update_deps + continue 2 + ;; + all|addons|protocols|readers|card_readers) + disable_opts $(get_opts $1) + ;; + *) + disable_opt "$1" + ;; + esac + shift + done + update_deps + write_enabled + ;; + '-R'|'--restore') + echo $defconfig | sed -e 's|# ||g' | xargs printf "%s\n" | grep "=y$" | sed -e 's|^CONFIG_||g;s|=.*||g' | + while read OPT + do + enable_opt "$OPT" + done + echo $defconfig | sed -e 's|# ||g' | xargs printf "%s\n" | grep "=n$" | sed -e 's|^CONFIG_||g;s|=.*||g' | + while read OPT + do + disable_opt "$OPT" + done + update_deps + write_enabled + ;; + '-e'|'--enabled') + enabled $2 && echo "Y" && exit 0 || echo "N" && exit 1 + break + ;; + '-d'|'--disabled') + disabled $2 && echo "Y" && exit 0 || echo "N" && exit 1 + break + ;; + '-v'|'--oscam-version') + grep CS_VERSION globals.h | cut -d\" -f2 + break + ;; + '-r'|'--oscam-revision') + revision=`(svnversion -n . 2>/dev/null || printf 0) | sed 's/.*://; s/[^0-9]*$//; s/^$/0/'` + if [ "$revision" = "0" ] + then + which git > /dev/null 2>&1 && revision=`git log -10 --pretty=%B | grep git-svn-id | head -n 1 | sed -n -e 's/^.*trunk@\([0-9]*\) .*$/\1/p'` + fi + echo $revision + break + ;; + '-O'|'--detect-osx-sdk-version') + shift + OSX_VER=${1:-10.10} + for DIR in /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX{$OSX_VER,10.10,10.9,10.8,10.7}.sdk /Developer/SDKs/MacOSX{$OSX_VER,10.6,10.5}.sdk + + do + if test -d $DIR + then + echo $DIR + exit 0 + fi + done + echo Cant_find_OSX_SDK + break + ;; + '-l'|'--list-config') + list_config + exit 0 + ;; + '-m'|'--make-config.mak') + make_config_mak + exit 0 + ;; + '--use-flags') + shift + USE_FLAGS=$1 + ;; + '--objdir') + shift + OBJDIR=$1 + ;; + '-h'|'--help') + usage + break + ;; + *) + echo "[WARN] Unknown parameter: $1" >&2 + ;; + esac + # Some shells complain when there are no more parameters to shift + test $# -gt 0 && shift +done + +exit 0 diff --git a/support/configs/max_cpus b/support/configs/max_cpus new file mode 100644 index 0000000..19c7bdb --- /dev/null +++ b/support/configs/max_cpus @@ -0,0 +1 @@ +16 \ No newline at end of file diff --git a/support/configs/max_cpus.txt b/support/configs/max_cpus.txt new file mode 100644 index 0000000..77d5f98 --- /dev/null +++ b/support/configs/max_cpus.txt @@ -0,0 +1,5 @@ +put only the count of cpus u want to use in the file !!! + +example: +for 3 of X cpus +echo 3 >max_cpus \ No newline at end of file diff --git a/support/configs/simplebuild.config b/support/configs/simplebuild.config new file mode 100644 index 0000000..5e6eac0 --- /dev/null +++ b/support/configs/simplebuild.config @@ -0,0 +1,8 @@ +DIRECTMENU=0 +NO_SVN_AUTOUPDATE=1 +SAVE_LISTSMARGO=0 +S3_UPDATE_CHECK=0 +USE_VERBOSE=0 +USE_COMPRESS=0 +USE_TARGZ=0 +delete_oscamdebugbinary=1 diff --git a/support/configs/upx.txt b/support/configs/upx.txt new file mode 100644 index 0000000..230d9f5 --- /dev/null +++ b/support/configs/upx.txt @@ -0,0 +1,16 @@ +-1 +-2 +-3 +-4 +-5 +-6 +-7 +-8 +-9 +--best +--brute +--ultra-brute + + +-1 #very fast +--ultra-brute #very slow but very strong diff --git a/support/configs/upx_option b/support/configs/upx_option new file mode 100644 index 0000000..1e898ab --- /dev/null +++ b/support/configs/upx_option @@ -0,0 +1 @@ +upx_c=-1 \ No newline at end of file diff --git a/support/functions/_ansi b/support/functions/_ansi new file mode 100644 index 0000000..6a202e4 --- /dev/null +++ b/support/functions/_ansi @@ -0,0 +1,39 @@ +#!/bin/bash + +#usage: +#to use colors start with initializeANSI first +#example red color text +#echo -e $r_n"red text"$re_"normal text" + +initializeANSI(){ +nc='\033[0;'; #nc normal color +lc='\033[1;'; #lc light color +# normal +r_n=$nc'31m'; #red +g_n=$nc'32m'; #green +y_n=$nc'33m'; #yellow +b_n=$nc'34m'; #blue +p_n=$nc'35m'; #pink +c_n=$nc'36m'; #cyan +w_n=$nc'37m'; #white +#light +r_l=$lc'31m'; #red +g_l=$lc'32m'; #green +y_l=$lc'33m'; #yellow +b_l=$lc'34m'; #blue +p_l=$lc'35m'; #pink +c_l=$lc'36m'; #cyan +w_l=$lc'37m'; #white +#reset to normal +re_='\033[0m'; #resets all colors +re_f='\033[39m'; #resets only foreground color +re_b='\033[49m'; #resets only background color +#sed replace +W=$(echo -e '\033[0m'); #normal +Y=$(echo -e '\033[1;33m'); #yellow +R=$(echo -e '\033[1;31m'); #red +G=$(echo -e '\033[1;32m'); #green +P=$(echo -e '\033[1;35m'); #pink +C=$(echo -e '\033[1;36m'); #cyan +WH=$(echo -e '\033[1;37m'); #lightgray +}; \ No newline at end of file diff --git a/support/functions/_arrays b/support/functions/_arrays new file mode 100644 index 0000000..86a2ad0 --- /dev/null +++ b/support/functions/_arrays @@ -0,0 +1,54 @@ +#!/bin/bash + +_fill_tc_array(){ + unset AVAI_TCLIST; + unset INST_TCLIST; + tcempty=0; + cd "$tccfgdir"; + [ "$(ls -A "$tccfgdir")" ] && AVAI_TCLIST=(*) || echo "error fix it"; + cd "$tcdir"; + if [ "$(ls -A "$tcdir")" ];then + tmp_tclist=(*); + for t in "${tmp_tclist[@]}";do + for a in "${AVAI_TCLIST[@]}";do + [ "$t" == "$a" ] && INST_TCLIST+=($t); + done; + done; + else + tcempty=1; + fi; + if [ "$tcempty" == "1" ];then + MISS_TCLIST=$(echo ${AVAI_TCLIST[@]} |sort); + else + MISS_TCLIST=($(for el in $(diff_array AVAI_TCLIST[@] INST_TCLIST[@]);do echo "$el";done |sort)); + fi; +}; +_create_module_arrays(){ + i=0; + for e in $(echo "$addons" | sed 's/WEBIF_//g;s/WITH_//g;s/MODULE_//g;s/CS_//g;s/HAVE_//g;s/_CHARSETS//g;s/CW_CYCLE_CHECK/CWCC/g;s/SUPPORT//g';);do + SHORT_ADDONS+=($e); + SHORT_MODULENAMES+=($e); + done; + for e in ${protocols//MODULE_/};do + SHORT_PROTOCOLS+=($e); + SHORT_MODULENAMES+=($e); + done; + for e in ${readers//READER_/};do + SHORT_READERS+=($e); + SHORT_MODULENAMES+=($e); + done; + for e in ${card_readers//CARDREADER_/};do + SHORT_CARD_READERS+=($e); + SHORT_MODULENAMES+=($e); + done; + for e in $addons $protocols $readers $card_readers;do + ALL_MODULES_LONG+=($e); + done; + for e in "${SHORT_MODULENAMES[@]}";do + INTERNAL_MODULES["$e"]="${ALL_MODULES_LONG[i]}"; + ((i++)); + done; +}; +diff_array(){ + awk 'BEGIN{RS=ORS=" "}{NR==FNR?a[$0]++:a[$0]--}END{for(k in a)if(a[k])print k}' <(echo -n "${!1}") <(echo -n "${!2}"); +}; \ No newline at end of file diff --git a/support/functions/_cmd_build b/support/functions/_cmd_build new file mode 100644 index 0000000..2b31fe6 --- /dev/null +++ b/support/functions/_cmd_build @@ -0,0 +1,203 @@ +#!/bin/bash + +_cmd_build(){ + [ ! -d "$svndir" ] || [ -f "$workdir/NEED-CHECKOUT" ] && checkout; + if [ "$_toolchainname" == "native" ];then + log_name="$(date +%F).$(date +%X).$(hostname).log"; + + else + log_name="$(date +%F).$(date +%X).$_toolchainname.log"; + fi; + source "$tccfgdir/$_toolchainname"; + _reset_config; + #_fix_config_h; + echo $WH; + ologo >"$ldir/$log_name"; + +#set build defaults + CROSS="$tcdir/$_toolchainname/bin/$_compiler"; + [ -f "$configdir/compiler_option" ] && co=$(cat "$configdir/compiler_option") || co="-O2"; + +#toolchain defaults + for defa in $default_use;do + USE_vars[$defa]="$defa=1"; + done; + +#disable by cmd + for e in ${USE_vars[*]};do + for d in ${USE_vars_disable[*]};do + [ "$e" == "$d" ] && USE_vars[${e:0: -2}]=; + done; + done; + _nl; + cd "$svndir"; + +#make clean + make distclean > /dev/null 2>&1; + +#do enable and disable modules + for am in "${all_cc[@]}";do + chose="false"; + if [ "${am:${#am} - 3}" == "_on" ];then + e="${am:0: -3}";"$svndir/config.sh" -E "$e" |awk '{printf "\033[1;37m"} {printf " | %s : ", $1} {printf "\033[1;32m"} {printf "%s\n", $2}'; + fi; + if [ "${am:${#am} - 4}" == "_off" ];then + d="${am:0: -4}";"$svndir/config.sh" -D "$d" |awk '{printf "\033[1;37m"} {printf " | %s : ", $1} {printf "\033[1;31m"} {printf "%s\n", $2}'; + fi; + done; + +#fix smargo case + if [ "$(./config.sh -e CARDREADER_SMARGO)" == "Y" ] || [ "${USE_vars[$e]}" == "USE_LIBUSB=1" ];then + silent=$(./config.sh -E CARDREADER_SMARGO); + check_smargo; + else + silent=$(./config.sh -D CARDREADER_SMARGO); + check_smargo; + fi; + +#fill use variables and set name addons + USESTRING=; + _usb=; + _pcsc=; + _stapi=; + _stapi5=; + _do_patch="0"; + for e in "${!USE_vars[@]}";do + for e1 in $_block;do + USE_vars[$e1]=; + done; + uv=${USE_vars[$e]}; + if [ ! "$e" == "USE_CONFDIR" ];then + USESTRING="$uv $USESTRING"; + if [ "${#USE_vars[$e]}" -gt "5" ];then + echo -e "$w_l | set : $c_l${USE_vars[$e]}"; + fi; + fi; + case "$uv" in + "USE_LIBUSB=1") + _usb="-libusb";; # set libusb suffix to name + "USE_PCSC=1") + _pcsc_on;_pcsc="-pcsc";;# set pcsc suffix to name + "USE_PATCH=1") + _do_patch="1";; # enable patching + "USE_TARGZ=1") + s3cfg_vars[TARGZ]=1;; # overwrite global + "USE_COMPRESS=1") + s3cfg_vars[COMPRESS]=1;;# overwrite global + "USE_STAPI=1") + _stapi="-stapi"; + STAPI_LIB="STAPI_LIB=$sdir/stapi/liboscam_stapi.a"; + echo -e "$w_l | LIB : "$c_l"liboscam_stapi.a"$w_l;; + "USE_STAPI5=1") + _stapi5="-stapi5"; + [ "$OPENBOX" == "1" ] && STAPI_LIB="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_OPENBOX.a" && echo -e "$w_l| LIB : "$c_l"liboscam_stapi5_OPENBOX.a"$w_l; + [ "$UFS916003" == "1" ] && STAPI_LIB="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_UFS916_0.03.a" && echo -e "$w_l| LIB : "$c_l"liboscam_stapi5_UFS916_0.03.a"$w_l; + [ "$UFS916003" == "0" ] && [ "$OPENBOX" == "0" ] && STAPI_LIB="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_UFS916.a" && echo -e "$w_l| LIB : "$c_l"liboscam_stapi5_UFS916.a"$w_l;; + esac; + done; + +#change default oscam CONF_DIR +if [ ! "$_oscamconfdir_custom" == "not_set" ] && [ ${#_oscamconfdir_custom} -gt 3 ]; then + [ ! "$CUSTOM_CONFDIR" == "not_set" ] && _oscamconfdir_custom=$CUSTOM_CONFDIR; + CONFDIR="$_oscamconfdir_custom"; + echo -e $w_l" | set : "$r_l"custom CONF_DIR=$CONFDIR"$w_l; +else + CONFDIR="$_oscamconfdir_default"; +fi; + +#patching + if [ "$_do_patch" == "1" ];then + if [ -f "$workdir/SVN-IS-PATCHED" ];then + quicksvnrestore $_toolchainname; + _apply_consolepatch; + else + _apply_consolepatch; + fi; + fi; + +#echo if build with profile + [ ! "$pf" == "empty" ] && echo -e "$y_l | PROFILE : $pf_name"; + +#echo IF SVN is Patched + [ -f "$workdir/SVN-IS-PATCHED" ] && echo -e $w_l" ISPATCHED : "$P" YES"; + +#echo max cpu usage + if [ -f "$configdir/max_cpus" ];then + cpus="$(cat "$configdir/max_cpus")"; + [ ! "$cpus" -gt "1" ] && cpus="1"; + [ "$cpus" -gt "$(CPUS)" ] && cpus="$(CPUS)"; + echo -en "$y_l\n | MAX_CPUS : $txt_use $cpus $txt_of $(CPUS) CPU(s)"; + else + cpus="$(CPUS)"; + fi; + [ "${s3cfg_vars[USE_VERBOSE]}" == "1" ] && _verbose="V=1"; + +#killstapi for nonsh4 + if [ ! "$_toolchainname" == "sh4" ] || [ ! "$_toolchainname" == "sh_4" ];then + silent=$("$svndir/config.sh" --disable CARDREADER_STAPI CARDREADER_STAPI5); + fi; + +#build + timer_start; + _generate_oscam_name "$_toolchainname"; + _nl; + USESTRING=${USE_vars[@]}; + make -j"$cpus" $_verbose \ + "CONF_DIR=$CONFDIR" \ + "OSCAM_BIN=$bdir/$oscam_name" \ + "CC_OPTS=$co $cc_opts" \ + "CC_WARN=$cc_warn" \ + "CROSS=$CROSS" $STAPI_LIB $USESTRING 2>&1 \ + |tee -a "$ldir/$log_name" \ + |grep --line-buffered -v 'BFD' \ + |grep --line-buffered '^CC\|^GEN\|UseFlags\| CONF_DIR =\|Binary\|LINK\|STRIP\|BUILD\|Addons\|Protocols\|Readers\|CardRdrs\|^/' \ + |sed -e "s/^|/"$Y" |/g;s/^LINK/"$P" LINK ------->$W/g;s/^STRIP/"$P" STRIP ------>$W/g;s/^CC\|^BUILD/"$G" BUILD ------>$W/g;s/^GEN/"$C" GEN -------->/g; + s/WEBIF_//g;s/WITH_//g;s/MODULE_//g;s/CS_//g;s/HAVE_//g;s/_CHARSETS//g;s/CW_CYCLE_CHECK/CWCC/g;s/SUPPORT//g;" + +#calc buildtime + timer_stop; + timer_calc; + bt="[ $txt_buildtime $((Tcalc / 60)) min(s) $((Tcalc % 60)) secs ]"; + +#save list_smargo + cd "$svndir/Distribution"; + lsmn="$(ls list_smargo* 2> /dev/null)"; + if [ "${s3cfg_vars[SAVE_LISTSMARGO]}" == "1" ] && [ -f "$svndir/Distribution/$lsmn" ];then + if [ "$_toolchainname" == "native" ];then + echo -e "$g_n"" SAVE -------> $w_l$lsmn$g_l $txt_as$y_l oscam-svn$(REVISION)-$(hostname)-list_smargo"; + mv -f "$lsmn" "$bdir/oscam-svn$(REVISION)-$(hostname)-list_smargo"; + tartmp="oscam-svn$(REVISION)-$(hostname)-list_smargo"; + else + echo -e "$g_n"" SAVE -------> $w_l$lsmn$g_l $txt_as$y_l oscam-svn$(REVISION)-$_toolchainname-list_smargo"; + mv -f "$lsmn" "$bdir/oscam-svn$(REVISION)-$_toolchainname-list_smargo"; + tartmp="oscam-svn$(REVISION)-$_toolchainname-list_smargo"; + fi; + fi; + +#remove debug binary + if [ "${s3cfg_vars[delete_oscamdebugbinary]}" == "1" ] && [ -f "$bdir/$oscam_name.debug" ];then + echo -e "$r_l"" REMOVE -----> $w_l$bdir/$oscam_name.debug";rm "$bdir/$oscam_name.debug"; + fi; + +#show build time + echo -e "$g_n""\n TIME -------> $bt\n$re_"; + +#compress cam + if [ "${s3cfg_vars[COMPRESS]}" == "1" ];then + echo -en "$w_l"" ENABLE -----> COMPRESSION:$y_l $txt_wait"; + compress_cam "$oscam_name"; + fi; + if [ "${s3cfg_vars[TARGZ]}" == "1" ];then + echo -en "$w_l"" ENABLE ----> TARGZ:$y_l $txt_wait\n"; + tar_cam "$oscam_name" "$tartmp"; + fi; + +#link lastlog + ln -sf "$ldir/$log_name" "$workdir/lastbuild.log"; + +#build error message + error_on_build=$(grep -c1 error "$ldir/$log_name"); + [ "$error_on_build" -gt "0" ] && echo -e "$r_l\terrors on build found$w_l"; + echo -e "$re_"; + exit; +}; diff --git a/support/functions/_compress b/support/functions/_compress new file mode 100644 index 0000000..6687849 --- /dev/null +++ b/support/functions/_compress @@ -0,0 +1,93 @@ +#!/bin/bash + +compress_cam(){ + cd "$bdir"; + upx_c="-1"; + [ -f "$configdir/upx_option" ] && source "$configdir/upx_option"; + erg=$(upx "$upx_c" "$1" |grep oscam |awk '{print $1" "$3" "$4 }'); + e1="$(echo "$erg"| awk '{printf("%4.2f k\n", $1 /1024)}')"; + e2="$(echo "$erg"| awk '{printf("%4.2fk\n", $2 /1024)}')"; + e3="$(echo "$erg"| awk '{print $3}')"; + echo -e "$w_l\n\n BEFORE -----> $txt_compress1\t= $g_n$e1$w_l\n AFTER ------> $txt_compress2\t= $g_l$e2$w_l\n RESULT -----> $txt_compress3\t= $c_n$e3$rs_\n"; +}; +compress_cam_gui(){ + cd "$bdir"; + upx_c="-1"; + [ -f "$configdir/upx_option" ] && source "$configdir/upx_option"; + erg=$(upx "$upx_c" "$1" |grep oscam |awk '{print $1" "$3" "$4 }'); + e1="$(echo "$erg"| awk '{printf("%4.2f k\n", $1 /1024)}')"; + e2="$(echo "$erg"| awk '{printf("%4.2fk\n", $2 /1024)}')"; + e3="$(echo "$erg"| awk '{print $3}')"; + echo -e "\n $txt_compress1\t= $e1\n $txt_compress2\t= $e2\n $txt_compress3\t= $e3"; +}; +tar_cam_gui(){ + cd "$bdir"; + erg=$(tar zcf $1.tar.gz $1 $2); + if [ -f "$1.tar.gz" ];then + echo -e "\n $1.tar.gz\n created"; + if [ -f "$adir/$1.tar.gz" ];then + rm -rf "$adir/$1.tar.gz"; + mv -f "$1.tar.gz" "$adir"; + echo -e "\n $1.tar.gz\n moved to $workdir/archive\n"; + else + mv -f "$1.tar.gz" "$adir"; + echo -e "\n $1.tar.gz\n moved to $workdir/archive\n"; + fi; + else + echo -e "\nerror\n no $1.tar.gz\n created"; + fi; +}; +tar_cam(){ + cd "$bdir"; + if [ -n $2 ];then + echo -en "$y_n\n TAR -------->$w_l $1$g_l $txt_as$w_l $1.tar.gz$rs_"; + fi; + erg=$(tar zcf $1.tar.gz $1 $2); + if [ -f "$1.tar.gz" ];then + echo -e "$p_n$txt_done$rs_"; + if [ -f "$adir/$1.tar.gz" ];then + rm -rf "$adir/$1.tar.gz"; + mv -f "$1.tar.gz" "$adir"; + echo -e "$c_l"" MOVE -------> $p_l$1.tar.gz $g_l$txt_to $y_n$workdir/archive\n$rs_"; + else + mv -f "$1.tar.gz" "$adir"; + echo -e "$c_l"" MOVE -------> $p_l$1.tar.gz $g_l$txt_to $y_n$workdir/archive\n$rs_"; + fi; + else + echo -e "$r_l\nerror\n no $1.tar.gz\n created$rs_"; + fi; +}; +tarsvn(){ + cd "$workdir"; + if [ -f "$svndir/config.sh" ];then + cat "$svndir/config.sh" >"$configdir/config.sh.master"; + [ -f "$svndir/Makefile" ]&& cat "$svndir/Makefile" >"$configdir/Makefile.master"; + echo -en "$w_l SVN Backup :$c_l "; + tar -zcf "$bsvn/$("$svndir/config.sh" -r).tar.gz" oscam-svn; + fi; + cd "$bsvn"; + ln -sf "$bsvn/$("$svndir/config.sh" -r).tar.gz" "last.tar.gz"; + echo -e "done\n$re_"; +}; +untarsvn(){ + cd "$workdir"; + [ -d oscam-svn ] && rm -rf oscam-svn; + if [ -z "$1" ];then + [ -f "$bsvn/last.tar.gz" ] && tar -xf "$bsvn/last.tar.gz"; + else + if [ -f "$bsvn/$1.tar.gz" ];then + tar -xf "$bsvn/$1.tar.gz"; + cd $bsvn; + ln -sf "$bsvn/$("$svndir/config.sh" -r).tar.gz" "last.tar.gz"; + else + if [ -f "$bsvn/last.tar.gz" ];then + tar -xf "$bsvn/last.tar.gz"; + else + echo -en "$w_l SVN Backup :$r_l $txt_not_found"; + sleep 3; + checkout; + fi; + fi; + fi; + [ -f "$workdir/SVN-IS-PATCHED" ] && rm -f "$workdir/SVN-IS-PATCHED"; +}; \ No newline at end of file diff --git a/support/functions/_gui_build b/support/functions/_gui_build new file mode 100644 index 0000000..51cca4b --- /dev/null +++ b/support/functions/_gui_build @@ -0,0 +1,117 @@ +#!/bin/bash + +_gui_build(){ + +#init + oc_size=${#_oscamconfdir_custom}; + [ "$oc_size" -gt "4" ] && _oscamconfdir_default="$_oscamconfdir_custom"; + + if [ "$_toolchainname" == "native" ];then + log_name="$(date +%F).$(date +%X).$(hostname).log"; + else + log_name="$(date +%F).$(date +%X).$_toolchainname.log"; + fi; + + ologo >"$ldir/$log_name"; + [ -f "$configdir/max_cpus" ] && cpus="$(cat "$configdir/max_cpus")" || cpus="$(CPUS)"; + CROSS="$tcdir/$_toolchainname/bin/$_compiler"; + [ -f "$configdir/compiler_option" ] && co=$(cat "$configdir/compiler_option") || co="-O2"; + +#make clean + cd "$svndir"; + make distclean > /dev/null 2>&1; + USESTRING_=''; + +#do use_vars + for e2 in $USESTRING;do + [ "USE_$e2" == "USE_PATCH" ] && _apply_menupatch;is_blocked=0; + for e1 in $_block;do + if [ "$e1" == "USE_$e2" ];then + is_blocked=1; + [ "USE_$e2" == "USE_LIBUSB" ] && silent=$(./config.sh -D CARDREADER_SMARGO); + fi; + done; + [ "$is_blocked" == "0" ] && _us="USE_$e2 $_us"; + done; + + for e in $_us;do + if [ ! "$e" == "USE_TARGZ" ] && [ ! "$e" == "USE_COMPRESS" ] && [ ! "$e" == "USE_PATCH" ];then + USESTRING_="$e=1 $USESTRING_"; + fi; + done; + + if [ "${USE_vars[USE_PCSC]}" == "USE_PCSC=1" ];then + _pcsc="-pcsc" ; + else + _pcsc=; + fi; + if [ "${USE_vars[USE_LIBUSB]}" == "USE_LIBUSB=1" ];then + _usb="-libusb"; + else + _usb=; + fi; + USESTRING_=${USE_vars[@]}; + +#todo add switch for verbose + _generate_oscam_name "$_toolchainname"; + targztmp="$(mktemp)"; + if [ ! "${USE_vars[USE_TARGZ]}" == "USE_TARGZ=1" ];then + s3cfg_vars[USE_TARGZ]=0; + fi; + check_smargo; + +#build + _sz; + (ologo; _nl; + timer_start; + make -j"$cpus" \ + "CONF_DIR=$_oscamconfdir_default" "OSCAM_BIN=$bdir/$oscam_name" "CC_OPTS=$co $cc_opts" "CC_WARN=$cc_warn" "CROSS=$CROSS" $stapivar $USESTRING_ 2>&1 \ + |tee "$ldir/$log_name" \ + |grep --line-buffered -v 'BFD' \ + |grep --line-buffered '^CC\|^GEN\|UseFlags\| CONF_DIR =\|Binary\|LINK\|STRIP\|BUILD\|Addons\|Protocols\|Readers\|CardRdrs\|^/' \ + |sed -u "s/^|/ |/g;s/^LINK/ LINK >/g;s/^STRIP/ STRIP >/g;s/^CC\|^BUILD/ BUILD >/g;s/^GEN/ GEN >/g;s/WEBIF_//g;s/WITH_//g;s/MODULE_//g;s/CS_//g;s/HAVE_//g;s/_CHARSETS//g;s/CW_CYCLE_CHECK/CWCC/g;s/SUPPORT//g;" + timer_stop; + timer_calc; + +#save list_smargo + cd "$svndir/Distribution"; + lsmn="$(ls list_smargo* 2> /dev/null)"; + if [ "${s3cfg_vars[SAVE_LISTSMARGO]}" == "1" ] && [ -f "$svndir/Distribution/$lsmn" ];then + if [ "$_toolchainname" == "native" ];then + echo -e "SAVE\t$lsmn $txt_as oscam-svn$(REVISION)-$(hostname)-list_smargo"| tee -a "$ldir/$log_name"; + mv -f "$lsmn" "$bdir/oscam-svn$(REVISION)-$(hostname)-list_smargo"; + echo "oscam-svn$(REVISION)-$(hostname)-list_smargo" >"$targztmp"; + else + echo -e "SAVE\t$lsmn $txt_as oscam-svn$(REVISION)-$_toolchainname-list_smargo"|tee -a "$ldir/$log_name"; + mv -f "$lsmn" "$bdir/oscam-svn$(REVISION)-$_toolchainname-list_smargo"; + echo "oscam-svn$(REVISION)-$_toolchainname-list_smargo" >"$targztmp"; + fi; + fi; + +#show buildtime + echo -e "\n TIME\t[ $txt_buildtime $((Tcalc / 60)) min(s) $((Tcalc % 60)) secs ]"| tee -a "$ldir/$log_name";sleep 1; + +#remove debug binary + if [ "${s3cfg_vars[delete_oscamdebugbinary]}" == "1" ] && [ -f "$bdir/$oscam_name.debug" ];then + rm "$bdir/$oscam_name.debug"; + echo -e "\n $txt_delete $oscam_name.debug\n"|tee -a "$ldir/$log_name"; + fi;) | "$gui" "$st_" --colors --title " -[ Build ]- " "$pb_" "$_lines" "$_cols";sleep 2; + +#COMPRESS + if [ ! "$stapi_allowed" == "1" ];then + if [ "${s3cfg_vars[COMPRESS]}" == "1" ] || [ "${USE_vars[USE_COMPRESS]}" == "USE_COMPRESS=1" ];then + (compress_cam_gui "$oscam_name") |tee -a "$ldir/$log_name"| "$gui" "$st_" --title " -[ COMPRESS ]- " "$pb_" 7 50; + sleep 2; + fi; + fi; + +#tar + if [ "${USE_vars[USE_TARGZ]}" == "USE_TARGZ=1" ];then + (tar_cam_gui "$oscam_name" "$(cat "$targztmp")") |tee -a "$ldir/$log_name"| "$gui" "$st_" --title " -[ TAR Binary ]- " "$pb_" 10 70; + sleep 2; + fi; + +#link log + ln -sf "$ldir/$log_name" "$workdir/lastbuild.log"; + [ -f "$targztmp" ] && rm -rf "$targztmp"; +}; \ No newline at end of file diff --git a/support/functions/_help b/support/functions/_help new file mode 100644 index 0000000..b544092 --- /dev/null +++ b/support/functions/_help @@ -0,0 +1,55 @@ +#!/bin/bash + +_help_toolchain(){ + echo -e "$w_l toolchains :\n ------------$g_n"; + helpline1 "${AVAI_TCLIST[@]}"; + echo -e "\n"; +}; +helpline0(){ + ll=0; + echo -en " "; + for s in "$@";do + ll=$((ll + (${#s} + 4))); + if [ "$ll" -lt "30" ];then + echo -en "$s(_off) "; + else + echo -en "$s(_off)\n "; + ll=""; + fi; + done; +}; +helpline1(){ + ll=0; + echo -en " "; + for s in "$@";do + ll=$((ll + (${#s} + 4))); + if [ "$ll" -lt "45" ];then + echo -en "$s " ; + else + echo -en "$s\n " ; + ll=""; + fi; + done; +}; +_help(){ clear;s3logo; +echo -e " ----------------------------------"; +echo -e " $txt_help1 $0 menu"; +echo -e " $txt_help2"; +echo -e " ----------------------------------"; +echo -e "$w_l\n toolchains :\n ------------$g_n"; +helpline1 "${AVAI_TCLIST[@]}"; +echo -e "$w_l\n simplebuild options :\n ---------------------$c_n"; +helpline1 "${s3opts[@]}";_wait; +echo -e "$w_l config_cases:\n --------$c_n"; +helpline0 "${config_cases[@]}"; +echo -e "$w_l\n\n addons :\n --------$p_l"; +helpline0 "${SHORT_ADDONS[@]}";_wait; +echo -e "$w_l protocols :\n -----------$y_l"; +helpline0 "${SHORT_PROTOCOLS[@]}"; +echo -e "$w_l\n readers :\n ---------$r_l"; +helpline0 "${SHORT_READERS[@]}";_wait; +echo -e "$w_l card_readers :\n --------------$b_l"; +helpline0 "${SHORT_CARD_READERS[@]}"; +echo -e "$w_l\n use_vars :\n --------$w_n"; +helpline0 "${!USE_vars[@]}";_wait; +}; \ No newline at end of file diff --git a/support/functions/_logos b/support/functions/_logos new file mode 100644 index 0000000..58c1dfb --- /dev/null +++ b/support/functions/_logos @@ -0,0 +1,29 @@ +#!/bin/bash + +ologo(){ + echo -en "$w_h"; + printf " %-s\n" " ___ ____ ___" " / _ \\/ ___| / __|__ _ _ __ ___" "| | | \\___ \\| | / _\` | '_ \` _ \ " "| |_| |___) | |_| (_| | | | | | |" " \\___/|____/ \\___\\__,_|_| |_| |_|" " "; +}; +slogo(){ + echo -en "$w_h"; + printf " %-s\n" " _ _ _ " " ___| |_ _ __ ___ __ _ _ __ ___ | |__ ___ __ _ _ __ __| |" "/ __| __| '__/ _ \/ _\` | '_ \` _ \| '_ \ / _ \ / _\` | '__/ _\` |" "\__ \ |_| | | __/ (_| | | | | | | |_) | (_) | (_| | | | (_| |" "|___/\__|_| \___|\__,_|_| |_| |_|_.__/ \___/ \__,_|_| \__,_|" " "; +}; +bye(){ + clear; + echo -en "$re_$w_l"; + printf "\n\t\t simplebuild made for"; + echo -e "$c_l"; + slogo; + echo -e "\e[8;50H \e[8;50f" && echo -en "$g_l\t\t\t\t\t\t by gorgone $re_"; + echo -e "\n"; + exit; +}; +s3logo(){ +echo -e $C" + _________________ + / _____/\\_____ \\ =============== + \_____ \\ _(__ < $w_l Version $SIMPLEVERSION$C + / \\ / \\ =============== + /_______ //______ / $y_l by gorgone$p_l 2019$C + \\/ \/ ===============\n$W"; +}; \ No newline at end of file diff --git a/support/functions/_misc b/support/functions/_misc new file mode 100644 index 0000000..6d54602 --- /dev/null +++ b/support/functions/_misc @@ -0,0 +1,547 @@ +#!/bin/bash + +CPUS(){ nproc;}; +clean(){ _clean;}; +_nl(){ echo -e "$rs_";}; +_set_dialog_types(){ + gui="$(which dialog)"; + st_="--stdout"; + ib_="--infobox"; + ip_="--inputbox"; + nc_="--no-cancel"; + cl_="--checklist"; + rl_="--radiolist"; + bt_="--backtitle"; + pb_="--progressbox"; + title_="SIMPLEBUILD_V($SIMPLEVERSION)";}; +cedit(){ s3cfg_menu;bye;}; +counter(){ COUNT="$((COUNT+1))";}; +timer_calc(){ Tcalc="$((Te-Ts))";}; +timer_stop(){ Te="$(date +%s)";}; +timer_start(){ Ts="$(date +%s)";}; +decode(){ echo -en "$1" | base64 -d;}; +get_module_name(){ echo "${INTERNAL_MODULES[$1]}";}; +_fix_config_h(){ _=0; +#_pcsc_off;_stapi5_off; +}; +_wait(){ echo -e "$w_l";read -n1 -r -p " $txt_help3" key;tput cuu1;echo ' ';} +_systype(){ systype="bad";case "$(uname -m)" in x86|x86_64|amd64|i686) systype="ok";;esac;}; +_pcsc_on(){ sed -i 's@^//#define CARDREADER_PCSC 1@#define CARDREADER_PCSC 1@g' "$svndir/config.h";}; +_pcsc_off(){ sed -i 's@^#define CARDREADER_PCSC 1@//#define CARDREADER_PCSC 1@g' "$svndir/config.h";}; +_stapi5_on(){ sed -i 's@^//#define CARDREADER_STAPI5 1@#define CARDREADER_STAPI5 1@g' "$svndir/config.h";}; +_stapi5_off(){ sed -i 's@^#define CARDREADER_STAPI5 1@//#define CARDREADER_STAPI5 1@g' "$svndir/config.h";}; +_generate_oscam_name(){ cd "$svndir";_dvbapi=$( +[ "$(./config.sh --enabled HAVE_DVBAPI)" == Y ] && echo -n -dvbapi || echo ''; );_webif=$( +[ "$(./config.sh --enabled WEBIF)" == Y ] && echo -n -webif || echo ''; );_ssl=$( +[ "$(./config.sh --enabled WITH_SSL)" == Y ] && echo -n -ssl || echo ''; );_emu=$( +[ "$(./config.sh --enabled WITH_EMU)" == Y ] && echo -n -emu || echo ''; );_ipv6=$( +[ "$(./config.sh --enabled IPV6SUPPORT)" == Y ] && echo -n -ipv6 || echo ''; ); +[ "${USE_vars[USE_COMPRESS]}" == "USE_COMPRESS=1" ] && _upx="-upx" || _upx=''; +[ "$1" == "native" ] && _b_name="$(hostname)$_upx" || _b_name="$1"; +oscam_name="oscam-svn$(REVISION)-$_b_name$_webif$_dvbapi$_ssl$_usb$_pcsc$_stapi$_stapi5$_emu$_ipv6$_upx";}; +e_readers(){ silent=$("$svndir/config.sh" -s readers);echo ${silent//READER_/};}; +e_protocols() { silent=$("$svndir/config.sh" -s protocols);echo ${silent//MODULE_/};}; +e_card_readers(){ silent=$("$svndir/config.sh" -s card_readers);echo ${silent//CARDREADER_/};}; +e_addons(){ "$svndir/config.sh" -s addons |sed 's/WEBIF_//g;s/WITH_//g;s/MODULE_//g;s/CS_//g;s/HAVE_//g;s/_CHARSETS//g;s/CW_CYCLE_CHECK/CWCC/g;s/SUPPORT//g';}; +sysinfo(){ + echo -e "$g_l\nSYSTEM$w_l"; + system_info=$(which lsb_release); + [ ${#system_info} -ge 11 ] && lsb_release -irc; + echo -e "Uptime:\t\t$(uptime -p)"; + echo -e "$g_l\nMEMORY$w_l"; + free -mht | awk '/Mem/{print "Memory:\t\tTotal: " $2 "Mb\tUsed: " $3 "Mb\tFree: " $4 "Mb"} /Swap/{print "Swap:\t\tTotal: " $2 "Mb\tUsed: " $3 "Mb\tFree: " $4 "Mb" }'; + [ -f /sys/dev/block ] && lsblk; + echo -e "$g_l\n CPU$w_l"; + cpu_info=$(which lscpu); + [ ${#cpu_info} -ge 5 ] && lscpu | grep -iE 'model name|vendor id|Architecture|per socket|MHz'; + echo -e "$g_l\nNetwork"; + echo -e "$w_l""Hostname:\t$HOSTNAME"; + ip -o addr | awk '/inet /{print "IP (" $2 "):\t" $4}'; + route -n | awk '/^0.0.0.0/{ printf "Gateway:\t"$2"\n" }'; + awk '/^nameserver/{ printf "Name Server:\t" $2 "\n"}' /etc/resolv.conf; + echo -e "$re_"; + exit; +}; +_pget(){ + tc_dl="$dldir/$(decode "$_t1e""$_toolchainfilename")"; + [ -f "$tc_dl" ] && rm -rf "$tc_dl"; + #tput civis; + cd "$dldir"; + zeile=$(expr 12+$zzusatz); + spalte=$(expr 17+$szusatz); + wget -N --progress=dot "$(decode "$_u1e")/$dln" 2>&1 |grep --line-buffered "%"|awk '{ printf "\033["'$zeile'";"'$spalte'"H\033[K%-4s ", $7;} {printf "'"$txt_wait >"'";} {printf " %-6s",$9;}'; + echo -e "\033["$zeile";"$spalte"H\033[K100% done... "$W; + #tput cnorm; +}; +_clean(){ + [ -L "$workdir/lastbuild.log" ] && rm -rf "$workdir/lastbuild.log"; + [ -L "$workdir/lastpatch.log" ] && rm -rf "$workdir/lastpatch.log"; + clear; + echo -e "$w_l"; + ologo; + for e in "$menudir" "$bdir" "$ldir" "$tcdir";do + echo -e " $r_l$txt_delete$w_l\t$e"| sed "s@$workdir@@g"; + done; + rm -rf "$menudir" "$bdir" "$ldir" "$tcdir" 2>/dev/null; + for e in "$menudir" "$bdir" "$ldir" "$tcdir";do + echo -e " $g_l$txt_create$w_l\t$e"| sed "s@$workdir@@g"; + done; + mkdir -p "$menudir" "$bdir" "$ldir" "$tcdir" 2>/dev/null; + sleep 2; + svnrestore; + _nl; +}; +_sz(){ + lmin=24; + lmax=40; + _lin=$(tput lines); + cmin=79; + cmax=200; + _col=$(tput cols); + if [ "$_lin" -gt "$lmin" ];then + if [ "$_lin" -lt "$lmax" ] || [ "$_lin" -eq "$lmax" ];then + _lines="$((_lin-6))"; + fi; + if [ "$_lin" -gt "$lmax" ];then + _lines="$((lmax-6))"; + fi; + fi; + if [ "$_col" -gt "$cmin" ];then + if [ "$_col" -lt "$cmax" ] || [ "$_col" -eq "$cmax" ];then + _cols="$((_col-6))"; + fi; + if [ "$_col" -gt "$cmax" ];then + _cols="$((cmax-6))"; + fi; + fi; +}; +save_master(){ + [ -f "$svndir/config.sh" ] && cat "$svndir/config.sh" >"$configdir/config.sh.master"; + [ -f "$svndir/Makefile" ] && cat "$svndir/Makefile" >"$configdir/Makefile.master"; +}; +_pre_build(){ + _oscamconfdir_default=""; + _oscamconfdir_custom=""; + source "$tccfgdir/$1"; + clear; + _nl; + echo $WH; + ologo; + _tcfile=""; + dln="$(decode "$_t1e")$(decode "$_toolchainfilename")"; + tc_dl="$dldir/$dln"; + if [ -f "$tcdir/$_toolchainname/bin/$_compiler""gcc" ];then + if [ "$run" == "0" ];then + echo -e "$w_l toolchain :$y_l $_toolchainname"; + echo -e "$w_l status :$g_l compiler $txt_found "; + echo -e "$w_l compiler :$p_l $_compiler""gcc"; + else + echo -e "$w_l toolchain :$y_l $_toolchainname "; + echo -e "$w_l recheck :$g_l ok $txt_now compiler $txt_found"; + echo -e "$w_l compiler :$p_l $_compiler""gcc "; + fi; + else + [ "$run" == "1" ] && echo "$txt_error : build not possible" && exit; + _nl; + echo -e "$w_l toolchain :$y_l $_toolchainname "; + echo -e "$w_l status :$r_l compiler $txt_not_found"; + echo -en "$w_l backupcheck : "; + if [ -f "$dldir/$dln" ];then + echo -e "$g_l$dln $txt_found"; + echo -en "$w_l $txt_extracting :$y_l $txt_wait"; + _console_extract_toolchain; + run=1; + else + echo -e "$r_l$dln $txt_not_found "; + echo -en "$w_l $txt_loading :$g_l"; + zzusatz=1;szusatz=1; + _pget; + _nl; + echo -en "$w_l $txt_extracting :$y_l $txt_wait"; + _console_extract_toolchain 1; + run=1; + fi; + _pre_build "$1"; + fi; + _cmd_build "$_toolchainname"; +}; +_init_menu(){ IFS="#";COUNT=0;MENU_OPTIONS="BACK#$txt_back#";counter;}; +_select_menu(){ + revision_="$(REVISION)"; + _menutext="Simplebuild V$SIMPLEVERSION by Gorgone"; + smenu=$( + "$gui" "$st_" "$bt_" "$title_" "$nc_" --title "-[ $txt_start_menu ]-" --menu "\n $_menutext" 13 55 7 "Continue" "$txt_firstmenu_continue r$revision_" "CHANGE" "$txt_firstmenu_chose" "CEDIT" "$txt_firstmenu_cedit" "LANG" "$txt_firstmenu_lang" "EXIT" "$txt_firstmenu_exit"); + [ $? = 255 ] && _select_menu; + case $smenu in + Continue) + if [ ! -f "$svndir/config.sh" ];then + "$gui" "$st_" "$bt_" "$title_" --infobox "\n $txt_no oscam-svn $txt_found" 5 35; + sleep 2; + _select_menu; + else + _toolchain_main_menu; + fi;; + CHANGE) + new_rev=$("$gui" "$st_" "$nc_" --cr-wrap "$ip_" "Revision: 7000+ \nRevision: 0 = $txt_latest" 9 35); + [[ $new_rev =~ ^-?[0-9]+$ ]] && [ ! "$new_rev" -le "7000" ] && _rev="$new_rev" || _rev=0; + _dialog_checkout1 "$_rev"; + _select_menu;; + CEDIT) + s3cfg_menu; + _select_menu;; + LANG) + lang_select; + cd "$workdir"; + ./s3 menu;; + EXIT) + bye;; + esac; + exit; +}; +_oscam_extra_menu(){ + uv=; + check_smargo; + unset MENU_OPTIONS; + for e in "${!USE_vars[@]}";do + if [ ! "$e" == "USE_TARGZ" ] && [ ! "$e" == "USE_COMPRESS" ] && [ ! "$e" == "USE_PATCH" ] && [ ! "$e" == "USE_LIBUSB" ];then + if [ "${#USE_vars[$e]}" -gt "4" ];then + MENU_OPTIONS+=( "$e" "$e" on ); + else + MENU_OPTIONS+=( "$e" "$e" off ); + fi; + fi; + done; + oextra=$("$gui" "$st_" "$nc_" "$bt_" "$title_" --title "-[ Oscam EXTRA ]-" "$cl_" " OPTIONS " 19 40 12 ${MENU_OPTIONS[@]}); + [ $? = 255 ] && _toolchain_extra_menu; + for e in "${!USE_vars[@]}";do + if [ ! "$e" == "USE_TARGZ" ] && [ ! "$e" == "USE_COMPRESS" ] && [ ! "$e" == "USE_PATCH" ] && [ ! "$e" == "USE_LIBUSB" ];then + ok=0; + for oex in $oextra;do + o=$(echo "$oex" | tr -d '"'); + [ "$e" == "$o" ] && ok=1; + done; + if [ "$ok" == "1" ];then + USE_vars[$e]="$e=1"; + else + USE_vars[$e]=; + fi; + fi; + done; + [ "${USE_vars[USE_PCSC]}" == "USE_PCSC=1" ] && _pcsc_on; + [ ! "${USE_vars[USE_PCSC]}" == "USE_PCSC=1" ] && _pcsc_off; + save_config; + _toolchain_config_menu; +}; +_build_extra_menu(){ + us=; + check_smargo; + unset MENU_OPTIONS; + for e in USE_COMPRESS USE_TARGZ USE_PATCH;do + [ "${#USE_vars[$e]}" -gt "4" ] && MENU_OPTIONS+=( "$e" "$e=1" on ) || MENU_OPTIONS+=( "$e" "$e=1" off ); + done; + bextra=$("$gui" "$st_" "$nc_" "$bt_" "$title_" --title "-[ Build EXTRA ]-" "$cl_" " OPTIONS " 10 40 3 ${MENU_OPTIONS[@]}); + [ $? = 255 ] && _build_extra_menu; + USE_vars[USE_COMPRESS]=; + USE_vars[USE_PATCH]=; + USE_vars[USE_TARGZ]=; + for bex in $bextra;do + b=$(echo "$bex" | tr -d '"'); + USE_vars[$b]="$b=1"; + done; + save_config; + _toolchain_config_menu; +}; +_pre_main_menu(){ + IFS="#"; + COUNT=0; + MENU_OPTIONS="EXIT#$txt_menu_builder1#"; + counter; + MENU_OPTIONS=${MENU_OPTIONS}"ADD#$txt_menu_builder2#"; + counter; + if [ "$tcempty" == "0" ];then + MENU_OPTIONS="${MENU_OPTIONS}REMOVE#$txt_menu_builder3#"; + counter; + fi; + MENU_OPTIONS="${MENU_OPTIONS}NATIVE#$txt_menu_builder4$native#"; + counter; + _a=$(uname -m); + if [ "$systype" == "ok" ];then + if [ "$tcempty" == "0" ];then + for i in "${INST_TCLIST[@]}";do + source "$tccfgdir/$i"; + MENU_OPTIONS="${MENU_OPTIONS}$_toolchainname#$_description#"; + counter; + done; + fi; + fi; + out=$("$gui" --help-button --help-label INFO --title "-[ Toolchain Menu V$SIMPLEVERSION ]-" --menu "$txt_t_menu1$REVISION" "${COUNT+8}" 75 0 "${MENU_OPTIONS}"); + IFS=$OIFS; + first=$(echo "$out" | awk '{printf $1}'); + tc_info=$(echo "$out" | awk '{printf $2}'); + if [ "$first" == "HELP" ];then + if [ -f "$tccfgdir/$(echo "$out" | awk '{printf $2}')" ];then + source "$tccfgdir/$tc_info"; + echo -e "\n\n\tinfobox $_tc_info"; + sleep 4; + fi; + fi; + if [ "$first" == "EXIT" ];then + bye; + else + toolchain_main_menu; + fi; +}; +tedit(){ + clear; + if [ -f "$tccfgdir/$1" ];then + source "$tccfgdir/$1"; + echo -e $y_l; + slogo; + echo -e " $p_l change CONF_DIR for $c_l$_toolchainname$w_l\n"; + echo -e $w_l" current =$c_l $_oscamconfdir_custom"; + echo -e $w_l" default =$c_l $_oscamconfdir_default"; + echo -en $w_l" Enter new =$w_l ";read name; + echo -e " now =$y_l CONF_DIR=$name\n$re_"; + sed -i s@^_oscamconfdir_custom.*@_oscamconfdir_custom=\"$name\"@ "$tccfgdir/$_toolchainname"; + fi; +}; +_gtedit(){ + if [ -f "$tccfgdir/$_toolchainname" ];then + source "$tccfgdir/$_toolchainname"; + input=$("$gui" "$st_" "$bt_" "$title_" --title " -[ $1 Toolchain ]- " --inputbox "\n CONF_DIR=$_oscamconfdir_default 'default'\n [ESC] = default\n" 0 0 "$_oscamconfdir_custom"); + retval=$?; + case $retval in + 0) + confdir="$input";; + 1) + confdir="$_oscamconfdir_custom";; + 255) + confdir="$_oscamconfdir_default";; + esac; + sed -i s@^_oscamconfdir_custom.*@_oscamconfdir_custom=\"$confdir\"@ "$tccfgdir/$_toolchainname"; + source "$tccfgdir/$_toolchainname"; + fi; +}; +check_smargo(){ + if [ -f "$svndir/config.sh" ];then + if [ "$("$svndir/config.sh" -e CARDREADER_SMARGO)" == "Y" ];then + USE_vars[USE_LIBUSB]="USE_LIBUSB=1"; + else + USE_vars[USE_LIBUSB]=; + fi; + fi; +}; +_reset_config(){ + if [ -f "$svndir/config.sh" ];then + [ -f "$menudir/$_toolchainname.save" ] && rm -rf "$menudir/$_toolchainname.save"; + if [ ! -f "$workdir/SVN-IS-PATCHED" ];then + reset_="$("$svndir/config.sh" -R)"; + fi; + else + _select_menu; + fi; +}; +_get_config_menu(){ + tmp="$(mktemp)"; + while read -r _l;do + c=$(echo "$_l" | tr -cd \" | wc -c); + _c=$((_c + c)); + [ ${_c} -lt 11 ] && echo "$_l" >>"$tmp"; + [ ${_c} -eq 10 ] && break; + done <"$svndir/config.sh"; + mk="$(grep '^ USE_' "$workdir/oscam-svn/Makefile" |sort -u|awk '{print $1}')"; + for e in $mk;do + USE_vars[${e:0:-2}]=; + done; + check_smargo; + source "$tmp"; + rm -rf "$tmp"; +}; +read_s3cfg(){ + if [ -f "$s3cfg" ];then + while read l;do + s3cfg_vars[$(echo "$l"| awk -F'=' '{print $1}')]=$(echo "$l"| awk -F'=' '{print $2}'); + done < "$s3cfg"; + fi; +}; +s3cfg_menu(){ + unset CFG_MENU; + declare -a CFG_MENU; + old_IFS=$IFS; + COUNT=0; + found=""; + for e in "${!s3cfg_vars[@]}";do + CFG_MENU+="$e#on/off#$([ "${s3cfg_vars[$e]}" -gt "0" ] && echo on || echo off)#"; + counter; + done; + IFS="#"; + erg=$("$gui" "$st_" "$bt_" "$title_" "$cl_" "enable/disable options" 16 45 10 ${CFG_MENU[@]}); + IFS=$old_IFS; + for e1 in "${!s3cfg_vars[@]}";do + for e2 in $erg;do + found="0"; + if [ "$e1" == "${e2//\'}" ];then + found="1"; + break; + fi; + done; + if [ "$found" == "1" ];then + s3cfg_vars[$e1]=1; + else + s3cfg_vars[$e1]=0; + fi; + done; + write_s3cfg; +}; +write_s3cfg(){ + [ -f "$s3cfg" ] && rm -rf "$s3cfg"; + for e in "${!s3cfg_vars[@]}";do + echo "$e=${s3cfg_vars[${e}]}" >>"$s3cfg"; + done; +}; +_stapi_select(){ + if [ "$stapi_allowed" == "1" ];then + stapivar=''; + addstapi=; + USESTRING=; + stapimode=$($gui $rl_ " SELECT STAPI MODE" 12 0 5 0 "STAPI_OFF" on 1 "USE_STAPI" off 2 "USE_STAPI5 UFS916" off 3 "USE_STAPI5 UFS916003" off 4 "USE_STAPI5 OPENBOX" off 3>&1 1>&2 2>&3); + usevars=$(echo $usevars | sed "s@USE_STAPI5@@" | xargs); + usevars=$(echo $usevars | sed "s@USE_STAPI@@" | xargs); + case $stapimode in + 0) + stapivar=;; + 1) + stapivar="STAPI_LIB=$sdir/stapi/liboscam_stapi.a"; + addstapi="USE_STAPI";; + 2) + stapivar="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_UFS916.a"; + addstapi="USE_STAPI5";; + 3) + stapivar="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_UFS916_0.03.a"; + addstapi="USE_STAPI5";; + 4) + stapivar="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_OPENBOX.a"; + addstapi="USE_STAPI5";; + esac; + save_config; + else + "$gui" "$st_" --title "STAPI INFO" --msgbox "NOT for $_toolchainname" 0 0; + _toolchain_config_menu; + fi; +}; + +save_config(){ + usevars=; + enabled=; + disabled=; + check_smargo; + enabled=($("$svndir/config.sh" -s)); + disabled=($("$svndir/config.sh" -Z)); + [ "$_toolchainname" == "sh4" ] && unset USE_vars[USE_COMPRESS]; + [ "$_toolchainname" == "sh_4" ] && unset USE_vars[USE_COMPRESS]; + unset USE_vars[USE_STAPI]; + unset USE_vars[USE_STAPI5]; + for e in ${USE_vars[*]};do + usevars="${e:0:-2} $usevars"; + done; + [ -f "$menudir/$_toolchainname.save" ] && rm -rf "$menudir/$_toolchainname.save"; + echo "enabled=\"${enabled[*]}\"" >"$menudir/$_toolchainname.save"; + echo "disabled=\"${disabled[*]}\"">>"$menudir/$_toolchainname.save"; + if [ "$stapi_allowed" == "1" ];then + if [ "${#stapivar}" -gt "15" ];then + echo "stapivar=\"$stapivar\"">>"$menudir/$_toolchainname.save"; + echo "usevars=\"$usevars $addstapi\"" >>"$menudir/$_toolchainname.save"; + else + echo "usevars=\"$usevars\"" >>"$menudir/$_toolchainname.save"; + fi; + else + echo "usevars=\"$usevars\"" >>"$menudir/$_toolchainname.save"; + fi; +}; + +load_config(){ + _stapi=; + _stapi5=; + enabled=; + disabled=; + stapivar=""; + USESTRING=; + usevars=; + unset USE_vars[USE_STAPI]; + unset USE_vars[USE_STAPI5]; + if [ -f "$menudir/$_toolchainname.save" ];then + source "$menudir/$_toolchainname.save"; + ena=$("$svndir/config.sh" -E $enabled); + dis=$("$svndir/config.sh" -D $disabled); + for e in $usevars;do + USE_vars[$e]="$e=1"; + [ "$e" == "USE_LIBUSB" ] && silent=$("$svndir/config.sh" --enable CARDREADER_SMARGO); + [ "$e" == "USE_PCSC" ] && sed -i 's@^//#define CARDREADER_PCSC 1@#define CARDREADER_PCSC 1@g' "$svndir/config.h"; + done; + else + _reset_config; + [ "${s3cfg_vars[USE_TARGZ]}" == "1" ] && USE_vars[USE_TARGZ]="USE_TARGZ=1"; + [ "${s3cfg_vars[USE_COMPRESS]}" == "1" ] && USE_vars[USE_COMPRESS]="USE_COMPRESS=1"; + for e in $default_use;do + USE_vars[$e]="$e=1"; + done; + fi; + check_smargo; + [ "$_toolchainname" == "sh4" ] && unset USE_vars[USE_COMPRESS]; + [ "$_toolchainname" == "sh_4" ] && unset USE_vars[USE_COMPRESS]; + USESTRING="$(echo "${USE_vars[@]}"| sed 's@USE_@@g'| sed 's@=1@@g'| tr -s ' ')"; +}; +_get_config_con(){ + if [ ! "$1" == "checkout" ] && [ ! "$1" == "clean" ];then + tmp="$(mktemp)"; + if [ -f "$svndir/config.sh" ];then + while read -r _l;do + c=$(echo "$_l" | tr -cd \" | wc -c); + _c=$((_c + c)); + [ ${_c} -lt 11 ] && echo "$_l" >>"$tmp"; + [ ${_c} -eq 10 ] && break; + done <"$svndir/config.sh"; + else + while read -r _l;do + c=$(echo "$_l" | tr -cd \" | wc -c); + _c=$((_c + c)); + [ ${_c} -lt 11 ] && echo "$_l" >>"$tmp"; + [ ${_c} -eq 10 ] && break; + done <"$configdir/config.sh.master"; + fi; + if [ -f "$workdir/oscam-svn/Makefile" ];then + str_="$(grep '^ USE_' "$workdir/oscam-svn/Makefile"| sort -u| awk '{print $1}')"; + for e in $str_;do + es="${e:0:-2}"; + USE_vars[$es]=; + done; + else + str_="$(grep '^ USE_' "$configdir/Makefile.master"| sort -u| awk '{print $1}')"; + for e in $str_;do + es="${e:0:-2}"; + USE_vars[$es]=; + done; + fi; + check_smargo; + source "$tmp"; + rm -rf "$tmp" "$tmp1"; + rm -rf "$tmp.load" "$tmp1.load"; + fi; +}; +_gtedit(){ + if [ -f "$tccfgdir/$_toolchainname" ];then + source "$tccfgdir/$_toolchainname"; + input=$("$gui" "$st_" "$bt_" "$title_" --title " -[ $1 Toolchain ]- " --inputbox "\n CONF_DIR=$_oscamconfdir_default 'default'\n [ESC] = default\n" 0 0 "$_oscamconfdir_custom"); + retval=$?; + case $retval in + 0) + confdir="$input";; + 1) + confdir="$_oscamconfdir_custom";; + 255) + confdir="$_oscamconfdir_default";; + esac; + sed -i s@^_oscamconfdir_custom.*@_oscamconfdir_custom=\"$confdir\"@ "$tccfgdir/$_toolchainname"; + source "$tccfgdir/$_toolchainname"; + fi; +}; \ No newline at end of file diff --git a/support/functions/_patch b/support/functions/_patch new file mode 100644 index 0000000..b7fe45f --- /dev/null +++ b/support/functions/_patch @@ -0,0 +1,102 @@ +#!/bin/bash + +get_patch(){ _get_patch; }; +_get_patch(){ + cd $pdir; + [ -f patch.url ] && source patch.url; + clear; + echo -e $C; + ologo; + echo -e $WH; + [ -f $PATCHNAME ] && echo -e "$Y old patch found\n remove $P$PATCHNAME" && rm -f $PATCHNAME; + echo -e $W" load $PATCHNAME"; + wget -q -O$PATCHNAME $PATCHURL; + [ -f $PATCHNAME ] && echo -e $G" ok$W new $PATCHNAME loadet\n" || echo -e $R" patch not found\n"$W; +}; +_apply_menupatch(){ + cd "$pdir"; + pf=(*); + if [ ${#pf[@]} -gt 1 ];then + [ -f "$workdir/SVN-IS-PATCHED" ] && quicksvnrestore $_toolchainname 2>/dev/null; + if [ ! -f "$workdir/SVN-IS-PATCHED" ];then + (if [ "$(ls -A "$pdir"/*.patch 2>/dev/null)" ];then + cd "$pdir"; + unset patchlist;patchlist=`ls *.patch | sort -st '/' -k1,1`; + for e in ${patchlist[@]};do + _w="ok"; + cd "$svndir"; + patchlog="$(mktemp)"; + echo "PATCH : apply $e"; + patch -f -p0 < "$pdir/$e" >>"$patchlog" 2>/dev/null; + hunks=$(grep -c1 '^Hunk' "$patchlog"); + fails=$(grep -c1 'hunks FAILED' "$patchlog"); + if [ "$hunks" -gt "0" ];then + echo "PATCH : $hunks x HUNK for $e"; + _w="hunk"; + fi; + if [ "$fails" -gt "0" ];then + echo "PATCH : $fails x FAILS for $e"; + _w="fail"; + fi; + done; + case $_w in + ok) + echo "PATCH : done all ok"; + touch "$workdir/SVN-IS-PATCHED";; + hunk) + echo "PATCH : done with warnings save $e.log"; + cat $patchlog >>"$ldir/$e.log"; + ln -sf "$ldir/$e.log" "$workdir/lastpatch.log"; + touch "$workdir/SVN-IS-PATCHED";; + fail) + echo "PATCH : break build save $e.log"; + cat $patchlog >>"$ldir/$e.log"; + ln -sf "$ldir/$e.log" "$workdir/lastpatch.log"; + touch "$workdir/SVN-IS-PATCHED";; + esac; + rm -rf "$patchlog"; + fi;)|"$gui" "$st_" "$bt_" "$title_" "$pb_" 12 62;sleep 2; + fi; + fi; +}; +_apply_consolepatch(){ + if [ ! -f "$workdir/SVN-IS-PATCHED" ];then + cd "$pdir"; + if [ "$(ls -1 "$pdir"/*.patch 2>/dev/null | wc -l)" -gt "0" ];then + unset patchlist;patchlist=`ls *.patch | sort -st '/' -k1,1`; + for e in ${patchlist[@]};do + _w=0;cd "$svndir"; + patchlog="$(mktemp)"; + echo -e "$y_l| PATCH : apply $e"; + patch -F 10 -f -p0 < "$pdir/$e" >>"$patchlog" 2>/dev/null; + hunks=$(grep -c1 "^Hunk" "$patchlog"); + fails=$(grep -c1 "hunks FAILED" "$patchlog"); + if [ "$hunks" -gt "0" ];then + echo -e "$y_l| PATCH :$w_l $hunks x HUNK for $e"; + _w=1; + fi; + if [ "$fails" -gt "0" ];then + echo -e "$y_l| PATCH :$r_n FAIL (breaking Build) = $fails"; + echo -en "$w_l| RESTORE :$c_w LAST SVN BACKUP in "; + for (( i=6; i>0; i--));do + sleep 1 & echo -en "$i\b"; + wait; + done; + svnrestore lastsvn; + exit; + fi; + cat $patchlog >"$ldir/$e.log"; + ln -sf "$ldir/$e.log" "$workdir/lastpatch.log"; + rm -rf "$patchlog"; + done; + if [ "$_w" -gt "0" ];then echo -e "$y_l| PATCH : done with warnings"; + touch "$workdir/SVN-IS-PATCHED"; + else + echo -e "$y_l| PATCH :$g_l done all ok$rs_"; + touch "$workdir/SVN-IS-PATCHED"; + fi; + else + echo -en "$y_l| PATCH : no patch found\n"; + fi; + fi; +}; \ No newline at end of file diff --git a/support/functions/_profiles b/support/functions/_profiles new file mode 100644 index 0000000..9431d7e --- /dev/null +++ b/support/functions/_profiles @@ -0,0 +1,104 @@ +#!/bin/bash + +profiles(){ + _list_profiles; + exit; +}; +_list_profiles(){ + cd "$profdir"; + profiles=(*.profile); + if [ ${#profiles[@]} -gt 0 ];then + echo -e "$c_l"; + clear; + slogo; + echo -e "$y_l\n $txt_profiles $txt_found $txt_for ( ./$(basename "$0") \"tcname\" -p=name.profile )"; + echo -e "$w_l ======================================================\n";i=0; + for e in "${profiles[@]}";do + ((i++)); + echo -e "$w_l ($i) > $e"; + done; + fi; + echo -e "\n$rs_"; +}; +_save_profile(){ + if [ -f "$menudir/$_toolchainname.save" ];then + source "$menudir/$_toolchainname.save"; + input=$("$gui" "$st_" "$bt_" "$title_" --title " -[ $1 Toolchain ]- " $ip_ "\n SAVE PROFILE\n" 0 0 "$_toolchainname"); + echo $enabled $usevars | sed -e 's/CARDREADER_//g;s/READER_//g;s/MODULE_//g;s/HAVE_//g;s/WEBIF_//g;s/WITH_//g;s/CS_//g;s/_CHARSETS//g;s/CW_CYCLE_CHECK/CWCC/g;s/SUPPORT//g;' >"$profdir/$input.profile"; + fi; +}; +_load_profile(){ + if [ "$(ls -A "$profdir")" ];then + ok=0; + loadprofile="no"; + USESTRING=; + _create_module_arrays; + unset selection; + declare -a SELECTION; + cd "$profdir"; + p_files=(*.profile); + i=0; + for e in "${p_files[@]}";do + ((i++));SELECTION+=($e '<'); + done; + pselect=$("$gui" "$st_" "$bt_" "$title_" --no-cancel --title " -[ $txt_select_profile_title ]- " --menu "\n $txt_select_profile\n\n" 0 0 "$i" "${SELECTION[@]}"); + [ $? = 255 ] && loadprofile="yes" && _toolchain_build_menu; + "$gui" "$st_" "$bt_" "$title_" --yesno "\n$txt_confirm_profile_select\n\n$pselect\n\n" 0 0; + response=$?; + case "$response" in + 1) + loadprofile="yes"; + _toolchain_build_menu;; + 255) + loadprofile="yes"; + _toolchain_build_menu;; + esac; + if [ -f "$profdir/$pselect" ];then + profile_vars=$(cat "$profdir/$pselect";); + reset_="$("$svndir/config.sh" -D all)"; + for e in "${!USE_vars[@]}";do + USE_vars[$e]=; + done; + for e1 in $profile_vars;do + for e2 in "${!USE_vars[@]}";do + [ "$e1" == "$e2" ] && USE_vars[$e1]="$e1=1"; + done; + for sm in "${SHORT_MODULENAMES[@]}";do + if [ "$e1" == "$sm" ];then + _em_="$_em_ $(get_module_name "$sm")"; + fi; + done; + done; + _set_=$("$svndir/config.sh" -E $_em_); + USESTRING="$(echo "${USE_vars[@]}"| sed 's@USE_@@g' | sed 's@=1@@g'| tr -s ' ')"; + loadprofile="yes"; + fi; + else + $gui --msgbox "\n$txt_no_profile_found \n " 0 0; + fi; + loadprofile="no"; +}; +_create_native_profile(){ + [ ! -d "$tcdir/native/bin" ] && mkdir -p "$tcdir/native/bin"; + cd "$tcdir/native/bin"; + g="$(which gcc)"; + stripvar="$(which strip)"; + compiler_link="$($g -dumpmachine)-gcc"; + strip_link="$($g -dumpmachine)-strip"; + [ ! -L "$compiler_link" ] && ln -sf "$g" "$compiler_link"; + [ ! -L "$strip_link" ] && ln -sf "$stripvar" "$strip_link"; + cd "$tccfgdir"; + cat << EOF > native +_toolchainname="native"; +default_use="USE_UTF8 USE_LIBCRYPTO"; +_oscamconfdir_default="/usr/local/etc"; +_oscamconfdir_custom="not_set"; +_compiler="$($g -dumpmachine)-"; +_tc_info="Native System Compiler \ +$(gcc --version)"; +_libsearchdir="/lib"; +_menuname="native"; +_sysroot="/"; +EOF +cd "$workdir"; +}; diff --git a/support/functions/_subversion b/support/functions/_subversion new file mode 100644 index 0000000..91bfef1 --- /dev/null +++ b/support/functions/_subversion @@ -0,0 +1,193 @@ +#!/bin/bash + +checkout(){ + echo -en "$c_l"; + fc1="$(mktemp)"; + clear; + ologo; + i=0; + COUNT=0; + if [ -d "$svndir" ];then + rm -rf "$svndir"; + echo -e "$p_l\n $txt_delete $txt_existing oscam-svn $re_\n"; + else + echo -e "$p_l\n $txt_no oscam-svn $txt_found\n$re_"; + fi; + echo -e "$w_l SVN TrunkURL : $g_l$trunkurl$re_"; + [ ! -z "$1" ] && [ $(($1)) -gt 6999 ] && opt_="-r$1" && mac_="($txt_selected)" || opt_=''; + echo -en "$w_l SVN FileCount : "; + svn info -R "$trunkurl" |grep '^URL' |uniq |wc -l >"$fc1"; + n=$(cat "$fc1"); + echo -e "$g_l""$txt_found $n"; + echo -en "$w_l SVN checkout : "; + while read line filename;do + counter=$(( 100*(++i)/n)); + tput cup 11 18; + [ "$counter" -lt "100" ] && echo -en "$g_l""$counter%$re_" || echo -en "$g_l""100%$re_"; + done < <( svn co "$trunkurl" $opt_ "$svndir" |sed "s|$svndir/||g"); + tput cup 11 18; + echo -en "$g_l""100%$re_"; + if [ -f "$svndir/config.sh" ];then + tput cup 12 2; + echo -en "$w_l""SVN Revision : $y_l""$("$svndir/config.sh" -r) $b_l$mac_$re_\n$w_l SVN UserPath : $y_l""$svndir"; + fi; + [ -f "$svndir/config.h" ]&& reset_="$("$svndir/config.sh" -R)"; + _fix_config_h; + rm -rf "$fc1"; + _nl; + [ -f "$workdir/SVN-IS-PATCHED" ] && rm -f "$workdir/SVN-IS-PATCHED"; + tarsvn; +}; +svnrestore(){ + clear; + echo -en "$c_l"; + ologo; + if [ "$1" == "list" ];then + cd "$bsvn"; + bfiles="$(find . -type f |sed 's|./||' |sed 's|.tar.gz||')"; + bcount=$(echo "$bfiles" |wc -w); + if [ "$bcount" -gt "0" ];then + echo -e "\n$c_l $bcount$w_l svn backups found\n ____________________$re_\n"; + for b in $bfiles;do + echo -e "$c_l --> $w_l$b"; + done; + _nl; + else + echo -e "\n$r_l $bcount$w_l svn backups found\n ____________________$re_\n"; + fi; + exit; + fi; + if [ -d "$svndir" ];then + rm -rf "$svndir"; + echo -e "$p_l\n $txt_delete $txt_existing oscam-svn $re_\n"; + else + echo -e "$p_l\n $txt_no oscam-svn $txt_found\n$re_"; + fi; + untarsvn $1; + [ -f "$svndir/config.h" ]&& echo -en "$w_l"" SVN Revision : $y_l""$("$svndir/config.sh" -r) restored\n\n$re_"; +}; +quicksvnrestore(){ + untarsvn $1; +}; +svnup(){ + echo -en "$c_l"; + clear; + ologo; + i=1; + if [ -d "$svndir" ];then + echo -en "$p_l\n $txt_update oscam-svn $re_\n"; + else + checkout; + return; + fi; + echo -en "\n$w_l SVN TrunkURL : $g_l""$trunkurl""$re_"; + svn co "$trunkurl" "$svndir" -q; + if [ -f "$svndir/config.sh" ];then + tput cup 10 2; + echo -e "$w_l""SVN Revision : ""$y_l$("$svndir/config.sh" -r) $b_l$mac_$re_\n$w_l SVN UserPath : $y_l""$svndir\n$re_"; + fi; + if [ -f "$svndir/config.h" ];then + reset_="$("$svndir/config.sh" -R)"; + _fix_config_h; + fi; +}; +svnpatch(){ + if [ ! -f "$workdir/SVN-IS-PATCHED" ];then + clear; + echo -e $C; + ologo; + unset patchlist; + cd "$pdir"; + patchlist=(*.patch); + if [ "$(ls -A "$pdir"/*.patch 2>/dev/null)" ];then + touch "$workdir/SVN-IS-PATCHED"; + for p in "${patchlist[@]}";do + echo -e $WH"\n\n -> $p <-\n"$W; + sleep 1; + patch -d$svndir/ -p0 < "$pdir/$p" |sed -e "s/^patching file/$G patching > $WH/g;s/^Hunk/$P Hunk > $Y/g;s/FAILED/$R FAILED/g; ;s/-- saving/$Y -- saving/g;"; + done; + else + echo -e $WH" $txt_no patch $txt_found"; + fi; + else + clear; + echo -e $C; + ologo; + echo -e $WH" already patched"; + fi; + echo -e $W; +}; +_dialog_checkout(){ + upc="$(mktemp)"; + (echo -en " $txt_verify_syscheck "; + [ "$sanity" == "1" ] && echo -e "ok" && sleep 1; + if [ "${s3cfg_vars[NO_SVN_AUTOUPDATE]}" == "0" ];then + echo -en " $txt_verify_svn "; + if [ -f "$svndir/config.sh" ];then + echo "ok"; + sleep 1; + echo -en " $txt_update_svn $txt_wait\n"; + cd "$svndir"; + svn -q update; + echo 1 >"$upc"; + sleep 1; + fi; + fi;) | "$gui" "$st_" "$bt_" "$title_" "$pb_" 5 52; + if [ "${s3cfg_vars[NO_SVN_AUTOUPDATE]}" == "0" ];then + upc1=$(cat "$upc" 2>/dev/null); + rm -f "$upc"; + [ ! "$upc1" == "1" ] && _dialog_checkout1; + if [ -f "$svndir/config.sh" ];then + reset_="$("$svndir/config.sh" -R)"; + _fix_config_h; + fi; + _get_config_menu; + fi; + if [ -n "$1" ];then + if [ -f "$tccfgdir/$1" ] && [ -f "$svndir/config.sh" ];then + source "$tccfgdir/$1"; + if [ ! -f "$tcdir/$_toolchainname/bin/$_compiler""gcc" ];then + first="$1"; + _toolchain_gui_install; + fi; + loadprofile="yes"; + _toolchain_build_menu "$1"; + else + _select_menu; + fi; + fi; + _select_menu; +}; +_dialog_checkout1(){ + rm -rf "$svndir" 2>/dev/null; + COUNT=0; + [ -z "$1" ] && rn=0 || rn="$1"; + if [ "$rn" -ge "7000" ];then + _rev="-r $rn"; + sc_text="Revision: $rn"; + else + _rev=''; + sc_text="$txt_latest"; + fi; + (echo -en "$txt_prepare_svn $txt_wait";)| "$gui" "$st_" "$bt_" "$title_" "$pb_" 3 55; + nnn="$(svn info $_rev -R "$trunkurl" |grep "^URL: " |uniq |wc -l)"; + "$gui" "$st_" "$bt_" "$title_" --title " -[ SVN Checkout $sc_text ]- " --gauge " $txt_wait" 6 75 < <(while read line filename;do ((++i));PCT=$(( 100*i/(nnn+1) )); +cat </dev/null| sed 's/[^0-9]//g' || echo " nosvn "; +}; diff --git a/support/functions/_sys_check b/support/functions/_sys_check new file mode 100644 index 0000000..2a823ff --- /dev/null +++ b/support/functions/_sys_check @@ -0,0 +1,122 @@ +#!/bin/bash + +prerequisites(){ + +failed=0; +missing="(not found)"; +[[ $1 ]] && output=": &&" || output="echo"; + +$output -e "$w_l\n CHECK for binaries\n ==================\n"; + +# check for a forgotten and unusable 'upx' and remove this crap +[ -x "$bindir"/upx ] && "$bindir"/upx -V &>/dev/null || rm -f "$bindir"/upx &>/dev/null; + +for e in "${binvars[@]}"; +do + if hash "$e" 2>/dev/null; then + $output -e "$w_l have\t$g_l$e\t\t$y_l$(which "$e")"; + else + failed=1; + $output -e "$r_l need\t$w_l$e\t\t$r_l$missing"; + fi; +done; + +if hash upx 2>/dev/null; then + upxversion=($(upx -V | awk 'NR==1 { verok=$2>=3.91; printf "%.2f %i", $2, verok }')); + $output -n -e "$w_l version$g_l upx$y_l ${upxversion[0]}"; + if [ ${upxversion[1]} == 1 ]; then + $output -e "$g_l ok"; + else + $output -e "$r_l nok"; + failed=1; + fi +fi + +$output -e " \n $w_l CHECK for headers\n =================\n" ; + +for e in "${headervars[@]}"; +do + e1=$(find /usr/include/* | grep -m1 "$e"); + if [ ${#e1} -gt 8 ]; then + $output -e "$w_l have\t$g_l$e$w_l$y_l\t$e1" + else + failed=1; + $output -e "$r_l need\t$w_l$e\t\t$r_l$missing"; + fi; +done; + +$output -e " \n $w_l CHECK for libraries\n ===================\n" ; + +for e in "${libvars[@]}"; +do + e1=$(find /usr/lib* 2>/dev/null | grep -m1 "$e"); + if [ ${#e1} -gt 8 ]; then + $output -e "$w_l have\t$g_l$e$w_l$y_l\t$e1" + else + failed=1; + $output -e "$r_l need\t$w_l$e\t\t$r_l$missing"; + fi; +done; + +if [ "$(uname -m)" == "x86_64" ]; then + $output -e " \n $w_l CHECK for zlib32\n ================\n" ; + e="zlib32"; + e1="/usr/lib/libz.so"; + e2="/usr/lib32/libz.so.1"; + if [ -f $e1 ]; then + $output -e "$w_l have\t$g_l$e$w_l$y_l\t$e1" + elif [ -f $e2 ]; then + $output -e "$w_l have\t$g_l$e$w_l$y_l\t$e2" + else + failed=1; + $output -e "$r_l need\t$w_l$e\t\t$r_l$missing"; + fi +fi + +return $failed; +} + +# Parameters (all optional): +# $1: installer name (or "auto") +# $2: add architecture (not implemented yet) +# +# Example: +# syscheck debian_os +# call installer 'debian_os' (Do not care about the actual Linux distribution.) +syscheck(){ +[[ $1 ]] && [ "$1" != "auto" ] && override="$1"; + +if [ -d "$osdir" ];then cd "$osdir";x=(*); for i in "${x[@]}";do source "$i"; done fi + +binvars=( dialog grep gawk wget tar bzip2 svn xz upx patch gcc make scp sshpass openssl dos2unix ); +headervars=( crypto.h libusb.h pcsclite.h pthread.h ); +libvars=( libccidtwin.so ); + +sanity=1; + +if ! prerequisites silent; then + echo -e "$w_l"; clear; ologo; + prerequisites; + sanity=0; + installer="unknown"; + # Debian and Ubuntu + [ -f /etc/debian_version ] && installer="debian_os"; + # CentOS and Redhat + [ -f /etc/redhat-release ] && installer="redhat_os"; + # Manjaro (/etc/os-release) + [ -f /etc/manjaro-release ] && installer="manjaro_os"; + # SuSE (/etc/SuSE-release is depreciated -> check for YaST2) + [ -d /etc/YaST2 ] && installer="suse_os"; + # Optional override via parameter + [[ $override ]] && installer=$override; + echo -e "\n$w_l Selected installer: $installer"; + if type -t "$installer" >/dev/null; then + $installer && prerequisites && sanity=1; + else + echo -e "\n$r_l Needs manual installation."; + fi + echo -e "$re_"; +fi + +return $sanity; +} diff --git a/support/functions/_toolchain b/support/functions/_toolchain new file mode 100644 index 0000000..35dea12 --- /dev/null +++ b/support/functions/_toolchain @@ -0,0 +1,285 @@ +#!/bin/bash + +_toolchain_build_menu(){ + [ "$loadprofile" == "yes" ] && load_config; + selected=$( + "$gui" "$st_" "$bt_" "$title_" --no-cancel --title " -[ $txt_bmenu_title ]- " --menu "_________________________________________________________ \n $txt_bmenu_user = $(whoami)\n Toolchain = $_toolchainname\n $txt_bmenu_comp = $_compiler""gcc\n $txt_bmenu_debu = CPU-Threads($(CPUS)) SVN($(REVISION)) SCRIPT($SIMPLEVERSION)\n $txt_bmenu_use = $(echo $USESTRING| sed -e 's/^[ \t]*//')\n _________________________________________________________ \n" 22 65 10 BUILD "$txt_bmenu_build" CONFIGURE "$txt_bmenu_config" LOAD_PROFILE "$txt_bmenu_profile" SAVE_PROFILE "$txt_bmenus_profile" SHOW_BUILDLOG "$txt_bmenu_log" EDIT_CONF_DIR "Oscam config PATH" BACK "$txt_bmenu_back" EXIT "$txt_firstmenu_exit"); + [ $? = 255 ] && _toolchain_build_menu; + case $selected in + BUILD) + _gui_build;; + CONFIGURE) + _toolchain_config_menu;; + EDIT_CONF_DIR) + _gtedit; + _toolchain_build_menu;; + SHOW_BUILDLOG) + _sz; + if [ -f "$workdir/lastbuild.log" ];then + "$gui" "$st_" "$bt_" "$title_" --textbox "$workdir/lastbuild.log" "$_lines" "$_cols"; + fi; + _toolchain_build_menu;; + LOAD_PROFILE) + _load_profile;; + SAVE_PROFILE) + _save_profile;; + BACK) + _toolchain_main_menu;; + EXIT) + bye; + exit;; + esac; + _toolchain_build_menu; +}; +_toolchain_config_menu(){ + [ "$loadprofile" == "yes" ] && load_config; + selected=$( + "$gui" "$st_" "$bt_" "$title_" --no-cancel --title " -[ $txt_config_menu ]- " --menu " ADDONS :\n $(e_addons)\n\n PROTOCOLS :\n $(e_protocols)\n\n READERS :\n $(e_readers)\n\n CARD_READERS :\n $(e_card_readers)\n\n USE VARIABLES :\n $(echo $USESTRING| sed -e 's/^[ \t]*//')\n\n" 29 75 6 BACK "$txt_back_build" OSCAM_MODULE "$txt_module_configure" OSCAM_EXTRA "$txt_oscam_extra" BUILD_EXTRA "$txt_build_extra" SELECT_STAPI "select stapi" RESET "$txt_build_reset"); + [ $? = 255 ] && _toolchain_config_menu; + case $selected in + BACK) + save_config; + _toolchain_build_menu;; + OSCAM_EXTRA) + _oscam_extra_menu;; + BUILD_EXTRA) + _build_extra_menu;; + OSCAM_MODULE) + eval "$svndir/config.sh -g" 2>/dev/null; + save_config;; + SELECT_STAPI) + _stapi_select;; + RESET) + _reset_config; + load_config; + _toolchain_config_menu;; + esac; + _toolchain_config_menu; +}; +_toolchain_main_menu(){ + _fill_tc_array; + IFS="#"; + COUNT=0; + MENU_OPTIONS="BACK#$txt_back_main#"; + counter; + if [ "$systype" == "ok" ];then + MENU_OPTIONS+="ADD#$txt_menu_builder2#"; + counter; + [ "$tcempty" == "0" ] && MENU_OPTIONS+="REMOVE#$txt_menu_builder3#" && counter; + fi; + MENU_OPTIONS+="native#$txt_menu_builder4 $(hostname)-$(uname -m)#"; + counter; + if [ "$systype" == "ok" ];then + if [ "$tcempty" == "0" ];then + for i in "${INST_TCLIST[@]}";do + if [ ! "$i" == "native" ];then + source "$tccfgdir/$i"; + MENU_OPTIONS+="$_toolchainname#$_description#"; + counter; + fi; + done; + fi; + fi; + MENU_OPTIONS+="EXIT#$txt_firstmenu_exit#"; + counter; + out=$( + "$gui" "$st_" "$nc_" "$bt_" "$title_" --help-button --help-label INFO --title "-[ Toolchain $txt_menu ]-" --menu "$txt_main_revision$(REVISION)" "${COUNT+8}" 75 0 ${MENU_OPTIONS}); + IFS=$OIFS; + first=$(echo "$out" | awk '{printf $1}'); + tc_info=$(echo "$out" | awk '{printf $2}';); + case $first in + EXIT) + bye;; + BACK) + _select_menu;; + ADD) + _toolchain_add_menu;; + REMOVE) + _toolchain_remove_menu;; + HELP) + if [ -f "$tccfgdir/$tc_info" ];then + source "$tccfgdir/$tc_info"; + "$gui" "$st_" "$nc_" "$bt_" "$title_" "$ib_" "$_tc_info" $((_tc_infolines + 5)) 65; + sleep 5; + fi; + _toolchain_main_menu;; + *) + [ -f "$tccfgdir/$first" ] && stapi_allowed="" && source "$tccfgdir/$first" || exit; + loadprofile="yes"; + _toolchain_build_menu "$first";; + esac; +}; +get_toolchain_config(){ + get_toolchain_list; + for ((i=0;i<${#toolchain_list[@]};i++));do + [ "${toolchain_list[$i]}" == "$1" ] && source "$sdir/toolchain.cfgs/$1"; + done; +}; +_load_toolchain(){ + [ ! -z "$1" ] && source "$tccfgdir/$1"; + dln="$(decode "$_t1e")$(decode "$_toolchainfilename")"; + tc_dl="$dldir/$dln"; + [ -f "$dln" ] && rm -rf "$dln"; + clear; + echo -e "$c_l"; + ologo; + _nl; + echo -e "$p_l load only"; + _nl; + echo -e "$w_l Toolchain :$y_l $dln"; + echo -en "$w_l download :$g_l "; + _pget; +}; +get_toolchain_list(){ + [ -d "$sdir/toolchain.cfgs" ] && cd "$sdir/toolchain.cfgs" || echo "please fix $sdir/toolchain.cfgs"; + toolchain_list=(); + toolchain_list+=('native'); + toolchain_list+=(*); + cd "$workdir"; +}; +_console_extract_toolchain(){ + [ -d "$tcdir/$_toolchainname" ] && rm -rf "$tcdir/$_toolchainname"; + mkdir "$tcdir/$_toolchainname"; + cd "$tcdir/$_toolchainname"; + xz -d "$tc_dl" -c | tar -x; + echo -en "$txt_done!$w_l"; +}; +_toolchain_check(){ + clear; + echo -e "$w_l"; + ologo; + headervars=( crypto.h pcsclite.h libusb.h pthread.h ); + [ -f "$tccfgdir/$1" ] && source "$tccfgdir/$1"; + if [ -d "$tcdir/$1/bin" ];then + cd "$tcdir/$1/bin"; + else + echo -e "$r_l $txt_error:$y_l $1$w_l Toolchain $txt_n_installed""$rs_"; + _nl; + exit; + fi; + compilername="$_compiler""gcc"; + [ ${#_realcompiler} -gt 4 ] && compilername="$_realcompiler"; + version=$("./$compilername" -dumpversion); + machine=$("./$compilername" -dumpmachine); + sr=$("./$compilername" -print-sysroot 2>/dev/null); + sysroot=${tcdir//"$1/bin"/}; + [ -z "$sysroot" ] && sysroot="$r_l$txt_too_old"; + echo -e "$w_l Compiler Info\n =============\n"; + echo -e "$w_l Version :$y_l $version"; + echo -e "$w_l Target :$y_l $machine"; + echo -e "$w_l Sysroot :$y_l $sysroot"; + for e in "${headervars[@]}";do + temp=$(find "$sr"/* |grep -m1 "$e"); + [ ${#temp} -gt 8 ] && echo -e "$w_l Header :$y_l $e$g_l\t$txt_found" || echo -e "$w_l Header :$y_l $e$r_l\t($txt_not_found)"; + done; + _nl; + exit; +}; +_toolchain_repair(){ + clear; + echo -e "$w_l\n"; + s3logo; + cd $dldir;zzusatz=0;szusatz=0; + [ -f "$tccfgdir/$1" ] && source "$tccfgdir/$1"; + fn=$(echo $_md5sum |awk '{ printf $2 }'); + if [ -f $fn ];then + md5file=$(mktemp); + echo $_md5sum > $md5file; + answer=$(md5sum -c $md5file 2>&1); + if [ "$answer" == "$fn: OK" ];then + echo -en $w_l" Toolchain md5 check :$g_l"; + echo -en $answer |awk '{{print " " $2;}}'; + echo -en $w_l;tc_dl="$dldir/$fn"; + echo -en $w_l" Toolchain repair :$g_l" + _console_extract_toolchain; + echo -e "\n"$W; + else + echo -en $w_l"\n Toolchain md5 check :$r_l"; + echo -en $answer |awk '{{print " " $2;}}' |head -1; + echo -en $W;sleep 1;zzusatz=0;szusatz=8; + echo -en $w_l" Toolchain download :$g_l"; + dln=$fn;_pget; sleep 1; + echo -en $w_l" Toolchain repair :$g_l"; + _console_extract_toolchain;echo -e $W"\n"; + exit; + fi + else + echo -e $w_l" Toolchain Filename :$y_l $fn"; + echo -en $w_l" Toolchain download :$g_l "; + zzusatz=-1;szusatz=7; + dln=$fn;_pget; sleep 1; + echo -en $w_l" Toolchain repair :$g_l"; + _console_extract_toolchain;echo -e $W"\n"; + exit; + fi +}; +_toolchain_add_menu(){ + _fill_tc_array; + _init_menu; + for i in "${MISS_TCLIST[@]}";do + if [ ! "$i" == "native" ];then + source "$tccfgdir/$i"; + MENU_OPTIONS+="$_toolchainname#$_description#"; + counter; + fi; + done; + MENU_OPTIONS+="EXIT#$txt_menu_builder1#"; + counter; + out=$( + "$gui" "$st_" "$nc_" "$bt_" "$title_" --help-button --help-label INFO --title "-[ $txt_add_menu ]-" --menu "$txt_main_revision$(REVISION)" "${COUNT+8}" 75 0 ${MENU_OPTIONS[@]}); + IFS=$OIFS; + first=$(echo "$out" | awk '{printf $1}'); + case $first in + EXIT) + bye;; + BACK) + _toolchain_main_menu;; + *) + _toolchain_gui_install; + _toolchain_main_menu;; + esac; +}; +_toolchain_remove_menu(){ + _fill_tc_array; + _init_menu; + if [ "$tcempty" == "0" ];then + for i in "${INST_TCLIST[@]}";do + if [ ! "$i" == "native" ];then + source "$tccfgdir/$i"; + MENU_OPTIONS+="$_toolchainname#$_description#"; + counter; + fi; + done; + fi; + MENU_OPTIONS+="EXIT#$txt_menu_builder1#"; + counter; + out=$( + "$gui" "$st_" "$nc_" "$bt_" "$title_" --title "-[ $txt_remove_menu ]-" --menu "$txt_main_revision$(REVISION)" "${COUNT+8}" 75 0 ${MENU_OPTIONS}); + IFS=$OIFS; + first=$(echo "$out" | awk '{printf $1}'); + case $first in + EXIT) + bye;; + BACK) + _toolchain_main_menu;; + *) + [ -d "$tcdir/$first" ] && rm -rf "$tcdir/$first"; + _toolchain_main_menu;; + esac; +}; +_toolchain_gui_install(){ + [ -d "$tcdir/$first" ] && rm -rf "$tcdir/$first" && echo "$txt_delete $tcdir/$first"; + mkdir "$tcdir/$first"; + cd "$tcdir/$first"; + source "$tccfgdir/$first"; + tcname="$(decode "$_t1e$_toolchainfilename")"; + stcname="$(decode "$_toolchainfilename")"; + if [ -f "$dldir/$tcname" ];then + (xz -d "$dldir/$tcname" -c| tar -xv) |"$gui" "$st_" --title " -[ $txt_extracting ]- " "$pb_" 20 74; + else + cd "$dldir"; + wget "$(decode "$_u1e")/$tcname" 2>&1 | stdbuf -o0 awk '/[.] +[0-9][0-9]?[0-9]?%/ { print substr($0,63,3) }' | "$gui" "$st_" "$bt_" "$title_" --title " -[ download ]- " --gauge " $txt_loading $stcname $txt_wait" 6 74; + cd "$tcdir/$first"; + (xz -d "$dldir/$tcname" -c |tar -xv) |"$gui" "$st_" --title " -[ $txt_extracting ]- " "$pb_" 20 74; + fi; +}; \ No newline at end of file diff --git a/support/functions/_translation b/support/functions/_translation new file mode 100644 index 0000000..b36a7dc --- /dev/null +++ b/support/functions/_translation @@ -0,0 +1,51 @@ +#!/bin/bash + +auto_langset(){ + langset="fail"; + cd "$tdir"; + langsupport=(*); + if [ -f "$configdir/force_lang" ];then + lng1=$(head -n 1 "$configdir/force_lang"); + for lng in "${langsupport[@]}";do + if [ "$lng" == "$lng1" ];then + source "$tdir/$lng"; + langset="ok"; + return; + fi; + done; + fi; + for lng in "${langsupport[@]}";do + if [ "${LANG:0:2}" == "$lng" ];then + source "$tdir/$lng"; + langset="ok"; + return; + fi; + done; + if [ ! "$langset" == "ok" ];then + [ -f "$tdir/en" ] && source "$tdir/en"; + fi; +}; +lang_select(){ + lng="none"; + [ -f "$configdir/force_lang" ] && lng=$(head -n 1 "$configdir/force_lang"); + unset MENU_OPTIONS;COUNT=0; + for e in "${langsupport[@]}";do + if [ "$lng" == "none" ];then + [ "${LANG:0:2}" == "$e" ] && _stat="on" || _stat="off"; + else + [ "$lng" == "$e" ] && _stat="on" || _stat="off"; + fi; + txt=$(head -3 "$tdir/$e" |tail -1); + MENU_OPTIONS+=($e $txt $_stat);counter; + done; + lng=$("$gui" "$st_" "$bt_" "$title_" --title "-[ lang set ...to edit... ]-" "$rl_" "...langset...to...edit..." "${COUNT+7}" 40 0 "${MENU_OPTIONS[@]}"); + if [ ! "${LANG:0:2}" == "$lng" ];then + for lng1 in "${langsupport[@]}";do + if [ "$lng" == "$lng1" ];then + echo "$lng" >"$configdir/force_lang"; + fi; + done; + else + [ -f "$configdir/force_lang" ] && rm -rf "$configdir/force_lang"; + fi; +}; \ No newline at end of file diff --git a/support/functions/_uploadcam b/support/functions/_uploadcam new file mode 100644 index 0000000..8f02ef6 --- /dev/null +++ b/support/functions/_uploadcam @@ -0,0 +1,55 @@ +#!/bin/bash + +upload_cam(){ + clear; + slogo; + FILENAME=$1; + + if [ ! -f "$profdir/$FILENAME" ];then + echo -e "$r_l\n $txt_error $FILENAME $txt_upload_cam1 $re_"; + exit; + else + echo -e "$w_l\n CONFIG : $g_l$FILENAME $txt_upload_cam2 $re_"; + fi; + +#load data from config + source "$profdir/$FILENAME"; + +#find newest build by date for toolchain + cd "$bdir"; + buildcamname="$(find . -type f \( -iname "*$toolchain*" ! -iname "*list_smargo" \) -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " |sed 's@./@@g')"; + cd "$workdir"; + +#output date from cam + if [ -f "$bdir/$buildcamname" ];then + echo -e "$w_l CAMNAME : $y_l$buildcamname"; + echo -en "$w_l FILEDATE: "$( + stat -c %y "$bdir/$buildcamname" |awk '{print $1" "; printf substr($2,1,8)}'); + echo -e "$w_l"; + else + echo -e "$r_l\n matching \$CAM not found in $bdir$re_"; + exit; + fi; + echo -e "$p_l\n $txt_LOAD > $w_l$txt_to IP:$b_l$ip$w_l port:$b_l$port"; + sshpass -p "$password" scp -P "$port" "$bdir/$buildcamname" "$loginname@$ip":/tmp; + +#replace target cam + if [ "$replace_target" == "y" ];then + echo -en "$p_l REPLACE > $y_l$targetcam$re_"; + sshpass -p "$password" ssh -p "$port" -o StrictHostKeyChecking=no "$loginname@$ip" \ + "cd /tmp;if [ -f \"$buildcamname\" ];then if [ -f \"$targetcam\" ];then mv -f \"$buildcamname\" \"$targetcam\";fi;fi;exit;"; + echo -e "$g_l$txt_done!$re_"; + fi; + +#stop target cam + if [ "$stop_target" == 'y' ];then + stop="killall -9 $(basename "$targetcam")"; + fi; + +#remote command (example restart cam) + if [ ! "$remote_command" == "none" ];then + echo -e "$w_l SSH COMMANDS $remote_command $y_l$txt_wait"; + # do remote commands + sshpass -p "$password" ssh -p "$port" -o StrictHostKeyChecking=no "$loginname@$ip" "$remote_command;"; + fi; +}; \ No newline at end of file diff --git a/support/os/debian_ubuntu.install b/support/os/debian_ubuntu.install new file mode 100644 index 0000000..61db87b --- /dev/null +++ b/support/os/debian_ubuntu.install @@ -0,0 +1,137 @@ +#!/bin/bash + +debian_os(){ +install_log="$ldir/os-install.log"; +failed=0; +prefix="sudo"; +packages=""; + +echo -n >"$install_log" &2>/dev/null; + +echo -e "$w_l\n INSTALLATION\n ============\n"; + +debian_version=$(sed -n 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/p' /etc/debian_version 2>/dev/null); + +if [[ $debian_version ]]; then + [ "$debian_version" -lt 7 ] && { echo -e "$r_l This system is not supported anymore!\n"; return 1; } + [ "$debian_version" -gt 8 ] && echo -e "$r_l This installer is still in the testing stage!"; +else + # all known Ubuntu systems have 'lsb_release' + ! hash lsb_release 2>/dev/null && { echo -e "$r_l System not recognised -> Abort!\n"; return 1; } + ubuntu_version=$(lsb_release -rs | cut -f 1 -d '.'); + [ "$ubuntu_version" -lt 12 ] && { echo -e "$r_l This system is not supported anymore!\n"; return 1; } + [ "$ubuntu_version" -gt 16 ] && echo -e "$r_l This installer is still in the testing stage!"; +fi + +# without sudo no user installation allowed +hash sudo 2>/dev/null || { [ "$(whoami)" != "root" ] && { echo -e "$r_l You need to be root for that!\n"; return 1; } } + +# root needs no sudo +[ "$(whoami)" == "root" ] && prefix=""; + +for e in "${binvars[@]}"; +do + if ! hash "$e" 2>/dev/null; then + inst="$e"; + case $e in + svn) + inst="subversion"; + ;; + xz) + inst="xz-utils"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +for e in "${headervars[@]}"; +do + e1=$(find /usr/include/* |grep -m1 "$e"); + if [ ! ${#e1} -gt 8 ]; then + case $e in + crypto.h) + inst="libssl-dev"; + ;; + libusb.h) + inst="libusb-1.0.0-dev"; + ;; + pcsclite.h) + inst="libpcsclite-dev"; + ;; + pthread.h) + inst="libc-dev-bin"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +for e in "${libvars[@]}"; +do + e1=$(find /usr/lib* |grep -m1 "$e"); + if [ ! ${#e1} -gt 8 ]; then + case $e in + libccidtwin.so) + inst="libccid"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +if [ "$(uname -m)" == "x86_64" ] && [ ! -f /usr/lib32/libz.so.1 ]; then + if [ ! -f /usr/lib32/libz.so.1 ]; then + e="zlib32"; + inst="lib32z1"; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi +fi + +if [ ${#packages} -gt 0 ]; then + echo -n -e "$w_l update$g_l package list..."; + echo "+++ $(date): apt-get -y update" >> "$install_log" + $prefix apt-get -y update >> "$install_log" 2>&1; + echo -e "$y_l done"; + echo -n -e "$w_l install$g_l selected packages$y_l please wait..."; + echo "+++ $(date): apt-get -y install$packages" >> "$install_log" + $prefix apt-get -y install $packages >> "$install_log" 2>&1 || failed=1; + if [ $failed == 0 ]; then + echo -e "$y_l done"; + else + echo -e "$r_l failed!"; + fi +fi + +if hash upx 2>/dev/null; then + upxversion=($(upx -V | awk 'NR==1 { verok=$2>=3.91; printf "%.2f %i", $2, verok }')); + if [ ${upxversion[1]} == 0 ]; then + [ -f "$bindir/upx" ] && rm -f "$bindir/upx" &>/dev/null; + if [ "$(uname -m)" == "x86_64" ]; then + upxarch="upx-3.95-amd64_linux"; + else + upxarch="upx-3.95-i386_linux"; + fi + upxarchive=$upxarch".tar.bz2"; + [ -f "$dldir/$upxarchive" ] && rm -f "$dldir/$upxarchive" &>/dev/null; + upxurl="http://upx.sourceforge.net/download/$upxarchive"; + echo -e "$w_l get newer$g_l upx$y_l\tfrom: $upxurl"; + echo "+++ $(date): wget $upxurl" >> "$install_log"; + if wget --directory-prefix="$dldir" --append-output="$install_log" $upxurl; then + echo "+++ $(date): tar xjvf $upxarchive" >> "$install_log"; + tar xjvf "$dldir"/$upxarchive --directory="$bindir" $upxarch/upx --strip-components=1 >> "$install_log" 2>&1 || failed=1; + [ -f "$dldir"/$upxarchive ] && rm -f "$dldir"/$upxarchive &>/dev/null; + else + failed=1; + fi + fi +fi + +[ $failed == 1 ] && echo -e "\n$r_l Installation with errors - see: $install_log"; + +return $failed; +} diff --git a/support/os/manjaro.install b/support/os/manjaro.install new file mode 100644 index 0000000..01e49d4 --- /dev/null +++ b/support/os/manjaro.install @@ -0,0 +1,126 @@ +#!/bin/bash + +manjaro_os(){ +install_log="$ldir/os-install.log"; +failed=0; +prefix="sudo"; +packages=""; + +echo -n >"$install_log" &2>/dev/null; +echo -e "$w_l\n INSTALLATION\n ============\n"; + +source /etc/lsb-release +manjaro_version=$DISTRIB_RELEASE + +# without sudo no user installation allowed +hash sudo 2>/dev/null || { [ "$(whoami)" != "root" ] && { echo -e "$r_l You need to be root for that!\n"; return 1; } } + +# root needs no sudo +[ "$(whoami)" == "root" ] && prefix=""; + +for e in "${binvars[@]}"; +do + if ! hash "$e" 2>/dev/null; then + inst="$e"; + case $e in + svn) + inst="subversion"; + ;; + xz) + inst="xz-utils"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +for e in "${headervars[@]}"; +do + e1=$(find /usr/include/* |grep -m1 "$e"); + if [ ! ${#e1} -gt 8 ]; then + case $e in + crypto.h) + inst="libssl-dev"; + ;; + libusb.h) + inst="libusb-1.0.0-dev"; + ;; + pcsclite.h) + inst="pcsclite"; + ;; + pthread.h) + inst="libc-dev-bin"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +for e in "${libvars[@]}"; +do + e1=$(find /usr/lib* |grep -m1 "$e"); + if [ ! ${#e1} -gt 8 ]; then + case $e in + libccidtwin.so) + inst="ccid"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +if [ "$(uname -m)" == "x86_64" ] && [ ! -f /usr/lib32/libz.so.1 ]; then + if [ ! -f /usr/lib32/libz.so.1 ]; then + e="zlib32"; + inst="lib32z1"; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi +fi + +if [ ${#packages} -gt 0 ]; then + echo -n -e "$w_l update$g_l package list..."; + echo "+++ $(date): pacman -Syu" >> "$install_log" + $prefix pacman -Syu >> "$install_log" 2>&1; + echo -e "$y_l done"; + echo -n -e "$w_l install$g_l selected packages$y_l please wait..."; + echo "+++ $(date): pacman -Sy install$packages" >> "$install_log" + $prefix pacman -S --noconfirm $packages >> "$install_log" 2>&1 || failed=1; + if [ $failed == 0 ]; then + echo -e "$y_l done"; + else + echo -e "$r_l failed!"; + fi +fi + +if hash upx 2>/dev/null; then + upxversion=($(upx -V | awk 'NR==1 { verok=$2>=3.91; printf "%.2f %i", $2, verok }')); + if [ ${upxversion[1]} == 0 ]; then + [ -f "$bindir/upx" ] && rm -f "$bindir/upx" &>/dev/null; + if [ "$(uname -m)" == "x86_64" ]; then + upxarch="upx-3.95-amd64_linux"; + else + upxarch="upx-3.95-i386_linux"; + fi + upxarchive=$upxarch".tar.bz2"; + [ -f "$dldir/$upxarchive" ] && rm -f "$dldir/$upxarchive" &>/dev/null; + upxurl="http://upx.sourceforge.net/download/$upxarchive"; + echo -e "$w_l get newer$g_l upx$y_l\tfrom: $upxurl"; + echo "+++ $(date): wget $upxurl" >> "$install_log"; + if wget --directory-prefix="$dldir" --append-output="$install_log" $upxurl; then + echo "+++ $(date): tar xjvf $upxarchive" >> "$install_log"; + tar xjvf "$dldir"/$upxarchive --directory="$bindir" $upxarch/upx --strip-components=1 >> "$install_log" 2>&1 || failed=1; + [ -f "$dldir"/$upxarchive ] && rm -f "$dldir"/$upxarchive &>/dev/null; + else + failed=1; + fi + fi +fi + +[ $failed == 1 ] && echo -e "\n$r_l Installation with errors - see: $install_log"; + +return $failed; +} diff --git a/support/os/redhat_centos_fedora.install b/support/os/redhat_centos_fedora.install new file mode 100644 index 0000000..b0cee2b --- /dev/null +++ b/support/os/redhat_centos_fedora.install @@ -0,0 +1,182 @@ +#!/bin/bash + +redhat_os(){ +install_log="$ldir/os-install.log"; +failed=0; +prefix="sudo"; +packages=""; + +echo -n >"$install_log" &2>/dev/null; + +echo -e "$w_l\n INSTALLATION\n ============\n"; + +rh_version=$(sed -n 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/p' /etc/redhat-release 2>/dev/null); +! [[ $rh_version ]] && { echo -e "$r_l System not recognised -> Abort!\n"; return 1; } + +sshpass_src="ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/sshpass-1.05-1.el6.rf.x86_64.rpm"; +sshpass86_src="ftp://rpmfind.net/linux/dag/redhat/el6/en/i386/dag/RPMS/sshpass-1.05-1.el6.rf.i686.rpm"; +installer="yum"; + +case $rh_version in + 5) + echo -e "$r_l Five - Has a too old glibc!"; return 1; + sshpass_src="ftp://rpmfind.net/linux/epel/5/x86_64/sshpass-1.05-1.el5.x86_64.rpm"; + sshpass86_src="ftp://rpmfind.net/linux/epel/5/i386/sshpass-1.05-1.el5.i386.rpm"; + ;; + [6-7]) + # Redhat/CentOS 6+7 ok + ;; + 2[2-3]) + # Fedora 22+23 ok + installer="dnf"; + ;; + 24) + # Fedora 24 still beta + installer="dnf"; + echo -e "$r_l This installer is still in the testing stage!"; + ;; + *) + echo "This version is not supported!" >"$install_log" 2>/dev/null; + echo -e "$r_l \"$(cat /etc/redhat-release)\" is not supported!"; + return 1; +esac + +# without sudo no user installation allowed +hash sudo 2>/dev/null || { [ "$(whoami)" != "root" ] && { echo -e "$r_l You need to be root for that!\n"; return 1; } } + +# root needs no sudo +[ "$(whoami)" == "root" ] && prefix=""; + +# care about the repos on Redhat +if hash subscription-manager 2>/dev/null; then + $prefix subscription-manager status >/dev/null || { echo -e "$r_l You need an active subscription!\n"; return 1; } + echo -e "$w_l Retreiving repo list..."; + if ! $prefix subscription-manager repos --list-enabled | grep -q "server-optional-rpms"; then + cmdline="subscription-manager repos --enable=rhel-$rh_version-server-optional-rpms"; + echo -e "$w_l Add needed repo$g_l optional:$y_l $cmdline"; + echo "+++ $(date): $cmdline" >> "$install_log"; + $prefix $cmdline >> "$install_log" 2>&1 || failed=1; + fi +fi + +for e in "${binvars[@]}"; +do + if ! hash "$e" 2>/dev/null; then + inst="$e"; + case $e in + svn) + inst="subversion"; + ;; + # the following guys have no official packages + sshpass) + continue; + ;; + upx) + continue; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +for e in "${headervars[@]}"; +do + e1=$(find /usr/include/* |grep -m1 "$e"); + if [ ! ${#e1} -gt 8 ]; then + case $e in + crypto.h) + inst="openssl-devel"; + ;; + libusb.h) + # no official package for older versions + [ "$rh_version" -lt 6 ] && continue; + # hopelully they stick to it from now :-) + inst="libusbx-devel"; + [ "$rh_version" == 6 ] && inst="libusb1-devel"; + ;; + pcsclite.h) + inst="pcsc-lite-devel"; + ;; + pthread.h) + inst="glibc-headers"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +for e in "${libvars[@]}"; +do + e1=$(find /usr/lib* 2>/dev/null | grep -m1 "$e"); + if [ ! ${#e1} -gt 8 ]; then + case $e in + libccidtwin.so) + inst="ccid"; + [ "$rh_version" -gt 6 ] && inst="pcsc-lite-ccid"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +if [ "$(uname -m)" == "x86_64" ] && [ ! -f /usr/lib/libz.so ]; then + if [ ! -f /usr/lib/libz.so ]; then + e="zlib32"; + inst="zlib-devel.i686"; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi +fi + +if [ ${#packages} -gt 0 ]; then + echo -n -e "$w_l update$g_l package list..."; + echo "+++ $(date): $installer -y check-update" >> "$install_log" + $prefix $installer -y check-update >> "$install_log" 2>&1; + echo -e "$y_l done"; + echo -n -e "$w_l install$g_l selected packages$y_l please wait..."; + echo "+++ $(date): $installer -y install$packages" >> "$install_log" + $prefix $installer -y install $packages >> "$install_log" 2>&1 || failed=1; + if [ $failed == 0 ]; then + echo -e "$y_l done"; + else + echo -e "$r_l failed!"; + fi +fi + +# additional rpm +if ! hash sshpass 2>/dev/null; then + [ "$(arch)" == "i686" ] && sshpass_src=$sshpass86_src; + echo -e "$w_l install$g_l sshpass$y_l\tfrom: $sshpass_src"; + echo "+++ $(date): rpm -i $sshpass_src" >> "$install_log"; + $prefix rpm -i $sshpass_src >> "$install_log" 2>&1 || failed=1; +fi + +if ! hash upx 2>/dev/null; then + [ -f "$bindir"/upx ] && rm -f "$bindir"/upx &>/dev/null; + if [ "$(uname -m)" == "x86_64" ]; then + upxarch="upx-3.95-amd64_linux"; + else + upxarch="upx-3.95-i386_linux"; + fi + upxarchive=$upxarch".tar.bz2"; + [ -f "$dldir"/$upxarchive ] && rm -f "$dldir"/$upxarchive &>/dev/null; + upxurl="http://upx.sourceforge.net/download/$upxarchive"; + echo -e "$w_l get$g_l upx$y_l\tfrom: $upxurl"; + echo "+++ $(date): wget $upxurl" >> "$install_log"; + if wget --directory-prefix="$dldir" --append-output="$install_log" $upxurl; then + echo "+++ $(date): tar xjvf $upxarchive" >> "$install_log"; + tar xjvf "$dldir"/$upxarchive --directory="$bindir" $upxarch/upx --strip-components=1 >> "$install_log" 2>&1 || failed=1; + [ -f "$dldir"/$upxarchive ] && rm -f "$dldir"/$upxarchive &>/dev/null; + else + failed=1; + fi +fi + + +[ $failed == 1 ] && echo -e "\n$r_l Installation with errors - see: $install_log"; + +return $failed; +} diff --git a/support/os/suse.install b/support/os/suse.install new file mode 100644 index 0000000..d85906e --- /dev/null +++ b/support/os/suse.install @@ -0,0 +1,154 @@ +#!/bin/bash + +suse_os(){ +install_log="$ldir/os-install.log"; +failed=0; +prefix="sudo"; +packages=""; + +echo -n >"$install_log" &2>/dev/null; + +echo -e "$w_l\n INSTALLATION\n ============\n"; + +suse_version=$(grep VERSION= /etc/os-release 2>/dev/null | sed -n 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/p'); + +sshpass_src="ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/sshpass-1.05-1.el6.rf.x86_64.rpm"; +sshpass86_src="ftp://rpmfind.net/linux/dag/redhat/el6/en/i386/dag/RPMS/sshpass-1.05-1.el6.rf.i686.rpm"; + +if [[ "$suse_version" ]]; then + [ "$suse_version" -lt 12 ] && { echo -e "$r_l This system is not supported anymore!\n"; return 1; } + [ "$suse_version" -gt 13 ] && [ "$suse_version" -lt 42 ] && echo -e "$r_l This installer is still in the testing stage!"; + [ "$suse_version" -gt 42 ] && echo -e "$r_l This installer is still in the testing stage!"; +else + echo -e "$r_l System not recognised -> Abort!\n"; return 1; +fi + +# without sudo no user installation allowed +hash sudo 2>/dev/null || { [ "$(whoami)" != "root" ] && { echo -e "$r_l You need to be root for that!\n"; return 1; } } + +# root needs no sudo +[ "$(whoami)" == "root" ] && prefix=""; + +# check for sufficient repositories - SLES & SLED need an additional "SUSE Linux Enterprise Software Development Kit" +if grep "Enterprise" /etc/os-release >/dev/null; then + echo -n -e "$w_l SUSE Linux Enterprise detected$g_l check for SDK repository..."; + if ! zypper wp subversion >/dev/null; then + echo -e "$r_l\n You need to install \"SUSE Linux Enterprise Software Development Kit\" first!\n Get it from https://download.suse.com\n"; return 1; + fi + echo -e "$y_l ok"; +fi + +for e in "${binvars[@]}"; +do + if ! hash "$e" 2>/dev/null; then + inst="$e"; + case $e in + svn) + inst="subversion"; + ;; + xz) + inst="xz-utils"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +for e in "${headervars[@]}"; +do + e1=$(find /usr/include/* |grep -m1 "$e"); + if [ ! ${#e1} -gt 8 ]; then + case $e in + crypto.h) + inst="libopenssl-devel"; + ;; + libusb.h) + inst="libusb-1_0-devel"; + ;; + pcsclite.h) + inst="pcsc-lite-devel"; + ;; + pthread.h) + inst="glibc-devel"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +for e in "${libvars[@]}"; +do + e1=$(find /usr/lib* |grep -m1 "$e"); + if [ ! ${#e1} -gt 8 ]; then + case $e in + libccidtwin.so) + inst="pcsc-ccid"; + ;; + esac; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi; +done; + +if [ "$(uname -m)" == "x86_64" ] && [ ! -f /usr/lib/libz.so ]; then + if [ ! -f /usr/lib/libz.so ]; then + e="zlib32"; + inst="zlib-devel-32bit glibc-32bit libz1-32bit"; + echo -e "$w_l select $g_l$e$y_l\tfrom: $inst"; + packages="$packages $inst"; + fi +fi + +if [ ${#packages} -gt 0 ]; then + echo -n -e "$w_l update$g_l package list..."; + echo "+++ $(date): zypper --non-interactive refresh" >> "$install_log" + $prefix zypper --non-interactive refresh >> "$install_log" 2>&1; + echo -e "$y_l done"; + echo -n -e "$w_l install$g_l selected packages$y_l please wait..."; + echo "+++ $(date): zypper --non-interactive --ignore-unknown install$packages" >> "$install_log" + $prefix zypper --non-interactive --ignore-unknown install $packages >> "$install_log" 2>&1 || failed=1; + if [ $failed == 0 ]; then + echo -e "$y_l done"; + else + echo -e "$r_l failed!"; + fi +fi + +# additional rpm +if ! hash sshpass 2>/dev/null; then + [ "$(arch)" == "i686" ] && sshpass_src=$sshpass86_src; + echo -e "$w_l install$g_l sshpass$y_l\tfrom: $sshpass_src"; + echo "+++ $(date): rpm -i $sshpass_src" >> "$install_log"; + $prefix rpm -i $sshpass_src >> "$install_log" 2>&1 || failed=1; + echo -e -n ; +fi + +upxversion=(0 0); +hash upx 2>/dev/null && upxversion=($(upx -V | awk 'NR==1 { verok=$2>=3.91; printf "%.2f %i", $2, verok }')); +if [ ${upxversion[1]} == 0 ]; then + [ -f "$bindir"/upx ] && rm -f "$bindir"/upx &>/dev/null; + if [ "$(uname -m)" == "x86_64" ]; then + upxarch="upx-3.95-amd64_linux"; + else + upxarch="upx-3.95-i386_linux"; + fi + upxarchive=$upxarch".tar.bz2"; + [ -f "$dldir"/$upxarchive ] && rm -f "$dldir"/$upxarchive &>/dev/null; + upxurl="http://upx.sourceforge.net/download/$upxarchive"; + echo -e "$w_l get newer$g_l upx$y_l\tfrom: $upxurl"; + echo "+++ $(date): wget $upxurl" >> "$install_log"; + if wget --directory-prefix="$dldir" --append-output="$install_log" $upxurl; then + echo "+++ $(date): tar xjvf $upxarchive" >> "$install_log"; + tar xjvf "$dldir"/$upxarchive --directory="$bindir" $upxarch/upx --strip-components=1 >> "$install_log" 2>&1 || failed=1; + [ -f "$dldir"/$upxarchive ] && rm -f "$dldir"/$upxarchive &>/dev/null; + else + failed=1; + fi +fi + +[ $failed == 1 ] && echo -e "\n$r_l Installation with errors - see: $install_log"; + +return $failed; +} diff --git a/support/profiles/best.box.profile b/support/profiles/best.box.profile new file mode 100644 index 0000000..d80929c --- /dev/null +++ b/support/profiles/best.box.profile @@ -0,0 +1,5 @@ +readers_on +USE_UTF8 +WEBIF DEBUG DVBAPI READ_SDT LIVELOG JQUERY LB CACHEEX IPV6 +CCCAM CAMD35 CAMD35_TCP +INTERNAL PHOENIX STINGER SMARGO_off diff --git a/support/stapi/liboscam_stapi.a b/support/stapi/liboscam_stapi.a new file mode 100644 index 0000000000000000000000000000000000000000..e456f091d5b9876295f908446f025e43f0b1dcc6 GIT binary patch literal 21160 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 literal 0 HcmV?d00001 diff --git a/support/stapi/liboscam_stapi5_OPENBOX.a b/support/stapi/liboscam_stapi5_OPENBOX.a new file mode 100644 index 0000000000000000000000000000000000000000..d2da22640a65b1dfbc73c7ef0d385229d0cbf913 GIT binary patch literal 64244 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 literal 0 HcmV?d00001 diff --git a/support/stapi/liboscam_stapi5_UFS916.a b/support/stapi/liboscam_stapi5_UFS916.a new file mode 100644 index 0000000000000000000000000000000000000000..5ffc6d79bfc364309548a25ba139284b38957dc7 GIT binary patch literal 64248 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 literal 0 HcmV?d00001 diff --git a/support/toolchains.cfg/arm_s3_ssl098 b/support/toolchains.cfg/arm_s3_ssl098 new file mode 100644 index 0000000..e40aef9 --- /dev/null +++ b/support/toolchains.cfg/arm_s3_ssl098 @@ -0,0 +1,19 @@ +_toolchainname="arm_s3_ssl098" +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="Dreambox ARM" +_oscamconfdir_default="/var/keys" +_oscamconfdir_custom="" + +_compiler="arm-simplebuild3-linux-gnueabi-" +_sysroot="arm-simplebuild3-linux-gnueabi/sysroot" +_libsearchdir="/usr/lib" +_toolchainfilename="YXJtX3MzX3NzbDA5OC50YXIueHo="; +_md5sum="02215a912feb4fc499572e5cd53567f2 Toolchain-arm_s3_ssl098.tar.xz" +_tc_info="\n + !!! GENERIC ARM Toolchain !!!\n + with OPENSSL 0.9.8zh \n + \n +\n +"; + +_tc_infolines="6" \ No newline at end of file diff --git a/support/toolchains.cfg/arm_s3_ssl100 b/support/toolchains.cfg/arm_s3_ssl100 new file mode 100644 index 0000000..052b035 --- /dev/null +++ b/support/toolchains.cfg/arm_s3_ssl100 @@ -0,0 +1,19 @@ +_toolchainname="arm_s3_ssl100" +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="Dreambox ARM" +_oscamconfdir_default="/var/keys" +_oscamconfdir_custom="" + +_compiler="arm-simplebuild3-linux-gnueabi-" +_sysroot="arm-simplebuild3-linux-gnueabi/sysroot" +_libsearchdir="/usr/lib" +_toolchainfilename="YXJtX3MzX3NzbDEwMC50YXIueHo="; +_md5sum="0d040f672f57ae37672b6f94413a9d8e Toolchain-arm_s3_ssl100.tar.xz"; +_tc_info="\n + !!! GENERIC ARM Toolchain !!!\n + with OPENSSL 1.0.0t \n + \n +\n +"; + +_tc_infolines="6" \ No newline at end of file diff --git a/support/toolchains.cfg/arm_s3_ssl102 b/support/toolchains.cfg/arm_s3_ssl102 new file mode 100644 index 0000000..376abf7 --- /dev/null +++ b/support/toolchains.cfg/arm_s3_ssl102 @@ -0,0 +1,19 @@ +_toolchainname="arm_s3_ssl102" +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="Dreambox ARM" +_oscamconfdir_default="/var/keys" +_oscamconfdir_custom="" + +_compiler="arm-simplebuild3-linux-gnueabi-" +_sysroot="arm-simplebuild3-linux-gnueabi/sysroot" +_libsearchdir="/usr/lib" +_toolchainfilename="YXJtX3MzX3NzbDEwMi50YXIueHo="; +_md5sum="515ed7582dc8e6044069d4ab34ee35da Toolchain-arm_s3_ssl102.tar.xz"; +_tc_info="\n + !!! GENERIC ARM Toolchain !!!\n + with OPENSSL 1.0.2q \n + \n +\n +"; + +_tc_infolines="6" \ No newline at end of file diff --git a/support/toolchains.cfg/mipsel_s3_ssl098 b/support/toolchains.cfg/mipsel_s3_ssl098 new file mode 100644 index 0000000..41f29f2 --- /dev/null +++ b/support/toolchains.cfg/mipsel_s3_ssl098 @@ -0,0 +1,20 @@ +_toolchainname="mipsel_s3_ssl098"; +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="generic mipsel ssl 0.9.8"; +_oscamconfdir_default="/var/keys"; +_oscamconfdir_custom="" +_compiler="mipsel-simplebuild3-linux-gnu-"; + +_sysroot="/"; +_libsearchdir="/lib"; +_toolchainfilename="bWlwc2VsX3MzX3NzbDA5OC50YXIueHoK"; +_md5sum="966c590d2178f6d401c93993eba4f7f9 Toolchain-mipsel_s3_ssl098.tar.xz"; +_tc_info="\n + !!! generic mipsel ssl 0.9.8 !!!\n + this toolchain is compatible with\n +\n +Dreambox: dm500,dm800,500HD,800HD,800SE,7020HD, + 7025,8000\n +VU+ : Zero,Solo²,SoloSE,SoloSE(V2),Duo,Duo²"; + +_tc_infolines="6"; \ No newline at end of file diff --git a/support/toolchains.cfg/mipsel_s3_ssl100 b/support/toolchains.cfg/mipsel_s3_ssl100 new file mode 100644 index 0000000..a8c1ae8 --- /dev/null +++ b/support/toolchains.cfg/mipsel_s3_ssl100 @@ -0,0 +1,20 @@ +_toolchainname="mipsel_s3_ssl100"; +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="generic mipsel ssl 1.0.0"; +_oscamconfdir_default="/var/keys"; +_oscamconfdir_custom="" + +_compiler="mipsel-simplebuild3-linux-gnu-"; +_sysroot="/"; +_libsearchdir="/lib"; +_toolchainfilename="bWlwc2VsX3MzX3NzbDEwMC50YXIueHoK"; +_md5sum="b1ff681eff62b0e639d37e001b97e1e0 Toolchain-mipsel_s3_ssl100.tar.xz"; +_tc_info="\n + !!! generic mipsel ssl 1.0.0 !!!\n + this toolchain is compatible with\n +\n +Dreambox: dm500,dm800,500HD,800HD,800SE,7020HD, + 7025,8000\n +VU+ : Zero,Solo²,SoloSE,SoloSE(V2),Duo,Duo²"; + +_tc_infolines="6"; \ No newline at end of file diff --git a/support/toolchains.cfg/mipsel_s3_ssl102 b/support/toolchains.cfg/mipsel_s3_ssl102 new file mode 100644 index 0000000..1329fab --- /dev/null +++ b/support/toolchains.cfg/mipsel_s3_ssl102 @@ -0,0 +1,20 @@ +_toolchainname="mipsel_s3_ssl102"; +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="generic mipsel ssl 1.0.2"; +_oscamconfdir_default="/var/keys"; +_oscamconfdir_custom="" + +_compiler="mipsel-simplebuild3-linux-gnu-"; +_sysroot="/"; +_libsearchdir="/lib"; +_toolchainfilename="bWlwc2VsX3MzX3NzbDEwMi50YXIueHoK"; +md5sum="985ba51ae41cacd008fb6c7490e2f287 Toolchain-mipsel_s3_ssl102.tar.xz" +_tc_info="\n + !!! generic mipsel ssl 1.0.2 !!!\n + this toolchain is compatible with\n +\n +Dreambox: dm500,dm800,500HD,800HD,800SE,7020HD, + 7025,8000\n +VU+ : Zero,Solo²,SoloSE,SoloSE(V2),Duo,Duo²"; + +_tc_infolines="6"; diff --git a/support/toolchains.cfg/native b/support/toolchains.cfg/native new file mode 100644 index 0000000..49f38fb --- /dev/null +++ b/support/toolchains.cfg/native @@ -0,0 +1,12 @@ +_toolchainname="native"; +default_use="USE_UTF8 USE_LIBCRYPTO"; +_oscamconfdir_default="/usr/local/etc"; +_oscamconfdir_custom="not_set"; +_compiler="x86_64-linux-gnu-"; +_tc_info="Native System Compiler gcc (Debian 8.2.0-16) 8.2.0 +Copyright (C) 2018 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."; +_libsearchdir="/lib"; +_menuname="native"; +_sysroot="/"; diff --git a/support/toolchains.cfg/openpli40 b/support/toolchains.cfg/openpli40 new file mode 100644 index 0000000..13bbca1 --- /dev/null +++ b/support/toolchains.cfg/openpli40 @@ -0,0 +1,20 @@ +_toolchainname="openpli40" +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="Openpli Dreambox Vu+ and other" +_oscamconfdir_default="/usr/keys" +_oscamconfdir_custom="" + +_compiler="mipsel-openpli40-linux-gnu-" +_sysroot="mipsel-openpli40-linux-gnu/sysroot" +_libsearchdir="/lib" +_toolchainfilename="T3BlblBMSV80LjAudGFyLnh6"; + +_tc_info="\n + !!! beware the box must have FPU !!!\n + this toolchain is compatible with\n +\n +Dreambox: 500HD,800HD,800SE,7020HD,7025,8000\n +VU+ : Zero,Solo²,SoloSE,SoloSE(V2),Duo,Duo²"; + +_tc_infolines="6" + diff --git a/support/toolchains.cfg/openwrt1505cc b/support/toolchains.cfg/openwrt1505cc new file mode 100644 index 0000000..6bcb462 --- /dev/null +++ b/support/toolchains.cfg/openwrt1505cc @@ -0,0 +1,20 @@ +_toolchainname="openwrt1505cc"; +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="OpenWRT 15.05.1 Chaos Calmer" +_oscamconfdir_default="/etc/config/oscam" +_oscamconfdir_custom="/etc/config/oscam" +_stagingdir=1 + +_compiler="mips-openwrt-linux-uclibc-" +_sysroot="" +_libsearchdir="/lib" +_toolchainfilename="b3BlbndydDE1MDVjYy50YXIueHo="; +_block="USE_PCSC" +_tc_info="\n + !!! OpenWRT 15.05.1 Chaos Calmer !!!\n + this toolchain is compatible with\n + fill with info\n +\n +"; + +_tc_infolines="6" \ No newline at end of file diff --git a/support/toolchains.cfg/osmio4k b/support/toolchains.cfg/osmio4k new file mode 100644 index 0000000..13e9fc0 --- /dev/null +++ b/support/toolchains.cfg/osmio4k @@ -0,0 +1,18 @@ +_toolchainname="osmio4k"; +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="Edision OS MIO 4k aarch64"; +_oscamconfdir_default="/var/keys/"; +_oscamconfdir_custom="" + +_compiler="aarch64-osmio4k-linux-gnu-"; +_sysroot="aarch64-osmio4k-linux-gnu/sysroot/"; +_libsearchdir="/lib"; +_toolchainfilename="b3NtaW80ay50YXIueHoK"; +_md5sum="41fbf9b4f91eb61cb926565da644b6ed Toolchain-osmio4k.tar.xz"; +_tc_info="\n + !!! beware the box must have FPU !!!\n + this toolchain is compatible with\n +\n +Edsion : OS MIO 4K aarch64"; + +_tc_infolines="5" diff --git a/support/toolchains.cfg/solo4k b/support/toolchains.cfg/solo4k new file mode 100644 index 0000000..994f04f --- /dev/null +++ b/support/toolchains.cfg/solo4k @@ -0,0 +1,18 @@ +_toolchainname="solo4k"; +default_use="USE_UTF8 USE_LIBCRYPTO"; +_description="VU+ Solo4k"; +_oscamconfdir_default="/var/tuxbox/config"; +_oscamconfdir_custom="" + +_compiler="arm-linux-gnueabihf-"; +_sysroot="arm-linux-gnueabihf"; +_libsearchdir="/lib"; +_toolchainfilename="c29sbzRrLnRhci54ego="; + +_tc_info="\n + !!! beware the box must have FPU !!!\n + this toolchain is compatible with\n +\n +VU+ : Solo4k"; + +_tc_infolines="5" \ No newline at end of file diff --git a/support/translation/de b/support/translation/de new file mode 100644 index 0000000..eee3aed --- /dev/null +++ b/support/translation/de @@ -0,0 +1,113 @@ +#!/bin/bash + +#deutsch +txt_as='als'; +txt_of='von'; +txt_for='für'; +txt_b2="baue"; +txt_to="nach"; +txt_now='nun'; +txt_b1='bauen'; +txt_menu='Menü'; +txt_no='keinen'; +txt_name='Name'; +txt_use='benutze'; +txt_back='zurück'; +txt_done=' fertig'; +txt_error='Fehler'; +txt_missing='fehlt'; +txt_sel='auswählen'; +txt_delete='lösche'; +txt_found='gefunden'; +txt_create='erstelle'; +txt_loading=' lade'; +txt_profile='Profil'; +txt_profiles='Profile'; +txt_conf='Konfiguration'; +txt_parameter='Parameter'; +txt_extracting='entpacke'; +txt_wait='bitte warten...'; +txt_existing='vorhandenen'; +txt_ssh_profiles='SSH $txt_profiles'; +txt_not_found='nicht gefunden'; +txt_n_installed='ist nicht installiert'; +txt_start_menu='Hauptmenü'; +txt_back_main="$txt_back zum $txt_start_menu"; +txt_too_old='(zu alt wird nicht unterstützt)'; +txt_selected='ausgewählten'; +txt_update='aktualisiere'; +txt_example_name='Beispiel: dm820.stube'; +txt_save='speichern'; +txt_filename='Dateiname'; +txt_LOAD="UPLOAD"; +txt_tc="Toolchain"; + +# menu txt +txt_remove_menu="$txt_tc entfernen"; +txt_add_menu="$txt_tc hinzufügen"; +txt_main_revision="\n Die aktuelle SVN REVISION ist : r"; +txt_bmenu_title="Baumenü"; + +# help txt +txt_help1="beginnen mit" +txt_help2="Kommandozeilen Parameter sind" +txt_help3="Taste [ENTER] zum fortsetzen..." + +# firstmenu ################################################ +txt_firstmenu_continue="weiter mit lokalem SVN"; + txt_firstmenu_chose="anderen SVN Stand (7000+) laden"; + txt_firstmenu_cedit="$txt_conf""s Editor starten"; + txt_firstmenu_lang="Systemsprache manuell $txt_sel"; + txt_firstmenu_exit="simplebuild sofort beenden"; + +# _toolchain_config_menu ################################### + txt_config_menu="$txt_conf $txt_menu"; + txt_back_build="$txt_back zum $txt_bmenu_title"; +txt_module_configure="oscam Module $txt_sel"; + txt_oscam_extra="oscam Extras USB/PCSC $txt_sel"; + txt_build_extra="build Extras compress/patch $txt_sel"; + txt_build_load="letzte $txt_conf laden"; + txt_build_save="$txt_conf speichern"; + txt_build_reset="$txt_conf $txt_back setzen"; + txt_use_targz='erstelle tar Archiv nach dem Bauen'; + txt_use_patch='patche oscam vor dem Bauen'; + txt_use_compress='Binärkompression von oscam'; + +# _toolchain_build_menu #################################### + txt_bmenu_user="Benutzername "; + txt_bmenu_comp="Compiler "; + txt_bmenu_debu="Debug Info "; + txt_bmenu_use="USE_Variablen "; + txt_bmenu_build="oscam jetzt $txt_b1"; + txt_bmenu_config="oscam/Build $txt_conf"; +txt_bmenu_profile="vorhandenes $txt_profile laden"; +txt_bmenus_profile="$txt_profile $txt_save"; + txt_bmenu_log="zeige lastbuild.log"; + txt_bmenu_back="$txt_back zur Toolchainauswahl"; + txt_compress1="Dateigröße davor "; + txt_compress2="Dateigröße danach "; + txt_compress3="Dateigröße verkleinert auf"; + +# _toolchain_main_menu #################################### +txt_menu_builder1="Beende simplebuild"; +txt_menu_builder2="einen neuen $txt_tc hinzufügen"; +txt_menu_builder3="entferne einen installierten $txt_tc"; +txt_menu_builder4="Nativ $txt_for"; +txt_menu_back="Zurück zum $txt_tc $txt_menu"; + +# _dialog_checkout ######################################## +txt_verify_syscheck='überprüfe System :'; + txt_verify_svn='überprüfe existierenden SVN :'; + txt_update_svn="$txt_update SVN :"; + txt_prepare_svn="bereite SVN checkout vor :"; + txt_latest="letzter Stand"; + +# _load_profile ########################################### + txt_select_profile_title="Verfügbare $txt_profiles"; + txt_select_profile="bitte ein $txt_profile auswählen"; +txt_confirm_profile_select="bitte bestätigen sie die Auswahl von:"; + txt_no_profile_found="kein $txt_profile gefunden in\n\n$profdir"; + +# _upload_cam ############################################# +txt_upload_cam1="ssh $txt_profile existiert nicht"; +txt_upload_cam2="ssh $txt_profile gefunden"; diff --git a/support/translation/en b/support/translation/en new file mode 100644 index 0000000..44bba45 --- /dev/null +++ b/support/translation/en @@ -0,0 +1,100 @@ +#!/bin/bash + +#english + +txt_as='as'; +txt_of='of'; +txt_for='for'; +txt_b2="build"; +txt_to="to"; +txt_now='now'; +txt_b1='build'; +txt_menu='menu'; +txt_done=' done'; +txt_no='no'; +txt_use='use'; +txt_back='back'; +txt_error='error'; +txt_loading=' load'; +txt_sel='select'; +txt_delete='delete'; +txt_found='found'; +txt_create='create'; +txt_conf='configuration'; +txt_extracting='extracting'; +txt_wait='please wait...'; +txt_existing='exists'; +txt_profiles='profiles'; +txt_not_found='not found'; +txt_n_installed='is not installed'; +txt_back_main="back to main menu"; +txt_too_old='(too old or not supported)'; +txt_selected='selected'; +txt_update='now updating'; +txt_tc="Toolchain"; + +# menu txt +txt_start_menu='Main menu'; +txt_remove_menu='Remove toolchain'; +txt_add_menu='Add toolchain'; +txt_main_revision="\n the local SVN revision is : r"; + +# help txt +txt_help1="begin with" +txt_help2="commandline Parameters are" +txt_help3="[ENTER] to continue..." + +# firstmenu ################################################ +txt_firstmenu_continue="continue with local SVN"; + txt_firstmenu_chose="load a different SVN (7000+)"; + txt_firstmenu_cedit="start configuration editor"; + txt_firstmenu_lang="manual system language selection"; + txt_firstmenu_exit="close simplebuild now"; + +# _toolchain_config_menu ################################### + txt_config_menu="configuration menu"; + txt_back_build="back to build menu"; +txt_module_configure="select oscam modules "; + txt_oscam_extra="select oscam extras USB/PCSC"; + txt_build_extra="select build extras compress/patch"; + txt_build_load="load last configuration"; + txt_build_save="save configuration"; + txt_build_reset="reset configuration"; + +# _toolchain_build_menu##################################### + txt_bmenu_title="build menu"; + txt_bmenu_user="username "; + txt_bmenu_comp="compiler "; + txt_bmenu_debu="debug info "; + txt_bmenu_use="USE_variables "; + txt_bmenu_build="build oscam now"; +txt_bmenu_config="oscam/build configuration"; + txt_bmenu_log="show lastbuild.log"; + txt_bmenu_back="back to toolchain selection"; + txt_compress1="filesize before "; + txt_compress2="filesize after "; + txt_compress3="filesize reduced to "; + +# _toolchain_main_menu##################################### +txt_menu_builder1="close simplebuild"; +txt_menu_builder2="add new toolchain"; +txt_menu_builder3="remove installed toolchain"; +txt_menu_builder4="build native for"; +txt_menu_back="back to toolchain menu"; + +# _dialog_checkout +txt_verify_syscheck='check system :'; + txt_verify_svn='check existing SVN :'; + txt_update_svn="$txt_update SVN :"; + txt_prepare_svn="prepare SVN checkout :"; + txt_latest="latest SVN"; + +# _load_profile ########################################### + txt_select_profile_title="available profiles"; + txt_select_profile="please select a profile"; +txt_confirm_profile_select="please confirm the selection of:"; + txt_no_profile_found="no profile found in\n\n$profdir"; + +# _upload_cam ############################################# +txt_upload_cam1="ssh profile doesn't exist"; +txt_upload_cam2="ssh profile found"; diff --git a/support/translation/fr b/support/translation/fr new file mode 100644 index 0000000..3f3c7f6 --- /dev/null +++ b/support/translation/fr @@ -0,0 +1,158 @@ +#!/bin/bash + +#francais + + + + + + + + + +txt_create='crée dans'; +txt_bmenu_user="Utilisateur "; +txt_bmenu_comp="Compilateur "; +txt_bmenu_debu="Info Debug "; +txt_bmenu_acti="Options Actives"; +txt_wait="Veuillez patienter..."; +txt_build="Compilation"; +txt_to="à"; +txt_lc="utiliser"; +txt_lang_select="Change langue"; +txt_force="Forcer une MAJ rapide"; +txt_back="Retour au choix de la toolchain"; +txt_end="Quitter Simplebuild"; +txt_offline="Hors Ligne"; +txt_error="Erreur"; +txt_LOAD="UPLOAD"; +txt_DOWNLOAD="Téléchargment en cours"; +txt_REMOVE="Supprimer"; +txt_found_in="trouvé dans"; +txt_found_in_archiv="localisé dans archiv"; +txt_buildtime="Temps de Compilation"; +txt_nosvn="Pas de version SVN trouvée"; +txt_with="avec"; +txt_old="Ancien"; +txt_no_stapi="pas de STAPI SH4 disponible !!!"; +txt_rm="effacé"; +txt_help1="démarrer avec"; +txt_help2="les paramètres de lignes de commande possibles sont"; +txt_help3="touche [ENTER] pour continuer..." +txt_compressor1="Choisissez le compresseur de binaires\n pour votre systeme de compilation"; +txt_compressor2="résultat : "; +txt_compressor3="détecté"; +txt_compressor4="non détecté"; +txt_packok="est compressé dans archiv"; +txt_packfail="n'a pu compresser"; +txt_rcheckout="Structure SVN manquante ... Mise à jour, Veuillez Patienter !\n"; +txt_extra1=" Choisissez les options :\n [*] = activer; [ ] = désactiver"; +txt_extra2="Support des lecteurs USB"; +txt_extra3="Support des lecteurs PCSC"; +txt_extra4="Support de STAPI"; +txt_extra5="Support de COOLAPI"; +txt_extra6="Compiler les libs dans OScam"; +txt_extra7="Compacter le binaire oscam en .tar.gz"; +txt_extra8="Compresser le binaire oscam avec UPX"; +txt_checksys1="\n vérification des fichiers\n -------------------------\n"; +txt_checksys2="\n vérification des packages\n -------------------------\n"; +txt_checksys3="est installé"; +txt_checksys4="... nest pas installé"; +txt_checksys5="installé "; +txt_checksys6="... nest pas installé"; +txt_checksys7=" trouvé dans "; +txt_cfg_path1="valeur par défaut"; +txt_cfg_path2="valeur actuelle"; +txt_cfg_path3="répertoire de configuration"; +txt_lib_path1="répertoire de librairies"; +txt_custom_suffix="laissez vide pour utiliser les valeurs par défaut"; +txt_online_update1="version locale"; +txt_online_update2="version en ligne"; +txt_online_update3="Voulez-vous mettre à jour SIMPLEBUILD ?"; +txt_conf_update1="version locale"; +txt_conf_update2="version en ligne"; +txt_conf_update3="Voulez-vous mettre à jour le fichier de CONFIG ?"; +txt_patch="utiliser patch"; +txt_patch_off1="patche(s) trouvé(s) pour suppression\n------------------------------------"; +txt_patch_off2="supprimer patch"; +txt_patch_off3="supprimer"; +txt_patch_off4="fichier de la source"; +txt_patch_on1="patche(s) trouvé(s) pour application\n------------------------------------"; +txt_patch_on2="appliquer patch"; +txt_con_check1="Téléchargement manquant"; +txt_con_check2="taille de toolchain incorrecte. Supprimez et recommencez !"; +txt_con_check3="Téléchargement impossible"; +txt_configure_title="[ CONFIGURATION ]"; +txt_configure_menu0="Configuration"; +txt_configure_menu1="Add-ons, Protocoles, Systèmes CA, Lecteurs de Cartes"; +txt_configure_menu2="Autres Réglages (USB/PCSC/STAPI/COOL/PACK/PATCH/COMPRESS)"; +txt_configure_menu3="Changer le répertoire de config par défaut"; +txt_configure_menu4="Changer le répertoire des librairies par défaut"; +txt_configure_menu5="Choisir le Compresseur Binaire"; +txt_configure_menu6="Choisir un suffixe personnalisé pour le binaire OSCAM"; +txt_configure_menu7="Retour au MENU DE COMPILATION"; +txt_cmdline1="Checkout Revision"; +txt_cmdline2="Checkout trunk"; +txt_cmdline3="prise en compte du profil par défaut"; +txt_cmdline4="prise en compte du profil custom"; +txt_cmdline5="prise en compte du profil saved"; +txt_cmdline6="profil custom absent\n profil par défaut pris en compte"; +txt_cmdline7="profil saved absent\n profile par défaut pris en compte"; +txt_cmd_build1="pas de SVN correct trouvé\n supprimez oscam-svn !!\n ----------------------"; +txt_cmd_build2="SVN effacé\n redemarrez simplebuild !!\n --------------------------------------"; +txt_cmd_build3="appliquer le(s) patche(s)\n -------------------------"; +txt_cmd_build4="patches trouvé(s) pour être appliqué(s)"; +txt_cmd_build5="appliquer le patch"; +txt_cmd_build6="Nettoyer le SVN d'OSCam local"; +txt_cmd_build7="Taille du binaire avant compression"; +txt_cmd_build8="Taille du binaire après compression"; +txt_cmd_build9="Taille du binaire réduite à"; +txt_cmd_build10="supprimer les patches\n ---------------------"; +txt_cmd_build11="patche(s) trouvé(s) pour être appliqués"; +txt_cmd_build12="échec de compilation"; +txt_cmd_build13="voir le fichier build.log"; +txt_cmd_build14="supprimer patch"; +txt_cmd_build_title="[ INFO Compression ]"; +txt_b_menu_title="[ Options de compilation ]"; +txt_b_menu_options1="pas d'options actives"; +txt_b_menu1="[ MENU DE COMPILATION ]"; +txt_b_menu2="Informations"; +txt_b_menu3="Réglages Actuels"; +txt_b_menu4="Configuration et Réglages d'OSCam"; +txt_b_menu5="Compiler OSCam"; +txt_b_menu6="Voir build.log"; +txt_b_menu7="Voir la configuration d'OSCam"; +txt_upload_cam1="le fichier de configuration n'existe pas"; +txt_upload_cam2="le fichier de config existe"; +txt_t_menu1="\n La révision actuelle d'OSCam SVN est : r"; +txt_rem_chains1="Veuillez choisir la toolchain à supprimer"; +txt_add_chains1="AJOUTER Toolchain"; +txt_add_chains2="Veuillez choisir la toolchain à ajouter"; +txt_menu_builder1="Quitter Simplebuild"; +txt_menu_builder2="Nouvelle Toolchain"; +txt_menu_builder3="Toolchain installées"; +txt_menu_builder4="Native pour"; +txt_menu_back="Retour à la sélection de Toolchain"; +txt_cedit1="Supprimer le binaire de debug"; +txt_cedit2="Verifier les Toolchains installées"; +txt_cedit3="Activer le système de Patches Automatique"; +txt_cedit4="Activer la vérification de Mises à jour"; +txt_cedit5="Informations detaillées sur la compilation"; +txt_revcheck1="VERIFICATION DE MISE A JOUR"; +txt_revcheck2="Vérification de la version d'OSCam SVN en ligne\n\t\b"; +txt_revcheck3="Révision disponible:"; +txt_revcheck4="Entrer le numéro de Révision..."; +txt_revcheck5="impossible. SVN hors ligne !"; +txt_revcheck6="Vérification de la version d'OSCam SVN locale\n\t\b"; +txt_revsel1="avec locale:"; +txt_revsel2="Effacer la"; +txt_revsel3="et tous les fichiers de configuration"; +txt_revsel4="Editeur de configuration"; +txt_revsel5="Programme"; +txt_revsel6="Mettre à jour vers la dernière Révision"; +txt_options1="Editer Options :"; +txt_options2="activer"; +txt_options3="activer"; +txt_options4="OK rédemarre Simplebuild"; +txt_options_title="Editeur de Configuration"; +txt_disksvn="révision locale est maintenant " diff --git a/support/translation/it b/support/translation/it new file mode 100644 index 0000000..7cac81d --- /dev/null +++ b/support/translation/it @@ -0,0 +1,149 @@ +#!/bin/bash + +#italiano + +txt_create='creato in'; +txt_bmenu_user="Nome utente "; +txt_bmenu_comp="Compilatore "; +txt_bmenu_debu="Informazioni di Debug "; +txt_bmenu_acti="Caratteristiche attive"; +txt_wait="attendere prego..."; +txt_build="compilo"; +txt_lc="utilizzare"; +txt_to="verso"; +txt_force="Checkout rapido"; +txt_back="Torna al menu Toolchain"; +txt_end="Termina Simplebuild"; +txt_offline="offline"; +txt_error="Errore"; +txt_LOAD="CARICA"; +txt_DOWNLOAD="Sto scaricando"; +txt_REMOVE="RIMUOVI"; +txt_found_in="trovato in"; +txt_found_in_archiv="trovato in archivio"; +txt_buildtime="tempo di compilazione"; +txt_nosvn="nessuna svn trovata"; +txt_with="con"; +txt_old="vecchio"; +txt_no_stapi="nessun sh4 STAPI presente!"; +txt_rm="rimosso"; +txt_help1="inizia con"; +txt_help2="Le linee di comando sono"; +txt_help3="Premi [ENTER] per continuare..." +txt_compressor1="scegli la COMPRESSIONE BINARIA\n per il tuo SISTEMA DI COMPILAZIONE"; +txt_compressor2="Risultato : "; +txt_compressor3="trovato"; +txt_compressor4="non trovato"; +txt_packok="è compresso nell'arvhivio"; +txt_packfail="errore durante la compressione"; +txt_rcheckout=" manca SVN. Vengono cerati aggioranmenti. Attendere prego...\n"; +txt_extra1=" Scegliere le caratteristiche :\n [*] = on; [ ] = off"; +txt_extra2="supporto periferiche USB"; +txt_extra3="supporto periferiche PCSC"; +txt_extra4="utilizza la funzione STAPI"; +txt_extra5="utilizza la funzione COOLAPI"; +txt_extra6="includi le librerie in Oscam"; +txt_extra7="comprimere Oscam come .tar.gz"; +txt_extra8="Comprimere Oscam con UPX"; +txt_checksys1="\n controllo file\n --------------\n"; +txt_checksys2="\n controllo pacchetto\n -------------------\n"; +txt_checksys3="è intallato"; +txt_checksys4="... non è installato"; +txt_checksys5="installato "; +txt_checksys6="... maca"; +txt_checksys7=" trovato in "; +txt_cfg_path1="default è"; +txt_cfg_path2="impostato è"; +txt_cfg_path3="La CONF_DIR è impostata a"; +txt_lib_path1="La LIB_DIR è impostata a"; +txt_custom_suffix="lasciare vuoto per Standard"; +txt_online_update1="versione locale"; +txt_online_update2="versione online"; +txt_online_update3="Volete cambiare alla versione attuale dello script SIMPLEBUILD"; +txt_conf_update1="versione locale"; +txt_conf_update2="versione online"; +txt_conf_update3="Volete cambiare alla versione attuale del file CONFIG"; +txt_patch="usare patch"; +txt_patch_off1="Patch(e) trovati da eliminare\n-----------------------------"; +txt_patch_off2="rimuovi Patch(s)"; +txt_patch_off3="rimuovo"; +txt_patch_off4="files dalla svn"; +txt_patch_on1="Patch(s) da applicare trovati\n-----------------------------"; +txt_patch_on2="Patch(s) applicare"; +txt_con_check1="carico mancanti"; +txt_con_check2="riconosciuta dimensione Toolchain errata! Rimuovo e ricarico."; +txt_con_check3="errore durante il caricamento"; +txt_configure_title="[ CONFIGURAZIONE ]"; +txt_configure_menu0="Configurare"; +txt_configure_menu1="Moduli, Protocolli, Lettori, Carten e Driver per Reader"; +txt_configure_menu2="Caratteristiche (USB/PCSC/PACK/PATCH/STAPI/COOLAPI/COMPRESS)"; +txt_configure_menu3="Configurazioni standard- impostazione directory"; +txt_configure_menu4="Librerie standard- impostazione directory"; +txt_configure_menu6="eigene oscam Endung verwenden"; +txt_configure_menu7="Salvare e tornare al menu di compilazione"; +txt_cmdline1="Revisions Checkout"; +txt_cmdline2="Trunk Checkout"; +txt_cmdline3="utilizza il profilo standard"; +txt_cmdline4="utilizza il profilo personalizzato"; +txt_cmdline5="utilizza il profilo salvato"; +txt_cmdline6="profilo personalizzato non trovato\n utilizzo profilo standard"; +txt_cmdline7="profilo salvato non trovato\n utilizzo profilo standard"; +txt_cmd_build1="nessuna SVN originale trovata\n rimuovi subito oscam-svn !!\n ---------------------------"; +txt_cmd_build2="SVN rimossa\n Riavvia Simplebuild!\n --------------------"; +txt_cmd_build3="applico Patch(s)\n ----------------"; +txt_cmd_build4="trovato Patch(s) da rimuovere"; +txt_cmd_build5="applicare Patch(s)"; +txt_cmd_build6="pulire SVN"; +txt_cmd_build7="Dimensione file prima "; +txt_cmd_build8="Dimensione file dopo "; +txt_cmd_build9="Dimensione file rimpicciolita di"; +txt_cmd_build10="rimuovo Patch(s)\n ----------------"; +txt_cmd_build11="trovato Patch(s) da rimuovere"; +txt_cmd_build12="errore durante la compilazione"; +txt_cmd_build13="leggere build.log" +txt_cmd_build14="rimuovo Patch(s)"; +txt_cmd_build_title="[ INFO compressione ]"; +txt_b_menu_title="[ Opzioni compilazione ]"; +txt_b_menu_options1="nessuna caratteristica attiva" +txt_b_menu1="[ MENU COMPILAZIONE ]"; +txt_b_menu2="Informazioni"; +txt_b_menu3="impostazioni applicate"; +txt_b_menu4="imposta OScam"; +txt_b_menu5="Compilo Oscam"; +txt_b_menu6="Mostra build.log"; +txt_b_menu7="mostra la configurazione OScam"; +txt_upload_cam1="manca il file config"; +txt_upload_cam2="file config trovato"; +txt_t_menu1="\n La versione SVN attuale è : r"; +txt_rem_chains1="Selezione per favore il Toolchain da rimuovere"; +txt_add_chains1="Aggiungi Toolchain"; +txt_add_chains2="Selezionare per favore il Toolchain da aggiungere"; +txt_menu_builder1="Termina Simplebuild"; +txt_menu_builder2="Aggiungi un Toolchain"; +txt_menu_builder3="Rimuovi un Toolchain installato"; +txt_menu_builder4="Nativo per"; +txt_menu_back="Torna al menu Toolchain"; +txt_cedit1="Rimuovi il file .debug"; +txt_cedit2="Controlla i Toolchains installati"; +txt_cedit3="Attiva AUTO PATCH SYSTEM"; +txt_cedit4="Attiva Update Check"; +txt_cedit5="SCRIPT mit maximalen Infos beim bau"; +txt_revcheck1="CONTROLLO_UPDATE"; +txt_revcheck2="Controllo versione ONLINE di Oscam"; +txt_revcheck3="Versione trovata:"; +txt_revcheck4="Immettere il numero della SVN desiderata..."; +txt_revcheck5="impossibile. SVN è offline!"; +txt_revcheck6="Controllare la SVN locale"; +txt_revsel1="Continua con SVN locale:"; +txt_revsel2="SVN"; +txt_revsel3="riscaricare e rimuovere le configurazioni"; +txt_revsel4="Editore configurazioni"; +txt_revsel5="Esci dal programma"; +txt_revsel6="Aggiornare all'ultima versione"; +txt_wrong1="buildcamname errato o non trovato"; +txt_options1="Modifica opzioni:"; +txt_options2="ativare"; +txt_options3="Disattivare"; +txt_options4="OK riavvia SIMPLEBUILD"; +txt_options_title="Editore CONFIG"; +txt_disksvn="revisione locale è ora " diff --git a/support/translation/nl b/support/translation/nl new file mode 100644 index 0000000..fb4ba7e --- /dev/null +++ b/support/translation/nl @@ -0,0 +1,114 @@ +#!/bin/bash + +#nederlands + +txt_as='als'; +txt_of='van'; +txt_for='voor'; +txt_b2="build"; +txt_to="naar"; +txt_now='nu'; +txt_b1='compileren'; +txt_menu='Menu'; +txt_no='geen'; +txt_name='Naam'; +txt_use='gebruik'; +txt_back='terug'; +txt_done=' klaar'; +txt_error='Fout'; +txt_missing='ontbreekt'; +txt_sel='selecteren'; +txt_delete='verwijderen'; +txt_found='gevonden'; +txt_create='maak'; +txt_loading=' laden'; +txt_profile='profiel'; +txt_profiles='Profielen'; +txt_conf='Configuratie'; +txt_parameter='Parameter'; +txt_extracting='uitpakken'; +txt_wait='momentje...'; +txt_existing='bestaande'; +txt_ssh_profiles='SSH $txt_profiles'; +txt_not_found='niet gevonden'; +txt_n_installed='is niet geïnstalleerd'; +txt_start_menu='Hoofdmenu'; +txt_back_main="$txt_back naar $txt_start_menu"; +txt_too_old='(te oud of niet ondersteund)'; +txt_selected='geselecteerd'; +txt_update='nu bijwerken'; +txt_example_name='Voorbeeld: dm820.slaapkmr'; +txt_save='opslaan'; +txt_filename='Bestandsnaam'; +txt_LOAD="UPLOAD"; +txt_tc="Toolchain"; + +# menu txt +txt_remove_menu='$txt_tc verwijderen'; +txt_add_menu='$txt_tc toevoegen'; +txt_main_revision="\n De actuele SVN versie is : r"; +txt_bmenu_title="Buildmenü"; + +# help txt +txt_help1="begin met" +txt_help2="Opdrachtregel parameters zijn" +txt_help3="Druk op [ENTER] om door te gaan..." + +# firstmenu ################################################ +txt_firstmenu_continue="Doorgaan met lokale SVN"; + txt_firstmenu_chose="Andere SVN versie (7000+) laden"; + txt_firstmenu_cedit="$txt_conf""s Editor starten"; + txt_firstmenu_lang="Taal handmatig $txt_sel"; + txt_firstmenu_exit="Afsluiten"; + +# _toolchain_config_menu ################################### + txt_config_menu="$txt_conf $txt_menu"; + txt_back_build="$txt_back naar $txt_bmenu_title"; +txt_module_configure="Oscam module $txt_sel"; + txt_oscam_extra="Oscam extra's USB/PCSC $txt_sel"; + txt_build_extra="build Extra's Compress/Patch $txt_sel"; + txt_build_load="Laatste $txt_conf laden"; + txt_build_save="$txt_conf bewaren"; + txt_build_reset="$txt_conf $txt_back zetten"; + txt_use_targz='maak .tar bestand na het compileren'; + txt_use_patch='patch oscam voor het compileren'; + txt_use_compress='Binaire compressie van oscam'; + +# _toolchain_build_menu #################################### + txt_bmenu_user="Gebruikersnaam "; + txt_bmenu_comp="Compiler "; + txt_bmenu_debu="Debug info "; + txt_bmenu_use="GEBRUIK variabelen "; + txt_bmenu_build="OScam nu $txt_b1"; +txt_bmenu_config="OScam/Build $txt_conf"; +txt_bmenu_profile="beschikbare $txt_profile laden"; +txt_bmenus_profile="$txt_profile $txt_save"; + txt_bmenu_log="Toon lastbuild.log"; + txt_bmenu_back="$txt_back naar $txt_tc selectie"; + txt_compress1="Bestandgrootte eerst "; + txt_compress2="Bestandgrootte na "; + txt_compress3="Bestandgrootte verkleind tot "; + +# _toolchain_main_menu##################################### +txt_menu_builder1="Simplebuild afsluiten"; +txt_menu_builder2="Voeg nieuwe $txt_tc toe"; +txt_menu_builder3="Verwijder geïnstalleerde $txt_tc"; +txt_menu_builder4="Huidig system:"; +txt_menu_back="Naar $txt_tc $txt_menu"; + +# _dialog_checkout +txt_verify_syscheck='Systeem controleren :'; + txt_verify_svn='Huidige SVN controleren :'; + txt_update_svn="SVN $txt_update :"; + txt_prepare_svn="SVN controle voorbereiden :"; + txt_latest="Nieuwste SVN"; + +# _load_profile ########################################### + txt_select_profile_title="Beschikbare $txt_profiles"; + txt_select_profile="Kies een $txt_profile a.u.b."; +txt_confirm_profile_select="Bevestig a.u.b. de keuze van:"; + txt_no_profile_found="geen $txt_profile gevonden in\n\n$profdir"; + +# _upload_cam ############################################# +txt_upload_cam1="ssh $txt_profile bestaat niet"; +txt_upload_cam2="ssh $txt_profiles gevonden"; diff --git a/support/translation/pl b/support/translation/pl new file mode 100644 index 0000000..39f5fe4 --- /dev/null +++ b/support/translation/pl @@ -0,0 +1,115 @@ +#!/bin/bash + +#polski + +txt_as='niż'; +txt_of='z'; +txt_for='dla'; +txt_b2="buduję"; +txt_to="do"; +txt_now='teraz'; +txt_b1='kompiluj'; +txt_menu='menu'; +txt_no='żaden'; +txt_name='nazwa'; +txt_use='użyj'; +txt_back='powrót'; +txt_done=' gotowe'; +txt_error='błąd'; +txt_missing='brak'; +txt_sel='wybierz'; +txt_delete='usuń'; +txt_found='znaleziono'; +txt_create='utwórz'; +txt_loading='ładuj'; +txt_profiles='profil'; +txt_conf='kofiguracja'; +txt_parameter='parametr'; +txt_extracting='rozpakuj'; +txt_wait='proszę czekać ...'; +txt_existing='istniejący'; +txt_ssh_profiles='SSH Profile'; +txt_not_found='nie znaleziono'; +txt_n_installed='nie jest zainstlowane'; +txt_back_main="$txt_back do menu głównego"; +txt_too_old='(zbyt stary nie jest obsługiwany)'; +txt_selected='wybrane'; +txt_update='aktualizacja'; +txt_example_name='przykład: dm820.stube'; +txt_save='zapisz'; +txt_filename='nazwa pliku'; +txt_LOAD="UPLOAD\przesłać"; + +# menu txt +txt_start_menu='menu główne'; +txt_remove_menu='usuń Toolchain'; +txt_add_menu='dodaj Toolchain'; +txt_main_revision="\n aktualna SVN REVISION to : r"; + +# help txt +txt_help1="zaczać z" +txt_help2="wiersz poleceń to" +txt_help3="[ENTER] > dalej ..." + +# firstmenu ################################################ +txt_firstmenu_continue="dalej z lokalnym SVN"; + txt_firstmenu_chose="załaduj inny SVN (od 7000)"; + txt_firstmenu_cedit="$txt_conf"" - wystartuj edytor"; + txt_firstmenu_lang="opcje językowe"; + txt_firstmenu_exit="zakończ Simplebuild"; + +# _toolchain_config_menu ################################### + txt_config_menu="menu konfiguratora"; + txt_back_build="$txt_back do menu kompilacji"; +txt_module_configure="$txt_sel moduły Oscam"; + txt_oscam_extra="$txt_sel kompilacyjne extra USB/PCSC "; + txt_build_extra="$txt_sel kompilacyjne extra Compress/Patch"; + txt_build_load="z$txt_loading ostatnia $txt_conf"; + txt_build_save="$txt_save $txt_conf "; + txt_build_reset="resetuj konfigurację "; + txt_use_targz='$txt_create plik.tar po kompilacji '; + txt_use_patch='użyj Patch przed kompilacją'; + txt_use_compress='spakuj binarke oscam'; + +# _toolchain_build_menu #################################### + txt_bmenu_title="menu kompilacji"; + txt_bmenu_user="nazwa usera "; + txt_bmenu_comp="Compiler "; + txt_bmenu_debu="Debug Info "; + txt_bmenu_use="variable "; + txt_bmenu_build="$txt_b1 OScam"; + txt_bmenu_config="konfiguracja OScam/Build"; +txt_bmenu_profile="załaduj $txt_existing profil"; +txt_bmenus_profile="Profil $txt_save"; + txt_bmenu_log="pokaż lastbuild.log"; + txt_bmenu_back="$txt_back do wyboru Toolchain"; + txt_compress1="wielkość pliku przed "; + txt_compress2="wielkość pliku po "; + txt_compress3="wielkość pliku zmniejszona do"; + +# _toolchain_main_menu #################################### +#txt_menu_title="menu toolchaini"; +txt_menu_builder1="zakończ Simplebuild"; +txt_menu_builder2="dodaj nowy Toolchain"; +txt_menu_builder3="usuń zainstalowany Toolchain"; +txt_menu_builder4="nativ dla"; +txt_menu_back="powrót do menu toolchain"; + +# _dialog_checkout ######################################## +txt_verify_syscheck='sprawdzanie systemu :'; + txt_verify_svn='sprawdzanie istniejącego svn :'; + txt_update_svn="$txt_update svn :"; + txt_prepare_svn="przygotowanie svn checkout :"; + txt_latest="ostatni aktualny"; + +# _load_profile ########################################### + txt_select_profile_title="dostępne profile"; + txt_select_profile="wybierz profil"; +txt_confirm_profile_select="potwierdzić wybór :"; + txt_no_profile_found="nie znaleziono profilu w\n\n$profdir"; + +# _upload_cam ############################################# +txt_upload_cam1="SSH profil nie istnieje"; +txt_upload_cam2="SSH profil znaleziony"; + + diff --git a/support/translation/pt b/support/translation/pt new file mode 100644 index 0000000..8dcc508 --- /dev/null +++ b/support/translation/pt @@ -0,0 +1,150 @@ +#!/bin/bash + +#portugues-portugal + +txt_create='criar em'; +txt_bmenu_user="Utilizador "; +txt_bmenu_comp="Compilador "; +txt_bmenu_debu="Informacao do Debug "; +txt_bmenu_acti="Opcoes Ativadas"; +txt_wait="Por favor Aguarde..."; +txt_build="Compilacao"; +txt_to="para"; +txt_lc="utilizar"; +txt_lang_select="Mudar de Lingua"; +txt_force="Forcar um MAJ rapido"; +txt_back="Voltar para o menu de escolhas da toolchain"; +txt_end="Sair do Simplebuild"; +txt_offline="Desligado"; +txt_error="Erro"; +txt_LOAD="Enviando"; +txt_DOWNLOAD="Descarregando ..."; +txt_REMOVE="Apagar"; +txt_found_in="Encontrar em"; +txt_found_in_archiv="Localizar no arquivo"; +txt_buildtime="Tempo de Compilacao"; +txt_nosvn="Nenhuma Versao SVN encontrada"; +txt_with="com"; +txt_old="Antigo"; +txt_no_stapi="sem STAPI SH4 disponivel !!!"; +txt_rm="apagado"; +txt_help1="iniciar com"; +txt_help2="os parametros das linhas de comando disponiveis sao"; +txt_help3="prime [ENTER] para continuar..." +txt_compressor1="Escolhe o meio de compressao de binarios\n para o seu sistema de compilacao"; +txt_compressor2="resultado : "; +txt_compressor3="detectado"; +txt_compressor4="nao detectado"; +txt_packok="esta compressado no arquivo"; +txt_packfail="nao conseguiu compressar"; +txt_rcheckout="Estructura do SVN nao encontrada ... A actualizar, Por Favor Aguarde !\n"; +txt_extra1=" Escolha as opcoes :\n [*] = Activar; [ ] = Desactivar"; +txt_extra2="Suporte dos leitores USB"; +txt_extra3="Suporte dos leitores PCSC"; +txt_extra4="Suporte do STAPI"; +txt_extra5="Suporte do COOLAPI"; +txt_extra6="Compilar as Librarias dentro do OScam"; +txt_extra7="Compactar o binario do OScam em .tar.gz"; +txt_extra8="Compressar o binario OScam com UPX"; +txt_checksys1="\n Verificacao dos ficheiros \n -------------------------\n"; +txt_checksys2="\n Verificacao dos pacotes\n -------------------------\n"; +txt_checksys3="esta instalado"; +txt_checksys4="... nao esta instalado"; +txt_checksys5="instalado "; +txt_checksys6="... nao esta instalado"; +txt_checksys7=" encotrado em "; +txt_cfg_path1="valor por defeito"; +txt_cfg_path2="valor actual"; +txt_cfg_path3="directorio de configuracoes"; +txt_lib_path1="directorio de librarias"; +txt_custom_suffix="deixar vazio para os valores por defeito"; +txt_online_update1="versao local"; +txt_online_update2="versao online"; +txt_online_update3="Deseja actualizar o seu SIMPLEBUILD ?"; +txt_conf_update1="versao local"; +txt_conf_update2="versao online"; +txt_conf_update3="Deseja actualizar o ficheiro CONFIG ?"; +txt_patch="utilizar o patch"; +txt_patch_off1="patch(s) encontrado(s) para supressao\n------------------------------------"; +txt_patch_off2="apagar o patch"; +txt_patch_off3="apagar"; +txt_patch_off4="ficheiro da fonte"; +txt_patch_on1="patch(s) encontrado(s) para aplicacao\n------------------------------------\n------------------------------------"; +txt_patch_on2="aplicar patch"; +txt_con_check1="Transferencia nao encontrada"; +txt_con_check2="tamanho da toolchain incorrecto. Apague e comece de novo !"; +txt_con_check3="Impossivel transferir"; +txt_configure_title="[ CONFIGURACAO ]"; +txt_configure_menu0="Configuracao"; +txt_configure_menu1="Add-ons, Protocolos, Sistemas CA, Leitores de Cartoes"; +txt_configure_menu2="Outros Parametros (USB/PCSC/STAPI/COOL/PACK/PATCH/COMPRESS)"; +txt_configure_menu3="Mudar o directorio das configs por defeito"; +txt_configure_menu4="Mudar o directorio das librarias por defeito"; +txt_configure_menu5="Escolher o compressor do bianario"; +txt_configure_menu6="Escolher um suffixo personalizado para o binario do OSCAM"; +txt_configure_menu7="Voltar para o MENU DE COMPILACAO"; +txt_cmdline1="Verificacao da Revision "; +txt_cmdline2="Verificacao do trunk"; +txt_cmdline3="consideracao do perfil por defeito"; +txt_cmdline4="consideracao do perfil modificado"; +txt_cmdline5="consideracao do perfil guardado"; +txt_cmdline6="perfil modificado ausente\n perfil por defeito tomado em conta (Selecionado)"; +txt_cmdline7="perfil guardado ausente\n perfil por defeito tomado em conta (Selecionado) "; +txt_cmd_build1="nenhum SVN correcto encontrado\n apague oscam-svn !!\n ----------------------"; +txt_cmd_build2="SVN apagado\n re-inicie o simplebuild !!\n --------------------------------------"; +txt_cmd_build3="aplicar o(s) patch(s) \n -------------------------"; +txt_cmd_build4="patch(s) encontrado(s) para serem aplicado(s)"; +txt_cmd_build5="aplicar o patch"; +txt_cmd_build6="Limpar SVN do OSCam local"; +txt_cmd_build7="Tamanho do bianario antes da compressao"; +txt_cmd_build8="Tamanho do bianario depois da compressao"; +txt_cmd_build9="Tamanho do bianario reduzido a"; +txt_cmd_build10="apagar patch\n ---------------------"; +txt_cmd_build11="patch(s) encontrado(s) para serem aplicado(s)"; +txt_cmd_build12="falha de compilacao"; +txt_cmd_build13="visionar o ficheiro build.log"; +txt_cmd_build14="apagar patch"; +txt_cmd_build_title="[ INFO Compressao ]"; +txt_b_menu_title="[ Opcoes de compilacao ]"; +txt_b_menu_options1="nenhuma Opcao activa"; +txt_b_menu1="[ MENU DE COMPILACAO ]"; +txt_b_menu2="Informacoes"; +txt_b_menu3="Configuracoes Actuais"; +txt_b_menu4="Configuracoes et Parametros do OSCam"; +txt_b_menu5="Compilar OSCam"; +txt_b_menu6="Visionar build.log"; +txt_b_menu7="Ver a configuracao do OSCam"; +txt_upload_cam1="o ficheiro de configuracao nao existe"; +txt_upload_cam2="o ficheiro config existe"; +txt_t_menu1="\n A Revisao actual do OSCam SVN é : r"; +txt_rem_chains1="Por favor escolhe a Toolchain a ser apagada"; +txt_add_chains1="ADICIONAR Toolchain"; +txt_add_chains2="Por favor escolhe a Toolchain a adicionar"; +txt_menu_builder1="Sair do Simplebuild"; +txt_menu_builder2="Nova Toolchain"; +txt_menu_builder3="Toolchain Instaladas"; +txt_menu_builder4="Nativo para"; +txt_menu_back="Voltar á seleccao da(s) Toolchain(s)"; +txt_cedit1="Apagar o binario de debug"; +txt_cedit2="Verificar as Toolchain(s) instaladas"; +txt_cedit3="Activar o sistema de Patch Automatico"; +txt_cedit4="Activar a verificacao de Actualizacoes"; +txt_cedit5="Informacoes detalhadas sobre a compilacao"; +txt_revcheck1="VERIFICACAO DAS ATUALIZACOES"; +txt_revcheck2="Verificacao da versao do OSCam SVN online\n\t\b"; +txt_revcheck3="Revisao disponivel:"; +txt_revcheck4="Insira o numero da Revisao..."; +txt_revcheck5="impossivel. SVN offline !"; +txt_revcheck6="Verificacao da versao do OSCam SVN local\n\t\b"; +txt_revsel1="com local:"; +txt_revsel2="Apagar a"; +txt_revsel3="e todos os ficheiros de configuracao"; +txt_revsel4="Editor de configuracao"; +txt_revsel5="Programa"; +txt_revsel6="Actualizar para a ultima Revisao"; +txt_options1="Editar Opcoes :"; +txt_options2="activar"; +txt_options3="activar"; +txt_options4="OK reinicie o Simplebuild"; +txt_options_title="Editor de Configuracoes"; +txt_disksvn="revisao local esta agora " \ No newline at end of file diff --git a/support/translation/tr b/support/translation/tr new file mode 100644 index 0000000..464d0bf --- /dev/null +++ b/support/translation/tr @@ -0,0 +1,115 @@ +#!/bin/bash + +#turkish + +txt_as='as'; +txt_of='/'; +txt_for='için'; +txt_b2="yapı"; +txt_to="after"; +txt_now='şimdi'; +txt_b1='build'; +txt_menu='Menü'; +txt_no='none'; +txt_name='Ad'; +txt_use='kullanım'; +txt_back='geri dön'; +txt_done='hazır'; +txt_error='hata'; +txt_missing='eksik'; +txt_sel='seçmek'; +txt_delete='sil'; +txt_found='bulundu'; +txt_create='oluştur'; +txt_loading='load'; #7karakter +txt_profile='profil'; +txt_profiles='Profiller'; +txt_conf='yapılandırma'; +txt_parameter='Parametre'; +txt_extracting='ayıklanıyor'; #10karakter +txt_wait='lütfen bekleyin...'; +txt_existing='var'; +txt_ssh_profiles="SSH $txt_profiles"; +txt_not_found='bulunamadı'; +txt_n_installed='yüklü değil'; +txt_start_menu='Ana menü'; +txt_back_main="$txt_start_menu'ye geri dön"; +txt_too_old='(çok eski desteklenmiyor)'; +txt_selected='seçildi'; +txt_update='güncelleniyor'; +txt_example_name='Örnek:dm820.stube'; +txt_save='kayıt'; +txt_filename='dosya adı'; +txt_LOAD="UPLOAD"; +txt_tc="Toolchain"; + +# menu txt +txt_start_menu='Ana menü'; +txt_remove_menu="$txt_tc kaldır"; +txt_add_menu="$txt_tc ekle"; +txt_main_revision="\n yerel SVN revizyonu : r"; + +# help txt +txt_help1="ile başla" +txt_help2="komut satırıyla başlayın Parametreler" +txt_help3="[ENTER] ile devam eder ..." + +# firstmenu #################### ########################### +txt_firstmenu_continue="yerel SVN ile devam et"; + txt_firstmenu_chose="Farklı bir SVN yükle (7000+)"; + txt_firstmenu_cedit="yapılandırma düzenleyicisini başlat"; + txt_firstmenu_lang="sistem dili seç"; + txt_firstmenu_exit="Simplebuild'i kapat"; + +# _toolchain_config_menu ##################################### + txt_config_menu="yapılandırma menüsü"; + txt_back_build="menüye geri dön"; +txt_module_configure="oscam modüllerini seç"; + txt_oscam_extra="USB/PCSC ekstralarını seçin"; + txt_build_extra="build ekstralar sıkıştır / yama seç"; + txt_build_load="son yapılandırmayı yükle"; + txt_build_save="konfigürasyonu kaydet"; + txt_build_reset="yapılandırmayı sıfırla"; + txt_use_targz='oscam derlemeden sonra file.tar.gz'; + txt_use_patch="patch yamasını oscam'a ekle"; + txt_use_compress="Oscam'den ikili sıkıştırma"; + +# _toolchain_build_menu #################################### + txt_bmenu_title="menü oluşturma"; + txt_bmenu_user="kullanıcı adı "; + txt_bmenu_comp="derleyici "; + txt_bmenu_debu="hata ayıklama bilgisi"; + txt_bmenu_use="USE_değişkenler "; + txt_bmenu_build="şimdi oscam oluştur"; +txt_bmenu_config="oscam/build yapılandırma"; +txt_bmenu_profile="mevcut $txt_profile ile yükle"; +txt_bmenus_profile="$txt_profile $txt_save et"; + txt_bmenu_log="göster lastbuild.log"; + txt_bmenu_back="$txt_tc seçimine geri dön"; + txt_compress1="önce dosya boyutu "; + txt_compress2="sonra dosya boyutu "; + txt_compress3="dosya boyutu azaldı "; + +# _toolchain_main_menu ###################################### +txt_menu_builder1="close simplebuild"; +txt_menu_builder2="yeni $txt_tc ekle"; +txt_menu_builder3="yüklü $txt_tc kaldır"; +txt_menu_builder4="mevcut yerel yapı için oluştur"; +txt_menu_back="$txt_tc menüsüne geri dön"; + +# _dialog_checkout +txt_verify_syscheck="sistemi kontrol et :"; + txt_verify_svn="mevcut SVN'yi kontrol et :"; + txt_update_svn="$txt_update SVN :"; + txt_prepare_svn="SVN ödemesini hazırla :"; + txt_latest="en son SVN"; + +# _load_profile ############################################ + txt_select_profile_title="kullanılabilir profiller "; + txt_select_profile="lütfen bir profil seçin"; +txt_confirm_profile_select="lütfen seçiminizi onaylayın:"; + txt_no_profile_found="içinde profil bulunamadı\n\n$profdir"; + +# _upload_cam ########################################### +txt_upload_cam1="ssh profili mevcut değil "; +txt_upload_cam2="ssh profili bulundu";