cmake_minimum_required(VERSION 3.20)
project(amduat LANGUAGES C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

set(AMDUAT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
set(AMDUAT_INCLUDE_DIR ${AMDUAT_ROOT}/include)
set(AMDUAT_INTERNAL_DIR ${AMDUAT_ROOT}/src/internal)

function(amduat_add_lib name)
  set(options)
  set(oneValueArgs)
  set(multiValueArgs SRCS)
  cmake_parse_arguments(AMDUAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

  if ("${AMDUAT_SRCS}" STREQUAL "")
    message(FATAL_ERROR "amduat_add_lib(${name}) requires SRCS")
  endif()

  add_library(amduat_${name}_obj OBJECT ${AMDUAT_SRCS})
  target_include_directories(amduat_${name}_obj
    PRIVATE ${AMDUAT_INTERNAL_DIR}
    PUBLIC ${AMDUAT_INCLUDE_DIR}
  )

  add_library(amduat_${name} STATIC $<TARGET_OBJECTS:amduat_${name}_obj>)
  add_library(amduat_${name}_shared SHARED $<TARGET_OBJECTS:amduat_${name}_obj>)

  set_target_properties(amduat_${name} PROPERTIES OUTPUT_NAME amduat_${name})
  set_target_properties(amduat_${name}_shared PROPERTIES OUTPUT_NAME amduat_${name})

  target_include_directories(amduat_${name}
    PRIVATE ${AMDUAT_INTERNAL_DIR}
    PUBLIC ${AMDUAT_INCLUDE_DIR}
  )
  target_include_directories(amduat_${name}_shared
    PRIVATE ${AMDUAT_INTERNAL_DIR}
    PUBLIC ${AMDUAT_INCLUDE_DIR}
  )
endfunction()

function(amduat_link name)
  if (ARGC LESS 2)
    return()
  endif()

  target_link_libraries(amduat_${name} PUBLIC ${ARGN})
  target_link_libraries(amduat_${name}_shared PUBLIC ${ARGN})
endfunction()

set(AMDUAT_UTIL_SRCS
  src/internal/buf.c
  src/internal/arena.c
  src/internal/varint.c
  src/internal/endian.c
  src/internal/hex.c
  src/internal/log.c
  src/internal/string.c
)

set(AMDUAT_ASL_SRCS
  src/kernel/asl/core.c
  src/near_core/asl/collection_view.c
  src/near_core/asl/none.c
  src/near_core/asl/artifact_io.c
  src/near_core/asl/io.c
  src/near_core/asl/index_accel.c
  src/near_core/asl/index_bloom.c
  src/near_core/asl/index_snapshot.c
  src/near_core/asl/index_replay.c
  src/near_core/asl/log_cursor.c
  src/near_core/asl/parse.c
  src/near_core/asl/projection_checkpoint.c
  src/near_core/asl/ref_io.c
  src/near_core/asl/store.c
  src/near_core/asl/ref_text.c
  src/near_core/asl/registry.c
)

set(AMDUAT_ASL_LOG_STORE_SRCS
  src/core/asl_log_store.c
)

set(AMDUAT_ASL_RECORD_SRCS
  src/core/asl_record.c
)

set(AMDUAT_ASL_COLLECTION_SRCS
  src/core/asl_collection.c
)

set(AMDUAT_HASH_ASL1_SRCS
  src/near_core/hash/asl1.c
  src/near_core/hash/sha256.c
)

set(AMDUAT_ENC_SRCS
  src/near_core/enc/asl1_core.c
  src/near_core/enc/asl1_core_codec.c
  src/near_core/asl/ref_derive.c
  src/near_core/enc/fer1_receipt.c
  src/near_core/fer/receipt.c
  src/near_core/enc/asl_log.c
  src/near_core/enc/asl_core_index.c
  src/near_core/enc/asl_tgk_exec_plan.c
  src/near_core/enc/pel_program_dag.c
  src/near_core/enc/pel_program_dag_desc.c
  src/near_core/enc/pel_trace_dag.c
  src/near_core/enc/pel1_result.c
  src/near_core/enc/tgk1_edge.c
)

set(AMDUAT_FORMAT_SRCS
  src/near_core/format/json.c
  src/near_core/format/opreg_util.c
  src/near_core/format/parse.c
  src/near_core/format/ref.c
  src/near_core/format/pel.c
)

set(AMDUAT_PEL_SRCS
  src/kernel/pel/core.c
  src/core/derivation_sid.c
  src/pel_stack/decode.c
  src/pel_stack/surf/surf.c
  src/pel_stack/program_dag/program_dag.c
  src/pel_stack/program_dag/program_dag_desc.c
  src/pel_stack/run.c
  src/pel_stack/trace_dag/trace_dag.c
  src/pel_stack/queue/queue.c
  src/pel_stack/opreg/kernel.c
  src/pel_stack/opreg/kernel_collection.c
  src/pel_stack/opreg/kernel_params.c
)

set(AMDUAT_TGK_SRCS
  src/kernel/tgk/core.c
  src/tgk_stack/store/store.c
  src/tgk_stack/prov/prov.c
)

set(AMDUAT_FED_SRCS
  src/near_core/fed/registry.c
  src/near_core/fed/replay.c
  src/near_core/fed/ingest.c
  src/near_core/fed/view.c
)

set(AMDUAT_ASL_STORE_FS_SRCS
  src/adapters/asl_store_fs/asl_store_fs.c
  src/adapters/asl_store_fs/asl_store_fs_layout.c
  src/adapters/asl_store_fs/asl_store_fs_meta.c
)

set(AMDUAT_ASL_STORE_INDEX_FS_SRCS
  src/adapters/asl_store_index_fs/asl_store_index_fs.c
  src/adapters/asl_store_index_fs/asl_store_index_fs_layout.c
)

set(AMDUAT_ASL_STORE_MINIO_SRCS
  src/adapters/asl_store_minio/asl_store_minio.c
  src/adapters/asl_store_minio/s3_sigv4.c
)

set(AMDUAT_ASL_DERIVATION_INDEX_FS_SRCS
  src/adapters/asl_derivation_index_fs/asl_derivation_index_fs.c
)

set(AMDUAT_ASL_MATERIALIZATION_CACHE_FS_SRCS
  src/adapters/asl_materialization_cache_fs/asl_materialization_cache_fs.c
)

set(AMDUAT_ASL_POINTER_FS_SRCS
  src/adapters/asl_pointer_fs/asl_pointer_fs.c
)

set(AMDUAT_TGK_STORE_MEM_SRCS
  src/adapters/tgk_store_mem/tgk_store_mem.c
)

set(AMDUAT_TGK_STORE_FS_SRCS
  src/adapters/tgk_store_fs/tgk_store_fs.c
)

set(AMDUAT_TGK_STORE_ASL_INDEX_FS_SRCS
  src/adapters/tgk_store_asl_index_fs/tgk_store_asl_index_fs.c
)

amduat_add_lib(util SRCS ${AMDUAT_UTIL_SRCS})

amduat_add_lib(asl SRCS ${AMDUAT_ASL_SRCS})
amduat_link(asl amduat_util)

amduat_add_lib(hash_asl1 SRCS ${AMDUAT_HASH_ASL1_SRCS})
amduat_link(hash_asl1 amduat_asl amduat_util)

amduat_add_lib(enc SRCS ${AMDUAT_ENC_SRCS})
amduat_link(enc amduat_asl amduat_hash_asl1 amduat_util)

amduat_add_lib(format SRCS ${AMDUAT_FORMAT_SRCS})
amduat_link(format amduat_asl amduat_enc amduat_util)

amduat_add_lib(pel SRCS ${AMDUAT_PEL_SRCS})
amduat_link(pel amduat_asl_materialization_cache_fs amduat_asl_collection
  amduat_asl amduat_enc amduat_hash_asl1 amduat_util)

amduat_add_lib(tgk SRCS ${AMDUAT_TGK_SRCS})
amduat_link(tgk amduat_asl amduat_enc amduat_hash_asl1 amduat_util)

amduat_add_lib(fed SRCS ${AMDUAT_FED_SRCS})
amduat_link(fed amduat_asl)

amduat_add_lib(asl_store_fs SRCS ${AMDUAT_ASL_STORE_FS_SRCS})
amduat_link(asl_store_fs amduat_asl amduat_enc amduat_hash_asl1 amduat_util)
target_compile_definitions(amduat_asl_store_fs_obj PRIVATE _POSIX_C_SOURCE=200809L)

amduat_add_lib(asl_store_index_fs SRCS ${AMDUAT_ASL_STORE_INDEX_FS_SRCS})
amduat_link(asl_store_index_fs amduat_asl amduat_enc amduat_hash_asl1 amduat_util)
target_compile_definitions(amduat_asl_store_index_fs_obj PRIVATE _POSIX_C_SOURCE=200809L)

amduat_add_lib(asl_store_minio SRCS ${AMDUAT_ASL_STORE_MINIO_SRCS})
amduat_link(asl_store_minio amduat_asl amduat_enc amduat_hash_asl1 amduat_util)
target_compile_definitions(amduat_asl_store_minio_obj PRIVATE _POSIX_C_SOURCE=200809L)

amduat_add_lib(asl_derivation_index_fs SRCS ${AMDUAT_ASL_DERIVATION_INDEX_FS_SRCS})
amduat_link(asl_derivation_index_fs amduat_asl amduat_enc amduat_hash_asl1 amduat_util)
target_compile_definitions(amduat_asl_derivation_index_fs_obj PRIVATE _POSIX_C_SOURCE=200809L)

amduat_add_lib(asl_materialization_cache_fs SRCS ${AMDUAT_ASL_MATERIALIZATION_CACHE_FS_SRCS})
amduat_link(asl_materialization_cache_fs amduat_asl amduat_enc amduat_hash_asl1 amduat_util)
target_compile_definitions(amduat_asl_materialization_cache_fs_obj PRIVATE _POSIX_C_SOURCE=200809L)

amduat_add_lib(asl_pointer_fs SRCS ${AMDUAT_ASL_POINTER_FS_SRCS})
amduat_link(asl_pointer_fs amduat_asl amduat_enc amduat_hash_asl1 amduat_util)
target_compile_definitions(amduat_asl_pointer_fs_obj PRIVATE _POSIX_C_SOURCE=200809L)

amduat_add_lib(asl_log_store SRCS ${AMDUAT_ASL_LOG_STORE_SRCS})
amduat_link(asl_log_store amduat_asl_pointer_fs amduat_asl amduat_enc amduat_util)

amduat_add_lib(asl_record SRCS ${AMDUAT_ASL_RECORD_SRCS})
amduat_link(asl_record amduat_asl amduat_enc amduat_util)

amduat_add_lib(asl_collection SRCS ${AMDUAT_ASL_COLLECTION_SRCS})
amduat_link(asl_collection amduat_asl_log_store amduat_asl_record amduat_asl_pointer_fs
  amduat_asl amduat_enc amduat_util)
amduat_add_lib(tgk_store_mem SRCS ${AMDUAT_TGK_STORE_MEM_SRCS})
amduat_link(tgk_store_mem amduat_tgk amduat_asl amduat_enc amduat_hash_asl1 amduat_util)

amduat_add_lib(tgk_store_fs SRCS ${AMDUAT_TGK_STORE_FS_SRCS})
amduat_link(tgk_store_fs amduat_tgk_store_mem amduat_tgk amduat_asl_store_fs amduat_asl amduat_enc amduat_hash_asl1 amduat_util)

amduat_add_lib(tgk_store_asl_index_fs SRCS ${AMDUAT_TGK_STORE_ASL_INDEX_FS_SRCS})
target_include_directories(amduat_tgk_store_asl_index_fs_obj
  PRIVATE ${AMDUAT_ROOT}/src/adapters/asl_store_index_fs
)
amduat_link(tgk_store_asl_index_fs amduat_tgk amduat_asl_store_index_fs amduat_asl amduat_enc amduat_hash_asl1 amduat_util)

add_executable(amduat_asl_cli src/tools/amduat_asl_cli.c)
target_include_directories(amduat_asl_cli
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_asl_cli
  PRIVATE amduat_format amduat_asl_store_fs amduat_asl_store_index_fs
          amduat_asl_derivation_index_fs amduat_asl amduat_enc
          amduat_hash_asl1 amduat_util
)
set_target_properties(amduat_asl_cli PROPERTIES OUTPUT_NAME amduat-asl)

add_executable(amduat_pel_seed src/tools/amduat_pel_seed.c)
target_include_directories(amduat_pel_seed
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_pel_seed
  PRIVATE amduat_pel amduat_format amduat_asl_store_fs amduat_asl amduat_enc
          amduat_hash_asl1 amduat_util
)
set_target_properties(amduat_pel_seed PROPERTIES OUTPUT_NAME amduat-pel-seed)

add_executable(amduat_pel_run src/tools/amduat_pel_run.c)
target_include_directories(amduat_pel_run
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_pel_run
  PRIVATE amduat_pel amduat_asl_store_fs amduat_asl amduat_enc
          amduat_hash_asl1 amduat_util
)
set_target_properties(amduat_pel_run PROPERTIES OUTPUT_NAME amduat-pel-run)

add_executable(amduat_pel_cli src/tools/amduat_pel_cli.c)
target_include_directories(amduat_pel_cli
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_pel_cli
  PRIVATE amduat_format amduat_pel amduat_asl_store_fs
          amduat_asl_collection amduat_asl_record amduat_asl_log_store
          amduat_asl_pointer_fs
          amduat_asl_derivation_index_fs amduat_asl amduat_enc
          amduat_hash_asl1 amduat_util
)
set_target_properties(amduat_pel_cli PROPERTIES OUTPUT_NAME amduat-pel)

add_executable(amduat_pel_build src/tools/amduat_pel_build.c)
target_include_directories(amduat_pel_build
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_pel_build
  PRIVATE amduat_pel amduat_asl_store_fs amduat_asl amduat_enc amduat_util
)
set_target_properties(amduat_pel_build PROPERTIES OUTPUT_NAME amduat-pel-build)

add_executable(amduat_scriptlab_adapter src/tools/amduat_scriptlab_adapter.c)
target_include_directories(amduat_scriptlab_adapter
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_compile_definitions(amduat_scriptlab_adapter
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_scriptlab_adapter
  PRIVATE amduat_tgk_store_asl_index_fs amduat_asl_store_index_fs
          amduat_asl_collection amduat_asl_record amduat_asl_derivation_index_fs
          amduat_pel amduat_tgk amduat_asl amduat_enc amduat_hash_asl1
          amduat_util pthread
)
set_target_properties(amduat_scriptlab_adapter
  PROPERTIES OUTPUT_NAME amduat-scriptlab-adapter)

add_executable(amduat_conformance_run
  src/tools/amduat_conformance_run.c
  tests/conformance/asl_store/asl_store_conformance.c
  tests/conformance/tgk_store/tgk_store_conformance.c
)
target_include_directories(amduat_conformance_run
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
  PRIVATE ${AMDUAT_ROOT}
  PRIVATE ${AMDUAT_ROOT}/tests/conformance/asl_store
  PRIVATE ${AMDUAT_ROOT}/tests/conformance/tgk_store
)
target_link_libraries(amduat_conformance_run
  PRIVATE amduat_asl_store_fs amduat_asl_store_index_fs
          amduat_asl_store_minio
          amduat_tgk_store_mem amduat_tgk_store_fs amduat_tgk_store_asl_index_fs
          amduat_tgk amduat_asl amduat_enc amduat_hash_asl1 amduat_util
          amduat_format
)

enable_testing()

add_executable(amduat_test_pel_program_dag tests/enc/test_pel_program_dag.c)
target_include_directories(amduat_test_pel_program_dag
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel_program_dag
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME pel_program_dag COMMAND amduat_test_pel_program_dag)

add_executable(amduat_test_pel_trace_dag tests/enc/test_pel_trace_dag.c)
target_include_directories(amduat_test_pel_trace_dag
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel_trace_dag
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME pel_trace_dag COMMAND amduat_test_pel_trace_dag)

add_executable(amduat_test_pel_program_build_concat
  tests/pel/test_pel_program_build_concat.c
)
target_include_directories(amduat_test_pel_program_build_concat
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel_program_build_concat
  PRIVATE amduat_pel amduat_asl_store_fs amduat_asl amduat_enc
          amduat_hash_asl1 amduat_util
)
add_test(NAME pel_program_build_concat COMMAND amduat_test_pel_program_build_concat)

add_executable(amduat_test_pel1_result tests/enc/test_pel1_result.c)
target_include_directories(amduat_test_pel1_result
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel1_result
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME pel1_result COMMAND amduat_test_pel1_result)

add_executable(amduat_test_pel1_result_invariants
  tests/enc/test_pel1_result_invariants.c)
target_include_directories(amduat_test_pel1_result_invariants
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel1_result_invariants
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME pel1_result_invariants
  COMMAND amduat_test_pel1_result_invariants)

add_executable(amduat_test_asl_log tests/enc/test_asl_log.c)
target_include_directories(amduat_test_asl_log
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_asl_log
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME asl_log COMMAND amduat_test_asl_log)

add_executable(amduat_test_asl_core_index tests/enc/test_asl_core_index.c)
target_include_directories(amduat_test_asl_core_index
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_asl_core_index
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME asl_core_index COMMAND amduat_test_asl_core_index)

add_executable(amduat_test_asl_tgk_exec_plan
  tests/enc/test_asl_tgk_exec_plan.c)
target_include_directories(amduat_test_asl_tgk_exec_plan
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_asl_tgk_exec_plan
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME asl_tgk_exec_plan COMMAND amduat_test_asl_tgk_exec_plan)

add_executable(amduat_test_tgk1_edge tests/enc/test_tgk1_edge.c)
target_include_directories(amduat_test_tgk1_edge
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_tgk1_edge
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME tgk1_edge COMMAND amduat_test_tgk1_edge)

add_executable(amduat_test_fer1_receipt tests/enc/test_fer1_receipt.c)
target_include_directories(amduat_test_fer1_receipt
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_fer1_receipt
  PRIVATE amduat_enc amduat_hash_asl1 amduat_asl amduat_util
)
add_test(NAME fer1_receipt COMMAND amduat_test_fer1_receipt)

add_executable(amduat_test_tgk_store_mem tests/tgk/test_tgk_store_mem.c)
target_include_directories(amduat_test_tgk_store_mem
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_tgk_store_mem
  PRIVATE amduat_tgk_store_mem
)
add_test(NAME tgk_store_mem COMMAND amduat_test_tgk_store_mem)

add_executable(amduat_test_tgk_store_fs tests/tgk/test_tgk_store_fs.c)
target_include_directories(amduat_test_tgk_store_fs
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_compile_definitions(amduat_test_tgk_store_fs
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_tgk_store_fs
  PRIVATE amduat_tgk_store_fs
)
add_test(NAME tgk_store_fs COMMAND amduat_test_tgk_store_fs)

add_executable(amduat_test_tgk_prov tests/tgk/test_tgk_prov.c)
target_include_directories(amduat_test_tgk_prov
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_tgk_prov
  PRIVATE amduat_tgk_store_mem
)
add_test(NAME tgk_prov COMMAND amduat_test_tgk_prov)

add_executable(amduat_test_asl_ref_derive tests/asl/test_asl_ref_derive.c)
target_include_directories(amduat_test_asl_ref_derive
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_asl_ref_derive
  PRIVATE amduat_enc
)
add_test(NAME asl_ref_derive COMMAND amduat_test_asl_ref_derive)

add_executable(amduat_test_asl_store_indexed_ops
  tests/asl/test_asl_store_indexed_ops.c)
target_include_directories(amduat_test_asl_store_indexed_ops
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_asl_store_indexed_ops
  PRIVATE amduat_asl
)
add_test(NAME asl_store_indexed_ops COMMAND amduat_test_asl_store_indexed_ops)

add_executable(amduat_test_asl_replay tests/asl/test_asl_replay.c)
target_include_directories(amduat_test_asl_replay
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_asl_replay
  PRIVATE amduat_asl
)
add_test(NAME asl_replay COMMAND amduat_test_asl_replay)

add_executable(amduat_test_asl_index_replay
  tests/asl/test_asl_index_replay.c)
target_include_directories(amduat_test_asl_index_replay
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
  PRIVATE ${AMDUAT_ROOT}/src/adapters/asl_store_index_fs
)
target_compile_definitions(amduat_test_asl_index_replay
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_asl_index_replay
  PRIVATE amduat_asl_store_index_fs
)
add_test(NAME asl_index_replay COMMAND amduat_test_asl_index_replay)

add_executable(amduat_test_asl_store_index_fs
  tests/asl/test_asl_store_index_fs.c)
target_include_directories(amduat_test_asl_store_index_fs
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_compile_definitions(amduat_test_asl_store_index_fs
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_asl_store_index_fs
  PRIVATE amduat_asl_store_index_fs amduat_format pthread
)
add_test(NAME asl_store_index_fs COMMAND amduat_test_asl_store_index_fs)
set_tests_properties(asl_store_index_fs PROPERTIES
  ENVIRONMENT "AMDUAT_ASL_PERF_COUNT=100;AMDUAT_ASL_STRESS_SECS=5"
  TIMEOUT 120
)

add_executable(amduat_test_asl_log_store_index_fs
  tests/asl/test_asl_log_store_index_fs.c)
target_include_directories(amduat_test_asl_log_store_index_fs
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_compile_definitions(amduat_test_asl_log_store_index_fs
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_asl_log_store_index_fs
  PRIVATE amduat_asl_log_store amduat_asl_store_index_fs amduat_format pthread
)
add_test(NAME asl_log_store_index_fs COMMAND amduat_test_asl_log_store_index_fs)
set_tests_properties(asl_log_store_index_fs PROPERTIES TIMEOUT 30)

add_executable(amduat_test_asl_index_put_get_consistency
  tests/asl/test_asl_index_put_get_consistency.c)
target_include_directories(amduat_test_asl_index_put_get_consistency
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_compile_definitions(amduat_test_asl_index_put_get_consistency
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_asl_index_put_get_consistency
  PRIVATE amduat_asl_store_index_fs amduat_format pthread
)
add_test(NAME asl_index_put_get_consistency
  COMMAND amduat_test_asl_index_put_get_consistency)

add_executable(amduat_test_asl_index_accel tests/asl/test_asl_index_accel.c)
target_include_directories(amduat_test_asl_index_accel
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_asl_index_accel
  PRIVATE amduat_asl amduat_hash_asl1 amduat_util
)
add_test(NAME asl_index_accel COMMAND amduat_test_asl_index_accel)

add_executable(amduat_test_asl_derivation_index_fs
  tests/asl/test_asl_derivation_index_fs.c)
target_include_directories(amduat_test_asl_derivation_index_fs
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_compile_definitions(amduat_test_asl_derivation_index_fs
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_asl_derivation_index_fs
  PRIVATE amduat_asl_derivation_index_fs
)
add_test(NAME asl_derivation_index_fs
  COMMAND amduat_test_asl_derivation_index_fs)

add_executable(amduat_test_asl_store_conformance
  tests/conformance/asl_store/test_asl_store_conformance.c
  tests/conformance/asl_store/asl_store_conformance.c
)
target_include_directories(amduat_test_asl_store_conformance
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
  PRIVATE ${AMDUAT_ROOT}
  PRIVATE ${AMDUAT_ROOT}/tests/conformance/asl_store
)
target_compile_definitions(amduat_test_asl_store_conformance
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_asl_store_conformance
  PRIVATE amduat_asl_store_fs amduat_asl_store_index_fs
          amduat_asl_store_minio
          amduat_asl amduat_enc amduat_hash_asl1 amduat_util
)
add_test(NAME asl_store_conformance
  COMMAND amduat_test_asl_store_conformance
)

add_executable(amduat_test_tgk_store_conformance
  tests/conformance/tgk_store/test_tgk_store_conformance.c
  tests/conformance/tgk_store/tgk_store_conformance.c
)
target_include_directories(amduat_test_tgk_store_conformance
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
  PRIVATE ${AMDUAT_ROOT}
  PRIVATE ${AMDUAT_ROOT}/tests/conformance/tgk_store
)
target_compile_definitions(amduat_test_tgk_store_conformance
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_tgk_store_conformance
  PRIVATE amduat_tgk_store_mem amduat_tgk_store_fs amduat_tgk_store_asl_index_fs
          amduat_asl_store_fs amduat_asl_store_index_fs amduat_tgk amduat_asl
          amduat_enc amduat_hash_asl1 amduat_util amduat_format
)
add_test(NAME tgk_store_conformance
  COMMAND amduat_test_tgk_store_conformance
)

add_executable(amduat_test_pel_program_dag_exec
  tests/pel/test_pel_program_dag_exec.c)
target_include_directories(amduat_test_pel_program_dag_exec
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel_program_dag_exec
  PRIVATE amduat_pel amduat_asl_store_fs
)
add_test(NAME pel_program_dag_exec COMMAND amduat_test_pel_program_dag_exec)

add_executable(amduat_test_pel_program_dag_encode
  tests/pel/test_pel_program_dag_encode.c)
target_include_directories(amduat_test_pel_program_dag_encode
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel_program_dag_encode
  PRIVATE amduat_enc
)
add_test(NAME pel_program_dag_encode COMMAND amduat_test_pel_program_dag_encode)

add_executable(amduat_test_pel_program_dag_desc
  tests/pel/test_pel_program_dag_desc.c)
target_include_directories(amduat_test_pel_program_dag_desc
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel_program_dag_desc
  PRIVATE amduat_enc
)
add_test(NAME pel_program_dag_desc COMMAND amduat_test_pel_program_dag_desc)

add_executable(amduat_test_pel_surf_run tests/pel/test_pel_surf_run.c)
target_include_directories(amduat_test_pel_surf_run
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_pel_surf_run
  PRIVATE amduat_pel amduat_asl_store_fs
)
add_test(NAME pel_surf_run COMMAND amduat_test_pel_surf_run)

add_executable(amduat_test_pel_queue tests/pel/test_pel_queue.c)
target_include_directories(amduat_test_pel_queue
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_compile_definitions(amduat_test_pel_queue
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_pel_queue
  PRIVATE amduat_pel
)
add_test(NAME pel_queue COMMAND amduat_test_pel_queue)

add_executable(amduat_test_fed_registry tests/fed/test_fed_registry.c)
target_include_directories(amduat_test_fed_registry
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_fed_registry
  PRIVATE amduat_fed
)
add_test(NAME fed_registry COMMAND amduat_test_fed_registry)

add_executable(amduat_test_fed_replay tests/fed/test_fed_replay.c)
target_include_directories(amduat_test_fed_replay
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_fed_replay
  PRIVATE amduat_fed
)
add_test(NAME fed_replay COMMAND amduat_test_fed_replay)

add_executable(amduat_test_fed_ingest tests/fed/test_fed_ingest.c)
target_include_directories(amduat_test_fed_ingest
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_fed_ingest
  PRIVATE amduat_fed
)
add_test(NAME fed_ingest COMMAND amduat_test_fed_ingest)

add_executable(amduat_test_fed_view tests/fed/test_fed_view.c)
target_include_directories(amduat_test_fed_view
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_link_libraries(amduat_test_fed_view
  PRIVATE amduat_fed
)
add_test(NAME fed_view COMMAND amduat_test_fed_view)

add_executable(amduat_test_scriptlab_adapter
  tests/substrate/test_scriptlab_adapter.c)
target_include_directories(amduat_test_scriptlab_adapter
  PRIVATE ${AMDUAT_INTERNAL_DIR}
  PRIVATE ${AMDUAT_INCLUDE_DIR}
)
target_compile_definitions(amduat_test_scriptlab_adapter
  PRIVATE _POSIX_C_SOURCE=200809L
)
target_link_libraries(amduat_test_scriptlab_adapter
  PRIVATE amduat_tgk_store_asl_index_fs amduat_asl_store_index_fs
          amduat_asl_collection amduat_asl_record amduat_asl_derivation_index_fs
          amduat_pel amduat_tgk amduat_asl amduat_enc amduat_hash_asl1
          amduat_util pthread
)
add_test(NAME scriptlab_adapter COMMAND amduat_test_scriptlab_adapter)
