diff --git a/WineLib/run-more.sh b/WineLib/run-more.sh index c67cea3..0c2d588 100755 --- a/WineLib/run-more.sh +++ b/WineLib/run-more.sh @@ -4,62 +4,19 @@ if [[ ! -d "$CURRENT_DIR/usr" ]]; then zenity --info --text=未安装运行库,无法运行 --no-wrap exit fi -command="" -if [[ -d "$CURRENT_DIR/usr/lib/i386-linux-gnu" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib/i386-linux-gnu\" /usr/lib/i386-linux-gnu " - if [[ ! -d /usr/lib/i386-linux-gnu ]] && ; then - pkexec mkdir -p /usr/lib/i386-linux-gnu - fi +if [[ ! -d "$CURRENT_DIR/usr/lib64" ]]; then + bwrap --dev-bind / / \ + --ro-bind "$CURRENT_DIR/usr/lib" /lib \ + --ro-bind "$CURRENT_DIR/usr" /usr \ + --ro-bind /usr/share /usr/share \ + --ro-bind /usr/bin /usr/bin \ + --ro-bind /usr/sbin /usr/sbin \ + -- "$@" + exit fi -if [[ -d "$CURRENT_DIR/usr/lib/x86_64-linux-gnu" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib/x86_64-linux-gnu\" /usr/lib/x86_64-linux-gnu " - if [[ ! -d /usr/lib/x86_64-linux-gnu/ ]]; then - pkexec mkdir -p /usr/lib/x86_64-linux-gnu/ - fi +if [[ ! -f /lib64 ]] && [[ ! -d /lib64 ]] && [[ ! -L /lib64 ]]; then + pkexec ln -s /usr/lib64 /lib64 fi -if [[ -d "$CURRENT_DIR/usr/lib/arm-linux-gnueabihf" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib/arm-linux-gnueabihf\" /usr/lib/arm-linux-gnueabihf " - if [[ ! -d /usr/lib/arm-linux-gnueabihf/ ]]; then - pkexec mkdir -p /usr/lib/arm-linux-gnueabihf/ - fi -fi -if [[ -d "$CURRENT_DIR/usr/lib/aarch64-linux-gnu" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib/aarch64-linux-gnu\" /usr/lib/aarch64-linux-gnu " - if [[ ! -d /usr/lib/aarch64-linux-gnu/ ]]; then - pkexec mkdir -p /usr/lib/aarch64-linux-gnu/ - fi -fi -if [[ -d "$CURRENT_DIR/usr/lib64" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib64\" /lib64 " - if [[ ! -d /lib64 ]]; then - pkexec ln -s /usr/lib64 /lib64 - fi -fi -if [[ -f "$CURRENT_DIR/usr/lib/ld-linux-aarch64.so.1" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib/ld-linux-aarch64.so.1\" /usr/lib/ld-linux-aarch64.so.1 " - if [[ ! -f /usr/lib/ld-linux-aarch64.so.1 ]] && [[ ! -L /usr/lib/ld-linux-aarch64.so.1 ]]; then - pkexec bash /usr/lib/ld-linux-aarch64.so.1 - fi -fi -if [[ -f "$CURRENT_DIR/usr/lib/ld-linux-armhf.so.3" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib/ld-linux-armhf.so.3\" ld-linux-armhf.so.3 " - if [[ ! -f /usr/lib/ld-linux-armhf.so.3 ]]; then - pkexec touch /usr/lib/ld-linux-armhf.so.3 - fi -fi -if [[ -f "$CURRENT_DIR/usr/lib/ld-linux.so.2" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib/ld-linux.so.2\" ld-linux.so.2 " - if [[ ! -f /usr/lib/ld-linux.so.2 ]]; then - pkexec touch /usr/lib/ld-linux.so.2 - fi -fi -if [[ -f "$CURRENT_DIR/usr/lib64/ld-linux-x86-64.so.2" ]]; then - command=" $command --ro-bind \"$CURRENT_DIR/usr/lib64/ld-linux-x86-64.so.2\" ld-linux-x86-64.so.2 " - if [[ ! -f /usr/lib64/ld-linux-x86-64.so.2 ]]; then - pkexec touch /usr/lib64/ld-linux-x86-64.so.2 - fi -fi - bwrap --dev-bind / / \ --ro-bind "$CURRENT_DIR/usr/lib" /lib \ --ro-bind "$CURRENT_DIR/usr/lib64" /lib \ @@ -67,4 +24,4 @@ bwrap --dev-bind / / \ --ro-bind /usr/share /usr/share \ --ro-bind /usr/bin /usr/bin \ --ro-bind /usr/sbin /usr/sbin \ - -- "${@:2}" + -- "$@" diff --git a/WineLib/run.sh b/WineLib/run.sh index aa64548..4de1ebb 100755 --- a/WineLib/run.sh +++ b/WineLib/run.sh @@ -4,24 +4,81 @@ if [[ ! -d "$CURRENT_DIR/usr" ]]; then zenity --info --text=未安装运行库,无法运行 --no-wrap exit fi +systemNeedCommand="" +for libr in `ls /usr/lib` +do + if [[ -f /usr/lib/$libr/libc.so.6 ]]; then + if [[ ! -f "$CURRENT_DIR/usr/lib/$libr/libc.so.6" ]]; then + echo $libr + systemNeedCommand="$systemNeedCommand --ro-bind /usr/lib/$libr/ /usr/lib/$libr/ " + mkdir -p "$CURRENT_DIR/usr/lib/$libr" + fi + fi +done +for libr in `ls /usr/lib/ld*.so*` +do + if [[ -f $libr ]]; then + if [[ ! -f "$CURRENT_DIR/$libr" ]]; then + systemNeedCommand="$systemNeedCommand --ro-bind $libr $libr " + touch "$CURRENT_DIR/$libr" + else + if [[ ! -s "$CURRENT_DIR/$libr" ]]; then + systemNeedCommand="$systemNeedCommand --ro-bind $libr $libr " + fi + fi + fi +done +if [[ -L /usr/lib64 ]] && [[ ! -d "$CURRENT_DIR/usr/lib64" ]]; then + mkdir -p "$CURRENT_DIR/usr/lib64" +fi +for libr in `ls /usr/lib64/ld*.so*` +do + if [[ -f $libr ]]; then + if [[ ! -f "$CURRENT_DIR/$libr" ]]; then + systemNeedCommand="$systemNeedCommand --ro-bind $libr $libr " + touch "$CURRENT_DIR/$libr" + else + if [[ ! -s "$CURRENT_DIR/$libr" ]]; then + systemNeedCommand="$systemNeedCommand --ro-bind $libr $libr " + fi + fi + fi +done +if [[ ! -d "$CURRENT_DIR/usr/lib/locale" ]]; then + systemNeedCommand="$systemNeedCommand --ro-bind /usr/lib/locale /usr/lib/locale " +fi +echo $systemNeedCommand if [[ ! -d "$CURRENT_DIR/usr/lib64" ]]; then bwrap --dev-bind / / \ - --ro-bind "$CURRENT_DIR/usr/lib" /lib \ - --ro-bind "$CURRENT_DIR/usr" /usr \ + --bind "$CURRENT_DIR/usr/lib" /lib \ + --bind "$CURRENT_DIR/usr" /usr \ --ro-bind /usr/share /usr/share \ --ro-bind /usr/bin /usr/bin \ --ro-bind /usr/sbin /usr/sbin \ + $systemNeedCommand \ -- "$@" exit fi if [[ ! -f /lib64 ]] && [[ ! -d /lib64 ]] && [[ ! -L /lib64 ]]; then - pkexec mkdir /lib64 -p + pkexec ln -s /usr/lib64 /lib64 +fi +if [[ -L /lib64 ]] || [[ -d /lib64 ]] || [[ -f /lib64 ]];then + bwrap --dev-bind / / \ + --bind "$CURRENT_DIR/usr/lib" /lib \ + --bind "$CURRENT_DIR/usr/lib64" /lib \ + --bind "$CURRENT_DIR/usr" /usr \ + --ro-bind /usr/share /usr/share \ + --ro-bind /usr/bin /usr/bin \ + --ro-bind /usr/sbin /usr/sbin \ + $systemNeedCommand \ + -- "$@" + exit fi bwrap --dev-bind / / \ - --ro-bind "$CURRENT_DIR/usr/lib" /lib \ - --ro-bind "$CURRENT_DIR/usr/lib64" /lib \ - --ro-bind "$CURRENT_DIR/usr" /usr \ + --bind "$CURRENT_DIR/usr/lib" /lib \ + --bind "$CURRENT_DIR/usr" /usr \ --ro-bind /usr/share /usr/share \ --ro-bind /usr/bin /usr/bin \ --ro-bind /usr/sbin /usr/sbin \ + $systemNeedCommand \ -- "$@" diff --git a/mainwindow.py b/mainwindow.py index d67fa60..d76ce14 100755 --- a/mainwindow.py +++ b/mainwindow.py @@ -2421,7 +2421,7 @@ def CheckWine(): try: canUseWineOld = canUseWine[:] for i in canUseWineOld: - if os.path.exists(f"{programPath}/WineLib/usr/lib/ld-linux-x86-64.so.2"): + if os.path.exists(f"{programPath}/WineLib/usr"): wine[f"使用运行器的运行库运行 {i}"] = f"bash '{programPath}/WineLib/run.sh' {wine[i]}" canUseWine.append(f"使用运行器的运行库运行 {i}") untipsWine.append(f"使用运行器的运行库运行 {i}") @@ -3058,12 +3058,30 @@ installLib.addAction(runnerlibinfo) installLib.addAction(statusRunnerLib) installLib.addAction(installRunnerLib) installLib.addAction(removeRunnerLib) +diyRunnerLib = installLib.addMenu("定制运行库") +diyRunnerLib.setDisabled(True) installRunnerLib.triggered.connect(lambda: threading.Thread(target=OpenTerminal, args=[f"bash '{programPath}/WineLib/install.sh'"]).start()) removeRunnerLib.triggered.connect(lambda: threading.Thread(target=OpenTerminal, args=[f"bash '{programPath}/WineLib/remove.sh'"]).start()) -if os.path.exists(f"{programPath}/WineLib/usr/lib/ld-linux-x86-64.so.2"): +if os.path.exists(f"{programPath}/WineLib/usr"): installRunnerLib.setDisabled(True) removeRunnerLib.setEnabled(True) + diyRunnerLib.setEnabled(True) statusRunnerLib.setText("当前状态:已安装") + libPathList = [] + for libPath in [f"{programPath}/WineLib/usr/lib", f"{programPath}/WineLib/usr/lib64"]: + for i in os.listdir(libPath): + if not os.path.exists(f"{libPath}/{i}/libc.so.6"): + continue + if not os.path.isdir(f"{libPath}/{i}"): + try: + if not os.path.getsize(f"{libPath}/{i}"): + continue + except: + continue + libPathList.append(f"{libPath}/{i}") + else: + libPathList.append(f"{libPath}/{i}/") + print(libPathList) if os.path.exists(f"{programPath}/InstallRuntime"): installLib.addSeparator() systemalllibinfo = QtWidgets.QAction("全局运行库(与其他运行库以及部分兼容层冲突)")