Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
- name: Prepare environment
run: apk add bash cmake ninja g++ libpng-dev nlohmann-json gtest-dev
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Build libsawyer
run: ./build.sh libsawyer
- name: Test libsawyer
Expand All @@ -25,13 +25,13 @@ jobs:
- name: Package tools
run: ./build.sh tools
- name: Upload libsawyer
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: libsawyer-musl-${{ matrix.platform }}.tar.gz
path: artefacts/libsawyer-musl-${{ matrix.platform }}.tar.gz
if-no-files-found: error
- name: Upload tools
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: libsawyer-tools-musl-${{ matrix.platform }}.tar.gz
path: artefacts/libsawyer-tools-musl-${{ matrix.platform }}.tar.gz
Expand All @@ -47,7 +47,7 @@ jobs:
- name: Prepare environment
run: sudo apt-get install ninja-build libpng-dev nlohmann-json3-dev libgtest-dev
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Build libsawyer
run: ./build.sh libsawyer
- name: Test libsawyer
Expand All @@ -59,13 +59,13 @@ jobs:
- name: Package tools
run: ./build.sh tools
- name: Upload libsawyer
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: libsawyer-linux-${{ matrix.platform }}.tar.gz
path: artefacts/libsawyer-linux-${{ matrix.platform }}.tar.gz
if-no-files-found: error
- name: Upload tools
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: libsawyer-tools-linux-${{ matrix.platform }}.tar.gz
path: artefacts/libsawyer-tools-linux-${{ matrix.platform }}.tar.gz
Expand All @@ -84,9 +84,9 @@ jobs:
arch: amd64
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Cache vcpkg
uses: actions/cache@v4
uses: actions/cache@v5
env:
cache-name: cache-vcpkg
with:
Expand All @@ -103,7 +103,7 @@ jobs:
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=${{ matrix.arch }}
sh run-tests
- name: Upload libsawyer
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v6
with:
name: libsawyer-win-${{ matrix.platform }}.zip
path: artefacts/libsawyer-win-${{ matrix.platform }}.zip
Expand All @@ -121,9 +121,9 @@ jobs:
arch: amd64
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Cache vcpkg
uses: actions/cache@v4
uses: actions/cache@v5
env:
cache-name: cache-vcpkg
with:
Expand Down Expand Up @@ -153,14 +153,14 @@ jobs:
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=${{ matrix.arch }}
sh build.sh tools --static
- name: Upload libsawyer
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: libsawyer-win-${{ matrix.platform }}-static.zip
path: artefacts/libsawyer-win-${{ matrix.platform }}-static.zip
if-no-files-found: error
- name: Upload tools
if: matrix.platform == 'x64'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: libsawyer-tools-win-${{ matrix.platform }}.zip
path: artefacts/libsawyer-tools-win-${{ matrix.platform }}.zip
Expand All @@ -171,7 +171,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Get artefacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
path: artefacts
- name: Flatten tree structure
Expand Down
150 changes: 6 additions & 144 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,9 @@ if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR)
message(FATAL_ERROR "Do not build in the root. Create a bin directory and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt")
endif ()

function (merge_static_libraries target source)
set(TARGET_PATH $<TARGET_FILE:${target}>)
if (MSVC)
set(TEMP_PATH "tmplib")
add_custom_command(TARGET ${target} POST_BUILD
COMMAND mv ${TARGET_PATH} ${TEMP_PATH}
COMMAND lib "/out:${TARGET_PATH}" ${TEMP_PATH} ${source}
COMMAND rm ${TEMP_PATH}
COMMENT "Relinking ${target} with ${source}")
else ()
set(TEMP_PATH "tmpobj")
add_custom_command(TARGET ${target} POST_BUILD
COMMAND mkdir -p ${TEMP_PATH}
COMMAND ${CMAKE_AR} x ${TARGET_PATH} --output ${TEMP_PATH}
COMMAND ${CMAKE_AR} x ${source} --output ${TEMP_PATH}
COMMAND ${CMAKE_AR} qc ${TARGET_PATH} "${TEMP_PATH}/*.o"
COMMAND rm -rf ${TEMP_PATH}
COMMENT "Relinking ${target} with ${source}")
endif ()
endfunction ()

# Options
option(ENABLE_BREAKPAD "Embed breakpad into the library." ON)
option(ENABLE_DISCORD_RPC "Embed discord-rpc into the library." ON)
option(ENABLE_LIBPNG "Embed libpng into the library." ON)
option(ENABLE_SCRIPTING "Embed duktape and dukglue into the library." ON)
option(ENABLE_TESTS "Build the unit tests for the library." ON)

option(CONFIGURE_OWN_DUKTAPE "Build the unit tests for the library." OFF)
option(ENABLE_LIBPNG "Link libpng into the library." ON)
option(ENABLE_TESTS "Build the unit tests for the library." ON)

# Library
project(sawyer CXX)
Expand All @@ -44,123 +18,22 @@ set(CMAKE_CXX_STANDARD 17)
file(GLOB_RECURSE SAWYER_SOURCES "src/*.cpp")
file(GLOB_RECURSE SAWYER_HEADERS "src/*.h" "src/*.hpp")
add_library(sawyer STATIC ${SAWYER_SOURCES})

if (${VCPKG_TARGET_TRIPLET} MATCHES "-static$")
set_property(TARGET sawyer PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif ()

# Breakpad
if (ENABLE_BREAKPAD AND MSVC)
target_compile_definitions(sawyer PRIVATE CS_ENABLE_BREAKPAD)

find_package(unofficial-breakpad CONFIG REQUIRED)

# Add breakpad include directories
get_target_property(BREAKPAD_INCLUDE_DIRS unofficial::breakpad::libbreakpad INTERFACE_INCLUDE_DIRECTORIES)
target_include_directories(sawyer PRIVATE ${BREAKPAD_INCLUDE_DIRS})

# Get other .lib files breakpad depends on
get_target_property(BREAKPAD_LIBS_A unofficial::breakpad::libbreakpad INTERFACE_LINK_LIBRARIES)
get_target_property(BREAKPAD_LIBS_B unofficial::breakpad::libbreakpad_client INTERFACE_LINK_LIBRARIES)

# Merge all breakpad .lib into sawyer.lib
merge_static_libraries(sawyer ${BREAKPAD_LIBS_A})

# Complains about wininet.lib
# merge_static_libraries(sawyer ${BREAKPAD_LIBS_B})

merge_static_libraries(sawyer $<TARGET_FILE:unofficial::breakpad::libbreakpad>)
merge_static_libraries(sawyer $<TARGET_FILE:unofficial::breakpad::libbreakpad_client>)
else ()
set(ENABLE_BREAKPAD OFF)
endif ()

# Discord RPC
if (ENABLE_DISCORD_RPC)
include(ExternalProject)
ExternalProject_Add(
discord-rpc
URL https://github.com/discord/discord-rpc/archive/963aa9f3e5ce81a4682c6ca3d136cddda614db33.zip
URL_HASH SHA1=10081a9a4e68459884185a25ff0d22ab6cd5a184
TIMEOUT 10
CMAKE_ARGS "-DBUILD_EXAMPLES=off" "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
LOG_CONFIGURE ON
LOG_BUILD ON)
ExternalProject_Get_Property(discord-rpc SOURCE_DIR)
ExternalProject_Get_Property(discord-rpc BINARY_DIR)
if (MSVC)
set(DISCORD_RPC_LIB "${BINARY_DIR}/src/discord-rpc.lib")
else ()
set(DISCORD_RPC_LIB "${BINARY_DIR}/src/libdiscord-rpc.a")
endif ()

add_dependencies(sawyer discord-rpc)

target_include_directories(sawyer PRIVATE "${SOURCE_DIR}/include")
target_compile_definitions(sawyer PRIVATE CS_ENABLE_DISCORD_RPC)
merge_static_libraries(sawyer ${DISCORD_RPC_LIB})
endif ()

if (ENABLE_LIBPNG)
if (NOT MSVC)
find_package(PNG REQUIRED)
endif ()
target_compile_definitions(sawyer PRIVATE CS_ENABLE_LIBPNG)
find_package(PNG REQUIRED)

if (MSVC)
if (${VCPKG_TARGET_TRIPLET} MATCHES "-static$")
find_package(libpng CONFIG REQUIRED)
merge_static_libraries(sawyer $<TARGET_FILE:png_static>)
else ()
find_package(PNG REQUIRED)
target_link_libraries(sawyer PRIVATE PNG::PNG)
endif ()
if (TARGET PNG::PNG)
target_link_libraries(sawyer PRIVATE PNG::PNG)
else ()
target_link_libraries(sawyer PRIVATE png)
endif ()
endif ()

# Scripting
if (ENABLE_SCRIPTING)
if (CONFIGURE_OWN_DUKTAPE)
set(DUKTAPE_DEFINES "-DDUK_USE_CPP_EXCEPTIONS" "-DDUK_USE_INTERRUPT_COUNTER" "-DDUK_USE_EXEC_TIMEOUT_CHECK=duk_exec_timeout_check" "--fixup-line=extern duk_bool_t duk_exec_timeout_check(void*)\\\\\\\\\\\;")
if (MSVC)
set(DUKTAPE_DEFINES ${DUKTAPE_DEFINES} "-DDUK_USE_DATE_NOW_WINDOWS")
endif ()

include(ExternalProject)
ExternalProject_Add(
duktape
URL https://github.com/svaarala/duktape/releases/download/v2.6.0/duktape-2.6.0.tar.xz
URL_HASH SHA1=5936bf5e9943128b53a9e534e0a6842532b52bb5
TIMEOUT 10
BUILD_BYPRODUCTS "duktape-prefix/src/duktape/duktape-src/duktape.c"
BUILD_IN_SOURCE ON
CONFIGURE_COMMAND python2 tools/configure.py --output-directory duktape-src ${DUKTAPE_DEFINES}
BUILD_COMMAND ""
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
LOG_CONFIGURE ON)

ExternalProject_Get_Property(duktape SOURCE_DIR)
set(DUKTAPE_SOURCE_DIR "${SOURCE_DIR}/duktape-src")

add_dependencies(sawyer duktape)
else ()
set(DUKTAPE_SOURCE_DIR "src/thirdparty/duktape")
endif ()

set(DUKTAPE_SOURCE "${DUKTAPE_SOURCE_DIR}/duktape.c")
set_source_files_properties(${DUKTAPE_SOURCE} PROPERTIES LANGUAGE CXX)

add_compile_definitions(sawyer PRIVATE CS_ENABLE_SCRIPTING)
target_include_directories(sawyer PRIVATE ${DUKTAPE_SOURCE_DIR})
target_sources(sawyer PRIVATE ${DUKTAPE_SOURCE})
install(FILES "${DUKTAPE_SOURCE_DIR}/duk_config.h" DESTINATION "include")
install(FILES "${DUKTAPE_SOURCE_DIR}/duktape.h" DESTINATION "include")
endif ()

if (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /std:c++17 /utf-8 /WX")
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
Expand Down Expand Up @@ -192,10 +65,7 @@ if (ENABLE_TESTS)
find_package(GTest REQUIRED)
set(GTEST_LIBRARIES ${GTEST_BOTH_LIBRARIES})

set(SAWYER_TEST_CRASH_HANDLER_SOURCES "test/CrashHandlerTest.cpp")

file(GLOB_RECURSE SAWYER_TEST_SOURCES "test/*.cpp")
list(FILTER SAWYER_TEST_SOURCES EXCLUDE REGEX ${SAWYER_TEST_CRASH_HANDLER_SOURCES})
add_executable(tests EXCLUDE_FROM_ALL ${SAWYER_TEST_SOURCES})
target_include_directories(tests SYSTEM PRIVATE ${GTEST_INCLUDE_DIRS})
target_include_directories(tests SYSTEM PRIVATE "${CMAKE_INSTALL_PREFIX}/include")
Expand All @@ -206,12 +76,4 @@ if (ENABLE_TESTS)

target_link_libraries(tests ${GTEST_LIBRARIES} sawyer Threads::Threads)
gtest_discover_tests(tests)

if (ENABLE_BREAKPAD)
add_executable(test_crash EXCLUDE_FROM_ALL ${SAWYER_TEST_CRASH_HANDLER_SOURCES})
target_include_directories(test_crash SYSTEM PRIVATE "${CMAKE_INSTALL_PREFIX}/include")
target_link_libraries(test_crash sawyer)
add_dependencies(test_crash install)
add_test(NAME test_crash COMMAND $<TARGET_FILE:test_crash>)
endif ()
endif ()
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ cmake --build bin
cmake --install bin
```

### Optional modules
### Optional components

Depending on your needs, you may like to disable some modules. Five modules are optional
(`ENABLE_BREAKPAD`, `ENABLE_DISCORD_RPC`, `ENABLE_LIBPNG`, `ENABLE_SCRIPTING`, `ENABLE_TESTS`).
Depending on your needs, you may like to disable some components. Two components are optional
(`ENABLE_LIBPNG`, `ENABLE_TESTS`).
They can be pass to `cmake` via `-D<param>=<bool>`, e.g. `ENABLE_DISCORD_RPC=OFF`.

### Build and run tests
Expand Down
3 changes: 0 additions & 3 deletions run-tests
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
#!/bin/sh
set -e
cmake --build bin --target tests
if [ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ]; then
cmake --build bin --target test_crash
fi
cd bin && ctest
40 changes: 0 additions & 40 deletions src/CrashHandler.cpp

This file was deleted.

19 changes: 0 additions & 19 deletions src/CrashHandler.h

This file was deleted.

Loading