diff --git a/.clang-tidy b/.clang-tidy index 9534cad..78808f9 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -51,4 +51,6 @@ CheckOptions: readability-identifier-naming.NamespaceCase: lower_case readability-identifier-naming.ParameterCase: lower_case readability-identifier-naming.VariableCase: lower_case + + readability-identifier-length.IgnoredVariableNames: _ --- diff --git a/.cruft.json b/.cruft.json index 6904a90..4b26982 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,6 +1,6 @@ { "template": "git@github.com:bl-sdk/common_dotfiles.git", - "commit": "fb06ff8c773806b3f8cc69dbda60c0a7b481c6de", + "commit": "597ec422d3b5692927f325b9b5c2ae42288e8cc5", "checkout": null, "context": { "cookiecutter": { diff --git a/.devcontainer/.gitignore b/.devcontainer/.gitignore new file mode 100644 index 0000000..670808b --- /dev/null +++ b/.devcontainer/.gitignore @@ -0,0 +1,6 @@ +# Ignore any custom folders outside of our predefined ones, to let you create your own +# One use might be using your own container mapping the install path onto your actual game folder +*/ +!clang-cross +!llvm-mingw +!mingw diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..a9aeee4 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,65 @@ +FROM alpine:latest AS clang-cross +CMD ["/bin/bash"] +RUN <> $GITHUB_PATH - - - name: Setup MinGW - if: startswith(matrix.preset, 'mingw') - uses: egor-tensin/setup-mingw@v2 - with: - platform: ${{ fromJSON('["x86", "x64"]')[contains(matrix.preset, 'x64')] }} - - - name: Setup Clang - if: startswith(matrix.preset, 'clang-cross') - uses: egor-tensin/setup-clang@v1 - - - name: Restore win sdk cache - if: startswith(matrix.preset, 'clang-cross') - uses: actions/cache@v4 - id: cache-win-sdk - with: - path: ~/win-sdk - key: ${{ runner.os }}-win-sdk - - - name: Setup win sdk - if: startswith(matrix.preset, 'clang-cross') && steps.cache-win-sdk.outputs.cache-hit != 'true' - run: | - git clone https://github.com/mstorsjo/msvc-wine.git - msvc-wine/vsdownload.py --accept-license --dest ~/win-sdk Microsoft.VisualStudio.Workload.VCTools - msvc-wine/install.sh ~/win-sdk - rm -r msvc-wine - - name: Checkout repository and submodules uses: actions/checkout@v4 with: submodules: recursive - - name: Configure CMake - working-directory: ${{ env.GITHUB_WORKSPACE }} - # The extra msvc wine arg won't do anything if we're not cross compiling - run: > - cmake . - --preset ${{ matrix.preset }} - -G Ninja - -DMSVC_WINE_ENV_SCRIPT=$(readlink -f ~)/win-sdk/bin/${{ fromJSON('["x86", "x64"]')[contains(matrix.preset, 'x64')] }}/msvcenv.sh + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Build - working-directory: ${{ env.GITHUB_WORKSPACE }} - run: cmake --build out/build/${{ matrix.preset }} --target install + uses: devcontainers/ci@v0.3 + with: + cacheFrom: ghcr.io/bl-sdk/${{ matrix.toolchain.container }}:latest + configFile: .devcontainer/${{ matrix.toolchain.container }}/devcontainer.json + push: never + # The git watcher cmake thinks something's unsafe? Doesn't happen to me locally. + runCmd: | + git config --global --add safe.directory `pwd` + + set -e + + cmake . --preset ${{ matrix.toolchain.preset }} -G Ninja + cmake --build out/build/${{ matrix.toolchain.preset }} --target install - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: ${{ matrix.preset }} - path: out/install/${{ matrix.preset }}/ + name: ${{ matrix.toolchain.preset }} + path: out/install/${{ matrix.toolchain.preset }}/ # ============================================================================== diff --git a/.gitignore b/.gitignore index 1948346..50e5591 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ .vs .vscode +.idea # C/C++ excludes .cache/clangd .gdbinit out -# User scripts with templates -postbuild -postbuild.bat - # CMake (from https://github.com/github/gitignore/blob/main/CMake.gitignore) CMakeLists.txt.user CMakeCache.txt diff --git a/.typos.toml b/.typos.toml index cde1e78..279be2f 100644 --- a/.typos.toml +++ b/.typos.toml @@ -7,5 +7,14 @@ extend-exclude = [ ".typos.toml" ] +[default] +extend-ignore-re = [ + # Ignore markdown links to github commits/trees + "\\[[0-9a-fA-F]+?\\]\\(https://github.com/.+?/.+?/(commit|tree)/.+?\\)", +] + +[default.extend-identifiers] +llibgcc_s_seh = "llibgcc_s_seh" + [default.extend-words] UE = "UE" diff --git a/CMakeLists.txt b/CMakeLists.txt index e20cc20..cdbc8e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.24) -project(pluginloader VERSION 1.0.3) +project(pluginloader VERSION 1.0.4) add_library(_pluginloader_base INTERFACE) set(CMAKE_EXPORT_COMPILE_COMMANDS True) diff --git a/CMakePresets.json b/CMakePresets.json index ecd5b7b..6c184f7 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -37,6 +37,9 @@ "lhs": "${hostSystemName}", "rhs": "Windows" }, + "cacheVariables": { + "MSVC_WINE_ENV_SCRIPT": "/win-sdk/bin/x86/msvcenv.sh" + }, "toolchainFile": "common_cmake/clang-cross-x86.cmake" }, { @@ -47,6 +50,9 @@ "lhs": "${hostSystemName}", "rhs": "Windows" }, + "cacheVariables": { + "MSVC_WINE_ENV_SCRIPT": "/win-sdk/bin/x64/msvcenv.sh" + }, "toolchainFile": "common_cmake/clang-cross-x64.cmake" }, { diff --git a/common_cmake b/common_cmake index c953298..0b1c32d 160000 --- a/common_cmake +++ b/common_cmake @@ -1 +1 @@ -Subproject commit c95329887138e361a46b1129b640c77f00df7086 +Subproject commit 0b1c32de1ff98a7851f798d6b092edd1e89e5eba diff --git a/src/proxy/d3d11.cpp b/src/proxy/d3d11.cpp index 5bddf26..ffc5f6b 100644 --- a/src/proxy/d3d11.cpp +++ b/src/proxy/d3d11.cpp @@ -24,6 +24,10 @@ FARPROC d3d11_on_12_create_device_ptr = nullptr; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-function-type" #endif +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcast-function-type-mismatch" +#endif DLL_EXPORT HRESULT D3D11CoreCreateDevice(void* fact, void* adapt, @@ -81,6 +85,9 @@ DLL_EXPORT HRESULT D3D11On12CreateDevice(void* pDevice, ppDevice, ppImmediateContext, pChosenFeatureLevel); } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif #if defined(__MINGW32__) #pragma GCC diagnostic pop #endif diff --git a/src/proxy/dsound.cpp b/src/proxy/dsound.cpp index 3bac8cf..f61c7c2 100644 --- a/src/proxy/dsound.cpp +++ b/src/proxy/dsound.cpp @@ -30,78 +30,89 @@ FARPROC direct_sound_capture_create_8_ptr = nullptr; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-function-type" #endif +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcast-function-type-mismatch" +#endif // #include "dsound.h" -DLL_EXPORT HRESULT DirectSoundCreate(LPCGUID pcGuidDevice, void* ppDS, void* pUnkOuter) { +DLL_EXPORT HRESULT WINAPI DirectSoundCreate(LPCGUID pcGuidDevice, void* ppDS, void* pUnkOuter) { return reinterpret_cast(direct_sound_create_ptr)(pcGuidDevice, ppDS, pUnkOuter); } -DLL_EXPORT HRESULT DirectSoundEnumerateA(void* pDSEnumCallback, LPVOID pContext) { +DLL_EXPORT HRESULT WINAPI DirectSoundEnumerateA(void* pDSEnumCallback, LPVOID pContext) { return reinterpret_cast(direct_sound_enumerate_a_ptr)( pDSEnumCallback, pContext); } -DLL_EXPORT HRESULT DirectSoundEnumerateW(void* pDSEnumCallback, LPVOID pContext) { +DLL_EXPORT HRESULT WINAPI DirectSoundEnumerateW(void* pDSEnumCallback, LPVOID pContext) { return reinterpret_cast(direct_sound_enumerate_w_ptr)( pDSEnumCallback, pContext); } -DLL_EXPORT HRESULT DllCanUnloadNow(void) { +DLL_EXPORT HRESULT WINAPI DllCanUnloadNow(void) { return reinterpret_cast(dll_can_unload_now_ptr)(); } -DLL_EXPORT HRESULT DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { +DLL_EXPORT HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return reinterpret_cast(dll_get_class_object_ptr)(rclsid, riid, ppv); } -DLL_EXPORT HRESULT DirectSoundCaptureCreate(LPCGUID pcGuidDevice, void** ppDSC, void* pUnkOuter) { +DLL_EXPORT HRESULT WINAPI DirectSoundCaptureCreate(LPCGUID pcGuidDevice, + void** ppDSC, + void* pUnkOuter) { return reinterpret_cast(direct_sound_capture_create_ptr)( pcGuidDevice, ppDSC, pUnkOuter); } -DLL_EXPORT HRESULT DirectSoundCaptureEnumerateA(void* pDSEnumCallback, LPVOID pContext) { +DLL_EXPORT HRESULT WINAPI DirectSoundCaptureEnumerateA(void* pDSEnumCallback, LPVOID pContext) { return reinterpret_cast( direct_sound_capture_enumerate_a_ptr)(pDSEnumCallback, pContext); } -DLL_EXPORT HRESULT DirectSoundCaptureEnumerateW(void* pDSEnumCallback, LPVOID pContext) { +DLL_EXPORT HRESULT WINAPI DirectSoundCaptureEnumerateW(void* pDSEnumCallback, LPVOID pContext) { return reinterpret_cast( direct_sound_capture_enumerate_w_ptr)(pDSEnumCallback, pContext); } -DLL_EXPORT HRESULT GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest) { +DLL_EXPORT HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest) { return reinterpret_cast(get_device_id_ptr)(pGuidSrc, pGuidDest); } -DLL_EXPORT HRESULT DirectSoundFullDuplexCreate(LPCGUID pcGuidCaptureDevice, - LPCGUID pcGuidRenderDevice, - void* pcDSCBufferDesc, - void* pcDSBufferDesc, - HWND hWnd, - DWORD dwLevel, - void** ppDSFD, - void** ppDSCBuffer8, - void** ppDSBuffer8, - void* pUnkOuter) { +DLL_EXPORT HRESULT WINAPI DirectSoundFullDuplexCreate(LPCGUID pcGuidCaptureDevice, + LPCGUID pcGuidRenderDevice, + void* pcDSCBufferDesc, + void* pcDSBufferDesc, + HWND hWnd, + DWORD dwLevel, + void** ppDSFD, + void** ppDSCBuffer8, + void** ppDSBuffer8, + void* pUnkOuter) { return reinterpret_cast( direct_sound_full_duplex_create_ptr)(pcGuidCaptureDevice, pcGuidRenderDevice, pcDSCBufferDesc, pcDSBufferDesc, hWnd, dwLevel, ppDSFD, ppDSCBuffer8, ppDSBuffer8, pUnkOuter); } -DLL_EXPORT HRESULT DirectSoundCreate8(LPCGUID pcGuidDevice, void** ppDS8, void* pUnkOuter) { +DLL_EXPORT HRESULT WINAPI DirectSoundCreate8(LPCGUID pcGuidDevice, void** ppDS8, void* pUnkOuter) { return reinterpret_cast(direct_sound_create_8_ptr)( pcGuidDevice, ppDS8, pUnkOuter); } -DLL_EXPORT HRESULT DirectSoundCaptureCreate8(LPCGUID pcGuidDevice, void** ppDSC8, void* pUnkOuter) { +DLL_EXPORT HRESULT WINAPI DirectSoundCaptureCreate8(LPCGUID pcGuidDevice, + void** ppDSC8, + void* pUnkOuter) { return reinterpret_cast( direct_sound_capture_create_8_ptr)(pcGuidDevice, ppDSC8, pUnkOuter); } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif #if defined(__MINGW32__) #pragma GCC diagnostic pop #endif diff --git a/src/proxy/xinput1_3.cpp b/src/proxy/xinput1_3.cpp index 2beb72a..05b0194 100644 --- a/src/proxy/xinput1_3.cpp +++ b/src/proxy/xinput1_3.cpp @@ -34,6 +34,10 @@ FARPROC xinput_power_off_controller_ptr = nullptr; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-function-type" #endif +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcast-function-type-mismatch" +#endif DLL_EXPORT void XInputEnable(BOOL enable) { reinterpret_cast(xinput_enable_ptr)(enable); @@ -93,6 +97,9 @@ DLL_EXPORT DWORD XInputPowerOffController(DWORD dwUserIndex) { dwUserIndex); } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif #if defined(__MINGW32__) #pragma GCC diagnostic pop #endif