Author SHA1 Message Date
maxime1907 1645dc15cf fix: new build system 2025-03-16 18:01:06 +01:00
10 changed files with 61 additions and 188 deletions
+33 -42
View File
@@ -13,18 +13,16 @@ on:
- main - main
jobs: jobs:
build-libuv-linux: build-libuv:
runs-on: ubuntu-24.04 runs-on: ubuntu-20.04
env: env:
CC: "clang-14" LIBUV_REF: 'v1.44.2'
CXX: "clang++-14" CC: "clang-10"
CXX: "clang++-10"
steps: steps:
- name: Checkout repository with submodules
uses: actions/checkout@v7
with:
submodules: recursive
- name: Install Linux dependencies - name: Install Linux dependencies
shell: bash
if: startsWith(runner.os, 'Linux')
run: | run: |
sudo dpkg --add-architecture i386 sudo dpkg --add-architecture i386
sudo apt-get update sudo apt-get update
@@ -33,49 +31,42 @@ jobs:
libc6-dev libc6-dev-i386 linux-libc-dev \ libc6-dev libc6-dev-i386 linux-libc-dev \
linux-libc-dev:i386 lib32z1-dev ${{ env.CC }} linux-libc-dev:i386 lib32z1-dev ${{ env.CC }}
- name: Build and install libuv (Linux x86) - name: Select compiler
shell: bash
if: startsWith(runner.os, 'Linux')
run: |
echo "CC=${{ env.CC }}" >> $GITHUB_ENV
echo "CXX=${{ env.CXX }}" >> $GITHUB_ENV
${{ env.CC }} --version
${{ env.CXX }} --version
- name: Checkout libuv
uses: actions/checkout@v4
with:
repository: libuv/libuv
ref: ${{ env.LIBUV_REF }}
path: libuv
submodules: recursive
- name: Build libuv
working-directory: libuv working-directory: libuv
run: | run: |
bash autogen.sh bash autogen.sh
./configure --prefix="$(pwd)/dist" --build=i686-pc-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --disable-shared --enable-static ./configure --build=i686-pc-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --disable-shared --enable-static
make -j 8 make -j 8
make install
- name: Upload libuv Linux Artifact - name: Upload libuv
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: libuv-linux name: libuv
path: libuv/dist include-hidden-files: true
retention-days: 1 path: libuv
if-no-files-found: error
build-libuv-windows:
runs-on: windows-2022
steps:
- name: Checkout repository with submodules
uses: actions/checkout@v7
with:
submodules: recursive
- name: Build and install libuv (Windows x86)
shell: cmd
working-directory: libuv
run: |
mkdir build
cd build
cmake .. -A Win32 -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>" -DCMAKE_INSTALL_PREFIX=..\dist
cmake --build . --config Release --target install
- name: Upload libuv Windows Artifact
uses: actions/upload-artifact@v4
with:
name: libuv-windows
path: libuv/dist
retention-days: 1 retention-days: 1
build-release-extension: build-release-extension:
uses: srcdslab/ci-workflows/.github/workflows/shared_build_release_am_extension.yml@v1 uses: srcdslab/ci-workflows/.github/workflows/shared_build_release_am_extension.yml@v1
needs: [build-libuv-linux, build-libuv-windows] needs: build-libuv
with: with:
sdks: "sdk2013" sdks: "sdk2013"
artifact-path: "libuv/dist" artifact-path: "."
submodules: "recursive"
-3
View File
@@ -1,6 +1,3 @@
[submodule "sm-ext-common"] [submodule "sm-ext-common"]
path = sm-ext-common path = sm-ext-common
url = https://github.com/srcdslab/sm-ext-common url = https://github.com/srcdslab/sm-ext-common
[submodule "libuv"]
path = libuv
url = https://github.com/libuv/libuv.git
Submodule libuv deleted from 9d51562c10
@@ -20,7 +20,7 @@ methodmap AsyncSocket < Handle {
public bool WriteNull(const char[] data) public bool WriteNull(const char[] data)
{ {
return this.Write(data, strlen(data) + 1); this.Write(data, strlen(data) + 1);
} }
public native bool SetConnectCallback(AsyncSocketConnectCallback callback); public native bool SetConnectCallback(AsyncSocketConnectCallback callback);
@@ -28,8 +28,6 @@ methodmap AsyncSocket < Handle {
public native bool SetErrorCallback(AsyncSocketErrorCallback callback); public native bool SetErrorCallback(AsyncSocketErrorCallback callback);
public native bool SetDataCallback(AsyncSocketDataCallback callback); public native bool SetDataCallback(AsyncSocketDataCallback callback);
public native void GetClientIP(char[] buffer, int length);
} }
/** /**
@@ -61,6 +59,5 @@ public __ext_AsyncSocket_SetNTVOptional()
MarkNativeAsOptional("AsyncSocket.SetConnectCallback"); MarkNativeAsOptional("AsyncSocket.SetConnectCallback");
MarkNativeAsOptional("AsyncSocket.SetErrorCallback"); MarkNativeAsOptional("AsyncSocket.SetErrorCallback");
MarkNativeAsOptional("AsyncSocket.SetDataCallback"); MarkNativeAsOptional("AsyncSocket.SetDataCallback");
MarkNativeAsOptional("AsyncSocket.GetClientIP");
} }
#endif #endif
+1 -1
View File
@@ -1 +1 @@
1.1.1 1.0.1
+16 -57
View File
@@ -1,3 +1,4 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
import os import os
projectName = 'AsyncSocket' projectName = 'AsyncSocket'
@@ -6,13 +7,9 @@ project = builder.LibraryProject(projectName)
project.sources += [ project.sources += [
os.path.join(Extension.ext_root, 'src', 'extension.cpp'), os.path.join(Extension.ext_root, 'src', 'extension.cpp'),
os.path.join(Extension.ext_root, 'src', 'context.cpp'), os.path.join(Extension.ext_root, 'src', 'context.cpp'),
os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp'), os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp')
] ]
# Include header path directly from submodule
libuv_inc = os.path.join(Extension.ext_root, 'libuv', 'include')
libuv_root = os.path.join(Extension.ext_root, 'libuv')
for sdk_name in Extension.sdks: for sdk_name in Extension.sdks:
sdk = Extension.sdks[sdk_name] sdk = Extension.sdks[sdk_name]
if sdk['name'] in ['mock']: if sdk['name'] in ['mock']:
@@ -22,61 +19,23 @@ for sdk_name in Extension.sdks:
if not cxx.target.arch in sdk['platforms'][cxx.target.platform]: if not cxx.target.arch in sdk['platforms'][cxx.target.platform]:
continue continue
binary = Extension.HL2ExtConfig( binary = Extension.HL2ExtConfig(project, builder, cxx, projectName + '.ext', sdk)
project, builder, cxx, projectName + '.ext', sdk
)
# Include uv.h path
binary.compiler.cxxincludes += [libuv_inc]
# Platform-specific linking
if cxx.target.platform == 'windows': if cxx.target.platform == 'windows':
binary.compiler.linkflags += ['ws2_32.lib']
libuv_root = os.path.join(Extension.ext_root, 'libuv')
binary.compiler.cxxincludes += [
os.path.join(libuv_root, 'include'),
]
# TODO: add proper linux support for x64
if cxx.target.arch in ['x86'] and cxx.target.platform in ['linux']:
binary.compiler.linkflags += [ binary.compiler.linkflags += [
'ws2_32.lib', os.path.join(libuv_root, '.libs', 'libuv.a'),
'iphlpapi.lib',
'userenv.lib',
'dbghelp.lib',
'synchronization.lib', # Fixes WaitOnAddress / WakeByAddressSingle
] ]
# TODO: add proper windows support for libuv
# Candidates where actions/download-artifact might unpack libuv.lib if cxx.target.platform in ['windows']:
win_candidates = [ binary.compiler.linkflags += ['/FORCE:UNRESOLVED']
os.path.join(libuv_root, 'dist', 'lib', 'libuv.lib'),
os.path.join(libuv_root, 'dist', 'libuv-windows', 'lib', 'libuv.lib'),
os.path.join(libuv_root, 'dist', 'Release', 'libuv.lib'),
os.path.join(Extension.ext_root, 'libuv.lib'),
]
found_win_lib = None
for cand in win_candidates:
if os.path.exists(cand):
found_win_lib = cand
break
if found_win_lib:
binary.compiler.linkflags += [found_win_lib]
else:
binary.compiler.linkflags += ['libuv.lib']
elif cxx.target.platform == 'linux':
if cxx.target.arch == 'x86':
# Candidates where actions/download-artifact might unpack libuv.a
linux_candidates = [
os.path.join(libuv_root, 'dist', 'lib', 'libuv.a'),
os.path.join(libuv_root, 'dist', 'libuv-linux', 'lib', 'libuv.a'),
os.path.join(libuv_root, 'dist', '.libs', 'libuv.a'),
os.path.join(Extension.ext_root, 'libuv.a'),
]
found_linux_lib = None
for cand in linux_candidates:
if os.path.exists(cand):
found_linux_lib = cand
break
if found_linux_lib:
binary.compiler.linkflags += [found_linux_lib]
else:
binary.compiler.linkflags += ['-luv']
Extension.extensions += builder.Add(project) Extension.extensions += builder.Add(project)
-5
View File
@@ -8,8 +8,6 @@ CAsyncSocketContext::CAsyncSocketContext(IPluginContext *pContext)
m_pHost = NULL; m_pHost = NULL;
m_Port = -1; m_Port = -1;
m_pClientIP = NULL;
m_Deleted = false; m_Deleted = false;
m_PendingCallback = false; m_PendingCallback = false;
m_Pending = false; m_Pending = false;
@@ -28,9 +26,6 @@ CAsyncSocketContext::~CAsyncSocketContext()
if(m_pHost) if(m_pHost)
free(m_pHost); free(m_pHost);
if(m_pClientIP)
free(m_pClientIP);
if(m_pConnectCallback) if(m_pConnectCallback)
forwards->ReleaseForward(m_pConnectCallback); forwards->ReleaseForward(m_pConnectCallback);
-2
View File
@@ -20,8 +20,6 @@ public:
char *m_pHost; char *m_pHost;
int m_Port; int m_Port;
char *m_pClientIP;
IChangeableForward *m_pConnectCallback; IChangeableForward *m_pConnectCallback;
IChangeableForward *m_pErrorCallback; IChangeableForward *m_pErrorCallback;
IChangeableForward *m_pDataCallback; IChangeableForward *m_pDataCallback;
-62
View File
@@ -39,8 +39,6 @@
* @brief Implement extension code here. * @brief Implement extension code here.
*/ */
#define MAX_IP_BUFFER_LENGTH 64
moodycamel::ReaderWriterQueue<CSocketConnect *> g_ConnectQueue; moodycamel::ReaderWriterQueue<CSocketConnect *> g_ConnectQueue;
moodycamel::ReaderWriterQueue<CSocketError *> g_ErrorQueue; moodycamel::ReaderWriterQueue<CSocketError *> g_ErrorQueue;
moodycamel::ReaderWriterQueue<CSocketData *> g_DataQueue; moodycamel::ReaderWriterQueue<CSocketData *> g_DataQueue;
@@ -107,19 +105,6 @@ void OnGameFrame(bool simulating)
pSocketContext->m_pStream = pConnect->pClientSocket; pSocketContext->m_pStream = pConnect->pClientSocket;
pSocketContext->m_pStream->data = pSocketContext; pSocketContext->m_pStream->data = pSocketContext;
if (pConnect->pClientIP)
{
pSocketContext->m_pClientIP = pConnect->pClientIP;
}
else
{
pSocketContext->m_pClientIP = (char *)malloc(MAX_IP_BUFFER_LENGTH);
if (pSocketContext->m_pClientIP)
{
pSocketContext->m_pClientIP[0] = '\0';
}
}
pConnect->pSocketContext->OnConnect(pSocketContext); pConnect->pSocketContext->OnConnect(pSocketContext);
if(!pSocketContext->m_Deleted) if(!pSocketContext->m_Deleted)
@@ -134,10 +119,6 @@ void OnGameFrame(bool simulating)
} }
else else
{ {
if (pConnect->pClientIP)
{
pConnect->pSocketContext->m_pClientIP = pConnect->pClientIP;
}
pConnect->pSocketContext->Connected(); pConnect->pSocketContext->Connected();
} }
@@ -219,12 +200,6 @@ void UV_DeleteAsyncContext(uv_async_t *pHandle)
pSocketContext->m_pSocket = NULL; pSocketContext->m_pSocket = NULL;
} }
if (pSocketContext->m_pClientIP)
{
free(pSocketContext->m_pClientIP);
pSocketContext->m_pClientIP = NULL;
}
delete pSocketContext; delete pSocketContext;
} }
@@ -305,7 +280,6 @@ void UV_OnConnect(uv_connect_t *req, int status)
CSocketConnect *pConnect = (CSocketConnect *)malloc(sizeof(CSocketConnect)); CSocketConnect *pConnect = (CSocketConnect *)malloc(sizeof(CSocketConnect));
pConnect->pSocketContext = pSocketContext; pConnect->pSocketContext = pSocketContext;
pConnect->pClientSocket = pSocketContext->m_pStream; pConnect->pClientSocket = pSocketContext->m_pStream;
pConnect->pClientIP = NULL;
g_ConnectQueue.enqueue(pConnect); g_ConnectQueue.enqueue(pConnect);
uv_read_start(pSocketContext->m_pStream, UV_AllocBuffer, UV_OnRead); uv_read_start(pSocketContext->m_pStream, UV_AllocBuffer, UV_OnRead);
@@ -350,26 +324,6 @@ void UV_OnNewConnection(uv_stream_t *server, int status)
CSocketConnect *pConnect = (CSocketConnect *)malloc(sizeof(CSocketConnect)); CSocketConnect *pConnect = (CSocketConnect *)malloc(sizeof(CSocketConnect));
pConnect->pSocketContext = pSocketContext; pConnect->pSocketContext = pSocketContext;
pConnect->pClientSocket = (uv_stream_t *)pClientSocket; pConnect->pClientSocket = (uv_stream_t *)pClientSocket;
pConnect->pClientIP = (char *)malloc(MAX_IP_BUFFER_LENGTH);
if (pConnect->pClientIP)
{
pConnect->pClientIP[0] = '\0';
struct sockaddr_storage name;
int namelen = sizeof(name);
if (uv_tcp_getpeername(pClientSocket, (struct sockaddr *)&name, &namelen) == 0)
{
if (name.ss_family == AF_INET)
{
uv_ip4_name((const struct sockaddr_in *)&name, pConnect->pClientIP, MAX_IP_BUFFER_LENGTH);
}
else if (name.ss_family == AF_INET6)
{
uv_ip6_name((const struct sockaddr_in6 *)&name, pConnect->pClientIP, MAX_IP_BUFFER_LENGTH);
}
}
}
g_ConnectQueue.enqueue(pConnect); g_ConnectQueue.enqueue(pConnect);
} }
else else
@@ -645,21 +599,6 @@ cell_t Native_AsyncSocket_SetDataCallback(IPluginContext *pContext, const cell_t
return true; return true;
} }
cell_t Native_AsyncSocket_GetClientIP(IPluginContext *pContext, const cell_t *params)
{
CAsyncSocketContext *pSocketContext = g_AsyncSocket.GetSocketInstanceByHandle(params[1]);
if (pSocketContext == NULL)
{
return pContext->ThrowNativeError("Invalid socket handle");
}
const char *ip = (pSocketContext->m_pClientIP != NULL) ? pSocketContext->m_pClientIP : "";
pContext->StringToLocal(params[2], params[3], ip);
return 1;
}
// Sourcemod Plugin Events // Sourcemod Plugin Events
bool AsyncSocket::SDK_OnLoad(char *error, size_t maxlength, bool late) bool AsyncSocket::SDK_OnLoad(char *error, size_t maxlength, bool late)
{ {
@@ -717,6 +656,5 @@ const sp_nativeinfo_t AsyncSocketNatives[] = {
{"AsyncSocket.SetConnectCallback", Native_AsyncSocket_SetConnectCallback}, {"AsyncSocket.SetConnectCallback", Native_AsyncSocket_SetConnectCallback},
{"AsyncSocket.SetErrorCallback", Native_AsyncSocket_SetErrorCallback}, {"AsyncSocket.SetErrorCallback", Native_AsyncSocket_SetErrorCallback},
{"AsyncSocket.SetDataCallback", Native_AsyncSocket_SetDataCallback}, {"AsyncSocket.SetDataCallback", Native_AsyncSocket_SetDataCallback},
{"AsyncSocket.GetClientIP", Native_AsyncSocket_GetClientIP},
{NULL, NULL} {NULL, NULL}
}; };
-1
View File
@@ -58,7 +58,6 @@ struct CSocketConnect
{ {
CAsyncSocketContext *pSocketContext; CAsyncSocketContext *pSocketContext;
uv_stream_t *pClientSocket; uv_stream_t *pClientSocket;
char *pClientIP;
}; };
struct CSocketData struct CSocketData