Skip to content

Commit 0bc4cb6

Browse files
AdachiAndShimamuravyloy
authored andcommitted
perf: Optimize the build process on the Windows platform.
fix: fix bugs
1 parent a66d148 commit 0bc4cb6

File tree

9 files changed

+99
-155
lines changed

9 files changed

+99
-155
lines changed

BuildOnWindows.md

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
## 1.拉取子模块代码
44
git submodule update --init --recursive
55

6-
76
## 2.环境准备
87
### webrtc编译环境(webrtc版本差异会导致所依赖的msvc工具差异):
98
安装visual studio2022及组件\
@@ -14,7 +13,7 @@ git submodule update --init --recursive
1413
* 适用于v143生成工具的C++ ATL
1514
* 适用于Windows的C++ Clang工具
1615

17-
命令形式: \
16+
通过vs_installer在命令行安装: \
1817
`$ PATH_TO_INSTALLER.EXE
1918
--add Microsoft.VisualStudio.Workload.NativeDesktop
2019
--add Microsoft.VisualStudio.Component.VC.ATLMFC
@@ -31,51 +30,5 @@ winget install Microsoft.DotNet.DesktopRuntime.8 \
3130
winget install --id=Kitware.CMake -e
3231

3332

34-
35-
### 本项目编译所需环境(以下示例仅供参考,以实际路径为准):
36-
* 将 Clang 和 MSVC 路径配置到Path环境变量\
37-
MSVC: C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\Hostx64\x64 \
38-
Clang: C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\Llvm\bin \
39-
* 配置INCLUDE和LIB环境,分别包含msvc工具的include/lib目录,和Windows SDK的include/lib目录下的所有子目录\
40-
INCLUDE: \
41-
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include \
42-
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt \
43-
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um \
44-
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\winrt \
45-
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared \
46-
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\cppwinrt \
47-
LIB: \
48-
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\lib\x64 \
49-
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64 \
50-
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64 \
51-
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt_enclave\x64 \
52-
* 安装powershell 7(Windows powershell存在部分命令无法正确执行的问题,需要新版的powershell 7)
53-
54-
在powershell中配置环境变量(根据自己的实际版本进行修正):
55-
56-
$clangPath = "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\Llvm\bin" \
57-
$msvcPath = "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\Hostx64\x64"
58-
59-
$env:Path += ";$clangPath;$msvcPath"
60-
61-
$includePaths = @(
62-
"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include",
63-
"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt",
64-
"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um",
65-
"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\winrt",
66-
"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared",
67-
"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\cppwinrt"
68-
)
69-
70-
$libPaths = @(
71-
"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\lib\x64",
72-
"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64",
73-
"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64",
74-
"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt_enclave\x64"
75-
)
76-
77-
$env:INCLUDE = ($includePaths -join ";") \
78-
$env:LIB = ($libPaths -join ";")
79-
8033
## 3.编译
8134
在powershell 7中执行根目录下的build.ps1构建脚本

bin/build.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ fn main() {
3232
"{}-linux-gnu-gcc",
3333
env::var("CARGO_CFG_TARGET_ARCH").unwrap()
3434
))
35-
.arg("--print-file-name")
36-
.arg("libstdc++.a")
37-
.output()
38-
.unwrap();
35+
.arg("--print-file-name")
36+
.arg("libstdc++.a")
37+
.output()
38+
.unwrap();
3939
let mut path = PathBuf::from(String::from_utf8_lossy(&output.stdout).into_owned());
4040
path.pop();
4141
println!("cargo:rustc-link-search=native={}", path.to_str().unwrap());
@@ -56,8 +56,10 @@ fn main() {
5656
println!("cargo:rustc-link-lib=framework=CoreMedia");
5757
println!("cargo:rustc-link-lib=framework=AVFoundation");
5858
}
59-
"windows"=>{
60-
//do nothing
59+
"windows" => {
60+
println!("cargo:rerun-if-changed=libcs/release/windows");
61+
println!("cargo:rustc-link-search=libcs/release/windows");
62+
println!("cargo:rustc-link-lib=static=gt");
6163
}
6264
os => {
6365
panic!("Unsupported OS: {}", os)

bin/src/cs.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ pub fn run_client(client_args: ClientArgs) {
6565
};
6666
let (args, go_str) = convert_to_go_slices(&args);
6767
unsafe {
68+
#[cfg(target_os = "windows")]
69+
{
70+
_rt0_amd64_windows_lib();
71+
}
72+
6873
RunClient(args);
6974
}
7075
}
@@ -77,6 +82,17 @@ pub fn run_server(server_args: ServerArgs) {
7782
};
7883
let (args, go_str) = convert_to_go_slices(&args);
7984
unsafe {
85+
#[cfg(target_os = "windows")]
86+
{
87+
_rt0_amd64_windows_lib();
88+
}
89+
8090
RunServer(args);
8191
}
8292
}
93+
94+
95+
#[cfg(target_os = "windows")]
96+
extern "C" {
97+
fn _rt0_amd64_windows_lib();
98+
}

bin/src/cs_bindings.rs

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -188,39 +188,10 @@ fn bindgen_test_layout_GoSlice() {
188188
}
189189

190190

191-
#[cfg(not(target_os = "windows"))]
192191
extern "C" {
193192
pub fn RunServer(args: GoSlice);
194193
}
195194

196-
#[cfg(not(target_os = "windows"))]
197195
extern "C" {
198196
pub fn RunClient(args: GoSlice);
199-
}
200-
201-
#[cfg(target_os = "windows")]
202-
const DLL_DATA: &'static [u8] = include_bytes!("../../libcs/msvc-build/target/gt.dll");
203-
204-
#[cfg(target_os = "windows")]
205-
pub fn InitGtDll() {
206-
let mut dll_file = File::create( temp_dir().join("gt.dll")).expect("Failed to create DLL file");
207-
dll_file.write_all(DLL_DATA).expect("Failed to write DLL data to file");
208-
}
209-
210-
#[cfg(target_os = "windows")]
211-
fn RunServer(args: GoSlice) {
212-
unsafe {
213-
let lib = libloading::Library::new( temp_dir().join("gt.dll")).unwrap();
214-
let func: libloading::Symbol<unsafe extern fn(GoSlice)> = lib.get(b"RunServer").unwrap();
215-
func(args);
216-
}
217-
}
218-
219-
#[cfg(target_os = "windows")]
220-
fn RunClient(args: GoSlice) {
221-
unsafe {
222-
let lib = libloading::Library::new( temp_dir().join("gt.dll")).unwrap();
223-
let func: libloading::Symbol<unsafe extern fn(GoSlice)> = lib.get(b"RunClient").unwrap();
224-
func(args);
225-
}
226197
}

bin/src/main.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,6 @@ enum Commands {
5858
}
5959

6060
fn main() {
61-
#[cfg(target_os = "windows")]
62-
{
63-
cs::InitGtDll();
64-
}
65-
6661
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
6762
let cli = Cli::parse();
6863
if let Some(signal) = cli.signal {

build.ps1

Lines changed: 74 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,33 @@ $WEBRTC_DIR="$WORK_DIR/libcs/dep/_google-webrtc"
33
$MSQUIC_DIR="$WORK_DIR/libcs/dep/_msquic"
44
$WEBRTC_OUT_DIR="$WEBRTC_DIR/src/out/release/obj"
55
$MSQUIC_OUT_DIR="$MSQUIC_DIR/build/windows/x64_schannel/obj/Release"
6-
$MSVC_BUILD_DIR="$WORK_DIR/libcs/msvc-build"
6+
$WEB_FRONT="$WORK_DIR/libcs/web/front"
77

88
$env:CC="clang"
99
$env:CXX="clang++"
10-
$env:CXXFLAGS="-I$WEBRTC_DIR/src -I$WEBRTC_DIR/src/third_party/abseil-cpp -I$MSQUIC_DIR/src/inc -std=c++17 -DWEBRTC_WIN -DQUIC_API_ENABLE_PREVIEW_FEATURES -DNOMINMAX"
10+
$env:CGO_CXXFLAGS="-I$WEBRTC_DIR/src -I$WEBRTC_DIR/src/third_party/abseil-cpp -I$MSQUIC_DIR/src/inc -std=c++17 -DWEBRTC_WIN -DQUIC_API_ENABLE_PREVIEW_FEATURES -DNOMINMAX"
1111
$env:CGO_LDFLAGS="-L$MSQUIC_DIR/build/windows/x64_schannel/obj/Release -L$WEBRTC_DIR/src/out/release/obj -lmsquic.lib -lwebrtc.lib"
1212
$env:CARGO_CFG_TARGET_OS="windows"
13+
$env:RUSTFLAGS="-L $MSQUIC_OUT_DIR -l msquic -L $WEBRTC_OUT_DIR -l webrtc"
1314

1415
$env:DEPOT_TOOLS_WIN_TOOLCHAIN="0"
1516
$env:GYP_GENERATORS="msvs-ninja,ninja"
1617
$env:GYP_MSVS_OVERRIDE_PATH="C:\Program Files\Microsoft Visual Studio\2022\Community"
1718
$env:GYP_MSVS_VERSION="2022"
19+
$env:PATH+=";C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\Ninja"
20+
# 检查 Pscx 模块是否已安装
21+
if (-not (Get-Module -Name Pscx -ListAvailable)) {
22+
Write-Host "安装Pscx PowerShell插件"
23+
Install-Module -Name Pscx -AllowPrerelease -Force
24+
}
25+
26+
# 检查 VSSetup 模块是否已安装
27+
if (-not (Get-Module -Name VSSetup -ListAvailable)) {
28+
Write-Host "安装VSSetup PowerShell插件"
29+
Install-Module -Name VSSetup -AllowPrerelease -Force
30+
}
31+
32+
Import-VisualStudioVars 2022 amd64
1833

1934
Set-Location $WORK_DIR
2035
function complie_webrtc{
@@ -34,8 +49,25 @@ function complie_webrtc{
3449
}
3550
}
3651

52+
function CheckAdministrator {
53+
$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
54+
$principal = New-Object Security.Principal.WindowsPrincipal($currentUser)
55+
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
56+
}
57+
3758
function complie_msquic{
3859
Set-Location $MSQUIC_DIR
60+
if (!(Test-Path -Path "$MSQUIC_DIR/artifacts")){
61+
Write-Host "msquic未初始化依赖项,正在初始化"
62+
if (CheckAdministrator) {
63+
&./scripts/prepare-machine.ps1
64+
} else {
65+
Write-Output "当前未以管理员权限运行"
66+
Set-Location $WORK_DIR
67+
exit
68+
}
69+
70+
}
3971
Write-Host "msquic开始编译"
4072
&./scripts/build.ps1 -Config Release -Clean -Static -DisableTest -DisableTools -StaticCRT
4173
if (Test-Path -Path "$MSQUIC_OUT_DIR/msquic.lib")
@@ -50,39 +82,51 @@ function complie_msquic{
5082
}
5183
}
5284

85+
function release_front{
86+
Set-Location $WEB_FRONT
87+
$npmCommand = Get-Command npm -ErrorAction SilentlyContinue
5388

54-
function release_gt_dylib{
55-
Set-Location "$WORK_DIR/libcs"
56-
Write-Host "开始编译gt server/client"
57-
go build -tags release -trimpath -ldflags "-s -w" -buildmode=c-archive -o release/gt.lib ./lib/export
58-
if (Test-Path -Path "./release/gt.lib")
59-
{
60-
Write-Host "gt server/client编译完成"
89+
if ($null -ne $npmCommand) {
90+
Write-Output "npm 命令可用,进行下一步"
91+
} else {
92+
Write-Output "npm 命令不可用,正在安装node.js"
93+
winget install --id=OpenJS.NodeJS -e
6194
}
62-
else
95+
96+
if(Test-Path -Path "$WORK_DIR/libcs/client/web/dist"){
97+
Remove-Item -Path "$WORK_DIR/libcs/client/web/dist" -Recurse -Force
98+
}
99+
if(Test-Path -Path "$WORK_DIR/libcs/server/web/dist"){
100+
Remove-Item -Path "$WORK_DIR/libcs/server/web/dist" -Recurse -Force
101+
}
102+
if (Test-Path -Path "$WEB_FRONT/dist")
63103
{
64-
Write-Host "gt server/client编译失败"
65-
Set-Location $WORK_DIR
66-
exit
104+
Remove-Item -Path "$WEB_FRONT/dist" -Recurse -Force
67105
}
68-
Set-Location ./msvc-build
106+
npm install
107+
npm run "build:pro"
69108

70-
$directory = "$WORK_DIR/libcs/msvc-build/target"
71-
if (-not (Test-Path -Path $directory -PathType Container)) {
72-
New-Item -Path $directory -ItemType Directory -Force
73-
Write-Host "目录已创建:$directory"
74-
} else {
75-
Write-Host "目录已存在:$directory"
109+
if (Test-Path -Path "$WEB_FRONT/dist")
110+
{
111+
Copy-Item -Path "$WEB_FRONT/dist" -Destination "$WORK_DIR/libcs/client/web/dist" -Recurse
112+
Copy-Item -Path "$WEB_FRONT/dist" -Destination "$WORK_DIR/libcs/server/web/dist" -Recurse
113+
Write-Host "web front编译完成"
76114
}
77-
Write-Host "开始编译发布gt server/client动态库"
78-
cl /LD /MT /Fe:$MSVC_BUILD_DIR/gt.dll gt.cpp /link /DEF:gt.def "../release/gt.lib" "$MSQUIC_OUT_DIR/msquic.lib" "$WEBRTC_OUT_DIR/webrtc.lib" ntdll.lib
79-
if (Test-Path -Path "$MSVC_BUILD_DIR/gt.dll")
115+
}
116+
117+
function release_gt_lib{
118+
release_front
119+
120+
Set-Location "$WORK_DIR/libcs"
121+
Write-Host "开始编译gt server/client"
122+
go build -tags release -trimpath -ldflags "-s -w" -buildmode=c-archive -o release/windows/gt.lib ./lib/export
123+
if (Test-Path -Path "./release/windows/gt.lib")
80124
{
81-
Write-Host "动态库编译完成"
125+
Write-Host "gt server/client编译完成"
82126
}
83127
else
84128
{
85-
Write-Host "动态库编译失败"
129+
Write-Host "gt server/client编译失败"
86130
Set-Location $WORK_DIR
87131
exit
88132
}
@@ -102,5 +146,8 @@ if (!(Test-Path -Path "$WEBRTC_OUT_DIR/webrtc.lib")){
102146
if (!(Test-Path -Path "$MSQUIC_OUT_DIR/msquic.lib")){
103147
complie_msquic
104148
}
105-
release_gt_dylib
106-
release_gt_exe
149+
release_gt_lib
150+
release_gt_exe
151+
152+
New-Item -ItemType Directory -Force -Path "$WORK_DIR/release"
153+
Copy-Item -Path "$WORK_DIR/target/x86_64-pc-windows-msvc/release/gt.exe" -Destination "$WORK_DIR/release/gt-win-x86_64.exe"

libcs/msvc-build/cgo.cpp

Lines changed: 0 additions & 17 deletions
This file was deleted.

libcs/msvc-build/gt.cpp

Lines changed: 0 additions & 19 deletions
This file was deleted.

libcs/msvc-build/gt.def

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)