1
0
Fork 0

Build with GitHub Actions

This commit is contained in:
Duncan Ogilvie 2025-03-16 01:49:53 +01:00
parent 53d1123e83
commit e8ffba6dcc
20 changed files with 304 additions and 8 deletions

86
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,86 @@
name: Build
on: [push, pull_request]
jobs:
cmake:
# Skip building pull requests from the same repository
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }}
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
arch: [x64, x86]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 1
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@3b1f8f94a2f8254bd26914c4ab9474d4f0015f67 # v6
- name: Visual Studio Development Environment
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
with:
arch: ${{ matrix.arch }}
- name: Build
run: |
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.arch }}
path: bin
if-no-files-found: error
include-hidden-files: true
package:
needs: cmake
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Download x64 Artifacts
uses: actions/download-artifact@v4
with:
name: build-x64
path: bin
- name: Download x86 Artifacts
uses: actions/download-artifact@v4
with:
name: build-x86
path: bin
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: bin-${{ github.sha}}
path: bin
if-no-files-found: error
include-hidden-files: true
- name: Create snapshot
run: |
curl.exe -L https://github.com/x64dbg/translations/releases/download/translations/qm.zip -o bin\qm.zip
7z x bin\qm.zip -obin
cmake -P .\cmake\release.cmake
$timestamp = Get-Date -Format "yyyy-MM-dd_HH_mm"
7z a -tzip -mx=9 snapshot_$timestamp.zip release\pluginsdk release\release release\commithash.txt
7z a -tzip -mx=9 symbols-snapshot_$timestamp.zip release\pdb release\commithash.txt
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: x64dbg-${{ github.sha}}
path: '*.zip'
if-no-files-found: error
include-hidden-files: true

1
.gitignore vendored
View File

@ -4,6 +4,7 @@
/bin/*.dll
/bin/*.ini
/bin/*.chm
/bin/*.zip
/src/**/x64/
/src/**/Win32/
/src/gui_build/

18
CMakeLists.txt generated
View File

@ -24,6 +24,12 @@ if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS cmake.toml)
endif()
# Options
option(X64DBG_BUILD_IN_TREE "" ON)
# Variables
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include("cmake/VSToolchain.cmake")
project(x64dbg
@ -934,7 +940,7 @@ endif()
set(CMKR_TARGET exe)
# Make the executable the main target
add_dependencies(exe dbg gui deps)
add_dependencies(exe dbg gui loaddll deps)
# Target: launcher
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
@ -963,9 +969,19 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
ON
)
if(X64DBG_BUILD_IN_TREE) # X64DBG_BUILD_IN_TREE
set_target_properties(launcher PROPERTIES
RUNTIME_OUTPUT_DIRECTORY
"${PROJECT_SOURCE_DIR}/bin"
)
endif()
get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT)
if(NOT CMKR_VS_STARTUP_PROJECT)
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT launcher)
endif()
set(CMKR_TARGET launcher)
add_dependencies(exe launcher)
endif()

View File

@ -2,6 +2,12 @@
version = "3.15"
cmkr-include = "cmake/cmkr.cmake"
[options]
X64DBG_BUILD_IN_TREE = true
[variables]
CMAKE_MODULE_PATH = "${CMAKE_SOURCE_DIR}/cmake"
[project]
name = "x64dbg"
description = "An open-source x64/x32 debugger for windows."
@ -215,7 +221,7 @@ msvc.link-options = [
]
cmake-after = """
# Make the executable the main target
add_dependencies(exe dbg gui deps)
add_dependencies(exe dbg gui loaddll deps)
"""
[target.exe.properties]
@ -238,7 +244,9 @@ link-libraries = [
"Shlwapi",
"Comctl32",
]
cmake-after = "add_dependencies(exe launcher)"
[target.launcher.properties]
OUTPUT_NAME = "x96dbg"
WIN32_EXECUTABLE = "ON"
WIN32_EXECUTABLE = "ON"
X64DBG_BUILD_IN_TREE.RUNTIME_OUTPUT_DIRECTORY = "${PROJECT_SOURCE_DIR}/bin"

39
cmake/FindQt5.cmake Normal file
View File

@ -0,0 +1,39 @@
# Documentation: https://cmake.org/cmake/help/latest/manual/cmake-developer.7.html#find-modules
if(Qt5_FOUND)
return()
endif()
find_package(Qt5 COMPONENTS ${Qt5_FIND_COMPONENTS} QUIET CONFIG)
if(Qt5_FOUND)
if(NOT Qt5_FIND_QUIETLY)
message(STATUS "Qt5 found: ${Qt5_DIR}")
endif()
return()
endif()
if(Qt5_FIND_REQUIRED AND MSVC)
message(STATUS "Downloading Qt5...")
# Fix warnings about DOWNLOAD_EXTRACT_TIMESTAMP
if(POLICY CMP0135)
cmake_policy(SET CMP0135 NEW)
endif()
include(FetchContent)
set(FETCHCONTENT_QUIET OFF)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
FetchContent_Declare(Qt5
URL "https://github.com/x64dbg/deps/releases/download/dependencies/qt5.12.12-msvc2017_64.7z"
URL_HASH SHA256=bf302d02366dc09e112a1146e202429717c2097446edba8da3c3168d9a9996b4
)
else()
FetchContent_Declare(Qt5
URL "https://github.com/x64dbg/deps/releases/download/dependencies/qt5.12.12-msvc2017.7z"
URL_HASH SHA256=0ea8bf7ea3ac5d7dfeb87af4ce471eefdadbf0809524fda2b0ca07aaf4654cfb
)
endif()
FetchContent_MakeAvailable(Qt5)
unset(FETCHCONTENT_QUIET)
set(Qt5_ROOT ${qt5_SOURCE_DIR})
find_package(Qt5 COMPONENTS ${Qt5_FIND_COMPONENTS} CONFIG REQUIRED)
endif()

View File

@ -7,10 +7,14 @@ if (CMAKE_GENERATOR MATCHES "Visual Studio")
add_compile_options(/MP)
endif()
# TODO: support other toolchains
# Generate PDB files for release builds
if(MSVC)
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG:FULL /INCREMENTAL:NO /OPT:REF /OPT:ICF" CACHE STRING "")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/DEBUG:FULL /INCREMENTAL:NO /OPT:REF /OPT:ICF" CACHE STRING "")
add_link_options(
$<$<CONFIG:Release>:/DEBUG:FULL>
$<$<CONFIG:Release>:/INCREMENTAL:NO>
$<$<CONFIG:Release>:/OPT:REF>
$<$<CONFIG:Release>:/OPT:ICF>
)
endif()
# Make the project look nicer in IDEs
@ -20,3 +24,16 @@ set_property(GLOBAL PROPERTY AUTOMOC_SOURCE_GROUP "Generated Files")
set_property(GLOBAL PROPERTY AUTOMOC_TARGETS_FOLDER "CMakePredefinedTargets")
set_property(GLOBAL PROPERTY AUTORCC_SOURCE_GROUP "Generated Files")
set_property(GLOBAL PROPERTY AUTORCC_TARGETS_FOLDER "CMakePredefinedTargets")
# Build to the right output directory
if(X64DBG_BUILD_IN_TREE)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin/x64$<$<CONFIG:Debug>:d>")
else()
set(OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin/x32$<$<CONFIG:Debug>:d>")
endif()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
endif()

View File

@ -11,13 +11,23 @@ if(CMAKE_SCRIPT_MODE_FILE)
message(STATUS "Copying dependencies from ${DEPS_DIR} to ${GUI_DIR}")
execute_process(COMMAND ${WINDEPLOYQT} --no-compiler-runtime --force ${GUI_DLL})
execute_process(
COMMAND ${WINDEPLOYQT} --no-compiler-runtime --no-translations --no-opengl-sw --force ${GUI_DLL} --list relative
OUTPUT_VARIABLE DEPS_COPIED
)
# Split the output into lines
string(REGEX REPLACE "\n" ";" DEPS_COPIED "${DEPS_COPIED}")
foreach(line ${DEPS_COPIED})
message(STATUS "Copying ${line}")
endforeach()
function(copy_dep relfile)
if(EXISTS ${relfile})
message(STATUS "Skipping ${relfile}")
return()
endif()
set(DEPS_COPIED ${DEPS_COPIED} ${relfile} PARENT_SCOPE)
message(STATUS "Copying ${relfile}")
get_filename_component(reldir ${relfile} DIRECTORY)
get_filename_component(relfile ${relfile} NAME)
@ -34,7 +44,8 @@ if(CMAKE_SCRIPT_MODE_FILE)
copy_dep(GleeBug/TitanEngine.dll)
copy_dep(StaticEngine/TitanEngine.dll)
file(TOUCH "${GUI_DIR}/.deps_copied")
list(JOIN DEPS_COPIED "\n" DEPS_COPIED)
file(WRITE "${GUI_DIR}/.deps_copied" "${DEPS_COPIED}")
return()
endif()

118
cmake/release.cmake Normal file
View File

@ -0,0 +1,118 @@
# Get the root directory
get_filename_component(ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE)
set(RELEASE_DIR "${ROOT_DIR}/release")
# Clean up existing release directory
file(REMOVE_RECURSE "${RELEASE_DIR}")
file(MAKE_DIRECTORY "${RELEASE_DIR}")
# Setup pluginsdk directories
set(PLUGINSDK_DIR "${RELEASE_DIR}/pluginsdk")
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}")
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/dbghelp")
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/DeviceNameResolver")
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/jansson")
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/lz4")
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/TitanEngine")
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/XEDParse")
# Setup release directories
file(MAKE_DIRECTORY "${RELEASE_DIR}/release")
file(MAKE_DIRECTORY "${RELEASE_DIR}/release/translations")
file(MAKE_DIRECTORY "${RELEASE_DIR}/release/x32")
file(MAKE_DIRECTORY "${RELEASE_DIR}/release/x64")
# Copy pluginsdk files
set(PLUGINSDK_DIR "${RELEASE_DIR}/pluginsdk")
# Copy directories
file(COPY "${ROOT_DIR}/src/dbg/dbghelp/" DESTINATION "${PLUGINSDK_DIR}/dbghelp")
file(COPY "${ROOT_DIR}/src/dbg/DeviceNameResolver/" DESTINATION "${PLUGINSDK_DIR}/DeviceNameResolver")
file(COPY "${ROOT_DIR}/src/dbg/jansson/" DESTINATION "${PLUGINSDK_DIR}/jansson")
file(COPY "${ROOT_DIR}/src/dbg/lz4/" DESTINATION "${PLUGINSDK_DIR}/lz4")
file(COPY "${ROOT_DIR}/src/dbg/TitanEngine/" DESTINATION "${PLUGINSDK_DIR}/TitanEngine")
file(COPY "${ROOT_DIR}/src/dbg/XEDParse/" DESTINATION "${PLUGINSDK_DIR}/XEDParse")
# Remove TitanEngine.txt
file(REMOVE "${PLUGINSDK_DIR}/TitanEngine/TitanEngine.txt")
# Copy headers
file(GLOB PLUGIN_HEADERS
"${ROOT_DIR}/src/dbg/_plugin_types.h"
"${ROOT_DIR}/src/dbg/_plugins.h"
"${ROOT_DIR}/src/dbg/_scriptapi*.h"
"${ROOT_DIR}/src/dbg/_dbgfunctions.h"
"${ROOT_DIR}/src/bridge/bridge*.h"
)
file(COPY ${PLUGIN_HEADERS} DESTINATION "${PLUGINSDK_DIR}")
file(COPY "${ROOT_DIR}/bin/x32/x32bridge.lib" DESTINATION "${PLUGINSDK_DIR}")
file(COPY "${ROOT_DIR}/bin/x32/x32dbg.lib" DESTINATION "${PLUGINSDK_DIR}")
file(COPY "${ROOT_DIR}/bin/x64/x64bridge.lib" DESTINATION "${PLUGINSDK_DIR}")
file(COPY "${ROOT_DIR}/bin/x64/x64dbg.lib" DESTINATION "${PLUGINSDK_DIR}")
# Copy release files
set(RELEASE_MAIN_DIR "${RELEASE_DIR}/release")
# Handle deps_copied
function(handle_deps_copied arch)
file(READ "${ROOT_DIR}/bin/${arch}/.deps_copied" DEPS_COPIED)
string(REGEX REPLACE "\n" ";" DEPS_COPIED "${DEPS_COPIED}")
foreach(DEP ${DEPS_COPIED})
get_filename_component(reldir ${DEP} DIRECTORY)
file(COPY "${ROOT_DIR}/bin/${arch}/${DEP}" DESTINATION "${RELEASE_MAIN_DIR}/${arch}/${reldir}")
endforeach()
endfunction()
handle_deps_copied("x64")
handle_deps_copied("x32")
# Copy themes
file(COPY "${ROOT_DIR}/bin/themes/" DESTINATION "${RELEASE_MAIN_DIR}/themes")
# Copy main files
file(COPY "${ROOT_DIR}/bin/x96dbg.exe" DESTINATION "${RELEASE_MAIN_DIR}")
file(COPY "${ROOT_DIR}/bin/mnemdb.json" DESTINATION "${RELEASE_MAIN_DIR}")
file(COPY "${ROOT_DIR}/bin/errordb.txt" DESTINATION "${RELEASE_MAIN_DIR}")
file(COPY "${ROOT_DIR}/bin/exceptiondb.txt" DESTINATION "${RELEASE_MAIN_DIR}")
file(COPY "${ROOT_DIR}/bin/ntstatusdb.txt" DESTINATION "${RELEASE_MAIN_DIR}")
file(COPY "${ROOT_DIR}/bin/winconstants.txt" DESTINATION "${RELEASE_MAIN_DIR}")
# Copy translations
file(GLOB TRANSLATION_FILES "${ROOT_DIR}/bin/translations/*.qm")
file(COPY ${TRANSLATION_FILES} DESTINATION "${RELEASE_MAIN_DIR}/translations")
# Copy x32 files
file(COPY "${ROOT_DIR}/bin/x32/x32bridge.dll" DESTINATION "${RELEASE_MAIN_DIR}/x32")
file(COPY "${ROOT_DIR}/bin/x32/x32dbg.dll" DESTINATION "${RELEASE_MAIN_DIR}/x32")
file(COPY "${ROOT_DIR}/bin/x32/x32dbg.exe" DESTINATION "${RELEASE_MAIN_DIR}/x32")
file(COPY "${ROOT_DIR}/bin/x32/x32gui.dll" DESTINATION "${RELEASE_MAIN_DIR}/x32")
file(COPY "${ROOT_DIR}/bin/x32/loaddll.exe" DESTINATION "${RELEASE_MAIN_DIR}/x32")
# Copy x64 files
file(COPY "${ROOT_DIR}/bin/x64/x64bridge.dll" DESTINATION "${RELEASE_MAIN_DIR}/x64")
file(COPY "${ROOT_DIR}/bin/x64/x64dbg.dll" DESTINATION "${RELEASE_MAIN_DIR}/x64")
file(COPY "${ROOT_DIR}/bin/x64/x64dbg.exe" DESTINATION "${RELEASE_MAIN_DIR}/x64")
file(COPY "${ROOT_DIR}/bin/x64/x64gui.dll" DESTINATION "${RELEASE_MAIN_DIR}/x64")
file(COPY "${ROOT_DIR}/bin/x64/loaddll.exe" DESTINATION "${RELEASE_MAIN_DIR}/x64")
# Create commithash.txt
execute_process(
COMMAND git rev-parse HEAD
OUTPUT_FILE "${RELEASE_DIR}/commithash.txt"
WORKING_DIRECTORY "${ROOT_DIR}"
)
# Copy PDB files
file(MAKE_DIRECTORY "${RELEASE_DIR}/pdb")
file(MAKE_DIRECTORY "${RELEASE_DIR}/pdb/x32")
file(MAKE_DIRECTORY "${RELEASE_DIR}/pdb/x64")
file(GLOB PDB_FILES "${ROOT_DIR}/bin/*.pdb")
file(COPY ${PDB_FILES} DESTINATION "${RELEASE_DIR}/pdb")
file(GLOB PDB_X32_FILES "${ROOT_DIR}/bin/x32/*.pdb")
file(COPY ${PDB_X32_FILES} DESTINATION "${RELEASE_DIR}/pdb/x32")
file(GLOB PDB_X64_FILES "${ROOT_DIR}/bin/x64/*.pdb")
file(COPY ${PDB_X64_FILES} DESTINATION "${RELEASE_DIR}/pdb/x64")

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.