diff options
| author | ruki <[email protected]> | 2023-11-17 22:40:22 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2023-11-17 22:40:22 +0800 |
| commit | 03671d0941bf93a5a66eff081d8b50c8f43a532a (patch) | |
| tree | 7cc774b1af1d317751a39d1ff9833f1cfd048395 | |
| parent | 02c004d42d70979f3ca983dd960291761800e2a6 (diff) | |
improve to remove dirs
| -rw-r--r-- | core/src/demo/xmake.lua | 18 | ||||
| -rw-r--r-- | xmake/modules/private/utils/batchcmds.lua | 14 | ||||
| -rw-r--r-- | xmake/plugins/pack/nsis/main.lua | 44 | ||||
| -rw-r--r-- | xmake/scripts/xpack/nsis/makensis.nsi | 115 |
4 files changed, 121 insertions, 70 deletions
diff --git a/core/src/demo/xmake.lua b/core/src/demo/xmake.lua index 02466b31f..72892693d 100644 --- a/core/src/demo/xmake.lua +++ b/core/src/demo/xmake.lua @@ -68,3 +68,21 @@ target("demo") add_installfiles("$(projectdir)/../scripts/xrepo.sh", {prefixdir = "bin", filename = "xrepo"}) end + before_installcmd(function (target, batchcmds, opt) + if target:is_plat("windows") then + batchcmds:rmdir("actions") + batchcmds:rmdir("core") + batchcmds:rmdir("includes") + batchcmds:rmdir("languages") + batchcmds:rmdir("modules") + batchcmds:rmdir("platforms") + batchcmds:rmdir("plugins") + batchcmds:rmdir("repository") + batchcmds:rmdir("rules") + batchcmds:rmdir("templates") + batchcmds:rmdir("scripts") + batchcmds:rmdir("themes") + batchcmds:rmdir("toolchains") + end + end) + diff --git a/xmake/modules/private/utils/batchcmds.lua b/xmake/modules/private/utils/batchcmds.lua index 0000b7111..eda3887c8 100644 --- a/xmake/modules/private/utils/batchcmds.lua +++ b/xmake/modules/private/utils/batchcmds.lua @@ -144,14 +144,6 @@ function _runcmd_rm(cmd, opt) end end --- run command: os.tryrm -function _runcmd_tryrm(cmd, opt) - local filepath = cmd.filepath - if not opt.dryrun then - os.tryrm(filepath, opt) - end -end - -- run command: os.rmdir function _runcmd_rmdir(cmd, opt) local dir = cmd.dir @@ -197,7 +189,6 @@ function _runcmd(cmd, opt) rmdir = _runcmd_rmdir, cd = _runcmd_cd, rm = _runcmd_rm, - tryrm = _runcmd_tryrm, cp = _runcmd_cp, mv = _runcmd_mv, ln = _runcmd_ln @@ -361,11 +352,6 @@ function batchcmds:rm(filepath, opt) table.insert(self:cmds(), {kind = "rm", filepath = filepath, opt = opt}) end --- add command: os.tryrm -function batchcmds:tryrm(filepath, opt) - table.insert(self:cmds(), {kind = "tryrm", filepath = filepath, opt = opt}) -end - -- add command: os.cp function batchcmds:cp(srcpath, dstpath, opt) table.insert(self:cmds(), {kind = "cp", srcpath = srcpath, dstpath = dstpath, opt = opt}) diff --git a/xmake/plugins/pack/nsis/main.lua b/xmake/plugins/pack/nsis/main.lua index 1dd5221b3..a99370a01 100644 --- a/xmake/plugins/pack/nsis/main.lua +++ b/xmake/plugins/pack/nsis/main.lua @@ -59,9 +59,9 @@ function _get_unique_tag(content) end -- get command string -function _get_command_strings(package, cmd) +function _get_command_strings(package, cmd, opt) + opt = table.join(cmd.opt or {}, opt) local result = {} - local opt = cmd.opt or {} local kind = cmd.kind if kind == "cp" then -- https://nsis.sourceforge.io/Reference/File @@ -84,33 +84,15 @@ function _get_command_strings(package, cmd) end elseif kind == "rm" then local filepath = path.normalize(path.join("$InstDir", cmd.filepath)) - table.insert(result, string.format("Delete \"%s\"", filepath)) + table.insert(result, string.format("${%s} \"%s\"", opt.install and "RMFileIfExists" or "unRMFileIfExists", filepath)) if opt.emptydirs then - table.insert(result, string.format("${RMDirUP} \"%s\"", filepath)) - end - elseif kind == "tryrm" then - --[[ - IfFileExists "$InstDir\file" file_found file_not_found_or_end - file_found: - Delete "$InstDir\file" - goto file_not_found_or_end - file_not_found_or_end: - --]] - local filepath = path.normalize(path.join("$InstDir", cmd.filepath)) - local tag = _get_unique_tag(filepath) - table.insert(result, string.format("IfFileExists \"%s\" file_found_%s file_not_found_or_end_%s", filepath, tag, tag)) - table.insert(result, string.format("file_found_%s:", tag)) - table.insert(result, string.format(" Delete \"%s\"", filepath)) - table.insert(result, string.format(" goto file_not_found_or_end_%s", tag)) - table.insert(result, string.format("file_not_found_or_end_%s:", tag)) - if opt.emptydirs then - table.insert(result, string.format("${RMDirUP} \"%s\"", filepath)) + table.insert(result, string.format("${%s} \"%s\"", opt.install and "RMEmptyParentDirs" or "unRMEmptyParentDirs", filepath)) end elseif kind == "rmdir" then local dir = path.normalize(path.join("$InstDir", cmd.dir)) - table.insert(result, string.format("RMDir /r \"%s\"", dir)) + table.insert(result, string.format("${%s} \"%s\"", opt.install and "RMDirIfExists" or "unRMDirIfExists", dir)) if opt.emptydirs then - table.insert(result, string.format("${RMDirUP} \"%s\"", dir)) + table.insert(result, string.format("${%s} \"%s\"", opt.install and "RMEmptyParentDirs" or "unRMEmptyParentDirs", dir)) end elseif kind == "mv" then local srcpath = path.normalize(path.join("$InstDir", cmd.srcpath)) @@ -127,10 +109,10 @@ function _get_command_strings(package, cmd) end -- get commands string -function _get_commands_string(package, cmds) +function _get_commands_string(package, cmds, opt) local cmdstrs = {} for _, cmd in ipairs(cmds) do - table.join2(cmdstrs, _get_command_strings(package, cmd)) + table.join2(cmdstrs, _get_command_strings(package, cmd, opt)) end return table.concat(cmdstrs, "\n ") end @@ -321,7 +303,7 @@ function _on_target_uninstallcmd_binary(target, batchcmds_, opt) -- uninstall target file batchcmds_:rm(path.join(bindir, target:filename()), {emptydirs = true}) - batchcmds_:tryrm(path.join(bindir, path.filename(target:symbolfile())), {emptydirs = true}) + batchcmds_:rm(path.join(bindir, path.filename(target:symbolfile())), {emptydirs = true}) -- remove the dependent shared/windows (*.dll) target -- @see https://github.com/xmake-io/xmake/issues/961 @@ -345,7 +327,7 @@ function _on_target_uninstallcmd_shared(target, batchcmds_, opt) -- uninstall target file batchcmds_:rm(path.join(bindir, target:filename()), {emptydirs = true}) - batchcmds_:tryrm(path.join(bindir, path.filename(target:symbolfile())), {emptydirs = true}) + batchcmds_:rm(path.join(bindir, path.filename(target:symbolfile())), {emptydirs = true}) -- remove *.lib for shared/windows (*.dll) target -- @see https://github.com/xmake-io/xmake/issues/714 @@ -367,7 +349,7 @@ function _on_target_uninstallcmd_static(target, batchcmds_, opt) -- uninstall target file batchcmds_:rm(path.join(libdir, target:filename()), {emptydirs = true}) - batchcmds_:tryrm(path.join(libdir, path.filename(target:symbolfile())), {emptydirs = true}) + batchcmds_:rm(path.join(libdir, path.filename(target:symbolfile())), {emptydirs = true}) -- remove headers from the include directory _uninstall_headers(target, batchcmds_, includedir) @@ -508,7 +490,7 @@ function _get_installcmds(package) end -- generate command string - return _get_commands_string(package, batchcmds_:cmds()) + return _get_commands_string(package, batchcmds_:cmds(), {install = true}) end -- get uninstall commands @@ -529,7 +511,7 @@ function _get_uninstallcmds(package) end -- generate command string - return _get_commands_string(package, batchcmds_:cmds()) + return _get_commands_string(package, batchcmds_:cmds(), {install = false}) end -- get specvars diff --git a/xmake/scripts/xpack/nsis/makensis.nsi b/xmake/scripts/xpack/nsis/makensis.nsi index 2a7260519..63625bc9a 100644 --- a/xmake/scripts/xpack/nsis/makensis.nsi +++ b/xmake/scripts/xpack/nsis/makensis.nsi @@ -154,6 +154,94 @@ Done: Exch $R1 FunctionEnd +; remove directory if it exists +Function RMDirIfExists +!define RMDirIfExists '!insertmacro RMDirIfExistsCall' +!macro RMDirIfExistsCall _PATH + push '${_PATH}' + Call RMDirIfExists +!macroend + Exch $0 + IfFileExists "$0" 0 fileDoesNotExist + RMDir /r "$0" + fileDoesNotExist: +FunctionEnd + +Function unRMDirIfExists +!define unRMDirIfExists '!insertmacro un.RMDirIfExistsCall' +!macro unRMDirIfExistsCall _PATH + push '${_PATH}' + Call un.RMDirIfExists +!macroend + Exch $0 + IfFileExists "$0" 0 fileDoesNotExist + RMDir /r "$0" + fileDoesNotExist: +FunctionEnd + +; remove file if it exists +Function RMFileIfExists +!define RMFileIfExists '!insertmacro RMFileIfExistsCall' +!macro RMFileIfExistsCall _PATH + push '${_PATH}' + Call RMFileIfExists +!macroend + Exch $0 + IfFileExists "$0" 0 fileDoesNotExist + Delete "$0" + fileDoesNotExist: +FunctionEnd + +Function un.RMFileIfExists +!define unRMFileIfExists '!insertmacro unRMFileIfExistsCall' +!macro unRMFileIfExistsCall _PATH + push '${_PATH}' + Call un.RMFileIfExists +!macroend + Exch $0 + IfFileExists "$0" 0 fileDoesNotExist + Delete "$0" + fileDoesNotExist: +FunctionEnd + +; remove it's parent directories if they are empty +Function RMEmptyParentDirs +!define RMEmptyParentDirs '!insertmacro RMEmptyParentDirsCall' +!macro RMEmptyParentDirsCall _PATH + push '${_PATH}' + Call RMEmptyParentDirs +!macroend + ClearErrors + + Exch $0 + RMDir "$0\.." + + IfErrors Skip + ${RMEmptyParentDirs} "$0\.." + Skip: + + Pop $0 +FunctionEnd + +Function un.RMEmptyParentDirs +!define unRMEmptyParentDirs '!insertmacro unRMEmptyParentDirsCall' +!macro unRMEmptyParentDirsCall _PATH + push '${_PATH}' + Call un.RMEmptyParentDirs +!macroend + ClearErrors + + Exch $0 + RMDir "$0\.." + + IfErrors Skip + ${unRMEmptyParentDirs} "$0\.." + Skip: + + Pop $0 +FunctionEnd + + ; setup installer Var BinDir Var NoAdmin @@ -284,29 +372,6 @@ Function un.onInit !endif FunctionEnd -; remove it's parent directories if they are empty -; ${RMDirUP} "filepath" -Function un.RMDirUP - !define RMDirUP '!insertmacro RMDirUPCall' - !macro RMDirUPCall _PATH - push '${_PATH}' - Call un.RMDirUP - !macroend - - ; $0 - current folder - ClearErrors - - Exch $0 - ;DetailPrint "ASDF - $0\.." - RMDir "$0\.." - - IfErrors Skip - ${RMDirUP} "$0\.." - Skip: - - Pop $0 -FunctionEnd - Section "Uninstall" ; add uninstall commands @@ -326,8 +391,8 @@ Section "Uninstall" ${EndIf} ; remove uninstall.exe - Delete "$InstDir\uninstall.exe" - ${RMDirUP} "$InstDir\uninstall.exe" + ${unRMFileIfExists} "$InstDir\uninstall.exe" + ${unRMEmptyParentDirs} "$InstDir\uninstall.exe" SectionEnd |
