diff --git a/configure.ac b/configure.ac index 4fd1240d09b71b98da655dd273c957f0d57f5a9a..8011643371a846849d0bf67cd1f7bcf5769be1fa 100644 --- a/configure.ac +++ b/configure.ac @@ -199,7 +199,7 @@ case "${host_os}" in AX_APPEND_FLAG([-Wl,-headerpad_max_install_names], [LDFLAGS]) VLC_ADD_LIBS([libvlc vlc],[-Wl,-undefined,dynamic_lookup,-framework,AppKit]) - VLC_ADD_LIBS([libvlccore],[-Wl,-framework,CoreFoundation,-framework,CoreServices]) + VLC_ADD_LIBS([libvlccore],[-Wl,-framework,CoreFoundation]) AC_EGREP_CPP(yes, [#import @@ -220,6 +220,8 @@ case "${host_os}" in ac_cv_func_fork=no ],) + AS_IF([test "${HAVE_OSX}" = "1"],[VLC_ADD_LIBS([libvlccore],[-Wl,-framework,CoreServices])]) + dnl dnl Handle Mac OS X SDK flags dnl diff --git a/contrib/bootstrap b/contrib/bootstrap index 5ed5f6f25d31cd54b8f1dc96c88faad6a926cd72..2394201e3ef0da8b43cfcca0b333c3067a13db2e 100755 --- a/contrib/bootstrap +++ b/contrib/bootstrap @@ -258,12 +258,16 @@ test -z "$WITH_OPTIMIZATION" || add_make_enabled "WITH_OPTIMIZATION" test -z "$ENABLE_PDB" || add_make_enabled "ENABLE_PDB" test "`uname -o 2>/dev/null`" != "Msys" || add_make "CMAKE_GENERATOR := -G \"MSYS Makefiles\"" +# Additional file used by Darwin to opt-out some function detection +SYMBOL_FILE= + # # Checks # OS="${HOST#*-}" # strip architecture case "${OS}" in *-darwin*) + SYMBOL_FILE="\$(TOPSRC)/../extras/package/apple/symbols.mak" if test -z "$BUILDFORIOS" then check_macosx_sdk @@ -358,6 +362,11 @@ TOPSRC_BUILT=$(python3 -c "import os; print(os.path.relpath('$BOOTSTRAP_PATH', ' add_make "TOPSRC = $TOPSRC" add_make "TOPSRC_BUILT = $TOPSRC_BUILT" add_make "TOPDST = .." + +if [ ! -z "${SYMBOL_FILE}" ]; then +add_make "include ${SYMBOL_FILE}" +fi + add_make "-include config.mak" add_make 'include $(TOPSRC)/src/main.mak' echo "Bootstrap completed." diff --git a/contrib/src/ffmpeg/rules.mak b/contrib/src/ffmpeg/rules.mak index d78b93ecb659c5a74e8fcd2f13aded916052fcc0..187d513aa14f2af442a028108ea737368beeb1ed 100644 --- a/contrib/src/ffmpeg/rules.mak +++ b/contrib/src/ffmpeg/rules.mak @@ -222,7 +222,7 @@ ifeq ($(call need_pkg,"libavcodec >= $(FFMPEG_LAVC_MIN) libavformat >= 53.21.0 l PKGS_FOUND += ffmpeg endif -FFMPEGCONF += --nm="$(NM)" --ar="$(AR)" +FFMPEGCONF += --nm="$(NM)" --ar="$(AR)" --ranlib="$(RANLIB)" $(TARBALLS)/ffmpeg-$(FFMPEG_BASENAME).tar.xz: $(call download_git,$(FFMPEG_GITURL),,$(FFMPEG_HASH)) diff --git a/contrib/src/gcrypt/0001-cipher-Makefile.am-force-tag-CC-for-.S-files.patch b/contrib/src/gcrypt/0001-cipher-Makefile.am-force-tag-CC-for-.S-files.patch new file mode 100644 index 0000000000000000000000000000000000000000..34c7a0cebece2095ce411cd233753d5e3e0d3f40 --- /dev/null +++ b/contrib/src/gcrypt/0001-cipher-Makefile.am-force-tag-CC-for-.S-files.patch @@ -0,0 +1,29 @@ +From e09d5f889ce7c00e9ebe6ef0173aa7a27b975646 Mon Sep 17 00:00:00 2001 +From: Alexandre Janniaux +Date: Fri, 24 Apr 2020 10:26:25 +0200 +Subject: [PATCH] cipher: Makefile.am: force --tag=CC for .S files + +When building the library for armv7 on iOS, the following error prevents +the success of the compilation: + +libtool: compile: unable to infer tagged configuration +libtool: error: specify a tag with '--tag' +--- + cipher/Makefile.am | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/cipher/Makefile.am b/cipher/Makefile.am +index ac0ec58e..a2cb409c 100644 +--- a/cipher/Makefile.am ++++ b/cipher/Makefile.am +@@ -125,3 +125,8 @@ tiger.o: $(srcdir)/tiger.c + + tiger.lo: $(srcdir)/tiger.c + `echo $(LTCOMPILE) -c $(srcdir)/tiger.c | $(o_flag_munging) ` ++ ++SUFFIXES = .S ++ ++.S.lo: ++ $(LIBTOOL) --mode compile --tag=CC $(CC) $(CFLAGS) $(CPPFLAGS) -c -I ../ "$<" -o "$@" +-- +2.26.1 diff --git a/contrib/src/gcrypt/rules.mak b/contrib/src/gcrypt/rules.mak index 0e57d1f8eb209c72855b8c62d166cbcac01d40b7..a92790fe7fa6ca32d1f3812b00f54b4fd3d737a5 100644 --- a/contrib/src/gcrypt/rules.mak +++ b/contrib/src/gcrypt/rules.mak @@ -29,6 +29,8 @@ ifeq ($(ARCH),mips64el) $(APPLY) $(SRC)/gcrypt/clang-mips64.patch endif endif + # Ensure we can compile the assembly code in cipher, for armv7 ios builds + $(APPLY) $(SRC)/gcrypt/0001-cipher-Makefile.am-force-tag-CC-for-.S-files.patch $(MOVE) DEPS_gcrypt = gpg-error diff --git a/contrib/src/gpg-error/darwin-triplet.patch b/contrib/src/gpg-error/darwin-triplet.patch index dd0fef95de3db2a6fb75673463c981d92819d6d4..8cf92b1101361893e43179e05b23c234a8c06dad 100644 --- a/contrib/src/gpg-error/darwin-triplet.patch +++ b/contrib/src/gpg-error/darwin-triplet.patch @@ -1,11 +1,19 @@ ---- libgpg-error-1.27_orig/src/mkheader.c 2017-02-28 13:32:33.000000000 +0100 -+++ libgpg-error-1.27/src/mkheader.c 2020-01-23 11:36:50.000000000 +0100 -@@ -107,7 +107,21 @@ - return xstrdup (lastalias); - } - } -- return xstrdup (triplet); -+ /* Darwin triplet de-versioning */ +diff --git a/src/mkheader.c b/src/mkheader.c +index 5aeb1e7..121d029 100644 +--- a/src/mkheader.c ++++ b/src/mkheader.c +@@ -91,23 +91,41 @@ canon_host_triplet (const char *triplet) + {"armv5-unknown-linux-musleabi" }, + {"armv6-unknown-linux-musleabihf" }, + ++ {"armv7-apple-darwin", "arm-apple-darwin"}, ++ + { NULL } + }; + int i; + const char *lastalias = NULL; + ++ /* Darwin triplet de-versioning */ + char *res_triplet = xstrdup (triplet); + + char *triplet_last = strrchr(res_triplet, '-'); @@ -18,8 +26,21 @@ + if (strncmp("darwin", triplet_last, 6) == 0) { + triplet_last[6] = '\0'; + } ++ + for (i=0; tbl[i].name; i++) + { + if (tbl[i].alias) + lastalias = tbl[i].alias; +- if (!strcmp (tbl[i].name, triplet)) ++ if (!strcmp (tbl[i].name, res_triplet)) + { + if (!lastalias) + break; /* Ooops: first entry has no alias. */ ++ free(res_triplet); + return xstrdup (lastalias); + } + } +- return xstrdup (triplet); + + return res_triplet; } - - diff --git a/contrib/src/live555/rules.mak b/contrib/src/live555/rules.mak index 4f9b70d452da4f743ea79ee618f5c620b6b78158..6739f747a3684392a58b8ea5080933f0281aa953 100644 --- a/contrib/src/live555/rules.mak +++ b/contrib/src/live555/rules.mak @@ -87,7 +87,7 @@ ifdef HAVE_ANDROID # Don't use unavailable off64_t functions $(APPLY) $(SRC)/live555/file-offset-bits-64.patch endif - + cd $(UNPACK_DIR) && sed -i.orig "s,LIBRARY_LINK =.*,LIBRARY_LINK = $(AR) cr ,g" config.macosx mv live.$(LIVE555_VERSION) $@ && touch $@ SUBDIRS=groupsock liveMedia UsageEnvironment BasicUsageEnvironment diff --git a/contrib/src/main.mak b/contrib/src/main.mak index 0a731f11dcc3396af19b6532b381e7205b9327b3..f008b20a99d40c30452fdcd6c6d28e6a344aa5a6 100644 --- a/contrib/src/main.mak +++ b/contrib/src/main.mak @@ -70,6 +70,7 @@ endif ifneq ($(findstring $(origin AR),undefined default),) AR := ar endif +NM ?= nm RANLIB ?= ranlib STRIP ?= strip WIDL ?= widl @@ -88,6 +89,7 @@ endif ifneq ($(findstring $(origin AR),undefined default),) AR := $(HOST)-ar endif +NM ?= $(HOST)-nm RANLIB ?= $(HOST)-ranlib STRIP ?= $(HOST)-strip WIDL ?= $(HOST)-widl @@ -580,15 +582,13 @@ ifdef HAVE_DARWIN_OS echo "set(CMAKE_C_FLAGS \"$(CFLAGS)\")" >> $@ echo "set(CMAKE_CXX_FLAGS \"$(CXXFLAGS)\")" >> $@ echo "set(CMAKE_LD_FLAGS \"$(LDFLAGS)\")" >> $@ - echo "set(CMAKE_AR ar CACHE FILEPATH \"Archiver\")" >> $@ ifdef HAVE_IOS echo "set(CMAKE_OSX_SYSROOT $(IOS_SDK))" >> $@ else echo "set(CMAKE_OSX_SYSROOT $(MACOSX_SDK))" >> $@ endif -else - echo "set(CMAKE_AR $(AR) CACHE FILEPATH \"Archiver\")" >> $@ endif + echo "set(CMAKE_AR $(AR) CACHE FILEPATH \"Archiver\")" >> $@ ifdef HAVE_CROSS_COMPILE echo "set(_CMAKE_TOOLCHAIN_PREFIX $(HOST)-)" >> $@ ifdef HAVE_ANDROID diff --git a/contrib/src/vpx/libvpx-remove-bitcode.patch b/contrib/src/vpx/libvpx-remove-bitcode.patch new file mode 100644 index 0000000000000000000000000000000000000000..80de6e5700bf5d3bc245277103db1ef037a7f917 --- /dev/null +++ b/contrib/src/vpx/libvpx-remove-bitcode.patch @@ -0,0 +1,17 @@ +diff --git a/build/make/configure.sh b/build/make/configure.sh +index d05d0fa12..0ebf74039 100644 +--- a/build/make/configure.sh ++++ b/build/make/configure.sh +@@ -1129,12 +1129,6 @@ EOF + fi + ;; + esac +- +- if [ "$(show_darwin_sdk_major_version iphoneos)" -gt 8 ]; then +- check_add_cflags -fembed-bitcode +- check_add_asflags -fembed-bitcode +- check_add_ldflags -fembed-bitcode +- fi + fi + + asm_conversion_cmd="${source_path}/build/make/ads2gas_apple.pl" diff --git a/contrib/src/vpx/rules.mak b/contrib/src/vpx/rules.mak index 8576e27c6ebe6024df5bee7c35a1757acdc15d2c..439ee6ad372397be6efbc9880306783ebeab0214 100644 --- a/contrib/src/vpx/rules.mak +++ b/contrib/src/vpx/rules.mak @@ -21,6 +21,7 @@ ifdef HAVE_ANDROID cp "${ANDROID_NDK}"/sources/android/cpufeatures/cpu-features.c $(UNPACK_DIR)/vpx_ports cp "${ANDROID_NDK}"/sources/android/cpufeatures/cpu-features.h $(UNPACK_DIR) endif + $(APPLY) $(SRC)/vpx/libvpx-remove-bitcode.patch $(MOVE) DEPS_vpx = diff --git a/extras/ci/gitlab-ci.yml b/extras/ci/gitlab-ci.yml index 8e3d0f33432c5d734d732f107be3d22ba589abf2..7f796fd72598411a3af90e28acccd83220fef956 100644 --- a/extras/ci/gitlab-ci.yml +++ b/extras/ci/gitlab-ci.yml @@ -60,6 +60,12 @@ variables: TRIPLET: $HOST_ARCH-apple-iphoneos MAKEFLAGS: -j4 +.variables-ios-armv7: &variables-ios-armv7 + VLC_PATH: /Users/videolanci/sandbox/bin + HOST_ARCH: armv7 + TRIPLET: $HOST_ARCH-apple-iphoneos + MAKEFLAGS: -j4 + .variables-android-arm: &variables-android-arm ANDROID_ARCH: arm TRIPLET: arm-linux-androideabi @@ -317,6 +323,10 @@ ios-arm64: extends: .ios-common variables: *variables-ios-arm64 +ios-armv7: + extends: .ios-common + variables: *variables-ios-armv7 + # # Android # diff --git a/extras/package/apple/build.sh b/extras/package/apple/build.sh index 32426f423d2b16ebbd555ee869db52f9b0e39e20..9fe87a7c51089bb23a9771a73456ccdc67052b5d 100755 --- a/extras/package/apple/build.sh +++ b/extras/package/apple/build.sh @@ -26,7 +26,7 @@ # shared: Shared libraries and modules # Dir of this script -readonly VLC_SCRIPT_DIR="${BASH_SOURCE%/*}" +readonly VLC_SCRIPT_DIR="$(cd "${BASH_SOURCE%/*}"; pwd)" # Verify script run location [ ! -f "$(pwd)/../src/libvlc.h" ] \ @@ -97,6 +97,17 @@ VLC_DISABLE_DEBUG=0 # whether to compile with bitcode or not VLC_USE_BITCODE=0 +# Tools to be used +VLC_HOST_CC="$(xcrun --find clang)" +VLC_HOST_CPP="$(xcrun --find clang) -E" +VLC_HOST_CXX="$(xcrun --find clang++)" +VLC_HOST_OBJC="$(xcrun --find clang)" +VLC_HOST_LD="$(xcrun --find ld)" +VLC_HOST_AR="$(xcrun --find ar)" +VLC_HOST_STRIP="$(xcrun --find strip)" +VLC_HOST_RANLIB="$(xcrun --find ranlib)" +VLC_HOST_NM="$(xcrun --find nm)" + ########################################################## # Helper functions # ########################################################## @@ -208,7 +219,7 @@ validate_architecture() # Architecture string set_host_triplet() { - local triplet_arch=$(${CC:-cc} -arch "$1" -dumpmachine | cut -d- -f 1) + local triplet_arch=$(${VLC_HOST_CC:-cc} -arch "$1" -dumpmachine | cut -d- -f 1) # We can not directly use the compiler value here as when building for # x86_64 iOS Simulator the triplet will match the build machine triplet # exactly, which will cause autoconf to assume we are not cross-compiling. @@ -298,17 +309,22 @@ set_host_envvars() export CXXFLAGS="$clike_flags" export OBJCFLAGS="$clike_flags" - export LDFLAGS="$VLC_DEPLOYMENT_TARGET_LDFLAG -arch $VLC_HOST_ARCH" - - # Tools to be used - export CC="clang" - export CPP="clang -E" - export CXX="clang++" - export OBJC="clang" - export LD="ld" - export AR="ar" - export STRIP="strip" - export RANLIB="ranlib" + # Vanilla clang doesn't use VLC_DEPLOYMENT_TAGET_LDFLAGS but only the CFLAGS variant + export LDFLAGS="$VLC_DEPLOYMENT_TARGET_LDFLAG $VLC_DEPLOYMENT_TARGET_CFLAG -arch $VLC_HOST_ARCH" +} + +hostenv() +{ + CC="${VLC_HOST_CC}" \ + CPP="${VLC_HOST_CPP}" \ + CXX="${VLC_HOST_CXX}" \ + OBJC="${VLC_HOST_OBJC}" \ + LD="${VLC_HOST_LD}" \ + AR="${VLC_HOST_AR}" \ + STRIP="${VLC_HOST_STRIP}" \ + RANLIB="${VLC_HOST_RANLIB}" \ + NM="${VLC_HOST_NM}" \ + "$@" } # Write config.mak for contribs @@ -330,7 +346,8 @@ write_config_mak() local vlc_cxxflags="$clike_flags" local vlc_objcflags="$clike_flags" - local vlc_ldflags="$VLC_DEPLOYMENT_TARGET_LDFLAG -arch $VLC_HOST_ARCH" + # Vanilla clang doesn't use VLC_DEPLOYMENT_TAGET_LDFLAGS but only the CFLAGS variant + local vlc_ldflags="$VLC_DEPLOYMENT_TARGET_LDFLAG $VLC_DEPLOYMENT_TARGET_CFLAG -arch $VLC_HOST_ARCH" echo "Creating makefile..." test -e config.mak && unlink config.mak @@ -342,14 +359,15 @@ write_config_mak() printf '%s := %s\n' "CXXFLAGS" "${vlc_cxxflags}" >&3 printf '%s := %s\n' "OBJCFLAGS" "${vlc_objcflags}" >&3 printf '%s := %s\n' "LDFLAGS" "${vlc_ldflags}" >&3 - printf '%s := %s\n' "CC" "clang" >&3 - printf '%s := %s\n' "CPP" "clang -E" >&3 - printf '%s := %s\n' "CXX" "clang++" >&3 - printf '%s := %s\n' "OBJC" "clang" >&3 - printf '%s := %s\n' "LD" "ld" >&3 - printf '%s := %s\n' "AR" "ar" >&3 - printf '%s := %s\n' "STRIP" "strip" >&3 - printf '%s := %s\n' "RANLIB" "ranlib" >&3 + printf '%s := %s\n' "CC" "${VLC_HOST_CC}" >&3 + printf '%s := %s\n' "CPP" "${VLC_HOST_CPP}" >&3 + printf '%s := %s\n' "CXX" "${VLC_HOST_CXX}" >&3 + printf '%s := %s\n' "OBJC" "${VLC_HOST_OBJC}" >&3 + printf '%s := %s\n' "LD" "${VLC_HOST_LD}" >&3 + printf '%s := %s\n' "AR" "${VLC_HOST_AR}" >&3 + printf '%s := %s\n' "STRIP" "${VLC_HOST_STRIP}" >&3 + printf '%s := %s\n' "RANLIB" "${VLC_HOST_RANLIB}" >&3 + printf '%s := %s\n' "NM" "${VLC_HOST_NM}" >&3 } # Generate the source file with the needed array for @@ -423,6 +441,9 @@ do VLC_PREBUILT_CONTRIBS_URL=*) VLC_PREBUILT_CONTRIBS_URL="${1#VLC_PREBUILT_CONTRIBS_URL=}" ;; + -j*) + VLC_USE_NUMBER_OF_CORES=${1#-j} + ;; *) echo >&2 "ERROR: Unrecognized option '$1'" usage @@ -521,7 +542,10 @@ echo "Building needed tools (if missing)" cd "$VLC_SRC_DIR/extras/tools" || abort_err "Failed cd to tools dir" ./bootstrap || abort_err "Bootstrapping tools failed" $MAKE -j$VLC_USE_NUMBER_OF_CORES || abort_err "Building tools failed" - +if [ $VLC_HOST_ARCH = "armv7" ]; then +$MAKE -j$VLC_USE_NUMBER_OF_CORES .buildgas \ + || abort_err "Building gas-preprocessor tool failed" +fi echo "" ########################################################## @@ -535,6 +559,7 @@ fi # Set symbol blacklist for autoconf vlcSetSymbolEnvironment > /dev/null +. "${VLC_SCRIPT_DIR}/symbols.mak" # Combine settings from config file VLC_CONTRIB_OPTIONS=( "${VLC_CONTRIB_OPTIONS_BASE[@]}" ) @@ -630,7 +655,7 @@ cd "${VLC_BUILD_DIR}/build" || abort_err "Failed cd to VLC build dir" # Create VLC install dir if it does not already exist mkdir -p "$VLC_INSTALL_DIR" -../../configure \ +hostenv ../../configure \ --with-contrib="$VLC_CONTRIB_INSTALL_DIR" \ --host="$VLC_HOST_TRIPLET" \ --prefix="$VLC_INSTALL_DIR" \ @@ -689,7 +714,7 @@ VLC_PLUGINS_SYMBOL_LIST=() # Find all static plugins in build dir while IFS= read -r -d $'\0' plugin_path; do # Get module entry point symbol name (_vlc_entry__MODULEFULLNAME) - nm_symbol_output=( $(nm "$plugin_path" | grep _vlc_entry__) ) \ + nm_symbol_output=( $(${VLC_HOST_NM} "$plugin_path" | grep _vlc_entry__) ) \ || abort_err "Failed to find module entry function in '$plugin_path'" symbol_name="${nm_symbol_output[2]:1}" @@ -704,7 +729,7 @@ VLC_STATIC_MODULELIST_NAME="static-module-list" rm -f "${VLC_STATIC_MODULELIST_NAME}.c" "${VLC_STATIC_MODULELIST_NAME}.o" gen_vlc_static_module_list "${VLC_STATIC_MODULELIST_NAME}.c" "${VLC_PLUGINS_SYMBOL_LIST[@]}" -${CC:-cc} -c ${CFLAGS} "${VLC_STATIC_MODULELIST_NAME}.c" \ +${VLC_HOST_CC:-cc} -c ${CFLAGS} "${VLC_STATIC_MODULELIST_NAME}.c" \ || abort_err "Compiling module list file failed" echo "${VLC_BUILD_DIR}/static-lib/${VLC_STATIC_MODULELIST_NAME}.o" \ diff --git a/extras/package/apple/symbols.mak b/extras/package/apple/symbols.mak new file mode 100644 index 0000000000000000000000000000000000000000..50afaefa0021b5a04e83e579d74375ebf3da151c --- /dev/null +++ b/extras/package/apple/symbols.mak @@ -0,0 +1,37 @@ +# +# WARNING: +# +# This file is sourced in bash scripts and included in Makefile. +# It must not use syntax elements other than: +# - foo=bar (without spaces around = character) +# - export foo +# - export foo=bar + +# The following symbols do not exist on the minimal macOS / iOS, so they are disabled +# here. This allows compilation also with newer macOS SDKs. +# List assumes macOS 10.10 / iOS 8 at minimum. + +# Added symbols in macOS 10.12 / iOS 10 / watchOS 3 +export ac_cv_func_basename_r=no +export ac_cv_func_clock_getres=no +export ac_cv_func_clock_gettime=no +export ac_cv_func_clock_settime=no +export ac_cv_func_dirname_r=no +export ac_cv_func_getentropy=no +export ac_cv_func_mkostemp=no +export ac_cv_func_mkostemps=no +export ac_cv_func_timingsafe_bcmp=no + +# Added symbols in macOS 10.13 / iOS 11 / watchOS 4 / tvOS 11 +export ac_cv_func_open_wmemstream=no +export ac_cv_func_fmemopen=no +export ac_cv_func_open_memstream=no +export ac_cv_func_futimens=no +export ac_cv_func_utimensat=no + +# Added symbol in macOS 10.14 / iOS 12 / tvOS 9 +export ac_cv_func_thread_get_register_pointer_values=no + +# Added symbols in macOS 10.15 / iOS 13 / tvOS 13 +export ac_cv_func_aligned_alloc=no +export ac_cv_func_timespec_get=no diff --git a/extras/package/macosx/env.build.sh b/extras/package/macosx/env.build.sh index c749f8dd374cb5ff39599b92121bdf8e470d05ac..755722fb9b1f0fd6079f50705ad8c990d5a04acd 100755 --- a/extras/package/macosx/env.build.sh +++ b/extras/package/macosx/env.build.sh @@ -39,6 +39,9 @@ vlcSetBaseEnvironment() { export CXX="$(xcrun --find clang++)" export OBJC="$(xcrun --find clang)" export OBJCXX="$(xcrun --find clang++)" + export AR="$(xcrun --find ar)" + export RANLIB="$(xcrun --find ranlib)" + export NM="$(xcrun --find nm)" python3Path=$(echo /Library/Frameworks/Python.framework/Versions/3.*/bin | awk '{print $1;}') if [ ! -d "$python3Path" ]; then