# Copyright (c) 2026 Dominic Masters
#
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT

# duskscriptcc is a host tool: it compiles .ds script source into the .dsb
# bytecode the duskscript runtime loads. It links its own copies of the
# parse/compile sources plus the core sources shared with the runtime
# (../dusk/script/core), rather than joining ${DUSK_LIBRARY_TARGET_NAME}, so it
# builds as a plain native executable even when the main target is being
# cross compiled for a console.
add_executable(duskscriptcc
  main.c

  # dusk's own util/assert, compiled directly in (not linked against
  # ${DUSK_LIBRARY_TARGET_NAME}, which pulls in SDL2/OpenGL/etc) so this stays
  # a lean, headless host tool - see duskplatform.h in this directory.
  ${DUSK_SOURCES_DIR}/dusk/assert/assert.c
  ${DUSK_SOURCES_DIR}/dusk/util/memory.c
  ${DUSK_SOURCES_DIR}/dusk/util/string.c
  ${DUSK_SOURCES_DIR}/dusklinux/log/log.c

  parse/lexer/scriptlex.c
  parse/lexer/scriptlexadd.c
  parse/lexer/scriptlexkeyword.c
  parse/parser/scriptparse.c
  parse/parser/scriptparsedeclare.c
  parse/parser/scriptparseexpression.c
  parse/parser/scriptparseprimary.c
  parse/parser/scriptparsernode.c
  parse/parser/scriptparserstream.c
  parse/parser/scriptparsestatement.c
  parse/parser/scriptparseunary.c

  compile/builder/scriptbuilderemit.c
  compile/builder/scriptbuilderfunction.c
  compile/builder/scriptbuilderlabel.c
  compile/builder/scriptbuilderlocal.c
  compile/builder/scriptbuildernative.c
  compile/builder/scriptbuilderpeephole.c
  compile/builder/scriptbuilderstring.c
  compile/expression/scriptcompileassign.c
  compile/expression/scriptcompilecall.c
  compile/expression/scriptcompileinline.c
  compile/expression/scriptcompileexpr.c
  compile/expression/scriptcompileliteral.c
  compile/expression/scriptcompileoperator.c
  compile/expression/scriptcompilevalue.c
  compile/function/scriptcompilefunction.c
  compile/image/scriptcompileimage.c
  compile/scriptcompile.c
  compile/statement/scriptcompileloop.c
  compile/statement/scriptcompileloopcontext.c
  compile/statement/scriptcompilestatement.c
  compile/statement/scriptcompileswitch.c

    ../dusk/script/core/array/scriptarraycopy.c
    ../dusk/script/core/array/scriptarraydeep.c
    ../dusk/script/core/array/scriptarraymodify.c
    ../dusk/script/core/array/scriptarraynew.c
    ../dusk/script/core/array/scriptarraysort.c
    ../dusk/script/core/builtin/array/scriptbarraybasic.c
    ../dusk/script/core/builtin/array/scriptbarrayfunc.c
    ../dusk/script/core/builtin/array/scriptbarraymodify.c
    ../dusk/script/core/builtin/array/scriptbarrayorder.c
    ../dusk/script/core/builtin/array/scriptbarraysearch.c
    ../dusk/script/core/builtin/array/scriptbarrayslice.c
    ../dusk/script/core/builtin/core/scriptbconvert.c
    ../dusk/script/core/builtin/core/scriptbinclude.c
    ../dusk/script/core/builtin/core/scriptbprint.c
    ../dusk/script/core/builtin/core/scriptbpromise.c
    ../dusk/script/core/builtin/core/scriptbtype.c
    ../dusk/script/core/builtin/math/scriptbmathbasic.c
    ../dusk/script/core/builtin/math/scriptbmathrandom.c
    ../dusk/script/core/builtin/math/scriptbmathround.c
    ../dusk/script/core/builtin/math/scriptbmathtrig.c
    ../dusk/script/core/builtin/scriptarg.c
    ../dusk/script/core/builtin/scriptbuiltinregister.c
    ../dusk/script/core/builtin/scriptintrinsic.c
    ../dusk/script/core/builtin/scriptnativesig.c
    ../dusk/script/core/builtin/string/scriptbstringcase.c
    ../dusk/script/core/builtin/string/scriptbstringsearch.c
    ../dusk/script/core/builtin/string/scriptbstringsplit.c
    ../dusk/script/core/builtin/string/scriptbstringtrim.c
    ../dusk/script/core/bytecode/scriptbytecodesize.c
    ../dusk/script/core/bytecode/scriptvarint.c
    ../dusk/script/core/call/scriptcall.c
    ../dusk/script/core/coroutine/scriptcoroutineready.c
    ../dusk/script/core/coroutine/scriptcoroutinespawn.c
    ../dusk/script/core/coroutine/scriptframelocate.c
    ../dusk/script/core/coroutine/scriptscheduler.c
    ../dusk/script/core/coroutine/scriptsetposition.c
    ../dusk/script/core/coroutine/scriptstackcheck.c
    ../dusk/script/core/error/scriptraise.c
    ../dusk/script/core/error/scripttrace.c
    ../dusk/script/core/gc/scriptgccollect.c
    ../dusk/script/core/gc/scriptgcmark.c
    ../dusk/script/core/gc/scriptgcscan.c
    ../dusk/script/core/heap/scriptheapalloc.c
    ../dusk/script/core/heap/scriptheapblock.c
    ../dusk/script/core/heap/scriptheapfree.c
    ../dusk/script/core/heap/scriptheapinit.c
    ../dusk/script/core/heap/scriptheapsweep.c
    ../dusk/script/core/number/scriptnumberbinary.c
    ../dusk/script/core/number/scriptnumberformat.c
    ../dusk/script/core/number/scriptnumberparse.c
    ../dusk/script/core/number/scriptnumberunary.c
    ../dusk/script/core/ops/scriptbinaryop.c
    ../dusk/script/core/ops/scriptindex.c
    ../dusk/script/core/ops/scriptref.c
    ../dusk/script/core/promise/scriptpromiseawait.c
    ../dusk/script/core/promise/scriptpromisecombine.c
    ../dusk/script/core/promise/scriptpromisenew.c
    ../dusk/script/core/promise/scriptpromisesettle.c
    ../dusk/script/core/promise/scripttimer.c
    ../dusk/script/core/runtime/scriptruntimeconfig.c
    ../dusk/script/core/runtime/scriptruntimecreate.c
    ../dusk/script/core/runtime/scriptruntimeexecute.c
    ../dusk/script/core/runtime/scriptruntimeload.c
    ../dusk/script/core/runtime/scriptruntimerun.c
    ../dusk/script/core/scope/scriptscopefind.c
    ../dusk/script/core/scope/scriptscopenew.c
    ../dusk/script/core/scope/scriptscopeset.c
    ../dusk/script/core/scope/scriptvariable.c
    ../dusk/script/core/string/scriptbuf.c
    ../dusk/script/core/string/scriptstringchar.c
    ../dusk/script/core/string/scriptstringconcat.c
    ../dusk/script/core/string/scriptstringnew.c
    ../dusk/script/core/string/scriptstringreject.c
    ../dusk/script/core/string/scriptstringsearch.c
    ../dusk/script/core/struct/scriptstruct.c
    ../dusk/script/core/text/scripttext.c
    ../dusk/script/core/value/scriptalloc.c
    ../dusk/script/core/value/scriptfunction.c
    ../dusk/script/core/value/scriptvaluecompare.c
    ../dusk/script/core/value/scriptvalueformat.c
    ../dusk/script/core/value/scriptvalueprimitive.c
)

target_include_directories(duskscriptcc
  PRIVATE
    ${CMAKE_CURRENT_LIST_DIR}
    ${CMAKE_CURRENT_LIST_DIR}/parse
    ${CMAKE_CURRENT_LIST_DIR}/compile
    ${CMAKE_CURRENT_LIST_DIR}/../dusk/script/core
    ${DUSK_SOURCES_DIR}/dusk
)

# dusk.h needs cglm, already resolved once by src/dusk/CMakeLists.txt
if(NOT cglm_FOUND)
  find_package(cglm REQUIRED)
endif()

target_link_libraries(duskscriptcc PRIVATE m cglm)
