# This file is automatically generated from cmake.toml - DO NOT EDIT
# See https://github.com/build-cpp/cmkr for more information

cmake_minimum_required(VERSION 3.15)

if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
	message(FATAL_ERROR "In-tree builds are not supported. Run CMake from a separate directory: cmake -B build")
endif()

set(CMKR_ROOT_PROJECT OFF)
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
	set(CMKR_ROOT_PROJECT ON)

	# Bootstrap cmkr and automatically regenerate CMakeLists.txt
	include(cmkr.cmake OPTIONAL RESULT_VARIABLE CMKR_INCLUDE_RESULT)
	if(CMKR_INCLUDE_RESULT)
		cmkr()
	endif()

	# Enable folder support
	set_property(GLOBAL PROPERTY USE_FOLDERS ON)

	# Create a configure-time dependency on cmake.toml to improve IDE support
	configure_file(cmake.toml cmake.toml COPYONLY)
endif()

# Options
option(BUILD_TESTS "" OFF)

project(EagleVM
	LANGUAGES
		C
		CXX
		ASM_MASM
)

# Subdirectory: deps
set(CMKR_CMAKE_FOLDER ${CMAKE_FOLDER})
if(CMAKE_FOLDER)
	set(CMAKE_FOLDER "${CMAKE_FOLDER}/deps")
else()
	set(CMAKE_FOLDER deps)
endif()
add_subdirectory(deps)
set(CMAKE_FOLDER ${CMKR_CMAKE_FOLDER})

# Target: EagleVM
set(EagleVM_SOURCES
	"EagleVM/source/EagleVM.cpp"
	cmake.toml
)

add_executable(EagleVM)

target_sources(EagleVM PRIVATE ${EagleVM_SOURCES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${EagleVM_SOURCES})

target_compile_features(EagleVM PRIVATE
	cxx_std_23
)

target_include_directories(EagleVM PRIVATE
	"EagleVM/headers"
)

target_link_libraries(EagleVM PRIVATE
	EagleVMCore
)

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 EagleVM)
endif()

# Target: EagleVMCore
set(EagleVMCore_SOURCES
	"EagleVM.Core/source/codec/zydis_helper.cpp"
	"EagleVM.Core/source/compiler/code_container.cpp"
	"EagleVM.Core/source/compiler/code_label.cpp"
	"EagleVM.Core/source/compiler/section_manager.cpp"
	"EagleVM.Core/source/disassembler/analysis/liveness.cpp"
	"EagleVM.Core/source/disassembler/basic_block.cpp"
	"EagleVM.Core/source/disassembler/disassembler.cpp"
	"EagleVM.Core/source/obfuscation/mba/math/mba_math.cpp"
	"EagleVM.Core/source/obfuscation/mba/mba.cpp"
	"EagleVM.Core/source/obfuscation/mba/mba_gen.cpp"
	"EagleVM.Core/source/obfuscation/mba/variable/mba_const.cpp"
	"EagleVM.Core/source/obfuscation/mba/variable/mba_exp.cpp"
	"EagleVM.Core/source/obfuscation/mba/variable/mba_var.cpp"
	"EagleVM.Core/source/obfuscation/mba/variable/mba_xy.cpp"
	"EagleVM.Core/source/pe/packer/pe_packer.cpp"
	"EagleVM.Core/source/pe/pe_generator.cpp"
	"EagleVM.Core/source/util/random.cpp"
	"EagleVM.Core/source/virtual_machine/ir/block.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/base_command.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_branch.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_cf.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_context_load.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_context_store.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_exit.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_flags_load.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_handler_call.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_jmp.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_mem_read.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_mem_write.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_pop.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_push.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_resize.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_sx.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/cmd_x86_exec.cpp"
	"EagleVM.Core/source/virtual_machine/ir/commands/models/cmd_type.cpp"
	"EagleVM.Core/source/virtual_machine/ir/ir_translator.cpp"
	"EagleVM.Core/source/virtual_machine/ir/obfuscator/models/command_trie.cpp"
	"EagleVM.Core/source/virtual_machine/ir/obfuscator/obfuscator.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/base_handler_gen.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/base_x86_translator.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handle_data.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/add.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/and.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/dec.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/imul.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/inc.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/jcc.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/lea.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/mov.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/movsx.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/pop.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/push.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/shl.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/shr.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/sub.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/util/flags.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/handlers/xor.cpp"
	"EagleVM.Core/source/virtual_machine/ir/x86/util.cpp"
	"EagleVM.Core/source/virtual_machine/machines/base_machine.cpp"
	"EagleVM.Core/source/virtual_machine/machines/eagle/handler.cpp"
	"EagleVM.Core/source/virtual_machine/machines/eagle/loader.cpp"
	"EagleVM.Core/source/virtual_machine/machines/eagle/machine.cpp"
	"EagleVM.Core/source/virtual_machine/machines/eagle/register_manager.cpp"
	"EagleVM.Core/source/virtual_machine/machines/eagle/transition.cpp"
	"EagleVM.Core/source/virtual_machine/machines/register_context.cpp"
	"EagleVM.Core/headers/eaglevm-core/codec/zydis_defs.h"
	"EagleVM.Core/headers/eaglevm-core/codec/zydis_encoder.h"
	"EagleVM.Core/headers/eaglevm-core/codec/zydis_enum.h"
	"EagleVM.Core/headers/eaglevm-core/codec/zydis_helper.h"
	"EagleVM.Core/headers/eaglevm-core/compiler/code_container.h"
	"EagleVM.Core/headers/eaglevm-core/compiler/code_label.h"
	"EagleVM.Core/headers/eaglevm-core/compiler/section_manager.h"
	"EagleVM.Core/headers/eaglevm-core/disassembler/analysis/liveness.h"
	"EagleVM.Core/headers/eaglevm-core/disassembler/analysis/models/container.h"
	"EagleVM.Core/headers/eaglevm-core/disassembler/analysis/models/info.h"
	"EagleVM.Core/headers/eaglevm-core/disassembler/basic_block.h"
	"EagleVM.Core/headers/eaglevm-core/disassembler/disassembler.h"
	"EagleVM.Core/headers/eaglevm-core/disassembler/models/block_end_reason.h"
	"EagleVM.Core/headers/eaglevm-core/disassembler/models/block_jump_location.h"
	"EagleVM.Core/headers/eaglevm-core/obfuscation/block.h"
	"EagleVM.Core/headers/eaglevm-core/obfuscation/mba/math/mba_math.h"
	"EagleVM.Core/headers/eaglevm-core/obfuscation/mba/mba.h"
	"EagleVM.Core/headers/eaglevm-core/obfuscation/mba/mba_gen.h"
	"EagleVM.Core/headers/eaglevm-core/obfuscation/mba/variable/mba_const.h"
	"EagleVM.Core/headers/eaglevm-core/obfuscation/mba/variable/mba_exp.h"
	"EagleVM.Core/headers/eaglevm-core/obfuscation/mba/variable/mba_var.h"
	"EagleVM.Core/headers/eaglevm-core/obfuscation/mba/variable/mba_xy.h"
	"EagleVM.Core/headers/eaglevm-core/pe/models/code_view_pdb.h"
	"EagleVM.Core/headers/eaglevm-core/pe/models/stub.h"
	"EagleVM.Core/headers/eaglevm-core/pe/packer/pe_packer.h"
	"EagleVM.Core/headers/eaglevm-core/pe/pe_generator.h"
	"EagleVM.Core/headers/eaglevm-core/util/assert.h"
	"EagleVM.Core/headers/eaglevm-core/util/random.h"
	"EagleVM.Core/headers/eaglevm-core/util/util.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/block.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/block_builder.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/base_command.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_branch.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_cf.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_compare.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_context_load.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_context_rflags_load.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_context_rflags_store.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_context_store.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_flags_load.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_handler_call.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_jmp.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_logic.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_mem_read.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_mem_write.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_pop.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_push.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_resize.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_sx.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_vm_enter.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_vm_exit.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/cmd_x86_exec.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/include.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/models/branch_command.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/models/cmd_handler_signature.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/models/cmd_operand_signature.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/models/cmd_stack.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/commands/models/cmd_type.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/ir_translator.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/models/ir_block_action.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/models/ir_branch_info.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/models/ir_size.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/models/ir_store.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/obfuscator/models/command_trie.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/obfuscator/obfuscator.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/base_handler_gen.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/base_x86_translator.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handler_data.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handler_include.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/add.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/and.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/dec.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/imul.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/inc.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/jcc.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/lea.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/mov.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/movsx.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/pop.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/push.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/shl.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/shr.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/sub.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/util/flags.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/handlers/xor.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/models/flags.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/models/handler_build.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/models/handler_op.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/models/hash_string.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/models/lift_action.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/models/op_signature.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/ir/x86/util.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/base_machine.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/commands/cmd_ctx_regenerate.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/commands/cmd_ctx_shuffle.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/commands/cmd_ctx_swap.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/handler.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/loader.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/machine.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/obfuscation/avx_pass.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/register_manager.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/settings.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/eagle/util/hash.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/pidgeon/inst_handlers.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/pidgeon/inst_regs.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/pidgeon/machine.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/pidgeon/settings.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/register_context.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/machines/util.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/models/vm_op_action.h"
	"EagleVM.Core/headers/eaglevm-core/virtual_machine/models/vm_operand_sig.h"
	cmake.toml
)

add_library(EagleVMCore)

target_sources(EagleVMCore PRIVATE ${EagleVMCore_SOURCES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${EagleVMCore_SOURCES})

target_compile_features(EagleVMCore PUBLIC
	cxx_std_23
)

if(MSVC) # msvc
	target_compile_options(EagleVMCore PUBLIC
		"/MP"
		"/permissive-"
		"/sdl"
		"/W4"
		"/Zc:inline"
		"/Zc:wchar_t"
		"$<$<CONFIG:Debug>:/FC;/JMC>"
		"$<$<NOT:$<CONFIG:Debug>>:/Gy;/O1;/Os>"
	)
endif()

target_include_directories(EagleVMCore PUBLIC
	"EagleVM.Core/headers"
)

target_link_libraries(EagleVMCore PUBLIC
	Zydis
	linux-pe
)

if(MSVC) # msvc
	target_link_options(EagleVMCore PUBLIC
		"/INCREMENTAL:NO"
	)
endif()

# Target: EagleVMStub
set(EagleVMStub_SOURCES
	"EagleVM.Stub/EagleVMStub.cpp"
	"EagleVM.Stub/dllmain.cpp"
	"EagleVM.Stub/Headers/EagleVMStub/EagleVMStub.h"
	cmake.toml
)

add_library(EagleVMStub SHARED)

target_sources(EagleVMStub PRIVATE ${EagleVMStub_SOURCES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${EagleVMStub_SOURCES})

target_compile_features(EagleVMStub PUBLIC
	cxx_std_23
)

target_include_directories(EagleVMStub PUBLIC
	"EagleVM.Stub/Headers"
)

# Target: EagleVMSandbox
set(EagleVMSandbox_SOURCES
	"EagleVM.Sandbox/EagleVMSandbox.cpp"
	cmake.toml
)

add_executable(EagleVMSandbox)

target_sources(EagleVMSandbox PRIVATE ${EagleVMSandbox_SOURCES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${EagleVMSandbox_SOURCES})

target_compile_features(EagleVMSandbox PRIVATE
	cxx_std_23
)

target_link_libraries(EagleVMSandbox PRIVATE
	EagleVMStub
)

target_link_options(EagleVMSandbox PRIVATE
	"/DEBUG:FULL"
)

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 EagleVMSandbox)
endif()

# Target: EagleVMTests
set(EagleVMTests_SOURCES
	"EagleVM.Tests/source/main.cpp"
	"EagleVM.Tests/source/run_container.cpp"
	"EagleVM.Tests/source/util.cpp"
	"EagleVM.Tests/headers/run_container.h"
	"EagleVM.Tests/headers/util.h"
	cmake.toml
)

add_executable(EagleVMTests)

target_sources(EagleVMTests PRIVATE ${EagleVMTests_SOURCES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${EagleVMTests_SOURCES})

target_compile_features(EagleVMTests PRIVATE
	cxx_std_23
)

target_include_directories(EagleVMTests PRIVATE
	"EagleVM.Tests/headers"
)

target_link_libraries(EagleVMTests PRIVATE
	EagleVMCore
	nlohmann_json
	Zydis
	spdlog::spdlog
)

if(MSVC) # msvc
	target_link_options(EagleVMTests PRIVATE
		"/DYNAMICBASE:NO"
	)
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 EagleVMTests)
endif()

