diff --git a/1k/1kiss.ps1 b/1k/1kiss.ps1 index bf5d769c..77e9e983 100644 --- a/1k/1kiss.ps1 +++ b/1k/1kiss.ps1 @@ -210,9 +210,8 @@ $manifest = @{ cmdlinetools = '7.0+'; # android cmdlinetools } -# the default generator of unix targets: linux, osx, ios, android, wasm +# the default generator requires explicit specified: osx, ios, android, wasm $cmake_generators = @{ - 'linux' = 'Unix Makefiles' 'android' = 'Ninja' 'wasm' = 'Ninja' 'wasm64' = 'Ninja' @@ -251,6 +250,7 @@ $options = @{ u = $false # whether delete 1kdist cross-platform prebuilt folder: path/to/_x dm = $false # dump compiler preprocessors i = $false # perform install + scope = 'local' } $optName = $null @@ -484,6 +484,9 @@ function devtool_url($filename) { function version_eq($ver1, $ver2) { return $ver1 -eq $ver2 } +function version_like($ver1, $ver2) { + return $ver1 -like $ver2 +} # $ver2: accept x.y.z-rc1 function version_ge($ver1, $ver2) { @@ -569,6 +572,7 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params = $checkVerCond = $null $minimalVer = '' $preferredVer = '' + $wildcardVer = '' $requiredVer = $manifest[$name] if ($requiredVer) { $preferredVer = $null @@ -585,12 +589,19 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params = $preferredVer = $preferredVer.TrimEnd('+') if ($minimalVer.EndsWith('+')) { $minimalVer = $minimalVer.TrimEnd('+') } $checkVerCond = '$(version_ge $foundVer $minimalVer)' - } else { + } + else { if ($isRange) { $checkVerCond = '$(version_in_range $foundVer $minimalVer $preferredVer)' } else { - $checkVerCond = '$(version_eq $foundVer $preferredVer)' + if (!$preferredVer.Contains('*')) { + $checkVerCond = '$(version_eq $foundVer $preferredVer)' + } else { + $wildcardVer = $preferredVer + $preferredVer = $wildcardVer.TrimEnd('.*') + $checkVerCond = '$(version_like $foundVer $wildcardVer)' + } } } } @@ -644,7 +655,6 @@ function find_prog($name, $path = $null, $mode = 'ONLY', $cmd = $null, $params = } else { if ($preferredVer) { - # if (!$silent) { $1k.println("Not found $name, needs install: $preferredVer") } $found_rets = $null, $preferredVer } else { @@ -833,7 +843,7 @@ function setup_ninja() { } # setup cmake -function setup_cmake($skipOS = $false, $scope = 'local') { +function setup_cmake($skipOS = $false) { $cmake_prog, $cmake_ver = find_prog -name 'cmake' if ($cmake_prog -and (!$skipOS -or $cmake_prog.Contains($myRoot))) { return $cmake_prog, $cmake_ver @@ -887,13 +897,15 @@ function setup_cmake($skipOS = $false, $scope = 'local') { } } elseif ($IsLinux) { - if ($scope -ne 'global') { + if ($option.scope -ne 'global') { $1k.mkdirs($cmake_root) & "$cmake_pkg_path" '--skip-license' '--exclude-subdir' "--prefix=$cmake_root" 1>$null 2>$null } else { - & "$cmake_pkg_path" '--skip-license' '--prefix=/usr/local' 1>$null 2>$null + $cmake_bin = '/usr/local/bin' + sudo bash "$cmake_pkg_path" '--skip-license' '--prefix=/usr/local' 1>$null 2>$null } + if (!$?) { Remove-Item $cmake_pkg_path -Force } } $cmake_prog, $_ = find_prog -name 'cmake' -path $cmake_bin -silent $true @@ -903,6 +915,7 @@ function setup_cmake($skipOS = $false, $scope = 'local') { $1k.println("Using cmake: $cmake_prog, version: $cmake_ver") } + $1k.addpath($cmake_bin) return $cmake_prog, $cmake_ver } @@ -1220,7 +1233,9 @@ function setup_msvc() { if (!$cl_prog) { if ($VS_INST) { Import-Module "$VS_PATH\Common7\Tools\Microsoft.VisualStudio.DevShell.dll" - Enter-VsDevShell -VsInstanceId $VS_INST.instanceId -SkipAutomaticLocation -DevCmdArguments "-arch=$target_cpu -host_arch=x64 -no_logo" + $dev_cmd_args = "-arch=$target_cpu -host_arch=x64 -no_logo" + if (!$manifest['msvc'].EndsWith('+')) { $dev_cmd_args += " -vcvars_ver=$cl_ver" } + Enter-VsDevShell -VsInstanceId $VS_INST.instanceId -SkipAutomaticLocation -DevCmdArguments $dev_cmd_args $cl_prog, $cl_ver = find_prog -name 'msvc' -cmd 'cl' -silent $true -usefv $true $1k.println("Using msvc: $cl_prog, version: $cl_ver") @@ -1560,7 +1575,7 @@ elseif ($Global:is_android) { $ninja_prog = setup_ninja # ensure ninja in cmake_bin if (!(ensure_cmake_ninja $cmake_prog $ninja_prog)) { - $cmake_prog, $Script:cmake_ver = setup_cmake -Force + $cmake_prog, $Script:cmake_ver = setup_cmake -skipOS $true if (!(ensure_cmake_ninja $cmake_prog $ninja_prog)) { $1k.println("Ensure ninja in cmake bin directory fail") } @@ -1589,6 +1604,7 @@ elseif ($Global:is_wasm) { } $is_host_target = $Global:is_win32 -or $Global:is_linux -or $Global:is_mac +$is_host_cpu = $HOST_CPU -eq $TARGET_CPU if (!$setupOnly) { $BUILD_DIR = $null @@ -1596,7 +1612,11 @@ if (!$setupOnly) { function resolve_out_dir($prefix) { if ($is_host_target) { - $out_dir = "${prefix}${TARGET_CPU}" + if (!$is_host_cpu) { + $out_dir = "${prefix}${TARGET_CPU}" + } else { + $out_dir = $prefix.TrimEnd("_") + } } else { $out_dir = "${prefix}${TARGET_OS}" @@ -1707,7 +1727,7 @@ if (!$setupOnly) { } } - if (!$cmake_generator -and !$TARGET_OS.StartsWith('win')) { + if (!$cmake_generator -and !$TARGET_OS.StartsWith('win') -and $TARGET_OS -ne 'linux') { $cmake_generator = $cmake_generators[$TARGET_OS] if ($null -eq $cmake_generator) { $cmake_generator = if (!$IsWin) { 'Unix Makefiles' } else { 'Ninja' } diff --git a/1k/fetch.cmake b/1k/fetch.cmake index 4556042a..6fa0c080 100644 --- a/1k/fetch.cmake +++ b/1k/fetch.cmake @@ -20,10 +20,16 @@ function(_1kfetch_init) set(_1kfetch_manifest "${_1kfetch_manifest}" CACHE STRING "" FORCE) endif() + if(NOT EXISTS ${PWSH_PROG}) # try again + unset(PWSH_PROG CACHE) + find_program(PWSH_PROG NAMES pwsh powershell NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH) + endif() + execute_process(COMMAND ${PWSH_PROG} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/resolv-uri.ps1 -name "1kdist" -manifest ${_1kfetch_manifest} OUTPUT_VARIABLE _1kdist_url + RESULT_VARIABLE _1kdist_error ) if(_1kdist_url) @@ -33,7 +39,7 @@ function(_1kfetch_init) set(_1kdist_base_url "${_1kdist_base_url}/${_1kdist_ver}" PARENT_SCOPE) set(_1kdist_ver ${_1kdist_ver} PARENT_SCOPE) else() - message(WARNING "Resolve 1kdist uri fail, the _1kfetch_dist will not work") + message(WARNING "Resolve 1kdist uri fail, ${_1kdist_error}, the _1kfetch_dist will not work") endif() endfunction() diff --git a/1k/fetch.ps1 b/1k/fetch.ps1 index 38ddab68..411c38fb 100644 --- a/1k/fetch.ps1 +++ b/1k/fetch.ps1 @@ -50,8 +50,8 @@ function fetch_repo($url, $name, $dest, $ext) { if ($ext -eq '.zip') { Expand-Archive -Path $out -DestinationPath $prefix -Force } - elseif ($ext -match '\.tar(\..*)?$'){ - tar xf "$out" -C $prefix + elseif ($ext -match '\.tar(\..*)?$') { + tar xvf "$out" -C $prefix } } catch { @@ -62,7 +62,22 @@ function fetch_repo($url, $name, $dest, $ext) { if (!(Test-Path $dest -PathType Container)) { $original_lib_src = Join-Path $prefix $Script:url_pkg_name if (Test-Path $original_lib_src -PathType Container) { - Rename-Item $original_lib_src $dest -Force + $tries = 0 + do { + try { + Rename-Item $original_lib_src $dest -Force + if ($?) { + break + } + } + catch { + + } + + println "fetch.ps1: rename $original_lib_src to $dest failed, try after 1 seconds" + $tries += 1 + Start-Sleep -Seconds 1 + } while ($tries -lt 10) } else { throw "fetch.ps1: the package name mismatch for $out" diff --git a/1k/setup-msvc.ps1 b/1k/setup-msvc.ps1 index 3839c47a..eb06c162 100644 --- a/1k/setup-msvc.ps1 +++ b/1k/setup-msvc.ps1 @@ -1,18 +1,22 @@ param( - $ver = '14.39' + $ver = '14.39', + $arch = 'x64' ) $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" $vs_installs = ConvertFrom-Json "$(&$vswhere -version '17.0' -format 'json')" $vs_installs -$vs_installer = '${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\setup.exe' +$vs_installer = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\setup.exe" $vs_path = $vs_installs[0].installationPath -$msvc_comp_id = "Microsoft.VisualStudio.Component.VC.$ver.17.9.x86.x64" # refer to: https://learn.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2022 + +$vs_arch = @{x64 = 'x86.x64'; x86 = 'x86.x64'; arm64 = 'ARM64'; arm = 'ARM' }[$arch] +$msvc_comp_id = "Microsoft.VisualStudio.Component.VC.$ver.17.9.$vs_arch" # refer to: https://learn.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2022 echo "Installing $msvc_comp_id ..." &$vs_installer modify --quiet --installPath $vs_path --add $msvc_comp_id | Out-Host -if($?) { +if ($?) { echo 'setup msvc success.' -} else { +} +else { echo 'setup msvc fail' } diff --git a/3rdparty/lua b/3rdparty/lua index 64431851..1ab3208a 160000 --- a/3rdparty/lua +++ b/3rdparty/lua @@ -1 +1 @@ -Subproject commit 6443185167c77adcc8552a3fee7edab7895db1a9 +Subproject commit 1ab3208a1fceb12fca8f24ba57d6e13c5bff15e3 diff --git a/manifest.json b/manifest.json index 927c1353..433f64a2 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "versions": { - "1kdist": "v86" + "1kdist": "v90" }, "mirrors": { "github": { diff --git a/yasio/config.hpp b/yasio/config.hpp index 6ae79af5..76f7d741 100644 --- a/yasio/config.hpp +++ b/yasio/config.hpp @@ -205,7 +205,7 @@ SOFTWARE. /* ** The yasio version macros */ -#define YASIO_VERSION_NUM 0x040204 +#define YASIO_VERSION_NUM 0x040205 /* ** The macros used by io_service. diff --git a/yasio/io_service.cpp b/yasio/io_service.cpp index fa39f076..89e70765 100644 --- a/yasio/io_service.cpp +++ b/yasio/io_service.cpp @@ -376,7 +376,7 @@ int io_transport::write(io_send_buffer&& buffer, completion_cb_t&& handler) get_service().wakeup(); return n; } -int io_transport::do_read(int revent, int& error, highp_time_t&) { return this->call_read(buffer_ + offset_, sizeof(buffer_) - offset_, revent, error); } +int io_transport::do_read(int revent, int& error, highp_time_t&) { return this->call_read(buffer_.data() + offset_, static_cast(buffer_.size() - offset_), revent, error); } bool io_transport::do_write(highp_time_t& wait_duration) { bool ret = false; @@ -728,7 +728,14 @@ int io_transport_kcp::do_read(int revent, int& error, highp_time_t& wait_duratio this->handle_input(rawbuf_.data(), n, error, wait_duration); if (!error) { // !important, should always try to call ikcp_recv when no error occured. - n = ::ikcp_recv(kcp_, buffer_ + offset_, sizeof(buffer_) - offset_); + auto kdata_size = ::ikcp_peeksize(kcp_); + if (kdata_size > 0) + { + auto need_size = static_cast(kdata_size + offset_); + if (buffer_.size() < need_size) + buffer_.resize(kdata_size + offset_); + n = ::ikcp_recv(kcp_, buffer_.data() + offset_, kdata_size); + } if (n > 0) // If got data from kcp, don't wait wait_duration = 0; else if (n < 0) @@ -1767,7 +1774,7 @@ bool io_service::do_read(transport_handle_t transport) const int bytes_to_strip = transport->ctx_->uparams_.initial_bytes_to_strip; if (transport->expected_size_ == -1) { // decode length - int length = transport->ctx_->decode_len_(transport->buffer_, transport->offset_ + n); + int length = transport->ctx_->decode_len_(transport->buffer_.data(), transport->offset_ + n); if (length > 0) { if (length < bytes_to_strip) @@ -1793,7 +1800,7 @@ bool io_service::do_read(transport_handle_t transport) } else if (n > 0) { // forward packet, don't perform unpack, it's useful for implement streaming based protocol, like http, websocket and ... - this->forward_packet(transport->cindex(), io_packet_view{transport->buffer_, n}, transport); + this->forward_packet(transport->cindex(), io_packet_view{transport->buffer_.data(), n}, transport); } } else @@ -1811,7 +1818,7 @@ void io_service::unpack(transport_handle_t transport, int bytes_want /*want cons auto& offset = transport->offset_; auto bytes_available = bytes_transferred + offset; auto& pkt = transport->expected_packet_; - pkt.insert(pkt.end(), transport->buffer_ + bytes_to_strip, transport->buffer_ + (std::min)(bytes_want, bytes_available)); + pkt.insert(pkt.end(), transport->buffer_.data() + bytes_to_strip, transport->buffer_.data() + (std::min)(bytes_want, bytes_available)); // set 'offset' to bytes of remain buffer offset = bytes_available - bytes_want; @@ -1819,7 +1826,7 @@ void io_service::unpack(transport_handle_t transport, int bytes_want /*want cons { /* pdu received properly */ if (offset > 0) { /* move remain data to head of buffer and hold 'offset'. */ - ::memmove(transport->buffer_, transport->buffer_ + bytes_want, offset); + ::memmove(transport->buffer_.data(), transport->buffer_.data() + bytes_want, offset); this->wait_duration_ = 0; } // move properly pdu to ready queue, the other thread who care about will retrieve it. diff --git a/yasio/io_service.hpp b/yasio/io_service.hpp index eba21ae6..73737cf9 100644 --- a/yasio/io_service.hpp +++ b/yasio/io_service.hpp @@ -778,7 +778,7 @@ class io_transport : public io_base { bool is_valid() const { return ctx_ != nullptr; } - char buffer_[yasio__max_rcvbuf]; // recv buffer, 64K + yasio::sbyte_buffer buffer_{static_cast(yasio__max_rcvbuf)}; int offset_ = 0; // recv buffer offset int expected_size_ = -1;