list(APPEND CPPFLAGS -DPERL_CORE -DI_TIME)
list(APPEND CFLAGS -std=gnu89)
# We want reproducible builds
list(APPEND CPPFLAGS -D__DATE__="XXX" -D__TIME__="XXX")
list(APPEND LDFLAGS -lm)
if(TARGET_OS STREQUAL "Darwin")
  # Necessary for iOS
  list(APPEND LDFLAGS -Xlinker -stack_size -Xlinker 0x8000000)
endif()

include_directories(${BENCHMARK_DIR}/src)

set(SourceNames
  av.c
  deb.c
  doio.c
  doop.c
  dump.c
  globals.c
  gv.c
  hv.c
  locale.c
  mg.c
  numeric.c
  op.c
  pad.c
  perl.c
  perlapi.c
  perlio.c
  perlmain.c
  perly.c
  pp.c
  pp_ctl.c
  pp_hot.c
  pp_pack.c
  pp_sort.c
  pp_sys.c
  regcomp.c
  regexec.c
  run.c
  scope.c
  sv.c
  taint.c
  toke.c
  universal.c
  utf8.c
  util.c
  xsutils.c
  Base64.c
  Cwd.c
  Dumper.c
  HiRes.c
  IO.c
  Peek.c
  attrs.c
  poll.c
  stdio.c
  DynaLoader.c
  MD5.c
  Storable.c
  Parser.c
  specrand.c
  Hostname.c
  Opcode.c
)
set(Source "")
foreach(FILENAME ${SourceNames})
  list(APPEND Source ${BENCHMARK_DIR}/src/${FILENAME})
endforeach()

macro(test_input run_type perlscript output)
  llvm_test_run(RUN_TYPE ${run_type}
    -I${CMAKE_CURRENT_BINARY_DIR}/data/all/input/lib ${perlscript}
    > ${CMAKE_CURRENT_BINARY_DIR}/${output}
    ${ARGN}
  )
  llvm_test_verify(RUN_TYPE ${run_type} WORKDIR ${CMAKE_CURRENT_BINARY_DIR}
    ${FPCMP} data/${run_type}/output/${output} ${output}
  )
endmacro()

# (Parameters come from the respective XXX.in files)
test_input(train
  diffmail.pl diffmail.2.550.15.24.23.100.out 2 550 15 24 23 100
  WORKDIR ${CMAKE_CURRENT_BINARY_DIR}/data/all/input
)
test_input(train
  perfect.pl perfect.b.3.out b 3
  WORKDIR ${CMAKE_CURRENT_BINARY_DIR}/data/train/input
)
test_input(train
  splitmail.pl splitmail.535.13.25.24.1091.out 535 13 25 24 1091
  WORKDIR ${CMAKE_CURRENT_BINARY_DIR}/data/all/input
)
test_input(train
  suns.pl suns.out
  WORKDIR ${CMAKE_CURRENT_BINARY_DIR}/data/train/input
)
llvm_test_verify(RUN_TYPE train WORKDIR ${CMAKE_CURRENT_BINARY_DIR}
  ${FPCMP} data/train/output/validate data/train/input/validate
)
#test_input(train scrabbl.pl scrabbl.in) # spec doesn't come with output files?

test_input(ref
  diffmail.pl diffmail.4.800.10.17.19.300.out 4 800 10 17 19 300
  WORKDIR ${CMAKE_CURRENT_BINARY_DIR}/data/all/input
)
test_input(ref
  splitmail.pl splitmail.1600.12.26.16.4500.out 1600 12 26 16 4500
  WORKDIR ${CMAKE_CURRENT_BINARY_DIR}/data/all/input
)
test_input(ref
  ${CMAKE_CURRENT_BINARY_DIR}/data/ref/input/checkspam.pl
  checkspam.2500.5.25.11.150.1.1.1.1.out
  2500 5 25 11 150 1 1 1 1
  WORKDIR ${CMAKE_CURRENT_BINARY_DIR}/data/all/input
)

file(GLOB inputs ${BENCHMARK_DIR}/data/test/input/*.t)
foreach(input ${inputs})
  get_filename_component(basename ${input} NAME_WE)
  test_input(test
    ${basename}.t ${basename}.out
    WORKDIR ${CMAKE_CURRENT_BINARY_DIR}/data/test/input
  )
endforeach()

llvm_test_executable(400.perlbench ${Source})
llvm_test_data_spec(400.perlbench MUST_COPY data)
