summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-11-17 22:40:22 +0800
committerruki <[email protected]>2023-11-17 22:40:22 +0800
commit03671d0941bf93a5a66eff081d8b50c8f43a532a (patch)
tree7cc774b1af1d317751a39d1ff9833f1cfd048395
parent02c004d42d70979f3ca983dd960291761800e2a6 (diff)
improve to remove dirs
-rw-r--r--core/src/demo/xmake.lua18
-rw-r--r--xmake/modules/private/utils/batchcmds.lua14
-rw-r--r--xmake/plugins/pack/nsis/main.lua44
-rw-r--r--xmake/scripts/xpack/nsis/makensis.nsi115
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