require("premake", ">=5.0.0-beta2")


-- add "-Wl,--whole-archive -Wl,-Bstatic -lmylib -Wl,-Bdynamic -Wl,--no-whole-archive"
-- via: links { 'mylib:static_whole' }
-- https://premake.github.io/docs/Overrides-and-Call-Arrays/#introducing-overrides
premake.override(premake.tools.gcc, "getlinks", function(originalFn, cfg, systemonly, nogroups)
    -- source:
    -- premake.tools.gcc.getlinks(cfg, systemonly, nogroups)
    -- https://github.com/premake/premake-core/blob/d842e671c7bc7e09f2eeaafd199fd01e48b87ee7/src/tools/gcc.lua#L568C15-L568C22

    local result = originalFn(cfg, systemonly, nogroups)
    local whole_syslibs = {"-Wl,--whole-archive"}
    local static_whole_syslibs = {"-Wl,--whole-archive -Wl,-Bstatic"}

    local endswith = function(s, ptrn)
        return ptrn == string.sub(s, -string.len(ptrn))
    end

    local idx_to_remove = {}
    for idx, name in ipairs(result) do
        if endswith(name, ":static_whole") then
            name = string.sub(name, 0, -14)
            table.insert(static_whole_syslibs, name) -- it already includes '-l'
            table.insert(idx_to_remove, idx)
        elseif endswith(name, ":whole_archive") then
            name = string.sub(name, 0, -15)
            table.insert(whole_syslibs, name) -- it already includes '-l'
            table.insert(idx_to_remove, idx)
        end
    end

    -- remove from the end to avoid trouble with table indexes shifting
    for iii = #idx_to_remove, 1, -1 do
        table.remove(result, idx_to_remove[iii])
    end

    local move = function(a1, a2)
        local t = #a2
        for i = 1, #a1 do a2[t + i] = a1[i] end
    end

    local new_result = {}
    if #whole_syslibs > 1 then
        table.insert(whole_syslibs, "-Wl,--no-whole-archive")
        move(whole_syslibs, new_result)
    end
    if #static_whole_syslibs > 1 then
        table.insert(static_whole_syslibs, "-Wl,-Bdynamic -Wl,--no-whole-archive")
        move(static_whole_syslibs, new_result)
    end

    -- https://stackoverflow.com/a/71719579
    -- because of the dumb way linux handles linking, the order becomes important
    -- I've encountered a problem with linking and it was failing with error "undefined reference to `__imp_WSACloseEvent'"
    -- despite 'Ws2_32' being added to the list of libraries, turns out some symbols from 'Ws2_32' were being stripped,
    -- because no library before it (on the command line) mentioned any of its symbols, the static libs were being appended afterwards on the command line,
    -- and they were mentioning some of the now-stripped symbols
    move(result, new_result)
    return new_result
end)

local function table_append(table_dest, table_src)
    local dest_start = #table_dest
    for idx = 1, #table_src do
        table_dest[dest_start + idx] = table_src[idx]
    end
end

local function table_postfix_items(table, postfix)
    local ret = {}
    for idx = 1, #table do
        ret[idx] = table[idx] .. postfix
    end
    return ret
end

-- pre-define stuff

local os_iden = '' -- identifier
if os.target() == "windows" then
    os_iden = 'win'
elseif os.target() == "linux" then
    os_iden = 'linux'
else
    error('Unsupported os target: "' .. os.target() .. '"')
end

newoption {
    category = 'protobuf files',
    trigger = "genproto",
    description = "Generate .cc/.h files from .proto file",
}

newoption {
    category = 'build',
    trigger = "emubuild",
    description = "Set the EMU_BUILD_STRING",
    value = "your_string",
    default = os.date("%Y_%m_%d-%H_%M_%S"),
}
newoption {
    category = "build",
    trigger = "deps-dir",
    description = "Base directory where dependencies were built (if overridden it MUST be absolute)",
    value = '/absolute/path/to/my-deps-dir/',
    default = path.getabsolute(path.join('build', 'deps', os_iden, _ACTION), _MAIN_SCRIPT_DIR),
}
newoption {
    category = "build",
    trigger = "build-dir",
    description = "Base directory to build the project inside (if overridden it MUST be absolute)",
    value = '/absolute/path/to/build-dir/',
    default = "build",
}
newoption {
    category = 'visual-includes',
    trigger = "incexamples",
    description = "Add all example files in the projects (no impact on build)",
}
newoption {
    category = 'visual-includes',
    trigger = "incdeps",
    description = "Add all header files from the third-party dependencies in the projects (no impact on build)",
}

-- windows options
if os.target() == 'windows' then

newoption {
    category = "build",
    trigger = "dosstub",
    description = "Change the DOS stub of the Windows builds",
}

newoption {
    category = "build",
    trigger = "winsign",
    description = "Sign Windows builds with a fake certificate",
}

newoption {
    category = "build",
    trigger = "winrsrc",
    description = "Add resources to Windows builds",
}

end
-- End windows options

local deps_dir = _OPTIONS["deps-dir"]
local build_dir = _OPTIONS["build-dir"]

local function genproto()
    local deps_install_prefix = ''
    if os.is64bit() then
        deps_install_prefix = 'install64'
    else
        deps_install_prefix = 'install32'
    end
    local protoc_exe = path.join(deps_dir, 'protobuf', deps_install_prefix, 'bin', 'protoc')

    local out_dir = 'proto_gen/' .. os_iden

    if os.target() == "windows" then
        protoc_exe = protoc_exe .. '.exe'
    end

    if not os.isfile(protoc_exe) then
        error("protoc not found! " .. protoc_exe)
        return
    end

    print("Generating from .proto file!")
    local ok_mk, err_mk = os.mkdir(out_dir)
    if not ok_mk then
        error("Error: " .. err_mk)
        return
    end

    if os.target() == "linux" then
        local ok_chmod, err_chmod = os.chmod(protoc_exe, "777")
        if not ok_chmod then
            error("Error: " .. err_chmod)
            return
        end
    end

    if (os.host() == "linux" and os.target() == "windows") then
        protoc_exe = 'wine ' .. protoc_exe
    end

    return os.execute(protoc_exe .. ' dll/net.proto -I./dll/ --cpp_out=' .. out_dir)
end


-- common defines
---------
local common_emu_defines = { -- added to all filters, later defines will be appended
    "UTF_CPP_CPLUSPLUS=201703L", "CURL_STATICLIB", "CONTROLLER_SUPPORT", "EMU_BUILD_STRING=" .. _OPTIONS["emubuild"],
}

-- include dirs
---------
local common_include = {
    'dll',
    'proto_gen/' .. os_iden,
    'libs',
    'libs/utfcpp',
    'helpers',
    'crash_printer',
    'sdk',
    "overlay_experimental",
}

local x32_deps_include = {
    path.join(deps_dir, "libssq/include"),
    path.join(deps_dir, "curl/install32/include"),
    path.join(deps_dir, "protobuf/install32/include"),
    path.join(deps_dir, "zlib/install32/include"),
    path.join(deps_dir, "mbedtls/install32/include"),
    path.join(deps_dir, "opus/install32/include"),
    path.join(deps_dir, "portaudio/install32/include"),
}

local x32_deps_overlay_include = {
    path.join(deps_dir, "ingame_overlay/install32/include"),
    path.join(deps_dir, "ingame_overlay/deps/System/install32/include"),
    path.join(deps_dir, "ingame_overlay/deps/mini_detour/install32/include"),
}

local x64_deps_include = {
    path.join(deps_dir, "libssq/include"),
    path.join(deps_dir, "curl/install64/include"),
    path.join(deps_dir, "protobuf/install64/include"),
    path.join(deps_dir, "zlib/install64/include"),
    path.join(deps_dir, "mbedtls/install64/include"),
    path.join(deps_dir, "opus/install64/include"),
    path.join(deps_dir, "portaudio/install64/include"),
}

local x64_deps_overlay_include = {
    path.join(deps_dir, "ingame_overlay/install64/include"),
    path.join(deps_dir, "ingame_overlay/deps/System/install64/include"),
    path.join(deps_dir, "ingame_overlay/deps/mini_detour/install64/include"),
}


-- source & header files
---------
local common_files = {
    -- dll/
    "dll/**",
    -- proto_gen/
    'proto_gen/' .. os_iden .. '/**',
    -- libs
    "libs/**",
    -- crash_printer/
    'crash_printer/' .. os_iden .. '.cpp', 'crash_printer/crash_printer/' .. os_iden .. '.hpp',
    -- helpers/common_helpers
    "helpers/common_helpers.cpp", "helpers/common_helpers/**",
    -- helpers/dbg_log
    "helpers/dbg_log.cpp", "helpers/dbg_log/**",
}

local overlay_files = {
    "overlay_experimental/**",
}

local detours_files = {
    "libs/detours/**",
}


-- libs to link
---------
local lib_prefix = 'lib'
local static_postfix = ''
-- GCC/Clang add this prefix by default and linking ex: '-lssq' will look for 'libssq'
-- so we have to ommit this prefix since it's automatically added
if _ACTION and string.match(_ACTION, 'gmake.*') then
    lib_prefix = ''
    if os.target() ~= 'windows' then -- for MinGw we compile everything with -static, and this conflicts with it
        static_postfix = ':static'
    end
end

local zlib_archive_name = 'z'
if os.target() == 'windows' then
    zlib_archive_name = 'zlibstatic' -- even on MinGw we need this name
end

local deps_link = {
    "ssq"                .. static_postfix,
    zlib_archive_name    .. static_postfix,
    lib_prefix .. "curl" .. static_postfix,
    "mbedcrypto"         .. static_postfix,
    "mbedtls"            .. static_postfix,
    "mbedx509"           .. static_postfix,
    "opus"               .. static_postfix,
    "portaudio"          .. static_postfix,
}
-- add protobuf libs
table_append(deps_link, {
    lib_prefix .. "protobuf-lite"                 .. static_postfix,
    "absl_bad_any_cast_impl"                      .. static_postfix,
    "absl_bad_optional_access"                    .. static_postfix,
    "absl_bad_variant_access"                     .. static_postfix,
    "absl_base"                                   .. static_postfix,
    "absl_city"                                   .. static_postfix,
    "absl_civil_time"                             .. static_postfix,
    "absl_cord"                                   .. static_postfix,
    "absl_cordz_functions"                        .. static_postfix,
    "absl_cordz_handle"                           .. static_postfix,
    "absl_cordz_info"                             .. static_postfix,
    "absl_cordz_sample_token"                     .. static_postfix,
    "absl_cord_internal"                          .. static_postfix,
    "absl_crc32c"                                 .. static_postfix,
    "absl_crc_cord_state"                         .. static_postfix,
    "absl_crc_cpu_detect"                         .. static_postfix,
    "absl_crc_internal"                           .. static_postfix,
    "absl_debugging_internal"                     .. static_postfix,
    "absl_decode_rust_punycode"                   .. static_postfix,
    "absl_demangle_internal"                      .. static_postfix,
    "absl_demangle_rust"                          .. static_postfix,
    "absl_die_if_null"                            .. static_postfix,
    "absl_examine_stack"                          .. static_postfix,
    "absl_exponential_biased"                     .. static_postfix,
    "absl_failure_signal_handler"                 .. static_postfix,
    "absl_flags_commandlineflag"                  .. static_postfix,
    "absl_flags_commandlineflag_internal"         .. static_postfix,
    "absl_flags_config"                           .. static_postfix,
    "absl_flags_internal"                         .. static_postfix,
    "absl_flags_marshalling"                      .. static_postfix,
    "absl_flags_parse"                            .. static_postfix,
    "absl_flags_private_handle_accessor"          .. static_postfix,
    "absl_flags_program_name"                     .. static_postfix,
    "absl_flags_reflection"                       .. static_postfix,
    "absl_flags_usage"                            .. static_postfix,
    "absl_flags_usage_internal"                   .. static_postfix,
    "absl_graphcycles_internal"                   .. static_postfix,
    "absl_hash"                                   .. static_postfix,
    "absl_hashtablez_sampler"                     .. static_postfix,
    "absl_int128"                                 .. static_postfix,
    "absl_kernel_timeout_internal"                .. static_postfix,
    "absl_leak_check"                             .. static_postfix,
    "absl_log_entry"                              .. static_postfix,
    "absl_log_flags"                              .. static_postfix,
    "absl_log_globals"                            .. static_postfix,
    "absl_log_initialize"                         .. static_postfix,
    "absl_log_internal_check_op"                  .. static_postfix,
    "absl_log_internal_conditions"                .. static_postfix,
    "absl_log_internal_fnmatch"                   .. static_postfix,
    "absl_log_internal_format"                    .. static_postfix,
    "absl_log_internal_globals"                   .. static_postfix,
    "absl_log_internal_log_sink_set"              .. static_postfix,
    "absl_log_internal_message"                   .. static_postfix,
    "absl_log_internal_nullguard"                 .. static_postfix,
    "absl_log_internal_proto"                     .. static_postfix,
    "absl_log_internal_structured_proto"          .. static_postfix,
    "absl_log_severity"                           .. static_postfix,
    "absl_log_sink"                               .. static_postfix,
    "absl_low_level_hash"                         .. static_postfix,
    "absl_malloc_internal"                        .. static_postfix,
    "absl_periodic_sampler"                       .. static_postfix,
    "absl_poison"                                 .. static_postfix,
    "absl_random_distributions"                   .. static_postfix,
    "absl_random_internal_distribution_test_util" .. static_postfix,
    "absl_random_internal_platform"               .. static_postfix,
    "absl_random_internal_pool_urbg"              .. static_postfix,
    "absl_random_internal_randen"                 .. static_postfix,
    "absl_random_internal_randen_hwaes"           .. static_postfix,
    "absl_random_internal_randen_hwaes_impl"      .. static_postfix,
    "absl_random_internal_randen_slow"            .. static_postfix,
    "absl_random_internal_seed_material"          .. static_postfix,
    "absl_random_seed_gen_exception"              .. static_postfix,
    "absl_random_seed_sequences"                  .. static_postfix,
    "absl_raw_hash_set"                           .. static_postfix,
    "absl_raw_logging_internal"                   .. static_postfix,
    "absl_scoped_set_env"                         .. static_postfix,
    "absl_spinlock_wait"                          .. static_postfix,
    "absl_stacktrace"                             .. static_postfix,
    "absl_status"                                 .. static_postfix,
    "absl_statusor"                               .. static_postfix,
    "absl_strerror"                               .. static_postfix,
    "absl_strings"                                .. static_postfix,
    "absl_strings_internal"                       .. static_postfix,
    "absl_string_view"                            .. static_postfix,
    "absl_str_format_internal"                    .. static_postfix,
    "absl_symbolize"                              .. static_postfix,
    "absl_synchronization"                        .. static_postfix,
    "absl_throw_delegate"                         .. static_postfix,
    "absl_time"                                   .. static_postfix,
    "absl_time_zone"                              .. static_postfix,
    "absl_tracing_internal"                       .. static_postfix,
    "absl_utf8_for_code_point"                    .. static_postfix,
    "absl_vlog_config_internal"                   .. static_postfix,
    lib_prefix .."utf8_range"                     .. static_postfix,
    lib_prefix .."utf8_validity"                  .. static_postfix,
})

local common_link_win = {
    -- os specific
    "Ws2_32"   .. static_postfix,
    "Iphlpapi" .. static_postfix,
    "Wldap32"  .. static_postfix,
    "Winmm"    .. static_postfix,
    "Bcrypt"   .. static_postfix,
    "Dbghelp"  .. static_postfix,
    -- gamepad
    "Xinput"   .. static_postfix,
    -- imgui / overlay
    "Gdi32"    .. static_postfix,
    "Dwmapi"   .. static_postfix,
    "OpenGL32" .. static_postfix,
}
-- add deps to win
table_append(common_link_win, deps_link)

local common_link_linux = {
    -- os specific
    "pthread", "dl",
}
-- add deps to linux
table_append(common_link_linux, deps_link)

-- overlay libs
local overlay_link = {
    "ingame_overlay",
    "system", -- ingame_overlay dependency
    "mini_detour", -- ingame_overlay dependency
}
-- we add them later when needed


-- dirs to custom libs
---------
local x32_ssq_libdir = path.join(deps_dir, "libssq/build32")
local x64_ssq_libdir = path.join(deps_dir, "libssq/build64")

local cmake_generator = os.getenv("CMAKE_GENERATOR") or ""
if cmake_generator == "" and os.host() == 'windows' or cmake_generator:find("Visual Studio") then
    x32_ssq_libdir = x32_ssq_libdir .. "/Release"
    x64_ssq_libdir = x64_ssq_libdir .. "/Release"
end

local x32_deps_libdir = {
    x32_ssq_libdir,
    path.join(deps_dir, "curl/install32/lib"),
    path.join(deps_dir, "protobuf/install32/lib"),
    path.join(deps_dir, "zlib/install32/lib"),
    path.join(deps_dir, "mbedtls/install32/lib"),
    path.join(deps_dir, "opus/install32/lib"),
    path.join(deps_dir, "portaudio/install32/lib"),
}

local x32_deps_overlay_libdir = {
    path.join(deps_dir, "ingame_overlay/install32/lib"),
    path.join(deps_dir, "ingame_overlay/deps/System/install32/lib"),
    path.join(deps_dir, "ingame_overlay/deps/mini_detour/install32/lib"),
}

local x64_deps_libdir = {
    x64_ssq_libdir,
    path.join(deps_dir, "curl/install64/lib"),
    path.join(deps_dir, "protobuf/install64/lib"),
    path.join(deps_dir, "zlib/install64/lib"),
    path.join(deps_dir, "mbedtls/install64/lib"),
    path.join(deps_dir, "ingame_overlay/install64/lib"),
    path.join(deps_dir, "opus/install64/lib"),
    path.join(deps_dir, "portaudio/install64/lib"),
}

local x64_deps_overlay_libdir = {
    path.join(deps_dir, "ingame_overlay/install64/lib"),
    path.join(deps_dir, "ingame_overlay/deps/System/install64/lib"),
    path.join(deps_dir, "ingame_overlay/deps/mini_detour/install64/lib"),
}

-- generate proto
if _OPTIONS["genproto"] then
    if genproto() then
        print("Success!")
    else
        error("protoc error")
    end
end
-- End generate proto



-- tokenization
-- https://premake.github.io/docs/Tokens/
-- this means expand the global var 'abc' --> %{abc}
-- this means expand the global var 'abc' and resolve its full path --> %{!abc}
-- this means expand the global var 'abc' as a filepath agnostic to the shell (bash/cmd) --> %[%{abc}]

-- string concat and functions calls
-- https://premake.github.io/docs/Your-First-Script#functions-and-arguments
-- "asd" .. "zxc" --> "asdzxc"
-- when doing string concat, call premake functions/actions with regular brackets
-- this will work: targetdir("build/" .. os_iden)
-- this will fail: targetdir "build/" .. os_iden
-- both are function calls actually, ex: filter({ 'a', 'b' }) is similar to filter { 'a', 'b' }

-- stuff defined globally will affect all workspaces & projects
-- https://premake.github.io/docs/Scopes-and-Inheritance/

filter {} -- reset the filter and remove all active keywords
configurations { "debug", "release", }
platforms { "x64", "x32", }
language "C++"
cppdialect "C++17"
cdialect "C17"
filter { "system:not windows", "action:gmake*" , }
    cdialect("gnu17") -- gamepad.c relies on some linux-specific functions like strdup() and MAX_PATH
filter {} -- reset the filter and remove all active keywords
characterset "Unicode"
staticruntime "on" -- /MT or /MTd
runtime "Release" -- ensure we never link with /MTd, otherwise deps linking will fail
flags {
    "NoPCH", -- no precompiled header on Windows
    "MultiProcessorCompile", -- /MP "Enable Visual Studio to use multiple compiler processes when building"
    "RelativeLinks",
}
targetprefix "" -- prevent adding the prefix libxxx on linux
visibility "Hidden" -- hide all symbols by default on GCC (unless they are marked visible)
linkgroups "On" -- turn off the awful order dependent linking on gcc/clang, causes the linker to go back and forth to find missing symbols
exceptionhandling "On" -- "Enable exception handling. ... although it does not affect execution."
stringpooling "On" -- cache similar strings
vpaths { -- just for visual niceness, see: https://premake.github.io/docs/vpaths/
    ["headers/*"] = {
        "**.h", "**.hxx", "**.hpp",
    },
    ["src/*"] = {
        "**.c", "**.cxx", "**.cpp", "**.cc",
    },
    ["proto/*"] = {
        "**.proto",
    },
    ["docs/*"] = {
        -- post build
        "post_build/**",
        -- licence files
        "**/LICENSE", "**/LICENCE",
        "**.LICENSE", "**.LICENCE",
        "**.mit",
        -- anything else
        "**.txt", "**.md",
    },
}


-- arch
---------
filter { "platforms:x32", }
    architecture "x86" 
filter { "platforms:x64", }
    architecture "x86_64"
filter {} -- reset the filter and remove all active keywords


-- debug/optimization flags
---------
filter {} -- reset the filter and remove all active keywords
intrinsics "On"
filter { "configurations:*debug", }
    symbols "On"
    optimize "Off"
filter { "configurations:*release", }
    symbols "Off"
    optimize "On"
filter {} -- reset the filter and remove all active keywords


--- common compiler/linker options
---------
-- Visual Studio common compiler/linker options
filter { "action:vs*", }
    buildoptions  {
        "/permissive-", "/DYNAMICBASE", "/bigobj",
        "/utf-8", "/Zc:char8_t-", "/EHsc", "/GL-"
    }
    linkoptions  {
        -- source of emittoolversioninfo: https://developercommunity.visualstudio.com/t/add-linker-option-to-strip-rich-stamp-from-exe-hea/740443
        "/NOLOGO", "/emittoolversioninfo:no"
    }
-- GNU make common compiler/linker options
filter { "action:gmake*", }
    buildoptions  {
        -- https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html
        "-fno-jump-tables" , "-Wno-switch",
    }
    linkoptions {
        "-Wl,--exclude-libs,ALL",
    }
-- this is made separate because GCC complains but not CLANG
filter { "action:gmake*" , "files:*.cpp or *.cxx or *.cc or *.hpp or *.hxx", }
    buildoptions  {
        "-fno-char8_t", -- GCC gives a warning when a .c file is compiled with this
    }
filter {} -- reset the filter and remove all active keywords


-- defines
---------
filter {} -- reset the filter and remove all active keywords
defines { -- added to all filters, later defines will be appended
    common_emu_defines,
}
-- release mode defines
filter { "configurations:*release" }
    defines {
        "NDEBUG", "EMU_RELEASE_BUILD"
    }
-- debug mode defines
filter { "configurations:*debug" }
    defines {
        "DEBUG",
    }
-- Windows defines
filter { "system:windows", }
    defines {
        "_CRT_SECURE_NO_WARNINGS",
    }
-- Linux defines
filter { "system:not windows" }
    defines {
        "GNUC",
    }
filter {} -- reset the filter and remove all active keywords


-- MinGw on Windows
-- common compiler/linker options: source: https://gcc.gnu.org/onlinedocs/gcc/Cygwin-and-MinGW-Options.html
---------
filter { "system:windows", "action:gmake*", }
    -- MinGw on Windows common defines
    -- MinGw on Windows doesn't have a definition for '_S_IFDIR' which is microsoft specific: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions
    -- this is used in 'base.cpp' -> if ( buffer.st_mode & _S_IFDIR)
    -- instead microsoft has an alternative but only enabled when _CRT_DECLARE_NONSTDC_NAMES is defined
    -- https://learn.microsoft.com/en-us/cpp/c-runtime-library/compatibility
    defines {
        -- '_CRT_NONSTDC_NO_WARNINGS',
        '_CRT_DECLARE_NONSTDC_NAMES',
    }
    linkoptions {
        -- I don't know why but if libgcc/libstdc++ as well as pthreads are not statically linked
        -- none of the output binary .dlls will reach their DllMain() in x64dbg
        -- even when they're force-loaded in any process they immediately unload
        -- '-static-libgcc' ,'-static-libstdc++',
        '-static',
    }
-- MinGw on Windows cannot compile 'creatwth.cpp' from Detours lib (error: 'DWordMult' was not declared in this scope)
-- because intsafe.h isn't included by default
filter { "system:windows", "action:gmake*", "files:**/detours/creatwth.cpp" }
    buildoptions  {
        "-include intsafe.h",
    }
filter {} -- reset the filter and remove all active keywords


-- add extra files for clearance
filter {} -- reset the filter and remove all active keywords
-- post build docs
filter { 'options:incexamples', }
    files {
        'post_build/**',
    }
filter { 'options:incexamples', 'system:not windows', }
    removefiles {
        'post_build/win/**'
    }

-- deps
filter { 'options:incdeps', "platforms:x32", }
    files {
        table_postfix_items(x32_deps_include, '/**.h'),
        table_postfix_items(x32_deps_include, '/**.hxx'),
        table_postfix_items(x32_deps_include, '/**.hpp'),
    }
filter { 'options:incdeps', "platforms:x64", }
    files {
        table_postfix_items(x64_deps_include, '/**.h'),
        table_postfix_items(x64_deps_include, '/**.hxx'),
        table_postfix_items(x64_deps_include, '/**.hpp'),
    }
filter {} -- reset the filter and remove all active keywords


-- include dirs
---------
-- common include dir
filter {} -- reset the filter and remove all active keywords
includedirs {
    common_include,
}


-- disable warnings for external libraries/deps
filter { 'files:proto_gen/** or libs/** or build/deps/**' }
    warnings 'Off'
filter {} -- reset the filter and remove all active keywords



-- post build change DOS stub + sign
---------
if os.target() == "windows" then

-- token expansion like '%{cfg.platform}' happens later during project build
local dos_stub_exe = path.translate(path.getabsolute('resources/win/file_dos_stub/file_dos_stub_%{cfg.platform}.exe', _MAIN_SCRIPT_DIR), '\\')
local signer_tool = path.translate(path.getabsolute('third-party/build/win/cert/sign_helper.bat', _MAIN_SCRIPT_DIR), '\\')
-- change dos stub
filter { "system:windows", "options:dosstub", }
    postbuildcommands {
        '"' .. dos_stub_exe .. '" %[%{!cfg.buildtarget.abspath}]',
    }
-- sign
filter { "system:windows", "options:winsign", }
    postbuildcommands {
        '"' .. signer_tool .. '" %[%{!cfg.buildtarget.abspath}]',
    }
filter {} -- reset the filter and remove all active keywords
end



workspace "gbe"
    location("build/project/%{_ACTION}/" .. os_iden)


-- Project api_regular
---------
project "api_regular"
    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/regular/%{cfg.platform}"))


    -- name
    ---------
    filter { "system:windows", "platforms:x32", }
        targetname "steam_api"
    filter { "system:windows", "platforms:x64", }
        targetname "steam_api64"
    filter { "system:not windows", }
        targetname "libsteam_api"


    -- x32 include dir
    filter { "platforms:x32", }
        includedirs {
            x32_deps_include,
        }

    -- x64 include dir
    filter { "platforms:x64", }
        includedirs {
            x64_deps_include,
        }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        common_files,
    }
    removefiles {
        detours_files,
    }
    -- Windows common source files
    filter { "system:windows", }
        removefiles {
            "dll/wrap.cpp"
        }
    -- Windows x32 common source files
    filter { "system:windows", "platforms:x32", "options:winrsrc", }
        files {
            "resources/win/api/32/resources.rc"
        }
    -- Windows x64 common source files
    filter { "system:windows", "platforms:x64", "options:winrsrc", }
        files {
            "resources/win/api/64/resources.rc"
        }


    -- libs to link
    ---------
    -- Windows libs to link
    filter { "system:windows", }
        links {
            common_link_win,
        }

    -- Linux libs to link
    filter { "system:not windows", }
        links {
            common_link_linux,
        }


    -- libs search dir
    ---------
    -- x32 libs search dir
    filter { "platforms:x32", }
        libdirs {
            x32_deps_libdir,
        }
    -- x64 libs search dir
    filter { "platforms:x64", }
        libdirs {
            x64_deps_libdir,
        }
-- End api_regular


-- Project api_experimental
---------
project "api_experimental"
    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/experimental/%{cfg.platform}"))


    -- name
    ---------
    filter { "system:windows", "platforms:x32", }
        targetname "steam_api"
    filter { "system:windows", "platforms:x64", }
        targetname "steam_api64"
    filter { "system:not windows", }
        targetname "libsteam_api"


    -- defines
    ---------
    filter {} -- reset the filter and remove all active keywords
    defines { -- added to all filters, later defines will be appended
        "EMU_OVERLAY", "ImTextureID=ImU64",
        "EMU_EXPERIMENTAL_BUILD",
    }


    -- include dir
    ---------
    -- x32 include dir
    filter { "platforms:x32", }
        includedirs {
            x32_deps_include,
            x32_deps_overlay_include,
        }
    -- x64 include dir
    filter { "platforms:x64", }
        includedirs {
            x64_deps_include,
            x64_deps_overlay_include,
        }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        common_files,
        overlay_files,
    }
    removefiles {
        'libs/detours/uimports.cc',
    }
    -- deps
    filter { 'options:incdeps', "platforms:x32", }
        files {
            table_postfix_items(x32_deps_overlay_include, '/**.h'),
            table_postfix_items(x32_deps_overlay_include, '/**.hxx'),
            table_postfix_items(x32_deps_overlay_include, '/**.hpp'),
        }
    filter { 'options:incdeps', "platforms:x64", }
        files {
            table_postfix_items(x64_deps_overlay_include, '/**.h'),
            table_postfix_items(x64_deps_overlay_include, '/**.hxx'),
            table_postfix_items(x64_deps_overlay_include, '/**.hpp'),
        }
    -- Windows common source files
    filter { "system:windows", }
        removefiles {
            "dll/wrap.cpp"
        }
    -- Windows x32 common source files
    filter { "system:windows", "platforms:x32", "options:winrsrc", }
        files {
            "resources/win/api/32/resources.rc"
        }
    -- Windows x64 common source files
    filter { "system:windows", "platforms:x64", "options:winrsrc", }
        files {
            "resources/win/api/64/resources.rc"
        }
    -- Linux common source files
    filter { "system:not windows", }
        removefiles {
            detours_files,
        }


    -- libs to link
    ---------
    filter {} -- reset the filter and remove all active keywords
        links {
            overlay_link,
        }
    -- Windows libs to link
    filter { "system:windows", }
        links {
            common_link_win,
        }

    -- Linux libs to link
    filter { "system:not windows", }
        links {
            common_link_linux,
            "X11"
        }


    -- libs search dir
    ---------
    -- x32 libs search dir
    filter { "platforms:x32", }
        libdirs {
            x32_deps_libdir,
            x32_deps_overlay_libdir,
        }
    -- x64 libs search dir
    filter { "platforms:x64", }
        libdirs {
            x64_deps_libdir,
            x64_deps_overlay_libdir,
        }
-- End api_experimental


-- Project steamclient_experimental
---------
project "steamclient_experimental"
    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"
    
    -- targetdir
    ---------
    filter { "system:windows", }
        targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/steamclient_experimental"))
    filter { "system:not windows", }
        targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/experimental/%{cfg.platform}"))


    -- name
    ---------
    filter { "system:windows", "platforms:x32", }
        targetname "steamclient"
    filter { "system:windows", "platforms:x64", }
        targetname "steamclient64"
    filter { "system:not windows", }
        targetname "steamclient"
    

    -- defines
    ---------
    filter {} -- reset the filter and remove all active keywords
    defines { -- added to all filters, later defines will be appended
        "STEAMCLIENT_DLL", "EMU_OVERLAY", "ImTextureID=ImU64",
        "EMU_EXPERIMENTAL_BUILD",
    }


    -- include dir
    ---------
    -- x32 include dir
    filter { "platforms:x32", }
        includedirs {
            x32_deps_include,
            x32_deps_overlay_include,
        }

    -- x64 include dir
    filter { "platforms:x64", }
        includedirs {
            x64_deps_include,
            x64_deps_overlay_include,
        }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        common_files,
        overlay_files,
    }
    removefiles {
        'libs/detours/uimports.cc',
        'dll/flat.cpp',
    }
    -- deps
    filter { 'options:incdeps', "platforms:x32", }
        files {
            table_postfix_items(x32_deps_overlay_include, '/**.h'),
            table_postfix_items(x32_deps_overlay_include, '/**.hxx'),
            table_postfix_items(x32_deps_overlay_include, '/**.hpp'),
        }
    filter { 'options:incdeps', "platforms:x64", }
        files {
            table_postfix_items(x64_deps_overlay_include, '/**.h'),
            table_postfix_items(x64_deps_overlay_include, '/**.hxx'),
            table_postfix_items(x64_deps_overlay_include, '/**.hpp'),
        }
    -- Windows common source files
    filter { "system:windows", }
        removefiles {
            "dll/wrap.cpp"
        }
    -- Windows x32 common source files
    filter { "system:windows", "platforms:x32", "options:winrsrc", }
        files {
            "resources/win/client/32/resources.rc"
        }
    -- Windows x64 common source files
    filter { "system:windows", "platforms:x64", "options:winrsrc", }
        files {
            "resources/win/client/64/resources.rc"
        }
    -- Linux common source files
    filter { "system:not windows", }
        removefiles {
            detours_files,
        }


    -- libs to link
    ---------
    filter {} -- reset the filter and remove all active keywords
        links {
            overlay_link,
        }
    -- Windows libs to link
    filter { "system:windows", }
        links {
            common_link_win,
        }

    -- Linux libs to link
    filter { "system:not windows", }
        links {
            common_link_linux,
        }


    -- libs search dir
    ---------
    -- x32 libs search dir
    filter { "platforms:x32", }
        libdirs {
            x32_deps_libdir,
            x32_deps_overlay_libdir,
        }
    -- x64 libs search dir
    filter { "platforms:x64", }
        libdirs {
            x64_deps_libdir,
            x64_deps_overlay_libdir,
        }
-- End steamclient_experimental


-- Project tool_lobby_connect
---------
project "tool_lobby_connect"
    kind "ConsoleApp"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/tools/lobby_connect"))
    targetname "lobby_connect_%{cfg.platform}"


    -- defines
    ---------
    filter {} -- reset the filter and remove all active keywords
    defines { -- added to all filters, later defines will be appended
        "NO_DISK_WRITES", "LOBBY_CONNECT",
    }
    removedefines {
        "CONTROLLER_SUPPORT",
    }


    -- include dir
    ---------
    -- common include dir
    -- x32 include dir
    filter { "platforms:x32", }
        includedirs {
            x32_deps_include,
        }

    -- x64 include dir
    filter { "platforms:x64", }
        includedirs {
            x64_deps_include,
        }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        common_files,
        'tools/lobby_connect/lobby_connect.cpp'
    }
    removefiles {
        "libs/gamepad/**",
        detours_files,
        'dll/flat.cpp',
    }
    -- Windows x32 common source files
    filter { "system:windows", "platforms:x32", "options:winrsrc", }
        files {
            "resources/win/launcher/32/resources.rc"
        }
    -- Windows x64 common source files
    filter { "system:windows", "platforms:x64", "options:winrsrc", }
        files {
            "resources/win/launcher/64/resources.rc"
        }


    -- libs to link
    ---------
    -- Windows libs to link
    filter { "system:windows", }
        links {
            common_link_win,
            'Comdlg32',
        }

    -- Linux libs to link
    filter { "system:not windows", }
        links {
            common_link_linux,
        }


    -- libs search dir
    ---------
    -- x32 libs search dir
    filter { "platforms:x32", }
        libdirs {
            x32_deps_libdir,
        }
    -- x64 libs search dir
    filter { "platforms:x64", }
        libdirs {
            x64_deps_libdir,
        }
-- End tool_lobby_connect


-- Project tool_generate_interfaces
project "tool_generate_interfaces"
    kind "ConsoleApp"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/tools/generate_interfaces"))
    targetname "generate_interfaces_%{cfg.platform}"


    -- common source & header files
    ---------
    files {
        "tools/generate_interfaces/generate_interfaces.cpp",
        'helpers/common_helpers.cpp', 'helpers/common_helpers/**',
        'libs/utfcpp/**',
    }
-- End tool_generate_interfaces


-- Project lib_steamnetworkingsockets START
project "lib_steamnetworkingsockets"
    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/steamnetworkingsockets/%{cfg.platform}"))
    targetname "libsteamnetworkingsockets"


    -- common source & header files
    ---------
    files {
        "networking_sockets_lib/**",
        "helpers/dbg_log.cpp", "helpers/dbg_log/**",
        'helpers/common_helpers.cpp', 'helpers/common_helpers/**',
        'libs/utfcpp/**',
    }


-- End lib_steamnetworkingsockets


-- Project lib_game_overlay_renderer
project "lib_game_overlay_renderer"
    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"


    -- targetdir
    ---------
    filter { "system:windows", }
        targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/steamclient_experimental"))
    filter { "system:not windows", }
        targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/gameoverlayrenderer/%{cfg.platform}"))


    -- name
    ---------
    filter { "system:windows", "platforms:x32", }
        targetname "GameOverlayRenderer"
    filter { "system:windows", "platforms:x64", }
        targetname "GameOverlayRenderer64"
    filter { "system:not windows", }
        targetname "gameoverlayrenderer"

    
    -- include dir
    ---------
    -- x32 include dir
    filter { "platforms:x32", }
        includedirs {
            x32_deps_include,
        }

    -- x64 include dir
    filter { "platforms:x64", }
        includedirs {
            x64_deps_include,
        }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files {
        "game_overlay_renderer_lib/**",
        "dll/common_includes.h",
        "common_helpers/os_detector.h",
    }
    -- x32 common source files
    filter { "system:windows", "platforms:x32", "options:winrsrc", }
        files {
            "resources/win/game_overlay_renderer/32/resources.rc"
        }
    -- x64 common source files
    filter { "system:windows", "platforms:x64", "options:winrsrc", }
        files {
            "resources/win/game_overlay_renderer/64/resources.rc"
        }
-- End lib_game_overlay_renderer



-- WINDOWS ONLY TARGETS START
if os.target() == "windows" then


-- Project steamclient_experimental_stub
---------
project "steamclient_experimental_stub"
    -- https://stackoverflow.com/a/63228027
    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/experimental/%{cfg.platform}"))


    -- name
    ---------
    filter { "platforms:x32", }
        targetname "steamclient"
    filter { "platforms:x64", }
        targetname "steamclient64"


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        "steamclient/steamclient.cpp",
    }
    -- x32 common source files
    filter { "platforms:x32", "options:winrsrc", }
        files {
            "resources/win/client/32/resources.rc"
        }
    -- x64 common source files
    filter { "platforms:x64", "options:winrsrc", }
        files {
            "resources/win/client/64/resources.rc"
        }
-- End steamclient_experimental_stub


-- Project steamclient_experimental_extra
project "steamclient_experimental_extra"
    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/steamclient_experimental/extra_dlls"))
    targetname "steamclient_extra_%{cfg.platform}"


    -- include dir
    ---------
    -- x32 include dir
    filter { "platforms:x32", }
        includedirs {
            x32_deps_include,
        }
    -- x64 include dir
    filter { "platforms:x64", }
        includedirs {
            x64_deps_include,
        }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files {
        "tools/steamclient_loader/win/extra_protection/**",
        "helpers/pe_helpers.cpp", "helpers/pe_helpers/**",
        "helpers/common_helpers.cpp", "helpers/common_helpers/**",
        'libs/utfcpp/**',
        -- detours
        detours_files,
    }
    removefiles {
        'libs/detours/uimports.cc',
    }
    -- x32 common source files
    filter { "platforms:x32", "options:winrsrc", }
        files {
            "resources/win/client/32/resources.rc"
        }
    -- x64 common source files
    filter { "platforms:x64", "options:winrsrc", }
        files {
            "resources/win/client/64/resources.rc"
        }
-- End steamclient_experimental_extra


-- Project lib_steam_old
project "lib_steam_old"
    -- https://premake.github.io/docs/Configurations-and-Platforms/#per-project-configurations
    removeplatforms { "x64" }

    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/steam_old_lib"))
    targetname "Steam"


    -- include dir
    ---------
    -- x32 include dir
    includedirs {
        x32_deps_include,
    }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files {
        "steam_old_lib/**",
        "helpers/common_helpers.cpp", "helpers/common_helpers/**",
        "helpers/dbg_log.cpp", "helpers/dbg_log/**",
        'libs/utfcpp/**',
        -- detours
        detours_files,
    }
    removefiles {
        'libs/detours/uimports.cc',
    }
    -- x32 common source files
    files {
        "resources/win/api/32/resources.rc"
    }


    -- libs to link
    ---------
    -- Windows libs to link
    filter {} -- reset the filter and remove all active keywords
    links {
        'Ws2_32',
    }
-- End lib_steam_old


-- Project steamclient_experimental_loader
project "steamclient_experimental_loader"
    kind "WindowedApp"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/steamclient_experimental"))
    targetname "steamclient_loader_%{cfg.platform}"


    --- common compiler/linker options
    ---------
    -- MinGW on Windows
    filter { "action:gmake*", }
        -- source: https://gcc.gnu.org/onlinedocs/gcc/Cygwin-and-MinGW-Options.html
        linkoptions {
            -- MinGW on Windows cannot link wWinMain by default
            "-municode",
        }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files {
        "tools/steamclient_loader/win/*", -- we want the .ini too
        "helpers/pe_helpers.cpp", "helpers/pe_helpers/**",
        "helpers/common_helpers.cpp", "helpers/common_helpers/**",
        "helpers/dbg_log.cpp", "helpers/dbg_log/**",
        'libs/utfcpp/**',
        "libs/simpleini/**",
    }
    -- x32 common source files
    filter { "platforms:x32", "options:winrsrc", }
        files {
            "resources/win/launcher/32/resources.rc"
        }
    -- x64 common source files
    filter { "platforms:x64", "options:winrsrc", }
        files {
            "resources/win/launcher/64/resources.rc"
        }


    -- libs to link
    ---------
    filter {} -- reset the filter and remove all active keywords
    links {
        -- common_link_win,
        'user32',
    }
-- End steamclient_experimental_loader


-- Project tool_file_dos_stub_changer
project "tool_file_dos_stub_changer"
    kind "ConsoleApp"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/file_dos_stub_changer"))
    targetname "file_dos_stub_%{cfg.platform}"


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files {
        "resources/win/file_dos_stub/file_dos_stub.cpp",
        "helpers/pe_helpers.cpp", "helpers/pe_helpers/**",
        "helpers/common_helpers.cpp", "helpers/common_helpers/**",
        'libs/utfcpp/**',
    }
-- End tool_file_dos_stub_changer


-- Project test_crash_printer
---------
project "test_crash_printer"
    kind "ConsoleApp"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/tests/crash_printer"))
    targetname "test_crash_printer_%{cfg.platform}"


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        'crash_printer/' .. os_iden .. '.cpp', 'crash_printer/crash_printer/' .. os_iden .. '.hpp',
        -- helpers
        'helpers/common_helpers.cpp', 'helpers/common_helpers/**',
        'libs/utfcpp/**',
        -- test files
        'crash_printer/tests/test_win.cpp',
    }
    removefiles {
        'post_build/**',
        'build/deps/**',
    }


    -- libs to link
    ---------
    filter {} -- reset the filter and remove all active keywords
    -- Windows libs
    links {
        'Dbghelp',
    }


    -- post build
    ---------
    filter {} -- reset the filter and remove all active keywords
    postbuildcommands {
        '%[%{!cfg.buildtarget.abspath}]',
    }
-- End test_crash_printer

end
-- End WINDOWS ONLY TARGETS



-- LINUX ONLY TARGETS START
if os.target() == "linux" then

-- Project steamclient_regular
---------
project "steamclient_regular"
    kind "SharedLib"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/regular/%{cfg.platform}"))
    targetname "steamclient"


    -- defines
    ---------
    filter {} -- reset the filter and remove all active keywords
    defines { -- added to all filters, later defines will be appended
        "STEAMCLIENT_DLL",
    }


    -- include dir
    ---------
    -- x32 include dir
    filter { "platforms:x32", }
        includedirs {
            x32_deps_include,
        }
    -- x64 include dir
    filter { "platforms:x64", }
        includedirs {
            x64_deps_include,
        }


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        common_files,
    }
    removefiles {
        detours_files,
        'dll/flat.cpp',
    }


    -- libs to link
    ---------
    filter {} -- reset the filter and remove all active keywords
    links { -- added to all filters, later defines will be appended
        common_link_linux,
    }

    -- libs search dir
    ---------
    -- x32 libs search dir
    filter { "platforms:x32", }
        libdirs {
            x32_deps_libdir,
        }
    -- x64 libs search dir
    filter { "platforms:x64", }
        libdirs {
            x64_deps_libdir,
        }
-- End steamclient_regular


-- Project test_crash_printer_sa_handler
---------
project "test_crash_printer_sa_handler"
    kind "ConsoleApp"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/tests/crash_printer"))
    targetname "test_crash_printer_sa_handler_%{cfg.platform}"


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        'crash_printer/' .. os_iden .. '.cpp', 'crash_printer/crash_printer/' .. os_iden .. '.hpp',
        -- helpers
        'helpers/common_helpers.cpp', 'helpers/common_helpers/**',
        'libs/utfcpp/**',
        -- test files
        'crash_printer/tests/test_linux_sa_handler.cpp',
    }
    removefiles {
        'post_build/**',
        'build/deps/**',
    }


    -- post build
    ---------
    filter {} -- reset the filter and remove all active keywords
    postbuildcommands {
        '%[%{!cfg.buildtarget.abspath}]',
    }

-- End test_crash_printer_sa_handler


-- Project test_crash_printer_sa_sigaction
---------
project "test_crash_printer_sa_sigaction"
    kind "ConsoleApp"
    location "%{wks.location}/%{prj.name}"
    targetdir(path.join(build_dir, os_iden, _ACTION, "%{cfg.buildcfg}/tests/crash_printer"))
    targetname "test_crash_printer_sa_sigaction_%{cfg.platform}"


    -- common source & header files
    ---------
    filter {} -- reset the filter and remove all active keywords
    files { -- added to all filters, later defines will be appended
        'crash_printer/' .. os_iden .. '.cpp', 'crash_printer/crash_printer/' .. os_iden .. '.hpp',
        -- helpers
        'helpers/common_helpers.cpp', 'helpers/common_helpers/**',
        'libs/utfcpp/**',
        -- test files
        'crash_printer/tests/test_linux_sa_sigaction.cpp',
    }
    removefiles {
        'post_build/**',
        'build/deps/**',
    }


    -- post build
    ---------
    filter {} -- reset the filter and remove all active keywords
    postbuildcommands {
        '%[%{!cfg.buildtarget.abspath}]',
    }
-- End test_crash_printer_sa_sigaction

end
-- End LINUX ONLY TARGETS

-- End Workspace
