From 0384acec887c4132c4bead81ed6dc05d3c0397ad Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 17 Nov 2023 00:52:20 +0800 Subject: remove empty dirs --- xmake/scripts/xpack/nsis/makensis.nsi | 72 +++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 24 deletions(-) (limited to 'xmake/scripts') diff --git a/xmake/scripts/xpack/nsis/makensis.nsi b/xmake/scripts/xpack/nsis/makensis.nsi index 5d1a99dc0..2a7260519 100644 --- a/xmake/scripts/xpack/nsis/makensis.nsi +++ b/xmake/scripts/xpack/nsis/makensis.nsi @@ -120,38 +120,38 @@ VIAddVersionKey /LANG=0 ProductVersion "${VERSION_FULL}" ; helper functions Function TrimQuote - Exch $R1 ; Original string - Push $R2 + Exch $R1 ; Original string + Push $R2 Loop: - StrCpy $R2 "$R1" 1 - StrCmp "$R2" "'" TrimLeft - StrCmp "$R2" "$\"" TrimLeft - StrCmp "$R2" "$\r" TrimLeft - StrCmp "$R2" "$\n" TrimLeft - StrCmp "$R2" "$\t" TrimLeft - StrCmp "$R2" " " TrimLeft - GoTo Loop2 + StrCpy $R2 "$R1" 1 + StrCmp "$R2" "'" TrimLeft + StrCmp "$R2" "$\"" TrimLeft + StrCmp "$R2" "$\r" TrimLeft + StrCmp "$R2" "$\n" TrimLeft + StrCmp "$R2" "$\t" TrimLeft + StrCmp "$R2" " " TrimLeft + GoTo Loop2 TrimLeft: - StrCpy $R1 "$R1" "" 1 - Goto Loop + StrCpy $R1 "$R1" "" 1 + Goto Loop Loop2: - StrCpy $R2 "$R1" 1 -1 - StrCmp "$R2" "'" TrimRight - StrCmp "$R2" "$\"" TrimRight - StrCmp "$R2" "$\r" TrimRight - StrCmp "$R2" "$\n" TrimRight - StrCmp "$R2" "$\t" TrimRight - StrCmp "$R2" " " TrimRight - GoTo Done + StrCpy $R2 "$R1" 1 -1 + StrCmp "$R2" "'" TrimRight + StrCmp "$R2" "$\"" TrimRight + StrCmp "$R2" "$\r" TrimRight + StrCmp "$R2" "$\n" TrimRight + StrCmp "$R2" "$\t" TrimRight + StrCmp "$R2" " " TrimRight + GoTo Done TrimRight: - StrCpy $R1 "$R1" -1 - Goto Loop2 + StrCpy $R1 "$R1" -1 + Goto Loop2 Done: - Pop $R2 - Exch $R1 + Pop $R2 + Exch $R1 FunctionEnd ; setup installer @@ -282,7 +282,29 @@ Function un.onInit !else StrCpy $BinDir "$InstDir\${PACKAGE_BINDIR}" !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" @@ -305,5 +327,7 @@ Section "Uninstall" ; remove uninstall.exe Delete "$InstDir\uninstall.exe" + ${RMDirUP} "$InstDir\uninstall.exe" + SectionEnd -- cgit v1.3.1 From 03671d0941bf93a5a66eff081d8b50c8f43a532a Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 17 Nov 2023 22:40:22 +0800 Subject: improve to remove dirs --- core/src/demo/xmake.lua | 18 +++++ xmake/modules/private/utils/batchcmds.lua | 14 ---- xmake/plugins/pack/nsis/main.lua | 44 ++++-------- xmake/scripts/xpack/nsis/makensis.nsi | 115 +++++++++++++++++++++++------- 4 files changed, 121 insertions(+), 70 deletions(-) (limited to 'xmake/scripts') 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 -- cgit v1.3.1 From e0f074c79be1f712d09df9f7b4b32245ba95f1c9 Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 17 Nov 2023 22:50:34 +0800 Subject: add nsis display name --- core/xpack.lua | 1 + xmake/includes/xpack/xmake.lua | 4 +++- xmake/plugins/pack/nsis/main.lua | 11 +++++++++++ xmake/scripts/xpack/nsis/makensis.nsi | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) (limited to 'xmake/scripts') diff --git a/core/xpack.lua b/core/xpack.lua index 5cbff58e8..280b1365a 100644 --- a/core/xpack.lua +++ b/core/xpack.lua @@ -5,6 +5,7 @@ xpack("xmake") add_targets("demo") set_bindir(".") set_iconfile("src/demo/xmake.ico") + set_nsis_displayname("Xmake build utility ($(arch))") on_load(function (package) local arch = package:arch() diff --git a/xmake/includes/xpack/xmake.lua b/xmake/includes/xpack/xmake.lua index f7198600d..9021404f7 100644 --- a/xmake/includes/xpack/xmake.lua +++ b/xmake/includes/xpack/xmake.lua @@ -49,7 +49,9 @@ local apis = { -- set installed library directory, e.g. lib "xpack.set_libdir", -- set installed include directory, e.g. include - "xpack.set_includedir" + "xpack.set_includedir", + -- set nsis display name + "xpack.set_nsis_displayname" }, paths = { -- set the spec file path, support the custom variable pattern, e.g. set_specfile("", {pattern = "%${([^\n]-)}"}) diff --git a/xmake/plugins/pack/nsis/main.lua b/xmake/plugins/pack/nsis/main.lua index a99370a01..3c4fa3bbd 100644 --- a/xmake/plugins/pack/nsis/main.lua +++ b/xmake/plugins/pack/nsis/main.lua @@ -25,6 +25,7 @@ import("lib.detect.find_tool") import("private.utils.batchcmds") import("private.action.require.impl.packagenv") import("private.action.require.impl.install_packages") +import(".filter") -- get the makensis function _get_makensis() @@ -514,6 +515,15 @@ function _get_uninstallcmds(package) return _get_commands_string(package, batchcmds_:cmds(), {install = false}) end +-- get value and filter it +function _get_filter_value(package, name) + local value = package:get(name) + if type(value) == "string" then + value = filter.handle(value, package) + end + return value +end + -- get specvars function _get_specvars(package) local specvars = table.clone(package:specvars()) @@ -526,6 +536,7 @@ function _get_specvars(package) specvars.PACKAGE_UNINSTALLCMDS = function () return _get_uninstallcmds(package) end + specvars.PACKAGE_NSIS_DISPLAY_NAME = _get_filter_value(package, "nsis_displayname") or package:name() specvars.PACKAGE_NSIS_INSTALL_SECTIONS = function () local result = {} local cmds = package:get("nsis_installcmds") diff --git a/xmake/scripts/xpack/nsis/makensis.nsi b/xmake/scripts/xpack/nsis/makensis.nsi index 63625bc9a..ffcb39c7c 100644 --- a/xmake/scripts/xpack/nsis/makensis.nsi +++ b/xmake/scripts/xpack/nsis/makensis.nsi @@ -296,7 +296,7 @@ Section "${PACKAGE_NAME} (required)" InstallExeutable ; Write the uninstall keys for Windows !macro AddReg RootKey WriteRegStr ${RootKey} ${RegUninstall} "NoAdmin" "$NoAdmin" - WriteRegStr ${RootKey} ${RegUninstall} "DisplayName" "${PACKAGE_NAME} (${PACKAGE_ARCH})" + WriteRegStr ${RootKey} ${RegUninstall} "DisplayName" "${PACKAGE_NSIS_DISPLAY_NAME}" WriteRegStr ${RootKey} ${RegUninstall} "DisplayIcon" '"$InstDir\${PACKAGE_BINDIR}\${PACKAGE_FILENAME}"' ; TODO WriteRegStr ${RootKey} ${RegUninstall} "Comments" "${PACKAGE_DESCRIPTION}" WriteRegStr ${RootKey} ${RegUninstall} "Publisher" "${PACKAGE_COPYRIGHT}" -- cgit v1.3.1