# 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.25)

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(ZASM_BUILD_TESTS "" ${CMKR_ROOT_PROJECT})
option(ZASM_BUILD_BENCHMARKS "" ${CMKR_ROOT_PROJECT})
option(ZASM_BUILD_EXAMPLES "" ${CMKR_ROOT_PROJECT})

project(zasm
	LANGUAGES
		CXX
)

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

# Target: zasm_common
add_library(zasm_common INTERFACE)

add_library(zasm::common ALIAS zasm_common)
target_compile_features(zasm_common INTERFACE
	cxx_std_17
)

if(MSVC) # msvc
	target_compile_options(zasm_common INTERFACE
		"/bigobj"
		"/MP"
		"/W3"
		"/permissive-"
	)
endif()

# Target: zasm
set(zasm_SOURCES
	cmake.toml
	"zasm/include/zasm/base/immediate.hpp"
	"zasm/include/zasm/base/instruction.hpp"
	"zasm/include/zasm/base/label.hpp"
	"zasm/include/zasm/base/memory.hpp"
	"zasm/include/zasm/base/meta.hpp"
	"zasm/include/zasm/base/mode.hpp"
	"zasm/include/zasm/base/operand.hpp"
	"zasm/include/zasm/base/register.hpp"
	"zasm/include/zasm/core/bitsize.hpp"
	"zasm/include/zasm/core/enumflags.hpp"
	"zasm/include/zasm/core/errors.hpp"
	"zasm/include/zasm/core/expected.hpp"
	"zasm/include/zasm/core/filestream.hpp"
	"zasm/include/zasm/core/math.hpp"
	"zasm/include/zasm/core/memorystream.hpp"
	"zasm/include/zasm/core/objectpool.hpp"
	"zasm/include/zasm/core/packed.hpp"
	"zasm/include/zasm/core/stream.hpp"
	"zasm/include/zasm/core/stringpool.hpp"
	"zasm/include/zasm/core/strongtype.hpp"
	"zasm/include/zasm/decoder/decoder.hpp"
	"zasm/include/zasm/encoder/encoder.hpp"
	"zasm/include/zasm/formatter/formatter.hpp"
	"zasm/include/zasm/program/align.hpp"
	"zasm/include/zasm/program/data.hpp"
	"zasm/include/zasm/program/embeddedlabel.hpp"
	"zasm/include/zasm/program/instruction.hpp"
	"zasm/include/zasm/program/labeldata.hpp"
	"zasm/include/zasm/program/node.hpp"
	"zasm/include/zasm/program/observer.hpp"
	"zasm/include/zasm/program/program.hpp"
	"zasm/include/zasm/program/saverestore.hpp"
	"zasm/include/zasm/program/section.hpp"
	"zasm/include/zasm/program/sentinel.hpp"
	"zasm/include/zasm/serialization/serializer.hpp"
	"zasm/include/zasm/x86/assembler.hpp"
	"zasm/include/zasm/x86/emitter.hpp"
	"zasm/include/zasm/x86/memory.hpp"
	"zasm/include/zasm/x86/meta.hpp"
	"zasm/include/zasm/x86/mnemonic.hpp"
	"zasm/include/zasm/x86/register.hpp"
	"zasm/include/zasm/x86/x86.hpp"
	"zasm/include/zasm/zasm.hpp"
	"zasm/src/zasm/src/core/error.cpp"
	"zasm/src/zasm/src/core/filestream.cpp"
	"zasm/src/zasm/src/core/memorystream.cpp"
	"zasm/src/zasm/src/decoder/decoder.cpp"
	"zasm/src/zasm/src/encoder/encoder.context.hpp"
	"zasm/src/zasm/src/encoder/encoder.cpp"
	"zasm/src/zasm/src/formatter/formatter.cpp"
	"zasm/src/zasm/src/program/data.cpp"
	"zasm/src/zasm/src/program/instruction.cpp"
	"zasm/src/zasm/src/program/program.cpp"
	"zasm/src/zasm/src/program/program.node.hpp"
	"zasm/src/zasm/src/program/program.state.hpp"
	"zasm/src/zasm/src/program/register.cpp"
	"zasm/src/zasm/src/program/saverestore.cpp"
	"zasm/src/zasm/src/program/saverestore.load.cpp"
	"zasm/src/zasm/src/program/saverestore.save.cpp"
	"zasm/src/zasm/src/program/saverestorehelper.hpp"
	"zasm/src/zasm/src/program/saverestoretypes.hpp"
	"zasm/src/zasm/src/serialization/serializer.cpp"
	"zasm/src/zasm/src/x86/x86.assembler.cpp"
	"zasm/src/zasm/src/x86/x86.register.cpp"
	"zasm/src/zasm/src/zasm.cpp"
)

add_library(zasm STATIC)

target_sources(zasm PRIVATE ${zasm_SOURCES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_SOURCES})

add_library(zasm::zasm ALIAS zasm)
target_include_directories(zasm PUBLIC
	"zasm/include"
)

target_link_libraries(zasm PUBLIC
	zasm::common
	Zydis
)

# Target: zasm_testdata
if(ZASM_BUILD_TESTS) # build-tests
	add_library(zasm_testdata INTERFACE)

	add_library(zasm::testdata ALIAS zasm_testdata)
	target_include_directories(zasm_testdata INTERFACE
		"testdata/include"
	)

endif()
# Target: zasm_tests
if(ZASM_BUILD_TESTS) # build-tests
	set(zasm_tests_SOURCES
		cmake.toml
		"tests/src/main.cpp"
		"tests/src/tests/tests.assembler.cpp"
		"tests/src/tests/tests.decoder.cpp"
		"tests/src/tests/tests.enumflags.cpp"
		"tests/src/tests/tests.error.cpp"
		"tests/src/tests/tests.externals.cpp"
		"tests/src/tests/tests.formatter.cpp"
		"tests/src/tests/tests.imports.cpp"
		"tests/src/tests/tests.instruction.cpp"
		"tests/src/tests/tests.instructions.x64.cpp"
		"tests/src/tests/tests.instructionsinfo.x64.cpp"
		"tests/src/tests/tests.observer.cpp"
		"tests/src/tests/tests.packed.cpp"
		"tests/src/tests/tests.program.cpp"
		"tests/src/tests/tests.registers.cpp"
		"tests/src/tests/tests.relocation.cpp"
		"tests/src/tests/tests.saverestore.cpp"
		"tests/src/tests/tests.sections.cpp"
		"tests/src/tests/tests.segments.cpp"
		"tests/src/tests/tests.serialization.cpp"
		"tests/src/tests/tests.stringpool.cpp"
		"tests/src/testutils.cpp"
		"tests/src/testutils.hpp"
	)

	add_executable(zasm_tests)

	target_sources(zasm_tests PRIVATE ${zasm_tests_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_tests_SOURCES})

	target_link_libraries(zasm_tests PRIVATE
		zasm::common
		zasm::zasm
		zasm::testdata
		GTest::gtest
	)

	set_target_properties(zasm_tests PROPERTIES
		PROJECT_LABEL
			tests
	)

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

endif()
# Target: zasm_benchmarks
if(ZASM_BUILD_BENCHMARKS) # build-benchmarks
	set(zasm_benchmarks_SOURCES
		"benchmark/src/benchmarks/benchmark.assembler.cpp"
		"benchmark/src/benchmarks/benchmark.formatter.cpp"
		"benchmark/src/benchmarks/benchmark.instructioninfo.cpp"
		"benchmark/src/benchmarks/benchmark.serialization.cpp"
		"benchmark/src/benchmarks/benchmark.stringpool.cpp"
		"benchmark/src/main.cpp"
		cmake.toml
	)

	add_executable(zasm_benchmarks)

	target_sources(zasm_benchmarks PRIVATE ${zasm_benchmarks_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_benchmarks_SOURCES})

	target_link_libraries(zasm_benchmarks PRIVATE
		zasm::common
		zasm::zasm
		zasm::testdata
		benchmark::benchmark
	)

	set_target_properties(zasm_benchmarks PROPERTIES
		PROJECT_LABEL
			benchmarks
	)

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

endif()
# Target: zasm_example_common
if(ZASM_BUILD_EXAMPLES) # build-examples
	add_library(zasm_example_common INTERFACE)

	add_library(zasm::examples::common ALIAS zasm_example_common)
	target_include_directories(zasm_example_common INTERFACE
		"examples/common"
	)

	target_link_libraries(zasm_example_common INTERFACE
		zasm::common
		zasm::zasm
	)

endif()
# Target: zasm_example_assembler_basic
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_assembler_basic_SOURCES
		cmake.toml
		"examples/assembler_basic/main.cpp"
	)

	add_executable(zasm_example_assembler_basic)

	target_sources(zasm_example_assembler_basic PRIVATE ${zasm_example_assembler_basic_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_assembler_basic_SOURCES})

	target_link_libraries(zasm_example_assembler_basic PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_assembler_basic PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			assembler_basic
		RUNTIME_OUTPUT_NAME
			example.assembler_basic
	)

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

endif()
# Target: zasm_example_assembler_sections
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_assembler_sections_SOURCES
		cmake.toml
		"examples/assembler_sections/main.cpp"
	)

	add_executable(zasm_example_assembler_sections)

	target_sources(zasm_example_assembler_sections PRIVATE ${zasm_example_assembler_sections_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_assembler_sections_SOURCES})

	target_link_libraries(zasm_example_assembler_sections PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_assembler_sections PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			assembler_sections
		RUNTIME_OUTPUT_NAME
			example.assembler_sections
	)

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

endif()
# Target: zasm_example_decode_to_assembler
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_decode_to_assembler_SOURCES
		cmake.toml
		"examples/decode_to_assembler/main.cpp"
	)

	add_executable(zasm_example_decode_to_assembler)

	target_sources(zasm_example_decode_to_assembler PRIVATE ${zasm_example_decode_to_assembler_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_decode_to_assembler_SOURCES})

	target_link_libraries(zasm_example_decode_to_assembler PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_decode_to_assembler PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			decode_to_assembler
		RUNTIME_OUTPUT_NAME
			example.decode_to_assembler
	)

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

endif()
# Target: zasm_example_program_observer
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_program_observer_SOURCES
		cmake.toml
		"examples/program_observer/main.cpp"
	)

	add_executable(zasm_example_program_observer)

	target_sources(zasm_example_program_observer PRIVATE ${zasm_example_program_observer_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_program_observer_SOURCES})

	target_link_libraries(zasm_example_program_observer PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_program_observer PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			program_observer
		RUNTIME_OUTPUT_NAME
			example.program_observer
	)

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

endif()
# Target: zasm_example_instruction_info
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_instruction_info_SOURCES
		cmake.toml
		"examples/instruction_info/main.cpp"
	)

	add_executable(zasm_example_instruction_info)

	target_sources(zasm_example_instruction_info PRIVATE ${zasm_example_instruction_info_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_instruction_info_SOURCES})

	target_link_libraries(zasm_example_instruction_info PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_instruction_info PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			instruction_info
		RUNTIME_OUTPUT_NAME
			example.instruction_info
	)

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

endif()
# Target: zasm_example_modify_program
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_modify_program_SOURCES
		cmake.toml
		"examples/modify_program/main.cpp"
	)

	add_executable(zasm_example_modify_program)

	target_sources(zasm_example_modify_program PRIVATE ${zasm_example_modify_program_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_modify_program_SOURCES})

	target_link_libraries(zasm_example_modify_program PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_modify_program PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			modify_program
		RUNTIME_OUTPUT_NAME
			example.modify_program
	)

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

endif()
# Target: zasm_example_basic_jit
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_basic_jit_SOURCES
		cmake.toml
		"examples/basic_jit/main.cpp"
	)

	add_executable(zasm_example_basic_jit)

	target_sources(zasm_example_basic_jit PRIVATE ${zasm_example_basic_jit_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_basic_jit_SOURCES})

	target_link_libraries(zasm_example_basic_jit PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_basic_jit PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			basic_jit
		RUNTIME_OUTPUT_NAME
			example.basic_jit
	)

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

endif()
# Target: zasm_example_modify_instruction
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_modify_instruction_SOURCES
		cmake.toml
		"examples/modify_instruction/main.cpp"
	)

	add_executable(zasm_example_modify_instruction)

	target_sources(zasm_example_modify_instruction PRIVATE ${zasm_example_modify_instruction_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_modify_instruction_SOURCES})

	target_link_libraries(zasm_example_modify_instruction PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_modify_instruction PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			modify_instruction
		RUNTIME_OUTPUT_NAME
			example.modify_instruction
	)

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

endif()
# Target: zasm_example_memory_operands
if(ZASM_BUILD_EXAMPLES) # build-examples
	set(zasm_example_memory_operands_SOURCES
		cmake.toml
		"examples/memory_operands/main.cpp"
	)

	add_executable(zasm_example_memory_operands)

	target_sources(zasm_example_memory_operands PRIVATE ${zasm_example_memory_operands_SOURCES})
	source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zasm_example_memory_operands_SOURCES})

	target_link_libraries(zasm_example_memory_operands PRIVATE
		zasm::examples::common
	)

	set_target_properties(zasm_example_memory_operands PROPERTIES
		FOLDER
			examples
		PROJECT_LABEL
			memory_operands
		RUNTIME_OUTPUT_NAME
			example.memory_operands
	)

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

endif()
enable_testing()

if(ZASM_BUILD_TESTS) # build-tests
	add_test(
		NAME
			tests
		WORKING_DIRECTORY
			"${CMAKE_CURRENT_LIST_DIR}/"
		COMMAND
			"$<TARGET_FILE:zasm_tests>"
	)

endif()
