summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ports/AvailablePorts.md1
-rw-r--r--Ports/cmake/howto.md40
-rwxr-xr-xPorts/cmake/package.sh33
-rw-r--r--Ports/cmake/patches/0000-no_wide_string.patch6873
-rw-r--r--Ports/cmake/patches/0002-stoi-atoi.patch62
-rw-r--r--Ports/cmake/patches/0003-stoi-atoi-2.patch122
-rw-r--r--Ports/cmake/patches/0004-snprintf.patch113
-rw-r--r--Ports/cmake/patches/0005-stod.patch207
-rw-r--r--Ports/cmake/patches/0006-stoll.patch93
-rw-r--r--Ports/cmake/patches/0007-utimes-utime.patch145
-rw-r--r--Ports/cmake/patches/0008-unix-stuff.patch76
-rw-r--r--Ports/cmake/patches/0009-purge-non-serenity-syscalls.patch199
-rw-r--r--Ports/cmake/patches/0010-don-t-use-siginfo.patch48
-rw-r--r--Ports/cmake/patches/0011-Fixed-your-code-rot-cmake.patch39
-rw-r--r--Ports/cmake/patches/0012-bin-bash.patch17
-rw-r--r--Ports/cmake/patches/0013-platform-serenityos.patch29
-rw-r--r--Ports/cmake/patches/0014-cmcurl-include-unistd.patch10
-rw-r--r--Ports/cmake/patches/0015-atoll.patch20
-rw-r--r--Ports/cmake/patches/0016-conflicting-0.patch12
-rw-r--r--Ports/cmake/patches/0017-conflicting-1.patch12
-rw-r--r--Ports/cmake/patches/0018-isfinite.patch13
-rw-r--r--Ports/cmake/patches/0019-libuv-so_linger.patch22
-rw-r--r--Ports/cmake/patches/0020-libuv-ipv6.patch489
-rw-r--r--Ports/cmake/patches/0021-libcurl-no-ipv6.patch28
-rw-r--r--Ports/cmake/patches/0022-remove-mutex.patch370
-rw-r--r--Ports/cmake/patches/0023-lround.patch26
-rw-r--r--Ports/cmake/patches/0024-shared-mutex.patch85
-rw-r--r--Ports/cmake/patches/0025-uv-platform.patch23
-rw-r--r--Ports/cmake/patches/0026-curl-struct-stat.patch12
-rw-r--r--Ports/cmake/patches/0027-libuv-platform-serenity.patch13
-rw-r--r--Ports/cmake/patches/0028-cmake-disable-tests.patch14
-rw-r--r--Ports/cmake/patches/ReadMe.md244
32 files changed, 9490 insertions, 0 deletions
diff --git a/Ports/AvailablePorts.md b/Ports/AvailablePorts.md
index e4a3b509d2..e8e37b7be7 100644
--- a/Ports/AvailablePorts.md
+++ b/Ports/AvailablePorts.md
@@ -9,6 +9,7 @@ Please make sure to keep this list up to date when adding and updating ports. :^
| [`binutils`](binutils/) | GNU Binutils | 2.32 | https://www.gnu.org/software/binutils/ |
| [`byacc`](byacc/) | Berkeley Yacc | 20191125 | https://invisible-island.net/byacc/byacc.html |
| [`c-ray`](c-ray/) | C-Ray | | https://github.com/vkoskiv/c-ray |
+| [`cmake`](cmake/) | CMake | 3.19.4 | https://cmake.org/ |
| [`curl`](curl/) | curl | 7.65.3 | https://curl.se/ |
| [`dash`](dash/) | DASH | 0.5.10.2 | http://gondor.apana.org.au/~herbert/dash |
| [`diffutils`](diffutils/) | GNU Diffutils | 3.5 | https://www.gnu.org/software/diffutils/ |
diff --git a/Ports/cmake/howto.md b/Ports/cmake/howto.md
new file mode 100644
index 0000000000..92e86a3bb4
--- /dev/null
+++ b/Ports/cmake/howto.md
@@ -0,0 +1,40 @@
+## Build Guide
+
+- Run `./package.sh` here, which should install the dependencies and copy the patched source code to `~anon/Source/cmake`
+- Give the vm at least 2G of RAM, and at least 1.5G of free disk space (actual values used may be different, but ~1.3GiB of RAM and 1.2GiB of disk space has been observed)
+- Build the bootstrap cmake binary:
+```sh
+$ cd Source/cmake
+$ ./bootstrap
+```
+- Go entertain yourself for a few minutes (build takes about 10m)
+- The bootstrap binary should be built, but may fail for any of the reasons detailed in [Troubleshooting](#troubleshooting).
+- Build and install cmake (this takes a long time, about 80 minutes on my machine)
+```sh
+$ make
+# mount -o bind /usr /usr
+# make install
+```
+- Optionally, add `/usr/local/bin` to PATH:
+```sh
+$ export PATH="$PATH:/usr/local/bin"
+```
+- Hopefully look back at the experience and laugh at its ease
+
+## Current Status
+
+Fully working :P
+
+## Troubleshooting
+
+### "Failed to open check cache file for write..." while bootstrap cmake is configuring cmake
+
+The cause for this is unknown, but it seems to be a transitive state; simply restarting the bootstrap process fixes it:
+```sh
+$ Bootstrap.cmk/cmake . -C Bootstrap.cmk/InitialCacheFlags.cmake -G 'Unix Makefiles' -DCMAKE_BOOTSTRAP=1 -DBUILD_TESTING=0
+```
+You might have to repeat this many times.
+
+### "unable to rename '...', reason: File already exists" while making cmake
+
+Cause unknown. re-running make made it go away.
diff --git a/Ports/cmake/package.sh b/Ports/cmake/package.sh
new file mode 100755
index 0000000000..05e211f69d
--- /dev/null
+++ b/Ports/cmake/package.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env -S bash ../.port_include.sh
+port=cmake
+version=3.19.4
+useconfigure=false
+files="https://github.com/Kitware/CMake/releases/download/v$version/cmake-$version.tar.gz cmake-$version.tar.gz"
+depends="bash gcc make sed"
+
+port_path=$(realpath $(dirname ${BASH_SOURCE[0]}))
+
+build() {
+ return
+}
+
+install() {
+ cmake_dir="${SERENITY_ROOT}/Build/Root/home/anon/Source/cmake"
+ run rm -rf "$cmake_dir"
+ run mkdir -p "$cmake_dir"
+ run cp -r . "$cmake_dir"
+}
+
+post_install() {
+ echo +===================================================================
+ echo "| Successfully prepared the sources for cmake v$version!"
+ echo "| The other half of the install has to be done inside serenity"
+ echo "| to continue, re-image and run the vm, then do the following:"
+ echo '| '
+ echo '| $ cd Source/cmake'
+ echo '| $ ./bootstrap'
+ echo '| $ make && make install'
+ echo '| '
+ echo "| (These instructions are also available in $port_path/howto.md)"
+ echo +===================================================================
+}
diff --git a/Ports/cmake/patches/0000-no_wide_string.patch b/Ports/cmake/patches/0000-no_wide_string.patch
new file mode 100644
index 0000000000..b15ea56a8e
--- /dev/null
+++ b/Ports/cmake/patches/0000-no_wide_string.patch
@@ -0,0 +1,6873 @@
+diff -urp a/Source/cmCallVisualStudioMacro.cxx b/Source/cmCallVisualStudioMacro.cxx
+--- a/Source/cmCallVisualStudioMacro.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmCallVisualStudioMacro.cxx 2021-02-11 18:43:33.119174973 +0330
+@@ -61,7 +61,7 @@ HRESULT InstanceCallMacro(IDispatch* vsI
+
+ if (0 != vsIDE) {
+ DISPID dispid = (DISPID)-1;
+- wchar_t execute_command[] = L"ExecuteCommand";
++ char execute_command[] = "ExecuteCommand";
+ OLECHAR* name = execute_command;
+
+ hr =
+@@ -147,7 +147,7 @@ HRESULT GetSolutionObject(IDispatch* vsI
+
+ if (0 != vsIDE) {
+ DISPID dispid = (DISPID)-1;
+- wchar_t solution[] = L"Solution";
++ char solution[] = "Solution";
+ OLECHAR* name = solution;
+
+ hr =
+@@ -191,7 +191,7 @@ HRESULT GetSolutionFullName(IDispatch* v
+
+ if (0 != vsSolution) {
+ DISPID dispid = (DISPID)-1;
+- wchar_t full_name[] = L"FullName";
++ char full_name[] = "FullName";
+ OLECHAR* name = full_name;
+
+ hr = vsSolution->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT,
+
+diff -urp a/Source/cmCMakePath.cxx b/Source/cmCMakePath.cxx
+--- a/Source/cmCMakePath.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmCMakePath.cxx 2021-02-12 14:39:55.144860522 +0330
+@@ -123,24 +123,3 @@ void cmCMakePath::GetNativePath(std::str
+
+ path = tmp.string();
+ }
+-void cmCMakePath::GetNativePath(std::wstring& path) const
+-{
+- cm::filesystem::path tmp(this->Path);
+- tmp.make_preferred();
+-
+- path = tmp.wstring();
+-
+-#if defined(_WIN32)
+- // Windows long filename
+- static std::wstring UNC(L"\\\\?\\UNC");
+- static std::wstring PREFIX(L"\\\\?\\");
+-
+- if (this->IsAbsolute() && path.length() > _MAX_PATH - 12) {
+- if (this->HasRootName() && path[0] == L'\\') {
+- path = UNC + path.substr(1);
+- } else {
+- path = PREFIX + path;
+- }
+- }
+-#endif
+-}
+diff -urp a/Source/cmCMakePath.h b/Source/cmCMakePath.h
+--- a/Source/cmCMakePath.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmCMakePath.h 2021-02-12 14:39:55.144860522 +0330
+@@ -296,7 +296,7 @@ public:
+
+ // Observers
+ std::string String() const { return this->Path.string(); }
+- std::wstring WString() const { return this->Path.wstring(); }
++ std::string WString() const { return this->Path.wstring(); }
+
+ string_type Native() const
+ {
+@@ -312,15 +312,15 @@ public:
+
+ return path;
+ }
+- std::wstring NativeWString() const
++ std::string NativeWString() const
+ {
+- std::wstring path;
++ std::string path;
+ this->GetNativePath(path);
+
+ return path;
+ }
+ std::string GenericString() const { return this->Path.generic_string(); }
+- std::wstring GenericWString() const { return this->Path.generic_wstring(); }
++ std::string GenericWString() const { return this->Path.generic_wstring(); }
+
+ // Decomposition
+ cmCMakePath GetRootName() const { return this->Path.root_name(); }
+@@ -449,7 +449,6 @@ private:
+ }
+
+ void GetNativePath(std::string& path) const;
+- void GetNativePath(std::wstring& path) const;
+
+ cm::filesystem::path Path;
+ };
+diff -urp a/Source/cm_codecvt.cxx b/Source/cm_codecvt.cxx
+--- a/Source/cm_codecvt.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cm_codecvt.cxx 2021-02-11 18:43:32.705835074 +0330
+@@ -159,7 +159,7 @@ std::codecvt_base::result codecvt::Decod
+ buf[lstate.buffered] = *from_next;
+
+ // Convert the encoding.
+- wchar_t wbuf[2];
++ char wbuf[2];
+ int wlen =
+ MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buf, size, wbuf, 2);
+ if (wlen <= 0) {
+@@ -194,7 +194,7 @@ std::codecvt_base::result codecvt::Decod
+ State& lstate = reinterpret_cast<State&>(state);
+
+ // Try converting the partial codepoint.
+- wchar_t wbuf[2];
++ char wbuf[2];
+ int wlen = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, lstate.partial,
+ lstate.buffered, wbuf, 2);
+ if (wlen <= 0) {
+diff -urp a/Source/cmExportCommand.cxx b/Source/cmExportCommand.cxx
+--- a/Source/cmExportCommand.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmExportCommand.cxx 2021-02-11 18:43:33.069174181 +0330
+@@ -316,7 +316,7 @@ static void ReportRegistryError(cmMakefi
+ std::ostringstream e;
+ e << msg << "\n"
+ << " HKEY_CURRENT_USER\\" << key << "\n";
+- wchar_t winmsg[1024];
++ char winmsg[1024];
+ if (FormatMessageW(
+ FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, err,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), winmsg, 1024, 0) > 0) {
+@@ -339,11 +339,11 @@ static void StorePackageRegistry(cmMakef
+ return;
+ }
+
+- std::wstring wcontent = cmsys::Encoding::ToWide(content);
++ std::string wcontent = cmsys::Encoding::ToWide(content);
+ err =
+ RegSetValueExW(hKey, cmsys::Encoding::ToWide(hash).c_str(), 0, REG_SZ,
+ (BYTE const*)wcontent.c_str(),
+- static_cast<DWORD>(wcontent.size() + 1) * sizeof(wchar_t));
++ static_cast<DWORD>(wcontent.size() + 1) * sizeof(char));
+ RegCloseKey(hKey);
+ if (err != ERROR_SUCCESS) {
+ std::ostringstream msg;
+diff -urp a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
+--- a/Source/cmFileCommand.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmFileCommand.cxx 2021-02-12 14:39:59.851186324 +0330
+@@ -80,7 +80,7 @@ std::string fix_file_url_windows(const s
+ {
+ std::string ret = url;
+ if (strncmp(url.c_str(), "file://", 7) == 0) {
+- std::wstring wurl = cmsys::Encoding::ToWide(url);
++ std::string wurl = cmsys::Encoding::ToWide(url);
+ if (!wurl.empty()) {
+ int mblen =
+ WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, NULL, 0, NULL, NULL);
+diff -urp a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx
+--- a/Source/cmFindPackageCommand.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmFindPackageCommand.cxx 2021-02-11 18:43:32.892504710 +0330
+@@ -1514,15 +1514,15 @@ void cmFindPackageCommand::LoadPackageRe
+ void cmFindPackageCommand::LoadPackageRegistryWin(bool user, unsigned int view,
+ cmSearchPath& outPaths)
+ {
+- std::wstring key = L"Software\\Kitware\\CMake\\Packages\\";
++ std::string key = "Software\\Kitware\\CMake\\Packages\\";
+ key += cmsys::Encoding::ToWide(this->Name);
+- std::set<std::wstring> bad;
++ std::set<std::string> bad;
+ HKEY hKey;
+ if (RegOpenKeyExW(user ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE, key.c_str(),
+ 0, KEY_QUERY_VALUE | view, &hKey) == ERROR_SUCCESS) {
+ DWORD valueType = REG_NONE;
+- wchar_t name[16383]; // RegEnumValue docs limit name to 32767 _bytes_
+- std::vector<wchar_t> data(512);
++ char name[16383]; // RegEnumValue docs limit name to 32767 _bytes_
++ std::vector<char> data(512);
+ bool done = false;
+ DWORD index = 0;
+ while (!done) {
+@@ -1557,7 +1557,7 @@ void cmFindPackageCommand::LoadPackageRe
+ if (user && !bad.empty() &&
+ RegOpenKeyExW(HKEY_CURRENT_USER, key.c_str(), 0, KEY_SET_VALUE | view,
+ &hKey) == ERROR_SUCCESS) {
+- for (std::wstring const& v : bad) {
++ for (std::string const& v : bad) {
+ RegDeleteValueW(hKey, v.c_str());
+ }
+ RegCloseKey(hKey);
+diff -urp a/Source/cmGccDepfileLexerHelper.cxx b/Source/cmGccDepfileLexerHelper.cxx
+--- a/Source/cmGccDepfileLexerHelper.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmGccDepfileLexerHelper.cxx 2021-02-11 18:43:33.049173864 +0330
+@@ -18,8 +18,8 @@
+ bool cmGccDepfileLexerHelper::readFile(const char* filePath)
+ {
+ #ifdef _WIN32
+- wchar_t* wpath = cmsysEncoding_DupToWide(filePath);
+- FILE* file = _wfopen(wpath, L"rb");
++ char* wpath = cmsysEncoding_DupToWide(filePath);
++ FILE* file = _wfopen(wpath, "rb");
+ free(wpath);
+ #else
+ FILE* file = fopen(filePath, "r");
+diff -urp a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx
+--- a/Source/cmGlobalVisualStudio8Generator.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmGlobalVisualStudio8Generator.cxx 2021-02-11 18:43:32.972505982 +0330
+@@ -380,10 +380,10 @@ static cmVS7FlagTable cmVS8ExtraFlagTabl
+ { "EnablePREfast", "analyze-", "", "false", 0 },
+
+ // Language options
+- { "TreatWChar_tAsBuiltInType", "Zc:wchar_t", "wchar_t is a built-in type",
++ { "TreatWChar_tAsBuiltInType", "Zc:char", "char is a built-in type",
+ "true", 0 },
+- { "TreatWChar_tAsBuiltInType", "Zc:wchar_t-",
+- "wchar_t is not a built-in type", "false", 0 },
++ { "TreatWChar_tAsBuiltInType", "Zc:char-",
++ "char is not a built-in type", "false", 0 },
+
+ { "", "", "", "", 0 }
+ };
+diff -urp a/Source/cmGlobalVisualStudioGenerator.cxx b/Source/cmGlobalVisualStudioGenerator.cxx
+--- a/Source/cmGlobalVisualStudioGenerator.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmGlobalVisualStudioGenerator.cxx 2021-02-11 18:43:33.135841903 +0330
+@@ -552,9 +552,9 @@ bool IsVisualStudioMacrosFileRegistered(
+ 0, KEY_READ, &hkey);
+ if (ERROR_SUCCESS == result) {
+ // Iterate the subkeys and look for the values of interest in each subkey:
+- wchar_t subkeyname[256];
++ char subkeyname[256];
+ DWORD cch_subkeyname = cm::size(subkeyname);
+- wchar_t keyclass[256];
++ char keyclass[256];
+ DWORD cch_keyclass = cm::size(keyclass);
+ FILETIME lastWriteTime;
+ lastWriteTime.dwHighDateTime = 0;
+@@ -568,19 +568,19 @@ bool IsVisualStudioMacrosFileRegistered(
+ result = RegOpenKeyExW(hkey, subkeyname, 0, KEY_READ, &hsubkey);
+ if (ERROR_SUCCESS == result) {
+ DWORD valueType = REG_SZ;
+- wchar_t data1[256];
++ char data1[256];
+ DWORD cch_data1 = sizeof(data1);
+- RegQueryValueExW(hsubkey, L"Path", 0, &valueType, (LPBYTE)data1,
++ RegQueryValueExW(hsubkey, "Path", 0, &valueType, (LPBYTE)data1,
+ &cch_data1);
+
+ DWORD data2 = 0;
+ DWORD cch_data2 = sizeof(data2);
+- RegQueryValueExW(hsubkey, L"Security", 0, &valueType, (LPBYTE)&data2,
++ RegQueryValueExW(hsubkey, "Security", 0, &valueType, (LPBYTE)&data2,
+ &cch_data2);
+
+ DWORD data3 = 0;
+ DWORD cch_data3 = sizeof(data3);
+- RegQueryValueExW(hsubkey, L"StorageFormat", 0, &valueType,
++ RegQueryValueExW(hsubkey, "StorageFormat", 0, &valueType,
+ (LPBYTE)&data3, &cch_data3);
+
+ s2 = cmSystemTools::LowerCase(cmsys::Encoding::ToNarrow(data1));
+@@ -643,18 +643,18 @@ bool IsVisualStudioMacrosFileRegistered(
+ 0, KEY_READ, &hkey);
+ if (ERROR_SUCCESS == result) {
+ DWORD valueType = REG_SZ;
+- wchar_t data1[256];
++ char data1[256];
+ DWORD cch_data1 = sizeof(data1);
+- RegQueryValueExW(hkey, L"Path", 0, &valueType, (LPBYTE)data1, &cch_data1);
++ RegQueryValueExW(hkey, "Path", 0, &valueType, (LPBYTE)data1, &cch_data1);
+
+ DWORD data2 = 0;
+ DWORD cch_data2 = sizeof(data2);
+- RegQueryValueExW(hkey, L"Security", 0, &valueType, (LPBYTE)&data2,
++ RegQueryValueExW(hkey, "Security", 0, &valueType, (LPBYTE)&data2,
+ &cch_data2);
+
+ DWORD data3 = 0;
+ DWORD cch_data3 = sizeof(data3);
+- RegQueryValueExW(hkey, L"StorageFormat", 0, &valueType, (LPBYTE)&data3,
++ RegQueryValueExW(hkey, "StorageFormat", 0, &valueType, (LPBYTE)&data3,
+ &cch_data3);
+
+ s2 = cmSystemTools::LowerCase(cmsys::Encoding::ToNarrow(data1));
+@@ -690,7 +690,7 @@ void WriteVSMacrosFileRegistryEntry(cons
+ if (ERROR_SUCCESS == result) {
+ // Create the subkey and set the values of interest:
+ HKEY hsubkey = NULL;
+- wchar_t lpClass[] = L"";
++ char lpClass[] = "";
+ result = RegCreateKeyExW(
+ hkey, cmsys::Encoding::ToWide(nextAvailableSubKeyName).c_str(), 0,
+ lpClass, 0, KEY_READ | KEY_WRITE, 0, &hsubkey, 0);
+@@ -699,11 +699,11 @@ void WriteVSMacrosFileRegistryEntry(cons
+
+ std::string s(macrosFile);
+ std::replace(s.begin(), s.end(), '/', '\\');
+- std::wstring ws = cmsys::Encoding::ToWide(s);
++ std::string ws = cmsys::Encoding::ToWide(s);
+
+ result =
+- RegSetValueExW(hsubkey, L"Path", 0, REG_SZ, (LPBYTE)ws.c_str(),
+- static_cast<DWORD>(ws.size() + 1) * sizeof(wchar_t));
++ RegSetValueExW(hsubkey, "Path", 0, REG_SZ, (LPBYTE)ws.c_str(),
++ static_cast<DWORD>(ws.size() + 1) * sizeof(char));
+ if (ERROR_SUCCESS != result) {
+ std::cout << "error result 1: " << result << std::endl;
+ std::cout << std::endl;
+@@ -712,7 +712,7 @@ void WriteVSMacrosFileRegistryEntry(cons
+ // Security value is always "1" for sample macros files (seems to be "2"
+ // if you put the file somewhere outside the standard VSMacros folder)
+ dw = 1;
+- result = RegSetValueExW(hsubkey, L"Security", 0, REG_DWORD, (LPBYTE)&dw,
++ result = RegSetValueExW(hsubkey, "Security", 0, REG_DWORD, (LPBYTE)&dw,
+ sizeof(DWORD));
+ if (ERROR_SUCCESS != result) {
+ std::cout << "error result 2: " << result << std::endl;
+@@ -721,7 +721,7 @@ void WriteVSMacrosFileRegistryEntry(cons
+
+ // StorageFormat value is always "0" for sample macros files
+ dw = 0;
+- result = RegSetValueExW(hsubkey, L"StorageFormat", 0, REG_DWORD,
++ result = RegSetValueExW(hsubkey, "StorageFormat", 0, REG_DWORD,
+ (LPBYTE)&dw, sizeof(DWORD));
+ if (ERROR_SUCCESS != result) {
+ std::cout << "error result 3: " << result << std::endl;
+diff -urp a/Source/cmProcessOutput.cxx b/Source/cmProcessOutput.cxx
+--- a/Source/cmProcessOutput.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmProcessOutput.cxx 2021-02-11 18:43:32.995839686 +0330
+@@ -91,7 +91,7 @@ bool cmProcessOutput::DecodeText(std::st
+ } else {
+ bool restoreDecoded = false;
+ std::string firstDecoded = decoded;
+- wchar_t lastChar = 0;
++ char lastChar = 0;
+ for (UINT i = 0; i < cpinfo.MaxCharSize; i++) {
+ success = DoDecodeText(raw, decoded, &lastChar);
+ if (success && lastChar != 0) {
+@@ -141,12 +141,12 @@ bool cmProcessOutput::DecodeText(std::ve
+
+ #if defined(_WIN32)
+ bool cmProcessOutput::DoDecodeText(std::string raw, std::string& decoded,
+- wchar_t* lastChar)
++ char* lastChar)
+ {
+ bool success = false;
+ const int wlength =
+ MultiByteToWideChar(codepage, 0, raw.c_str(), int(raw.size()), NULL, 0);
+- auto wdata = cm::make_unique<wchar_t[]>(wlength);
++ auto wdata = cm::make_unique<char[]>(wlength);
+ int r = MultiByteToWideChar(codepage, 0, raw.c_str(), int(raw.size()),
+ wdata.get(), wlength);
+ if (r > 0) {
+diff -urp a/Source/cmProcessOutput.h b/Source/cmProcessOutput.h
+--- a/Source/cmProcessOutput.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmProcessOutput.h 2021-02-11 18:43:33.152508833 +0330
+@@ -80,6 +80,6 @@ private:
+ unsigned int codepage;
+ unsigned int bufferSize;
+ std::vector<std::string> rawparts;
+- bool DoDecodeText(std::string raw, std::string& decoded, wchar_t* lastChar);
++ bool DoDecodeText(std::string raw, std::string& decoded, char* lastChar);
+ #endif
+ };
+diff -urp a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
+--- a/Source/cmSystemTools.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmSystemTools.cxx 2021-02-11 18:43:33.025840162 +0330
+@@ -128,7 +128,7 @@ static int cm_archive_read_open_file(str
+ int block_size)
+ {
+ # if cmsys_STL_HAS_WSTRING
+- std::wstring wfile = cmsys::Encoding::ToWide(file);
++ std::string wfile = cmsys::Encoding::ToWide(file);
+ return archive_read_open_filename_w(a, wfile.c_str(), block_size);
+ # else
+ return archive_read_open_filename(a, file, block_size);
+@@ -759,7 +759,7 @@ namespace {
+ class SaveRestoreFileAttributes
+ {
+ public:
+- SaveRestoreFileAttributes(std::wstring const& path,
++ SaveRestoreFileAttributes(std::string const& path,
+ uint32_t file_attrs_to_set);
+ ~SaveRestoreFileAttributes();
+
+@@ -767,15 +767,15 @@ public:
+ SaveRestoreFileAttributes& operator=(SaveRestoreFileAttributes const&) =
+ delete;
+
+- void SetPath(std::wstring const& path) { path_ = path; }
++ void SetPath(std::string const& path) { path_ = path; }
+
+ private:
+- std::wstring path_;
++ std::string path_;
+ uint32_t original_attr_bits_;
+ };
+
+ SaveRestoreFileAttributes::SaveRestoreFileAttributes(
+- std::wstring const& path, uint32_t file_attrs_to_set)
++ std::string const& path, uint32_t file_attrs_to_set)
+ : path_(path)
+ , original_attr_bits_(0)
+ {
+@@ -809,14 +809,14 @@ struct WindowsFileRetryInit
+ bool Explicit;
+ };
+
+-WindowsFileRetryInit InitWindowsFileRetry(wchar_t const* const values[2],
++WindowsFileRetryInit InitWindowsFileRetry(char const* const values[2],
+ unsigned int const defaults[2])
+ {
+ unsigned int data[2] = { 0, 0 };
+ HKEY const keys[2] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
+ for (int k = 0; k < 2; ++k) {
+ HKEY hKey;
+- if (RegOpenKeyExW(keys[k], L"Software\\Kitware\\CMake\\Config", 0,
++ if (RegOpenKeyExW(keys[k], "Software\\Kitware\\CMake\\Config", 0,
+ KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
+ for (int v = 0; v < 2; ++v) {
+ DWORD dwData, dwType, dwSize = 4;
+@@ -839,16 +839,16 @@ WindowsFileRetryInit InitWindowsFileRetr
+
+ WindowsFileRetryInit InitWindowsFileRetry()
+ {
+- static wchar_t const* const values[2] = { L"FilesystemRetryCount",
+- L"FilesystemRetryDelay" };
++ static char const* const values[2] = { "FilesystemRetryCount",
++ "FilesystemRetryDelay" };
+ static unsigned int const defaults[2] = { 5, 500 };
+ return InitWindowsFileRetry(values, defaults);
+ }
+
+ WindowsFileRetryInit InitWindowsDirectoryRetry()
+ {
+- static wchar_t const* const values[2] = { L"FilesystemDirectoryRetryCount",
+- L"FilesystemDirectoryRetryDelay" };
++ static char const* const values[2] = { "FilesystemDirectoryRetryCount",
++ "FilesystemDirectoryRetryDelay" };
+ static unsigned int const defaults[2] = { 120, 500 };
+ WindowsFileRetryInit dirInit = InitWindowsFileRetry(values, defaults);
+ if (dirInit.Explicit) {
+@@ -861,7 +861,7 @@ WindowsFileRetryInit InitWindowsDirector
+ return dirInit;
+ }
+
+-cmSystemTools::WindowsFileRetry GetWindowsRetry(std::wstring const& path)
++cmSystemTools::WindowsFileRetry GetWindowsRetry(std::string const& path)
+ {
+ // If we are performing a directory operation, then try and get the
+ // appropriate timing info.
+@@ -946,7 +946,7 @@ void cmSystemTools::InitializeLibUV()
+
+ #ifdef _WIN32
+ namespace {
+-bool cmMoveFile(std::wstring const& oldname, std::wstring const& newname)
++bool cmMoveFile(std::string const& oldname, std::string const& newname)
+ {
+ // Not only ignore any previous error, but clear any memory of it.
+ SetLastError(0);
+@@ -965,9 +965,9 @@ bool cmSystemTools::RenameFile(const std
+ # ifndef INVALID_FILE_ATTRIBUTES
+ # define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
+ # endif
+- std::wstring const oldname_wstr =
++ std::string const oldname_wstr =
+ SystemTools::ConvertToWindowsExtendedPath(oldname);
+- std::wstring const newname_wstr =
++ std::string const newname_wstr =
+ SystemTools::ConvertToWindowsExtendedPath(newname);
+
+ /* Windows MoveFileEx may not replace read-only or in-use files. If it
+@@ -2082,7 +2082,7 @@ void cmSystemTools::FindCMakeResources(c
+ std::string exe_dir;
+ #if defined(_WIN32) && !defined(__CYGWIN__)
+ (void)argv0; // ignore this on windows
+- wchar_t modulepath[_MAX_PATH];
++ char modulepath[_MAX_PATH];
+ ::GetModuleFileNameW(NULL, modulepath, sizeof(modulepath));
+ std::string path = cmsys::Encoding::ToNarrow(modulepath);
+ std::string realPath =
+diff -urp a/Source/cmVSSetupHelper.cxx b/Source/cmVSSetupHelper.cxx
+--- a/Source/cmVSSetupHelper.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmVSSetupHelper.cxx 2021-02-12 14:39:59.854519416 +0330
+@@ -47,10 +47,10 @@ const CLSID CLSID_SetupConfiguration = {
+ #endif
+
+ const WCHAR* Win10SDKComponent =
+- L"Microsoft.VisualStudio.Component.Windows10SDK";
++ "Microsoft.VisualStudio.Component.Windows10SDK";
+ const WCHAR* Win81SDKComponent =
+- L"Microsoft.VisualStudio.Component.Windows81SDK";
+-const WCHAR* ComponentType = L"Component";
++ "Microsoft.VisualStudio.Component.Windows81SDK";
++const WCHAR* ComponentType = "Component";
+
+ std::string VSInstanceInfo::GetInstallLocation() const
+ {
+@@ -124,13 +124,13 @@ bool cmVSSetupAPIHelper::CheckInstalledC
+ return ret;
+ }
+
+- std::wstring id = std::wstring(bstrId);
+- std::wstring type = std::wstring(bstrType);
++ std::string id = std::string(bstrId);
++ std::string type = std::string(bstrType);
+
+ // Checks for any version of Win10 SDK. The version is appended at the end of
+ // the
+ // component name ex: Microsoft.VisualStudio.Component.Windows10SDK.10240
+- if (id.find(Win10SDKComponent) != std::wstring::npos &&
++ if (id.find(Win10SDKComponent) != std::string::npos &&
+ type.compare(ComponentType) == 0) {
+ bWin10SDK = true;
+ ret = true;
+@@ -154,7 +154,7 @@ bool cmVSSetupAPIHelper::GetVSInstanceIn
+
+ SmartBSTR bstrId;
+ if (SUCCEEDED(pInstance->GetInstanceId(&bstrId))) {
+- vsInstanceInfo.InstanceId = std::wstring(bstrId);
++ vsInstanceInfo.InstanceId = std::string(bstrId);
+ } else {
+ return false;
+ }
+@@ -169,7 +169,7 @@ bool cmVSSetupAPIHelper::GetVSInstanceIn
+ if (FAILED(pInstance->GetInstallationVersion(&bstrVersion))) {
+ return false;
+ } else {
+- vsInstanceInfo.Version = std::wstring(bstrVersion);
++ vsInstanceInfo.Version = std::string(bstrVersion);
+ if (FAILED(setupHelper->ParseVersion(bstrVersion, &ullVersion))) {
+ vsInstanceInfo.ullVersion = 0;
+ } else {
+@@ -183,7 +183,7 @@ bool cmVSSetupAPIHelper::GetVSInstanceIn
+ if (FAILED(pInstance->GetInstallationPath(&bstrInstallationPath))) {
+ return false;
+ } else {
+- vsInstanceInfo.VSInstallLocation = std::wstring(bstrInstallationPath);
++ vsInstanceInfo.VSInstallLocation = std::string(bstrInstallationPath);
+ }
+ }
+
+@@ -300,7 +300,7 @@ bool cmVSSetupAPIHelper::IsEWDKEnabled()
+ bool cmVSSetupAPIHelper::EnumerateAndChooseVSInstance()
+ {
+ bool isVSInstanceExists = false;
+- if (chosenInstanceInfo.VSInstallLocation.compare(L"") != 0) {
++ if (chosenInstanceInfo.VSInstallLocation.compare("") != 0) {
+ return true;
+ }
+
+@@ -314,9 +314,9 @@ bool cmVSSetupAPIHelper::EnumerateAndCho
+ return false;
+
+ chosenInstanceInfo.VSInstallLocation =
+- std::wstring(envVsInstallDir.begin(), envVsInstallDir.end());
++ std::string(envVsInstallDir.begin(), envVsInstallDir.end());
+ chosenInstanceInfo.Version =
+- std::wstring(envVSVersion.begin(), envVSVersion.end());
++ std::string(envVSVersion.begin(), envVSVersion.end());
+ chosenInstanceInfo.VCToolsetVersion = envVSVersion;
+ chosenInstanceInfo.ullVersion = std::stoi(envVSVersion);
+ chosenInstanceInfo.IsWin10SDKInstalled = true;
+@@ -345,7 +345,7 @@ bool cmVSSetupAPIHelper::EnumerateAndCho
+ return false;
+ }
+
+- std::wstring const wantVersion = std::to_wstring(this->Version) + L'.';
++ std::string const wantVersion = std::to_wstring(this->Version) + L'.';
+
+ SmartCOMPtr<ISetupInstance> instance;
+ while (SUCCEEDED(enumInstances->Next(1, &instance, NULL)) && instance) {
+diff -urp a/Source/cmVSSetupHelper.h b/Source/cmVSSetupHelper.h
+--- a/Source/cmVSSetupHelper.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/cmVSSetupHelper.h 2021-02-11 18:43:33.159175606 +0330
+@@ -84,9 +84,9 @@ private:
+
+ struct VSInstanceInfo
+ {
+- std::wstring InstanceId;
+- std::wstring VSInstallLocation;
+- std::wstring Version;
++ std::string InstanceId;
++ std::string VSInstallLocation;
++ std::string Version;
+ std::string VCToolsetVersion;
+ ULONGLONG ullVersion = 0;
+ bool IsWin10SDKInstalled = false;
+diff -urp a/Source/CPack/WiX/cmCPackWIXGenerator.cxx b/Source/CPack/WiX/cmCPackWIXGenerator.cxx
+--- a/Source/CPack/WiX/cmCPackWIXGenerator.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/CPack/WiX/cmCPackWIXGenerator.cxx 2021-02-11 18:43:33.145842061 +0330
+@@ -1008,7 +1008,7 @@ std::string cmCPackWIXGenerator::Generat
+ UuidToStringW(&guid, &tmp);
+
+ std::string result =
+- cmsys::Encoding::ToNarrow(reinterpret_cast<wchar_t*>(tmp));
++ cmsys::Encoding::ToNarrow(reinterpret_cast<char*>(tmp));
+ RpcStringFreeW(&tmp);
+ #else
+ uuid_t guid;
+diff -urp a/Source/kwsys/ConsoleBuf.hxx.in b/Source/kwsys/ConsoleBuf.hxx.in
+--- a/Source/kwsys/ConsoleBuf.hxx.in 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/ConsoleBuf.hxx.in 2021-02-11 18:43:32.755835869 +0330
+@@ -111,7 +111,7 @@ protected:
+ success = false;
+ }
+ if (m_hOutput && !m_obuffer.empty()) {
+- const std::wstring wbuffer = getBuffer(m_obuffer);
++ const std::string wbuffer = getBuffer(m_obuffer);
+ if (m_isConsoleOutput) {
+ DWORD charsWritten;
+ success =
+@@ -149,7 +149,7 @@ protected:
+ if (m_isConsoleInput) {
+ // ReadConsole doesn't tell if there's more input available
+ // don't support reading more characters than this
+- wchar_t wbuffer[8192];
++ char wbuffer[8192];
+ DWORD charsRead;
+ if (ReadConsoleW(m_hInput, wbuffer,
+ (sizeof(wbuffer) / sizeof(wbuffer[0])), &charsRead,
+@@ -158,9 +158,9 @@ protected:
+ _setg(true);
+ return Traits::eof();
+ }
+- setBuffer(std::wstring(wbuffer, charsRead), m_ibuffer);
++ setBuffer(std::string(wbuffer, charsRead), m_ibuffer);
+ } else {
+- std::wstring wbuffer;
++ std::string wbuffer;
+ std::string strbuffer;
+ DWORD bytesRead;
+ LARGE_INTEGER size;
+@@ -320,7 +320,7 @@ private:
+ this->setp((char_type*)m_obuffer.data(),
+ (char_type*)m_obuffer.data() + m_obuffer.size());
+ }
+- bool encodeOutputBuffer(const std::wstring wbuffer, std::string& buffer)
++ bool encodeOutputBuffer(const std::string wbuffer, std::string& buffer)
+ {
+ if (wbuffer.size() == 0) {
+ buffer = std::string();
+@@ -340,11 +340,11 @@ private:
+ delete[] buf;
+ return success;
+ }
+- bool decodeInputBuffer(const std::string buffer, std::wstring& wbuffer)
++ bool decodeInputBuffer(const std::string buffer, std::string& wbuffer)
+ {
+ size_t length = buffer.length();
+ if (length == 0) {
+- wbuffer = std::wstring();
++ wbuffer = std::string();
+ return true;
+ }
+ int actualCodepage = m_activeInputCodepage;
+@@ -359,30 +359,30 @@ private:
+ }
+ const size_t wlength = static_cast<size_t>(MultiByteToWideChar(
+ actualCodepage, 0, data, static_cast<int>(length), nullptr, 0));
+- wchar_t* wbuf = new wchar_t[wlength];
++ char* wbuf = new char[wlength];
+ const bool success =
+ MultiByteToWideChar(actualCodepage, 0, data, static_cast<int>(length),
+ wbuf, static_cast<int>(wlength)) > 0
+ ? true
+ : false;
+- wbuffer = std::wstring(wbuf, wlength);
++ wbuffer = std::string(wbuf, wlength);
+ delete[] wbuf;
+ return success;
+ }
+- std::wstring getBuffer(const std::basic_string<char> buffer)
++ std::string getBuffer(const std::basic_string<char> buffer)
+ {
+ return Encoding::ToWide(buffer);
+ }
+- std::wstring getBuffer(const std::basic_string<wchar_t> buffer)
++ std::string getBuffer(const std::basic_string<char> buffer)
+ {
+ return buffer;
+ }
+- void setBuffer(const std::wstring wbuffer, std::basic_string<char>& target)
++ void setBuffer(const std::string wbuffer, std::basic_string<char>& target)
+ {
+ target = Encoding::ToNarrow(wbuffer);
+ }
+- void setBuffer(const std::wstring wbuffer,
+- std::basic_string<wchar_t>& target)
++ void setBuffer(const std::string wbuffer,
++ std::basic_string<char>& target)
+ {
+ target = wbuffer;
+ }
+@@ -390,7 +390,7 @@ private:
+ }; // BasicConsoleBuf class
+
+ typedef BasicConsoleBuf<char> ConsoleBuf;
+-typedef BasicConsoleBuf<wchar_t> WConsoleBuf;
++typedef BasicConsoleBuf<char> WConsoleBuf;
+
+ #endif
+ } // KWSYS_NAMESPACE
+diff -urp a/Source/kwsys/Directory.cxx b/Source/kwsys/Directory.cxx
+--- a/Source/kwsys/Directory.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/Directory.cxx 2021-02-11 18:43:32.782502961 +0330
+@@ -117,7 +117,7 @@ bool Directory::Load(const std::string&
+
+ // Now put them into the file array
+ srchHandle =
+- _wfindfirst((wchar_t*)Encoding::ToWindowsExtendedPath(buf).c_str(), &data);
++ _wfindfirst((char*)Encoding::ToWindowsExtendedPath(buf).c_str(), &data);
+ delete[] buf;
+
+ if (srchHandle == -1) {
+@@ -148,7 +148,7 @@ unsigned long Directory::GetNumberOfFile
+ struct _wfinddata_t data; // data of current file
+
+ // Now put them into the file array
+- srchHandle = _wfindfirst((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
++ srchHandle = _wfindfirst((char*)Encoding::ToWide(buf).c_str(), &data);
+ delete[] buf;
+
+ if (srchHandle == -1) {
+diff -urp a/Source/kwsys/DynamicLoader.cxx b/Source/kwsys/DynamicLoader.cxx
+--- a/Source/kwsys/DynamicLoader.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/DynamicLoader.cxx 2021-02-11 18:43:32.762502643 +0330
+@@ -263,7 +263,7 @@ DynamicLoader::SymbolPointer DynamicLoad
+
+ const char* DynamicLoader::LastError()
+ {
+- wchar_t lpMsgBuf[DYNLOAD_ERROR_BUFFER_SIZE + 1];
++ char lpMsgBuf[DYNLOAD_ERROR_BUFFER_SIZE + 1];
+
+ DWORD error = GetLastError();
+ DWORD length = FormatMessageW(
+diff -urp a/Source/kwsys/EncodingC.c b/Source/kwsys/EncodingC.c
+--- a/Source/kwsys/EncodingC.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/EncodingC.c 2021-02-11 18:43:32.749169097 +0330
+@@ -15,7 +15,7 @@
+ # include <windows.h>
+ #endif
+
+-size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* str, size_t n)
++size_t kwsysEncoding_mbstowcs(char* dest, const char* str, size_t n)
+ {
+ if (str == 0) {
+ return (size_t)-1;
+@@ -29,12 +29,12 @@ size_t kwsysEncoding_mbstowcs(wchar_t* d
+ #endif
+ }
+
+-wchar_t* kwsysEncoding_DupToWide(const char* str)
++char* kwsysEncoding_DupToWide(const char* str)
+ {
+- wchar_t* ret = NULL;
++ char* ret = NULL;
+ size_t length = kwsysEncoding_mbstowcs(NULL, str, 0) + 1;
+ if (length > 0) {
+- ret = (wchar_t*)malloc((length) * sizeof(wchar_t));
++ ret = (char*)malloc((length) * sizeof(char));
+ if (ret) {
+ ret[0] = 0;
+ kwsysEncoding_mbstowcs(ret, str, length);
+@@ -43,7 +43,7 @@ wchar_t* kwsysEncoding_DupToWide(const c
+ return ret;
+ }
+
+-size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* str, size_t n)
++size_t kwsysEncoding_wcstombs(char* dest, const char* str, size_t n)
+ {
+ if (str == 0) {
+ return (size_t)-1;
+@@ -57,7 +57,7 @@ size_t kwsysEncoding_wcstombs(char* dest
+ #endif
+ }
+
+-char* kwsysEncoding_DupToNarrow(const wchar_t* str)
++char* kwsysEncoding_DupToNarrow(const char* str)
+ {
+ char* ret = NULL;
+ size_t length = kwsysEncoding_wcstombs(0, str, 0) + 1;
+diff -urp a/Source/kwsys/EncodingCXX.cxx b/Source/kwsys/EncodingCXX.cxx
+--- a/Source/kwsys/EncodingCXX.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/EncodingCXX.cxx 2021-02-12 14:39:55.148193613 +0330
+@@ -68,16 +68,6 @@ Encoding::CommandLineArguments::CommandL
+ this->argv_[ac] = nullptr;
+ }
+
+-Encoding::CommandLineArguments::CommandLineArguments(int ac,
+- wchar_t const* const* av)
+-{
+- this->argv_.resize(ac + 1);
+- for (int i = 0; i < ac; i++) {
+- this->argv_[i] = kwsysEncoding_DupToNarrow(av[i]);
+- }
+- this->argv_[ac] = nullptr;
+-}
+-
+ Encoding::CommandLineArguments::~CommandLineArguments()
+ {
+ for (size_t i = 0; i < this->argv_.size(); i++) {
+@@ -124,19 +114,19 @@ char const* const* Encoding::CommandLine
+
+ #if KWSYS_STL_HAS_WSTRING
+
+-std::wstring Encoding::ToWide(const std::string& str)
++std::string Encoding::ToWide(const std::string& str)
+ {
+- std::wstring wstr;
++ std::string wstr;
+ # if defined(_WIN32)
+ const int wlength =
+ MultiByteToWideChar(KWSYS_ENCODING_DEFAULT_CODEPAGE, 0, str.data(),
+ int(str.size()), nullptr, 0);
+ if (wlength > 0) {
+- wchar_t* wdata = new wchar_t[wlength];
++ char* wdata = new char[wlength];
+ int r = MultiByteToWideChar(KWSYS_ENCODING_DEFAULT_CODEPAGE, 0, str.data(),
+ int(str.size()), wdata, wlength);
+ if (r > 0) {
+- wstr = std::wstring(wdata, wlength);
++ wstr = std::string(wdata, wlength);
+ }
+ delete[] wdata;
+ }
+@@ -150,14 +140,14 @@ std::wstring Encoding::ToWide(const std:
+ nullPos = str.find('\0', pos);
+ if (nullPos != std::string::npos) {
+ pos = nullPos + 1;
+- wstr += wchar_t('\0');
++ wstr += char('\0');
+ }
+ } while (nullPos != std::string::npos);
+ # endif
+ return wstr;
+ }
+
+-std::string Encoding::ToNarrow(const std::wstring& str)
++std::string Encoding::ToNarrow(const std::string& str)
+ {
+ std::string nstr;
+ # if defined(_WIN32)
+@@ -181,7 +171,7 @@ std::string Encoding::ToNarrow(const std
+ if (pos < str.size() && str.at(pos) != '\0') {
+ nstr += ToNarrow(str.c_str() + pos);
+ }
+- nullPos = str.find(wchar_t('\0'), pos);
++ nullPos = str.find(char('\0'), pos);
+ if (nullPos != std::string::npos) {
+ pos = nullPos + 1;
+ nstr += '\0';
+@@ -191,12 +181,12 @@ std::string Encoding::ToNarrow(const std
+ return nstr;
+ }
+
+-std::wstring Encoding::ToWide(const char* cstr)
++std::string Encoding::ToWide(const char* cstr)
+ {
+- std::wstring wstr;
++ std::string wstr;
+ size_t length = kwsysEncoding_mbstowcs(nullptr, cstr, 0) + 1;
+ if (length > 0) {
+- std::vector<wchar_t> wchars(length);
++ std::vector<char> wchars(length);
+ if (kwsysEncoding_mbstowcs(&wchars[0], cstr, length) > 0) {
+ wstr = &wchars[0];
+ }
+@@ -204,7 +194,7 @@ std::wstring Encoding::ToWide(const char
+ return wstr;
+ }
+
+-std::string Encoding::ToNarrow(const wchar_t* wcstr)
++std::string Encoding::ToNarrow(const char* wcstr)
+ {
+ std::string str;
+ size_t length = kwsysEncoding_wcstombs(nullptr, wcstr, 0) + 1;
+@@ -219,19 +209,19 @@ std::string Encoding::ToNarrow(const wch
+
+ # if defined(_WIN32)
+ // Convert local paths to UNC style paths
+-std::wstring Encoding::ToWindowsExtendedPath(std::string const& source)
++std::string Encoding::ToWindowsExtendedPath(std::string const& source)
+ {
+ return ToWindowsExtendedPath(ToWide(source));
+ }
+
+ // Convert local paths to UNC style paths
+-std::wstring Encoding::ToWindowsExtendedPath(const char* source)
++std::string Encoding::ToWindowsExtendedPath(const char* source)
+ {
+ return ToWindowsExtendedPath(ToWide(source));
+ }
+
+ // Convert local paths to UNC style paths
+-std::wstring Encoding::ToWindowsExtendedPath(std::wstring const& wsource)
++std::string Encoding::ToWindowsExtendedPath(std::string const& wsource)
+ {
+ // Resolve any relative paths
+ DWORD wfull_len;
+@@ -239,7 +229,7 @@ std::wstring Encoding::ToWindowsExtended
+ /* The +3 is a workaround for a bug in some versions of GetFullPathNameW that
+ * won't return a large enough buffer size if the input is too small */
+ wfull_len = GetFullPathNameW(wsource.c_str(), 0, nullptr, nullptr) + 3;
+- std::vector<wchar_t> wfull(wfull_len);
++ std::vector<char> wfull(wfull_len);
+ GetFullPathNameW(wsource.c_str(), wfull_len, &wfull[0], nullptr);
+
+ /* This should get the correct size without any extra padding from the
+@@ -248,7 +238,7 @@ std::wstring Encoding::ToWindowsExtended
+
+ if (wfull_len >= 2 && isalpha(wfull[0]) &&
+ wfull[1] == L':') { /* C:\Foo\bar\FooBar.txt */
+- return L"\\\\?\\" + std::wstring(&wfull[0]);
++ return "\\\\?\\" + std::string(&wfull[0]);
+ } else if (wfull_len >= 2 && wfull[0] == L'\\' &&
+ wfull[1] == L'\\') { /* Starts with \\ */
+ if (wfull_len >= 4 && wfull[2] == L'?' &&
+@@ -256,24 +246,24 @@ std::wstring Encoding::ToWindowsExtended
+ if (wfull_len >= 8 && wfull[4] == L'U' && wfull[5] == L'N' &&
+ wfull[6] == L'C' &&
+ wfull[7] == L'\\') { /* \\?\UNC\Foo\bar\FooBar.txt */
+- return std::wstring(&wfull[0]);
++ return std::string(&wfull[0]);
+ } else if (wfull_len >= 6 && isalpha(wfull[4]) &&
+ wfull[5] == L':') { /* \\?\C:\Foo\bar\FooBar.txt */
+- return std::wstring(&wfull[0]);
++ return std::string(&wfull[0]);
+ } else if (wfull_len >= 5) { /* \\?\Foo\bar\FooBar.txt */
+- return L"\\\\?\\UNC\\" + std::wstring(&wfull[4]);
++ return "\\\\?\\UNC\\" + std::string(&wfull[4]);
+ }
+ } else if (wfull_len >= 4 && wfull[2] == L'.' &&
+ wfull[3] == L'\\') { /* Starts with \\.\ a device name */
+ if (wfull_len >= 6 && isalpha(wfull[4]) &&
+ wfull[5] == L':') { /* \\.\C:\Foo\bar\FooBar.txt */
+- return L"\\\\?\\" + std::wstring(&wfull[4]);
++ return "\\\\?\\" + std::string(&wfull[4]);
+ } else if (wfull_len >=
+ 5) { /* \\.\Foo\bar\ Device name is left unchanged */
+- return std::wstring(&wfull[0]);
++ return std::string(&wfull[0]);
+ }
+ } else if (wfull_len >= 3) { /* \\Foo\bar\FooBar.txt */
+- return L"\\\\?\\UNC\\" + std::wstring(&wfull[2]);
++ return "\\\\?\\UNC\\" + std::string(&wfull[2]);
+ }
+ }
+
+diff -urp a/Source/kwsys/Encoding.h.in b/Source/kwsys/Encoding.h.in
+--- a/Source/kwsys/Encoding.h.in 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/Encoding.h.in 2021-02-11 18:43:32.759169256 +0330
+@@ -31,22 +31,22 @@ extern "C" {
+ On Windows, UTF-8 is assumed, and on other platforms,
+ the current locale is assumed.
+ */
+-kwsysEXPORT size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* src,
++kwsysEXPORT size_t kwsysEncoding_mbstowcs(char* dest, const char* src,
+ size_t n);
+
+ /* Convert a narrow string to a wide string.
+ This can return NULL if the conversion fails. */
+-kwsysEXPORT wchar_t* kwsysEncoding_DupToWide(const char* src);
++kwsysEXPORT char* kwsysEncoding_DupToWide(const char* src);
+
+ /* Convert a wide string to a narrow string.
+ On Windows, UTF-8 is assumed, and on other platforms,
+ the current locale is assumed. */
+-kwsysEXPORT size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* src,
++kwsysEXPORT size_t kwsysEncoding_wcstombs(char* dest, const char* src,
+ size_t n);
+
+ /* Convert a wide string to a narrow string.
+ This can return NULL if the conversion fails. */
+-kwsysEXPORT char* kwsysEncoding_DupToNarrow(const wchar_t* str);
++kwsysEXPORT char* kwsysEncoding_DupToNarrow(const char* str);
+
+ #if defined(__cplusplus)
+ } /* extern "C" */
+diff -urp a/Source/kwsys/Encoding.hxx.in b/Source/kwsys/Encoding.hxx.in
+--- a/Source/kwsys/Encoding.hxx.in 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/Encoding.hxx.in 2021-02-12 14:39:55.148193613 +0330
+@@ -27,9 +27,6 @@ public:
+ // in the encoding used by this module.
+ CommandLineArguments(int argc, char const* const* argv);
+
+- // Construct CommandLineArguments with the given
+- // argc and wide argv. This is useful if wmain() is used.
+- CommandLineArguments(int argc, wchar_t const* const* argv);
+ ~CommandLineArguments();
+ CommandLineArguments(const CommandLineArguments&);
+ CommandLineArguments& operator=(const CommandLineArguments&);
+@@ -42,7 +39,7 @@ public:
+ };
+
+ /**
+- * Convert between char and wchar_t
++ * Convert between char and char
+ */
+
+ #if @KWSYS_NAMESPACE@_STL_HAS_WSTRING
+@@ -50,14 +47,14 @@ public:
+ // Convert a narrow string to a wide string.
+ // On Windows, UTF-8 is assumed, and on other platforms,
+ // the current locale is assumed.
+- static std::wstring ToWide(const std::string& str);
+- static std::wstring ToWide(const char* str);
++ static std::string ToWide(const std::string& str);
++ static std::string ToWide(const char* str);
+
+ // Convert a wide string to a narrow string.
+ // On Windows, UTF-8 is assumed, and on other platforms,
+ // the current locale is assumed.
+- static std::string ToNarrow(const std::wstring& str);
+- static std::string ToNarrow(const wchar_t* str);
++ static std::string ToNarrow(const std::string& str);
++ static std::string ToNarrow(const char* str);
+
+ # if defined(_WIN32)
+ /**
+@@ -67,9 +64,8 @@ public:
+ * will be prefixed with \\?\UNC\. All output will also be converted to
+ * absolute paths with Windows-style backslashes.
+ **/
+- static std::wstring ToWindowsExtendedPath(std::string const&);
+- static std::wstring ToWindowsExtendedPath(const char* source);
+- static std::wstring ToWindowsExtendedPath(std::wstring const& wsource);
++ static std::string ToWindowsExtendedPath(std::string const&);
++ static std::string ToWindowsExtendedPath(const char* source);
+ # endif
+
+ #endif // @KWSYS_NAMESPACE@_STL_HAS_WSTRING
+diff -urp a/Source/kwsys/FStream.hxx.in b/Source/kwsys/FStream.hxx.in
+--- a/Source/kwsys/FStream.hxx.in 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/FStream.hxx.in 2021-02-11 18:43:32.765836028 +0330
+@@ -33,7 +33,7 @@ public:
+ typedef std::basic_filebuf<CharType, Traits> my_base_type;
+ basic_filebuf* open(char const* s, std::ios_base::openmode mode)
+ {
+- const std::wstring wstr = Encoding::ToWindowsExtendedPath(s);
++ const std::string wstr = Encoding::ToWindowsExtendedPath(s);
+ return static_cast<basic_filebuf*>(my_base_type::open(wstr.c_str(), mode));
+ }
+ # endif
+@@ -41,28 +41,28 @@ public:
+
+ # else
+
+-inline std::wstring getcmode(const std::ios_base::openmode mode)
++inline std::string getcmode(const std::ios_base::openmode mode)
+ {
+- std::wstring cmode;
++ std::string cmode;
+ bool plus = false;
+ if (mode & std::ios_base::app) {
+- cmode += L"a";
++ cmode += "a";
+ plus = mode & std::ios_base::in ? true : false;
+ } else if (mode & std::ios_base::trunc ||
+ (mode & std::ios_base::out && (mode & std::ios_base::in) == 0)) {
+- cmode += L"w";
++ cmode += "w";
+ plus = mode & std::ios_base::in ? true : false;
+ } else {
+- cmode += L"r";
++ cmode += "r";
+ plus = mode & std::ios_base::out ? true : false;
+ }
+ if (plus) {
+- cmode += L"+";
++ cmode += "+";
+ }
+ if (mode & std::ios_base::binary) {
+- cmode += L"b";
++ cmode += "b";
+ } else {
+- cmode += L"t";
++ cmode += "t";
+ }
+ return cmode;
+ };
+@@ -93,9 +93,9 @@ public:
+ # if defined(_MSC_VER)
+ const bool success = buf_->open(file_name, mode) != 0;
+ # else
+- const std::wstring wstr = Encoding::ToWindowsExtendedPath(file_name);
++ const std::string wstr = Encoding::ToWindowsExtendedPath(file_name);
+ bool success = false;
+- std::wstring cmode = getcmode(mode);
++ std::string cmode = getcmode(mode);
+ file_ = _wfopen(wstr.c_str(), cmode.c_str());
+ if (file_) {
+ if (buf_) {
+diff -urp a/Source/kwsys/kwsysPlatformTestsCXX.cxx b/Source/kwsys/kwsysPlatformTestsCXX.cxx
+--- a/Source/kwsys/kwsysPlatformTestsCXX.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/kwsysPlatformTestsCXX.cxx 2021-02-12 14:39:59.854519416 +0330
+@@ -156,7 +156,7 @@ int main()
+
+ #ifdef TEST_KWSYS_STL_HAS_WSTRING
+ # include <string>
+-void f(std::wstring*)
++void f(std::string*)
+ {
+ }
+ int main()
+diff -urp a/Source/kwsys/ProcessWin32.c b/Source/kwsys/ProcessWin32.c
+--- a/Source/kwsys/ProcessWin32.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/ProcessWin32.c 2021-02-11 18:43:32.785836347 +0330
+@@ -202,14 +202,14 @@ struct kwsysProcess_s
+ int State;
+
+ /* The command lines to execute. */
+- wchar_t** Commands;
++ char** Commands;
+ int NumberOfCommands;
+
+ /* The exit code of each command. */
+ DWORD* CommandExitCodes;
+
+ /* The working directory for the child process. */
+- wchar_t* WorkingDirectory;
++ char* WorkingDirectory;
+
+ /* Whether to create the child as a detached process. */
+ int OptionDetach;
+@@ -301,7 +301,7 @@ struct kwsysProcess_s
+
+ /* Real working directory of our own process. */
+ DWORD RealWorkingDirectoryLength;
+- wchar_t* RealWorkingDirectory;
++ char* RealWorkingDirectory;
+
+ /* Own handles for the child's ends of the pipes in the parent process.
+ Used temporarily during process creation. */
+@@ -549,7 +549,7 @@ int kwsysProcess_SetCommand(kwsysProcess
+ int kwsysProcess_AddCommand(kwsysProcess* cp, char const* const* command)
+ {
+ int newNumberOfCommands;
+- wchar_t** newCommands;
++ char** newCommands;
+
+ /* Make sure we have a command to add. */
+ if (!cp || !command || !*command) {
+@@ -559,7 +559,7 @@ int kwsysProcess_AddCommand(kwsysProcess
+ /* Allocate a new array for command pointers. */
+ newNumberOfCommands = cp->NumberOfCommands + 1;
+ if (!(newCommands =
+- (wchar_t**)malloc(sizeof(wchar_t*) * newNumberOfCommands))) {
++ (char**)malloc(sizeof(char*) * newNumberOfCommands))) {
+ /* Out of memory. */
+ return 0;
+ }
+@@ -664,11 +664,11 @@ int kwsysProcess_SetWorkingDirectory(kws
+ cp->WorkingDirectory = 0;
+ }
+ if (dir && dir[0]) {
+- wchar_t* wdir = kwsysEncoding_DupToWide(dir);
++ char* wdir = kwsysEncoding_DupToWide(dir);
+ /* We must convert the working directory to a full path. */
+ DWORD length = GetFullPathNameW(wdir, 0, 0, 0);
+ if (length > 0) {
+- wchar_t* work_dir = malloc(length * sizeof(wchar_t));
++ char* work_dir = malloc(length * sizeof(char));
+ if (!work_dir) {
+ free(wdir);
+ return 0;
+@@ -968,7 +968,7 @@ void kwsysProcess_Execute(kwsysProcess*
+ /* Setup the stdin pipe for the first process. */
+ if (cp->PipeFileSTDIN) {
+ /* Create a handle to read a file for stdin. */
+- wchar_t* wstdin = kwsysEncoding_DupToWide(cp->PipeFileSTDIN);
++ char* wstdin = kwsysEncoding_DupToWide(cp->PipeFileSTDIN);
+ DWORD error;
+ cp->PipeChildStd[0] =
+ CreateFileW(wstdin, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
+@@ -1630,7 +1630,7 @@ int kwsysProcessInitialize(kwsysProcess*
+ cp->RealWorkingDirectoryLength = GetCurrentDirectoryW(0, 0);
+ if (cp->RealWorkingDirectoryLength > 0) {
+ cp->RealWorkingDirectory =
+- malloc(cp->RealWorkingDirectoryLength * sizeof(wchar_t));
++ malloc(cp->RealWorkingDirectoryLength * sizeof(char));
+ if (!cp->RealWorkingDirectory) {
+ return 0;
+ }
+@@ -1796,7 +1796,7 @@ void kwsysProcessDestroy(kwsysProcess* c
+ DWORD kwsysProcessSetupOutputPipeFile(PHANDLE phandle, const char* name)
+ {
+ HANDLE fout;
+- wchar_t* wname;
++ char* wname;
+ DWORD error;
+ if (!name) {
+ return ERROR_INVALID_PARAMETER;
+@@ -1857,7 +1857,7 @@ void kwsysProcessCleanup(kwsysProcess* c
+ /* Construct an error message if one has not been provided already. */
+ if (cp->ErrorMessage[0] == 0) {
+ /* Format the error message. */
+- wchar_t err_msg[KWSYSPE_PIPE_BUFFER_SIZE];
++ char err_msg[KWSYSPE_PIPE_BUFFER_SIZE];
+ DWORD length = FormatMessageW(
+ FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), err_msg,
+@@ -2347,7 +2347,7 @@ static int kwsysProcess_List__New_NT4(kw
+ loaded in this program. This does not actually increment the
+ reference count to the module so we do not need to close the
+ handle. */
+- HMODULE hNT = GetModuleHandleW(L"ntdll.dll");
++ HMODULE hNT = GetModuleHandleW("ntdll.dll");
+ if (hNT) {
+ /* Get pointers to the needed API functions. */
+ self->P_ZwQuerySystemInformation =
+@@ -2428,7 +2428,7 @@ static int kwsysProcess_List__New_Snapsh
+ loaded in this program. This does not actually increment the
+ reference count to the module so we do not need to close the
+ handle. */
+- HMODULE hKernel = GetModuleHandleW(L"kernel32.dll");
++ HMODULE hKernel = GetModuleHandleW("kernel32.dll");
+ if (hKernel) {
+ self->P_CreateToolhelp32Snapshot =
+ ((CreateToolhelp32SnapshotType)GetProcAddress(
+diff -urp a/Source/kwsys/SystemInformation.cxx b/Source/kwsys/SystemInformation.cxx
+--- a/Source/kwsys/SystemInformation.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/SystemInformation.cxx 2021-02-12 14:39:59.854519416 +0330
+@@ -2559,7 +2559,7 @@ bool SystemInformationImplementation::Re
+ HKEY hKey = nullptr;
+ LONG err =
+ RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+- L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0,
++ "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0,
+ KEY_READ, &hKey);
+
+ if (ERROR_SUCCESS == err) {
+@@ -2568,7 +2568,7 @@ bool SystemInformationImplementation::Re
+ DWORD dwSize = sizeof(DWORD);
+
+ err =
+- RegQueryValueExW(hKey, L"~MHz", 0, &dwType, (LPBYTE)&data, &dwSize);
++ RegQueryValueExW(hKey, "~MHz", 0, &dwType, (LPBYTE)&data, &dwSize);
+
+ if (ERROR_SUCCESS == err) {
+ this->CPUSpeedInMHz = (float)data;
+@@ -3836,7 +3836,7 @@ double SystemInformationImplementation::
+ typedef BOOL(WINAPI * GetSystemTimesType)(LPFILETIME, LPFILETIME,
+ LPFILETIME);
+ static GetSystemTimesType pGetSystemTimes =
+- (GetSystemTimesType)GetProcAddress(GetModuleHandleW(L"kernel32"),
++ (GetSystemTimesType)GetProcAddress(GetModuleHandleW("kernel32"),
+ "GetSystemTimes");
+ FILETIME idleTime, kernelTime, userTime;
+ if (pGetSystemTimes && pGetSystemTimes(&idleTime, &kernelTime, &userTime)) {
+@@ -4383,7 +4383,7 @@ void SystemInformationImplementation::CP
+ PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD);
+ static GetLogicalProcessorInformationType pGetLogicalProcessorInformation =
+ (GetLogicalProcessorInformationType)GetProcAddress(
+- GetModuleHandleW(L"kernel32"), "GetLogicalProcessorInformation");
++ GetModuleHandleW("kernel32"), "GetLogicalProcessorInformation");
+
+ if (!pGetLogicalProcessorInformation) {
+ // Fallback to approximate implementation on ancient Windows versions.
+@@ -5267,21 +5267,21 @@ bool SystemInformationImplementation::Qu
+ # endif // VER_NT_WORKSTATION
+ {
+ HKEY hKey;
+- wchar_t szProductType[80];
++ char szProductType[80];
+ DWORD dwBufLen;
+
+ // Query the registry to retrieve information.
+ RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+- L"SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0,
++ "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0,
+ KEY_QUERY_VALUE, &hKey);
+- RegQueryValueExW(hKey, L"ProductType", nullptr, nullptr,
++ RegQueryValueExW(hKey, "ProductType", nullptr, nullptr,
+ (LPBYTE)szProductType, &dwBufLen);
+ RegCloseKey(hKey);
+
+- if (lstrcmpiW(L"WINNT", szProductType) == 0) {
++ if (lstrcmpiW("WINNT", szProductType) == 0) {
+ this->OSRelease += " Professional";
+ }
+- if (lstrcmpiW(L"LANMANNT", szProductType) == 0) {
++ if (lstrcmpiW("LANMANNT", szProductType) == 0) {
+ // Decide between Windows 2000 Advanced Server and Windows .NET
+ // Enterprise Server.
+ if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) {
+@@ -5290,7 +5290,7 @@ bool SystemInformationImplementation::Qu
+ this->OSRelease += " Server";
+ }
+ }
+- if (lstrcmpiW(L"SERVERNT", szProductType) == 0) {
++ if (lstrcmpiW("SERVERNT", szProductType) == 0) {
+ // Decide between Windows 2000 Advanced Server and Windows .NET
+ // Enterprise Server.
+ if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) {
+@@ -5315,7 +5315,7 @@ bool SystemInformationImplementation::Qu
+ LPFNPROC DLLProc;
+
+ // Load the Kernel32 DLL.
+- hKernelDLL = LoadLibraryW(L"kernel32");
++ hKernelDLL = LoadLibraryW("kernel32");
+ if (hKernelDLL != nullptr) {
+ // Only XP and .NET Server support IsWOW64Process so... Load
+ // dynamically!
+diff -urp a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
+--- a/Source/kwsys/SystemTools.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/SystemTools.cxx 2021-02-12 14:39:59.854519416 +0330
+@@ -223,7 +223,7 @@ inline int Rmdir(const std::string& dir)
+ }
+ inline const char* Getcwd(char* buf, unsigned int len)
+ {
+- std::vector<wchar_t> w_buf(len);
++ std::vector<char> w_buf(len);
+ if (_wgetcwd(&w_buf[0], len)) {
+ size_t nlen = kwsysEncoding_wcstombs(buf, &w_buf[0], len);
+ if (nlen == static_cast<size_t>(-1)) {
+@@ -246,9 +246,9 @@ inline int Chdir(const std::string& dir)
+ inline void Realpath(const std::string& path, std::string& resolved_path,
+ std::string* errorMessage = 0)
+ {
+- std::wstring tmp = KWSYS_NAMESPACE::Encoding::ToWide(path);
+- wchar_t* ptemp;
+- wchar_t fullpath[MAX_PATH];
++ std::string tmp = KWSYS_NAMESPACE::Encoding::ToWide(path);
++ char* ptemp;
++ char fullpath[MAX_PATH];
+ DWORD bufferLen = GetFullPathNameW(
+ tmp.c_str(), sizeof(fullpath) / sizeof(fullpath[0]), fullpath, &ptemp);
+ if (bufferLen < sizeof(fullpath) / sizeof(fullpath[0])) {
+@@ -351,7 +351,7 @@ double SystemTools::GetTime()
+
+ /* Type of character storing the environment. */
+ #if defined(_WIN32)
+-typedef wchar_t envchar;
++typedef char envchar;
+ #else
+ using envchar = char;
+ #endif
+@@ -362,8 +362,8 @@ struct kwsysEnvCompare
+ bool operator()(const envchar* l, const envchar* r) const
+ {
+ #if defined(_WIN32)
+- const wchar_t* leq = wcschr(l, L'=');
+- const wchar_t* req = wcschr(r, L'=');
++ const char* leq = wcschr(l, L'=');
++ const char* req = wcschr(r, L'=');
+ size_t llen = leq ? (leq - l) : wcslen(l);
+ size_t rlen = req ? (req - r) : wcslen(r);
+ if (llen == rlen) {
+@@ -642,8 +642,8 @@ const char* SystemTools::GetEnv(const st
+ bool SystemTools::GetEnv(const char* key, std::string& result)
+ {
+ #if defined(_WIN32)
+- const std::wstring wkey = Encoding::ToWide(key);
+- const wchar_t* wv = _wgetenv(wkey.c_str());
++ const std::string wkey = Encoding::ToWide(key);
++ const char* wv = _wgetenv(wkey.c_str());
+ if (wv) {
+ result = Encoding::ToNarrow(wv);
+ return true;
+@@ -666,8 +666,8 @@ bool SystemTools::GetEnv(const std::stri
+ bool SystemTools::HasEnv(const char* key)
+ {
+ #if defined(_WIN32)
+- const std::wstring wkey = Encoding::ToWide(key);
+- const wchar_t* v = _wgetenv(wkey.c_str());
++ const std::string wkey = Encoding::ToWide(key);
++ const char* v = _wgetenv(wkey.c_str());
+ #else
+ const char* v = getenv(key);
+ #endif
+@@ -733,11 +733,11 @@ static kwsysEnvSet kwsysUnPutEnvSet;
+
+ static int kwsysUnPutEnv(std::string const& env)
+ {
+- std::wstring wEnv = Encoding::ToWide(env);
++ std::string wEnv = Encoding::ToWide(env);
+ size_t const pos = wEnv.find('=');
+ size_t const len = pos == std::string::npos ? wEnv.size() : pos;
+ wEnv.resize(len + 1, L'=');
+- wchar_t* newEnv = _wcsdup(wEnv.c_str());
++ char* newEnv = _wcsdup(wEnv.c_str());
+ if (!newEnv) {
+ return -1;
+ }
+@@ -820,8 +820,8 @@ public:
+ bool Put(const char* env)
+ {
+ # if defined(_WIN32)
+- const std::wstring wEnv = Encoding::ToWide(env);
+- wchar_t* newEnv = _wcsdup(wEnv.c_str());
++ const std::string wEnv = Encoding::ToWide(env);
++ char* newEnv = _wcsdup(wEnv.c_str());
+ # else
+ char* newEnv = strdup(env);
+ # endif
+@@ -836,7 +836,7 @@ public:
+ bool UnPut(const char* env)
+ {
+ # if defined(_WIN32)
+- const std::wstring wEnv = Encoding::ToWide(env);
++ const std::string wEnv = Encoding::ToWide(env);
+ Free oldEnv(this->Release(wEnv.c_str()));
+ # else
+ Free oldEnv(this->Release(env));
+@@ -872,7 +872,7 @@ FILE* SystemTools::Fopen(const std::stri
+ {
+ #ifdef _WIN32
+ // Remove any 'e', which is supported on UNIX, but not Windows.
+- std::wstring trimmedMode = Encoding::ToWide(mode);
++ std::string trimmedMode = Encoding::ToWide(mode);
+ trimmedMode.erase(std::remove(trimmedMode.begin(), trimmedMode.end(), L'e'),
+ trimmedMode.end());
+ return _wfopen(Encoding::ToWindowsExtendedPath(file).c_str(),
+@@ -1005,7 +1005,7 @@ static bool hasPrefix(const std::string&
+ }
+
+ static bool SystemToolsParseRegistryKey(const std::string& key,
+- HKEY& primaryKey, std::wstring& second,
++ HKEY& primaryKey, std::string& second,
+ std::string* valuename)
+ {
+ size_t start = key.find('\\');
+@@ -1040,7 +1040,7 @@ static DWORD SystemToolsMakeRegistryMode
+ {
+ // only add the modes when on a system that supports Wow64.
+ static FARPROC wow64p =
+- GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process");
++ GetProcAddress(GetModuleHandleW("kernel32"), "IsWow64Process");
+ if (wow64p == nullptr) {
+ return mode;
+ }
+@@ -1060,7 +1060,7 @@ bool SystemTools::GetRegistrySubKeys(con
+ KeyWOW64 view)
+ {
+ HKEY primaryKey = HKEY_CURRENT_USER;
+- std::wstring second;
++ std::string second;
+ if (!SystemToolsParseRegistryKey(key, primaryKey, second, nullptr)) {
+ return false;
+ }
+@@ -1071,7 +1071,7 @@ bool SystemTools::GetRegistrySubKeys(con
+ &hKey) != ERROR_SUCCESS) {
+ return false;
+ } else {
+- wchar_t name[1024];
++ char name[1024];
+ DWORD dwNameSize = sizeof(name) / sizeof(name[0]);
+
+ DWORD i = 0;
+@@ -1106,7 +1106,7 @@ bool SystemTools::ReadRegistryValue(cons
+ {
+ bool valueset = false;
+ HKEY primaryKey = HKEY_CURRENT_USER;
+- std::wstring second;
++ std::string second;
+ std::string valuename;
+ if (!SystemToolsParseRegistryKey(key, primaryKey, second, &valuename)) {
+ return false;
+@@ -1120,14 +1120,14 @@ bool SystemTools::ReadRegistryValue(cons
+ } else {
+ DWORD dwType, dwSize;
+ dwSize = 1023;
+- wchar_t data[1024];
++ char data[1024];
+ if (RegQueryValueExW(hKey, Encoding::ToWide(valuename).c_str(), nullptr,
+ &dwType, (BYTE*)data, &dwSize) == ERROR_SUCCESS) {
+ if (dwType == REG_SZ) {
+ value = Encoding::ToNarrow(data);
+ valueset = true;
+ } else if (dwType == REG_EXPAND_SZ) {
+- wchar_t expanded[1024];
++ char expanded[1024];
+ DWORD dwExpandedSize = sizeof(expanded) / sizeof(expanded[0]);
+ if (ExpandEnvironmentStringsW(data, expanded, dwExpandedSize)) {
+ value = Encoding::ToNarrow(expanded);
+@@ -1160,7 +1160,7 @@ bool SystemTools::WriteRegistryValue(con
+ const std::string& value, KeyWOW64 view)
+ {
+ HKEY primaryKey = HKEY_CURRENT_USER;
+- std::wstring second;
++ std::string second;
+ std::string valuename;
+ if (!SystemToolsParseRegistryKey(key, primaryKey, second, &valuename)) {
+ return false;
+@@ -1168,7 +1168,7 @@ bool SystemTools::WriteRegistryValue(con
+
+ HKEY hKey;
+ DWORD dwDummy;
+- wchar_t lpClass[] = L"";
++ char lpClass[] = "";
+ if (RegCreateKeyExW(primaryKey, second.c_str(), 0, lpClass,
+ REG_OPTION_NON_VOLATILE,
+ SystemToolsMakeRegistryMode(KEY_WRITE, view), nullptr,
+@@ -1176,10 +1176,10 @@ bool SystemTools::WriteRegistryValue(con
+ return false;
+ }
+
+- std::wstring wvalue = Encoding::ToWide(value);
++ std::string wvalue = Encoding::ToWide(value);
+ if (RegSetValueExW(hKey, Encoding::ToWide(valuename).c_str(), 0, REG_SZ,
+ (CONST BYTE*)wvalue.c_str(),
+- (DWORD)(sizeof(wchar_t) * (wvalue.size() + 1))) ==
++ (DWORD)(sizeof(char) * (wvalue.size() + 1))) ==
+ ERROR_SUCCESS) {
+ return true;
+ }
+@@ -1204,7 +1204,7 @@ bool SystemTools::WriteRegistryValue(con
+ bool SystemTools::DeleteRegistryValue(const std::string& key, KeyWOW64 view)
+ {
+ HKEY primaryKey = HKEY_CURRENT_USER;
+- std::wstring second;
++ std::string second;
+ std::string valuename;
+ if (!SystemToolsParseRegistryKey(key, primaryKey, second, &valuename)) {
+ return false;
+@@ -1404,7 +1404,7 @@ int SystemTools::Stat(const std::string&
+ // Ideally we should use Encoding::ToWindowsExtendedPath to support
+ // long paths, but _wstat64 rejects paths with '?' in them, thinking
+ // they are wildcards.
+- std::wstring const& wpath = Encoding::ToWide(path);
++ std::string const& wpath = Encoding::ToWide(path);
+ return _wstat64(wpath.c_str(), buf);
+ #else
+ return stat(path.c_str(), buf);
+@@ -2035,7 +2035,7 @@ void SystemTools::ConvertToUnixSlashes(s
+ }
+
+ #ifdef _WIN32
+-std::wstring SystemTools::ConvertToWindowsExtendedPath(
++std::string SystemTools::ConvertToWindowsExtendedPath(
+ const std::string& source)
+ {
+ return Encoding::ToWindowsExtendedPath(source);
+@@ -2556,7 +2556,7 @@ std::string SystemTools::GetLastSystemEr
+ bool SystemTools::RemoveFile(const std::string& source)
+ {
+ #ifdef _WIN32
+- std::wstring const& ws = Encoding::ToWindowsExtendedPath(source);
++ std::string const& ws = Encoding::ToWindowsExtendedPath(source);
+ if (DeleteFileW(ws.c_str())) {
+ return true;
+ }
+@@ -2960,7 +2960,7 @@ bool SystemTools::FileIsExecutable(const
+ bool SystemTools::FileIsSymlink(const std::string& name)
+ {
+ #if defined(_WIN32)
+- std::wstring path = Encoding::ToWindowsExtendedPath(name);
++ std::string path = Encoding::ToWindowsExtendedPath(name);
+ DWORD attr = GetFileAttributesW(path.c_str());
+ if (attr != INVALID_FILE_ATTRIBUTES) {
+ if ((attr & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
+@@ -3971,9 +3971,9 @@ bool SystemTools::GetShortPath(const std
+ tempPath.erase(0, 1);
+ }
+
+- std::wstring wtempPath = Encoding::ToWide(tempPath);
++ std::string wtempPath = Encoding::ToWide(tempPath);
+ DWORD ret = GetShortPathNameW(wtempPath.c_str(), nullptr, 0);
+- std::vector<wchar_t> buffer(ret);
++ std::vector<char> buffer(ret);
+ if (ret != 0) {
+ ret = GetShortPathNameW(wtempPath.c_str(), &buffer[0],
+ static_cast<DWORD>(buffer.size()));
+@@ -4368,19 +4368,19 @@ std::string SystemTools::GetOperatingSys
+ else {
+ HKEY hKey;
+ # define BUFSIZE 80
+- wchar_t szProductType[BUFSIZE];
++ char szProductType[BUFSIZE];
+ DWORD dwBufLen = BUFSIZE;
+ LONG lRet;
+
+ lRet =
+ RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+- L"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
++ "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
+ 0, KEY_QUERY_VALUE, &hKey);
+ if (lRet != ERROR_SUCCESS) {
+ return 0;
+ }
+
+- lRet = RegQueryValueExW(hKey, L"ProductType", nullptr, nullptr,
++ lRet = RegQueryValueExW(hKey, "ProductType", nullptr, nullptr,
+ (LPBYTE)szProductType, &dwBufLen);
+
+ if ((lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE)) {
+@@ -4389,13 +4389,13 @@ std::string SystemTools::GetOperatingSys
+
+ RegCloseKey(hKey);
+
+- if (lstrcmpiW(L"WINNT", szProductType) == 0) {
++ if (lstrcmpiW("WINNT", szProductType) == 0) {
+ res += " Workstation";
+ }
+- if (lstrcmpiW(L"LANMANNT", szProductType) == 0) {
++ if (lstrcmpiW("LANMANNT", szProductType) == 0) {
+ res += " Server";
+ }
+- if (lstrcmpiW(L"SERVERNT", szProductType) == 0) {
++ if (lstrcmpiW("SERVERNT", szProductType) == 0) {
+ res += " Advanced Server";
+ }
+
+@@ -4418,7 +4418,7 @@ std::string SystemTools::GetOperatingSys
+
+ lRet = RegOpenKeyExW(
+ HKEY_LOCAL_MACHINE,
+- L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
++ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
+ 0, KEY_QUERY_VALUE, &hKey);
+
+ if (lRet == ERROR_SUCCESS) {
+diff -urp a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in
+--- a/Source/kwsys/SystemTools.hxx.in 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/SystemTools.hxx.in 2021-02-11 18:43:32.762502643 +0330
+@@ -258,7 +258,7 @@ public:
+
+ #ifdef _WIN32
+ /** Calls Encoding::ToWindowsExtendedPath. */
+- static std::wstring ConvertToWindowsExtendedPath(const std::string&);
++ static std::string ConvertToWindowsExtendedPath(const std::string&);
+ #endif
+
+ /**
+diff -urp a/Source/kwsys/testConsoleBufChild.cxx b/Source/kwsys/testConsoleBufChild.cxx
+--- a/Source/kwsys/testConsoleBufChild.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/testConsoleBufChild.cxx 2021-02-11 18:43:32.759169256 +0330
+@@ -27,8 +27,8 @@ int main(int argc, const char* argv[])
+ std::cout << argv[1] << std::endl;
+ std::cerr << argv[1] << std::endl;
+ } else {
+- std::string str = kwsys::Encoding::ToNarrow(std::wstring(
+- UnicodeTestString, sizeof(UnicodeTestString) / sizeof(wchar_t) - 1));
++ std::string str = kwsys::Encoding::ToNarrow(std::string(
++ UnicodeTestString, sizeof(UnicodeTestString) / sizeof(char) - 1));
+ std::cout << str << std::endl;
+ std::cerr << str << std::endl;
+ }
+diff -urp a/Source/kwsys/testConsoleBuf.cxx b/Source/kwsys/testConsoleBuf.cxx
+--- a/Source/kwsys/testConsoleBuf.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/testConsoleBuf.cxx 2021-02-11 18:43:32.759169256 +0330
+@@ -33,7 +33,7 @@
+ # endif
+ // يونيكود
+ static const WCHAR UnicodeInputTestString[] =
+- L"\u064A\u0648\u0646\u064A\u0643\u0648\u062F!";
++ "\u064A\u0648\u0646\u064A\u0643\u0648\u062F!";
+ static UINT TestCodepage = KWSYS_ENCODING_DEFAULT_CODEPAGE;
+
+ static const DWORD waitTimeout = 10 * 1000;
+@@ -68,7 +68,7 @@ std::basic_streambuf<char>* errstream(co
+ return std::cerr.rdbuf();
+ }
+
+-std::basic_streambuf<wchar_t>* errstream(const wchar_t* unused)
++std::basic_streambuf<char>* errstream(const char* unused)
+ {
+ static_cast<void>(unused);
+ return std::wcerr.rdbuf();
+@@ -133,7 +133,7 @@ static bool createProcess(HANDLE hIn, HA
+ p--;
+ *(p + 1) = 0;
+ wcscat(cmd, cmdConsoleBufChild);
+- wcscat(cmd, L".exe");
++ wcscat(cmd, ".exe");
+
+ bool success =
+ CreateProcessW(nullptr, // No module name (use command line)
+@@ -374,9 +374,9 @@ static int testFile()
+ HANDLE outFile = INVALID_HANDLE_VALUE;
+ HANDLE errFile = INVALID_HANDLE_VALUE;
+ try {
+- if ((inFile = createFile(L"stdinFile.txt")) == INVALID_HANDLE_VALUE ||
+- (outFile = createFile(L"stdoutFile.txt")) == INVALID_HANDLE_VALUE ||
+- (errFile = createFile(L"stderrFile.txt")) == INVALID_HANDLE_VALUE) {
++ if ((inFile = createFile("stdinFile.txt")) == INVALID_HANDLE_VALUE ||
++ (outFile = createFile("stdoutFile.txt")) == INVALID_HANDLE_VALUE ||
++ (errFile = createFile("stderrFile.txt")) == INVALID_HANDLE_VALUE) {
+ throw std::runtime_error("createFile failed!");
+ }
+ DWORD bytesWritten = 0;
+@@ -488,7 +488,7 @@ static int testConsole()
+ bool newConsole = false;
+ bool forceNewConsole = false;
+ bool restoreConsole = false;
+- LPCWSTR TestFaceName = L"Lucida Console";
++ LPCWSTR TestFaceName = "Lucida Console";
+ const DWORD TestFontFamily = 0x00000036;
+ const DWORD TestFontSize = 0x000c0000;
+ HKEY hConsoleKey;
+@@ -518,23 +518,23 @@ static int testConsole()
+ # endif
+ # endif
+ if (!isVistaOrGreater) {
+- if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Console", 0, KEY_READ | KEY_WRITE,
++ if (RegOpenKeyExW(HKEY_CURRENT_USER, "Console", 0, KEY_READ | KEY_WRITE,
+ &hConsoleKey) == ERROR_SUCCESS) {
+ DWORD dwordSize = sizeof(DWORD);
+- if (RegQueryValueExW(hConsoleKey, L"FontFamily", nullptr, nullptr,
++ if (RegQueryValueExW(hConsoleKey, "FontFamily", nullptr, nullptr,
+ (LPBYTE)&FontFamily, &dwordSize) == ERROR_SUCCESS) {
+ if (FontFamily != TestFontFamily) {
+- RegQueryValueExW(hConsoleKey, L"FaceName", nullptr, nullptr,
++ RegQueryValueExW(hConsoleKey, "FaceName", nullptr, nullptr,
+ (LPBYTE)FaceName, &FaceNameSize);
+- RegQueryValueExW(hConsoleKey, L"FontSize", nullptr, nullptr,
++ RegQueryValueExW(hConsoleKey, "FontSize", nullptr, nullptr,
+ (LPBYTE)&FontSize, &dwordSize);
+
+- RegSetValueExW(hConsoleKey, L"FontFamily", 0, REG_DWORD,
++ RegSetValueExW(hConsoleKey, "FontFamily", 0, REG_DWORD,
+ (BYTE*)&TestFontFamily, sizeof(TestFontFamily));
+- RegSetValueExW(hConsoleKey, L"FaceName", 0, REG_SZ,
++ RegSetValueExW(hConsoleKey, "FaceName", 0, REG_SZ,
+ (BYTE*)TestFaceName,
+ (DWORD)((wcslen(TestFaceName) + 1) * sizeof(WCHAR)));
+- RegSetValueExW(hConsoleKey, L"FontSize", 0, REG_DWORD,
++ RegSetValueExW(hConsoleKey, "FontSize", 0, REG_DWORD,
+ (BYTE*)&TestFontSize, sizeof(TestFontSize));
+
+ restoreConsole = true;
+@@ -560,7 +560,7 @@ static int testConsole()
+ securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
+ securityAttributes.bInheritHandle = TRUE;
+ securityAttributes.lpSecurityDescriptor = nullptr;
+- hIn = CreateFileW(L"CONIN$", GENERIC_READ | GENERIC_WRITE,
++ hIn = CreateFileW("CONIN$", GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, &securityAttributes,
+ OPEN_EXISTING, 0, nullptr);
+ if (hIn == INVALID_HANDLE_VALUE) {
+@@ -568,7 +568,7 @@ static int testConsole()
+ std::cerr << "CreateFile(CONIN$)" << std::endl;
+ displayError(lastError);
+ }
+- hOut = CreateFileW(L"CONOUT$", GENERIC_READ | GENERIC_WRITE,
++ hOut = CreateFileW("CONOUT$", GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, &securityAttributes,
+ OPEN_EXISTING, 0, nullptr);
+ if (hOut == INVALID_HANDLE_VALUE) {
+@@ -587,7 +587,7 @@ static int testConsole()
+ CONSOLE_FONT_INFOEX consoleFont;
+ memset(&consoleFont, 0, sizeof(consoleFont));
+ consoleFont.cbSize = sizeof(consoleFont);
+- HMODULE kernel32 = LoadLibraryW(L"kernel32.dll");
++ HMODULE kernel32 = LoadLibraryW("kernel32.dll");
+ typedef BOOL(WINAPI * GetCurrentConsoleFontExFunc)(
+ HANDLE hConsoleOutput, BOOL bMaximumWindow,
+ PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx);
+@@ -614,17 +614,17 @@ static int testConsole()
+ } else {
+ # endif
+ if (restoreConsole &&
+- RegOpenKeyExW(HKEY_CURRENT_USER, L"Console", 0, KEY_WRITE,
++ RegOpenKeyExW(HKEY_CURRENT_USER, "Console", 0, KEY_WRITE,
+ &hConsoleKey) == ERROR_SUCCESS) {
+- RegSetValueExW(hConsoleKey, L"FontFamily", 0, REG_DWORD,
++ RegSetValueExW(hConsoleKey, "FontFamily", 0, REG_DWORD,
+ (BYTE*)&FontFamily, sizeof(FontFamily));
+ if (FaceName[0] != 0) {
+- RegSetValueExW(hConsoleKey, L"FaceName", 0, REG_SZ, (BYTE*)FaceName,
++ RegSetValueExW(hConsoleKey, "FaceName", 0, REG_SZ, (BYTE*)FaceName,
+ FaceNameSize);
+ } else {
+- RegDeleteValueW(hConsoleKey, L"FaceName");
++ RegDeleteValueW(hConsoleKey, "FaceName");
+ }
+- RegSetValueExW(hConsoleKey, L"FontSize", 0, REG_DWORD, (BYTE*)&FontSize,
++ RegSetValueExW(hConsoleKey, "FontSize", 0, REG_DWORD, (BYTE*)&FontSize,
+ sizeof(FontSize));
+ RegCloseKey(hConsoleKey);
+ }
+@@ -690,34 +690,34 @@ static int testConsole()
+ delete[] outputBuffer;
+ throw std::runtime_error("ReadConsoleOutputCharacter failed!");
+ }
+- std::wstring wideTestString = kwsys::Encoding::ToWide(encodedTestString);
++ std::string wideTestString = kwsys::Encoding::ToWide(encodedTestString);
+ std::replace(wideTestString.begin(), wideTestString.end(), '\0', ' ');
+- std::wstring wideInputTestString =
++ std::string wideInputTestString =
+ kwsys::Encoding::ToWide(encodedInputTestString);
+ if (memcmp(outputBuffer, wideTestString.c_str(),
+- wideTestString.size() * sizeof(wchar_t)) == 0 &&
++ wideTestString.size() * sizeof(char)) == 0 &&
+ memcmp(outputBuffer + screenBufferInfo.dwSize.X * 1,
+ wideTestString.c_str(),
+- wideTestString.size() * sizeof(wchar_t)) == 0 &&
++ wideTestString.size() * sizeof(char)) == 0 &&
+ memcmp(outputBuffer + screenBufferInfo.dwSize.X * 2,
+ UnicodeInputTestString,
+ sizeof(UnicodeInputTestString) - sizeof(WCHAR)) == 0 &&
+ memcmp(outputBuffer + screenBufferInfo.dwSize.X * 3,
+ wideInputTestString.c_str(),
+- (wideInputTestString.size() - 1) * sizeof(wchar_t)) == 0) {
++ (wideInputTestString.size() - 1) * sizeof(char)) == 0) {
+ didFail = 0;
+ } else {
+ std::cerr << "Console's output didn't match expected output!"
+ << std::endl;
+- dumpBuffers<wchar_t>(wideTestString.c_str(), outputBuffer,
++ dumpBuffers<char>(wideTestString.c_str(), outputBuffer,
+ wideTestString.size());
+- dumpBuffers<wchar_t>(wideTestString.c_str(),
++ dumpBuffers<char>(wideTestString.c_str(),
+ outputBuffer + screenBufferInfo.dwSize.X * 1,
+ wideTestString.size());
+- dumpBuffers<wchar_t>(
++ dumpBuffers<char>(
+ UnicodeInputTestString, outputBuffer + screenBufferInfo.dwSize.X * 2,
+ (sizeof(UnicodeInputTestString) - 1) / sizeof(WCHAR));
+- dumpBuffers<wchar_t>(wideInputTestString.c_str(),
++ dumpBuffers<char>(wideInputTestString.c_str(),
+ outputBuffer + screenBufferInfo.dwSize.X * 3,
+ wideInputTestString.size() - 1);
+ }
+@@ -763,11 +763,11 @@ int testConsoleBuf(int, char* [])
+ return 1;
+ }
+
+- encodedTestString = kwsys::Encoding::ToNarrow(std::wstring(
+- UnicodeTestString, sizeof(UnicodeTestString) / sizeof(wchar_t) - 1));
++ encodedTestString = kwsys::Encoding::ToNarrow(std::string(
++ UnicodeTestString, sizeof(UnicodeTestString) / sizeof(char) - 1));
+ encodedInputTestString = kwsys::Encoding::ToNarrow(
+- std::wstring(UnicodeInputTestString,
+- sizeof(UnicodeInputTestString) / sizeof(wchar_t) - 1));
++ std::string(UnicodeInputTestString,
++ sizeof(UnicodeInputTestString) / sizeof(char) - 1));
+ encodedInputTestString += "\n";
+
+ ret |= testPipe();
+diff -urp a/Source/kwsys/testConsoleBuf.hxx b/Source/kwsys/testConsoleBuf.hxx
+--- a/Source/kwsys/testConsoleBuf.hxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/testConsoleBuf.hxx 2021-02-11 18:43:32.762502643 +0330
+@@ -3,15 +3,15 @@
+ #ifndef testConsoleBuf_hxx
+ #define testConsoleBuf_hxx
+
+-static const wchar_t cmdConsoleBufChild[] = L"testConsoleBufChild";
++static const char cmdConsoleBufChild[] = "testConsoleBufChild";
+
+-static const wchar_t BeforeInputEventName[] = L"BeforeInputEvent";
+-static const wchar_t AfterOutputEventName[] = L"AfterOutputEvent";
++static const char BeforeInputEventName[] = "BeforeInputEvent";
++static const char AfterOutputEventName[] = "AfterOutputEvent";
+
+ // यूनिकोड είναι здорово!
+-static const wchar_t UnicodeTestString[] =
+- L"\u092F\u0942\u0928\u093F\u0915\u094B\u0921 "
+- L"\u03B5\u03AF\u03BD\0\u03B1\u03B9 "
+- L"\u0437\u0434\u043E\u0440\u043E\u0432\u043E!";
++static const char UnicodeTestString[] =
++ "\u092F\u0942\u0928\u093F\u0915\u094B\u0921 "
++ "\u03B5\u03AF\u03BD\0\u03B1\u03B9 "
++ "\u0437\u0434\u043E\u0440\u043E\u0432\u043E!";
+
+ #endif
+diff -urp a/Source/kwsys/testEncoding.cxx b/Source/kwsys/testEncoding.cxx
+--- a/Source/kwsys/testEncoding.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/kwsys/testEncoding.cxx 2021-02-11 18:43:32.815836824 +0330
+@@ -55,9 +55,9 @@ static int testHelloWorldEncoding()
+ for (int i = 0; helloWorldStrings[i][0] != 0; i++) {
+ std::string str = reinterpret_cast<const char*>(helloWorldStrings[i]);
+ std::cout << str << std::endl;
+- std::wstring wstr = kwsys::Encoding::ToWide(str);
++ std::string wstr = kwsys::Encoding::ToWide(str);
+ std::string str2 = kwsys::Encoding::ToNarrow(wstr);
+- wchar_t* c_wstr = kwsysEncoding_DupToWide(str.c_str());
++ char* c_wstr = kwsysEncoding_DupToWide(str.c_str());
+ char* c_str2 = kwsysEncoding_DupToNarrow(c_wstr);
+ if (!wstr.empty() && (str != str2 || strcmp(c_str2, str.c_str()) != 0)) {
+ std::cout << "converted string was different: " << str2 << std::endl;
+@@ -82,11 +82,11 @@ static int testRobustEncoding()
+ int ret = 0;
+ char cstr[] = { (char)-1, 0 };
+ // this conversion could fail
+- std::wstring wstr = kwsys::Encoding::ToWide(cstr);
++ std::string wstr = kwsys::Encoding::ToWide(cstr);
+
+ wstr = kwsys::Encoding::ToWide(nullptr);
+ if (!wstr.empty()) {
+- const wchar_t* wcstr = wstr.c_str();
++ const char* wcstr = wstr.c_str();
+ std::cout << "ToWide(NULL) returned";
+ for (size_t i = 0; i < wstr.size(); i++) {
+ std::cout << " " << std::hex << (int)wcstr[i];
+@@ -96,7 +96,7 @@ static int testRobustEncoding()
+ }
+ wstr = kwsys::Encoding::ToWide("");
+ if (!wstr.empty()) {
+- const wchar_t* wcstr = wstr.c_str();
++ const char* wcstr = wstr.c_str();
+ std::cout << "ToWide(\"\") returned";
+ for (size_t i = 0; i < wstr.size(); i++) {
+ std::cout << " " << std::hex << (int)wcstr[i];
+@@ -106,8 +106,8 @@ static int testRobustEncoding()
+ }
+
+ #ifdef _WIN32
+- // 16 bit wchar_t - we make an invalid surrogate pair
+- wchar_t cwstr[] = { 0xD801, 0xDA00, 0 };
++ // 16 bit char - we make an invalid surrogate pair
++ char cwstr[] = { 0xD801, 0xDA00, 0 };
+ // this conversion could fail
+ std::string win_str = kwsys::Encoding::ToNarrow(cwstr);
+ #endif
+@@ -118,7 +118,7 @@ static int testRobustEncoding()
+ ret++;
+ }
+
+- str = kwsys::Encoding::ToNarrow(L"");
++ str = kwsys::Encoding::ToNarrow("");
+ if (!wstr.empty()) {
+ std::cout << "ToNarrow(\"\") returned " << str << std::endl;
+ ret++;
+@@ -141,7 +141,7 @@ static int testWithNulls()
+ strings.push_back(std::string("\0\0\0\0", 4) + "lmn" +
+ std::string("\0\0\0\0", 4));
+ for (auto& string : strings) {
+- std::wstring wstr = kwsys::Encoding::ToWide(string);
++ std::string wstr = kwsys::Encoding::ToWide(string);
+ std::string str = kwsys::Encoding::ToNarrow(wstr);
+ std::string s(string);
+ std::replace(s.begin(), s.end(), '\0', ' ');
+@@ -188,7 +188,7 @@ static int testToWindowsExtendedPath()
+ int ret = 0;
+ if (kwsys::Encoding::ToWindowsExtendedPath(
+ "L:\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") !=
+- L"\\\\?\\L:\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") {
++ "\\\\?\\L:\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"L:\\Local Mojo\\Hex Power Pack\\Iffy Voodoo\""
+ << std::endl;
+@@ -197,7 +197,7 @@ static int testToWindowsExtendedPath()
+
+ if (kwsys::Encoding::ToWindowsExtendedPath(
+ "L:/Local Mojo/Hex Power Pack/Iffy Voodoo") !=
+- L"\\\\?\\L:\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") {
++ "\\\\?\\L:\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"L:/Local Mojo/Hex Power Pack/Iffy Voodoo\"" << std::endl;
+ ++ret;
+@@ -205,7 +205,7 @@ static int testToWindowsExtendedPath()
+
+ if (kwsys::Encoding::ToWindowsExtendedPath(
+ "\\\\Foo\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") !=
+- L"\\\\?\\UNC\\Foo\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") {
++ "\\\\?\\UNC\\Foo\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"\\\\Foo\\Local Mojo\\Hex Power Pack\\Iffy Voodoo\""
+ << std::endl;
+@@ -214,40 +214,40 @@ static int testToWindowsExtendedPath()
+
+ if (kwsys::Encoding::ToWindowsExtendedPath(
+ "//Foo/Local Mojo/Hex Power Pack/Iffy Voodoo") !=
+- L"\\\\?\\UNC\\Foo\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") {
++ "\\\\?\\UNC\\Foo\\Local Mojo\\Hex Power Pack\\Iffy Voodoo") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"//Foo/Local Mojo/Hex Power Pack/Iffy Voodoo\""
+ << std::endl;
+ ++ret;
+ }
+
+- if (kwsys::Encoding::ToWindowsExtendedPath("//") != L"//") {
++ if (kwsys::Encoding::ToWindowsExtendedPath("//") != "//") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"//\"" << std::endl;
+ ++ret;
+ }
+
+- if (kwsys::Encoding::ToWindowsExtendedPath("\\\\.\\") != L"\\\\.\\") {
++ if (kwsys::Encoding::ToWindowsExtendedPath("\\\\.\\") != "\\\\.\\") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"\\\\.\\\"" << std::endl;
+ ++ret;
+ }
+
+- if (kwsys::Encoding::ToWindowsExtendedPath("\\\\.\\X") != L"\\\\.\\X") {
++ if (kwsys::Encoding::ToWindowsExtendedPath("\\\\.\\X") != "\\\\.\\X") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"\\\\.\\X\"" << std::endl;
+ ++ret;
+ }
+
+- if (kwsys::Encoding::ToWindowsExtendedPath("\\\\.\\X:") != L"\\\\?\\X:") {
++ if (kwsys::Encoding::ToWindowsExtendedPath("\\\\.\\X:") != "\\\\?\\X:") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"\\\\.\\X:\"" << std::endl;
+ ++ret;
+ }
+
+ if (kwsys::Encoding::ToWindowsExtendedPath("\\\\.\\X:\\") !=
+- L"\\\\?\\X:\\") {
++ "\\\\?\\X:\\") {
+ std::cout << "Problem with ToWindowsExtendedPath "
+ << "\"\\\\.\\X:\\\"" << std::endl;
+ ++ret;
+ }
+diff -urp a/Source/LexerParser/cmListFileLexer.c b/Source/LexerParser/cmListFileLexer.c
+--- a/Source/LexerParser/cmListFileLexer.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/LexerParser/cmListFileLexer.c 2021-02-11 18:43:32.715835234 +0330
+@@ -2746,8 +2746,8 @@ int cmListFileLexer_SetFileName(cmListFi
+ cmListFileLexerDestroy(lexer);
+ if (name) {
+ #ifdef _WIN32
+- wchar_t* wname = cmsysEncoding_DupToWide(name);
+- lexer->file = _wfopen(wname, L"rb");
++ char* wname = cmsysEncoding_DupToWide(name);
++ lexer->file = _wfopen(wname, "rb");
+ free(wname);
+ #else
+ lexer->file = fopen(name, "rb");
+diff -urp a/Source/LexerParser/cmListFileLexer.in.l b/Source/LexerParser/cmListFileLexer.in.l
+--- a/Source/LexerParser/cmListFileLexer.in.l 2021-01-28 18:58:45.000000000 +0330
++++ b/Source/LexerParser/cmListFileLexer.in.l 2021-02-11 18:43:32.725835393 +0330
+@@ -459,8 +459,8 @@ int cmListFileLexer_SetFileName(cmListFi
+ cmListFileLexerDestroy(lexer);
+ if (name) {
+ #ifdef _WIN32
+- wchar_t* wname = cmsysEncoding_DupToWide(name);
+- lexer->file = _wfopen(wname, L"rb");
++ char* wname = cmsysEncoding_DupToWide(name);
++ lexer->file = _wfopen(wname, "rb");
+ free(wname);
+ #else
+ lexer->file = fopen(name, "rb");
+diff -urp a/Templates/MSBuild/FlagTables/v10_CL.json b/Templates/MSBuild/FlagTables/v10_CL.json
+--- a/Templates/MSBuild/FlagTables/v10_CL.json 2021-01-28 18:58:45.000000000 +0330
++++ b/Templates/MSBuild/FlagTables/v10_CL.json 2021-02-11 18:43:34.969204192 +0330
+@@ -678,14 +678,14 @@
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t-",
++ "switch": "Zc:char-",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "false",
+ "flags": []
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t",
++ "switch": "Zc:char",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "true",
+ "flags": []
+diff -urp a/Templates/MSBuild/FlagTables/v11_CL.json b/Templates/MSBuild/FlagTables/v11_CL.json
+--- a/Templates/MSBuild/FlagTables/v11_CL.json 2021-01-28 18:58:45.000000000 +0330
++++ b/Templates/MSBuild/FlagTables/v11_CL.json 2021-02-11 18:43:34.969204192 +0330
+@@ -741,14 +741,14 @@
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t-",
++ "switch": "Zc:char-",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "false",
+ "flags": []
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t",
++ "switch": "Zc:char",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "true",
+ "flags": []
+diff -urp a/Templates/MSBuild/FlagTables/v12_CL.json b/Templates/MSBuild/FlagTables/v12_CL.json
+--- a/Templates/MSBuild/FlagTables/v12_CL.json 2021-01-28 18:58:45.000000000 +0330
++++ b/Templates/MSBuild/FlagTables/v12_CL.json 2021-02-11 18:43:34.955870650 +0330
+@@ -755,14 +755,14 @@
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t-",
++ "switch": "Zc:char-",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "false",
+ "flags": []
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t",
++ "switch": "Zc:char",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "true",
+ "flags": []
+diff -urp a/Templates/MSBuild/FlagTables/v140_CL.json b/Templates/MSBuild/FlagTables/v140_CL.json
+--- a/Templates/MSBuild/FlagTables/v140_CL.json 2021-01-28 18:58:45.000000000 +0330
++++ b/Templates/MSBuild/FlagTables/v140_CL.json 2021-02-11 18:43:34.965870807 +0330
+@@ -762,14 +762,14 @@
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t-",
++ "switch": "Zc:char-",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "false",
+ "flags": []
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t",
++ "switch": "Zc:char",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "true",
+ "flags": []
+diff -urp a/Templates/MSBuild/FlagTables/v141_CL.json b/Templates/MSBuild/FlagTables/v141_CL.json
+--- a/Templates/MSBuild/FlagTables/v141_CL.json 2021-01-28 18:58:45.000000000 +0330
++++ b/Templates/MSBuild/FlagTables/v141_CL.json 2021-02-11 18:43:34.969204192 +0330
+@@ -825,14 +825,14 @@
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t-",
++ "switch": "Zc:char-",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "false",
+ "flags": []
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t",
++ "switch": "Zc:char",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "true",
+ "flags": []
+diff -urp a/Templates/MSBuild/FlagTables/v142_CL.json b/Templates/MSBuild/FlagTables/v142_CL.json
+--- a/Templates/MSBuild/FlagTables/v142_CL.json 2021-01-28 18:58:45.000000000 +0330
++++ b/Templates/MSBuild/FlagTables/v142_CL.json 2021-02-11 18:43:34.965870807 +0330
+@@ -860,14 +860,14 @@
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t-",
++ "switch": "Zc:char-",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "false",
+ "flags": []
+ },
+ {
+ "name": "TreatWChar_tAsBuiltInType",
+- "switch": "Zc:wchar_t",
++ "switch": "Zc:char",
+ "comment": "Treat WChar_t As Built in Type",
+ "value": "true",
+ "flags": []
+diff -urp a/Tests/CMakeLib/testCMFilesystemPath.cxx b/Tests/CMakeLib/testCMFilesystemPath.cxx
+--- a/Tests/CMakeLib/testCMFilesystemPath.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Tests/CMakeLib/testCMFilesystemPath.cxx 2021-02-11 18:43:30.792471215 +0330
+@@ -66,7 +66,7 @@ bool testConstructors()
+ #endif
+ }
+ {
+- std::wstring s(L"/a/b/c");
++ std::string s("/a/b/c");
+ fs::path p1(s);
+ fs::path p2(s.begin(), s.end());
+ if (p1 != p2) {
+@@ -76,7 +76,7 @@ bool testConstructors()
+ result = false;
+ }
+ #if CM_FILESYSTEM_SOURCE_TRAITS_ITERATOR
+- std::wstring s2(s);
++ std::string s2(s);
+ s2 += L'\0';
+ fs::path p3(s2.begin());
+ if (p1 != p3 || p3.wstring() != s) {
+@@ -276,7 +276,7 @@ bool testObservers()
+ }
+ {
+ std::string s("a//b//c");
+- std::wstring ws(L"a//b//c");
++ std::string ws("a//b//c");
+ fs::path p(s);
+ if (p.string() != s || p.wstring() != ws) {
+ result = false;
+@@ -284,9 +284,9 @@ bool testObservers()
+ }
+ {
+ std::string s("a/b/c");
+- std::wstring ws;
++ std::string ws;
+ for (auto c : s) {
+- ws += static_cast<std::wstring::value_type>(c);
++ ws += static_cast<std::string::value_type>(c);
+ }
+ std::string ns(s);
+ std::replace(
+@@ -861,7 +861,7 @@ bool testIterators()
+ {
+ fs::path p("/a/b/");
+ #if defined(_WIN32)
+- std::vector<fs::path::string_type> ref{ L"/", L"a", L"b", L"" };
++ std::vector<fs::path::string_type> ref{ "/", "a", "b", "" };
+ #else
+ std::vector<fs::path::string_type> ref{ "/", "a", "b", "" };
+ #endif
+@@ -883,7 +883,7 @@ bool testIterators()
+ {
+ fs::path p("/a/b/");
+ #if defined(_WIN32)
+- std::vector<fs::path::string_type> ref{ L"", L"b", L"a", L"/" };
++ std::vector<fs::path::string_type> ref{ "", "b", "a", "/" };
+ #else
+ std::vector<fs::path::string_type> ref{ "", "b", "a", "/" };
+ #endif
+diff -urp a/Tests/FindPython/display_time.c b/Tests/FindPython/display_time.c
+--- a/Tests/FindPython/display_time.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Tests/FindPython/display_time.c 2021-02-11 18:43:30.875805885 +0330
+@@ -9,7 +9,7 @@
+ void display_time()
+ {
+ #if defined(PYTHON3)
+- wchar_t* program = Py_DecodeLocale("display_time", NULL);
++ char* program = Py_DecodeLocale("display_time", NULL);
+ if (program == NULL) {
+ fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
+ exit(1);
+diff -urp a/Tests/Plugin/src/DynamicLoader.cxx b/Tests/Plugin/src/DynamicLoader.cxx
+--- a/Tests/Plugin/src/DynamicLoader.cxx 2021-01-28 18:58:45.000000000 +0330
++++ b/Tests/Plugin/src/DynamicLoader.cxx 2021-02-11 18:43:30.512466723 +0330
+@@ -94,7 +94,7 @@ DynamicLoader::LibraryHandle DynamicLoad
+ {
+ DynamicLoader::LibraryHandle lh;
+ int length = MultiByteToWideChar(CP_UTF8, 0, libname.c_str(), -1, NULL, 0);
+- wchar_t* wchars = new wchar_t[length + 1];
++ char* wchars = new char[length + 1];
+ wchars[0] = '\0';
+ MultiByteToWideChar(CP_UTF8, 0, libname.c_str(), -1, wchars, length);
+ lh = LoadLibraryW(wchars);
+diff -urp a/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h
+--- a/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h 2021-02-11 18:43:32.605833485 +0330
+@@ -58,10 +58,10 @@ private:
+ // button1
+ //
+ this->button1->Location = System::Drawing::Point(13, 13);
+- this->button1->Name = L"button1";
++ this->button1->Name = "button1";
+ this->button1->Size = System::Drawing::Size(75, 23);
+ this->button1->TabIndex = 0;
+- this->button1->Text = L"button1";
++ this->button1->Text = "button1";
+ this->button1->UseVisualStyleBackColor = true;
+ //
+ // MyForm
+@@ -70,8 +70,8 @@ private:
+ this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
+ this->ClientSize = System::Drawing::Size(284, 261);
+ this->Controls->Add(this->button1);
+- this->Name = L"MyForm";
+- this->Text = L"MyForm";
++ this->Name = "MyForm";
++ this->Text = "MyForm";
+ this->ResumeLayout(false);
+ }
+ #pragma endregion
+diff -urp a/Utilities/cmcurl/lib/curl_multibyte.c b/Utilities/cmcurl/lib/curl_multibyte.c
+--- a/Utilities/cmcurl/lib/curl_multibyte.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/curl_multibyte.c 2021-02-11 18:43:33.732518016 +0330
+@@ -34,15 +34,15 @@
+ * MultiByte conversions using Windows kernel32 library.
+ */
+
+-wchar_t *curlx_convert_UTF8_to_wchar(const char *str_utf8)
++char *curlx_convert_UTF8_to_wchar(const char *str_utf8)
+ {
+- wchar_t *str_w = NULL;
++ char *str_w = NULL;
+
+ if(str_utf8) {
+ int str_w_len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
+ str_utf8, -1, NULL, 0);
+ if(str_w_len > 0) {
+- str_w = malloc(str_w_len * sizeof(wchar_t));
++ str_w = malloc(str_w_len * sizeof(char));
+ if(str_w) {
+ if(MultiByteToWideChar(CP_UTF8, 0, str_utf8, -1, str_w,
+ str_w_len) == 0) {
+@@ -56,7 +56,7 @@ wchar_t *curlx_convert_UTF8_to_wchar(con
+ return str_w;
+ }
+
+-char *curlx_convert_wchar_to_UTF8(const wchar_t *str_w)
++char *curlx_convert_charo_UTF8(const char *str_w)
+ {
+ char *str_utf8 = NULL;
+
+@@ -86,8 +86,8 @@ FILE *curlx_win32_fopen(const char *file
+ {
+ #ifdef _UNICODE
+ FILE *result = NULL;
+- wchar_t *filename_w = curlx_convert_UTF8_to_wchar(filename);
+- wchar_t *mode_w = curlx_convert_UTF8_to_wchar(mode);
++ char *filename_w = curlx_convert_UTF8_to_wchar(filename);
++ char *mode_w = curlx_convert_UTF8_to_wchar(mode);
+ if(filename_w && mode_w)
+ result = _wfopen(filename_w, mode_w);
+ free(filename_w);
+@@ -103,7 +103,7 @@ int curlx_win32_stat(const char *path, s
+ {
+ int result = -1;
+ #ifdef _UNICODE
+- wchar_t *path_w = curlx_convert_UTF8_to_wchar(path);
++ char *path_w = curlx_convert_UTF8_to_wchar(path);
+ #endif /* _UNICODE */
+
+ #if defined(USE_WIN32_SMALL_FILES)
+@@ -133,7 +133,7 @@ int curlx_win32_access(const char *path,
+ {
+ int result = -1;
+ #ifdef _UNICODE
+- wchar_t *path_w = curlx_convert_UTF8_to_wchar(path);
++ char *path_w = curlx_convert_UTF8_to_wchar(path);
+ #endif /* _UNICODE */
+
+ #if defined(_UNICODE)
+diff -urp a/Utilities/cmcurl/lib/curl_multibyte.h b/Utilities/cmcurl/lib/curl_multibyte.h
+--- a/Utilities/cmcurl/lib/curl_multibyte.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/curl_multibyte.h 2021-02-11 18:43:33.832519600 +0330
+@@ -29,8 +29,8 @@
+ * MultiByte conversions using Windows kernel32 library.
+ */
+
+-wchar_t *curlx_convert_UTF8_to_wchar(const char *str_utf8);
+-char *curlx_convert_wchar_to_UTF8(const wchar_t *str_w);
++char *curlx_convert_UTF8_to_wchar(const char *str_utf8);
++char *curlx_convert_charo_UTF8(const char *str_w);
+
+ #endif /* WIN32 */
+
+@@ -55,7 +55,7 @@ char *curlx_convert_wchar_to_UTF8(const
+ #if defined(UNICODE) && defined(WIN32)
+
+ #define curlx_convert_UTF8_to_tchar(ptr) curlx_convert_UTF8_to_wchar((ptr))
+-#define curlx_convert_tchar_to_UTF8(ptr) curlx_convert_wchar_to_UTF8((ptr))
++#define curlx_convert_tchar_to_UTF8(ptr) curlx_convert_charo_UTF8((ptr))
+ #define curlx_unicodefree(ptr) \
+ do { \
+ if(ptr) { \
+diff -urp a/Utilities/cmcurl/lib/curl_setup_once.h b/Utilities/cmcurl/lib/curl_setup_once.h
+--- a/Utilities/cmcurl/lib/curl_setup_once.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/curl_setup_once.h 2021-02-11 18:43:33.869186847 +0330
+@@ -482,7 +482,7 @@ typedef int sig_atomic_t;
+ #ifdef __VMS
+ #define argv_item_t __char_ptr32
+ #elif defined(_UNICODE)
+-#define argv_item_t wchar_t *
++#define argv_item_t char *
+ #else
+ #define argv_item_t char *
+ #endif
+diff -urp a/Utilities/cmcurl/lib/curl_sspi.c b/Utilities/cmcurl/lib/curl_sspi.c
+--- a/Utilities/cmcurl/lib/curl_sspi.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/curl_sspi.c 2021-02-11 18:43:33.792518966 +0330
+@@ -41,7 +41,7 @@ typedef PSecurityFunctionTable (APIENTRY
+ /* See definition of SECURITY_ENTRYPOINT in sspi.h */
+ #ifdef UNICODE
+ # ifdef _WIN32_WCE
+-# define SECURITYENTRYPOINT L"InitSecurityInterfaceW"
++# define SECURITYENTRYPOINT "InitSecurityInterfaceW"
+ # else
+ # define SECURITYENTRYPOINT "InitSecurityInterfaceW"
+ # endif
+diff -urp a/Utilities/cmcurl/lib/curlx.h b/Utilities/cmcurl/lib/curlx.h
+--- a/Utilities/cmcurl/lib/curlx.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/curlx.h 2021-02-11 18:43:33.722517857 +0330
+@@ -57,7 +57,7 @@
+ /* "curl_multibyte.h" provides these functions and macros:
+
+ curlx_convert_UTF8_to_wchar()
+- curlx_convert_wchar_to_UTF8()
++ curlx_convert_charo_UTF8()
+ curlx_convert_UTF8_to_tchar()
+ curlx_convert_tchar_to_UTF8()
+ curlx_unicodefree()
+diff -urp a/Utilities/cmcurl/lib/idn_win32.c b/Utilities/cmcurl/lib/idn_win32.c
+--- a/Utilities/cmcurl/lib/idn_win32.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/idn_win32.c 2021-02-11 18:43:33.875853618 +0330
+@@ -72,13 +72,13 @@ bool curl_win32_idn_to_ascii(const char
+ {
+ bool success = FALSE;
+
+- wchar_t *in_w = curlx_convert_UTF8_to_wchar(in);
++ char *in_w = curlx_convert_UTF8_to_wchar(in);
+ if(in_w) {
+- wchar_t punycode[IDN_MAX_LENGTH];
++ char punycode[IDN_MAX_LENGTH];
+ int chars = IdnToAscii(0, in_w, -1, punycode, IDN_MAX_LENGTH);
+ free(in_w);
+ if(chars) {
+- *out = curlx_convert_wchar_to_UTF8(punycode);
++ *out = curlx_convert_charo_UTF8(punycode);
+ if(*out)
+ success = TRUE;
+ }
+@@ -91,15 +91,15 @@ bool curl_win32_ascii_to_idn(const char
+ {
+ bool success = FALSE;
+
+- wchar_t *in_w = curlx_convert_UTF8_to_wchar(in);
++ char *in_w = curlx_convert_UTF8_to_wchar(in);
+ if(in_w) {
+ size_t in_len = wcslen(in_w) + 1;
+- wchar_t unicode[IDN_MAX_LENGTH];
++ char unicode[IDN_MAX_LENGTH];
+ int chars = IdnToUnicode(0, in_w, curlx_uztosi(in_len),
+ unicode, IDN_MAX_LENGTH);
+ free(in_w);
+ if(chars) {
+- *out = curlx_convert_wchar_to_UTF8(unicode);
++ *out = curlx_convert_charo_UTF8(unicode);
+ if(*out)
+ success = TRUE;
+ }
+diff -urp a/Utilities/cmcurl/lib/memdebug.c b/Utilities/cmcurl/lib/memdebug.c
+--- a/Utilities/cmcurl/lib/memdebug.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/memdebug.c 2021-02-11 18:43:33.732518016 +0330
+@@ -238,9 +238,9 @@ char *curl_dbg_strdup(const char *str, i
+ }
+
+ #if defined(WIN32) && defined(UNICODE)
+-wchar_t *curl_dbg_wcsdup(const wchar_t *str, int line, const char *source)
++char *curl_dbg_wcsdup(const char *str, int line, const char *source)
+ {
+- wchar_t *mem;
++ char *mem;
+ size_t wsiz, bsiz;
+
+ DEBUGASSERT(str != NULL);
+@@ -249,7 +249,7 @@ wchar_t *curl_dbg_wcsdup(const wchar_t *
+ return NULL;
+
+ wsiz = wcslen(str) + 1;
+- bsiz = wsiz * sizeof(wchar_t);
++ bsiz = wsiz * sizeof(char);
+
+ mem = curl_dbg_malloc(bsiz, 0, NULL); /* NULL prevents logging */
+ if(mem)
+diff -urp a/Utilities/cmcurl/lib/memdebug.h b/Utilities/cmcurl/lib/memdebug.h
+--- a/Utilities/cmcurl/lib/memdebug.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/memdebug.h 2021-02-11 18:43:33.832519600 +0330
+@@ -41,7 +41,7 @@ CURL_EXTERN void *curl_dbg_realloc(void
+ CURL_EXTERN void curl_dbg_free(void *ptr, int line, const char *source);
+ CURL_EXTERN char *curl_dbg_strdup(const char *str, int line, const char *src);
+ #if defined(WIN32) && defined(UNICODE)
+-CURL_EXTERN wchar_t *curl_dbg_wcsdup(const wchar_t *str, int line,
++CURL_EXTERN char *curl_dbg_wcsdup(const char *str, int line,
+ const char *source);
+ #endif
+
+diff -urp a/Utilities/cmcurl/lib/setup-win32.h b/Utilities/cmcurl/lib/setup-win32.h
+--- a/Utilities/cmcurl/lib/setup-win32.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/setup-win32.h 2021-02-11 18:43:33.872520232 +0330
+@@ -54,7 +54,7 @@
+ # endif
+ # include <tchar.h>
+ # ifdef UNICODE
+- typedef wchar_t *(*curl_wcsdup_callback)(const wchar_t *str);
++ typedef char *(*curl_wcsdup_callback)(const char *str);
+ # endif
+ #endif
+
+diff -urp a/Utilities/cmcurl/lib/strerror.c b/Utilities/cmcurl/lib/strerror.c
+--- a/Utilities/cmcurl/lib/strerror.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/strerror.c 2021-02-11 18:43:33.752518332 +0330
+@@ -660,12 +660,12 @@ get_winapi_error(int err, char *buf, siz
+
+ #ifdef _WIN32_WCE
+ {
+- wchar_t wbuf[256];
++ char wbuf[256];
+ wbuf[0] = L'\0';
+
+ if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+- LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
++ LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(char), NULL)) {
+ size_t written = wcstombs(buf, wbuf, buflen - 1);
+ if(written != (size_t)-1)
+ buf[written] = '\0';
+diff -urp a/Utilities/cmcurl/lib/system_win32.c b/Utilities/cmcurl/lib/system_win32.c
+--- a/Utilities/cmcurl/lib/system_win32.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/system_win32.c 2021-02-11 18:43:33.832519600 +0330
+@@ -152,7 +152,7 @@ typedef HMODULE (APIENTRY *LOADLIBRARYEX
+ /* See function definitions in winbase.h */
+ #ifdef UNICODE
+ # ifdef _WIN32_WCE
+-# define LOADLIBARYEX L"LoadLibraryExW"
++# define LOADLIBARYEX "LoadLibraryExW"
+ # else
+ # define LOADLIBARYEX "LoadLibraryExW"
+ # endif
+diff -urp a/Utilities/cmcurl/lib/vtls/schannel.c b/Utilities/cmcurl/lib/vtls/schannel.c
+--- a/Utilities/cmcurl/lib/vtls/schannel.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/vtls/schannel.c 2021-02-11 18:43:33.765851877 +0330
+@@ -70,7 +70,7 @@
+ #endif
+
+ #ifndef UNISP_NAME_W
+-#define UNISP_NAME_W L"Microsoft Unified Security Protocol Provider"
++#define UNISP_NAME_W "Microsoft Unified Security Protocol Provider"
+ #endif
+
+ #ifndef UNISP_NAME
+diff -urp a/Utilities/cmcurl/lib/vtls/schannel_verify.c b/Utilities/cmcurl/lib/vtls/schannel_verify.c
+--- a/Utilities/cmcurl/lib/vtls/schannel_verify.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmcurl/lib/vtls/schannel_verify.c 2021-02-11 18:43:33.769185263 +0330
+@@ -384,7 +384,7 @@ static DWORD cert_get_name_string(struct
+ /* Iterate over the alternate names and populate host_names. */
+ for(i = 0; i < alt_name_info->cAltEntry; i++) {
+ const CERT_ALT_NAME_ENTRY *entry = &alt_name_info->rgAltEntry[i];
+- wchar_t *dns_w = NULL;
++ char *dns_w = NULL;
+ size_t current_length = 0;
+
+ if(entry->dwAltNameChoice != CERT_ALT_NAME_DNS_NAME) {
+diff -urp a/Utilities/cmexpat/lib/expat_external.h b/Utilities/cmexpat/lib/expat_external.h
+--- a/Utilities/cmexpat/lib/expat_external.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmexpat/lib/expat_external.h 2021-02-11 18:43:34.099190481 +0330
+@@ -129,14 +129,14 @@ extern "C" {
+ # define XML_UNICODE
+ # endif
+ # if defined(__SIZEOF_WCHAR_T__) && (__SIZEOF_WCHAR_T__ != 2)
+-# error "sizeof(wchar_t) != 2; Need -fshort-wchar for both Expat and libc"
++# error "sizeof(char) != 2; Need -fshort-wchar for both Expat and libc"
+ # endif
+ #endif
+
+ #ifdef XML_UNICODE /* Information is UTF-16 encoded. */
+ # ifdef XML_UNICODE_WCHAR_T
+-typedef wchar_t XML_Char;
+-typedef wchar_t XML_LChar;
++typedef char XML_Char;
++typedef char XML_LChar;
+ # else
+ typedef unsigned short XML_Char;
+ typedef char XML_LChar;
+diff -urp a/Utilities/cmexpat/lib/xmlparse.c b/Utilities/cmexpat/lib/xmlparse.c
+--- a/Utilities/cmexpat/lib/xmlparse.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmexpat/lib/xmlparse.c 2021-02-11 18:43:34.095857094 +0330
+@@ -157,7 +157,7 @@ typedef char ICHAR;
+ #ifdef XML_UNICODE
+
+ # ifdef XML_UNICODE_WCHAR_T
+-# define XML_T(x) (const wchar_t) x
++# define XML_T(x) (const char) x
+ # define XML_L(x) L##x
+ # else
+ # define XML_T(x) (const unsigned short)x
+diff -urp a/Utilities/cmexpat/README.md b/Utilities/cmexpat/README.md
+--- a/Utilities/cmexpat/README.md 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmexpat/README.md 2021-02-11 18:43:34.062523237 +0330
+@@ -99,7 +99,7 @@ support this mode of compilation (yet):
+ 1. For UTF-16 output as unsigned short (and version/error strings as char),
+ run:<br/>
+ `./configure CPPFLAGS=-DXML_UNICODE --without-xmlwf`<br/>
+- For UTF-16 output as `wchar_t` (incl. version/error strings), run:<br/>
++ For UTF-16 output as `char` (incl. version/error strings), run:<br/>
+ `./configure CFLAGS="-g -O2 -fshort-wchar" CPPFLAGS=-DXML_UNICODE_WCHAR_T
+ --without-xmlwf`
+ <br/>Note: The latter requires libc compiled with `-fshort-wchar`, as well.
+@@ -165,7 +165,7 @@ EXPAT_BUILD_TESTS:BOOL=ON
+ // build the xmlwf tool for expat library
+ EXPAT_BUILD_TOOLS:BOOL=ON
+
+-// Character type to use (char|ushort|wchar_t) [default=char]
++// Character type to use (char|ushort|char) [default=char]
+ EXPAT_CHAR_TYPE:STRING=char
+
+ // install expat files in cmake install target
+diff -urp a/Utilities/cmlibarchive/build/cmake/config.h.in b/Utilities/cmlibarchive/build/cmake/config.h.in
+--- a/Utilities/cmlibarchive/build/cmake/config.h.in 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/build/cmake/config.h.in 2021-02-12 14:39:59.857852509 +0330
+@@ -931,7 +931,7 @@
+ /* Define to 1 if you have the <wchar.h> header file. */
+ #cmakedefine HAVE_WCHAR_H 1
+
+-/* Define to 1 if the system has the type `wchar_t'. */
++/* Define to 1 if the system has the type `char'. */
+ #cmakedefine HAVE_WCHAR_T 1
+
+ /* Define to 1 if you have the `wcrtomb' function. */
+@@ -1027,7 +1027,7 @@
+ /* Define to 1 if your C compiler doesn't accept -c and -o together. */
+ #cmakedefine NO_MINUS_C_MINUS_O 1
+
+-/* The size of `wchar_t', as computed by sizeof. */
++/* The size of `char', as computed by sizeof. */
+ #cmakedefine SIZEOF_WCHAR_T ${SIZEOF_WCHAR_T}
+
+ /* Define to 1 if strerror_r returns char *. */
+diff -urp a/Utilities/cmlibarchive/CMakeLists.txt b/Utilities/cmlibarchive/CMakeLists.txt
+--- a/Utilities/cmlibarchive/CMakeLists.txt 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/CMakeLists.txt 2021-02-12 14:39:59.857852509 +0330
+@@ -1612,7 +1612,7 @@ IF(NOT HAVE_PID_T)
+ ENDIF(WIN32)
+ ENDIF(NOT HAVE_PID_T)
+ #
+-CHECK_TYPE_SIZE(wchar_t SIZEOF_WCHAR_T)
++CHECK_TYPE_SIZE(char SIZEOF_WCHAR_T)
+ IF(HAVE_SIZEOF_WCHAR_T)
+ SET(HAVE_WCHAR_T 1)
+ ENDIF(HAVE_SIZEOF_WCHAR_T)
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_acl.c b/Utilities/cmlibarchive/libarchive/archive_acl.c
+--- a/Utilities/cmlibarchive/libarchive/archive_acl.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_acl.c 2021-02-11 18:43:34.425862296 +0330
+@@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$");
+
+ #ifndef HAVE_WMEMCMP
+ /* Good enough for simple equality testing, but not for sorting. */
+-#define wmemcmp(a,b,i) memcmp((a), (b), (i) * sizeof(wchar_t))
++#define wmemcmp(a,b,i) memcmp((a), (b), (i) * sizeof(char))
+ #endif
+
+ static int acl_special(struct archive_acl *acl,
+@@ -60,17 +60,17 @@ static int archive_acl_text_want_type(st
+ static ssize_t archive_acl_text_len(struct archive_acl *acl, int want_type,
+ int flags, int wide, struct archive *a,
+ struct archive_string_conv *sc);
+-static int isint_w(const wchar_t *start, const wchar_t *end, int *result);
+-static int ismode_w(const wchar_t *start, const wchar_t *end, int *result);
+-static int is_nfs4_flags_w(const wchar_t *start, const wchar_t *end,
++static int isint_w(const char *start, const char *end, int *result);
++static int ismode_w(const char *start, const char *end, int *result);
++static int is_nfs4_flags_w(const char *start, const char *end,
+ int *result);
+-static int is_nfs4_perms_w(const wchar_t *start, const wchar_t *end,
++static int is_nfs4_perms_w(const char *start, const char *end,
+ int *result);
+-static void next_field_w(const wchar_t **wp, const wchar_t **start,
+- const wchar_t **end, wchar_t *sep);
+-static void append_entry_w(wchar_t **wp, const wchar_t *prefix, int type,
+- int tag, int flags, const wchar_t *wname, int perm, int id);
+-static void append_id_w(wchar_t **wp, int id);
++static void next_field_w(const char **wp, const char **start,
++ const char **end, char *sep);
++static void append_entry_w(char **wp, const char *prefix, int type,
++ int tag, int flags, const char *wname, int perm, int id);
++static void append_id_w(char **wp, int id);
+ static int isint(const char *start, const char *end, int *result);
+ static int ismode(const char *start, const char *end, int *result);
+ static int is_nfs4_flags(const char *start, const char *end,
+@@ -86,7 +86,7 @@ static void append_id(char **p, int id);
+ static const struct {
+ const int perm;
+ const char c;
+- const wchar_t wc;
++ const char wc;
+ } nfsv4_acl_perm_map[] = {
+ { ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_LIST_DIRECTORY, 'r',
+ L'r' },
+@@ -113,7 +113,7 @@ static const int nfsv4_acl_perm_map_size
+ static const struct {
+ const int perm;
+ const char c;
+- const wchar_t wc;
++ const char wc;
+ } nfsv4_acl_flag_map[] = {
+ { ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT, 'f', L'f' },
+ { ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT, 'd', L'd' },
+@@ -187,7 +187,7 @@ archive_acl_add_entry(struct archive_acl
+
+ int
+ archive_acl_add_entry_w_len(struct archive_acl *acl,
+- int type, int permset, int tag, int id, const wchar_t *name, size_t len)
++ int type, int permset, int tag, int id, const char *name, size_t len)
+ {
+ struct archive_acl_entry *ap;
+
+@@ -534,7 +534,7 @@ archive_acl_text_len(struct archive_acl
+ int wide, struct archive *a, struct archive_string_conv *sc) {
+ struct archive_acl_entry *ap;
+ const char *name;
+- const wchar_t *wname;
++ const char *wname;
+ int count, idlen, tmp, r;
+ ssize_t length;
+ size_t len;
+@@ -660,19 +660,19 @@ archive_acl_text_len(struct archive_acl
+ * Generate a wide text version of the ACL. The flags parameter controls
+ * the type and style of the generated ACL.
+ */
+-wchar_t *
++char *
+ archive_acl_to_text_w(struct archive_acl *acl, ssize_t *text_len, int flags,
+ struct archive *a)
+ {
+ int count;
+ ssize_t length;
+ size_t len;
+- const wchar_t *wname;
+- const wchar_t *prefix;
+- wchar_t separator;
++ const char *wname;
++ const char *prefix;
++ char separator;
+ struct archive_acl_entry *ap;
+ int id, r, want_type;
+- wchar_t *wp, *ws;
++ char *wp, *ws;
+
+ want_type = archive_acl_text_want_type(acl, flags);
+
+@@ -694,7 +694,7 @@ archive_acl_to_text_w(struct archive_acl
+ separator = L'\n';
+
+ /* Now, allocate the string and actually populate it. */
+- wp = ws = (wchar_t *)malloc(length * sizeof(wchar_t));
++ wp = ws = (char *)malloc(length * sizeof(char));
+ if (wp == NULL) {
+ if (errno == ENOMEM)
+ __archive_errx(1, "No memory");
+@@ -731,7 +731,7 @@ archive_acl_to_text_w(struct archive_acl
+ continue;
+ if (ap->type == ARCHIVE_ENTRY_ACL_TYPE_DEFAULT &&
+ (flags & ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT) != 0)
+- prefix = L"default:";
++ prefix = "default:";
+ else
+ prefix = NULL;
+ r = archive_mstring_get_wcs(a, &ap->name, &wname);
+@@ -766,18 +766,18 @@ archive_acl_to_text_w(struct archive_acl
+ }
+
+ static void
+-append_id_w(wchar_t **wp, int id)
++append_id_w(char **wp, int id)
+ {
+ if (id < 0)
+ id = 0;
+ if (id > 9)
+ append_id_w(wp, id / 10);
+- *(*wp)++ = L"0123456789"[id % 10];
++ *(*wp)++ = "0123456789"[id % 10];
+ }
+
+ static void
+-append_entry_w(wchar_t **wp, const wchar_t *prefix, int type,
+- int tag, int flags, const wchar_t *wname, int perm, int id)
++append_entry_w(char **wp, const char *prefix, int type,
++ int tag, int flags, const char *wname, int perm, int id)
+ {
+ int i;
+
+@@ -790,36 +790,36 @@ append_entry_w(wchar_t **wp, const wchar
+ wname = NULL;
+ id = -1;
+ if ((type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0) {
+- wcscpy(*wp, L"owner@");
++ wcscpy(*wp, "owner@");
+ break;
+ }
+ /* FALLTHROUGH */
+ case ARCHIVE_ENTRY_ACL_USER:
+- wcscpy(*wp, L"user");
++ wcscpy(*wp, "user");
+ break;
+ case ARCHIVE_ENTRY_ACL_GROUP_OBJ:
+ wname = NULL;
+ id = -1;
+ if ((type & ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0) {
+- wcscpy(*wp, L"group@");
++ wcscpy(*wp, "group@");
+ break;
+ }
+ /* FALLTHROUGH */
+ case ARCHIVE_ENTRY_ACL_GROUP:
+- wcscpy(*wp, L"group");
++ wcscpy(*wp, "group");
+ break;
+ case ARCHIVE_ENTRY_ACL_MASK:
+- wcscpy(*wp, L"mask");
++ wcscpy(*wp, "mask");
+ wname = NULL;
+ id = -1;
+ break;
+ case ARCHIVE_ENTRY_ACL_OTHER:
+- wcscpy(*wp, L"other");
++ wcscpy(*wp, "other");
+ wname = NULL;
+ id = -1;
+ break;
+ case ARCHIVE_ENTRY_ACL_EVERYONE:
+- wcscpy(*wp, L"everyone@");
++ wcscpy(*wp, "everyone@");
+ wname = NULL;
+ id = -1;
+ break;
+@@ -867,16 +867,16 @@ append_entry_w(wchar_t **wp, const wchar
+ *(*wp)++ = L':';
+ switch (type) {
+ case ARCHIVE_ENTRY_ACL_TYPE_ALLOW:
+- wcscpy(*wp, L"allow");
++ wcscpy(*wp, "allow");
+ break;
+ case ARCHIVE_ENTRY_ACL_TYPE_DENY:
+- wcscpy(*wp, L"deny");
++ wcscpy(*wp, "deny");
+ break;
+ case ARCHIVE_ENTRY_ACL_TYPE_AUDIT:
+- wcscpy(*wp, L"audit");
++ wcscpy(*wp, "audit");
+ break;
+ case ARCHIVE_ENTRY_ACL_TYPE_ALARM:
+- wcscpy(*wp, L"alarm");
++ wcscpy(*wp, "alarm");
+ break;
+ default:
+ break;
+@@ -1134,20 +1134,20 @@ append_entry(char **p, const char *prefi
+ * ARCHIVE_ENTRY_ACL_TYPE_DEFAULT unless type is ARCHIVE_ENTRY_ACL_TYPE_NFS4
+ */
+ int
+-archive_acl_from_text_w(struct archive_acl *acl, const wchar_t *text,
++archive_acl_from_text_w(struct archive_acl *acl, const char *text,
+ int want_type)
+ {
+ struct {
+- const wchar_t *start;
+- const wchar_t *end;
++ const char *start;
++ const char *end;
+ } field[6], name;
+
+- const wchar_t *s, *st;
++ const char *s, *st;
+
+ int numfields, fields, n, r, sol, ret;
+ int type, types, tag, permset, id;
+ size_t len;
+- wchar_t sep;
++ char sep;
+
+ ret = ARCHIVE_OK;
+ types = 0;
+@@ -1174,7 +1174,7 @@ archive_acl_from_text_w(struct archive_a
+ */
+ fields = 0;
+ do {
+- const wchar_t *start, *end;
++ const char *start, *end;
+ next_field_w(&text, &start, &end, &sep);
+ if (fields < numfields) {
+ field[fields].start = start;
+@@ -1211,7 +1211,7 @@ archive_acl_from_text_w(struct archive_a
+ s = field[0].start;
+ len = field[0].end - field[0].start;
+ if (*s == L'd' && (len == 1 || (len >= 7
+- && wmemcmp((s + 1), L"efault", 6) == 0))) {
++ && wmemcmp((s + 1), "efault", 6) == 0))) {
+ type = ARCHIVE_ENTRY_ACL_TYPE_DEFAULT;
+ if (len > 7)
+ field[0].start += 7;
+@@ -1235,22 +1235,22 @@ archive_acl_from_text_w(struct archive_a
+ switch (*s) {
+ case L'u':
+ if (len == 1 || (len == 4
+- && wmemcmp(st, L"ser", 3) == 0))
++ && wmemcmp(st, "ser", 3) == 0))
+ tag = ARCHIVE_ENTRY_ACL_USER_OBJ;
+ break;
+ case L'g':
+ if (len == 1 || (len == 5
+- && wmemcmp(st, L"roup", 4) == 0))
++ && wmemcmp(st, "roup", 4) == 0))
+ tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ;
+ break;
+ case L'o':
+ if (len == 1 || (len == 5
+- && wmemcmp(st, L"ther", 4) == 0))
++ && wmemcmp(st, "ther", 4) == 0))
+ tag = ARCHIVE_ENTRY_ACL_OTHER;
+ break;
+ case L'm':
+ if (len == 1 || (len == 4
+- && wmemcmp(st, L"ask", 3) == 0))
++ && wmemcmp(st, "ask", 3) == 0))
+ tag = ARCHIVE_ENTRY_ACL_MASK;
+ break;
+ default:
+@@ -1308,21 +1308,21 @@ archive_acl_from_text_w(struct archive_a
+
+ switch (len) {
+ case 4:
+- if (wmemcmp(s, L"user", 4) == 0)
++ if (wmemcmp(s, "user", 4) == 0)
+ tag = ARCHIVE_ENTRY_ACL_USER;
+ break;
+ case 5:
+- if (wmemcmp(s, L"group", 5) == 0)
++ if (wmemcmp(s, "group", 5) == 0)
+ tag = ARCHIVE_ENTRY_ACL_GROUP;
+ break;
+ case 6:
+- if (wmemcmp(s, L"owner@", 6) == 0)
++ if (wmemcmp(s, "owner@", 6) == 0)
+ tag = ARCHIVE_ENTRY_ACL_USER_OBJ;
+- else if (wmemcmp(s, L"group@", len) == 0)
++ else if (wmemcmp(s, "group@", len) == 0)
+ tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ;
+ break;
+ case 9:
+- if (wmemcmp(s, L"everyone@", 9) == 0)
++ if (wmemcmp(s, "everyone@", 9) == 0)
+ tag = ARCHIVE_ENTRY_ACL_EVERYONE;
+ default:
+ break;
+@@ -1356,14 +1356,14 @@ archive_acl_from_text_w(struct archive_a
+ len = field[3 + n].end - field[3 + n].start;
+ type = 0;
+ if (len == 4) {
+- if (wmemcmp(s, L"deny", 4) == 0)
++ if (wmemcmp(s, "deny", 4) == 0)
+ type = ARCHIVE_ENTRY_ACL_TYPE_DENY;
+ } else if (len == 5) {
+- if (wmemcmp(s, L"allow", 5) == 0)
++ if (wmemcmp(s, "allow", 5) == 0)
+ type = ARCHIVE_ENTRY_ACL_TYPE_ALLOW;
+- else if (wmemcmp(s, L"audit", 5) == 0)
++ else if (wmemcmp(s, "audit", 5) == 0)
+ type = ARCHIVE_ENTRY_ACL_TYPE_AUDIT;
+- else if (wmemcmp(s, L"alarm", 5) == 0)
++ else if (wmemcmp(s, "alarm", 5) == 0)
+ type = ARCHIVE_ENTRY_ACL_TYPE_ALARM;
+ }
+ if (type == 0) {
+@@ -1396,7 +1396,7 @@ archive_acl_from_text_w(struct archive_a
+ * false otherwise.
+ */
+ static int
+-isint_w(const wchar_t *start, const wchar_t *end, int *result)
++isint_w(const char *start, const char *end, int *result)
+ {
+ int n = 0;
+ if (start >= end)
+@@ -1423,9 +1423,9 @@ isint_w(const wchar_t *start, const wcha
+ * false otherwise.
+ */
+ static int
+-ismode_w(const wchar_t *start, const wchar_t *end, int *permset)
++ismode_w(const char *start, const char *end, int *permset)
+ {
+- const wchar_t *p;
++ const char *p;
+
+ if (start >= end)
+ return (0);
+@@ -1457,9 +1457,9 @@ ismode_w(const wchar_t *start, const wch
+ * permission characters, false otherwise
+ */
+ static int
+-is_nfs4_perms_w(const wchar_t *start, const wchar_t *end, int *permset)
++is_nfs4_perms_w(const char *start, const char *end, int *permset)
+ {
+- const wchar_t *p = start;
++ const char *p = start;
+
+ while (p < end) {
+ switch (*p++) {
+@@ -1520,9 +1520,9 @@ is_nfs4_perms_w(const wchar_t *start, co
+ * flag characters, false otherwise
+ */
+ static int
+-is_nfs4_flags_w(const wchar_t *start, const wchar_t *end, int *permset)
++is_nfs4_flags_w(const char *start, const char *end, int *permset)
+ {
+- const wchar_t *p = start;
++ const char *p = start;
+
+ while (p < end) {
+ switch(*p++) {
+@@ -1566,8 +1566,8 @@ is_nfs4_flags_w(const wchar_t *start, co
+ * whitespace.
+ */
+ static void
+-next_field_w(const wchar_t **wp, const wchar_t **start,
+- const wchar_t **end, wchar_t *sep)
++next_field_w(const char **wp, const char **start,
++ const char **end, char *sep)
+ {
+ /* Skip leading whitespace to find start of field. */
+ while (**wp == L' ' || **wp == L'\t' || **wp == L'\n') {
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_acl_private.h b/Utilities/cmlibarchive/libarchive/archive_acl_private.h
+--- a/Utilities/cmlibarchive/libarchive/archive_acl_private.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_acl_private.h 2021-02-11 18:43:34.392528437 +0330
+@@ -48,7 +48,7 @@ struct archive_acl {
+ struct archive_acl_entry *acl_head;
+ struct archive_acl_entry *acl_p;
+ int acl_state; /* See acl_next for details. */
+- wchar_t *acl_text_w;
++ char *acl_text_w;
+ char *acl_text;
+ int acl_types;
+ };
+@@ -63,11 +63,11 @@ int archive_acl_next(struct archive *, s
+
+ int archive_acl_add_entry(struct archive_acl *, int, int, int, int, const char *);
+ int archive_acl_add_entry_w_len(struct archive_acl *,
+- int, int, int, int, const wchar_t *, size_t);
++ int, int, int, int, const char *, size_t);
+ int archive_acl_add_entry_len(struct archive_acl *,
+ int, int, int, int, const char *, size_t);
+
+-wchar_t *archive_acl_to_text_w(struct archive_acl *, ssize_t *, int,
++char *archive_acl_to_text_w(struct archive_acl *, ssize_t *, int,
+ struct archive *);
+ char *archive_acl_to_text_l(struct archive_acl *, ssize_t *, int,
+ struct archive_string_conv *);
+@@ -75,7 +75,7 @@ char *archive_acl_to_text_l(struct archi
+ /*
+ * ACL text parser.
+ */
+-int archive_acl_from_text_w(struct archive_acl *, const wchar_t * /* wtext */,
++int archive_acl_from_text_w(struct archive_acl *, const char * /* wtext */,
+ int /* type */);
+ int archive_acl_from_text_l(struct archive_acl *, const char * /* text */,
+ int /* type */, struct archive_string_conv *);
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_entry_acl.3 b/Utilities/cmlibarchive/libarchive/archive_entry_acl.3
+--- a/Utilities/cmlibarchive/libarchive/archive_entry_acl.3 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_entry_acl.3 2021-02-11 18:43:34.399195209 +0330
+@@ -59,7 +59,7 @@ Streaming Archive Library (libarchive, -
+ .Fa "int permset"
+ .Fa "int tag"
+ .Fa "int qualifier"
+-.Fa "const wchar_t *name"
++.Fa "const char *name"
+ .Fc
+ .Ft void
+ .Fn archive_entry_acl_clear "struct archive_entry *a"
+@@ -74,7 +74,7 @@ Streaming Archive Library (libarchive, -
+ .Ft int
+ .Fo archive_entry_acl_from_text_w
+ .Fa "struct archive_entry *a"
+-.Fa "const wchar_t *text"
++.Fa "const char *text"
+ .Fa "int type"
+ .Fc
+ .Ft int
+@@ -95,7 +95,7 @@ Streaming Archive Library (libarchive, -
+ .Fa "ssize_t *len_p"
+ .Fa "int flags"
+ .Fc
+-.Ft wchar_t *
++.Ft char *
+ .Fo archive_entry_acl_to_text_w
+ .Fa "struct archive_entry *a"
+ .Fa "ssize_t *len_p"
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_entry.c b/Utilities/cmlibarchive/libarchive/archive_entry.c
+--- a/Utilities/cmlibarchive/libarchive/archive_entry.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_entry.c 2021-02-11 18:43:34.392528437 +0330
+@@ -117,24 +117,24 @@ __FBSDID("$FreeBSD: head/lib/libarchive/
+ } while (0)
+
+ static char * ae_fflagstostr(unsigned long bitset, unsigned long bitclear);
+-static const wchar_t *ae_wcstofflags(const wchar_t *stringp,
++static const char *ae_wcstofflags(const char *stringp,
+ unsigned long *setp, unsigned long *clrp);
+ static const char *ae_strtofflags(const char *stringp,
+ unsigned long *setp, unsigned long *clrp);
+
+ #ifndef HAVE_WCSCPY
+-static wchar_t * wcscpy(wchar_t *s1, const wchar_t *s2)
++static char * wcscpy(char *s1, const char *s2)
+ {
+- wchar_t *dest = s1;
++ char *dest = s1;
+ while ((*s1 = *s2) != L'\0')
+ ++s1, ++s2;
+ return dest;
+ }
+ #endif
+ #ifndef HAVE_WCSLEN
+-static size_t wcslen(const wchar_t *s)
++static size_t wcslen(const char *s)
+ {
+- const wchar_t *p = s;
++ const char *p = s;
+ while (*p != L'\0')
+ ++p;
+ return p - s;
+@@ -142,7 +142,7 @@ static size_t wcslen(const wchar_t *s)
+ #endif
+ #ifndef HAVE_WMEMCMP
+ /* Good enough for simple equality testing, but not for sorting. */
+-#define wmemcmp(a,b,i) memcmp((a), (b), (i) * sizeof(wchar_t))
++#define wmemcmp(a,b,i) memcmp((a), (b), (i) * sizeof(char))
+ #endif
+
+ /****************************************************************************
+@@ -435,10 +435,10 @@ archive_entry_gname_utf8(struct archive_
+ }
+
+
+-const wchar_t *
++const char *
+ archive_entry_gname_w(struct archive_entry *entry)
+ {
+- const wchar_t *p;
++ const char *p;
+ if (archive_mstring_get_wcs(entry->archive, &entry->ae_gname, &p) == 0)
+ return (p);
+ if (errno == ENOMEM)
+@@ -481,10 +481,10 @@ archive_entry_hardlink_utf8(struct archi
+ return (NULL);
+ }
+
+-const wchar_t *
++const char *
+ archive_entry_hardlink_w(struct archive_entry *entry)
+ {
+- const wchar_t *p;
++ const char *p;
+ if ((entry->ae_set & AE_SET_HARDLINK) == 0)
+ return (NULL);
+ if (archive_mstring_get_wcs(
+@@ -579,10 +579,10 @@ archive_entry_pathname_utf8(struct archi
+ return (NULL);
+ }
+
+-const wchar_t *
++const char *
+ archive_entry_pathname_w(struct archive_entry *entry)
+ {
+- const wchar_t *p;
++ const char *p;
+ if (archive_mstring_get_wcs(
+ entry->archive, &entry->ae_pathname, &p) == 0)
+ return (p);
+@@ -656,10 +656,10 @@ archive_entry_sourcepath(struct archive_
+ return (NULL);
+ }
+
+-const wchar_t *
++const char *
+ archive_entry_sourcepath_w(struct archive_entry *entry)
+ {
+- const wchar_t *p;
++ const char *p;
+ if (archive_mstring_get_wcs(
+ entry->archive, &entry->ae_sourcepath, &p) == 0)
+ return (p);
+@@ -700,10 +700,10 @@ archive_entry_symlink_utf8(struct archiv
+ return (NULL);
+ }
+
+-const wchar_t *
++const char *
+ archive_entry_symlink_w(struct archive_entry *entry)
+ {
+- const wchar_t *p;
++ const char *p;
+ if ((entry->ae_set & AE_SET_SYMLINK) == 0)
+ return (NULL);
+ if (archive_mstring_get_wcs(
+@@ -754,10 +754,10 @@ archive_entry_uname_utf8(struct archive_
+ return (NULL);
+ }
+
+-const wchar_t *
++const char *
+ archive_entry_uname_w(struct archive_entry *entry)
+ {
+- const wchar_t *p;
++ const char *p;
+ if (archive_mstring_get_wcs(entry->archive, &entry->ae_uname, &p) == 0)
+ return (p);
+ if (errno == ENOMEM)
+@@ -820,9 +820,9 @@ archive_entry_copy_fflags_text(struct ar
+ &entry->ae_fflags_set, &entry->ae_fflags_clear));
+ }
+
+-const wchar_t *
++const char *
+ archive_entry_copy_fflags_text_w(struct archive_entry *entry,
+- const wchar_t *flags)
++ const char *flags)
+ {
+ archive_mstring_copy_wcs(&entry->ae_fflags_text, flags);
+ return (ae_wcstofflags(flags,
+@@ -855,7 +855,7 @@ archive_entry_copy_gname(struct archive_
+ }
+
+ void
+-archive_entry_copy_gname_w(struct archive_entry *entry, const wchar_t *name)
++archive_entry_copy_gname_w(struct archive_entry *entry, const char *name)
+ {
+ archive_mstring_copy_wcs(&entry->ae_gname, name);
+ }
+@@ -925,7 +925,7 @@ archive_entry_copy_hardlink(struct archi
+ }
+
+ void
+-archive_entry_copy_hardlink_w(struct archive_entry *entry, const wchar_t *target)
++archive_entry_copy_hardlink_w(struct archive_entry *entry, const char *target)
+ {
+ archive_mstring_copy_wcs(&entry->ae_hardlink, target);
+ if (target != NULL)
+@@ -1073,7 +1073,7 @@ archive_entry_copy_link(struct archive_e
+
+ /* Set symlink if symlink is already set, else set hardlink. */
+ void
+-archive_entry_copy_link_w(struct archive_entry *entry, const wchar_t *target)
++archive_entry_copy_link_w(struct archive_entry *entry, const char *target)
+ {
+ if (entry->ae_set & AE_SET_SYMLINK)
+ archive_mstring_copy_wcs(&entry->ae_symlink, target);
+@@ -1163,7 +1163,7 @@ archive_entry_copy_pathname(struct archi
+ }
+
+ void
+-archive_entry_copy_pathname_w(struct archive_entry *entry, const wchar_t *name)
++archive_entry_copy_pathname_w(struct archive_entry *entry, const char *name)
+ {
+ archive_mstring_copy_wcs(&entry->ae_pathname, name);
+ }
+@@ -1241,7 +1241,7 @@ archive_entry_copy_sourcepath(struct arc
+ }
+
+ void
+-archive_entry_copy_sourcepath_w(struct archive_entry *entry, const wchar_t *path)
++archive_entry_copy_sourcepath_w(struct archive_entry *entry, const char *path)
+ {
+ archive_mstring_copy_wcs(&entry->ae_sourcepath, path);
+ }
+@@ -1283,7 +1283,7 @@ archive_entry_copy_symlink(struct archiv
+ }
+
+ void
+-archive_entry_copy_symlink_w(struct archive_entry *entry, const wchar_t *linkname)
++archive_entry_copy_symlink_w(struct archive_entry *entry, const char *linkname)
+ {
+ archive_mstring_copy_wcs(&entry->ae_symlink, linkname);
+ if (linkname != NULL)
+@@ -1348,7 +1348,7 @@ archive_entry_copy_uname(struct archive_
+ }
+
+ void
+-archive_entry_copy_uname_w(struct archive_entry *entry, const wchar_t *name)
++archive_entry_copy_uname_w(struct archive_entry *entry, const char *name)
+ {
+ archive_mstring_copy_wcs(&entry->ae_uname, name);
+ }
+@@ -1452,7 +1452,7 @@ archive_entry_acl_add_entry(struct archi
+ */
+ int
+ archive_entry_acl_add_entry_w(struct archive_entry *entry,
+- int type, int permset, int tag, int id, const wchar_t *name)
++ int type, int permset, int tag, int id, const char *name)
+ {
+ return archive_acl_add_entry_w_len(&entry->acl,
+ type, permset, tag, id, name, wcslen(name));
+@@ -1507,7 +1507,7 @@ archive_entry_acl_next(struct archive_en
+ * Generate a text version of the ACL. The flags parameter controls
+ * the style of the generated ACL.
+ */
+-wchar_t *
++char *
+ archive_entry_acl_to_text_w(struct archive_entry *entry, la_ssize_t *len,
+ int flags)
+ {
+@@ -1534,7 +1534,7 @@ _archive_entry_acl_to_text_l(struct arch
+ */
+ int
+ archive_entry_acl_from_text_w(struct archive_entry *entry,
+- const wchar_t *wtext, int type)
++ const char *wtext, int type)
+ {
+ return (archive_acl_from_text_w(&entry->acl, wtext, type));
+ }
+@@ -1574,7 +1574,7 @@ archive_entry_acl_text_compat(int *flags
+ }
+
+ /* Deprecated */
+-const wchar_t *
++const char *
+ archive_entry_acl_text_w(struct archive_entry *entry, int flags)
+ {
+ free(entry->acl.acl_text_w);
+@@ -1696,166 +1696,166 @@ _archive_entry_acl_text_l(struct archive
+
+ static const struct flag {
+ const char *name;
+- const wchar_t *wname;
++ const char *wname;
+ unsigned long set;
+ unsigned long clear;
+ } fileflags[] = {
+ /* Preferred (shorter) names per flag first, all prefixed by "no" */
+ #ifdef SF_APPEND
+- { "nosappnd", L"nosappnd", SF_APPEND, 0},
+- { "nosappend", L"nosappend", SF_APPEND, 0},
++ { "nosappnd", "nosappnd", SF_APPEND, 0},
++ { "nosappend", "nosappend", SF_APPEND, 0},
+ #endif
+ #if defined(FS_APPEND_FL) /* 'a' */
+- { "nosappnd", L"nosappnd", FS_APPEND_FL, 0},
+- { "nosappend", L"nosappend", FS_APPEND_FL, 0},
++ { "nosappnd", "nosappnd", FS_APPEND_FL, 0},
++ { "nosappend", "nosappend", FS_APPEND_FL, 0},
+ #elif defined(EXT2_APPEND_FL) /* 'a' */
+- { "nosappnd", L"nosappnd", EXT2_APPEND_FL, 0},
+- { "nosappend", L"nosappend", EXT2_APPEND_FL, 0},
++ { "nosappnd", "nosappnd", EXT2_APPEND_FL, 0},
++ { "nosappend", "nosappend", EXT2_APPEND_FL, 0},
+ #endif
+ #ifdef SF_ARCHIVED
+- { "noarch", L"noarch", SF_ARCHIVED, 0},
+- { "noarchived", L"noarchived", SF_ARCHIVED, 0},
++ { "noarch", "noarch", SF_ARCHIVED, 0},
++ { "noarchived", "noarchived", SF_ARCHIVED, 0},
+ #endif
+ #ifdef SF_IMMUTABLE
+- { "noschg", L"noschg", SF_IMMUTABLE, 0},
+- { "noschange", L"noschange", SF_IMMUTABLE, 0},
+- { "nosimmutable", L"nosimmutable", SF_IMMUTABLE, 0},
++ { "noschg", "noschg", SF_IMMUTABLE, 0},
++ { "noschange", "noschange", SF_IMMUTABLE, 0},
++ { "nosimmutable", "nosimmutable", SF_IMMUTABLE, 0},
+ #endif
+ #if defined(FS_IMMUTABLE_FL) /* 'i' */
+- { "noschg", L"noschg", FS_IMMUTABLE_FL, 0},
+- { "noschange", L"noschange", FS_IMMUTABLE_FL, 0},
+- { "nosimmutable", L"nosimmutable", FS_IMMUTABLE_FL, 0},
++ { "noschg", "noschg", FS_IMMUTABLE_FL, 0},
++ { "noschange", "noschange", FS_IMMUTABLE_FL, 0},
++ { "nosimmutable", "nosimmutable", FS_IMMUTABLE_FL, 0},
+ #elif defined(EXT2_IMMUTABLE_FL) /* 'i' */
+- { "noschg", L"noschg", EXT2_IMMUTABLE_FL, 0},
+- { "noschange", L"noschange", EXT2_IMMUTABLE_FL, 0},
+- { "nosimmutable", L"nosimmutable", EXT2_IMMUTABLE_FL, 0},
++ { "noschg", "noschg", EXT2_IMMUTABLE_FL, 0},
++ { "noschange", "noschange", EXT2_IMMUTABLE_FL, 0},
++ { "nosimmutable", "nosimmutable", EXT2_IMMUTABLE_FL, 0},
+ #endif
+ #ifdef SF_NOUNLINK
+- { "nosunlnk", L"nosunlnk", SF_NOUNLINK, 0},
+- { "nosunlink", L"nosunlink", SF_NOUNLINK, 0},
++ { "nosunlnk", "nosunlnk", SF_NOUNLINK, 0},
++ { "nosunlink", "nosunlink", SF_NOUNLINK, 0},
+ #endif
+ #ifdef UF_APPEND
+- { "nouappnd", L"nouappnd", UF_APPEND, 0},
+- { "nouappend", L"nouappend", UF_APPEND, 0},
++ { "nouappnd", "nouappnd", UF_APPEND, 0},
++ { "nouappend", "nouappend", UF_APPEND, 0},
+ #endif
+ #ifdef UF_IMMUTABLE
+- { "nouchg", L"nouchg", UF_IMMUTABLE, 0},
+- { "nouchange", L"nouchange", UF_IMMUTABLE, 0},
+- { "nouimmutable", L"nouimmutable", UF_IMMUTABLE, 0},
++ { "nouchg", "nouchg", UF_IMMUTABLE, 0},
++ { "nouchange", "nouchange", UF_IMMUTABLE, 0},
++ { "nouimmutable", "nouimmutable", UF_IMMUTABLE, 0},
+ #endif
+ #ifdef UF_NODUMP
+- { "nodump", L"nodump", 0, UF_NODUMP},
++ { "nodump", "nodump", 0, UF_NODUMP},
+ #endif
+ #if defined(FS_NODUMP_FL) /* 'd' */
+- { "nodump", L"nodump", 0, FS_NODUMP_FL},
++ { "nodump", "nodump", 0, FS_NODUMP_FL},
+ #elif defined(EXT2_NODUMP_FL)
+- { "nodump", L"nodump", 0, EXT2_NODUMP_FL},
++ { "nodump", "nodump", 0, EXT2_NODUMP_FL},
+ #endif
+ #ifdef UF_OPAQUE
+- { "noopaque", L"noopaque", UF_OPAQUE, 0},
++ { "noopaque", "noopaque", UF_OPAQUE, 0},
+ #endif
+ #ifdef UF_NOUNLINK
+- { "nouunlnk", L"nouunlnk", UF_NOUNLINK, 0},
+- { "nouunlink", L"nouunlink", UF_NOUNLINK, 0},
++ { "nouunlnk", "nouunlnk", UF_NOUNLINK, 0},
++ { "nouunlink", "nouunlink", UF_NOUNLINK, 0},
+ #endif
+ #ifdef UF_COMPRESSED
+ /* Mac OS */
+- { "nocompressed", L"nocompressed", UF_COMPRESSED, 0},
++ { "nocompressed", "nocompressed", UF_COMPRESSED, 0},
+ #endif
+ #ifdef UF_HIDDEN
+- { "nohidden", L"nohidden", UF_HIDDEN, 0},
+- { "nouhidden", L"nouhidden", UF_HIDDEN, 0},
++ { "nohidden", "nohidden", UF_HIDDEN, 0},
++ { "nouhidden", "nouhidden", UF_HIDDEN, 0},
+ #endif
+ #ifdef FILE_ATTRIBUTE_HIDDEN
+- { "nohidden", L"nohidden", FILE_ATTRIBUTE_HIDDEN, 0},
+- { "nouhidden", L"nouhidden", FILE_ATTRIBUTE_HIDDEN, 0},
++ { "nohidden", "nohidden", FILE_ATTRIBUTE_HIDDEN, 0},
++ { "nouhidden", "nouhidden", FILE_ATTRIBUTE_HIDDEN, 0},
+ #endif
+ #ifdef UF_OFFLINE
+- { "nooffline", L"nooffline", UF_OFFLINE, 0},
+- { "nouoffline", L"nouoffline", UF_OFFLINE, 0},
++ { "nooffline", "nooffline", UF_OFFLINE, 0},
++ { "nouoffline", "nouoffline", UF_OFFLINE, 0},
+ #endif
+ #ifdef UF_READONLY
+- { "nordonly", L"nordonly", UF_READONLY, 0},
+- { "nourdonly", L"nourdonly", UF_READONLY, 0},
+- { "noreadonly", L"noreadonly", UF_READONLY, 0},
++ { "nordonly", "nordonly", UF_READONLY, 0},
++ { "nourdonly", "nourdonly", UF_READONLY, 0},
++ { "noreadonly", "noreadonly", UF_READONLY, 0},
+ #endif
+ #ifdef FILE_ATTRIBUTE_READONLY
+- { "nordonly", L"nordonly", FILE_ATTRIBUTE_READONLY, 0},
+- { "nourdonly", L"nourdonly", FILE_ATTRIBUTE_READONLY, 0},
+- { "noreadonly", L"noreadonly", FILE_ATTRIBUTE_READONLY, 0},
++ { "nordonly", "nordonly", FILE_ATTRIBUTE_READONLY, 0},
++ { "nourdonly", "nourdonly", FILE_ATTRIBUTE_READONLY, 0},
++ { "noreadonly", "noreadonly", FILE_ATTRIBUTE_READONLY, 0},
+ #endif
+ #ifdef UF_SPARSE
+- { "nosparse", L"nosparse", UF_SPARSE, 0},
+- { "nousparse", L"nousparse", UF_SPARSE, 0},
++ { "nosparse", "nosparse", UF_SPARSE, 0},
++ { "nousparse", "nousparse", UF_SPARSE, 0},
+ #endif
+ #ifdef UF_REPARSE
+- { "noreparse", L"noreparse", UF_REPARSE, 0},
+- { "noureparse", L"noureparse", UF_REPARSE, 0},
++ { "noreparse", "noreparse", UF_REPARSE, 0},
++ { "noureparse", "noureparse", UF_REPARSE, 0},
+ #endif
+ #ifdef UF_SYSTEM
+- { "nosystem", L"nosystem", UF_SYSTEM, 0},
+- { "nousystem", L"nousystem", UF_SYSTEM, 0},
++ { "nosystem", "nosystem", UF_SYSTEM, 0},
++ { "nousystem", "nousystem", UF_SYSTEM, 0},
+ #endif
+ #ifdef FILE_ATTRIBUTE_SYSTEM
+- { "nosystem", L"nosystem", FILE_ATTRIBUTE_SYSTEM, 0},
+- { "nousystem", L"nousystem", FILE_ATTRIBUTE_SYSTEM, 0},
++ { "nosystem", "nosystem", FILE_ATTRIBUTE_SYSTEM, 0},
++ { "nousystem", "nousystem", FILE_ATTRIBUTE_SYSTEM, 0},
+ #endif
+ #if defined(FS_UNRM_FL) /* 'u' */
+- { "noundel", L"noundel", FS_UNRM_FL, 0},
++ { "noundel", "noundel", FS_UNRM_FL, 0},
+ #elif defined(EXT2_UNRM_FL)
+- { "noundel", L"noundel", EXT2_UNRM_FL, 0},
++ { "noundel", "noundel", EXT2_UNRM_FL, 0},
+ #endif
+
+ #if defined(FS_COMPR_FL) /* 'c' */
+- { "nocompress", L"nocompress", FS_COMPR_FL, 0},
++ { "nocompress", "nocompress", FS_COMPR_FL, 0},
+ #elif defined(EXT2_COMPR_FL)
+- { "nocompress", L"nocompress", EXT2_COMPR_FL, 0},
++ { "nocompress", "nocompress", EXT2_COMPR_FL, 0},
+ #endif
+
+ #if defined(FS_NOATIME_FL) /* 'A' */
+- { "noatime", L"noatime", 0, FS_NOATIME_FL},
++ { "noatime", "noatime", 0, FS_NOATIME_FL},
+ #elif defined(EXT2_NOATIME_FL)
+- { "noatime", L"noatime", 0, EXT2_NOATIME_FL},
++ { "noatime", "noatime", 0, EXT2_NOATIME_FL},
+ #endif
+ #if defined(FS_DIRSYNC_FL) /* 'D' */
+- { "nodirsync", L"nodirsync", FS_DIRSYNC_FL, 0},
++ { "nodirsync", "nodirsync", FS_DIRSYNC_FL, 0},
+ #elif defined(EXT2_DIRSYNC_FL)
+- { "nodirsync", L"nodirsync", EXT2_DIRSYNC_FL, 0},
++ { "nodirsync", "nodirsync", EXT2_DIRSYNC_FL, 0},
+ #endif
+ #if defined(FS_JOURNAL_DATA_FL) /* 'j' */
+- { "nojournal-data",L"nojournal-data", FS_JOURNAL_DATA_FL, 0},
+- { "nojournal", L"nojournal", FS_JOURNAL_DATA_FL, 0},
++ { "nojournal-data","nojournal-data", FS_JOURNAL_DATA_FL, 0},
++ { "nojournal", "nojournal", FS_JOURNAL_DATA_FL, 0},
+ #elif defined(EXT3_JOURNAL_DATA_FL)
+- { "nojournal-data",L"nojournal-data", EXT3_JOURNAL_DATA_FL, 0},
+- { "nojournal", L"nojournal", EXT3_JOURNAL_DATA_FL, 0},
++ { "nojournal-data","nojournal-data", EXT3_JOURNAL_DATA_FL, 0},
++ { "nojournal", "nojournal", EXT3_JOURNAL_DATA_FL, 0},
+ #endif
+ #if defined(FS_SECRM_FL) /* 's' */
+- { "nosecdel", L"nosecdel", FS_SECRM_FL, 0},
+- { "nosecuredeletion",L"nosecuredeletion",FS_SECRM_FL, 0},
++ { "nosecdel", "nosecdel", FS_SECRM_FL, 0},
++ { "nosecuredeletion","nosecuredeletion",FS_SECRM_FL, 0},
+ #elif defined(EXT2_SECRM_FL)
+- { "nosecdel", L"nosecdel", EXT2_SECRM_FL, 0},
+- { "nosecuredeletion",L"nosecuredeletion",EXT2_SECRM_FL, 0},
++ { "nosecdel", "nosecdel", EXT2_SECRM_FL, 0},
++ { "nosecuredeletion","nosecuredeletion",EXT2_SECRM_FL, 0},
+ #endif
+ #if defined(FS_SYNC_FL) /* 'S' */
+- { "nosync", L"nosync", FS_SYNC_FL, 0},
++ { "nosync", "nosync", FS_SYNC_FL, 0},
+ #elif defined(EXT2_SYNC_FL)
+- { "nosync", L"nosync", EXT2_SYNC_FL, 0},
++ { "nosync", "nosync", EXT2_SYNC_FL, 0},
+ #endif
+ #if defined(FS_NOTAIL_FL) /* 't' */
+- { "notail", L"notail", 0, FS_NOTAIL_FL},
++ { "notail", "notail", 0, FS_NOTAIL_FL},
+ #elif defined(EXT2_NOTAIL_FL)
+- { "notail", L"notail", 0, EXT2_NOTAIL_FL},
++ { "notail", "notail", 0, EXT2_NOTAIL_FL},
+ #endif
+ #if defined(FS_TOPDIR_FL) /* 'T' */
+- { "notopdir", L"notopdir", FS_TOPDIR_FL, 0},
++ { "notopdir", "notopdir", FS_TOPDIR_FL, 0},
+ #elif defined(EXT2_TOPDIR_FL)
+- { "notopdir", L"notopdir", EXT2_TOPDIR_FL, 0},
++ { "notopdir", "notopdir", EXT2_TOPDIR_FL, 0},
+ #endif
+ #ifdef FS_NOCOW_FL /* 'C' */
+- { "nocow", L"nocow", 0, FS_NOCOW_FL},
++ { "nocow", "nocow", 0, FS_NOCOW_FL},
+ #endif
+ #ifdef FS_PROJINHERIT_FL /* 'P' */
+- { "noprojinherit",L"noprojinherit", FS_PROJINHERIT_FL, 0},
++ { "noprojinherit","noprojinherit", FS_PROJINHERIT_FL, 0},
+ #endif
+ { NULL, NULL, 0, 0}
+ };
+@@ -1987,13 +1987,13 @@ ae_strtofflags(const char *s, unsigned l
+ * This version is also const-correct and does not modify the
+ * provided string.
+ */
+-static const wchar_t *
+-ae_wcstofflags(const wchar_t *s, unsigned long *setp, unsigned long *clrp)
++static const char *
++ae_wcstofflags(const char *s, unsigned long *setp, unsigned long *clrp)
+ {
+- const wchar_t *start, *end;
++ const char *start, *end;
+ const struct flag *flag;
+ unsigned long set, clear;
+- const wchar_t *failed;
++ const char *failed;
+
+ set = clear = 0;
+ start = s;
+@@ -2053,14 +2053,14 @@ main(int argc, char **argv)
+ {
+ struct archive_entry *entry = archive_entry_new();
+ unsigned long set, clear;
+- const wchar_t *remainder;
++ const char *remainder;
+
+- remainder = archive_entry_copy_fflags_text_w(entry, L"nosappnd dump archive,,,,,,,");
++ remainder = archive_entry_copy_fflags_text_w(entry, "nosappnd dump archive,,,,,,,");
+ archive_entry_fflags(entry, &set, &clear);
+
+- wprintf(L"set=0x%lX clear=0x%lX remainder='%ls'\n", set, clear, remainder);
++ wprintf("set=0x%lX clear=0x%lX remainder='%ls'\n", set, clear, remainder);
+
+- wprintf(L"new flags='%s'\n", archive_entry_fflags_text(entry));
++ wprintf("new flags='%s'\n", archive_entry_fflags_text(entry));
+ return (0);
+ }
+ #endif
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_entry.h b/Utilities/cmlibarchive/libarchive/archive_entry.h
+--- a/Utilities/cmlibarchive/libarchive/archive_entry.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_entry.h 2021-02-11 18:43:34.442529226 +0330
+@@ -41,7 +41,7 @@
+ */
+
+ #include <sys/types.h>
+-#include <stddef.h> /* for wchar_t */
++#include <stddef.h> /* for char */
+ #include <stdint.h>
+ #include <time.h>
+
+@@ -253,10 +253,10 @@ __LA_DECL const char *archive_entry_ffla
+ __LA_DECL la_int64_t archive_entry_gid(struct archive_entry *);
+ __LA_DECL const char *archive_entry_gname(struct archive_entry *);
+ __LA_DECL const char *archive_entry_gname_utf8(struct archive_entry *);
+-__LA_DECL const wchar_t *archive_entry_gname_w(struct archive_entry *);
++__LA_DECL const char *archive_entry_gname_w(struct archive_entry *);
+ __LA_DECL const char *archive_entry_hardlink(struct archive_entry *);
+ __LA_DECL const char *archive_entry_hardlink_utf8(struct archive_entry *);
+-__LA_DECL const wchar_t *archive_entry_hardlink_w(struct archive_entry *);
++__LA_DECL const char *archive_entry_hardlink_w(struct archive_entry *);
+ __LA_DECL la_int64_t archive_entry_ino(struct archive_entry *);
+ __LA_DECL la_int64_t archive_entry_ino64(struct archive_entry *);
+ __LA_DECL int archive_entry_ino_is_set(struct archive_entry *);
+@@ -267,24 +267,24 @@ __LA_DECL int archive_entry_mtime_is_s
+ __LA_DECL unsigned int archive_entry_nlink(struct archive_entry *);
+ __LA_DECL const char *archive_entry_pathname(struct archive_entry *);
+ __LA_DECL const char *archive_entry_pathname_utf8(struct archive_entry *);
+-__LA_DECL const wchar_t *archive_entry_pathname_w(struct archive_entry *);
++__LA_DECL const char *archive_entry_pathname_w(struct archive_entry *);
+ __LA_DECL __LA_MODE_T archive_entry_perm(struct archive_entry *);
+ __LA_DECL dev_t archive_entry_rdev(struct archive_entry *);
+ __LA_DECL dev_t archive_entry_rdevmajor(struct archive_entry *);
+ __LA_DECL dev_t archive_entry_rdevminor(struct archive_entry *);
+ __LA_DECL const char *archive_entry_sourcepath(struct archive_entry *);
+-__LA_DECL const wchar_t *archive_entry_sourcepath_w(struct archive_entry *);
++__LA_DECL const char *archive_entry_sourcepath_w(struct archive_entry *);
+ __LA_DECL la_int64_t archive_entry_size(struct archive_entry *);
+ __LA_DECL int archive_entry_size_is_set(struct archive_entry *);
+ __LA_DECL const char *archive_entry_strmode(struct archive_entry *);
+ __LA_DECL const char *archive_entry_symlink(struct archive_entry *);
+ __LA_DECL const char *archive_entry_symlink_utf8(struct archive_entry *);
+ __LA_DECL int archive_entry_symlink_type(struct archive_entry *);
+-__LA_DECL const wchar_t *archive_entry_symlink_w(struct archive_entry *);
++__LA_DECL const char *archive_entry_symlink_w(struct archive_entry *);
+ __LA_DECL la_int64_t archive_entry_uid(struct archive_entry *);
+ __LA_DECL const char *archive_entry_uname(struct archive_entry *);
+ __LA_DECL const char *archive_entry_uname_utf8(struct archive_entry *);
+-__LA_DECL const wchar_t *archive_entry_uname_w(struct archive_entry *);
++__LA_DECL const char *archive_entry_uname_w(struct archive_entry *);
+ __LA_DECL int archive_entry_is_data_encrypted(struct archive_entry *);
+ __LA_DECL int archive_entry_is_metadata_encrypted(struct archive_entry *);
+ __LA_DECL int archive_entry_is_encrypted(struct archive_entry *);
+@@ -317,25 +317,25 @@ __LA_DECL void archive_entry_set_fflags(
+ /* Note that all recognized tokens are processed, regardless. */
+ __LA_DECL const char *archive_entry_copy_fflags_text(struct archive_entry *,
+ const char *);
+-__LA_DECL const wchar_t *archive_entry_copy_fflags_text_w(struct archive_entry *,
+- const wchar_t *);
++__LA_DECL const char *archive_entry_copy_fflags_text_w(struct archive_entry *,
++ const char *);
+ __LA_DECL void archive_entry_set_gid(struct archive_entry *, la_int64_t);
+ __LA_DECL void archive_entry_set_gname(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_gname_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_copy_gname(struct archive_entry *, const char *);
+-__LA_DECL void archive_entry_copy_gname_w(struct archive_entry *, const wchar_t *);
++__LA_DECL void archive_entry_copy_gname_w(struct archive_entry *, const char *);
+ __LA_DECL int archive_entry_update_gname_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_hardlink(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_hardlink_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_copy_hardlink(struct archive_entry *, const char *);
+-__LA_DECL void archive_entry_copy_hardlink_w(struct archive_entry *, const wchar_t *);
++__LA_DECL void archive_entry_copy_hardlink_w(struct archive_entry *, const char *);
+ __LA_DECL int archive_entry_update_hardlink_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_ino(struct archive_entry *, la_int64_t);
+ __LA_DECL void archive_entry_set_ino64(struct archive_entry *, la_int64_t);
+ __LA_DECL void archive_entry_set_link(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_link_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_copy_link(struct archive_entry *, const char *);
+-__LA_DECL void archive_entry_copy_link_w(struct archive_entry *, const wchar_t *);
++__LA_DECL void archive_entry_copy_link_w(struct archive_entry *, const char *);
+ __LA_DECL int archive_entry_update_link_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_mode(struct archive_entry *, __LA_MODE_T);
+ __LA_DECL void archive_entry_set_mtime(struct archive_entry *, time_t, long);
+@@ -344,7 +344,7 @@ __LA_DECL void archive_entry_set_nlink(s
+ __LA_DECL void archive_entry_set_pathname(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_pathname_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_copy_pathname(struct archive_entry *, const char *);
+-__LA_DECL void archive_entry_copy_pathname_w(struct archive_entry *, const wchar_t *);
++__LA_DECL void archive_entry_copy_pathname_w(struct archive_entry *, const char *);
+ __LA_DECL int archive_entry_update_pathname_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_perm(struct archive_entry *, __LA_MODE_T);
+ __LA_DECL void archive_entry_set_rdev(struct archive_entry *, dev_t);
+@@ -353,18 +353,18 @@ __LA_DECL void archive_entry_set_rdevmin
+ __LA_DECL void archive_entry_set_size(struct archive_entry *, la_int64_t);
+ __LA_DECL void archive_entry_unset_size(struct archive_entry *);
+ __LA_DECL void archive_entry_copy_sourcepath(struct archive_entry *, const char *);
+-__LA_DECL void archive_entry_copy_sourcepath_w(struct archive_entry *, const wchar_t *);
++__LA_DECL void archive_entry_copy_sourcepath_w(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_symlink(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_symlink_type(struct archive_entry *, int);
+ __LA_DECL void archive_entry_set_symlink_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_copy_symlink(struct archive_entry *, const char *);
+-__LA_DECL void archive_entry_copy_symlink_w(struct archive_entry *, const wchar_t *);
++__LA_DECL void archive_entry_copy_symlink_w(struct archive_entry *, const char *);
+ __LA_DECL int archive_entry_update_symlink_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_uid(struct archive_entry *, la_int64_t);
+ __LA_DECL void archive_entry_set_uname(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_uname_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_copy_uname(struct archive_entry *, const char *);
+-__LA_DECL void archive_entry_copy_uname_w(struct archive_entry *, const wchar_t *);
++__LA_DECL void archive_entry_copy_uname_w(struct archive_entry *, const char *);
+ __LA_DECL int archive_entry_update_uname_utf8(struct archive_entry *, const char *);
+ __LA_DECL void archive_entry_set_is_data_encrypted(struct archive_entry *, char is_encrypted);
+ __LA_DECL void archive_entry_set_is_metadata_encrypted(struct archive_entry *, char is_encrypted);
+@@ -510,7 +510,7 @@ __LA_DECL int archive_entry_acl_add_ent
+ int /* qual */, const char * /* name */);
+ __LA_DECL int archive_entry_acl_add_entry_w(struct archive_entry *,
+ int /* type */, int /* permset */, int /* tag */,
+- int /* qual */, const wchar_t * /* name */);
++ int /* qual */, const char * /* name */);
+
+ /*
+ * To retrieve the ACL, first "reset", then repeatedly ask for the
+@@ -550,12 +550,12 @@ __LA_DECL int archive_entry_acl_next(st
+ #define ARCHIVE_ENTRY_ACL_STYLE_SEPARATOR_COMMA 0x00000008
+ #define ARCHIVE_ENTRY_ACL_STYLE_COMPACT 0x00000010
+
+-__LA_DECL wchar_t *archive_entry_acl_to_text_w(struct archive_entry *,
++__LA_DECL char *archive_entry_acl_to_text_w(struct archive_entry *,
+ la_ssize_t * /* len */, int /* flags */);
+ __LA_DECL char *archive_entry_acl_to_text(struct archive_entry *,
+ la_ssize_t * /* len */, int /* flags */);
+ __LA_DECL int archive_entry_acl_from_text_w(struct archive_entry *,
+- const wchar_t * /* wtext */, int /* type */);
++ const char * /* wtext */, int /* type */);
+ __LA_DECL int archive_entry_acl_from_text(struct archive_entry *,
+ const char * /* text */, int /* type */);
+
+@@ -564,7 +564,7 @@ __LA_DECL int archive_entry_acl_from_tex
+ #define OLD_ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT 2048
+
+ /* Deprecated functions */
+-__LA_DECL const wchar_t *archive_entry_acl_text_w(struct archive_entry *,
++__LA_DECL const char *archive_entry_acl_text_w(struct archive_entry *,
+ int /* flags */) __LA_DEPRECATED;
+ __LA_DECL const char *archive_entry_acl_text(struct archive_entry *,
+ int /* flags */) __LA_DEPRECATED;
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_entry_paths.3 b/Utilities/cmlibarchive/libarchive/archive_entry_paths.3
+--- a/Utilities/cmlibarchive/libarchive/archive_entry_paths.3 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_entry_paths.3 2021-02-11 18:43:34.415862139 +0330
+@@ -57,14 +57,14 @@ Streaming Archive Library (libarchive, -
+ .In archive_entry.h
+ .Ft const char *
+ .Fn archive_entry_hardlink "struct archive_entry *a"
+-.Ft const wchar_t *
++.Ft const char *
+ .Fn archive_entry_hardlink_w "struct archive_entry *a"
+ .Ft void
+ .Fn archive_entry_set_hardlink "struct archive_entry *a" "const char *path"
+ .Ft void
+ .Fn archive_entry_copy_hardlink "struct archive_entry *a" "const char *path"
+ .Ft void
+-.Fn archive_entry_copy_hardlink_w "struct archive_entry *a "const wchar_t *path"
++.Fn archive_entry_copy_hardlink_w "struct archive_entry *a "const char *path"
+ .Ft int
+ .Fn archive_entry_update_hardlink_utf8 "struct archive_entry *a" "const char *path"
+ .Ft void
+@@ -72,19 +72,19 @@ Streaming Archive Library (libarchive, -
+ .Ft void
+ .Fn archive_entry_copy_link "struct archive_entry *a" " const char *path"
+ .Ft void
+-.Fn archive_entry_copy_link_w "struct archive_entry *a" " const wchar_t *path"
++.Fn archive_entry_copy_link_w "struct archive_entry *a" " const char *path"
+ .Ft int
+ .Fn archive_entry_update_link_utf8 "struct archive_entry *a" " const char *path"
+ .Ft const char *
+ .Fn archive_entry_pathname "struct archive_entry *a"
+-.Ft const wchar_t *
++.Ft const char *
+ .Fn archive_entry_pathname_w "struct archive_entry *a"
+ .Ft void
+ .Fn archive_entry_set_pathname "struct archive_entry *a" "const char *path"
+ .Ft void
+ .Fn archive_entry_copy_pathname "struct archive_entry *a" "const char *path"
+ .Ft void
+-.Fn archive_entry_copy_pathname_w "struct archive_entry *a" "const wchar_t *path"
++.Fn archive_entry_copy_pathname_w "struct archive_entry *a" "const char *path"
+ .Ft int
+ .Fn archive_entry_update_pathname_utf8 "struct archive_entry *a" "const char *path"
+ .Ft const char *
+@@ -93,14 +93,14 @@ Streaming Archive Library (libarchive, -
+ .Fn archive_entry_copy_sourcepath "struct archive_entry *a" "const char *path"
+ .Ft const char *
+ .Fn archive_entry_symlink "struct archive_entry *a"
+-.Ft const wchar_t *
++.Ft const char *
+ .Fn archive_entry_symlink_w "struct archive_entry *a"
+ .Ft void
+ .Fn archive_entry_set_symlink "struct archive_entry *a" "const char *path"
+ .Ft void
+ .Fn archive_entry_copy_symlink "struct archive_entry *a" "const char *path"
+ .Ft void
+-.Fn archive_entry_copy_symlink_w "struct archive_entry *a" "const wchar_t *path"
++.Fn archive_entry_copy_symlink_w "struct archive_entry *a" "const char *path"
+ .Ft int
+ .Fn archive_entry_update_symlink_utf8 "struct archive_entry *a" "const char *path"
+ .Sh DESCRIPTION
+@@ -124,10 +124,10 @@ Destination of the symbolic link.
+ .El
+ .Pp
+ Path names can be provided in one of three different ways:
+-.Bl -tag -width "wchar_t *"
++.Bl -tag -width "char *"
+ .It char *
+ Multibyte strings in the current locale.
+-.It wchar_t *
++.It char *
+ Wide character strings in the current locale.
+ The accessor functions are named
+ .Fn XXX_w .
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_entry_perms.3 b/Utilities/cmlibarchive/libarchive/archive_entry_perms.3
+--- a/Utilities/cmlibarchive/libarchive/archive_entry_perms.3 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_entry_perms.3 2021-02-11 18:43:34.412528752 +0330
+@@ -72,26 +72,26 @@ Streaming Archive Library (libarchive, -
+ .Fn archive_entry_strmode "struct archive_entry *a"
+ .Ft const char *
+ .Fn archive_entry_gname "struct archive_entry *a"
+-.Ft const wchar_t *
++.Ft const char *
+ .Fn archive_entry_gname_w "struct archive_entry *a"
+ .Ft void
+ .Fn archive_entry_set_gname "struct archive_entry *a" "const char *a"
+ .Ft void
+ .Fn archive_entry_copy_gname "struct archive_entry *a" "const char *name"
+ .Ft void
+-.Fn archive_entry_copy_gname_w "struct archive_entry *a" "const wchar_t *name"
++.Fn archive_entry_copy_gname_w "struct archive_entry *a" "const char *name"
+ .Ft int
+ .Fn archive_entry_update_gname_utf8 "struct archive_entry *a" "const char *name"
+ .Ft const char *
+ .Fn archive_entry_uname "struct archive_entry *a"
+-.Ft const wchar_t *
++.Ft const char *
+ .Fn archive_entry_uname_w "struct archive_entry *a"
+ .Ft void
+ .Fn archive_entry_set_uname "struct archive_entry *a" "const char *name"
+ .Ft void
+ .Fn archive_entry_copy_uname "struct archive_entry *a" "const char *name"
+ .Ft void
+-.Fn archive_entry_copy_uname_w "struct archive_entry *a" "const wchar_t *name"
++.Fn archive_entry_copy_uname_w "struct archive_entry *a" "const char *name"
+ .Ft int
+ .Fn archive_entry_update_uname_utf8 "struct archive_entry *a" "const char *name"
+ .Ft void
+@@ -110,8 +110,8 @@ Streaming Archive Library (libarchive, -
+ .Fc
+ .Ft const char *
+ .Fn archive_entry_copy_fflags_text "struct archive_entry *a" "const char *text"
+-.Ft const wchar_t *
+-.Fn archive_entry_copy_fflags_text_w "struct archive_entry *a" "const wchar_t *text"
++.Ft const char *
++.Fn archive_entry_copy_fflags_text_w "struct archive_entry *a" "const char *text"
+ .Sh DESCRIPTION
+ .Ss User id, group id and mode
+ The functions
+@@ -134,10 +134,10 @@ returns a string representation of the p
+ .Xr ls 1 .
+ .Ss User and group name
+ User and group names can be provided in one of three different ways:
+-.Bl -tag -width "wchar_t *"
++.Bl -tag -width "char *"
+ .It char *
+ Multibyte strings in the current locale.
+-.It wchar_t *
++.It char *
+ Wide character strings in the current locale.
+ The accessor functions are named
+ .Fn XXX_w .
+diff -urp a/Utilities/cmlibarchive/libarchive/archive.h b/Utilities/cmlibarchive/libarchive/archive.h
+--- a/Utilities/cmlibarchive/libarchive/archive.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive.h 2021-02-11 18:43:34.382528279 +0330
+@@ -39,7 +39,7 @@
+ #define ARCHIVE_VERSION_NUMBER 3004002
+
+ #include <sys/stat.h>
+-#include <stddef.h> /* for wchar_t */
++#include <stddef.h> /* for char */
+ #include <stdio.h> /* For FILE * */
+ #include <time.h> /* For time_t */
+
+@@ -525,7 +525,7 @@ __LA_DECL int archive_read_open_filename
+ __LA_DECL int archive_read_open_filenames(struct archive *,
+ const char **_filenames, size_t _block_size);
+ __LA_DECL int archive_read_open_filename_w(struct archive *,
+- const wchar_t *_filename, size_t _block_size);
++ const char *_filename, size_t _block_size);
+ /* archive_read_open_file() is a deprecated synonym for ..._open_filename(). */
+ __LA_DECL int archive_read_open_file(struct archive *,
+ const char *_filename, size_t _block_size) __LA_DEPRECATED;
+@@ -820,7 +820,7 @@ __LA_DECL int archive_write_open(struct
+ __LA_DECL int archive_write_open_fd(struct archive *, int _fd);
+ __LA_DECL int archive_write_open_filename(struct archive *, const char *_file);
+ __LA_DECL int archive_write_open_filename_w(struct archive *,
+- const wchar_t *_file);
++ const char *_file);
+ /* A deprecated synonym for archive_write_open_filename() */
+ __LA_DECL int archive_write_open_file(struct archive *, const char *_file)
+ __LA_DEPRECATED;
+@@ -976,7 +976,7 @@ __LA_DECL int archive_read_disk_set_unam
+ void (* /* cleanup_fn */)(void *));
+ /* Start traversal. */
+ __LA_DECL int archive_read_disk_open(struct archive *, const char *);
+-__LA_DECL int archive_read_disk_open_w(struct archive *, const wchar_t *);
++__LA_DECL int archive_read_disk_open_w(struct archive *, const char *);
+ /*
+ * Request that current entry be visited. If you invoke it on every
+ * directory, you'll get a physical traversal. This is ignored if the
+@@ -1099,21 +1099,21 @@ __LA_DECL int archive_match_set_inclusio
+ /* Add exclusion pathname pattern. */
+ __LA_DECL int archive_match_exclude_pattern(struct archive *, const char *);
+ __LA_DECL int archive_match_exclude_pattern_w(struct archive *,
+- const wchar_t *);
++ const char *);
+ /* Add exclusion pathname pattern from file. */
+ __LA_DECL int archive_match_exclude_pattern_from_file(struct archive *,
+ const char *, int _nullSeparator);
+ __LA_DECL int archive_match_exclude_pattern_from_file_w(struct archive *,
+- const wchar_t *, int _nullSeparator);
++ const char *, int _nullSeparator);
+ /* Add inclusion pathname pattern. */
+ __LA_DECL int archive_match_include_pattern(struct archive *, const char *);
+ __LA_DECL int archive_match_include_pattern_w(struct archive *,
+- const wchar_t *);
++ const char *);
+ /* Add inclusion pathname pattern from file. */
+ __LA_DECL int archive_match_include_pattern_from_file(struct archive *,
+ const char *, int _nullSeparator);
+ __LA_DECL int archive_match_include_pattern_from_file_w(struct archive *,
+- const wchar_t *, int _nullSeparator);
++ const char *, int _nullSeparator);
+ /*
+ * How to get statistic information for inclusion patterns.
+ */
+@@ -1124,7 +1124,7 @@ __LA_DECL int archive_match_path_unmatch
+ __LA_DECL int archive_match_path_unmatched_inclusions_next(
+ struct archive *, const char **);
+ __LA_DECL int archive_match_path_unmatched_inclusions_next_w(
+- struct archive *, const wchar_t **);
++ struct archive *, const char **);
+
+ /*
+ * Test if a file is excluded by its time stamp.
+@@ -1154,12 +1154,12 @@ __LA_DECL int archive_match_include_time
+ __LA_DECL int archive_match_include_date(struct archive *, int _flag,
+ const char *_datestr);
+ __LA_DECL int archive_match_include_date_w(struct archive *, int _flag,
+- const wchar_t *_datestr);
++ const char *_datestr);
+ /* Set inclusion time by a particular file. */
+ __LA_DECL int archive_match_include_file_time(struct archive *,
+ int _flag, const char *_pathname);
+ __LA_DECL int archive_match_include_file_time_w(struct archive *,
+- int _flag, const wchar_t *_pathname);
++ int _flag, const char *_pathname);
+ /* Add exclusion entry. */
+ __LA_DECL int archive_match_exclude_entry(struct archive *,
+ int _flag, struct archive_entry *);
+@@ -1175,10 +1175,10 @@ __LA_DECL int archive_match_include_uid(
+ __LA_DECL int archive_match_include_gid(struct archive *, la_int64_t);
+ __LA_DECL int archive_match_include_uname(struct archive *, const char *);
+ __LA_DECL int archive_match_include_uname_w(struct archive *,
+- const wchar_t *);
++ const char *);
+ __LA_DECL int archive_match_include_gname(struct archive *, const char *);
+ __LA_DECL int archive_match_include_gname_w(struct archive *,
+- const wchar_t *);
++ const char *);
+
+ /* Utility functions */
+ /* Convenience function to sort a NULL terminated list of strings */
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_match.c b/Utilities/cmlibarchive/libarchive/archive_match.c
+--- a/Utilities/cmlibarchive/libarchive/archive_match.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_match.c 2021-02-11 18:43:34.449195998 +0330
+@@ -144,7 +144,7 @@ static int add_owner_name(struct archive
+ static int add_pattern_mbs(struct archive_match *, struct match_list *,
+ const char *);
+ static int add_pattern_wcs(struct archive_match *, struct match_list *,
+- const wchar_t *);
++ const char *);
+ static int cmp_key_mbs(const struct archive_rb_node *, const void *);
+ static int cmp_key_wcs(const struct archive_rb_node *, const void *);
+ static int cmp_node_mbs(const struct archive_rb_node *,
+@@ -166,7 +166,7 @@ static int match_owner_name_mbs(struct a
+ struct match_list *, const char *);
+ #else
+ static int match_owner_name_wcs(struct archive_match *,
+- struct match_list *, const wchar_t *);
++ struct match_list *, const char *);
+ #endif
+ static int match_path_exclusion(struct archive_match *,
+ struct match *, int, const void *);
+@@ -180,10 +180,10 @@ static int set_timefilter(struct archive
+ static int set_timefilter_pathname_mbs(struct archive_match *,
+ int, const char *);
+ static int set_timefilter_pathname_wcs(struct archive_match *,
+- int, const wchar_t *);
++ int, const char *);
+ static int set_timefilter_date(struct archive_match *, int, const char *);
+ static int set_timefilter_date_w(struct archive_match *, int,
+- const wchar_t *);
++ const char *);
+ static int time_excluded(struct archive_match *,
+ struct archive_entry *);
+ static int validate_time_flag(struct archive *, int, const char *);
+@@ -329,7 +329,7 @@ archive_match_exclude_pattern(struct arc
+ }
+
+ int
+-archive_match_exclude_pattern_w(struct archive *_a, const wchar_t *pattern)
++archive_match_exclude_pattern_w(struct archive *_a, const char *pattern)
+ {
+ struct archive_match *a;
+ int r;
+@@ -363,7 +363,7 @@ archive_match_exclude_pattern_from_file(
+
+ int
+ archive_match_exclude_pattern_from_file_w(struct archive *_a,
+- const wchar_t *pathname, int nullSeparator)
++ const char *pathname, int nullSeparator)
+ {
+ struct archive_match *a;
+
+@@ -395,7 +395,7 @@ archive_match_include_pattern(struct arc
+ }
+
+ int
+-archive_match_include_pattern_w(struct archive *_a, const wchar_t *pattern)
++archive_match_include_pattern_w(struct archive *_a, const char *pattern)
+ {
+ struct archive_match *a;
+ int r;
+@@ -429,7 +429,7 @@ archive_match_include_pattern_from_file(
+
+ int
+ archive_match_include_pattern_from_file_w(struct archive *_a,
+- const wchar_t *pathname, int nullSeparator)
++ const char *pathname, int nullSeparator)
+ {
+ struct archive_match *a;
+
+@@ -530,7 +530,7 @@ archive_match_path_unmatched_inclusions_
+
+ int
+ archive_match_path_unmatched_inclusions_next_w(struct archive *_a,
+- const wchar_t **_p)
++ const char **_p)
+ {
+ struct archive_match *a;
+ const void *v;
+@@ -541,7 +541,7 @@ archive_match_path_unmatched_inclusions_
+ a = (struct archive_match *)_a;
+
+ r = match_list_unmatched_inclusions_next(a, &(a->inclusions), 0, &v);
+- *_p = (const wchar_t *)v;
++ *_p = (const char *)v;
+ return (r);
+ }
+
+@@ -570,7 +570,7 @@ add_pattern_mbs(struct archive_match *a,
+
+ static int
+ add_pattern_wcs(struct archive_match *a, struct match_list *list,
+- const wchar_t *pattern)
++ const char *pattern)
+ {
+ struct match *match;
+ size_t len;
+@@ -788,10 +788,10 @@ match_path_exclusion(struct archive_matc
+ if (r == 0)
+ return (archive_pathmatch(p, (const char *)pn, flag));
+ } else {
+- const wchar_t *p;
++ const char *p;
+ r = archive_mstring_get_wcs(&(a->archive), &(m->pattern), &p);
+ if (r == 0)
+- return (archive_pathmatch_w(p, (const wchar_t *)pn,
++ return (archive_pathmatch_w(p, (const char *)pn,
+ flag));
+ }
+ if (errno == ENOMEM)
+@@ -819,10 +819,10 @@ match_path_inclusion(struct archive_matc
+ if (r == 0)
+ return (archive_pathmatch(p, (const char *)pn, flag));
+ } else {
+- const wchar_t *p;
++ const char *p;
+ r = archive_mstring_get_wcs(&(a->archive), &(m->pattern), &p);
+ if (r == 0)
+- return (archive_pathmatch_w(p, (const wchar_t *)pn,
++ return (archive_pathmatch_w(p, (const char *)pn,
+ flag));
+ }
+ if (errno == ENOMEM)
+@@ -892,13 +892,13 @@ match_list_unmatched_inclusions_next(str
+ p = "";
+ *vp = p;
+ } else {
+- const wchar_t *p;
++ const char *p;
+ r = archive_mstring_get_wcs(&(a->archive),
+ &(m->pattern), &p);
+ if (r < 0 && errno == ENOMEM)
+ return (error_nomem(a));
+ if (p == NULL)
+- p = L"";
++ p = "";
+ *vp = p;
+ }
+ list->unmatched_next = m->next;
+@@ -941,7 +941,7 @@ archive_match_include_date(struct archiv
+
+ int
+ archive_match_include_date_w(struct archive *_a, int flag,
+- const wchar_t *datestr)
++ const char *datestr)
+ {
+ int r;
+
+@@ -967,7 +967,7 @@ archive_match_include_file_time(struct a
+
+ int
+ archive_match_include_file_time_w(struct archive *_a, int flag,
+- const wchar_t *pathname)
++ const char *pathname)
+ {
+ int r;
+
+@@ -1117,7 +1117,7 @@ set_timefilter_date(struct archive_match
+
+ static int
+ set_timefilter_date_w(struct archive_match *a, int timetype,
+- const wchar_t *datestr)
++ const char *datestr)
+ {
+ struct archive_string as;
+ time_t t;
+@@ -1207,7 +1207,7 @@ set_timefilter_pathname_mbs(struct archi
+
+ static int
+ set_timefilter_pathname_wcs(struct archive_match *a, int timetype,
+- const wchar_t *path)
++ const char *path)
+ {
+ HANDLE h;
+ WIN32_FIND_DATAW d;
+@@ -1270,7 +1270,7 @@ set_timefilter_pathname_mbs(struct archi
+
+ static int
+ set_timefilter_pathname_wcs(struct archive_match *a, int timetype,
+- const wchar_t *path)
++ const char *path)
+ {
+ struct archive_string as;
+ int r;
+@@ -1336,7 +1336,7 @@ cmp_node_wcs(const struct archive_rb_nod
+ {
+ struct match_file *f1 = (struct match_file *)(uintptr_t)n1;
+ struct match_file *f2 = (struct match_file *)(uintptr_t)n2;
+- const wchar_t *p1, *p2;
++ const char *p1, *p2;
+
+ archive_mstring_get_wcs(NULL, &(f1->pathname), &p1);
+ archive_mstring_get_wcs(NULL, &(f2->pathname), &p2);
+@@ -1351,12 +1351,12 @@ static int
+ cmp_key_wcs(const struct archive_rb_node *n, const void *key)
+ {
+ struct match_file *f = (struct match_file *)(uintptr_t)n;
+- const wchar_t *p;
++ const char *p;
+
+ archive_mstring_get_wcs(NULL, &(f->pathname), &p);
+ if (p == NULL)
+ return (-1);
+- return (wcscmp(p, (const wchar_t *)key));
++ return (wcscmp(p, (const char *)key));
+ }
+
+ static void
+@@ -1644,7 +1644,7 @@ archive_match_include_uname(struct archi
+ }
+
+ int
+-archive_match_include_uname_w(struct archive *_a, const wchar_t *uname)
++archive_match_include_uname_w(struct archive *_a, const char *uname)
+ {
+ struct archive_match *a;
+
+@@ -1666,7 +1666,7 @@ archive_match_include_gname(struct archi
+ }
+
+ int
+-archive_match_include_gname_w(struct archive *_a, const wchar_t *gname)
++archive_match_include_gname_w(struct archive *_a, const char *gname)
+ {
+ struct archive_match *a;
+
+@@ -1803,10 +1803,10 @@ match_owner_name_mbs(struct archive_matc
+ #else
+ static int
+ match_owner_name_wcs(struct archive_match *a, struct match_list *list,
+- const wchar_t *name)
++ const char *name)
+ {
+ struct match *m;
+- const wchar_t *p;
++ const char *p;
+
+ if (name == NULL || *name == L'\0')
+ return (0);
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_pathmatch.c b/Utilities/cmlibarchive/libarchive/archive_pathmatch.c
+--- a/Utilities/cmlibarchive/libarchive/archive_pathmatch.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_pathmatch.c 2021-02-11 18:43:34.425862296 +0330
+@@ -100,10 +100,10 @@ pm_list(const char *start, const char *e
+ }
+
+ static int
+-pm_list_w(const wchar_t *start, const wchar_t *end, const wchar_t c, int flags)
++pm_list_w(const char *start, const char *end, const char c, int flags)
+ {
+- const wchar_t *p = start;
+- wchar_t rangeStart = L'\0', nextRangeStart;
++ const char *p = start;
++ char rangeStart = L'\0', nextRangeStart;
+ int match = 1, nomatch = 0;
+
+ /* This will be used soon... */
+@@ -125,7 +125,7 @@ pm_list_w(const wchar_t *start, const wc
+ if (*p == c)
+ return (match);
+ } else {
+- wchar_t rangeEnd = *++p;
++ char rangeEnd = *++p;
+ if (rangeEnd == L'\\')
+ rangeEnd = *++p;
+ if ((rangeStart <= c) && (c <= rangeEnd))
+@@ -158,8 +158,8 @@ pm_slashskip(const char *s) {
+ return (s);
+ }
+
+-static const wchar_t *
+-pm_slashskip_w(const wchar_t *s) {
++static const char *
++pm_slashskip_w(const char *s) {
+ while ((*s == L'/')
+ || (s[0] == L'.' && s[1] == L'/')
+ || (s[0] == L'.' && s[1] == L'\0'))
+@@ -273,9 +273,9 @@ pm(const char *p, const char *s, int fla
+ }
+
+ static int
+-pm_w(const wchar_t *p, const wchar_t *s, int flags)
++pm_w(const char *p, const char *s, int flags)
+ {
+- const wchar_t *end;
++ const char *end;
+
+ /*
+ * Ignore leading './', './/', '././', etc.
+@@ -419,7 +419,7 @@ __archive_pathmatch(const char *p, const
+ }
+
+ int
+-__archive_pathmatch_w(const wchar_t *p, const wchar_t *s, int flags)
++__archive_pathmatch_w(const char *p, const char *s, int flags)
+ {
+ /* Empty pattern only matches the empty string. */
+ if (p == NULL || *p == L'\0')
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_pathmatch.h b/Utilities/cmlibarchive/libarchive/archive_pathmatch.h
+--- a/Utilities/cmlibarchive/libarchive/archive_pathmatch.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_pathmatch.h 2021-02-11 18:43:34.392528437 +0330
+@@ -44,7 +44,7 @@
+ * flag above. */
+
+ int __archive_pathmatch(const char *p, const char *s, int flags);
+-int __archive_pathmatch_w(const wchar_t *p, const wchar_t *s, int flags);
++int __archive_pathmatch_w(const char *p, const char *s, int flags);
+
+ #define archive_pathmatch(p, s, f) __archive_pathmatch(p, s, f)
+ #define archive_pathmatch_w(p, s, f) __archive_pathmatch_w(p, s, f)
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_private.h b/Utilities/cmlibarchive/libarchive/archive_private.h
+--- a/Utilities/cmlibarchive/libarchive/archive_private.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_private.h 2021-02-11 18:43:34.379194894 +0330
+@@ -154,7 +154,7 @@ void __archive_errx(int retvalue, const
+ void __archive_ensure_cloexec_flag(int fd);
+ int __archive_mktemp(const char *tmpdir);
+ #if defined(_WIN32) && !defined(__CYGWIN__)
+-int __archive_mkstemp(wchar_t *template);
++int __archive_mkstemp(char *template);
+ #else
+ int __archive_mkstemp(char *template);
+ #endif
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c b/Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c
+--- a/Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c 2021-02-12 14:39:59.857852509 +0330
+@@ -1333,7 +1333,7 @@ archive_read_disk_open(struct archive *_
+ }
+
+ int
+-archive_read_disk_open_w(struct archive *_a, const wchar_t *pathname)
++archive_read_disk_open_w(struct archive *_a, const char *pathname)
+ {
+ struct archive_read_disk *a = (struct archive_read_disk *)_a;
+ struct archive_string path;
+@@ -1344,7 +1344,7 @@ archive_read_disk_open_w(struct archive
+ "archive_read_disk_open_w");
+ archive_clear_error(&a->archive);
+
+- /* Make a char string from a wchar_t string. */
++ /* Make a char string from a char string. */
+ archive_string_init(&path);
+ if (archive_string_append_from_wcs(&path, pathname,
+ wcslen(pathname)) != 0) {
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_read_disk_windows.c b/Utilities/cmlibarchive/libarchive/archive_read_disk_windows.c
+--- a/Utilities/cmlibarchive/libarchive/archive_read_disk_windows.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_read_disk_windows.c 2021-02-11 18:43:34.362527965 +0330
+@@ -72,7 +72,7 @@ __FBSDID("$FreeBSD$");
+ */
+
+ struct restore_time {
+- const wchar_t *full_path;
++ const char *full_path;
+ FILETIME lastWriteTime;
+ FILETIME lastAccessTime;
+ mode_t filetype;
+@@ -142,7 +142,7 @@ struct tree {
+ struct archive_wstring path;
+
+ /* Last path element */
+- const wchar_t *basename;
++ const char *basename;
+ /* Leading dir length */
+ size_t dirname_length;
+
+@@ -207,14 +207,14 @@ struct tree {
+ #define needsRestoreTimes 128
+
+ static int
+-tree_dir_next_windows(struct tree *t, const wchar_t *pattern);
++tree_dir_next_windows(struct tree *t, const char *pattern);
+
+ /* Initiate/terminate a tree traversal. */
+-static struct tree *tree_open(const wchar_t *, int, int);
+-static struct tree *tree_reopen(struct tree *, const wchar_t *, int);
++static struct tree *tree_open(const char *, int, int);
++static struct tree *tree_reopen(struct tree *, const char *, int);
+ static void tree_close(struct tree *);
+ static void tree_free(struct tree *);
+-static void tree_push(struct tree *, const wchar_t *, const wchar_t *,
++static void tree_push(struct tree *, const char *, const char *,
+ int, int64_t, int64_t, struct restore_time *);
+
+ /*
+@@ -254,8 +254,8 @@ static int tree_next(struct tree *);
+ * current path.
+ *
+ */
+-static const wchar_t *tree_current_path(struct tree *);
+-static const wchar_t *tree_current_access_path(struct tree *);
++static const char *tree_current_path(struct tree *);
++static const char *tree_current_access_path(struct tree *);
+
+ /*
+ * Request the lstat() or stat() data for the current path. Since the
+@@ -283,7 +283,7 @@ static int setup_current_filesystem(stru
+ static int tree_target_is_same_as_parent(struct tree *,
+ const BY_HANDLE_FILE_INFORMATION *);
+
+-static int _archive_read_disk_open_w(struct archive *, const wchar_t *);
++static int _archive_read_disk_open_w(struct archive *, const char *);
+ static int _archive_read_free(struct archive *);
+ static int _archive_read_close(struct archive *);
+ static int _archive_read_data_block(struct archive *,
+@@ -299,10 +299,10 @@ static int close_and_restore_time(HANDLE
+ struct restore_time *);
+ static int setup_sparse_from_disk(struct archive_read_disk *,
+ struct archive_entry *, HANDLE);
+-static int la_linkname_from_handle(HANDLE, wchar_t **, int *);
+-static int la_linkname_from_pathw(const wchar_t *, wchar_t **, int *);
++static int la_linkname_from_handle(HANDLE, char **, int *);
++static int la_linkname_from_pathw(const char *, char **, int *);
+ static void entry_symlink_from_pathw(struct archive_entry *,
+- const wchar_t *path);
++ const char *path);
+
+ typedef struct _REPARSE_DATA_BUFFER {
+ ULONG ReparseTag;
+@@ -337,7 +337,7 @@ typedef struct _REPARSE_DATA_BUFFER {
+ * outbuf is allocated in the function
+ */
+ static int
+-la_linkname_from_handle(HANDLE h, wchar_t **linkname, int *linktype)
++la_linkname_from_handle(HANDLE h, char **linkname, int *linktype)
+ {
+ DWORD inbytes;
+ REPARSE_DATA_BUFFER *buf;
+@@ -345,7 +345,7 @@ la_linkname_from_handle(HANDLE h, wchar_
+ size_t len;
+ BOOL ret;
+ BYTE *indata;
+- wchar_t *tbuf;
++ char *tbuf;
+
+ ret = GetFileInformationByHandle(h, &st);
+ if (ret == 0 ||
+@@ -376,7 +376,7 @@ la_linkname_from_handle(HANDLE h, wchar_
+ return (-1);
+ }
+
+- tbuf = malloc(len + 1 * sizeof(wchar_t));
++ tbuf = malloc(len + 1 * sizeof(char));
+ if (tbuf == NULL) {
+ free(indata);
+ return (-1);
+@@ -386,7 +386,7 @@ la_linkname_from_handle(HANDLE h, wchar_
+ [buf->SymbolicLinkReparseBuffer.SubstituteNameOffset], len);
+ free(indata);
+
+- tbuf[len / sizeof(wchar_t)] = L'\0';
++ tbuf[len / sizeof(char)] = L'\0';
+
+ *linkname = tbuf;
+
+@@ -411,7 +411,7 @@ la_linkname_from_handle(HANDLE h, wchar_
+ * Returns AE_SYMLINK_TYPE_FILE, AE_SYMLINK_TYPE_DIRECTORY or -1 on error
+ */
+ static int
+-la_linkname_from_pathw(const wchar_t *path, wchar_t **outbuf, int *linktype)
++la_linkname_from_pathw(const char *path, char **outbuf, int *linktype)
+ {
+ HANDLE h;
+ const DWORD flag = FILE_FLAG_BACKUP_SEMANTICS |
+@@ -432,9 +432,9 @@ la_linkname_from_pathw(const wchar_t *pa
+ }
+
+ static void
+-entry_symlink_from_pathw(struct archive_entry *entry, const wchar_t *path)
++entry_symlink_from_pathw(struct archive_entry *entry, const char *path)
+ {
+- wchar_t *linkname = NULL;
++ char *linkname = NULL;
+ int ret, linktype;
+
+ ret = la_linkname_from_pathw(path, &linkname, &linktype);
+@@ -1332,7 +1332,7 @@ archive_read_disk_open(struct archive *_
+ "archive_read_disk_open");
+ archive_clear_error(&a->archive);
+
+- /* Make a wchar_t string from a char string. */
++ /* Make a char string from a char string. */
+ archive_string_init(&wpath);
+ if (archive_wstring_append_from_mbs(&wpath, pathname,
+ strlen(pathname)) != 0) {
+@@ -1341,7 +1341,7 @@ archive_read_disk_open(struct archive *_
+ "Can't allocate memory");
+ else
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+- "Can't convert a path to a wchar_t string");
++ "Can't convert a path to a char string");
+ a->archive.state = ARCHIVE_STATE_FATAL;
+ ret = ARCHIVE_FATAL;
+ } else
+@@ -1352,7 +1352,7 @@ archive_read_disk_open(struct archive *_
+ }
+
+ int
+-archive_read_disk_open_w(struct archive *_a, const wchar_t *pathname)
++archive_read_disk_open_w(struct archive *_a, const char *pathname)
+ {
+ struct archive_read_disk *a = (struct archive_read_disk *)_a;
+
+@@ -1365,7 +1365,7 @@ archive_read_disk_open_w(struct archive
+ }
+
+ static int
+-_archive_read_disk_open_w(struct archive *_a, const wchar_t *pathname)
++_archive_read_disk_open_w(struct archive *_a, const char *pathname)
+ {
+ struct archive_read_disk *a = (struct archive_read_disk *)_a;
+
+@@ -1480,11 +1480,11 @@ archive_read_disk_current_filesystem_is_
+ * If symlink is broken, statfs or statvfs will fail.
+ * Use its directory path instead.
+ */
+-static wchar_t *
++static char *
+ safe_path_for_statfs(struct tree *t)
+ {
+- const wchar_t *path;
+- wchar_t *cp, *p = NULL;
++ const char *path;
++ char *cp, *p = NULL;
+
+ path = tree_current_access_path(t);
+ if (tree_current_stat(t) == NULL) {
+@@ -1507,8 +1507,8 @@ static int
+ setup_current_filesystem(struct archive_read_disk *a)
+ {
+ struct tree *t = a->tree;
+- wchar_t vol[256];
+- wchar_t *path;
++ char vol[256];
++ char *path;
+
+ t->current_filesystem->synthetic = -1;/* Not supported */
+ path = safe_path_for_statfs(t);
+@@ -1584,7 +1584,7 @@ close_and_restore_time(HANDLE h, struct
+ * Add a directory path to the current stack.
+ */
+ static void
+-tree_push(struct tree *t, const wchar_t *path, const wchar_t *full_path,
++tree_push(struct tree *t, const char *path, const char *full_path,
+ int filesystem_id, int64_t dev, int64_t ino, struct restore_time *rt)
+ {
+ struct tree_entry *te;
+@@ -1617,7 +1617,7 @@ tree_push(struct tree *t, const wchar_t
+ * Append a name to the current dir path.
+ */
+ static void
+-tree_append(struct tree *t, const wchar_t *name, size_t name_length)
++tree_append(struct tree *t, const char *name, size_t name_length)
+ {
+ size_t size_needed;
+
+@@ -1654,7 +1654,7 @@ tree_append(struct tree *t, const wchar_
+ * Open a directory tree for traversal.
+ */
+ static struct tree *
+-tree_open(const wchar_t *path, int symlink_mode, int restore_time)
++tree_open(const char *path, int symlink_mode, int restore_time)
+ {
+ struct tree *t;
+
+@@ -1667,10 +1667,10 @@ tree_open(const wchar_t *path, int symli
+ }
+
+ static struct tree *
+-tree_reopen(struct tree *t, const wchar_t *path, int restore_time)
++tree_reopen(struct tree *t, const char *path, int restore_time)
+ {
+ struct archive_wstring ws;
+- wchar_t *pathname, *p, *base;
++ char *pathname, *p, *base;
+
+ t->flags = (restore_time != 0)?needsRestoreTimes:0;
+ t->visit_type = 0;
+@@ -1689,7 +1689,7 @@ tree_reopen(struct tree *t, const wchar_
+ t->entry_remaining_bytes = 0;
+ t->initial_filesystem_id = -1;
+
+- /* Get wchar_t strings from char strings. */
++ /* Get char strings from char strings. */
+ archive_string_init(&ws);
+ archive_wstrcpy(&ws, path);
+ pathname = ws.s;
+@@ -1834,7 +1834,7 @@ tree_next(struct tree *t)
+ }
+
+ if (t->stack->flags & needsFirstVisit) {
+- wchar_t *d = t->stack->name.s;
++ char *d = t->stack->name.s;
+ t->stack->flags &= ~needsFirstVisit;
+ if (!(d[0] == L'/' && d[1] == L'/' &&
+ d[2] == L'?' && d[3] == L'/') &&
+@@ -1877,7 +1877,7 @@ tree_next(struct tree *t)
+ return (t->visit_type);
+ } else if (t->stack->flags & needsOpen) {
+ t->stack->flags &= ~needsOpen;
+- r = tree_dir_next_windows(t, L"*");
++ r = tree_dir_next_windows(t, "*");
+ if (r == 0)
+ continue;
+ return (r);
+@@ -1898,9 +1898,9 @@ tree_next(struct tree *t)
+ }
+
+ static int
+-tree_dir_next_windows(struct tree *t, const wchar_t *pattern)
++tree_dir_next_windows(struct tree *t, const char *pattern)
+ {
+- const wchar_t *name;
++ const char *name;
+ size_t namelen;
+ int r;
+
+@@ -1967,7 +1967,7 @@ fileTimeToUtc(const FILETIME *filetime,
+ }
+
+ static void
+-entry_copy_bhfi(struct archive_entry *entry, const wchar_t *path,
++entry_copy_bhfi(struct archive_entry *entry, const char *path,
+ const WIN32_FIND_DATAW *findData,
+ const BY_HANDLE_FILE_INFORMATION *bhfi)
+ {
+@@ -2006,7 +2006,7 @@ entry_copy_bhfi(struct archive_entry *en
+ } else if (bhfi->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
+ else {
+- const wchar_t *p;
++ const char *p;
+
+ mode |= S_IFREG;
+ p = wcsrchr(path, L'.');
+@@ -2152,7 +2152,7 @@ tree_target_is_same_as_parent(struct tre
+ /*
+ * Return the access path for the entry just returned from tree_next().
+ */
+-static const wchar_t *
++static const char *
+ tree_current_access_path(struct tree *t)
+ {
+ return (t->full_path.s);
+@@ -2161,7 +2161,7 @@ tree_current_access_path(struct tree *t)
+ /*
+ * Return the full path for the entry just returned from tree_next().
+ */
+-static const wchar_t *
++static const char *
+ tree_current_path(struct tree *t)
+ {
+ return (t->path.s);
+@@ -2223,8 +2223,8 @@ archive_read_disk_entry_from_file(struct
+ struct archive_entry *entry, int fd, const struct stat *st)
+ {
+ struct archive_read_disk *a = (struct archive_read_disk *)_a;
+- const wchar_t *path;
+- const wchar_t *wname;
++ const char *path;
++ const char *wname;
+ const char *name;
+ HANDLE h;
+ BY_HANDLE_FILE_INFORMATION bhfi;
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_read_open_filename.c b/Utilities/cmlibarchive/libarchive/archive_read_open_filename.c
+--- a/Utilities/cmlibarchive/libarchive/archive_read_open_filename.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_read_open_filename.c 2021-02-11 18:43:34.452529383 +0330
+@@ -79,7 +79,7 @@ struct read_file_data {
+ enum fnt_e { FNT_STDIN, FNT_MBS, FNT_WCS } filename_type;
+ union {
+ char m[1];/* MBS filename. */
+- wchar_t w[1];/* WCS filename. */
++ char w[1];/* WCS filename. */
+ } filename; /* Must be last! */
+ };
+
+@@ -156,11 +156,11 @@ no_memory:
+ }
+
+ int
+-archive_read_open_filename_w(struct archive *a, const wchar_t *wfilename,
++archive_read_open_filename_w(struct archive *a, const char *wfilename,
+ size_t block_size)
+ {
+ struct read_file_data *mine = (struct read_file_data *)calloc(1,
+- sizeof(*mine) + wcslen(wfilename) * sizeof(wchar_t));
++ sizeof(*mine) + wcslen(wfilename) * sizeof(char));
+ if (!mine)
+ {
+ archive_set_error(a, ENOMEM, "No memory");
+@@ -177,8 +177,8 @@ archive_read_open_filename_w(struct arch
+ wcscpy(mine->filename.w, wfilename);
+ #else
+ /*
+- * POSIX system does not support a wchar_t interface for
+- * open() system call, so we have to translate a wchar_t
++ * POSIX system does not support a char interface for
++ * open() system call, so we have to translate a char
+ * filename to multi-byte one and use it.
+ */
+ struct archive_string fn;
+@@ -221,7 +221,7 @@ file_open(struct archive *a, void *clien
+ struct read_file_data *mine = (struct read_file_data *)client_data;
+ void *buffer;
+ const char *filename = NULL;
+- const wchar_t *wfilename = NULL;
++ const char *wfilename = NULL;
+ int fd = -1;
+ int is_disk_like = 0;
+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+@@ -262,7 +262,7 @@ file_open(struct archive *a, void *clien
+ wfilename = mine->filename.w;
+ fd = _wopen(wfilename, O_RDONLY | O_BINARY);
+ if (fd < 0 && errno == ENOENT) {
+- wchar_t *fullpath;
++ char *fullpath;
+ fullpath = __la_win_permissive_name_w(wfilename);
+ if (fullpath != NULL) {
+ fd = _wopen(fullpath, O_RDONLY | O_BINARY);
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_read_support_format_7zip.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_7zip.c
+--- a/Utilities/cmlibarchive/libarchive/archive_read_support_format_7zip.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_7zip.c 2021-02-11 18:43:34.365861350 +0330
+@@ -184,7 +184,7 @@ struct _7zip_entry {
+ size_t name_len;
+ unsigned char *utf16name;
+ #if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG)
+- const wchar_t *wname;
++ const char *wname;
+ #endif
+ uint32_t folderIndex;
+ uint32_t ssIndex;
+@@ -2514,7 +2514,7 @@ read_Header(struct archive_read *a, stru
+ for (i = 0; i < zip->numFiles; i++) {
+ entries[i].utf16name = np;
+ #if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG)
+- entries[i].wname = (wchar_t *)np;
++ entries[i].wname = (char *)np;
+ #endif
+
+ /* Find a terminator. */
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_read_support_format_cab.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_cab.c
+--- a/Utilities/cmlibarchive/libarchive/archive_read_support_format_cab.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_cab.c 2021-02-11 18:43:34.445862611 +0330
+@@ -596,7 +596,7 @@ cab_convert_path_separator_1(struct arch
+ static void
+ cab_convert_path_separator_2(struct cab *cab, struct archive_entry *entry)
+ {
+- const wchar_t *wp;
++ const char *wp;
+ size_t i;
+
+ /* If a conversion to wide character failed, force the replacement. */
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_read_support_format_lha.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_lha.c
+--- a/Utilities/cmlibarchive/libarchive/archive_read_support_format_lha.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_lha.c 2021-02-11 18:43:34.455862768 +0330
+@@ -482,7 +482,7 @@ archive_read_format_lha_read_header(stru
+ const char *signature;
+ int err;
+ struct archive_mstring conv_buffer;
+- const wchar_t *conv_buffer_p;
++ const char *conv_buffer_p;
+
+ lha_crc16_init();
+
+@@ -753,7 +753,7 @@ archive_read_format_lha_read_header(stru
+ static void
+ lha_replace_path_separator(struct lha *lha, struct archive_entry *entry)
+ {
+- const wchar_t *wp;
++ const char *wp;
+ size_t i;
+
+ if ((wp = archive_entry_pathname_w(entry)) != NULL) {
+@@ -1695,7 +1695,7 @@ static int
+ lha_parse_linkname(struct archive_wstring *linkname,
+ struct archive_wstring *pathname)
+ {
+- wchar_t * linkptr;
++ char * linkptr;
+ size_t symlen;
+
+ linkptr = wcschr(pathname->s, L'|');
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c
+--- a/Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c 2021-02-11 18:43:34.399195209 +0330
+@@ -511,7 +511,7 @@ archive_read_format_tar_read_header(stru
+ static int default_dev;
+ struct tar *tar;
+ const char *p;
+- const wchar_t *wp;
++ const char *wp;
+ int r;
+ size_t l, unconsumed = 0;
+
+@@ -1398,7 +1398,7 @@ read_mac_metadata_blob(struct archive_re
+ int64_t size;
+ const void *data;
+ const char *p, *name;
+- const wchar_t *wp, *wname;
++ const char *wp, *wname;
+
+ (void)h; /* UNUSED */
+
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c
+--- a/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c 2021-02-11 18:43:34.375861508 +0330
+@@ -908,7 +908,7 @@ zip_read_local_file_header(struct archiv
+ {
+ const char *p;
+ const void *h;
+- const wchar_t *wp;
++ const char *wp;
+ const char *cp;
+ size_t len, filename_length, extra_length;
+ struct archive_string_conv *sconv;
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_string.c b/Utilities/cmlibarchive/libarchive/archive_string.c
+--- a/Utilities/cmlibarchive/libarchive/archive_string.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_string.c 2021-02-11 18:43:34.372528122 +0330
+@@ -68,11 +68,11 @@ __FBSDID("$FreeBSD: head/lib/libarchive/
+ #include "archive_string_composition.h"
+
+ #if !defined(HAVE_WMEMCPY) && !defined(wmemcpy)
+-#define wmemcpy(a,b,i) (wchar_t *)memcpy((a), (b), (i) * sizeof(wchar_t))
++#define wmemcpy(a,b,i) (char *)memcpy((a), (b), (i) * sizeof(char))
+ #endif
+
+ #if !defined(HAVE_WMEMMOVE) && !defined(wmemmove)
+-#define wmemmove(a,b,i) (wchar_t *)memmove((a), (b), (i) * sizeof(wchar_t))
++#define wmemmove(a,b,i) (char *)memmove((a), (b), (i) * sizeof(char))
+ #endif
+
+ #undef max
+@@ -154,7 +154,7 @@ static int archive_wstring_append_from_m
+ struct archive_wstring *, const char *, size_t,
+ struct archive_string_conv *);
+ static int archive_string_append_from_wcs_in_codepage(struct archive_string *,
+- const wchar_t *, size_t, struct archive_string_conv *);
++ const char *, size_t, struct archive_string_conv *);
+ static int is_big_endian(void);
+ static int strncat_in_codepage(struct archive_string *, const void *,
+ size_t, struct archive_string_conv *);
+@@ -213,7 +213,7 @@ archive_string_append(struct archive_str
+ }
+
+ static struct archive_wstring *
+-archive_wstring_append(struct archive_wstring *as, const wchar_t *p, size_t s)
++archive_wstring_append(struct archive_wstring *as, const char *p, size_t s)
+ {
+ if (archive_wstring_ensure(as, as->length + s + 1) == NULL)
+ return (NULL);
+@@ -268,7 +268,7 @@ archive_wstring_ensure(struct archive_ws
+ {
+ return (struct archive_wstring *)
+ archive_string_ensure((struct archive_string *)as,
+- s * sizeof(wchar_t));
++ s * sizeof(char));
+ }
+
+ /* Returns NULL on any allocation failure. */
+@@ -355,10 +355,10 @@ archive_strncat(struct archive_string *a
+ }
+
+ struct archive_wstring *
+-archive_wstrncat(struct archive_wstring *as, const wchar_t *p, size_t n)
++archive_wstrncat(struct archive_wstring *as, const char *p, size_t n)
+ {
+ size_t s;
+- const wchar_t *pp;
++ const char *pp;
+
+ /* Like strlen(p), except won't examine positions beyond p[n]. */
+ s = 0;
+@@ -385,7 +385,7 @@ archive_strcat(struct archive_string *as
+ }
+
+ struct archive_wstring *
+-archive_wstrcat(struct archive_wstring *as, const wchar_t *p)
++archive_wstrcat(struct archive_wstring *as, const char *p)
+ {
+ /* Ditto. */
+ return archive_wstrncat(as, p, 0x1000000);
+@@ -400,7 +400,7 @@ archive_strappend_char(struct archive_st
+ }
+
+ struct archive_wstring *
+-archive_wstrappend_wchar(struct archive_wstring *as, wchar_t c)
++archive_wstrappend_wchar(struct archive_wstring *as, char c)
+ {
+ if ((as = archive_wstring_append(as, &c, 1)) == NULL)
+ __archive_errx(1, "Out of memory");
+@@ -463,7 +463,7 @@ archive_wstring_append_from_mbs_in_codep
+ /*
+ * "C" locale special processing.
+ */
+- wchar_t *ws;
++ char *ws;
+ const unsigned char *mp;
+
+ if (NULL == archive_wstring_ensure(dest,
+@@ -474,14 +474,14 @@ archive_wstring_append_from_mbs_in_codep
+ mp = (const unsigned char *)s;
+ count = 0;
+ while (count < (int)length && *mp) {
+- *ws++ = (wchar_t)*mp++;
++ *ws++ = (char)*mp++;
+ count++;
+ }
+ } else if (sc != NULL &&
+ (sc->flag & (SCONV_NORMALIZATION_C | SCONV_NORMALIZATION_D))) {
+ /*
+ * Normalize UTF-8 and UTF-16BE and convert it directly
+- * to UTF-16 as wchar_t.
++ * to UTF-16 as char.
+ */
+ struct archive_string u16;
+ int saved_flag = sc->flag;/* save current flag. */
+@@ -511,7 +511,7 @@ archive_wstring_append_from_mbs_in_codep
+ ret = archive_string_normalize_C(&u16, s, count, sc);
+ else
+ ret = archive_string_normalize_D(&u16, s, count, sc);
+- dest->s = (wchar_t *)u16.s;
++ dest->s = (char *)u16.s;
+ dest->length = u16.length >> 1;
+ dest->buffer_length = u16.buffer_length;
+ sc->flag = saved_flag;/* restore the saved flag. */
+@@ -523,7 +523,7 @@ archive_wstring_append_from_mbs_in_codep
+ if (NULL == archive_wstring_ensure(dest,
+ dest->length + count + 1))
+ return (-1);
+- wmemcpy(dest->s + dest->length, (const wchar_t *)s, count);
++ wmemcpy(dest->s + dest->length, (const char *)s, count);
+ if ((sc->flag & SCONV_FROM_UTF16BE) && !is_big_endian()) {
+ uint16_t *u16 = (uint16_t *)(dest->s + dest->length);
+ int b;
+@@ -597,7 +597,7 @@ archive_wstring_append_from_mbs(struct a
+ // size_t wcs_length = len;
+ size_t mbs_length = len;
+ const char *mbs = p;
+- wchar_t *wcs;
++ char *wcs;
+ #if HAVE_MBRTOWC
+ mbstate_t shift_state;
+
+@@ -668,14 +668,14 @@ archive_wstring_append_from_mbs(struct a
+ */
+ int
+ archive_string_append_from_wcs(struct archive_string *as,
+- const wchar_t *w, size_t len)
++ const char *w, size_t len)
+ {
+ return archive_string_append_from_wcs_in_codepage(as, w, len, NULL);
+ }
+
+ static int
+ archive_string_append_from_wcs_in_codepage(struct archive_string *as,
+- const wchar_t *ws, size_t len, struct archive_string_conv *sc)
++ const char *ws, size_t len, struct archive_string_conv *sc)
+ {
+ BOOL defchar_used, *dp;
+ int count, ret = 0;
+@@ -691,7 +691,7 @@ archive_string_append_from_wcs_in_codepa
+ /*
+ * "C" locale special processing.
+ */
+- const wchar_t *wp = ws;
++ const char *wp = ws;
+ char *p;
+
+ if (NULL == archive_string_ensure(as,
+@@ -773,7 +773,7 @@ archive_string_append_from_wcs_in_codepa
+ */
+ int
+ archive_string_append_from_wcs(struct archive_string *as,
+- const wchar_t *w, size_t len)
++ const char *w, size_t len)
+ {
+ /* We cannot use the standard wcstombs() here because it
+ * cannot tell us how big the output buffer should be. So
+@@ -847,7 +847,7 @@ archive_string_append_from_wcs(struct ar
+ */
+ int
+ archive_string_append_from_wcs(struct archive_string *as,
+- const wchar_t *w, size_t len)
++ const char *w, size_t len)
+ {
+ (void)as;/* UNUSED */
+ (void)w;/* UNUSED */
+@@ -1846,7 +1846,7 @@ archive_string_conversion_set_opt(struct
+ switch (opt) {
+ /*
+ * A filename in UTF-8 was made with libarchive 2.x in a wrong
+- * assumption that wchar_t was Unicode.
++ * assumption that char was Unicode.
+ * This option enables simulating the assumption in order to read
+ * that filename correctly.
+ */
+@@ -1854,7 +1854,7 @@ archive_string_conversion_set_opt(struct
+ #if (defined(_WIN32) && !defined(__CYGWIN__)) \
+ || defined(__STDC_ISO_10646__) || defined(__APPLE__)
+ /*
+- * Nothing to do for it since wchar_t on these platforms
++ * Nothing to do for it since char on these platforms
+ * is really Unicode.
+ */
+ (void)sc; /* UNUSED */
+@@ -2194,7 +2194,7 @@ invalid_mbs(const void *_p, size_t n, st
+ mbtowc(NULL, NULL, 0);
+ #endif
+ while (n) {
+- wchar_t wc;
++ char wc;
+
+ #if HAVE_MBRTOWC
+ r = mbrtowc(&wc, p, n, &shift_state);
+@@ -2597,7 +2597,7 @@ unicode_to_utf16be(char *p, size_t remai
+
+ if (uc > 0xffff) {
+ /* We have a code point that won't fit into a
+- * wchar_t; convert it to a surrogate pair. */
++ * char; convert it to a surrogate pair. */
+ if (remaining < 4)
+ return (0);
+ uc -= 0x10000;
+@@ -2619,7 +2619,7 @@ unicode_to_utf16le(char *p, size_t remai
+
+ if (uc > 0xffff) {
+ /* We have a code point that won't fit into a
+- * wchar_t; convert it to a surrogate pair. */
++ * char; convert it to a surrogate pair. */
+ if (remaining < 4)
+ return (0);
+ uc -= 0x10000;
+@@ -3445,7 +3445,7 @@ strncat_from_utf8_libarchive2(struct arc
+ p = as->s + as->length;
+ end = as->s + as->buffer_length - MB_CUR_MAX -1;
+ while ((n = _utf8_to_unicode(&unicode, s, len)) != 0) {
+- wchar_t wc;
++ char wc;
+
+ if (p >= end) {
+ as->length = p - as->s;
+@@ -3466,7 +3466,7 @@ strncat_from_utf8_libarchive2(struct arc
+ n *= -1;
+ wc = L'?';
+ } else
+- wc = (wchar_t)unicode;
++ wc = (char)unicode;
+
+ s += n;
+ len -= n;
+@@ -3935,7 +3935,7 @@ archive_mstring_get_mbs(struct archive *
+
+ int
+ archive_mstring_get_wcs(struct archive *a, struct archive_mstring *aes,
+- const wchar_t **wp)
++ const char **wp)
+ {
+ int r, ret = 0;
+
+@@ -4053,7 +4053,7 @@ archive_mstring_copy_mbs_len(struct arch
+ }
+
+ int
+-archive_mstring_copy_wcs(struct archive_mstring *aes, const wchar_t *wcs)
++archive_mstring_copy_wcs(struct archive_mstring *aes, const char *wcs)
+ {
+ return archive_mstring_copy_wcs_len(aes, wcs,
+ wcs == NULL ? 0 : wcslen(wcs));
+@@ -4074,7 +4074,7 @@ archive_mstring_copy_utf8(struct archive
+ }
+
+ int
+-archive_mstring_copy_wcs_len(struct archive_mstring *aes, const wchar_t *wcs,
++archive_mstring_copy_wcs_len(struct archive_mstring *aes, const char *wcs,
+ size_t len)
+ {
+ if (wcs == NULL) {
+@@ -4120,7 +4120,7 @@ archive_mstring_copy_mbs_len_l(struct ar
+ /*
+ * This case happens only when MultiByteToWideChar() cannot
+ * handle sc->from_cp, and we have to iconv in order to
+- * translate character-set to wchar_t,UTF-16.
++ * translate character-set to char,UTF-16.
+ */
+ iconv_t cd = sc->cd;
+ unsigned from_cp;
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_string.h b/Utilities/cmlibarchive/libarchive/archive_string.h
+--- a/Utilities/cmlibarchive/libarchive/archive_string.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_string.h 2021-02-11 18:43:34.445862611 +0330
+@@ -37,7 +37,7 @@
+
+ #include <stdarg.h>
+ #ifdef HAVE_STDLIB_H
+-#include <stdlib.h> /* required for wchar_t on some systems */
++#include <stdlib.h> /* required for char on some systems */
+ #endif
+ #ifdef HAVE_STRING_H
+ #include <string.h>
+@@ -62,7 +62,7 @@ struct archive_string {
+ };
+
+ struct archive_wstring {
+- wchar_t *s; /* Pointer to the storage */
++ char *s; /* Pointer to the storage */
+ size_t length; /* Length of 's' in characters */
+ size_t buffer_length; /* Length of malloc-ed storage in bytes. */
+ };
+@@ -77,9 +77,9 @@ struct archive_string_conv;
+ struct archive_string *
+ archive_strappend_char(struct archive_string *, char);
+
+-/* Ditto for a wchar_t and an archive_wstring. */
++/* Ditto for a char and an archive_wstring. */
+ struct archive_wstring *
+-archive_wstrappend_wchar(struct archive_wstring *, wchar_t);
++archive_wstrappend_wchar(struct archive_wstring *, char);
+
+ /* Append a raw array to an archive_string, resizing as necessary */
+ struct archive_string *
+@@ -88,7 +88,7 @@ archive_array_append(struct archive_stri
+ /* Convert a Unicode string to current locale and append the result. */
+ /* Returns -1 if conversion fails. */
+ int
+-archive_string_append_from_wcs(struct archive_string *, const wchar_t *, size_t);
++archive_string_append_from_wcs(struct archive_string *, const char *, size_t);
+
+
+ /* Create a string conversion object.
+@@ -155,13 +155,13 @@ archive_wstring_ensure(struct archive_ws
+ struct archive_string *
+ archive_strncat(struct archive_string *, const void *, size_t);
+ struct archive_wstring *
+-archive_wstrncat(struct archive_wstring *, const wchar_t *, size_t);
++archive_wstrncat(struct archive_wstring *, const char *, size_t);
+
+ /* Append a C string to an archive_string, resizing as necessary. */
+ struct archive_string *
+ archive_strcat(struct archive_string *, const void *);
+ struct archive_wstring *
+-archive_wstrcat(struct archive_wstring *, const wchar_t *);
++archive_wstrcat(struct archive_wstring *, const char *);
+
+ /* Copy a C string to an archive_string, resizing as necessary. */
+ #define archive_strcpy(as,p) \
+@@ -225,16 +225,16 @@ void archive_mstring_clean(struct archiv
+ void archive_mstring_copy(struct archive_mstring *dest, struct archive_mstring *src);
+ int archive_mstring_get_mbs(struct archive *, struct archive_mstring *, const char **);
+ int archive_mstring_get_utf8(struct archive *, struct archive_mstring *, const char **);
+-int archive_mstring_get_wcs(struct archive *, struct archive_mstring *, const wchar_t **);
++int archive_mstring_get_wcs(struct archive *, struct archive_mstring *, const char **);
+ int archive_mstring_get_mbs_l(struct archive_mstring *, const char **,
+ size_t *, struct archive_string_conv *);
+ int archive_mstring_copy_mbs(struct archive_mstring *, const char *mbs);
+ int archive_mstring_copy_mbs_len(struct archive_mstring *, const char *mbs,
+ size_t);
+ int archive_mstring_copy_utf8(struct archive_mstring *, const char *utf8);
+-int archive_mstring_copy_wcs(struct archive_mstring *, const wchar_t *wcs);
++int archive_mstring_copy_wcs(struct archive_mstring *, const char *wcs);
+ int archive_mstring_copy_wcs_len(struct archive_mstring *,
+- const wchar_t *wcs, size_t);
++ const char *wcs, size_t);
+ int archive_mstring_copy_mbs_len_l(struct archive_mstring *,
+ const char *mbs, size_t, struct archive_string_conv *);
+ int archive_mstring_update_utf8(struct archive *, struct archive_mstring *aes, const char *utf8);
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_string_sprintf.c b/Utilities/cmlibarchive/libarchive/archive_string_sprintf.c
+--- a/Utilities/cmlibarchive/libarchive/archive_string_sprintf.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_string_sprintf.c 2021-02-11 18:43:34.449195998 +0330
+@@ -95,7 +95,7 @@ archive_string_vsprintf(struct archive_s
+ intmax_t s; /* Signed integer temp. */
+ uintmax_t u; /* Unsigned integer temp. */
+ const char *p, *p2;
+- const wchar_t *pw;
++ const char *pw;
+
+ if (archive_string_ensure(as, 64) == NULL)
+ __archive_errx(1, "Out of memory");
+@@ -145,9 +145,9 @@ archive_string_vsprintf(struct archive_s
+ case 's':
+ switch(long_flag) {
+ case 'l':
+- pw = va_arg(ap, wchar_t *);
++ pw = va_arg(ap, char *);
+ if (pw == NULL)
+- pw = L"(null)";
++ pw = "(null)";
+ if (archive_string_append_from_wcs(as, pw,
+ wcslen(pw)) != 0 && errno == ENOMEM)
+ __archive_errx(1, "Out of memory");
+@@ -161,9 +161,9 @@ archive_string_vsprintf(struct archive_s
+ }
+ break;
+ case 'S':
+- pw = va_arg(ap, wchar_t *);
++ pw = va_arg(ap, char *);
+ if (pw == NULL)
+- pw = L"(null)";
++ pw = "(null)";
+ if (archive_string_append_from_wcs(as, pw,
+ wcslen(pw)) != 0 && errno == ENOMEM)
+ __archive_errx(1, "Out of memory");
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_util.c b/Utilities/cmlibarchive/libarchive/archive_util.c
+--- a/Utilities/cmlibarchive/libarchive/archive_util.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_util.c 2021-02-11 18:43:34.399195209 +0330
+@@ -219,11 +219,11 @@ __archive_errx(int retvalue, const char
+ * are not secure.
+ */
+ static int
+-__archive_mktempx(const char *tmpdir, wchar_t *template)
++__archive_mktempx(const char *tmpdir, char *template)
+ {
+- static const wchar_t prefix[] = L"libarchive_";
+- static const wchar_t suffix[] = L"XXXXXXXXXX";
+- static const wchar_t num[] = {
++ static const char prefix[] = "libarchive_";
++ static const char suffix[] = "XXXXXXXXXX";
++ static const char num[] = {
+ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F',
+ L'G', L'H', L'I', L'J', L'K', L'L', L'M', L'N',
+@@ -235,9 +235,9 @@ __archive_mktempx(const char *tmpdir, wc
+ };
+ HCRYPTPROV hProv;
+ struct archive_wstring temp_name;
+- wchar_t *ws;
++ char *ws;
+ DWORD attr;
+- wchar_t *xp, *ep;
++ char *xp, *ep;
+ int fd;
+
+ hProv = (HCRYPTPROV)NULL;
+@@ -250,14 +250,14 @@ __archive_mktempx(const char *tmpdir, wc
+ /* Get a temporary directory. */
+ if (tmpdir == NULL) {
+ size_t l;
+- wchar_t *tmp;
++ char *tmp;
+
+ l = GetTempPathW(0, NULL);
+ if (l == 0) {
+ la_dosmaperr(GetLastError());
+ goto exit_tmpfile;
+ }
+- tmp = malloc(l*sizeof(wchar_t));
++ tmp = malloc(l*sizeof(char));
+ if (tmp == NULL) {
+ errno = ENOMEM;
+ goto exit_tmpfile;
+@@ -321,12 +321,12 @@ __archive_mktempx(const char *tmpdir, wc
+ }
+
+ for (;;) {
+- wchar_t *p;
++ char *p;
+ HANDLE h;
+
+ /* Generate a random file name through CryptGenRandom(). */
+ p = xp;
+- if (!CryptGenRandom(hProv, (DWORD)(ep - p)*sizeof(wchar_t),
++ if (!CryptGenRandom(hProv, (DWORD)(ep - p)*sizeof(char),
+ (BYTE*)p)) {
+ la_dosmaperr(GetLastError());
+ goto exit_tmpfile;
+@@ -386,7 +386,7 @@ __archive_mktemp(const char *tmpdir)
+ }
+
+ int
+-__archive_mkstemp(wchar_t *template)
++__archive_mkstemp(char *template)
+ {
+ return __archive_mktempx(NULL, template);
+ }
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_windows.c b/Utilities/cmlibarchive/libarchive/archive_windows.c
+--- a/Utilities/cmlibarchive/libarchive/archive_windows.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_windows.c 2021-02-11 18:43:34.419195524 +0330
+@@ -119,15 +119,15 @@ getino(struct ustat *ub)
+ * characters.
+ * see also http://msdn.microsoft.com/en-us/library/aa365247.aspx
+ */
+-wchar_t *
++char *
+ __la_win_permissive_name(const char *name)
+ {
+- wchar_t *wn;
+- wchar_t *ws;
++ char *wn;
++ char *ws;
+ size_t ll;
+
+ ll = strlen(name);
+- wn = malloc((ll + 1) * sizeof(wchar_t));
++ wn = malloc((ll + 1) * sizeof(char));
+ if (wn == NULL)
+ return (NULL);
+ ll = mbstowcs(wn, name, ll);
+@@ -141,11 +141,11 @@ __la_win_permissive_name(const char *nam
+ return (ws);
+ }
+
+-wchar_t *
+-__la_win_permissive_name_w(const wchar_t *wname)
++char *
++__la_win_permissive_name_w(const char *wname)
+ {
+- wchar_t *wn, *wnp;
+- wchar_t *ws, *wsp;
++ char *wn, *wnp;
++ char *ws, *wsp;
+ DWORD l, len, slen;
+ int unc;
+
+@@ -158,7 +158,7 @@ __la_win_permissive_name_w(const wchar_t
+ * have to add three to the size to allocate a sufficient buffer
+ * size for the full-pathname of the file name. */
+ l += 3;
+- wnp = malloc(l * sizeof(wchar_t));
++ wnp = malloc(l * sizeof(char));
+ if (wnp == NULL)
+ return (NULL);
+ len = GetFullPathNameW(wname, l, wnp, NULL);
+@@ -181,13 +181,13 @@ __la_win_permissive_name_w(const wchar_t
+
+ unc = 0;
+ if (wnp[0] == L'\\' && wnp[1] == L'\\' && wnp[2] != L'\\') {
+- wchar_t *p = &wnp[2];
++ char *p = &wnp[2];
+
+ /* Skip server-name letters. */
+ while (*p != L'\\' && *p != L'\0')
+ ++p;
+ if (*p == L'\\') {
+- wchar_t *rp = ++p;
++ char *rp = ++p;
+ /* Skip share-name letters. */
+ while (*p != L'\\' && *p != L'\0')
+ ++p;
+@@ -202,18 +202,18 @@ __la_win_permissive_name_w(const wchar_t
+ }
+
+ slen = 4 + (unc * 4) + len + 1;
+- ws = wsp = malloc(slen * sizeof(wchar_t));
++ ws = wsp = malloc(slen * sizeof(char));
+ if (ws == NULL) {
+ free(wn);
+ return (NULL);
+ }
+ /* prepend "\\?\" */
+- wcsncpy(wsp, L"\\\\?\\", 4);
++ wcsncpy(wsp, "\\\\?\\", 4);
+ wsp += 4;
+ slen -= 4;
+ if (unc) {
+ /* append "UNC\" ---> "\\?\UNC\" */
+- wcsncpy(wsp, L"UNC\\", 4);
++ wcsncpy(wsp, "UNC\\", 4);
+ wsp += 4;
+ slen -= 4;
+ }
+@@ -232,7 +232,7 @@ la_CreateFile(const char *path, DWORD dw
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
+ DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
+ {
+- wchar_t *wpath;
++ char *wpath;
+ HANDLE handle;
+
+ handle = CreateFileA(path, dwDesiredAccess, dwShareMode,
+@@ -291,7 +291,7 @@ int
+ __la_open(const char *path, int flags, ...)
+ {
+ va_list ap;
+- wchar_t *ws;
++ char *ws;
+ int r, pmode;
+ DWORD attr;
+
+@@ -683,9 +683,9 @@ __la_write(int fd, const void *buf, size
+ * Replace the Windows path separator '\' with '/'.
+ */
+ static int
+-replace_pathseparator(struct archive_wstring *ws, const wchar_t *wp)
++replace_pathseparator(struct archive_wstring *ws, const char *wp)
+ {
+- wchar_t *w;
++ char *w;
+ size_t path_length;
+
+ if (wp == NULL)
+@@ -707,7 +707,7 @@ static int
+ fix_pathseparator(struct archive_entry *entry)
+ {
+ struct archive_wstring ws;
+- const wchar_t *wp;
++ const char *wp;
+ int ret = ARCHIVE_OK;
+
+ archive_string_init(&ws);
+@@ -749,7 +749,7 @@ struct archive_entry *
+ __la_win_entry_in_posix_pathseparator(struct archive_entry *entry)
+ {
+ struct archive_entry *entry_main;
+- const wchar_t *wp;
++ const char *wp;
+ int has_backslash = 0;
+ int ret;
+
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_windows.h b/Utilities/cmlibarchive/libarchive/archive_windows.h
+--- a/Utilities/cmlibarchive/libarchive/archive_windows.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_windows.h 2021-02-11 18:43:34.439195839 +0330
+@@ -288,8 +288,8 @@ extern ssize_t __la_write(int fd, const
+ #define WIFEXITED(sts) ((sts & 0x100) == 0)
+ #define WEXITSTATUS(sts) (sts & 0x0FF)
+
+-extern wchar_t *__la_win_permissive_name(const char *name);
+-extern wchar_t *__la_win_permissive_name_w(const wchar_t *wname);
++extern char *__la_win_permissive_name(const char *name);
++extern char *__la_win_permissive_name_w(const char *wname);
+ extern void __la_dosmaperr(unsigned long e);
+ #define la_dosmaperr(e) __la_dosmaperr(e)
+ extern struct archive_entry *__la_win_entry_in_posix_pathseparator(
+@@ -297,7 +297,7 @@ extern struct archive_entry *__la_win_en
+
+ #if defined(HAVE_WCRTOMB) && defined(__BORLANDC__)
+ typedef int mbstate_t;
+-size_t wcrtomb(char *, wchar_t, mbstate_t *);
++size_t wcrtomb(char *, char, mbstate_t *);
+ #endif
+
+ #if defined(_MSC_VER) && _MSC_VER < 1300
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c b/Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c 2021-02-12 14:39:59.857852509 +0330
+@@ -2978,7 +2978,7 @@ check_symlinks(struct archive_write_disk
+ static void
+ cleanup_pathname_win(char *path)
+ {
+- wchar_t wc;
++ char wc;
+ char *p;
+ size_t alen, l;
+ int mb, complete, utf8;
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_disk_windows.c b/Utilities/cmlibarchive/libarchive/archive_write_disk_windows.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_disk_windows.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_disk_windows.c 2021-02-11 18:43:34.419195524 +0330
+@@ -99,7 +99,7 @@ struct fixup_entry {
+ unsigned long ctime_nanos;
+ unsigned long fflags_set;
+ int fixup; /* bitmask of what needs fixing */
+- wchar_t *name;
++ char *name;
+ };
+
+ /*
+@@ -163,9 +163,9 @@ struct archive_write_disk {
+
+ /* Information about the object being restored right now. */
+ struct archive_entry *entry; /* Entry being extracted. */
+- wchar_t *name; /* Name of entry, possibly edited. */
++ char *name; /* Name of entry, possibly edited. */
+ struct archive_wstring _name_data; /* backing store for 'name' */
+- wchar_t *tmpname; /* Temporary name */
++ char *tmpname; /* Temporary name */
+ struct archive_wstring _tmpname_data; /* backing store for 'tmpname' */
+ /* Tasks remaining for this object. */
+ int todo;
+@@ -207,31 +207,31 @@ struct archive_write_disk {
+ #define MINIMUM_DIR_MODE 0700
+ #define MAXIMUM_DIR_MODE 0775
+
+-static int disk_unlink(const wchar_t *);
+-static int disk_rmdir(const wchar_t *);
++static int disk_unlink(const char *);
++static int disk_rmdir(const char *);
+ static int check_symlinks(struct archive_write_disk *);
+ static int create_filesystem_object(struct archive_write_disk *);
+ static struct fixup_entry *current_fixup(struct archive_write_disk *,
+- const wchar_t *pathname);
++ const char *pathname);
+ static int cleanup_pathname(struct archive_write_disk *);
+-static int create_dir(struct archive_write_disk *, wchar_t *);
+-static int create_parent_dir(struct archive_write_disk *, wchar_t *);
+-static int la_chmod(const wchar_t *, mode_t);
++static int create_dir(struct archive_write_disk *, char *);
++static int create_parent_dir(struct archive_write_disk *, char *);
++static int la_chmod(const char *, mode_t);
+ static int la_mktemp(struct archive_write_disk *);
+ static int older(BY_HANDLE_FILE_INFORMATION *, struct archive_entry *);
+ static int permissive_name_w(struct archive_write_disk *);
+ static int restore_entry(struct archive_write_disk *);
+ static int set_acls(struct archive_write_disk *, HANDLE h,
+- const wchar_t *, struct archive_acl *);
++ const char *, struct archive_acl *);
+ static int set_xattrs(struct archive_write_disk *);
+ static int clear_nochange_fflags(struct archive_write_disk *);
+ static int set_fflags(struct archive_write_disk *);
+-static int set_fflags_platform(const wchar_t *, unsigned long,
++static int set_fflags_platform(const char *, unsigned long,
+ unsigned long);
+ static int set_ownership(struct archive_write_disk *);
+ static int set_mode(struct archive_write_disk *, int mode);
+ static int set_times(struct archive_write_disk *, HANDLE, int,
+- const wchar_t *, time_t, long, time_t, long, time_t,
++ const char *, time_t, long, time_t, long, time_t,
+ long, time_t, long);
+ static int set_times_from_entry(struct archive_write_disk *);
+ static struct fixup_entry *sort_dir_list(struct fixup_entry *p);
+@@ -261,7 +261,7 @@ static ssize_t _archive_write_disk_data_
+ ((((int64_t)(bhfi)->nFileSizeHigh) << 32) + (bhfi)->nFileSizeLow)
+
+ static int
+-file_information(struct archive_write_disk *a, wchar_t *path,
++file_information(struct archive_write_disk *a, char *path,
+ BY_HANDLE_FILE_INFORMATION *st, mode_t *mode, int sim_lstat)
+ {
+ HANDLE h;
+@@ -273,7 +273,7 @@ file_information(struct archive_write_di
+ h = FindFirstFileW(path, &findData);
+ if (h == INVALID_HANDLE_VALUE &&
+ GetLastError() == ERROR_INVALID_NAME) {
+- wchar_t *full;
++ char *full;
+ full = __la_win_permissive_name_w(path);
+ h = FindFirstFileW(full, &findData);
+ free(full);
+@@ -296,7 +296,7 @@ file_information(struct archive_write_di
+ OPEN_EXISTING, flag, NULL);
+ if (h == INVALID_HANDLE_VALUE &&
+ GetLastError() == ERROR_INVALID_NAME) {
+- wchar_t *full;
++ char *full;
+ full = __la_win_permissive_name_w(path);
+ h = CreateFileW(full, 0, 0, NULL,
+ OPEN_EXISTING, flag, NULL);
+@@ -325,7 +325,7 @@ file_information(struct archive_write_di
+ else if (st->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ *mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
+ else {
+- const wchar_t *p;
++ const char *p;
+
+ *mode |= S_IFREG;
+ p = wcsrchr(path, L'.');
+@@ -364,8 +364,8 @@ file_information(struct archive_write_di
+ static int
+ permissive_name_w(struct archive_write_disk *a)
+ {
+- wchar_t *wn, *wnp;
+- wchar_t *ws, *wsp;
++ char *wn, *wnp;
++ char *ws, *wsp;
+ DWORD l;
+
+ wnp = a->name;
+@@ -397,7 +397,7 @@ permissive_name_w(struct archive_write_d
+ archive_wstring_ensure(&(a->_name_data), 4 + wcslen(wn) + 1);
+ a->name = a->_name_data.s;
+ /* Prepend "\\?\" */
+- archive_wstrncpy(&(a->_name_data), L"\\\\?\\", 4);
++ archive_wstrncpy(&(a->_name_data), "\\\\?\\", 4);
+ archive_wstrcat(&(a->_name_data), wn);
+ free(wn);
+ return (0);
+@@ -408,13 +408,13 @@ permissive_name_w(struct archive_write_d
+ * like "\\<server-name>\<share-name>\file".
+ */
+ if (wnp[0] == L'\\' && wnp[1] == L'\\' && wnp[2] != L'\\') {
+- const wchar_t *p = &wnp[2];
++ const char *p = &wnp[2];
+
+ /* Skip server-name letters. */
+ while (*p != L'\\' && *p != L'\0')
+ ++p;
+ if (*p == L'\\') {
+- const wchar_t *rp = ++p;
++ const char *rp = ++p;
+ /* Skip share-name letters. */
+ while (*p != L'\\' && *p != L'\0')
+ ++p;
+@@ -429,7 +429,7 @@ permissive_name_w(struct archive_write_d
+ a->name = a->_name_data.s;
+ /* Prepend "\\?\UNC\" */
+ archive_wstrncpy(&(a->_name_data),
+- L"\\\\?\\UNC\\", 8);
++ "\\\\?\\UNC\\", 8);
+ archive_wstrcat(&(a->_name_data), wn+2);
+ free(wn);
+ return (0);
+@@ -444,7 +444,7 @@ permissive_name_w(struct archive_write_d
+ l = GetCurrentDirectoryW(0, NULL);
+ if (l == 0)
+ return (-1);
+- ws = malloc(l * sizeof(wchar_t));
++ ws = malloc(l * sizeof(char));
+ l = GetCurrentDirectoryW(l, ws);
+ if (l == 0) {
+ free(ws);
+@@ -463,7 +463,7 @@ permissive_name_w(struct archive_write_d
+ 4 + 2 + wcslen(wn) + 1);
+ a->name = a->_name_data.s;
+ /* Prepend "\\?\" and drive name. */
+- archive_wstrncpy(&(a->_name_data), L"\\\\?\\", 4);
++ archive_wstrncpy(&(a->_name_data), "\\\\?\\", 4);
+ archive_wstrncat(&(a->_name_data), wsp, 2);
+ archive_wstrcat(&(a->_name_data), wn);
+ free(wsp);
+@@ -484,15 +484,15 @@ permissive_name_w(struct archive_write_d
+ }
+ else if (l > 2 && wsp[0] == L'\\' && wsp[1] == L'\\' && wsp[2] != L'\\')
+ {
+- archive_wstrncpy(&(a->_name_data), L"\\\\?\\UNC\\", 8);
++ archive_wstrncpy(&(a->_name_data), "\\\\?\\UNC\\", 8);
+ archive_wstrncat(&(a->_name_data), wsp+2, l-2);
+ }
+ else
+ {
+- archive_wstrncpy(&(a->_name_data), L"\\\\?\\", 4);
++ archive_wstrncpy(&(a->_name_data), "\\\\?\\", 4);
+ archive_wstrncat(&(a->_name_data), wsp, l);
+ }
+- archive_wstrncat(&(a->_name_data), L"\\", 1);
++ archive_wstrncat(&(a->_name_data), "\\", 1);
+ archive_wstrcat(&(a->_name_data), wn);
+ a->name = a->_name_data.s;
+ free(wsp);
+@@ -501,11 +501,11 @@ permissive_name_w(struct archive_write_d
+ }
+
+ static int
+-la_chmod(const wchar_t *path, mode_t mode)
++la_chmod(const char *path, mode_t mode)
+ {
+ DWORD attr;
+ BOOL r;
+- wchar_t *fullname;
++ char *fullname;
+ int ret = 0;
+
+ fullname = NULL;
+@@ -545,7 +545,7 @@ la_mktemp(struct archive_write_disk *a)
+
+ archive_wstring_empty(&(a->_tmpname_data));
+ archive_wstrcpy(&(a->_tmpname_data), a->name);
+- archive_wstrcat(&(a->_tmpname_data), L".XXXXXX");
++ archive_wstrcat(&(a->_tmpname_data), ".XXXXXX");
+ a->tmpname = a->_tmpname_data.s;
+
+ fd = __archive_mkstemp(a->tmpname);
+@@ -576,7 +576,7 @@ la_GetFunctionKernel32(const char *name)
+ }
+
+ static int
+-la_CreateHardLinkW(wchar_t *linkname, wchar_t *target)
++la_CreateHardLinkW(char *linkname, char *target)
+ {
+ static BOOLEAN (WINAPI *f)(LPWSTR, LPWSTR, LPSECURITY_ATTRIBUTES);
+ static int set;
+@@ -598,12 +598,12 @@ la_CreateHardLinkW(wchar_t *linkname, wc
+ (name[1] == L'N' || name[1] == L'n') && \
+ (name[2] == L'C' || name[2] == L'c') && \
+ name[3] == L'\\')
+- if (!wcsncmp(linkname,L"\\\\?\\", 4)) {
++ if (!wcsncmp(linkname,"\\\\?\\", 4)) {
+ linkname += 4;
+ if (IS_UNC(linkname))
+ linkname += 4;
+ }
+- if (!wcsncmp(target,L"\\\\?\\", 4)) {
++ if (!wcsncmp(target,"\\\\?\\", 4)) {
+ target += 4;
+ if (IS_UNC(target))
+ target += 4;
+@@ -621,11 +621,11 @@ la_CreateHardLinkW(wchar_t *linkname, wc
+ * the link target
+ */
+ static int
+-la_CreateSymbolicLinkW(const wchar_t *linkname, const wchar_t *target,
++la_CreateSymbolicLinkW(const char *linkname, const char *target,
+ int linktype) {
+ static BOOLEAN (WINAPI *f)(LPCWSTR, LPCWSTR, DWORD);
+ static int set;
+- wchar_t *ttarget, *p;
++ char *ttarget, *p;
+ int len;
+ DWORD attrs = 0;
+ DWORD flags = 0;
+@@ -648,7 +648,7 @@ la_CreateSymbolicLinkW(const wchar_t *li
+ * When writing path targets, we need to translate slashes
+ * to backslashes
+ */
+- ttarget = malloc((len + 1) * sizeof(wchar_t));
++ ttarget = malloc((len + 1) * sizeof(char));
+ if (ttarget == NULL)
+ return(0);
+
+@@ -1381,9 +1381,9 @@ archive_write_disk_new(void)
+ }
+
+ static int
+-disk_unlink(const wchar_t *path)
++disk_unlink(const char *path)
+ {
+- wchar_t *fullname;
++ char *fullname;
+ int r;
+
+ r = _wunlink(path);
+@@ -1396,9 +1396,9 @@ disk_unlink(const wchar_t *path)
+ }
+
+ static int
+-disk_rmdir(const wchar_t *path)
++disk_rmdir(const char *path)
+ {
+- wchar_t *fullname;
++ char *fullname;
+ int r;
+
+ r = _wrmdir(path);
+@@ -1450,7 +1450,7 @@ restore_entry(struct archive_write_disk
+
+ if ((en == ENOTDIR || en == ENOENT)
+ && !(a->flags & ARCHIVE_EXTRACT_NO_AUTODIR)) {
+- wchar_t *full;
++ char *full;
+ /* If the parent dir doesn't exist, try creating it. */
+ create_parent_dir(a, a->name);
+ /* Now try to create the object again. */
+@@ -1652,8 +1652,8 @@ static int
+ create_filesystem_object(struct archive_write_disk *a)
+ {
+ /* Create the entry. */
+- const wchar_t *linkname;
+- wchar_t *fullname;
++ const char *linkname;
++ char *fullname;
+ mode_t final_mode, mode;
+ int r;
+ DWORD attrs = 0;
+@@ -1662,7 +1662,7 @@ create_filesystem_object(struct archive_
+ /* Since link(2) and symlink(2) don't handle modes, we're done here. */
+ linkname = archive_entry_hardlink_w(a->entry);
+ if (linkname != NULL) {
+- wchar_t *linkfull, *namefull;
++ char *linkfull, *namefull;
+
+ linkfull = __la_win_permissive_name_w(linkname);
+ namefull = __la_win_permissive_name_w(a->name);
+@@ -1736,7 +1736,7 @@ create_filesystem_object(struct archive_
+ return symlink(linkname, a->name) ? errno : 0;
+ #else
+ errno = 0;
+- r = la_CreateSymbolicLinkW((const wchar_t *)a->name, linkname,
++ r = la_CreateSymbolicLinkW((const char *)a->name, linkname,
+ archive_entry_symlink_type(a->entry));
+ if (r == 0) {
+ if (errno == 0)
+@@ -2006,7 +2006,7 @@ sort_dir_list(struct fixup_entry *p)
+ * structure rather than a simple list of names.
+ */
+ static struct fixup_entry *
+-new_fixup(struct archive_write_disk *a, const wchar_t *pathname)
++new_fixup(struct archive_write_disk *a, const char *pathname)
+ {
+ struct fixup_entry *fe;
+
+@@ -2025,7 +2025,7 @@ new_fixup(struct archive_write_disk *a,
+ * Returns a fixup structure for the current entry.
+ */
+ static struct fixup_entry *
+-current_fixup(struct archive_write_disk *a, const wchar_t *pathname)
++current_fixup(struct archive_write_disk *a, const char *pathname)
+ {
+ if (a->current_fixup == NULL)
+ a->current_fixup = new_fixup(a, pathname);
+@@ -2044,8 +2044,8 @@ current_fixup(struct archive_write_disk
+ static int
+ check_symlinks(struct archive_write_disk *a)
+ {
+- wchar_t *pn, *p;
+- wchar_t c;
++ char *pn, *p;
++ char c;
+ int r;
+ BY_HANDLE_FILE_INFORMATION st;
+ mode_t st_mode;
+@@ -2153,7 +2153,7 @@ check_symlinks(struct archive_write_disk
+ }
+
+ static int
+-guidword(wchar_t *p, int n)
++guidword(char *p, int n)
+ {
+ int i;
+
+@@ -2177,8 +2177,8 @@ guidword(wchar_t *p, int n)
+ static int
+ cleanup_pathname(struct archive_write_disk *a)
+ {
+- wchar_t *dest, *src, *p, *top;
+- wchar_t separator = L'\0';
++ char *dest, *src, *p, *top;
++ char separator = L'\0';
+
+ p = a->name;
+ if (*p == L'\0') {
+@@ -2349,9 +2349,9 @@ cleanup_pathname(struct archive_write_di
+ * is already in mutable storage.
+ */
+ static int
+-create_parent_dir(struct archive_write_disk *a, wchar_t *path)
++create_parent_dir(struct archive_write_disk *a, char *path)
+ {
+- wchar_t *slash;
++ char *slash;
+ int r;
+
+ /* Remove tail element to obtain parent name. */
+@@ -2372,11 +2372,11 @@ create_parent_dir(struct archive_write_d
+ * Assumes path is in mutable storage; path is unchanged on exit.
+ */
+ static int
+-create_dir(struct archive_write_disk *a, wchar_t *path)
++create_dir(struct archive_write_disk *a, char *path)
+ {
+ BY_HANDLE_FILE_INFORMATION st;
+ struct fixup_entry *le;
+- wchar_t *slash, *base, *full;
++ char *slash, *base, *full;
+ mode_t mode_final, mode, st_mode;
+ int r;
+
+@@ -2512,7 +2512,7 @@ set_ownership(struct archive_write_disk
+
+ static int
+ set_times(struct archive_write_disk *a,
+- HANDLE h, int mode, const wchar_t *name,
++ HANDLE h, int mode, const char *name,
+ time_t atime, long atime_nanos,
+ time_t birthtime, long birthtime_nanos,
+ time_t mtime, long mtime_nanos,
+@@ -2533,7 +2533,7 @@ set_times(struct archive_write_disk *a,
+ if (h != INVALID_HANDLE_VALUE) {
+ hw = NULL;
+ } else {
+- wchar_t *ws;
++ char *ws;
+
+ if (S_ISLNK(mode))
+ return (ARCHIVE_OK);
+@@ -2695,11 +2695,11 @@ set_mode(struct archive_write_disk *a, i
+ return (r);
+ }
+
+-static int set_fflags_platform(const wchar_t *name, unsigned long fflags_set,
++static int set_fflags_platform(const char *name, unsigned long fflags_set,
+ unsigned long fflags_clear)
+ {
+ DWORD oldflags, newflags;
+- wchar_t *fullname;
++ char *fullname;
+
+ const DWORD settable_flags =
+ FILE_ATTRIBUTE_ARCHIVE |
+@@ -2750,7 +2750,7 @@ set_fflags(struct archive_write_disk *a)
+
+ /* Default empty function body to satisfy mainline code. */
+ static int
+-set_acls(struct archive_write_disk *a, HANDLE h, const wchar_t *name,
++set_acls(struct archive_write_disk *a, HANDLE h, const char *name,
+ struct archive_acl *acl)
+ {
+ (void)a; /* UNUSED */
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_open_filename.c b/Utilities/cmlibarchive/libarchive/archive_write_open_filename.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_open_filename.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_open_filename.c 2021-02-11 18:43:34.379194894 +0330
+@@ -83,7 +83,7 @@ archive_write_open_filename(struct archi
+ }
+
+ int
+-archive_write_open_filename_w(struct archive *a, const wchar_t *filename)
++archive_write_open_filename_w(struct archive *a, const char *filename)
+ {
+
+ if (filename == NULL || filename[0] == L'\0')
+@@ -119,7 +119,7 @@ open_filename(struct archive *a, int mbs
+ else
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
+ "Can't convert '%S' to MBS",
+- (const wchar_t *)filename);
++ (const char *)filename);
+ return (ARCHIVE_FAILED);
+ }
+ mine->fd = -1;
+@@ -134,9 +134,9 @@ file_open(struct archive *a, void *clien
+ struct write_file_data *mine;
+ struct stat st;
+ #if defined(_WIN32) && !defined(__CYGWIN__)
+- wchar_t *fullpath;
++ char *fullpath;
+ #endif
+- const wchar_t *wcs;
++ const char *wcs;
+ const char *mbs;
+
+ mine = (struct write_file_data *)client_data;
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_set_format_gnutar.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_gnutar.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_set_format_gnutar.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_gnutar.c 2021-02-11 18:43:34.422528911 +0330
+@@ -309,7 +309,7 @@ archive_write_gnutar_header(struct archi
+ * the client sees the change.
+ */
+ #if defined(_WIN32) && !defined(__CYGWIN__)
+- const wchar_t *wp;
++ const char *wp;
+
+ wp = archive_entry_pathname_w(entry);
+ if (wp != NULL && wp[wcslen(wp) -1] != L'/') {
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c 2021-02-11 18:43:34.419195524 +0330
+@@ -4692,7 +4692,7 @@ cleanup_backslash_1(char *p)
+ }
+
+ static void
+-cleanup_backslash_2(wchar_t *p)
++cleanup_backslash_2(char *p)
+ {
+
+ /* Convert a path-separator from '\' to '/' */
+@@ -4824,7 +4824,7 @@ isofile_gen_utility_names(struct archive
+ * Convert a path-separator from '\' to '/'
+ */
+ if (cleanup_backslash_1(file->parentdir.s) != 0) {
+- const wchar_t *wp = archive_entry_pathname_w(file->entry);
++ const char *wp = archive_entry_pathname_w(file->entry);
+ struct archive_wstring ws;
+
+ if (wp != NULL) {
+@@ -4938,7 +4938,7 @@ isofile_gen_utility_names(struct archive
+ */
+ if (archive_strlen(&(file->symlink)) > 0 &&
+ cleanup_backslash_1(file->symlink.s) != 0) {
+- const wchar_t *wp =
++ const char *wp =
+ archive_entry_symlink_w(file->entry);
+ struct archive_wstring ws;
+
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c 2021-02-11 18:43:34.459196155 +0330
+@@ -1702,7 +1702,7 @@ cleanup_backslash_1(char *p)
+ }
+
+ static void
+-cleanup_backslash_2(wchar_t *p)
++cleanup_backslash_2(char *p)
+ {
+
+ /* Convert a path-separator from '\' to '/' */
+@@ -1732,7 +1732,7 @@ mtree_entry_setup_filenames(struct archi
+ * Convert a path-separator from '\' to '/'
+ */
+ if (cleanup_backslash_1(file->pathname.s) != 0) {
+- const wchar_t *wp = archive_entry_pathname_w(entry);
++ const char *wp = archive_entry_pathname_w(entry);
+ struct archive_wstring ws;
+
+ if (wp != NULL) {
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c 2021-02-11 18:43:34.369194737 +0330
+@@ -653,7 +653,7 @@ archive_write_pax_header(struct archive_
+ * entry so the client sees the change.
+ */
+ #if defined(_WIN32) && !defined(__CYGWIN__)
+- const wchar_t *wp;
++ const char *wp;
+
+ wp = archive_entry_pathname_w(entry_original);
+ if (wp != NULL && wp[wcslen(wp) -1] != L'/') {
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c 2021-02-11 18:43:34.375861508 +0330
+@@ -276,7 +276,7 @@ archive_write_ustar_header(struct archiv
+ * the client sees the change.
+ */
+ #if defined(_WIN32) && !defined(__CYGWIN__)
+- const wchar_t *wp;
++ const char *wp;
+
+ wp = archive_entry_pathname_w(entry);
+ if (wp != NULL && wp[wcslen(wp) -1] != L'/') {
+diff -urp a/Utilities/cmlibarchive/libarchive/archive_write_set_format_v7tar.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_v7tar.c
+--- a/Utilities/cmlibarchive/libarchive/archive_write_set_format_v7tar.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_v7tar.c 2021-02-11 18:43:34.372528122 +0330
+@@ -254,7 +254,7 @@ archive_write_v7tar_header(struct archiv
+ * the client sees the change.
+ */
+ #if defined(_WIN32) && !defined(__CYGWIN__)
+- const wchar_t *wp;
++ const char *wp;
+
+ wp = archive_entry_pathname_w(entry);
+ if (wp != NULL && wp[wcslen(wp) -1] != L'/') {
+diff -urp a/Utilities/cmlibarchive/libarchive/libarchive_changes.3 b/Utilities/cmlibarchive/libarchive/libarchive_changes.3
+--- a/Utilities/cmlibarchive/libarchive/libarchive_changes.3 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibarchive/libarchive/libarchive_changes.3 2021-02-11 18:43:34.365861350 +0330
+@@ -52,7 +52,7 @@ extends the write pipeline with another
+ Libarchive2 assumed that the local platform uses
+ .Tn Unicode
+ as the native
+-.Tn wchar_t
++.Tn char
+ encoding, which is true on
+ .Tn Windows ,
+ modern
+@@ -63,7 +63,7 @@ systems, since pax format requires
+ .Tn UTF-8
+ and libarchive 2 incorrectly
+ assumed that
+-.Tn wchar_t
++.Tn char
+ strings can be easily converted to
+ .Tn UTF-8 .
+ .Pp
+diff -urp a/Utilities/cmlibrhash/librhash/rhash.c b/Utilities/cmlibrhash/librhash/rhash.c
+--- a/Utilities/cmlibrhash/librhash/rhash.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibrhash/librhash/rhash.c 2021-02-11 18:43:33.965855044 +0330
+@@ -380,7 +380,7 @@ RHASH_API int rhash_file(unsigned hash_i
+ #ifdef _WIN32 /* windows only function */
+ #include <share.h>
+
+-RHASH_API int rhash_wfile(unsigned hash_id, const wchar_t* filepath, unsigned char* result)
++RHASH_API int rhash_wfile(unsigned hash_id, const char* filepath, unsigned char* result)
+ {
+ FILE* fd;
+ rhash ctx;
+@@ -392,7 +392,7 @@ RHASH_API int rhash_wfile(unsigned hash_
+ return -1;
+ }
+
+- if ((fd = _wfsopen(filepath, L"rb", _SH_DENYWR)) == NULL) return -1;
++ if ((fd = _wfsopen(filepath, "rb", _SH_DENYWR)) == NULL) return -1;
+
+ if ((ctx = rhash_init(hash_id)) == NULL) {
+ fclose(fd);
+diff -urp a/Utilities/cmlibrhash/librhash/rhash.h b/Utilities/cmlibrhash/librhash/rhash.h
+--- a/Utilities/cmlibrhash/librhash/rhash.h 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibrhash/librhash/rhash.h 2021-02-11 18:43:33.965855044 +0330
+@@ -164,7 +164,7 @@ RHASH_API int rhash_file(unsigned hash_i
+ * @param result buffer to receive hash value with the lowest requested id
+ * @return 0 on success, -1 on error, -1 on error and errno is set
+ */
+-RHASH_API int rhash_wfile(unsigned hash_id, const wchar_t* filepath, unsigned char* result);
++RHASH_API int rhash_wfile(unsigned hash_id, const char* filepath, unsigned char* result);
+ #endif
+
+
+diff -urp a/Utilities/cmlibuv/src/win/core.c b/Utilities/cmlibuv/src/win/core.c
+--- a/Utilities/cmlibuv/src/win/core.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibuv/src/win/core.c 2021-02-11 18:43:34.115857411 +0330
+@@ -71,8 +71,8 @@ UV_THREAD_LOCAL int uv__crt_assert_enabl
+
+
+ #if !defined(__MINGW32__) || __MSVCRT_VERSION__ >= 0x800
+-static void uv__crt_invalid_parameter_handler(const wchar_t* expression,
+- const wchar_t* function, const wchar_t * file, unsigned int line,
++static void uv__crt_invalid_parameter_handler(const char* expression,
++ const char* function, const char * file, unsigned int line,
+ uintptr_t reserved) {
+ /* No-op. */
+ }
+diff -urp a/Utilities/cmlibuv/src/win/fs.c b/Utilities/cmlibuv/src/win/fs.c
+--- a/Utilities/cmlibuv/src/win/fs.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibuv/src/win/fs.c 2021-02-11 18:43:34.102523866 +0330
+@@ -124,13 +124,13 @@
+
+ #define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+-const WCHAR JUNCTION_PREFIX[] = L"\\??\\";
++const WCHAR JUNCTION_PREFIX[] = "\\??\\";
+ const WCHAR JUNCTION_PREFIX_LEN = 4;
+
+-const WCHAR LONG_PATH_PREFIX[] = L"\\\\?\\";
++const WCHAR LONG_PATH_PREFIX[] = "\\\\?\\";
+ const WCHAR LONG_PATH_PREFIX_LEN = 4;
+
+-const WCHAR UNC_PATH_PREFIX[] = L"\\\\?\\UNC\\";
++const WCHAR UNC_PATH_PREFIX[] = "\\\\?\\UNC\\";
+ const WCHAR UNC_PATH_PREFIX_LEN = 8;
+
+ static int uv__file_symlink_usermode_flag = SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE;
+@@ -1234,7 +1234,7 @@ typedef int (*uv__fs_mktemp_func)(uv_fs_
+ /* OpenBSD original: lib/libc/stdio/mktemp.c */
+ void fs__mktemp(uv_fs_t* req, uv__fs_mktemp_func func) {
+ static const WCHAR *tempchars =
+- L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
++ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ static const size_t num_chars = 62;
+ static const size_t num_x = 6;
+ WCHAR *cp, *ep;
+@@ -1246,7 +1246,7 @@ void fs__mktemp(uv_fs_t* req, uv__fs_mkt
+ path = (char*)req->path;
+ len = wcslen(req->file.pathw);
+ ep = req->file.pathw + len;
+- if (len < num_x || wcsncmp(ep - num_x, L"XXXXXX", num_x)) {
++ if (len < num_x || wcsncmp(ep - num_x, "XXXXXX", num_x)) {
+ SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER);
+ goto clobber;
+ }
+@@ -1592,11 +1592,11 @@ void fs__opendir(uv_fs_t* req) {
+ len = wcslen(pathw);
+
+ if (len == 0)
+- fmt = L"./*";
++ fmt = "./*";
+ else if (IS_SLASH(pathw[len - 1]))
+- fmt = L"%s*";
++ fmt = "%s*";
+ else
+- fmt = L"%s\\*";
++ fmt = "%s\\*";
+
+ find_path = uv__malloc(sizeof(WCHAR) * (len + 4));
+ if (find_path == NULL) {
+diff -urp a/Utilities/cmlibuv/src/win/fs-event.c b/Utilities/cmlibuv/src/win/fs-event.c
+--- a/Utilities/cmlibuv/src/win/fs-event.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibuv/src/win/fs-event.c 2021-02-11 18:43:34.112524024 +0330
+@@ -487,7 +487,7 @@ void uv_process_fs_event_req(uv_loop_t*
+ uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc");
+ }
+
+- _snwprintf(filenamew, size, L"%s\\%.*s", handle->dirw,
++ _snwprintf(filenamew, size, "%s\\%.*s", handle->dirw,
+ file_info->FileNameLength / (DWORD)sizeof(WCHAR),
+ file_info->FileName);
+
+diff -urp a/Utilities/cmlibuv/src/win/getaddrinfo.c b/Utilities/cmlibuv/src/win/getaddrinfo.c
+--- a/Utilities/cmlibuv/src/win/getaddrinfo.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibuv/src/win/getaddrinfo.c 2021-02-11 18:43:34.119190796 +0330
+@@ -398,7 +398,7 @@ error:
+
+ int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size) {
+ NET_LUID luid;
+- wchar_t wname[NDIS_IF_MAX_STRING_SIZE + 1]; /* Add one for the NUL. */
++ char wname[NDIS_IF_MAX_STRING_SIZE + 1]; /* Add one for the NUL. */
+ DWORD bufsize;
+ int r;
+
+diff -urp a/Utilities/cmlibuv/src/win/process.c b/Utilities/cmlibuv/src/win/process.c
+--- a/Utilities/cmlibuv/src/win/process.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibuv/src/win/process.c 2021-02-11 18:43:34.109190639 +0330
+@@ -43,7 +43,7 @@ typedef struct env_var {
+ const size_t len; /* including null or '=' */
+ } env_var_t;
+
+-#define E_V(str) { L##str, L##str L"=", sizeof(str) }
++#define E_V(str) { L##str, L##str "=", sizeof(str) }
+
+ static const env_var_t required_vars[] = { /* keep me sorted */
+ E_V("HOMEDRIVE"),
+@@ -203,7 +203,7 @@ static WCHAR* search_path_join_test(cons
+ result_pos += cwd_len;
+
+ /* Add a path separator if cwd didn't end with one */
+- if (cwd_len && wcsrchr(L"\\/:", result_pos[-1]) == NULL) {
++ if (cwd_len && wcsrchr("\\/:", result_pos[-1]) == NULL) {
+ result_pos[0] = L'\\';
+ result_pos++;
+ }
+@@ -213,7 +213,7 @@ static WCHAR* search_path_join_test(cons
+ result_pos += dir_len;
+
+ /* Add a separator if the dir didn't end with one */
+- if (dir_len && wcsrchr(L"\\/:", result_pos[-1]) == NULL) {
++ if (dir_len && wcsrchr("\\/:", result_pos[-1]) == NULL) {
+ result_pos[0] = L'\\';
+ result_pos++;
+ }
+@@ -265,7 +265,7 @@ static WCHAR* path_search_walk_ext(const
+ if (name_has_ext) {
+ result = search_path_join_test(dir, dir_len,
+ name, name_len,
+- L"", 0,
++ "", 0,
+ cwd, cwd_len);
+ if (result != NULL) {
+ return result;
+@@ -275,7 +275,7 @@ static WCHAR* path_search_walk_ext(const
+ /* Try .com extension */
+ result = search_path_join_test(dir, dir_len,
+ name, name_len,
+- L"com", 3,
++ "com", 3,
+ cwd, cwd_len);
+ if (result != NULL) {
+ return result;
+@@ -284,7 +284,7 @@ static WCHAR* path_search_walk_ext(const
+ /* Try .exe extension */
+ result = search_path_join_test(dir, dir_len,
+ name, name_len,
+- L"exe", 3,
++ "exe", 3,
+ cwd, cwd_len);
+ if (result != NULL) {
+ return result;
+@@ -386,7 +386,7 @@ static WCHAR* search_path(const WCHAR *f
+ dir_end = path;
+
+ /* The file is really only a name; look in cwd first, then scan path */
+- result = path_search_walk_ext(L"", 0,
++ result = path_search_walk_ext("", 0,
+ file, file_len,
+ cwd, cwd_len,
+ name_has_ext);
+@@ -463,14 +463,14 @@ WCHAR* quote_cmd_arg(const WCHAR *source
+ return target;
+ }
+
+- if (NULL == wcspbrk(source, L" \t\"")) {
++ if (NULL == wcspbrk(source, " \t\"")) {
+ /* No quotation needed */
+ wcsncpy(target, source, len);
+ target += len;
+ return target;
+ }
+
+- if (NULL == wcspbrk(source, L"\"\\")) {
++ if (NULL == wcspbrk(source, "\"\\")) {
+ /*
+ * No embedded double quotes or backlashes, so I can just wrap
+ * quote marks around the whole thing.
+@@ -613,11 +613,11 @@ error:
+ }
+
+
+-int env_strncmp(const wchar_t* a, int na, const wchar_t* b) {
+- wchar_t* a_eq;
+- wchar_t* b_eq;
+- wchar_t* A;
+- wchar_t* B;
++int env_strncmp(const char* a, int na, const char* b) {
++ char* a_eq;
++ char* b_eq;
++ char* A;
++ char* B;
+ int nb;
+ int r;
+
+@@ -632,8 +632,8 @@ int env_strncmp(const wchar_t* a, int na
+ assert(b_eq);
+ nb = b_eq - b;
+
+- A = alloca((na+1) * sizeof(wchar_t));
+- B = alloca((nb+1) * sizeof(wchar_t));
++ A = alloca((na+1) * sizeof(char));
++ B = alloca((nb+1) * sizeof(char));
+
+ r = LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, a, na, A, na);
+ assert(r==na);
+@@ -643,8 +643,8 @@ int env_strncmp(const wchar_t* a, int na
+ B[nb] = L'\0';
+
+ while (1) {
+- wchar_t AA = *A++;
+- wchar_t BB = *B++;
++ char AA = *A++;
++ char BB = *B++;
+ if (AA < BB) {
+ return -1;
+ } else if (AA > BB) {
+@@ -657,8 +657,8 @@ int env_strncmp(const wchar_t* a, int na
+
+
+ static int qsort_wcscmp(const void *a, const void *b) {
+- wchar_t* astr = *(wchar_t* const*)a;
+- wchar_t* bstr = *(wchar_t* const*)b;
++ char* astr = *(char* const*)a;
++ char* bstr = *(char* const*)b;
+ return env_strncmp(astr, -1, bstr);
+ }
+
+@@ -741,7 +741,7 @@ int make_program_env(char* env_block[],
+ assert(env_len == 0 || env_len == (size_t) (ptr - dst_copy));
+
+ /* sort our (UTF-16) copy */
+- qsort(env_copy, env_block_count-1, sizeof(wchar_t*), qsort_wcscmp);
++ qsort(env_copy, env_block_count-1, sizeof(char*), qsort_wcscmp);
+
+ /* third pass: check for required variables */
+ for (ptr_copy = env_copy, i = 0; i < ARRAY_SIZE(required_vars); ) {
+@@ -1024,7 +1024,7 @@ int uv_spawn(uv_loop_t* loop,
+ if (path == NULL) {
+ DWORD path_len, r;
+
+- path_len = GetEnvironmentVariableW(L"PATH", NULL, 0);
++ path_len = GetEnvironmentVariableW("PATH", NULL, 0);
+ if (path_len == 0) {
+ err = GetLastError();
+ goto done;
+@@ -1037,7 +1037,7 @@ int uv_spawn(uv_loop_t* loop,
+ }
+ path = alloc_path;
+
+- r = GetEnvironmentVariableW(L"PATH", path, path_len);
++ r = GetEnvironmentVariableW("PATH", path, path_len);
+ if (r == 0 || r >= path_len) {
+ err = GetLastError();
+ goto done;
+diff -urp a/Utilities/cmlibuv/src/win/util.c b/Utilities/cmlibuv/src/win/util.c
+--- a/Utilities/cmlibuv/src/win/util.c 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/cmlibuv/src/win/util.c 2021-02-11 18:43:34.119190796 +0330
+@@ -548,7 +548,7 @@ int uv_uptime(double* uptime) {
+
+ data_size = (DWORD) buffer_size;
+ result = RegQueryValueExW(HKEY_PERFORMANCE_DATA,
+- L"2",
++ "2",
+ NULL,
+ NULL,
+ buffer,
+@@ -580,7 +580,7 @@ int uv_uptime(double* uptime) {
+
+ data_block = (PERF_DATA_BLOCK*) buffer;
+
+- if (wmemcmp(data_block->Signature, L"PERF", 4) != 0)
++ if (wmemcmp(data_block->Signature, "PERF", 4) != 0)
+ goto internalError;
+
+ if (data_size < data_block->HeaderLength + sizeof(*object_type))
+@@ -686,7 +686,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_info
+
+ len = _snwprintf(key_name,
+ ARRAY_SIZE(key_name),
+- L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%d",
++ "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%d",
+ i);
+
+ assert(len > 0 && len < ARRAY_SIZE(key_name));
+@@ -701,7 +701,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_info
+ }
+
+ err = RegQueryValueExW(processor_key,
+- L"~MHz",
++ "~MHz",
+ NULL,
+ NULL,
+ (BYTE*)&cpu_speed,
+@@ -712,7 +712,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_info
+ }
+
+ err = RegQueryValueExW(processor_key,
+- L"ProcessorNameString",
++ "ProcessorNameString",
+ NULL,
+ NULL,
+ (BYTE*)&cpu_brand,
+@@ -1195,7 +1195,7 @@ int uv_os_homedir(char* buffer, size_t*
+
+
+ int uv_os_tmpdir(char* buffer, size_t* size) {
+- wchar_t *path;
++ char *path;
+ DWORD bufsize;
+ size_t len;
+
+@@ -1209,7 +1209,7 @@ int uv_os_tmpdir(char* buffer, size_t* s
+ }
+ /* Include space for terminating null char. */
+ len += 1;
+- path = uv__malloc(len * sizeof(wchar_t));
++ path = uv__malloc(len * sizeof(char));
+ if (path == NULL) {
+ return UV_ENOMEM;
+ }
+@@ -1368,8 +1368,8 @@ int uv__convert_utf8_to_utf16(const char
+
+ int uv__getpwuid_r(uv_passwd_t* pwd) {
+ HANDLE token;
+- wchar_t username[UNLEN + 1];
+- wchar_t *path;
++ char username[UNLEN + 1];
++ char *path;
+ DWORD bufsize;
+ int r;
+
+@@ -1388,7 +1388,7 @@ int uv__getpwuid_r(uv_passwd_t* pwd) {
+ return uv_translate_sys_error(r);
+ }
+
+- path = uv__malloc(bufsize * sizeof(wchar_t));
++ path = uv__malloc(bufsize * sizeof(char));
+ if (path == NULL) {
+ CloseHandle(token);
+ return UV_ENOMEM;
+@@ -1445,8 +1445,8 @@ int uv_os_get_passwd(uv_passwd_t* pwd) {
+
+
+ int uv_os_environ(uv_env_item_t** envitems, int* count) {
+- wchar_t* env;
+- wchar_t* penv;
++ char* env;
++ char* penv;
+ int i, cnt;
+ uv_env_item_t* envitem;
+
+@@ -1516,10 +1516,10 @@ fail:
+
+
+ int uv_os_getenv(const char* name, char* buffer, size_t* size) {
+- wchar_t fastvar[512];
+- wchar_t* var;
++ char fastvar[512];
++ char* var;
+ DWORD varlen;
+- wchar_t* name_w;
++ char* name_w;
+ DWORD bufsize;
+ size_t len;
+ int r;
+@@ -1611,8 +1611,8 @@ fail:
+
+
+ int uv_os_setenv(const char* name, const char* value) {
+- wchar_t* name_w;
+- wchar_t* value_w;
++ char* name_w;
++ char* value_w;
+ int r;
+
+ if (name == NULL || value == NULL)
+@@ -1642,7 +1642,7 @@ int uv_os_setenv(const char* name, const
+
+
+ int uv_os_unsetenv(const char* name) {
+- wchar_t* name_w;
++ char* name_w;
+ int r;
+
+ if (name == NULL)
+@@ -1820,7 +1820,7 @@ int uv_os_uname(uv_utsname_t* buffer) {
+ /* Populate the version field. */
+ version_size = 0;
+ r = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+- L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
++ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
+ 0,
+ KEY_QUERY_VALUE,
+ &registry_key);
+@@ -1829,7 +1829,7 @@ int uv_os_uname(uv_utsname_t* buffer) {
+ product_name_w_size = sizeof(product_name_w);
+ r = RegGetValueW(registry_key,
+ NULL,
+- L"ProductName",
++ "ProductName",
+ RRF_RT_REG_SZ,
+ NULL,
+ (PVOID) product_name_w,
+diff -urp a/Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp b/Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp
+--- a/Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp 2021-02-11 18:43:33.649183363 +0330
+@@ -6,39 +6,39 @@
+ #include <msi.h>
+ #include <msiquery.h>
+
+-std::wstring get_property(MSIHANDLE msi_handle, std::wstring const& name)
++std::string get_property(MSIHANDLE msi_handle, std::string const& name)
+ {
+ DWORD size = 0;
+
+- WCHAR value_buffer[] = L"";
++ WCHAR value_buffer[] = "";
+ UINT status = MsiGetPropertyW(msi_handle, name.c_str(), value_buffer, &size);
+
+ if (status == ERROR_MORE_DATA) {
+- std::vector<wchar_t> buffer(size + 1);
++ std::vector<char> buffer(size + 1);
+ MsiGetPropertyW(msi_handle, name.c_str(), &buffer[0], &size);
+- return std::wstring(&buffer[0]);
++ return std::string(&buffer[0]);
+ } else {
+- return std::wstring();
++ return std::string();
+ }
+ }
+
+-void set_property(MSIHANDLE msi_handle, std::wstring const& name,
+- std::wstring const& value)
++void set_property(MSIHANDLE msi_handle, std::string const& name,
++ std::string const& value)
+ {
+ MsiSetPropertyW(msi_handle, name.c_str(), value.c_str());
+ }
+
+ extern "C" UINT __stdcall DetectNsisOverwrite(MSIHANDLE msi_handle)
+ {
+- std::wstring install_root = get_property(msi_handle, L"INSTALL_ROOT");
++ std::string install_root = get_property(msi_handle, "INSTALL_ROOT");
+
+- std::wstring uninstall_exe = install_root + L"\\uninstall.exe";
++ std::string uninstall_exe = install_root + "\\uninstall.exe";
+
+ bool uninstall_exe_exists =
+ GetFileAttributesW(uninstall_exe.c_str()) != INVALID_FILE_ATTRIBUTES;
+
+- set_property(msi_handle, L"CMAKE_NSIS_OVERWRITE_DETECTED",
+- uninstall_exe_exists ? L"1" : L"0");
++ set_property(msi_handle, "CMAKE_NSIS_OVERWRITE_DETECTED",
++ uninstall_exe_exists ? "1" : "0");
+
+ return ERROR_SUCCESS;
+ }
+diff -urp a/Utilities/std/cm/filesystem b/Utilities/std/cm/filesystem
+--- a/Utilities/std/cm/filesystem 2021-01-28 18:58:45.000000000 +0330
++++ b/Utilities/std/cm/filesystem 2021-02-12 14:39:55.154859796 +0330
+@@ -98,7 +98,7 @@ class unicode<Char, typename std::enable
+ {
+ public:
+ // UTF32 -> UTF8
+- static std::string to_utf8(const std::wstring& str)
++ static std::string to_utf8(const std::string& str)
+ {
+ std::string result;
+ for (auto c : str) {
+@@ -114,9 +114,9 @@ public:
+ }
+
+ // UTF8 -> UTF32
+- static std::wstring from_utf8(const std::string& str)
++ static std::string from_utf8(const std::string& str)
+ {
+- std::wstring result;
++ std::string result;
+ result.reserve(str.length());
+ auto iter = str.begin();
+ utf8_state state = s_start;
+@@ -124,29 +124,29 @@ public:
+ while (iter < str.end()) {
+ if ((state = decode(state, static_cast<std::uint8_t>(*iter++),
+ codepoint)) == s_start) {
+- result += static_cast<std::wstring::value_type>(codepoint);
++ result += static_cast<std::string::value_type>(codepoint);
+ codepoint = 0;
+ } else if (state == s_reject) {
+- result += static_cast<std::wstring::value_type>(0xfffd);
++ result += static_cast<std::string::value_type>(0xfffd);
+ state = s_start;
+ codepoint = 0;
+ }
+ }
+ if (state) {
+- result += static_cast<std::wstring::value_type>(0xfffd);
++ result += static_cast<std::string::value_type>(0xfffd);
+ }
+ return result;
+ }
+- static std::wstring from_utf8(char c)
++ static std::string from_utf8(char c)
+ {
+- std::wstring result;
++ std::string result;
+ utf8_state state = s_start;
+ std::uint32_t codepoint = 0;
+ if ((state = decode(state, static_cast<std::uint8_t>(c), codepoint)) ==
+ s_start) {
+- result += static_cast<std::wstring::value_type>(codepoint);
++ result += static_cast<std::string::value_type>(codepoint);
+ } else {
+- result += static_cast<std::wstring::value_type>(0xfffd);
++ result += static_cast<std::string::value_type>(0xfffd);
+ }
+
+ return result;
+@@ -159,7 +159,7 @@ class unicode<Char, typename std::enable
+ {
+ public:
+ // UTF16 -> UTF8
+- static std::string to_utf8(const std::wstring& str)
++ static std::string to_utf8(const std::string& str)
+ {
+ std::string result;
+ for (auto iter = str.begin(); iter != str.end(); ++iter) {
+@@ -193,9 +193,9 @@ public:
+ }
+
+ // UTF8 -> UTF16
+- static std::wstring from_utf8(const std::string& str)
++ static std::string from_utf8(const std::string& str)
+ {
+- std::wstring result;
++ std::string result;
+ result.reserve(str.length());
+ auto iter = str.begin();
+ utf8_state state = s_start;
+@@ -204,95 +204,91 @@ public:
+ if ((state = decode(state, static_cast<std::uint8_t>(*iter++),
+ codepoint)) == s_start) {
+ if (codepoint <= 0xffff) {
+- result += static_cast<std::wstring::value_type>(codepoint);
++ result += static_cast<std::string::value_type>(codepoint);
+ } else {
+ codepoint -= 0x10000;
+ result +=
+- static_cast<std::wstring::value_type>((codepoint >> 10) + 0xd800);
+- result += static_cast<std::wstring::value_type>((codepoint & 0x3ff) +
++ static_cast<std::string::value_type>((codepoint >> 10) + 0xd800);
++ result += static_cast<std::string::value_type>((codepoint & 0x3ff) +
+ 0xdc00);
+ }
+ codepoint = 0;
+ } else if (state == s_reject) {
+- result += static_cast<std::wstring::value_type>(0xfffd);
++ result += static_cast<std::string::value_type>(0xfffd);
+ state = s_start;
+ codepoint = 0;
+ }
+ }
+ if (state) {
+- result += static_cast<std::wstring::value_type>(0xfffd);
++ result += static_cast<std::string::value_type>(0xfffd);
+ }
+ return result;
+ }
+- static std::wstring from_utf8(char c)
++ static std::string from_utf8(char c)
+ {
+- std::wstring result;
++ std::string result;
+ utf8_state state = s_start;
+ std::uint32_t codepoint = 0;
+ if ((state = decode(state, static_cast<std::uint8_t>(c), codepoint)) ==
+ s_start) {
+ if (codepoint <= 0xffff) {
+- result += static_cast<std::wstring::value_type>(codepoint);
++ result += static_cast<std::string::value_type>(codepoint);
+ } else {
+ codepoint -= 0x10000;
+ result +=
+- static_cast<std::wstring::value_type>((codepoint >> 10) + 0xd800);
++ static_cast<std::string::value_type>((codepoint >> 10) + 0xd800);
+ result +=
+- static_cast<std::wstring::value_type>((codepoint & 0x3ff) + 0xdc00);
++ static_cast<std::string::value_type>((codepoint & 0x3ff) + 0xdc00);
+ }
+ } else {
+- result += static_cast<std::wstring::value_type>(0xfffd);
++ result += static_cast<std::string::value_type>(0xfffd);
+ }
+ return result;
+ }
+ };
+
+-template <typename In, typename Out>
+-class unicode_converter;
+-
+-template <>
+-class unicode_converter<char, wchar_t>
++template <typename Char>
++class unicode<Char, typename std::enable_if<(sizeof(Char) == 1)>::type>
++ : public unicode_helper
+ {
+ public:
+- std::wstring operator()(const std::string& in)
++ // UTF8 -> UTF8
++ static std::string to_utf8(const std::string& str)
+ {
+- return unicode<wchar_t>::from_utf8(in);
++ return str;
+ }
+- std::wstring operator()(const char* in)
++ static std::string to_utf8(Char c)
+ {
+- return unicode<wchar_t>::from_utf8(in);
++ return c;
+ }
+- std::wstring operator()(char in) { return unicode<wchar_t>::from_utf8(in); }
+-};
+-template <>
+-class unicode_converter<wchar_t, char>
+-{
+-public:
+- std::string operator()(const std::wstring& in)
++
++ // UTF8 -> UTF8
++ static std::string from_utf8(const std::string& str)
+ {
+- return unicode<wchar_t>::to_utf8(in);
++ return str;
+ }
+- std::string operator()(const wchar_t* in)
++ static std::string from_utf8(char c)
+ {
+- return unicode<wchar_t>::to_utf8(in);
++ return std::string(1, c);
+ }
+- std::string operator()(wchar_t in) { return unicode<wchar_t>::to_utf8(in); }
+ };
++
++template <typename In, typename Out>
++class unicode_converter;
++
+ template <>
+ class unicode_converter<char, char>
+ {
+ public:
+- std::string operator()(const std::string& in) { return in; }
+- std::string operator()(const char* in) { return std::string(in); }
+- std::string operator()(char in) { return std::string(1, in); }
+-};
+-template <>
+-class unicode_converter<wchar_t, wchar_t>
+-{
+-public:
+- std::wstring operator()(const std::wstring& in) { return in; }
+- std::wstring operator()(const wchar_t* in) { return std::wstring(in); }
+- std::wstring operator()(wchar_t in) { return std::wstring(1, in); }
++ std::string operator()(const std::string& in)
++ {
++ return unicode<char>::from_utf8(in);
++ }
++ std::string operator()(const char* in)
++ {
++ return unicode<char>::from_utf8(in);
++ }
++ std::string operator()(char in) { return unicode<char>::from_utf8(in); }
+ };
+
+ template <typename In>
+@@ -344,50 +340,6 @@ struct string_converter<char>
+ return std::basic_string<Char>(unicode_converter<char, Char>()(in));
+ }
+ };
+-template <>
+-struct string_converter<wchar_t>
+-{
+- // some compilers, like gcc 4.8 does not implement the following C++11
+- // signature:
+- // std::string::string(const string&, const Allocator&)
+- // As workaround, use char* pointer.
+- template <typename Char, typename Traits, typename Alloc>
+- static std::basic_string<Char, Traits, Alloc> to(const std::wstring& in,
+- const Alloc& a)
+- {
+- return std::basic_string<Char, Traits, Alloc>(
+- unicode_converter<wchar_t, Char>()(in).c_str(), a);
+- }
+- template <typename Char, typename Traits, typename Alloc>
+- static std::basic_string<Char, Traits, Alloc> to(const wchar_t* in,
+- const Alloc& a)
+- {
+- return std::basic_string<Char, Traits, Alloc>(
+- unicode_converter<wchar_t, Char>()(in).c_str(), a);
+- }
+- template <typename Char, typename Traits, typename Alloc>
+- static std::basic_string<Char, Traits, Alloc> to(wchar_t in, const Alloc& a)
+- {
+- return std::basic_string<Char, Traits, Alloc>(
+- unicode_converter<wchar_t, Char>()(in).c_str(), a);
+- }
+-
+- template <typename Char>
+- static std::basic_string<Char> to(const std::wstring& in)
+- {
+- return std::basic_string<Char>(unicode_converter<wchar_t, Char>()(in));
+- }
+- template <typename Char>
+- static std::basic_string<Char> to(const wchar_t* in)
+- {
+- return std::basic_string<Char>(unicode_converter<wchar_t, Char>()(in));
+- }
+- template <typename Char>
+- static std::basic_string<Char> to(wchar_t in)
+- {
+- return std::basic_string<Char>(unicode_converter<wchar_t, Char>()(in));
+- }
+-};
+
+ template <typename T, typename = void>
+ struct source_traits
+@@ -470,54 +422,6 @@ struct source_converter<char, char>
+ static void set_source(std::string& p, std::string&& s) { p = std::move(s); }
+ };
+
+-template <>
+-struct source_converter<wchar_t, char>
+-{
+- template <typename Iterator>
+- static void append_range(std::string& p, Iterator b, Iterator e)
+- {
+- if (b == e) {
+- return;
+- }
+-
+- std::wstring tmp(b, e);
+- std::string dest = string_converter<wchar_t>::to<char>(tmp);
+- p.append(dest.begin(), dest.end());
+- }
+- template <typename Iterator>
+- static void append_range(std::string& p, Iterator b)
+- {
+- wchar_t e = '\0';
+-
+- if (*b == e) {
+- return;
+- }
+- std::wstring tmp;
+- for (; *b != e; ++b) {
+- tmp.push_back(*b);
+- }
+-
+- std::string dest = string_converter<wchar_t>::to<char>(tmp);
+- p.append(dest.begin(), dest.end());
+- }
+-
+- template <typename Traits, typename Alloc>
+- static void append_source(std::string& p,
+- const std::basic_string<wchar_t, Traits, Alloc>& s)
+- {
+- append_range(p, s.begin(), s.end());
+- }
+- template <typename Source>
+- static void append_source(std::string& p, const Source& s)
+- {
+- append_range(p, s);
+- }
+-
+- static void set_source(std::string& p, std::wstring&& s)
+- {
+- p = string_converter<wchar_t>::to<char>(s);
+- }
+-};
+
+ template <typename T>
+ struct is_pathable_string : std::false_type
+@@ -528,11 +432,6 @@ struct is_pathable_string<std::basic_str
+ : std::true_type
+ {
+ };
+-template <typename Traits, typename Alloc>
+-struct is_pathable_string<std::basic_string<wchar_t, Traits, Alloc>>
+- : std::true_type
+-{
+-};
+ template <>
+ struct is_pathable_string<cm::string_view> : std::true_type
+ {
+@@ -547,10 +446,10 @@ struct is_pathable_char_array<
+ T,
+ cm::enable_if_t<
+ std::is_same<char*, typename std::decay<T>::type>::value ||
+- std::is_same<wchar_t*, typename std::decay<T>::type>::value,
++ std::is_same<char*, typename std::decay<T>::type>::value,
+ void>>
+ : bool_constant<std::is_same<char*, typename std::decay<T>::type>::value ||
+- std::is_same<wchar_t*, typename std::decay<T>::type>::value>
++ std::is_same<char*, typename std::decay<T>::type>::value>
+ {
+ };
+
+@@ -566,7 +465,7 @@ struct is_pathable_iterator<
+ (std::is_same<char,
+ typename std::iterator_traits<
+ typename std::decay<T>::type>::value_type>::value ||
+- std::is_same<wchar_t,
++ std::is_same<char,
+ typename std::iterator_traits<
+ typename std::decay<T>::type>::value_type>::value),
+ void>>
+@@ -574,7 +473,7 @@ struct is_pathable_iterator<
+ std::is_same<char,
+ typename std::iterator_traits<
+ typename std::decay<T>::type>::value_type>::value ||
+- std::is_same<wchar_t,
++ std::is_same<char,
+ typename std::iterator_traits<
+ typename std::decay<T>::type>::value_type>::value>
+ {
+@@ -616,7 +515,7 @@ class path
+
+ public:
+ # if defined(_WIN32) && !defined(__CYGWIN__)
+- using value_type = wchar_t;
++ using value_type = char;
+ # else
+ using value_type = char;
+ # endif
+@@ -860,8 +759,8 @@ public:
+ typename Alloc = std::allocator<Char>,
+ cm::enable_if_t<(std::is_same<Char, char>::value &&
+ std::is_same<Traits, std::char_traits<char>>::value) ||
+- (std::is_same<Char, wchar_t>::value &&
+- std::is_same<Traits, std::char_traits<wchar_t>>::value),
++ (std::is_same<Char, char>::value &&
++ std::is_same<Traits, std::char_traits<char>>::value),
+ int> = 1>
+ std::basic_string<Char, Traits, Alloc> string(const Alloc& a = Alloc()) const
+ {
+@@ -870,11 +769,11 @@ public:
+ this->path_, a);
+ }
+ const std::string string() const { return this->path_; }
+- std::wstring wstring() const
++ std::string wstring() const
+ {
+ std::string out = this->string();
+ return internals::string_converter<path_type::value_type>::to<
+- std::wstring::value_type>(out);
++ std::string::value_type>(out);
+ }
+
+ template <
+@@ -882,8 +781,8 @@ public:
+ typename Alloc = std::allocator<Char>,
+ cm::enable_if_t<(std::is_same<Char, char>::value &&
+ std::is_same<Traits, std::char_traits<char>>::value) ||
+- (std::is_same<Char, wchar_t>::value &&
+- std::is_same<Traits, std::char_traits<wchar_t>>::value),
++ (std::is_same<Char, char>::value &&
++ std::is_same<Traits, std::char_traits<char>>::value),
+ int> = 1>
+ std::basic_string<Char, Traits, Alloc> generic_string(
+ const Alloc& a = Alloc()) const
+@@ -893,11 +792,11 @@ public:
+ this->get_generic(), a);
+ }
+ std::string generic_string() const { return this->get_generic(); }
+- std::wstring generic_wstring() const
++ std::string generic_wstring() const
+ {
+ auto dest = this->generic_string();
+ return internals::string_converter<path_type::value_type>::to<
+- std::wstring::value_type>(dest);
++ std::string::value_type>(dest);
+ }
+
+ // Compare
diff --git a/Ports/cmake/patches/0002-stoi-atoi.patch b/Ports/cmake/patches/0002-stoi-atoi.patch
new file mode 100644
index 0000000000..c508c046f1
--- /dev/null
+++ b/Ports/cmake/patches/0002-stoi-atoi.patch
@@ -0,0 +1,62 @@
+From f9a88260a01aff91971ca88030b74e916a5daa39 Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Thu, 11 Feb 2021 19:25:37 +0330
+Subject: [PATCH 02/11] stoi -> atoi
+
+---
+ Source/cmForEachCommand.cxx | 2 +-
+ Source/cmStandardLevelResolver.cxx | 4 ++--
+ Source/cmVSSetupHelper.cxx | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/Source/cmForEachCommand.cxx b/Source/cmForEachCommand.cxx
+index bcacb15..c74cbdb 100644
+--- a/Source/cmForEachCommand.cxx
++++ b/Source/cmForEachCommand.cxx
+@@ -359,7 +359,7 @@ bool HandleInMode(std::vector<std::string> const& args,
+ bool TryParseInteger(cmExecutionStatus& status, const std::string& str, int& i)
+ {
+ try {
+- i = std::stoi(str);
++ i = atoi((str).c_str());
+ } catch (std::invalid_argument&) {
+ std::ostringstream e;
+ e << "Invalid integer: '" << str << "'";
+diff --git a/Source/cmStandardLevelResolver.cxx b/Source/cmStandardLevelResolver.cxx
+index 8672f61..c418b09 100644
+--- a/Source/cmStandardLevelResolver.cxx
++++ b/Source/cmStandardLevelResolver.cxx
+@@ -116,7 +116,7 @@ struct StanardLevelComputer
+ int standardValue = -1;
+ int defaultValue = -1;
+ try {
+- standardValue = std::stoi(standardStr);
++ standardValue = atoi((standardStr).c_str());
+ defaultValue = std::stoi(*defaultStd);
+ } catch (std::invalid_argument&) {
+ // fall through as we want an error
+@@ -532,7 +532,7 @@ bool cmStandardLevelResolver::IsLaterStandard(std::string const& lang,
+ {
+ auto mapping = StandardComputerMapping.find(lang);
+ if (mapping != cm::cend(StandardComputerMapping)) {
+- return mapping->second.IsLaterStandard(std::stoi(lhs), std::stoi(rhs));
++ return mapping->second.IsLaterStandard(atoi((lhs).c_str()), atoi((rhs).c_str()));
+ }
+ return false;
+ }
+diff --git a/Source/cmVSSetupHelper.cxx b/Source/cmVSSetupHelper.cxx
+index 6aa0d15..a4dac5e 100644
+--- a/Source/cmVSSetupHelper.cxx
++++ b/Source/cmVSSetupHelper.cxx
+@@ -318,7 +318,7 @@ bool cmVSSetupAPIHelper::EnumerateAndChooseVSInstance()
+ chosenInstanceInfo.Version =
+ std::string(envVSVersion.begin(), envVSVersion.end());
+ chosenInstanceInfo.VCToolsetVersion = envVSVersion;
+- chosenInstanceInfo.ullVersion = std::stoi(envVSVersion);
++ chosenInstanceInfo.ullVersion = atoi((envVSVersion).c_str());
+ chosenInstanceInfo.IsWin10SDKInstalled = true;
+ chosenInstanceInfo.IsWin81SDKInstalled = !envWindowsSdkDir81.empty();
+ return true;
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0003-stoi-atoi-2.patch b/Ports/cmake/patches/0003-stoi-atoi-2.patch
new file mode 100644
index 0000000000..8d55dcc0af
--- /dev/null
+++ b/Ports/cmake/patches/0003-stoi-atoi-2.patch
@@ -0,0 +1,122 @@
+From ba18f1f52135b3dc08e4c7889f214807ce6bb966 Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Thu, 11 Feb 2021 19:35:50 +0330
+Subject: [PATCH 03/11] stoi -> atoi 2
+
+---
+ Source/cmFileCommand.cxx | 2 +-
+ Source/cmListCommand.cxx | 22 +++++++++++-----------
+ Source/cmStandardLevelResolver.cxx | 8 ++++----
+ 3 files changed, 16 insertions(+), 16 deletions(-)
+
+diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
+index 372179c..ea9631a 100644
+--- a/Source/cmFileCommand.cxx
++++ b/Source/cmFileCommand.cxx
+@@ -3104,7 +3104,7 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
+ cmSystemTools::SetFatalErrorOccured();
+ return false;
+ }
+- compressionLevel = std::stoi(parsedArgs.CompressionLevel);
++ compressionLevel = atoi((parsedArgs.CompressionLevel).c_str());
+ if (compressionLevel < 0 || compressionLevel > 9) {
+ status.SetError(cmStrCat("compression level ",
+ parsedArgs.CompressionLevel,
+diff --git a/Source/cmListCommand.cxx b/Source/cmListCommand.cxx
+index 687273e..a79074d 100644
+--- a/Source/cmListCommand.cxx
++++ b/Source/cmListCommand.cxx
+@@ -901,12 +901,12 @@ bool HandleTransformCommand(std::vector<std::string> const& args,
+ // get all specified indexes
+ std::vector<int> indexes;
+ while (args.size() > ++index) {
+- std::size_t pos;
++ char* pos;
+ int value;
+
+ try {
+- value = std::stoi(args[index], &pos);
+- if (pos != args[index].length()) {
++ value = strtol(args[index].c_str(), &pos, 10);
++ if (pos != args[index].c_str() + args[index]) {
+ // this is not a number, stop processing
+ break;
+ }
+@@ -944,15 +944,15 @@ bool HandleTransformCommand(std::vector<std::string> const& args,
+ int step = 1;
+ bool valid = true;
+ try {
+- std::size_t pos;
++ char* pos;
+
+- start = std::stoi(args[index], &pos);
+- if (pos != args[index].length()) {
++ start = strtol(args[index].c_str(), &pos, 10);
++ if (pos != args[index].c_str() + args[index].length()) {
+ // this is not a number
+ valid = false;
+ } else {
+- stop = std::stoi(args[++index], &pos);
+- if (pos != args[index].length()) {
++ start = strtol(args[++index].c_str(), &pos, 10);
++ if (pos != args[index].c_str() + args[index].length()) {
+ // this is not a number
+ valid = false;
+ }
+@@ -969,10 +969,10 @@ bool HandleTransformCommand(std::vector<std::string> const& args,
+ // try to read a third numeric value for step
+ if (args.size() > ++index) {
+ try {
+- std::size_t pos;
++ char* pos;
+
+- step = std::stoi(args[index], &pos);
+- if (pos != args[index].length()) {
++ start = strtol(args[index].c_str(), &pos, 10);
++ if (pos != args[index].c_str() + args[index].length()) {
+ // this is not a number
+ step = 1;
+ } else {
+diff --git a/Source/cmStandardLevelResolver.cxx b/Source/cmStandardLevelResolver.cxx
+index c418b09..50510e4 100644
+--- a/Source/cmStandardLevelResolver.cxx
++++ b/Source/cmStandardLevelResolver.cxx
+@@ -117,7 +117,7 @@ struct StanardLevelComputer
+ int defaultValue = -1;
+ try {
+ standardValue = atoi((standardStr).c_str());
+- defaultValue = std::stoi(*defaultStd);
++ defaultValue = atoi((*defaultStd).c_str());
+ } catch (std::invalid_argument&) {
+ // fall through as we want an error
+ // when we can't find the bad value in the `stds` vector
+@@ -195,7 +195,7 @@ struct StanardLevelComputer
+ if (existingStandard) {
+ existingLevelIter =
+ std::find(cm::cbegin(this->Levels), cm::cend(this->Levels),
+- std::stoi(*existingStandard));
++ atoi((*existingStandard).c_str()));
+ if (existingLevelIter == cm::cend(this->Levels)) {
+ const std::string e =
+ cmStrCat("The ", this->Language, "_STANDARD property on target \"",
+@@ -240,7 +240,7 @@ struct StanardLevelComputer
+ }
+ // convert defaultStandard to an integer
+ if (std::find(cm::cbegin(this->Levels), cm::cend(this->Levels),
+- std::stoi(*defaultStandard)) == cm::cend(this->Levels)) {
++ atoi((*defaultStandard).c_str())) == cm::cend(this->Levels)) {
+ const std::string e = cmStrCat("The CMAKE_", this->Language,
+ "_STANDARD_DEFAULT variable contains an "
+ "invalid value: \"",
+@@ -257,7 +257,7 @@ struct StanardLevelComputer
+
+ auto existingLevelIter =
+ std::find(cm::cbegin(this->Levels), cm::cend(this->Levels),
+- std::stoi(*existingStandard));
++ atoi((*existingStandard).c_str()));
+ if (existingLevelIter == cm::cend(this->Levels)) {
+ const std::string e =
+ cmStrCat("The ", this->Language, "_STANDARD property on target \"",
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0004-snprintf.patch b/Ports/cmake/patches/0004-snprintf.patch
new file mode 100644
index 0000000000..1c92b59791
--- /dev/null
+++ b/Ports/cmake/patches/0004-snprintf.patch
@@ -0,0 +1,113 @@
+From a624e066281d23fe8d5e36768e15ddf847693179 Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Thu, 11 Feb 2021 21:04:56 +0330
+Subject: [PATCH 04/11] snprintf!
+
+---
+ Modules/FindCUDA/select_compute_arch.cmake | 2 +-
+ Source/cmProjectCommand.cxx | 2 +-
+ Source/cmStringAlgorithms.cxx | 2 +-
+ Tests/RunCMake/Android/android.cxx | 2 +-
+ Utilities/cmjsoncpp/src/lib_json/json_reader.cpp | 4 ++--
+ Utilities/cmjsoncpp/src/lib_json/json_writer.cpp | 4 ++--
+ 6 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/Modules/FindCUDA/select_compute_arch.cmake b/Modules/FindCUDA/select_compute_arch.cmake
+index 9351288..6b31fc2 100644
+--- a/Modules/FindCUDA/select_compute_arch.cmake
++++ b/Modules/FindCUDA/select_compute_arch.cmake
+@@ -132,7 +132,7 @@ function(CUDA_DETECT_INSTALLED_GPUS OUT_VARIABLE)
+ " {\n"
+ " cudaDeviceProp prop;\n"
+ " if (cudaSuccess == cudaGetDeviceProperties(&prop, device))\n"
+- " std::printf(\"%d.%d \", prop.major, prop.minor);\n"
++ " printf(\"%d.%d \", prop.major, prop.minor);\n"
+ " }\n"
+ " return 0;\n"
+ "}\n")
+diff --git a/Source/cmProjectCommand.cxx b/Source/cmProjectCommand.cxx
+index f8678b9..05a76ad 100644
+--- a/Source/cmProjectCommand.cxx
++++ b/Source/cmProjectCommand.cxx
+@@ -237,7 +237,7 @@ bool cmProjectCommand(std::vector<std::string> const& args,
+ &v[2], &v[3]);
+ for (auto i = 0u; i < MAX_VERSION_COMPONENTS; ++i) {
+ if (int(i) < vc) {
+- std::sprintf(vb[i], "%u", v[i]);
++ sprintf(vb[i], "%u", v[i]);
+ version_string += &"."[std::size_t(i == 0)];
+ version_string += vb[i];
+ version_components[i] = vb[i];
+diff --git a/Source/cmStringAlgorithms.cxx b/Source/cmStringAlgorithms.cxx
+index e0af281..f0a50cc 100644
+--- a/Source/cmStringAlgorithms.cxx
++++ b/Source/cmStringAlgorithms.cxx
+@@ -152,7 +152,7 @@ template <std::size_t N, typename T>
+ inline void MakeDigits(cm::string_view& view, char (&digits)[N],
+ const char* pattern, T value)
+ {
+- int res = std::snprintf(digits, N, pattern, value);
++ int res = snprintf(digits, N, pattern, value);
+ if (res > 0 && res < static_cast<int>(N)) {
+ view = cm::string_view(digits, static_cast<std::size_t>(res));
+ }
+diff --git a/Tests/RunCMake/Android/android.cxx b/Tests/RunCMake/Android/android.cxx
+index a6d8c55..f47611e 100644
+--- a/Tests/RunCMake/Android/android.cxx
++++ b/Tests/RunCMake/Android/android.cxx
+@@ -20,7 +20,7 @@ int main()
+ {
+ #if !defined(STL_NONE)
+ // Require -lm implied by linking as C++.
+- std::printf("%p\n", static_cast<double (*)(double)>(&std::sin));
++ printf("%p\n", static_cast<double (*)(double)>(&std::sin));
+ #endif
+ #if defined(STL_NONE)
+ return 0;
+diff --git a/Utilities/cmjsoncpp/src/lib_json/json_reader.cpp b/Utilities/cmjsoncpp/src/lib_json/json_reader.cpp
+index 6eeba0e..80389e5 100644
+--- a/Utilities/cmjsoncpp/src/lib_json/json_reader.cpp
++++ b/Utilities/cmjsoncpp/src/lib_json/json_reader.cpp
+@@ -24,7 +24,7 @@
+ #if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above
+ #define snprintf sprintf_s
+ #elif _MSC_VER >= 1900 // VC++ 14.0 and above
+-#define snprintf std::snprintf
++#define snprintf snprintf
+ #else
+ #define snprintf _snprintf
+ #endif
+@@ -32,7 +32,7 @@
+ #define snprintf snprintf
+ #elif __cplusplus >= 201103L
+ #if !defined(__MINGW32__) && !defined(__CYGWIN__)
+-#define snprintf std::snprintf
++#define snprintf snprintf
+ #endif
+ #endif
+
+diff --git a/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp b/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
+index fc86505..abaa661 100644
+--- a/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
++++ b/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
+@@ -50,7 +50,7 @@
+ #if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above
+ #define snprintf sprintf_s
+ #elif _MSC_VER >= 1900 // VC++ 14.0 and above
+-#define snprintf std::snprintf
++#define snprintf snprintf
+ #else
+ #define snprintf _snprintf
+ #endif
+@@ -58,7 +58,7 @@
+ #define snprintf snprintf
+ #elif __cplusplus >= 201103L
+ #if !defined(__MINGW32__) && !defined(__CYGWIN__)
+-#define snprintf std::snprintf
++#define snprintf snprintf
+ #endif
+ #endif
+
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0005-stod.patch b/Ports/cmake/patches/0005-stod.patch
new file mode 100644
index 0000000000..dbb3e9f898
--- /dev/null
+++ b/Ports/cmake/patches/0005-stod.patch
@@ -0,0 +1,207 @@
+From edc401ceb014f8ec5d80d3d2b7b7e9c1e86a27ed Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Thu, 11 Feb 2021 21:22:45 +0330
+Subject: [PATCH 05/11] stod
+
+---
+ Help/guide/importing-exporting/Downstream/main.cc | 2 +-
+ Help/guide/importing-exporting/DownstreamComponents/main.cc | 2 +-
+ Help/guide/tutorial/Complete/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step10/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step11/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step12/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step2/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step3/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step4/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step5/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step6/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step7/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step8/tutorial.cxx | 2 +-
+ Help/guide/tutorial/Step9/tutorial.cxx | 2 +-
+ 14 files changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/Help/guide/importing-exporting/Downstream/main.cc b/Help/guide/importing-exporting/Downstream/main.cc
+index 8574373..0956348 100644
+--- a/Help/guide/importing-exporting/Downstream/main.cc
++++ b/Help/guide/importing-exporting/Downstream/main.cc
+@@ -12,7 +12,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // calculate square root
+ const double sqrt = MathFunctions::sqrt(inputValue);
+diff --git a/Help/guide/importing-exporting/DownstreamComponents/main.cc b/Help/guide/importing-exporting/DownstreamComponents/main.cc
+index f5e8fa6..9f8be40 100644
+--- a/Help/guide/importing-exporting/DownstreamComponents/main.cc
++++ b/Help/guide/importing-exporting/DownstreamComponents/main.cc
+@@ -13,7 +13,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // calculate square root
+ const double sqrt = MathFunctions::sqrt(inputValue);
+diff --git a/Help/guide/tutorial/Complete/tutorial.cxx b/Help/guide/tutorial/Complete/tutorial.cxx
+index a4f44d5..06627a9 100644
+--- a/Help/guide/tutorial/Complete/tutorial.cxx
++++ b/Help/guide/tutorial/Complete/tutorial.cxx
+@@ -16,7 +16,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ const double outputValue = mathfunctions::sqrt(inputValue);
+
+diff --git a/Help/guide/tutorial/Step10/tutorial.cxx b/Help/guide/tutorial/Step10/tutorial.cxx
+index 37a0333..553f35a 100644
+--- a/Help/guide/tutorial/Step10/tutorial.cxx
++++ b/Help/guide/tutorial/Step10/tutorial.cxx
+@@ -17,7 +17,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ const double outputValue = mathfunctions::sqrt(inputValue);
+
+diff --git a/Help/guide/tutorial/Step11/tutorial.cxx b/Help/guide/tutorial/Step11/tutorial.cxx
+index a4f44d5..06627a9 100644
+--- a/Help/guide/tutorial/Step11/tutorial.cxx
++++ b/Help/guide/tutorial/Step11/tutorial.cxx
+@@ -16,7 +16,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ const double outputValue = mathfunctions::sqrt(inputValue);
+
+diff --git a/Help/guide/tutorial/Step12/tutorial.cxx b/Help/guide/tutorial/Step12/tutorial.cxx
+index a4f44d5..06627a9 100644
+--- a/Help/guide/tutorial/Step12/tutorial.cxx
++++ b/Help/guide/tutorial/Step12/tutorial.cxx
+@@ -16,7 +16,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ const double outputValue = mathfunctions::sqrt(inputValue);
+
+diff --git a/Help/guide/tutorial/Step2/tutorial.cxx b/Help/guide/tutorial/Step2/tutorial.cxx
+index 53b0810..7ab6adb 100644
+--- a/Help/guide/tutorial/Step2/tutorial.cxx
++++ b/Help/guide/tutorial/Step2/tutorial.cxx
+@@ -16,7 +16,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // calculate square root
+ const double outputValue = sqrt(inputValue);
+diff --git a/Help/guide/tutorial/Step3/tutorial.cxx b/Help/guide/tutorial/Step3/tutorial.cxx
+index b3c6a4f..7bfb60b 100644
+--- a/Help/guide/tutorial/Step3/tutorial.cxx
++++ b/Help/guide/tutorial/Step3/tutorial.cxx
+@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // which square root function should we use?
+ #ifdef USE_MYMATH
+diff --git a/Help/guide/tutorial/Step4/tutorial.cxx b/Help/guide/tutorial/Step4/tutorial.cxx
+index b3c6a4f..7bfb60b 100644
+--- a/Help/guide/tutorial/Step4/tutorial.cxx
++++ b/Help/guide/tutorial/Step4/tutorial.cxx
+@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // which square root function should we use?
+ #ifdef USE_MYMATH
+diff --git a/Help/guide/tutorial/Step5/tutorial.cxx b/Help/guide/tutorial/Step5/tutorial.cxx
+index b3c6a4f..7bfb60b 100644
+--- a/Help/guide/tutorial/Step5/tutorial.cxx
++++ b/Help/guide/tutorial/Step5/tutorial.cxx
+@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // which square root function should we use?
+ #ifdef USE_MYMATH
+diff --git a/Help/guide/tutorial/Step6/tutorial.cxx b/Help/guide/tutorial/Step6/tutorial.cxx
+index b3c6a4f..7bfb60b 100644
+--- a/Help/guide/tutorial/Step6/tutorial.cxx
++++ b/Help/guide/tutorial/Step6/tutorial.cxx
+@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // which square root function should we use?
+ #ifdef USE_MYMATH
+diff --git a/Help/guide/tutorial/Step7/tutorial.cxx b/Help/guide/tutorial/Step7/tutorial.cxx
+index b3c6a4f..7bfb60b 100644
+--- a/Help/guide/tutorial/Step7/tutorial.cxx
++++ b/Help/guide/tutorial/Step7/tutorial.cxx
+@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // which square root function should we use?
+ #ifdef USE_MYMATH
+diff --git a/Help/guide/tutorial/Step8/tutorial.cxx b/Help/guide/tutorial/Step8/tutorial.cxx
+index b3c6a4f..7bfb60b 100644
+--- a/Help/guide/tutorial/Step8/tutorial.cxx
++++ b/Help/guide/tutorial/Step8/tutorial.cxx
+@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // which square root function should we use?
+ #ifdef USE_MYMATH
+diff --git a/Help/guide/tutorial/Step9/tutorial.cxx b/Help/guide/tutorial/Step9/tutorial.cxx
+index b3c6a4f..7bfb60b 100644
+--- a/Help/guide/tutorial/Step9/tutorial.cxx
++++ b/Help/guide/tutorial/Step9/tutorial.cxx
+@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
+ }
+
+ // convert input to double
+- const double inputValue = std::stod(argv[1]);
++ const double inputValue = strtod(argv[1].c_str(), nullptr);
+
+ // which square root function should we use?
+ #ifdef USE_MYMATH
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0006-stoll.patch b/Ports/cmake/patches/0006-stoll.patch
new file mode 100644
index 0000000000..7e41a99fc7
--- /dev/null
+++ b/Ports/cmake/patches/0006-stoll.patch
@@ -0,0 +1,93 @@
+From fbb008a5185a002c89c2ce3c3b1cf15042635d91 Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Thu, 11 Feb 2021 21:24:11 +0330
+Subject: [PATCH 06/11] stoll
+
+---
+ Source/LexerParser/cmCTestResourceGroupsLexer.cxx | 4 ++--
+ Source/LexerParser/cmCTestResourceGroupsLexer.in.l | 4 ++--
+ Source/LexerParser/cmExprLexer.cxx | 4 ++--
+ Source/LexerParser/cmExprLexer.in.l | 4 ++--
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/Source/LexerParser/cmCTestResourceGroupsLexer.cxx b/Source/LexerParser/cmCTestResourceGroupsLexer.cxx
+index de07c46..3f59b61 100644
+--- a/Source/LexerParser/cmCTestResourceGroupsLexer.cxx
++++ b/Source/LexerParser/cmCTestResourceGroupsLexer.cxx
+@@ -992,14 +992,14 @@ YY_RULE_SETUP
+ {
+ BEGIN(RESOURCE_GROUPS_END);
+- std::size_t len = yyleng;
+- yyextra->SetProcessCount(std::stoll(yytext, &len, 10));
++ char* end = nullptr;
++ yyextra->SetProcessCount(strtoll(yytext, &end, 10));
+ }
+ YY_BREAK
+ case 3:
+ YY_RULE_SETUP
+ {
+ BEGIN(RESOURCE_END);
+- std::size_t len = yyleng;
+- yyextra->SetNeededSlots(std::stoll(yytext, &len, 10));
++ char* end = nullptr;
++ yyextra->SetNeededSlots(strtoll(yytext, &end, 10));
+ yyextra->WriteRequirement();
+ }
+diff --git a/Source/LexerParser/cmCTestResourceGroupsLexer.in.l b/Source/LexerParser/cmCTestResourceGroupsLexer.in.l
+index 2aabea4..ca5f3e5 100644
+--- a/Source/LexerParser/cmCTestResourceGroupsLexer.in.l
++++ b/Source/LexerParser/cmCTestResourceGroupsLexer.in.l
+@@ -55,13 +55,13 @@ IDENTIFIER [a-z_][a-z0-9_]*
+ <INITIAL,RESOURCE_GROUPS_START>{NUMBER} {
+ BEGIN(RESOURCE_GROUPS_END);
+- std::size_t len = yyleng;
+- yyextra->SetProcessCount(std::stoll(yytext, &len, 10));
++ char* end = nullptr;
++ yyextra->SetNeededSlots(strtoll(yytext, &end, 10));
+ }
+
+ <RESOURCE_COUNT>{NUMBER} {
+ BEGIN(RESOURCE_END);
+- std::size_t len = yyleng;
+- yyextra->SetNeededSlots(std::stoll(yytext, &len, 10));
++ char* end = nullptr;
++ yyextra->SetNeededSlots(strtoll(yytext, &end, 10));
+ yyextra->WriteRequirement();
+ }
+
+diff --git a/Source/LexerParser/cmExprLexer.cxx b/Source/LexerParser/cmExprLexer.cxx
+index 72e59b6..6b743e0 100644
+--- a/Source/LexerParser/cmExprLexer.cxx
++++ b/Source/LexerParser/cmExprLexer.cxx
+@@ -992,11 +992,11 @@ YY_RULE_SETUP
+ YY_BREAK
+ case 2:
+ YY_RULE_SETUP
+-{ yylvalp->Number = std::stoll(yytext, nullptr, 10); return exp_NUMBER; }
++{ yylvalp->Number = strtoll(yytext, nullptr, 10); return exp_NUMBER; }
+ YY_BREAK
+ case 3:
+ YY_RULE_SETUP
+-{ yylvalp->Number = std::stoll(yytext, nullptr, 16); return exp_NUMBER; }
++{ yylvalp->Number = strtoll(yytext, nullptr, 16); return exp_NUMBER; }
+ YY_BREAK
+ case 4:
+ YY_RULE_SETUP
+diff --git a/Source/LexerParser/cmExprLexer.in.l b/Source/LexerParser/cmExprLexer.in.l
+index f8a4224..822aaf5 100644
+--- a/Source/LexerParser/cmExprLexer.in.l
++++ b/Source/LexerParser/cmExprLexer.in.l
+@@ -44,8 +44,8 @@ Modify cmExprLexer.cxx:
+ %%
+ [ \t] {}
+
+-[0-9][0-9]* { yylvalp->Number = std::stoll(yytext, nullptr, 10); return exp_NUMBER; }
+-0[xX][0-9a-fA-F][0-9a-fA-F]* { yylvalp->Number = std::stoll(yytext, nullptr, 16); return exp_NUMBER; }
++[0-9][0-9]* { yylvalp->Number = strtoll(yytext, nullptr, 10); return exp_NUMBER; }
++0[xX][0-9a-fA-F][0-9a-fA-F]* { yylvalp->Number = strtoll(yytext, nullptr, 16); return exp_NUMBER; }
+
+ "+" { return exp_PLUS; }
+ "-" { return exp_MINUS; }
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0007-utimes-utime.patch b/Ports/cmake/patches/0007-utimes-utime.patch
new file mode 100644
index 0000000000..632b1cf07b
--- /dev/null
+++ b/Ports/cmake/patches/0007-utimes-utime.patch
@@ -0,0 +1,145 @@
+From dc70b3830887eea5f28e3e626b4c4ef492d77ce0 Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Thu, 11 Feb 2021 21:40:57 +0330
+Subject: [PATCH 07/11] utimes->utime
+
+---
+ Source/kwsys/CMakeLists.txt | 2 +-
+ Source/kwsys/SystemTools.cxx | 4 ++--
+ Source/kwsys/kwsysPlatformTestsCXX.cxx | 2 +-
+ Utilities/cmlibarchive/CMakeLists.txt | 2 +-
+ Utilities/cmlibarchive/build/cmake/config.h.in | 2 +-
+ .../cmlibarchive/libarchive/archive_read_disk_posix.c | 2 +-
+ .../cmlibarchive/libarchive/archive_write_disk_posix.c | 8 ++++----
+ Utilities/cmlibuv/src/unix/fs.c | 2 +-
+ 8 files changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/Source/kwsys/CMakeLists.txt b/Source/kwsys/CMakeLists.txt
+index 77adae2..52bc809 100644
+--- a/Source/kwsys/CMakeLists.txt
++++ b/Source/kwsys/CMakeLists.txt
+@@ -431,7 +431,7 @@ if(KWSYS_USE_SystemTools)
+ KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H
+ "Checking whether CXX compiler has environ in stdlib.h" DIRECT)
+ KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_UTIMES
+- "Checking whether CXX compiler has utimes" DIRECT)
++ "Checking whether CXX compiler has utime" DIRECT)
+ KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_UTIMENSAT
+ "Checking whether CXX compiler has utimensat" DIRECT)
+ KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_STAT_HAS_ST_MTIM
+diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
+index fbe7ed9..b0c6d5c 100644
+--- a/Source/kwsys/SystemTools.cxx
++++ b/Source/kwsys/SystemTools.cxx
+@@ -1445,8 +1445,8 @@ bool SystemTools::Touch(const std::string& filename, bool create)
+ return false;
+ }
+ #else
+- // fall back to utimes
+- if (utimes(filename.c_str(), nullptr) < 0) {
++ // fall back to utime
++ if (utime(filename.c_str(), nullptr) < 0) {
+ return false;
+ }
+ #endif
+diff --git a/Source/kwsys/kwsysPlatformTestsCXX.cxx b/Source/kwsys/kwsysPlatformTestsCXX.cxx
+index 195a461..f5f50b4 100644
+--- a/Source/kwsys/kwsysPlatformTestsCXX.cxx
++++ b/Source/kwsys/kwsysPlatformTestsCXX.cxx
+@@ -82,7 +82,7 @@ int main()
+ int main()
+ {
+ struct timeval* current_time = 0;
+- return utimes("/example", current_time);
++ return utime("/example", current_time);
+ }
+ #endif
+
+diff --git a/Utilities/cmlibarchive/CMakeLists.txt b/Utilities/cmlibarchive/CMakeLists.txt
+index 9d6f9a2..c49043a 100644
+--- a/Utilities/cmlibarchive/CMakeLists.txt
++++ b/Utilities/cmlibarchive/CMakeLists.txt
+@@ -1411,7 +1411,7 @@ CHECK_FUNCTION_EXISTS_GLIBC(tzset HAVE_TZSET)
+ CHECK_FUNCTION_EXISTS_GLIBC(unlinkat HAVE_UNLINKAT)
+ CHECK_FUNCTION_EXISTS_GLIBC(unsetenv HAVE_UNSETENV)
+ CHECK_FUNCTION_EXISTS_GLIBC(utime HAVE_UTIME)
+-CHECK_FUNCTION_EXISTS_GLIBC(utimes HAVE_UTIMES)
++CHECK_FUNCTION_EXISTS_GLIBC(utime HAVE_UTIMES)
+ CHECK_FUNCTION_EXISTS_GLIBC(utimensat HAVE_UTIMENSAT)
+ CHECK_FUNCTION_EXISTS_GLIBC(vfork HAVE_VFORK)
+ CHECK_FUNCTION_EXISTS_GLIBC(wcrtomb HAVE_WCRTOMB)
+diff --git a/Utilities/cmlibarchive/build/cmake/config.h.in b/Utilities/cmlibarchive/build/cmake/config.h.in
+index 4c746b7..2407b94 100644
+--- a/Utilities/cmlibarchive/build/cmake/config.h.in
++++ b/Utilities/cmlibarchive/build/cmake/config.h.in
+@@ -916,7 +916,7 @@
+ /* Define to 1 if you have the `utimensat' function. */
+ #cmakedefine HAVE_UTIMENSAT 1
+
+-/* Define to 1 if you have the `utimes' function. */
++/* Define to 1 if you have the `utime' function. */
+ #cmakedefine HAVE_UTIMES 1
+
+ /* Define to 1 if you have the <utime.h> header file. */
+diff --git a/Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c b/Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c
+index 6dd1fd9..2fa08d4 100644
+--- a/Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c
++++ b/Utilities/cmlibarchive/libarchive/archive_read_disk_posix.c
+@@ -2043,7 +2043,7 @@ close_and_restore_time(int fd, struct tree *t, struct restore_time *rt)
+ #ifdef HAVE_LUTIMES
+ if (lutimes(rt->name, times) != 0)
+ #else
+- if (AE_IFLNK != rt->filetype && utimes(rt->name, times) != 0)
++ if (AE_IFLNK != rt->filetype && utime(rt->name, times) != 0)
+ #endif
+ return (-1);
+ #endif
+diff --git a/Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c b/Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c
+index 67da3e1..157e27a 100644
+--- a/Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c
++++ b/Utilities/cmlibarchive/libarchive/archive_write_disk_posix.c
+@@ -3365,8 +3365,8 @@ set_time(int fd, int mode, const char *name,
+
+ #elif HAVE_UTIMES
+ /*
+- * The utimes()-family functions support µs-resolution and
+- * setting times fds and symlinks. utimes() is documented as
++ * The utime()-family functions support µs-resolution and
++ * setting times fds and symlinks. utime() is documented as
+ * LEGACY by POSIX, futimes() and lutimes() are not described
+ * in POSIX.
+ */
+@@ -3389,7 +3389,7 @@ set_time(int fd, int mode, const char *name,
+ #else
+ if (S_ISLNK(mode))
+ return (0);
+- return (utimes(name, times));
++ return (utime(name, times));
+ #endif
+
+ #elif defined(HAVE_UTIME)
+@@ -3477,7 +3477,7 @@ set_times(struct archive_write_disk *a,
+ #ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
+ /*
+ * If you have struct stat.st_birthtime, we assume BSD
+- * birthtime semantics, in which {f,l,}utimes() updates
++ * birthtime semantics, in which {f,l,}utime() updates
+ * birthtime to earliest mtime. So we set the time twice,
+ * first using the birthtime, then using the mtime. If
+ * birthtime == mtime, this isn't necessary, so we skip it.
+diff --git a/Utilities/cmlibuv/src/unix/fs.c b/Utilities/cmlibuv/src/unix/fs.c
+index 6d57cee..48c0123 100644
+--- a/Utilities/cmlibuv/src/unix/fs.c
++++ b/Utilities/cmlibuv/src/unix/fs.c
+@@ -1036,7 +1036,7 @@ static ssize_t uv__fs_utime(uv_fs_t* req) {
+ struct timeval tv[2];
+ tv[0] = uv__fs_to_timeval(req->atime);
+ tv[1] = uv__fs_to_timeval(req->mtime);
+- return utimes(req->path, tv);
++ return utime(req->path, tv);
+ #elif defined(_AIX) \
+ && !defined(_AIX71)
+ struct utimbuf buf;
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0008-unix-stuff.patch b/Ports/cmake/patches/0008-unix-stuff.patch
new file mode 100644
index 0000000000..5c49fe2a65
--- /dev/null
+++ b/Ports/cmake/patches/0008-unix-stuff.patch
@@ -0,0 +1,76 @@
+From d8b3a1a970d92d5e66a7caa3805a56c186027f44 Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Fri, 12 Feb 2021 03:12:38 +0330
+Subject: [PATCH 08/11] unix stuff
+
+---
+ Utilities/cmlibuv/src/unix/core.c | 26 +++++++++++++++++++++++++-
+ 1 file changed, 25 insertions(+), 1 deletion(-)
+
+diff --git a/Utilities/cmlibuv/src/unix/core.c b/Utilities/cmlibuv/src/unix/core.c
+index e6d61ee..f90d9a3 100644
+--- a/Utilities/cmlibuv/src/unix/core.c
++++ b/Utilities/cmlibuv/src/unix/core.c
+@@ -578,6 +578,14 @@ int uv__close(int fd) {
+ }
+
+
++#if defined(_AIX) || \
++ defined(__APPLE__) || \
++ defined(__DragonFly__) || \
++ defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || \
++ defined(__linux__) || \
++ defined(__OpenBSD__) || \
++ defined(__NetBSD__)
+ int uv__nonblock_ioctl(int fd, int set) {
+ int r;
+
+@@ -590,9 +598,18 @@ int uv__nonblock_ioctl(int fd, int set) {
+
+ return 0;
+ }
++#endif
+
+
+-#if !defined(__hpux) && !defined(__CYGWIN__) && !defined(__MSYS__) && !defined(__HAIKU__)
++#if defined(_AIX) || \
++ defined(__APPLE__) || \
++ defined(__DragonFly__) || \
++ defined(__FreeBSD__) || \
++ defined(__FreeBSD_kernel__) || \
++ defined(__linux__) || \
++ defined(__OpenBSD__) || \
++ defined(__NetBSD__)
++
+ int uv__cloexec_ioctl(int fd, int set) {
+ int r;
+
+@@ -1422,8 +1439,13 @@ int uv_os_getpriority(uv_pid_t pid, int* priority) {
+ if (priority == NULL)
+ return UV_EINVAL;
+
++ /*
+ errno = 0;
+ r = getpriority(PRIO_PROCESS, (int) pid);
++ */
++
++ errno = 0;
++ r = 1;
+
+ if (r == -1 && errno != 0)
+ return UV__ERR(errno);
+@@ -1437,8 +1459,10 @@ int uv_os_setpriority(uv_pid_t pid, int priority) {
+ if (priority < UV_PRIORITY_HIGHEST || priority > UV_PRIORITY_LOW)
+ return UV_EINVAL;
+
++ /*
+ if (setpriority(PRIO_PROCESS, (int) pid, priority) != 0)
+ return UV__ERR(errno);
++ */
+
+ return 0;
+ }
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0009-purge-non-serenity-syscalls.patch b/Ports/cmake/patches/0009-purge-non-serenity-syscalls.patch
new file mode 100644
index 0000000000..e0c8e4e66e
--- /dev/null
+++ b/Ports/cmake/patches/0009-purge-non-serenity-syscalls.patch
@@ -0,0 +1,199 @@
+From 6939797ada5dbf5545d857cc60cfd5a8ceddb0ae Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Fri, 12 Feb 2021 04:49:01 +0330
+Subject: [PATCH 09/11] purge non-serenity syscalls
+
+very breaky!
+---
+ Utilities/cmlibuv/src/unix/fs.c | 31 ++++++++++++++++++++++++++++
+ Utilities/cmlibuv/src/unix/poll.c | 2 ++
+ Utilities/cmlibuv/src/unix/process.c | 2 ++
+ Utilities/cmlibuv/src/unix/stream.c | 3 +--
+ 4 files changed, 36 insertions(+), 2 deletions(-)
+
+diff --git a/Utilities/cmlibuv/src/unix/fs.c b/Utilities/cmlibuv/src/unix/fs.c
+index 48c0123..fd102a8 100644
+--- a/Utilities/cmlibuv/src/unix/fs.c
++++ b/Utilities/cmlibuv/src/unix/fs.c
+@@ -85,6 +85,8 @@
+ defined(__HAIKU__) || \
+ defined(__QNX__)
+ # include <sys/statvfs.h>
++#elif defined(__serenity__)
++// No statfs
+ #else
+ # include <sys/statfs.h>
+ #endif
+@@ -540,7 +542,11 @@ static ssize_t uv__fs_scandir(uv_fs_t* req) {
+ int n;
+
+ dents = NULL;
++#ifndef __serenity__
+ n = scandir(req->path, &dents, uv__fs_scandir_filter, uv__fs_scandir_sort);
++#else
++ n = 0;
++#endif
+
+ /* NOTE: We will use nbufs as an index field */
+ req->nbufs = 0;
+@@ -651,6 +657,9 @@ static int uv__fs_statfs(uv_fs_t* req) {
+ struct statvfs buf;
+
+ if (0 != statvfs(req->path, &buf))
++#elif defined(__serenity__)
++ char buf = 0;
++ if (1)
+ #else
+ struct statfs buf;
+
+@@ -658,6 +667,7 @@ static int uv__fs_statfs(uv_fs_t* req) {
+ #endif /* defined(__sun) */
+ return -1;
+
++#if !defined(__serenity__)
+ stat_fs = uv__malloc(sizeof(*stat_fs));
+ if (stat_fs == NULL) {
+ errno = ENOMEM;
+@@ -681,6 +691,7 @@ static int uv__fs_statfs(uv_fs_t* req) {
+ stat_fs->f_files = buf.f_files;
+ stat_fs->f_ffree = buf.f_ffree;
+ req->ptr = stat_fs;
++#endif // !defined(__serenity__)
+ return 0;
+ }
+
+@@ -1107,7 +1118,11 @@ static ssize_t uv__fs_write(uv_fs_t* req) {
+ r = writev(req->file, (struct iovec*) req->bufs, req->nbufs);
+ } else {
+ if (req->nbufs == 1) {
++# if defined(__serenity__)
++ r = -1;
++# else
+ r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
++# endif
+ goto done;
+ }
+ #if HAVE_PREADV
+@@ -1117,7 +1132,11 @@ static ssize_t uv__fs_write(uv_fs_t* req) {
+ if (no_pwritev) retry:
+ # endif
+ {
++# if defined(__serenity__)
++ r = -1;
++# else
+ r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
++# endif
+ }
+ # if defined(__linux__)
+ else {
+@@ -1604,7 +1623,9 @@ static void uv__fs_work(struct uv__work* w) {
+ X(COPYFILE, uv__fs_copyfile(req));
+ X(FCHMOD, fchmod(req->file, req->mode));
+ X(FCHOWN, fchown(req->file, req->uid, req->gid));
++#ifndef __serenity__
+ X(LCHOWN, lchown(req->path, req->uid, req->gid));
++#endif
+ X(FDATASYNC, uv__fs_fdatasync(req));
+ X(FSTAT, uv__fs_fstat(req->file, &req->statbuf));
+ X(FSYNC, uv__fs_fsync(req));
+@@ -1618,7 +1639,9 @@ static void uv__fs_work(struct uv__work* w) {
+ X(MKSTEMP, uv__fs_mkstemp(req));
+ X(OPEN, uv__fs_open(req));
+ X(READ, uv__fs_read(req));
++#ifndef __serenity__
+ X(SCANDIR, uv__fs_scandir(req));
++#endif
+ X(OPENDIR, uv__fs_opendir(req));
+ X(READDIR, uv__fs_readdir(req));
+ X(CLOSEDIR, uv__fs_closedir(req));
+@@ -1628,7 +1651,9 @@ static void uv__fs_work(struct uv__work* w) {
+ X(RMDIR, rmdir(req->path));
+ X(SENDFILE, uv__fs_sendfile(req));
+ X(STAT, uv__fs_stat(req->path, &req->statbuf));
++#ifndef __serenity__
+ X(STATFS, uv__fs_statfs(req));
++#endif
+ X(SYMLINK, symlink(req->path, req->new_path));
+ X(UNLINK, unlink(req->path));
+ X(UTIME, uv__fs_utime(req));
+@@ -1743,7 +1768,9 @@ int uv_fs_lchown(uv_loop_t* loop,
+ uv_uid_t uid,
+ uv_gid_t gid,
+ uv_fs_cb cb) {
++#ifndef __serenity__
+ INIT(LCHOWN);
++#endif
+ PATH;
+ req->uid = uid;
+ req->gid = gid;
+@@ -1912,7 +1939,9 @@ int uv_fs_scandir(uv_loop_t* loop,
+ const char* path,
+ int flags,
+ uv_fs_cb cb) {
++#ifndef __serenity__
+ INIT(SCANDIR);
++#endif
+ PATH;
+ req->flags = flags;
+ POST;
+@@ -2134,7 +2163,9 @@ int uv_fs_statfs(uv_loop_t* loop,
+ uv_fs_t* req,
+ const char* path,
+ uv_fs_cb cb) {
++#ifndef __serenity__
+ INIT(STATFS);
++#endif
+ PATH;
+ POST;
+ }
+diff --git a/Utilities/cmlibuv/src/unix/poll.c b/Utilities/cmlibuv/src/unix/poll.c
+index 3d5022b..721423f 100644
+--- a/Utilities/cmlibuv/src/unix/poll.c
++++ b/Utilities/cmlibuv/src/unix/poll.c
+@@ -79,9 +79,11 @@ int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) {
+ * Workaround for e.g. kqueue fds not supporting ioctls.
+ */
+ err = uv__nonblock(fd, 1);
++#ifndef __serenity__
+ if (err == UV_ENOTTY)
+ if (uv__nonblock == uv__nonblock_ioctl)
+ err = uv__nonblock_fcntl(fd, 1);
++#endif
+
+ if (err)
+ return err;
+diff --git a/Utilities/cmlibuv/src/unix/process.c b/Utilities/cmlibuv/src/unix/process.c
+index 08aa2f3..135260f 100644
+--- a/Utilities/cmlibuv/src/unix/process.c
++++ b/Utilities/cmlibuv/src/unix/process.c
+@@ -129,6 +129,8 @@ static int uv__make_socketpair(int fds[2]) {
+ return UV__ERR(errno);
+
+ return 0;
++#elif defined(__serenity__)
++ return UV__ERR(ENOTSUP);
+ #else
+ int err;
+
+diff --git a/Utilities/cmlibuv/src/unix/stream.c b/Utilities/cmlibuv/src/unix/stream.c
+index 3b6da8d..3e2ed5e 100644
+--- a/Utilities/cmlibuv/src/unix/stream.c
++++ b/Utilities/cmlibuv/src/unix/stream.c
+@@ -985,13 +985,12 @@ uv_handle_type uv__handle_type(int fd) {
+ case AF_UNIX:
+ return UV_NAMED_PIPE;
+ case AF_INET:
+- case AF_INET6:
+ return UV_TCP;
+ }
+ }
+
+ if (type == SOCK_DGRAM &&
+- (ss.ss_family == AF_INET || ss.ss_family == AF_INET6))
++ (ss.ss_family == AF_INET))
+ return UV_UDP;
+
+ return UV_UNKNOWN_HANDLE;
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0010-don-t-use-siginfo.patch b/Ports/cmake/patches/0010-don-t-use-siginfo.patch
new file mode 100644
index 0000000000..e70e42aeb1
--- /dev/null
+++ b/Ports/cmake/patches/0010-don-t-use-siginfo.patch
@@ -0,0 +1,48 @@
+From 6db96fa8e9a0519894326d0a64b72313a5879fd9 Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Fri, 12 Feb 2021 13:42:50 +0330
+Subject: [PATCH 10/11] don't use siginfo
+
+---
+ Source/kwsys/ProcessUNIX.c | 2 +-
+ Source/kwsys/SystemInformation.cxx | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/Source/kwsys/ProcessUNIX.c b/Source/kwsys/ProcessUNIX.c
+index a24b773..cbf137b 100644
+--- a/Source/kwsys/ProcessUNIX.c
++++ b/Source/kwsys/ProcessUNIX.c
+@@ -105,7 +105,7 @@ static inline void kwsysProcess_usleep(unsigned int msec)
+ #endif
+
+ /* Some platforms do not have siginfo on their signal handlers. */
+-#if defined(SA_SIGINFO) && !defined(__BEOS__)
++#if defined(SA_SIGINFO) && !defined(__BEOS__) && !defined(__serenity__)
+ # define KWSYSPE_USE_SIGINFO 1
+ #endif
+
+diff --git a/Source/kwsys/SystemInformation.cxx b/Source/kwsys/SystemInformation.cxx
+index 1384dbe..18f03fb 100644
+--- a/Source/kwsys/SystemInformation.cxx
++++ b/Source/kwsys/SystemInformation.cxx
+@@ -990,7 +990,7 @@ int GetFieldsFromCommand(const char* command, const char** fieldNames,
+ #endif
+
+ // ****************************************************************************
+-#if !defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
++#if !defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(__serenity__)
+ void StacktraceSignalHandler(int sigNo, siginfo_t* sigInfo,
+ void* /*sigContext*/)
+ {
+@@ -3965,7 +3965,7 @@ when set print stack trace in response to common signals.
+ */
+ void SystemInformationImplementation::SetStackTraceOnError(int enable)
+ {
+-#if !defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
++#if !defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(__serenity__)
+ static int saOrigValid = 0;
+ static struct sigaction saABRTOrig;
+ static struct sigaction saSEGVOrig;
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0011-Fixed-your-code-rot-cmake.patch b/Ports/cmake/patches/0011-Fixed-your-code-rot-cmake.patch
new file mode 100644
index 0000000000..be9787ed1e
--- /dev/null
+++ b/Ports/cmake/patches/0011-Fixed-your-code-rot-cmake.patch
@@ -0,0 +1,39 @@
+From fd44bfe91d4b17c20c8028d60fe73e016879e73b Mon Sep 17 00:00:00 2001
+From: AnotherTest <ali.mpfard@gmail.com>
+Date: Fri, 12 Feb 2021 13:59:50 +0330
+Subject: [PATCH 11/11] Fixed your code rot, cmake
+
+---
+ Source/kwsys/ProcessUNIX.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/Source/kwsys/ProcessUNIX.c b/Source/kwsys/ProcessUNIX.c
+index cbf137b..65bf129 100644
+--- a/Source/kwsys/ProcessUNIX.c
++++ b/Source/kwsys/ProcessUNIX.c
+@@ -2890,10 +2890,10 @@ static void kwsysProcessesSignalHandler(int signum
+ /* Re-Install our handler. Repeat call until it is not interrupted. */
+ {
+ struct sigaction newSigAction;
+- struct sigaction& oldSigAction;
++ struct sigaction* oldSigAction;
+ memset(&newSigAction, 0, sizeof(struct sigaction));
+- newSigChldAction.sa_handler = kwsysProcessesSignalHandler;
+- newSigChldAction.sa_flags = SA_NOCLDSTOP;
++ newSigAction.sa_handler = kwsysProcessesSignalHandler;
++ newSigAction.sa_flags = SA_NOCLDSTOP;
+ sigemptyset(&newSigAction.sa_mask);
+ switch (signum) {
+ case SIGCHLD:
+@@ -2908,7 +2908,7 @@ static void kwsysProcessesSignalHandler(int signum
+ oldSigAction = &kwsysProcessesOldSigTermAction;
+ break;
+ default:
+- return 0;
++ return;
+ }
+ while ((sigaction(signum, &newSigAction, oldSigAction) < 0) &&
+ (errno == EINTR))
+--
+2.30.1
+
diff --git a/Ports/cmake/patches/0012-bin-bash.patch b/Ports/cmake/patches/0012-bin-bash.patch
new file mode 100644
index 0000000000..9db6b52051
--- /dev/null
+++ b/Ports/cmake/patches/0012-bin-bash.patch
@@ -0,0 +1,17 @@
+diff -urp a/bootstrap b/bootstrap
+--- a/bootstrap 2021-02-12 16:01:09.075367557 +0330
++++ b/bootstrap 2021-02-12 15:59:27.811749370 +0330
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ # file Copyright.txt or https://cmake.org/licensing for details.
+
+diff -urp a/configure b/configure
+--- a/configure 2021-02-12 16:02:00.042148704 +0330
++++ b/configure 2021-02-12 16:02:07.035496388 +0330
+@@ -1,3 +1,3 @@
+-#!/bin/sh
++#!/bin/bash
+ cmake_source_dir=`cd "\`dirname \"$0\"\`";pwd`
+ exec "${cmake_source_dir}/bootstrap" "$@"
diff --git a/Ports/cmake/patches/0013-platform-serenityos.patch b/Ports/cmake/patches/0013-platform-serenityos.patch
new file mode 100644
index 0000000000..4b680831e0
--- /dev/null
+++ b/Ports/cmake/patches/0013-platform-serenityos.patch
@@ -0,0 +1,29 @@
+diff -urp /dev/null a/Modules/Platform/SerenityOS.cmake
+--- /dev/null 2021-02-11 00:46:13.390326124 +0330
++++ a/Modules/Platform/SerenityOS.cmake 2021-02-12 16:31:38.421786222 +0330
+@@ -0,0 +1,25 @@
++set(CMAKE_DL_LIBS "")
++set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
++set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG_SEP ":")
++set(CMAKE_SHARED_LIBRARY_RPATH_ORIGIN_TOKEN "\$ORIGIN")
++set(CMAKE_SHARED_LIBRARY_RPATH_LINK_C_FLAG "-Wl,-rpath-link,")
++set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,")
++set(CMAKE_EXE_EXPORTS_C_FLAG "-Wl,--export-dynamic")
++
++# Shared libraries with no builtin soname may not be linked safely by
++# specifying the file path.
++set(CMAKE_PLATFORM_USES_PATH_WHEN_NO_SONAME 1)
++
++# Initialize C link type selection flags. These flags are used when
++# building a shared library, shared module, or executable that links
++# to other libraries to select whether to use the static or shared
++# versions of the libraries.
++foreach(type SHARED_LIBRARY SHARED_MODULE EXE)
++ set(CMAKE_${type}_LINK_STATIC_C_FLAGS "-Wl,-Bstatic")
++ set(CMAKE_${type}_LINK_DYNAMIC_C_FLAGS "-Wl,-Bdynamic")
++endforeach()
++
++# No multi-arch here (yet?)
++unset(CMAKE_LIBRARY_ARCHITECTURE_REGEX)
++
++include(Platform/UnixPaths)
diff --git a/Ports/cmake/patches/0014-cmcurl-include-unistd.patch b/Ports/cmake/patches/0014-cmcurl-include-unistd.patch
new file mode 100644
index 0000000000..dc9db7e5ab
--- /dev/null
+++ b/Ports/cmake/patches/0014-cmcurl-include-unistd.patch
@@ -0,0 +1,10 @@
+--- a/Utilities/cmcurl/include/curl/multi.h 2021-02-12 21:03:08.726002327 +0330
++++ b/Utilities/cmcurl/include/curl/multi.h 2021-02-12 21:03:12.015764990 +0330
+@@ -47,6 +47,7 @@
+ * but with this warning attached.
+ */
+ #include "curl.h"
++#include <unistd.h>
+
+ #ifdef __cplusplus
+ extern "C" {
diff --git a/Ports/cmake/patches/0015-atoll.patch b/Ports/cmake/patches/0015-atoll.patch
new file mode 100644
index 0000000000..1aafb80596
--- /dev/null
+++ b/Ports/cmake/patches/0015-atoll.patch
@@ -0,0 +1,20 @@
+--- a/Source/kwsys/SystemInformation.cxx 2021-02-12 21:49:51.581563656 +0330
++++ b/Source/kwsys/SystemInformation.cxx 2021-02-12 21:49:54.454669016 +0330
+@@ -3635,7 +3635,7 @@ long long SystemInformationImplementatio
+ if (hostLimitEnvVarName) {
+ const char* hostLimitEnvVarValue = getenv(hostLimitEnvVarName);
+ if (hostLimitEnvVarValue) {
+- long long hostLimit = std::atoll(hostLimitEnvVarValue);
++ long long hostLimit = atoll(hostLimitEnvVarValue);
+ if (hostLimit > 0) {
+ memTotal = min(hostLimit, memTotal);
+ }
+@@ -3659,7 +3659,7 @@ long long SystemInformationImplementatio
+ if (procLimitEnvVarName) {
+ const char* procLimitEnvVarValue = getenv(procLimitEnvVarName);
+ if (procLimitEnvVarValue) {
+- long long procLimit = std::atoll(procLimitEnvVarValue);
++ long long procLimit = atoll(procLimitEnvVarValue);
+ if (procLimit > 0) {
+ memAvail = min(procLimit, memAvail);
+ }
diff --git a/Ports/cmake/patches/0016-conflicting-0.patch b/Ports/cmake/patches/0016-conflicting-0.patch
new file mode 100644
index 0000000000..09c1cb9b1e
--- /dev/null
+++ b/Ports/cmake/patches/0016-conflicting-0.patch
@@ -0,0 +1,12 @@
+--- a/Utilities/cmnghttp2/cmakeconfig.h.in 2021-02-12 22:10:29.813759193 +0330
++++ b/Utilities/cmnghttp2/cmakeconfig.h.in 2021-02-12 22:10:35.577912239 +0330
+@@ -5,9 +5,6 @@
+ #include <cm3p/kwiml/abi.h>
+ #include <cm3p/kwiml/int.h>
+
+-/* Define to `int' if <sys/types.h> does not define. */
+-#cmakedefine ssize_t @ssize_t@
+-
+ /* sizeof(int *) */
+ #define SIZEOF_INT_P KWIML_ABI_SIZEOF_DATA_PTR
+
diff --git a/Ports/cmake/patches/0017-conflicting-1.patch b/Ports/cmake/patches/0017-conflicting-1.patch
new file mode 100644
index 0000000000..0f09327a00
--- /dev/null
+++ b/Ports/cmake/patches/0017-conflicting-1.patch
@@ -0,0 +1,12 @@
+--- a/Utilities/cmcurl/lib/curl_config.h.cmake 2021-02-12 22:12:54.848790862 +0330
++++ b/Utilities/cmcurl/lib/curl_config.h.cmake 2021-02-12 22:12:57.841458768 +0330
+@@ -1052,9 +1052,6 @@ ${SIZEOF_TIME_T_CODE}
+ /* Define to empty if `const' does not conform to ANSI C. */
+ #cmakedefine const ${const}
+
+-/* Type to use in place of in_addr_t when system does not provide it. */
+-#cmakedefine in_addr_t ${in_addr_t}
+-
+ /* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+ #ifndef __cplusplus
diff --git a/Ports/cmake/patches/0018-isfinite.patch b/Ports/cmake/patches/0018-isfinite.patch
new file mode 100644
index 0000000000..c41c81b8b2
--- /dev/null
+++ b/Ports/cmake/patches/0018-isfinite.patch
@@ -0,0 +1,13 @@
+--- a/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp 2021-02-12 22:35:57.078226288 +0330
++++ b/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp 2021-02-12 22:36:02.937764094 +0330
+@@ -41,7 +41,9 @@
+ #endif
+ #else
+ #include <cmath>
+-#if !(defined(__QNXNTO__)) // QNX already defines isfinite
++#if defined(__serenity__) // isfinite is already defined in math.h
++#include <math.h>
++#elif !(defined(__QNXNTO__)) // QNX already defines isfinite
+ #define isfinite std::isfinite
+ #endif
+ #endif
diff --git a/Ports/cmake/patches/0019-libuv-so_linger.patch b/Ports/cmake/patches/0019-libuv-so_linger.patch
new file mode 100644
index 0000000000..b41f8aaac4
--- /dev/null
+++ b/Ports/cmake/patches/0019-libuv-so_linger.patch
@@ -0,0 +1,22 @@
+--- a/Utilities/cmlibuv/src/unix/tcp.c 2021-02-12 22:52:26.980780866 +0330
++++ b/Utilities/cmlibuv/src/unix/tcp.c 2021-02-12 22:54:10.670863712 +0330
+@@ -310,15 +310,19 @@ int uv_tcp_getpeername(const uv_tcp_t* h
+
+ int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb) {
+ int fd;
++#ifndef __serenity__
+ struct linger l = { 1, 0 };
++#endif
+
+ /* Disallow setting SO_LINGER to zero due to some platform inconsistencies */
+ if (handle->flags & UV_HANDLE_SHUTTING)
+ return UV_EINVAL;
+
+ fd = uv__stream_fd(handle);
++#ifndef __serenity__
+ if (0 != setsockopt(fd, SOL_SOCKET, SO_LINGER, &l, sizeof(l)))
+ return UV__ERR(errno);
++#endif
+
+ uv_close((uv_handle_t*) handle, close_cb);
+ return 0;
diff --git a/Ports/cmake/patches/0020-libuv-ipv6.patch b/Ports/cmake/patches/0020-libuv-ipv6.patch
new file mode 100644
index 0000000000..1262690392
--- /dev/null
+++ b/Ports/cmake/patches/0020-libuv-ipv6.patch
@@ -0,0 +1,489 @@
+--- a/Utilities/cmlibuv/src/unix/udp.c 2021-02-12 22:54:39.835381661 +0330
++++ b/Utilities/cmlibuv/src/unix/udp.c 2021-02-12 23:06:41.699978199 +0330
+@@ -585,6 +585,7 @@ static int uv__udp_maybe_deferred_bind(u
+ addrlen = sizeof *addr;
+ break;
+ }
++#ifndef __serenity__
+ case AF_INET6:
+ {
+ struct sockaddr_in6* addr = &taddr.in6;
+@@ -594,6 +595,7 @@ static int uv__udp_maybe_deferred_bind(u
+ addrlen = sizeof *addr;
+ break;
+ }
++#endif
+ default:
+ assert(0 && "unsupported address family");
+ abort();
+@@ -761,6 +763,9 @@ static int uv__udp_set_membership4(uv_ud
+ const struct sockaddr_in* multicast_addr,
+ const char* interface_addr,
+ uv_membership membership) {
++#ifdef __serenity__
++ return UV_EINVAL;
++#else
+ struct ip_mreq mreq;
+ int optname;
+ int err;
+@@ -801,6 +806,7 @@ static int uv__udp_set_membership4(uv_ud
+ }
+
+ return 0;
++#endif
+ }
+
+
+@@ -808,6 +814,9 @@ static int uv__udp_set_membership6(uv_ud
+ const struct sockaddr_in6* multicast_addr,
+ const char* interface_addr,
+ uv_membership membership) {
++#ifdef __serenity__
++ return UV_EINVAL;
++#else
+ int optname;
+ struct ipv6_mreq mreq;
+ struct sockaddr_in6 addr6;
+@@ -848,14 +857,16 @@ static int uv__udp_set_membership6(uv_ud
+ }
+
+ return 0;
++#endif
+ }
+
+
+ #if !defined(__OpenBSD__) && \
+ !defined(__NetBSD__) && \
+ !defined(__ANDROID__) && \
+- !defined(__DragonFly__) & \
+- !defined(__QNX__)
++ !defined(__DragonFly__) && \
++ !defined(__QNX__) && \
++ !defined(__serenity__)
+ static int uv__udp_set_source_membership4(uv_udp_t* handle,
+ const struct sockaddr_in* multicast_addr,
+ const char* interface_addr,
+@@ -1089,11 +1100,15 @@ static int uv__setsockopt(uv_udp_t* hand
+ int r;
+
+ if (handle->flags & UV_HANDLE_IPV6)
++#ifndef __serenity__
+ r = setsockopt(handle->io_watcher.fd,
+ IPPROTO_IPV6,
+ option6,
+ val,
+ size);
++#else
++ r = -1;
++#endif
+ else
+ r = setsockopt(handle->io_watcher.fd,
+ IPPROTO_IP,
+@@ -1162,20 +1177,24 @@ int uv_udp_set_ttl(uv_udp_t* handle, int
+ &ttl,
+ sizeof(ttl));
+
+-#else /* !(defined(__sun) || defined(_AIX) || defined (__OpenBSD__) ||
++#elif !defined(__serenity__) /* !(defined(__sun) || defined(_AIX) || defined (__OpenBSD__) ||
+ defined(__MVS__) || defined(__QNX__)) */
+
+ return uv__setsockopt_maybe_char(handle,
+ IP_TTL,
+ IPV6_UNICAST_HOPS,
+ ttl);
+-
++#else
++ return -1;
+ #endif /* defined(__sun) || defined(_AIX) || defined (__OpenBSD__) ||
+ defined(__MVS__) || defined(__QNX__) */
+ }
+
+
+ int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl) {
++#if defined(__serenity__)
++ return -1;
++#else
+ /*
+ * On Solaris and derivatives such as SmartOS, the length of socket options
+ * is sizeof(int) for IPV6_MULTICAST_HOPS and sizeof(char) for
+@@ -1197,10 +1216,14 @@ int uv_udp_set_multicast_ttl(uv_udp_t* h
+ IP_MULTICAST_TTL,
+ IPV6_MULTICAST_HOPS,
+ ttl);
++#endif
+ }
+
+
+ int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) {
++#if defined(__serenity__)
++ return -1;
++#else
+ /*
+ * On Solaris and derivatives such as SmartOS, the length of socket options
+ * is sizeof(int) for IPV6_MULTICAST_LOOP and sizeof(char) for
+@@ -1222,9 +1245,13 @@ int uv_udp_set_multicast_loop(uv_udp_t*
+ IP_MULTICAST_LOOP,
+ IPV6_MULTICAST_LOOP,
+ on);
++#endif
+ }
+
+ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) {
++#if defined(__serenity__)
++ return -1;
++#else
+ struct sockaddr_storage addr_st;
+ struct sockaddr_in* addr4;
+ struct sockaddr_in6* addr6;
+@@ -1271,6 +1298,7 @@ int uv_udp_set_multicast_interface(uv_ud
+ }
+
+ return 0;
++#endif
+ }
+
+ int uv_udp_getpeername(const uv_udp_t* handle,
+diff --git a/Utilities/cmlibuv/src/unix/udp.c b/Utilities/cmlibuv/src/unix/udp.c
+index 0b83652..77468f9 100644
+--- a/Utilities/cmlibuv/src/unix/udp.c
++++ b/Utilities/cmlibuv/src/unix/udp.c
+@@ -1058,7 +1058,8 @@ int uv_udp_set_source_membership(uv_udp_t* handle,
+ !defined(__NetBSD__) && \
+ !defined(__ANDROID__) && \
+ !defined(__DragonFly__) && \
+- !defined(__QNX__)
++ !defined(__QNX__) \
++ !defined(__serenity__)
+ int err;
+ union uv__sockaddr mcast_addr;
+ union uv__sockaddr src_addr;
+diff --git a/Utilities/cmlibuv/src/inet.c b/Utilities/cmlibuv/src/inet.c
+index 58238dc..5b880b0 100644
+--- a/Utilities/cmlibuv/src/inet.c
++++ b/Utilities/cmlibuv/src/inet.c
+@@ -41,8 +41,10 @@ int uv_inet_ntop(int af, const void* src, char* dst, size_t size) {
+ switch (af) {
+ case AF_INET:
+ return (inet_ntop4(src, dst, size));
++#ifndef __serenity__
+ case AF_INET6:
+ return (inet_ntop6(src, dst, size));
++#endif
+ default:
+ return UV_EAFNOSUPPORT;
+ }
+@@ -154,6 +156,7 @@ int uv_inet_pton(int af, const char* src, void* dst) {
+ switch (af) {
+ case AF_INET:
+ return (inet_pton4(src, dst));
++#ifndef __serenity__
+ case AF_INET6: {
+ int len;
+ char tmp[UV__INET6_ADDRSTRLEN], *s, *p;
+@@ -169,6 +172,7 @@ int uv_inet_pton(int af, const char* src, void* dst) {
+ }
+ return inet_pton6(s, dst);
+ }
++#endif
+ default:
+ return UV_EAFNOSUPPORT;
+ }
+diff --git a/Utilities/cmlibuv/src/unix/getnameinfo.c b/Utilities/cmlibuv/src/unix/getnameinfo.c
+index b695081..939db31 100644
+--- a/Utilities/cmlibuv/src/unix/getnameinfo.c
++++ b/Utilities/cmlibuv/src/unix/getnameinfo.c
+@@ -37,8 +37,10 @@ static void uv__getnameinfo_work(struct uv__work* w) {
+
+ if (req->storage.ss_family == AF_INET)
+ salen = sizeof(struct sockaddr_in);
++#ifndef __serenity__
+ else if (req->storage.ss_family == AF_INET6)
+ salen = sizeof(struct sockaddr_in6);
++#endif
+ else
+ abort();
+
+@@ -90,10 +92,12 @@ int uv_getnameinfo(uv_loop_t* loop,
+ memcpy(&req->storage,
+ addr,
+ sizeof(struct sockaddr_in));
++#ifndef __serenity__
+ } else if (addr->sa_family == AF_INET6) {
+ memcpy(&req->storage,
+ addr,
+ sizeof(struct sockaddr_in6));
++#endif
+ } else {
+ return UV_EINVAL;
+ }
+diff --git a/Utilities/cmlibuv/src/unix/tcp.c b/Utilities/cmlibuv/src/unix/tcp.c
+index 748d6ff..ff88f3b 100644
+--- a/Utilities/cmlibuv/src/unix/tcp.c
++++ b/Utilities/cmlibuv/src/unix/tcp.c
+@@ -89,8 +89,11 @@ static int maybe_new_socket(uv_tcp_t* handle, int domain, unsigned long flags) {
+ if (getsockname(uv__stream_fd(handle), (struct sockaddr*) &saddr, &slen))
+ return UV__ERR(errno);
+
+- if ((saddr.ss_family == AF_INET6 &&
++ if (
++#ifndef __serenity__
++ (saddr.ss_family == AF_INET6 &&
+ ((struct sockaddr_in6*) &saddr)->sin6_port != 0) ||
++#endif
+ (saddr.ss_family == AF_INET &&
+ ((struct sockaddr_in*) &saddr)->sin_port != 0)) {
+ /* Handle is already bound to a port. */
+@@ -116,7 +119,11 @@ int uv_tcp_init_ex(uv_loop_t* loop, uv_tcp_t* tcp, unsigned int flags) {
+
+ /* Use the lower 8 bits for the domain */
+ domain = flags & 0xFF;
+- if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
++ if (domain != AF_INET
++#ifndef __serenity__
++ && domain != AF_INET6
++#endif
++ && domain != AF_UNSPEC)
+ return UV_EINVAL;
+
+ if (flags & ~0xFF)
+@@ -152,9 +159,11 @@ int uv__tcp_bind(uv_tcp_t* tcp,
+ int err;
+ int on;
+
++#ifndef __serenity__
+ /* Cannot set IPv6-only mode on non-IPv6 socket. */
+ if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6)
+ return UV_EINVAL;
++#endif
+
+ err = maybe_new_socket(tcp, addr->sa_family, 0);
+ if (err)
+@@ -164,7 +173,7 @@ int uv__tcp_bind(uv_tcp_t* tcp,
+ if (setsockopt(tcp->io_watcher.fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
+ return UV__ERR(errno);
+
+-#ifndef __OpenBSD__
++#if !defined(__OpenBSD__) && !defined(__serenity__)
+ #ifdef IPV6_V6ONLY
+ if (addr->sa_family == AF_INET6) {
+ on = (flags & UV_TCP_IPV6ONLY) != 0;
+@@ -194,8 +203,10 @@ int uv__tcp_bind(uv_tcp_t* tcp,
+ tcp->delayed_error = UV__ERR(errno);
+
+ tcp->flags |= UV_HANDLE_BOUND;
++#ifndef __serenity__
+ if (addr->sa_family == AF_INET6)
+ tcp->flags |= UV_HANDLE_IPV6;
++#endif
+
+ return 0;
+ }
+diff --git a/Utilities/cmlibuv/src/unix/tty.c b/Utilities/cmlibuv/src/unix/tty.c
+index 82cd723..1d6f7f2 100644
+--- a/Utilities/cmlibuv/src/unix/tty.c
++++ b/Utilities/cmlibuv/src/unix/tty.c
+@@ -345,7 +345,11 @@ uv_handle_type uv_guess_handle(uv_file file) {
+ return UV_UNKNOWN_HANDLE;
+
+ if (type == SOCK_DGRAM)
+- if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6)
++ if (sa.sa_family == AF_INET
++#ifndef __serenity__
++ || sa.sa_family == AF_INET6
++#endif
++ )
+ return UV_UDP;
+
+ if (type == SOCK_STREAM) {
+@@ -358,7 +362,11 @@ uv_handle_type uv_guess_handle(uv_file file) {
+ return UV_NAMED_PIPE;
+ #endif /* defined(_AIX) || defined(__DragonFly__) */
+
+- if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6)
++ if (sa.sa_family == AF_INET
++#ifndef __serenity__
++ || sa.sa_family == AF_INET6
++#endif
++ )
+ return UV_TCP;
+ if (sa.sa_family == AF_UNIX)
+ return UV_NAMED_PIPE;
+diff --git a/Utilities/cmlibuv/src/unix/udp.c b/Utilities/cmlibuv/src/unix/udp.c
+index 77468f9..2db3dd2 100644
+--- a/Utilities/cmlibuv/src/unix/udp.c
++++ b/Utilities/cmlibuv/src/unix/udp.c
+@@ -340,9 +340,12 @@ write_queue_drain:
+ p->msg_hdr.msg_namelen = 0;
+ } else {
+ p->msg_hdr.msg_name = &req->addr;
++#ifndef __serenity__
+ if (req->addr.ss_family == AF_INET6)
+ p->msg_hdr.msg_namelen = sizeof(struct sockaddr_in6);
+- else if (req->addr.ss_family == AF_INET)
++ else
++#endif
++ if (req->addr.ss_family == AF_INET)
+ p->msg_hdr.msg_namelen = sizeof(struct sockaddr_in);
+ else if (req->addr.ss_family == AF_UNIX)
+ p->msg_hdr.msg_namelen = sizeof(struct sockaddr_un);
+@@ -430,9 +433,12 @@ static void uv__udp_sendmsg(uv_udp_t* handle) {
+ h.msg_namelen = 0;
+ } else {
+ h.msg_name = &req->addr;
++#ifndef __serenity__
+ if (req->addr.ss_family == AF_INET6)
+ h.msg_namelen = sizeof(struct sockaddr_in6);
+- else if (req->addr.ss_family == AF_INET)
++ else
++#endif
++ if (req->addr.ss_family == AF_INET)
+ h.msg_namelen = sizeof(struct sockaddr_in);
+ else if (req->addr.ss_family == AF_UNIX)
+ h.msg_namelen = sizeof(struct sockaddr_un);
+@@ -518,8 +524,10 @@ int uv__udp_bind(uv_udp_t* handle,
+ return UV_EINVAL;
+
+ /* Cannot set IPv6-only mode on non-IPv6 socket. */
++#ifndef __serenity__
+ if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6)
+ return UV_EINVAL;
++#endif
+
+ fd = handle->io_watcher.fd;
+ if (fd == -1) {
+@@ -558,8 +566,10 @@ int uv__udp_bind(uv_udp_t* handle,
+ return err;
+ }
+
++#ifndef __serenity__
+ if (addr->sa_family == AF_INET6)
+ handle->flags |= UV_HANDLE_IPV6;
++#endif
+
+ handle->flags |= UV_HANDLE_BOUND;
+ return 0;
+@@ -1038,11 +1048,13 @@ int uv_udp_set_membership(uv_udp_t* handle,
+ if (err)
+ return err;
+ return uv__udp_set_membership4(handle, &addr4, interface_addr, membership);
++#ifndef __serenity__
+ } else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0) {
+ err = uv__udp_maybe_deferred_bind(handle, AF_INET6, UV_UDP_REUSEADDR);
+ if (err)
+ return err;
+ return uv__udp_set_membership6(handle, &addr6, interface_addr, membership);
++#endif
+ } else {
+ return UV_EINVAL;
+ }
+@@ -1058,7 +1070,7 @@ int uv_udp_set_source_membership(uv_udp_t* handle,
+ !defined(__NetBSD__) && \
+ !defined(__ANDROID__) && \
+ !defined(__DragonFly__) && \
+- !defined(__QNX__) \
++ !defined(__QNX__) && \
+ !defined(__serenity__)
+ int err;
+ union uv__sockaddr mcast_addr;
+diff --git a/Utilities/cmlibuv/src/uv-common.c b/Utilities/cmlibuv/src/uv-common.c
+index f986d75..f73840e 100644
+--- a/Utilities/cmlibuv/src/uv-common.c
++++ b/Utilities/cmlibuv/src/uv-common.c
+@@ -231,6 +231,9 @@ int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) {
+
+
+ int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) {
++#ifdef __serenity__
++ return -1;
++#else
+ char address_part[40];
+ size_t address_part_size;
+ const char* zone_index;
+@@ -262,6 +265,7 @@ int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) {
+ }
+
+ return uv_inet_pton(AF_INET6, ip, &addr->sin6_addr);
++#endif
+ }
+
+
+@@ -271,7 +275,11 @@ int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size) {
+
+
+ int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size) {
++#ifdef __serenity__
++ return -1;
++#else
+ return uv_inet_ntop(AF_INET6, &src->sin6_addr, dst, size);
++#endif
+ }
+
+
+@@ -285,8 +293,10 @@ int uv_tcp_bind(uv_tcp_t* handle,
+
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
++#ifndef __serenity__
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
++#endif
+ else
+ return UV_EINVAL;
+
+@@ -301,7 +311,11 @@ int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned flags) {
+
+ /* Use the lower 8 bits for the domain. */
+ domain = flags & 0xFF;
+- if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
++ if (domain != AF_INET
++#ifndef __serenity__
++ && domain != AF_INET6
++#endif
++ && domain != AF_UNSPEC)
+ return UV_EINVAL;
+
+ /* Use the higher bits for extra flags. */
+@@ -334,8 +348,10 @@ int uv_udp_bind(uv_udp_t* handle,
+
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
++#ifndef __serenity__
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
++#endif
+ else
+ return UV_EINVAL;
+
+@@ -354,8 +370,10 @@ int uv_tcp_connect(uv_connect_t* req,
+
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
++#ifndef __serenity__
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
++#endif
+ else
+ return UV_EINVAL;
+
+@@ -379,8 +397,10 @@ int uv_udp_connect(uv_udp_t* handle, const struct sockaddr* addr) {
+
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
++#ifndef __serenity__
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
++#endif
+ else
+ return UV_EINVAL;
+
+@@ -420,8 +440,10 @@ int uv__udp_check_before_send(uv_udp_t* handle, const struct sockaddr* addr) {
+ if (addr != NULL) {
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
++#ifndef __serenity__
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
++#endif
+ #if defined(AF_UNIX) && !defined(_WIN32)
+ else if (addr->sa_family == AF_UNIX)
+ addrlen = sizeof(struct sockaddr_un);
diff --git a/Ports/cmake/patches/0021-libcurl-no-ipv6.patch b/Ports/cmake/patches/0021-libcurl-no-ipv6.patch
new file mode 100644
index 0000000000..0a1fe87de7
--- /dev/null
+++ b/Ports/cmake/patches/0021-libcurl-no-ipv6.patch
@@ -0,0 +1,28 @@
+diff --git a/Utilities/cmcurl/lib/curl_config.h.cmake b/Utilities/cmcurl/lib/curl_config.h.cmake
+index c321f4e..7e20d2c 100644
+--- a/Utilities/cmcurl/lib/curl_config.h.cmake
++++ b/Utilities/cmcurl/lib/curl_config.h.cmake
+@@ -103,7 +103,7 @@
+ #cmakedefine EGD_SOCKET ${EGD_SOCKET}
+
+ /* Define if you want to enable IPv6 support */
+-#cmakedefine ENABLE_IPV6 1
++/* #cmakedefine ENABLE_IPV6 1 */
+
+ /* Define to the type qualifier of arg 1 for getnameinfo. */
+ #cmakedefine GETNAMEINFO_QUAL_ARG1 ${GETNAMEINFO_QUAL_ARG1}
+diff --git a/Utilities/cmcurl/lib/connect.c b/Utilities/cmcurl/lib/connect.c
+index b000b1b..e373e02 100644
+--- a/Utilities/cmcurl/lib/connect.c
++++ b/Utilities/cmcurl/lib/connect.c
+@@ -1336,8 +1336,10 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
+
+ conn->tempfamily[0] = conn->tempaddr[0]?
+ conn->tempaddr[0]->ai_family:0;
++#ifdef ENABLE_IPV6
+ conn->tempfamily[1] = conn->tempfamily[0] == AF_INET6 ?
+ AF_INET : AF_INET6;
++#endif
+ ainext(conn, 1, FALSE); /* assigns conn->tempaddr[1] accordingly */
+
+ DEBUGF(infof(data, "family0 == %s, family1 == %s\n",
diff --git a/Ports/cmake/patches/0022-remove-mutex.patch b/Ports/cmake/patches/0022-remove-mutex.patch
new file mode 100644
index 0000000000..844dc7ab97
--- /dev/null
+++ b/Ports/cmake/patches/0022-remove-mutex.patch
@@ -0,0 +1,370 @@
+diff --git a/Source/cmQtAutoGenerator.cxx b/Source/cmQtAutoGenerator.cxx
+index ee2bc09..a1c5821 100644
+--- a/Source/cmQtAutoGenerator.cxx
++++ b/Source/cmQtAutoGenerator.cxx
+@@ -61,7 +61,9 @@ void cmQtAutoGenerator::Logger::Info(GenT genType,
+ std::string msg = cmStrCat(GeneratorName(genType), ": ", message,
+ cmHasSuffix(message, '\n') ? "" : "\n");
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(Mutex_);
++#endif
+ cmSystemTools::Stdout(msg);
+ }
+ }
+@@ -80,7 +82,9 @@ void cmQtAutoGenerator::Logger::Warning(GenT genType,
+ message, cmHasSuffix(message, '\n') ? "\n" : "\n\n");
+ }
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(Mutex_);
++#endif
+ cmSystemTools::Stdout(msg);
+ }
+ }
+@@ -92,7 +96,9 @@ void cmQtAutoGenerator::Logger::Error(GenT genType,
+ cmStrCat('\n', HeadLine(cmStrCat(GeneratorName(genType), " error")),
+ message, cmHasSuffix(message, '\n') ? "\n" : "\n\n");
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(Mutex_);
++#endif
+ cmSystemTools::Stderr(msg);
+ }
+ }
+@@ -108,7 +114,9 @@ void cmQtAutoGenerator::Logger::ErrorCommand(
+ msg += cmStrCat(HeadLine("Output"), output,
+ cmHasSuffix(output, '\n') ? "\n" : "\n\n");
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(Mutex_);
++#endif
+ cmSystemTools::Stderr(msg);
+ }
+ }
+diff --git a/Source/cmQtAutoGenerator.h b/Source/cmQtAutoGenerator.h
+index b4f057d..e0970f6 100644
+--- a/Source/cmQtAutoGenerator.h
++++ b/Source/cmQtAutoGenerator.h
+@@ -55,7 +55,9 @@ public:
+ static std::string HeadLine(cm::string_view title);
+
+ private:
++#ifndef __serenity__
+ mutable std::mutex Mutex_;
++#endif
+ unsigned int Verbosity_ = 0;
+ bool ColorOutput_ = false;
+ };
+diff --git a/Source/cmQtAutoMocUic.cxx b/Source/cmQtAutoMocUic.cxx
+index 9cb172b..a365c96 100644
+--- a/Source/cmQtAutoMocUic.cxx
++++ b/Source/cmQtAutoMocUic.cxx
+@@ -586,8 +586,10 @@ private:
+ // -- Worker thread pool
+ std::atomic<bool> JobError_ = ATOMIC_VAR_INIT(false);
+ cmWorkerPool WorkerPool_;
++#ifndef __serenity__
+ // -- Concurrent processing
+ mutable std::mutex CMakeLibMutex_;
++#endif
+ };
+
+ cmQtAutoMocUicT::IncludeKeyT::IncludeKeyT(std::string const& key,
+@@ -2612,7 +2614,9 @@ void cmQtAutoMocUicT::CreateParseJobs(SourceFileMapT const& sourceMap)
+ /** Concurrently callable implementation of cmSystemTools::CollapseFullPath */
+ std::string cmQtAutoMocUicT::CollapseFullPathTS(std::string const& path) const
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> guard(CMakeLibMutex_);
++#endif
+ return cmSystemTools::CollapseFullPath(path, ProjectDirs().CurrentSource);
+ }
+
+diff --git a/Source/cmUVHandlePtr.cxx b/Source/cmUVHandlePtr.cxx
+index df2f64e..154b816 100644
+--- a/Source/cmUVHandlePtr.cxx
++++ b/Source/cmUVHandlePtr.cxx
+@@ -137,16 +137,22 @@ struct uv_handle_deleter<uv_async_t>
+ * which is mandated by the standard for Deleter on
+ * shared_ptrs.
+ */
++#ifndef __serenity__
+ std::shared_ptr<std::mutex> handleMutex;
++#endif
+
+ uv_handle_deleter()
++#ifndef __serenity__
+ : handleMutex(std::make_shared<std::mutex>())
++#endif
+ {
+ }
+
+ void operator()(uv_async_t* handle)
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(*handleMutex);
++#endif
+ handle_default_delete(handle);
+ }
+ };
+@@ -156,7 +162,9 @@ void uv_async_ptr::send()
+ auto deleter = std::get_deleter<uv_handle_deleter<uv_async_t>>(this->handle);
+ assert(deleter);
+
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(*deleter->handleMutex);
++#endif
+ if (this->handle) {
+ uv_async_send(*this);
+ }
+diff --git a/Source/cmWorkerPool.cxx b/Source/cmWorkerPool.cxx
+index 12aba4f..a3f3897 100644
+--- a/Source/cmWorkerPool.cxx
++++ b/Source/cmWorkerPool.cxx
+@@ -382,10 +382,12 @@ public:
+ cmWorkerPoolWorker(cmWorkerPoolWorker const&) = delete;
+ cmWorkerPoolWorker& operator=(cmWorkerPoolWorker const&) = delete;
+
++#ifndef __serenity__
+ /**
+ * Set the internal thread
+ */
+ void SetThread(std::thread&& aThread) { Thread_ = std::move(aThread); }
++#endif
+
+ /**
+ * Run an external process
+@@ -403,13 +405,19 @@ private:
+ // -- Process management
+ struct
+ {
++#ifndef __serenity__
+ std::mutex Mutex;
++#endif
+ cm::uv_async_ptr Request;
++#ifndef __serenity__
+ std::condition_variable Condition;
++#endif
+ std::unique_ptr<cmUVReadOnlyProcess> ROP;
+ } Proc_;
+ // -- System thread
++#ifndef __serenity__
+ std::thread Thread_;
++#endif
+ };
+
+ cmWorkerPoolWorker::cmWorkerPoolWorker(uv_loop_t& uvLoop)
+@@ -419,9 +427,11 @@ cmWorkerPoolWorker::cmWorkerPoolWorker(uv_loop_t& uvLoop)
+
+ cmWorkerPoolWorker::~cmWorkerPoolWorker()
+ {
++#ifndef __serenity__
+ if (Thread_.joinable()) {
+ Thread_.join();
+ }
++#endif
+ }
+
+ bool cmWorkerPoolWorker::RunProcess(cmWorkerPool::ProcessResultT& result,
+@@ -433,7 +443,9 @@ bool cmWorkerPoolWorker::RunProcess(cmWorkerPool::ProcessResultT& result,
+ }
+ // Create process instance
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(Proc_.Mutex);
++#endif
+ Proc_.ROP = cm::make_unique<cmUVReadOnlyProcess>();
+ Proc_.ROP->setup(&result, true, command, workingDirectory);
+ }
+@@ -441,10 +453,12 @@ bool cmWorkerPoolWorker::RunProcess(cmWorkerPool::ProcessResultT& result,
+ Proc_.Request.send();
+ // Wait until the process has been finished and destroyed
+ {
++#ifndef __serenity__
+ std::unique_lock<std::mutex> ulock(Proc_.Mutex);
+ while (Proc_.ROP) {
+ Proc_.Condition.wait(ulock);
+ }
++#endif
+ }
+ return !result.error();
+ }
+@@ -455,7 +469,9 @@ void cmWorkerPoolWorker::UVProcessStart(uv_async_t* handle)
+ bool startFailed = false;
+ {
+ auto& Proc = wrk->Proc_;
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(Proc.Mutex);
++#endif
+ if (Proc.ROP && !Proc.ROP->IsStarted()) {
+ startFailed =
+ !Proc.ROP->start(handle->loop, [wrk] { wrk->UVProcessFinished(); });
+@@ -469,12 +485,14 @@ void cmWorkerPoolWorker::UVProcessStart(uv_async_t* handle)
+
+ void cmWorkerPoolWorker::UVProcessFinished()
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> lock(Proc_.Mutex);
+ if (Proc_.ROP && (Proc_.ROP->IsFinished() || !Proc_.ROP->IsStarted())) {
+ Proc_.ROP.reset();
+ }
+ // Notify idling thread
+ Proc_.Condition.notify_one();
++#endif
+ }
+
+ /**
+@@ -521,7 +539,9 @@ public:
+ cm::uv_async_ptr UVRequestEnd;
+
+ // -- Thread pool and job queue
++#ifndef __serenity__
+ std::mutex Mutex;
++#endif
+ bool Processing = false;
+ bool Aborting = false;
+ bool FenceProcessing = false;
+@@ -529,8 +549,10 @@ public:
+ unsigned int WorkersIdle = 0;
+ unsigned int JobsProcessing = 0;
+ std::deque<cmWorkerPool::JobHandleT> Queue;
++#ifndef __serenity__
+ std::condition_variable Condition;
+ std::condition_variable ConditionFence;
++#endif
+ std::vector<std::unique_ptr<cmWorkerPoolWorker>> Workers;
+
+ // -- References
+@@ -593,18 +615,24 @@ bool cmWorkerPoolInternal::Process()
+ void cmWorkerPoolInternal::Abort()
+ {
+ // Clear all jobs and set abort flag
++#ifndef __serenity__
+ std::lock_guard<std::mutex> guard(Mutex);
++#endif
+ if (!Aborting) {
+ // Register abort and clear queue
+ Aborting = true;
+ Queue.clear();
++#ifndef __serenity__
+ Condition.notify_all();
++#endif
+ }
+ }
+
+ inline bool cmWorkerPoolInternal::PushJob(cmWorkerPool::JobHandleT&& jobHandle)
+ {
++#ifndef __serenity__
+ std::lock_guard<std::mutex> guard(Mutex);
++#endif
+ if (Aborting) {
+ return false;
+ }
+@@ -612,7 +640,9 @@ inline bool cmWorkerPoolInternal::PushJob(cmWorkerPool::JobHandleT&& jobHandle)
+ Queue.emplace_back(std::move(jobHandle));
+ // Notify an idle worker if there's one
+ if (WorkersIdle != 0) {
++#ifndef __serenity__
+ Condition.notify_one();
++#endif
+ }
+ // Return success
+ return true;
+@@ -630,11 +660,17 @@ void cmWorkerPoolInternal::UVSlotBegin(uv_async_t* handle)
+ gint.Workers.emplace_back(
+ cm::make_unique<cmWorkerPoolWorker>(*gint.UVLoop));
+ }
++#ifndef __serenity__
+ // Start worker threads
+ for (unsigned int ii = 0; ii != num; ++ii) {
+ gint.Workers[ii]->SetThread(
+ std::thread(&cmWorkerPoolInternal::Work, &gint, ii));
+ }
++#else
++ for (unsigned int ii = 0; ii != num; ++ii) {
++ gint.Work(ii);
++ }
++#endif
+ }
+ // Destroy begin request
+ gint.UVRequestBegin.reset();
+@@ -652,7 +688,9 @@ void cmWorkerPoolInternal::UVSlotEnd(uv_async_t* handle)
+ void cmWorkerPoolInternal::Work(unsigned int workerIndex)
+ {
+ cmWorkerPool::JobHandleT jobHandle;
++#ifndef __serenity__
+ std::unique_lock<std::mutex> uLock(Mutex);
++#endif
+ // Increment running workers count
+ ++WorkersRunning;
+ // Enter worker main loop
+@@ -664,7 +702,9 @@ void cmWorkerPoolInternal::Work(unsigned int workerIndex)
+ // Wait for new jobs on the main CV
+ if (Queue.empty()) {
+ ++WorkersIdle;
++#ifndef __serenity__
+ Condition.wait(uLock);
++#endif
+ --WorkersIdle;
+ continue;
+ }
+@@ -672,7 +712,9 @@ void cmWorkerPoolInternal::Work(unsigned int workerIndex)
+ // If there is a fence currently active or waiting,
+ // sleep on the main CV and try again.
+ if (FenceProcessing) {
++#ifndef __serenity__
+ Condition.wait(uLock);
++#endif
+ continue;
+ }
+
+@@ -687,12 +729,16 @@ void cmWorkerPoolInternal::Work(unsigned int workerIndex)
+ raisedFence = true;
+ // Wait on the Fence CV until all pending jobs are done.
+ while (JobsProcessing != 0 && !Aborting) {
++#ifndef __serenity__
+ ConditionFence.wait(uLock);
++#endif
+ }
+ // When aborting, explicitly kick all threads alive once more.
+ if (Aborting) {
+ FenceProcessing = false;
++#ifndef __serenity__
+ Condition.notify_all();
++#endif
+ break;
+ }
+ }
+@@ -700,10 +746,14 @@ void cmWorkerPoolInternal::Work(unsigned int workerIndex)
+ // Unlocked scope for job processing
+ ++JobsProcessing;
+ {
++#ifndef __serenity__
+ uLock.unlock();
++#endif
+ jobHandle->Work(Pool, workerIndex); // Process job
+ jobHandle.reset(); // Destroy job
++#ifndef __serenity__
+ uLock.lock();
++#endif
+ }
+ --JobsProcessing;
+
+@@ -712,12 +762,16 @@ void cmWorkerPoolInternal::Work(unsigned int workerIndex)
+ // is done.
+ if (raisedFence) {
+ FenceProcessing = false;
++#ifndef __serenity__
+ Condition.notify_all();
++#endif
+ }
+ // If fence processing is still not done, notify the
+ // the fencing worker when all active jobs are done.
+ if (FenceProcessing && JobsProcessing == 0) {
++#ifndef __serenity__
+ ConditionFence.notify_all();
++#endif
+ }
+ }
+
diff --git a/Ports/cmake/patches/0023-lround.patch b/Ports/cmake/patches/0023-lround.patch
new file mode 100644
index 0000000000..93b255ba94
--- /dev/null
+++ b/Ports/cmake/patches/0023-lround.patch
@@ -0,0 +1,26 @@
+diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
+index 5e40712..972927b 100644
+--- a/Source/cmFileCommand.cxx
++++ b/Source/cmFileCommand.cxx
+@@ -1500,7 +1500,7 @@ public:
+ long OldPercentage = this->CurrentPercentage;
+
+ if (total > 0.0) {
+- this->CurrentPercentage = std::lround(value / total * 100.0);
++ this->CurrentPercentage = trunc(round(value / total * 100.0));
+ if (this->CurrentPercentage > 100) {
+ // Avoid extra progress reports for unexpected data beyond total.
+ this->CurrentPercentage = 100;
+diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx
+index 4d1a589..0209bec 100644
+--- a/Source/CTest/cmCTestTestHandler.cxx
++++ b/Source/CTest/cmCTestTestHandler.cxx
+@@ -581,7 +581,7 @@ void cmCTestTestHandler::LogTestSummary(const std::vector<std::string>& passed,
+ }
+ cmCTestLog(this->CTest, HANDLER_OUTPUT,
+ std::endl
+- << passColorCode << std::lround(percent) << "% tests passed"
++ << passColorCode << trunc(round(percent)) << "% tests passed"
+ << this->CTest->GetColorCode(cmCTest::Color::CLEAR_COLOR)
+ << ", " << failedColorCode << failed.size() << " tests failed"
+ << this->CTest->GetColorCode(cmCTest::Color::CLEAR_COLOR)
diff --git a/Ports/cmake/patches/0024-shared-mutex.patch b/Ports/cmake/patches/0024-shared-mutex.patch
new file mode 100644
index 0000000000..a765af2d8e
--- /dev/null
+++ b/Ports/cmake/patches/0024-shared-mutex.patch
@@ -0,0 +1,85 @@
+diff --git a/Source/cmServer.cxx b/Source/cmServer.cxx
+index 7f97406..bebb100 100644
+--- a/Source/cmServer.cxx
++++ b/Source/cmServer.cxx
+@@ -251,7 +251,9 @@ cmFileMonitor* cmServer::FileMonitor() const
+ void cmServer::WriteJsonObject(const Json::Value& jsonValue,
+ const DebugInfo* debug) const
+ {
++#if 0
+ cm::shared_lock<cm::shared_mutex> lock(ConnectionsMutex);
++#endif
+ for (auto& connection : this->Connections) {
+ WriteJsonObject(connection.get(), jsonValue, debug);
+ }
+@@ -458,7 +460,9 @@ bool cmServerBase::Serve(std::string* errorMessage)
+ OnServeStart();
+
+ {
++#if 0
+ cm::shared_lock<cm::shared_mutex> lock(ConnectionsMutex);
++#endif
+ for (auto& connection : Connections) {
+ if (!connection->OnServeStart(errorMessage)) {
+ return false;
+@@ -494,7 +498,9 @@ void cmServerBase::StartShutDown()
+ SIGHUPHandler.reset();
+
+ {
++#if 0
+ std::unique_lock<cm::shared_mutex> lock(ConnectionsMutex);
++#endif
+ for (auto& connection : Connections) {
+ connection->OnConnectionShuttingDown();
+ }
+@@ -541,7 +547,9 @@ cmServerBase::~cmServerBase()
+ void cmServerBase::AddNewConnection(cmConnection* ownedConnection)
+ {
+ {
++#if 0
+ std::unique_lock<cm::shared_mutex> lock(ConnectionsMutex);
++#endif
+ Connections.emplace_back(ownedConnection);
+ }
+ ownedConnection->SetServer(this);
+@@ -558,7 +566,9 @@ void cmServerBase::OnDisconnect(cmConnection* pConnection)
+ return m.get() == pConnection;
+ };
+ {
++#if 0
+ std::unique_lock<cm::shared_mutex> lock(ConnectionsMutex);
++#endif
+ Connections.erase(
+ std::remove_if(Connections.begin(), Connections.end(), pred),
+ Connections.end());
+diff --git a/Source/cmServer.h b/Source/cmServer.h
+index 9543329..6a19be7 100644
+--- a/Source/cmServer.h
++++ b/Source/cmServer.h
+@@ -65,7 +65,9 @@ public:
+ void OnDisconnect(cmConnection* pConnection);
+
+ protected:
++#if 0
+ mutable cm::shared_mutex ConnectionsMutex;
++#endif
+ std::vector<std::unique_ptr<cmConnection>> Connections;
+
+ bool ServeThreadRunning = false;
+diff --git a/Utilities/std/cm/shared_mutex b/Utilities/std/cm/shared_mutex
+index a1204fa..d4812c8 100644
+--- a/Utilities/std/cm/shared_mutex
++++ b/Utilities/std/cm/shared_mutex
+@@ -5,6 +5,7 @@
+ file Copyright.txt or https://cmake.org/licensing for details. */
+ #pragma once
+
++#if 0
+ #if __cplusplus >= 201402L || defined(_MSVC_LANG) && _MSVC_LANG >= 201402L
+ # define CMake_HAVE_CXX_SHARED_LOCK
+ #endif
+@@ -71,3 +72,4 @@ public:
+ };
+ #endif
+ }
++#endif
diff --git a/Ports/cmake/patches/0025-uv-platform.patch b/Ports/cmake/patches/0025-uv-platform.patch
new file mode 100644
index 0000000000..95a7258fa4
--- /dev/null
+++ b/Ports/cmake/patches/0025-uv-platform.patch
@@ -0,0 +1,23 @@
+diff --git a/Utilities/cmlibuv/CMakeLists.txt b/Utilities/cmlibuv/CMakeLists.txt
+index 92d2411..e6bf241 100644
+--- a/Utilities/cmlibuv/CMakeLists.txt
++++ b/Utilities/cmlibuv/CMakeLists.txt
+@@ -354,6 +354,18 @@ if(CMAKE_SYSTEM_NAME STREQUAL "QNX")
+ )
+ endif()
+
++if (CMAKE_SYSTEM_NAME STREQUAL "SerenityOS")
++ list(APPEND uv_headers
++ include/uv/posix.h
++ )
++ list(APPEND uv_sources
++ src/unix/posix-hrtime.c
++ src/unix/posix-poll.c
++ src/unix/no-fsevents.c
++ src/unix/no-proctitle.c
++ )
++endif()
++
+ include_directories(
+ ${uv_includes}
+ ${KWSYS_HEADER_ROOT}
diff --git a/Ports/cmake/patches/0026-curl-struct-stat.patch b/Ports/cmake/patches/0026-curl-struct-stat.patch
new file mode 100644
index 0000000000..c506b8a4c5
--- /dev/null
+++ b/Ports/cmake/patches/0026-curl-struct-stat.patch
@@ -0,0 +1,12 @@
+diff --git a/Utilities/cmcurl/lib/curl_setup.h b/Utilities/cmcurl/lib/curl_setup.h
+index 45a093f..e621db3 100644
+--- a/Utilities/cmcurl/lib/curl_setup.h
++++ b/Utilities/cmcurl/lib/curl_setup.h
+@@ -380,6 +380,7 @@
+ #endif
+
+ #ifndef struct_stat
++# include <sys/stat.h>
+ # define struct_stat struct stat
+ #endif
+
diff --git a/Ports/cmake/patches/0027-libuv-platform-serenity.patch b/Ports/cmake/patches/0027-libuv-platform-serenity.patch
new file mode 100644
index 0000000000..471b830f54
--- /dev/null
+++ b/Ports/cmake/patches/0027-libuv-platform-serenity.patch
@@ -0,0 +1,13 @@
+diff --git a/Utilities/cmlibuv/include/uv/unix.h b/Utilities/cmlibuv/include/uv/unix.h
+index fb3e97d..a59192f 100644
+--- a/Utilities/cmlibuv/include/uv/unix.h
++++ b/Utilities/cmlibuv/include/uv/unix.h
+@@ -78,6 +78,8 @@
+ # include "posix.h"
+ #elif defined(__QNX__)
+ # include "posix.h"
++#elif defined(__serenity__)
++# include "posix.h"
+ #endif
+
+ #ifndef NI_MAXHOST
diff --git a/Ports/cmake/patches/0028-cmake-disable-tests.patch b/Ports/cmake/patches/0028-cmake-disable-tests.patch
new file mode 100644
index 0000000000..35a7bd0255
--- /dev/null
+++ b/Ports/cmake/patches/0028-cmake-disable-tests.patch
@@ -0,0 +1,14 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 2d860d4..343db6e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -710,7 +710,8 @@ endif()
+ include(Source/CMakeVersion.cmake)
+
+ # Include the standard Dart testing module
+-enable_testing()
++# enable_testing()
++set(BUILD_TESTING 0)
+ include (${CMAKE_ROOT}/Modules/Dart.cmake)
+
+ # Set up test-time configuration.
diff --git a/Ports/cmake/patches/ReadMe.md b/Ports/cmake/patches/ReadMe.md
new file mode 100644
index 0000000000..8ed638e7b4
--- /dev/null
+++ b/Ports/cmake/patches/ReadMe.md
@@ -0,0 +1,244 @@
+# Patches for CMake (and submodules) on SerenityOS
+
+## `0000-no_wide_string.patch`
+
+We don't support wide strings, and our libstdc++ doesn't have `std::wstring`.
+This patch is a big hack to wipe wide strings out of the codebase; naturally, it very likely breaks unicode.
+
+### Status
+- [ ] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [X] Hack
+
+## `0002-stoi-atoi.patch` and `0003-stoi-atoi-2.patch`
+
+For some reason, our libstdc++ does not define `std::stoi`, these two patches change different overloads of this function to the equivalent C functions.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0004-snprintf.patch`
+
+Our libstdc++ does not define `std::printf` and `std::snprintf`, this patch simply removes the `std` namespace.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0005-stod.patch` and `0006-stoll.patch`
+
+Our libstdc++ does not define `std::stod` and `std::stoll`, this patch swaps them with the equivalent C functions.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0007-utimes-utime.patch`
+
+`utimes` is a deprecated POSIX API, and we do not support it, this patch uses the equivalent `utime` function instead.
+
+### Status
+- [ ] Local?
+- [X] Should be merged to upstream? (Once cleaned up)
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0008-unix-stuff.patch`
+
+This patch removes the use of `{get,set}priority()` as we do not support it.
+it also removes two functions with the correct conditions (the same conditions as their dependents are removed with).
+
+### Status
+- [X] Local?
+- [X] Should be merged to upstream? Partially.
+- [X] Resolves issue(s) with our side of things
+- [X] Hack
+
+## `0009-purge-non-serenity-syscalls.patch`
+
+This patch removes syscalls and options not defined in serenity.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [X] Hack
+
+## `0010-don-t-use-siginfo.patch`
+
+We don't support SIGINFO. This patch removes uses of SIGINFO.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0011-Fixed-your-code-rot-cmake.patch`
+
+This purely fixes code issues with cmake. very funny patch.
+
+### Status
+- [ ] Local?
+- [X] Should be merged to upstream?
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0012-bin-bash.patch`
+
+This patch swaps out `/bin/sh` for `/bin/bash` in two scripts that need it.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0013-platform-serenityos.patch`
+This patch adds the SerenityOS platform config file to CMake.
+
+### Status
+- [ ] Local?
+- [X] Should be merged to upstream? If we want to have cmake support serenity out of the box.
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0014-cmcurl-include-unistd.patch`
+
+Everyone gets this wrong. most platforms are very lax with these includes, but we're not one of them.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0015-atoll.patch`
+
+Our libstdc++ does not define `std::atoll`, this patch uses the equivalent C function instead.
+
+### Status
+- [ ] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0016-conflicting-0.patch` and `0017-conflicting-1.patch`
+
+These two defines make GCC very sad. reasons are unknown at this time.
+
+### Status
+- [ ] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [X] Hack
+
+## `0018-isfinite.patch`
+
+Our `math.h` already defines `isfinite`.
+
+### Status
+- [ ] Local?
+- [X] Should be merged to upstream? If we want to have cmake support serenity out of the box.
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0019-libuv-so_linger.patch`
+
+We don't have `SO_LINGER` or its associated struct. This patch removes them.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [X] Hack
+
+## `0020-libuv-ipv6.patch`
+
+cmlibuv assumes the platform has definitions for (and supports) IPv6; this patch removes IPv6-specific things from libuv.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0021-libcurl-no-ipv6.patch`
+
+libcurl has a IPV6 switch, but uses `AF_INET6` unconditionally in one place. this patch disables IPV6 and makes that one use conditional.
+
+### Status
+- [X] Local? Partially.
+- [X] Should be merged to upstream? Partially.
+- [X] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0022-remove-mutex.patch` and `0024-shared-mutex.patch`
+
+We don't have mutexes, and out libstdc++ does not define `std::mutex`.
+This patch removes all uses of `std::mutex`, `std::condition_variable`, and anything that depends on them; and replaces them with single-threaded equivalents.
+This will break horribly with smp.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [X] Hack
+
+## `0023-lround.patch`
+
+Our libstdc++ (and stdlib) does not have `lround`, this patch replaces that with somewhat equivalent C stdlib functions.
+
+### Status
+- [X] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [X] Hack
+
+## `0025-uv-platform.patch`
+
+This patch adds the definitions necessary to compile libuv on Serenity.
+
+### Status
+- [ ] Local?
+- [X] Should be merged to upstream? If we want to have cmake support serenity out of the box.
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0026-curl-struct-stat.patch`
+
+For unknown reasons, `curl_setup_once.h` does not include `sys/stat.h`. this patch includes `sys/stat.h`.
+
+### Status
+- [ ] Local?
+- [ ] Should be merged to upstream?
+- [X] Resolves issue(s) with our side of things
+- [X] Hack
+
+## `0027-libuv-platform-serenity.patch`
+
+This patch adds a platform-specific conditional include to `uv/unix.h`.
+
+### Status
+- [ ] Local?
+- [X] Should be merged to upstream?
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack
+
+## `0028-cmake-disable-tests.patch`
+
+We don't care about building tests for now, and it makes the compilation much faster.
+
+### Status
+- [ ] Local?
+- [ ] Should be merged to upstream?
+- [ ] Resolves issue(s) with our side of things
+- [ ] Hack