cmake_minimum_required(VERSION 3.8)
project(yara C)

if(MSVC)
  add_compile_options(/W3 /wd4005 /wd4996 /wd4018 -D_CRT_SECURE_NO_WARNINGS)
endif()


find_package(OpenSSL REQUIRED)
find_path(JANSSON_INCLUDE_DIR NAMES jansson.h)
find_library(JANSSON_LIBRARY NAMES jansson)


include_directories(
  .
  libyara
  libyara/include
)

set(PROC_PLATFORM_SOURCE "libyara/proc/none.c")
set(PROC_PLATFORM_INTERFACE "USE_NO_PROC")

if(APPLE AND CMAKE_SYSTEM_NAME MATCHES "Darwin")
  set(PROC_PLATFORM_SOURCE "libyara/proc/mach.c")
  set(PROC_PLATFORM_INTERFACE "USE_MACH_PROC")
elseif(WIN32 OR MINGW OR CYGWIN)
  set(PROC_PLATFORM_SOURCE "libyara/proc/windows.c")
  set(PROC_PLATFORM_INTERFACE "USE_WINDOWS_PROC")
elseif(UNIX AND CMAKE_SYSTEM_NAME MATCHES "Linux")
  set(THREADS_PREFER_PTHREAD_FLAG TRUE)
  set(PROC_PLATFORM_SOURCE "libyara/proc/linux.c")
  set(PROC_PLATFORM_INTERFACE "USE_LINUX_PROC")
endif()

set(
  libyara_sources
  libyara/ahocorasick.c
  libyara/arena.c
  libyara/atoms.c
  libyara/base64.c
  libyara/bitmask.c
  libyara/compiler.c
  libyara/endian.c
  libyara/exec.c
  libyara/exefiles.c
  libyara/filemap.c
  libyara/grammar.c
  libyara/hash.c
  libyara/hex_grammar.c
  libyara/hex_lexer.c
  libyara/lexer.c
  libyara/libyara.c
  libyara/mem.c
  libyara/modules.c
  libyara/modules/console/console.c
  libyara/modules/cuckoo/cuckoo.c
  libyara/modules/dotnet/dotnet.c
  libyara/modules/elf/elf.c
  libyara/modules/hash/hash.c
  libyara/modules/math/math.c
  libyara/modules/macho/macho.c
  libyara/modules/pe/pe.c
  libyara/modules/pe/pe_utils.c
  libyara/modules/tests/tests.c
  libyara/modules/time/time.c
  libyara/notebook.c
  libyara/object.c
  libyara/parser.c
  libyara/proc.c
  ${PROC_PLATFORM_SOURCE}  
  libyara/re.c
  libyara/re_grammar.c
  libyara/re_lexer.c
  libyara/rules.c
  libyara/scan.c
  libyara/scanner.c
  libyara/sizedstr.c
  libyara/stack.c
  libyara/stopwatch.c
  libyara/stream.c
  libyara/strutils.c
  libyara/threading.c
)

set(
  yara_sources
  cli/args.c
  cli/common.c
  cli/threading.c
  cli/yara.c
)
set( yarac_sources
  cli/args.c
  cli/common.c
  cli/yarac.c
)


find_package(Threads REQUIRED)

set(
  libyara_dependencies 
  OpenSSL::SSL
  OpenSSL::Crypto 
  Threads::Threads
  ${JANSSON_LIBRARY}
)

IF(CMAKE_SYSTEM_NAME MATCHES "Windows")
list(APPEND libyara_dependencies Crypt32.lib Ws2_32.lib)
endif()
if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
  list(APPEND libyara_dependencies m)
endif()

set(
  libyara_definitions
  -DHAVE_LIBCRYPTO
  -D${PROC_PLATFORM_INTERFACE}
  -DCUCKOO_MODULE
  -DHASH_MODULE
  -DDOTNET_MODULE
)

add_library(libyara ${libyara_sources})
target_link_libraries(libyara PRIVATE ${libyara_dependencies})
target_compile_definitions(libyara PRIVATE ${libyara_definitions})


add_executable(yara  ${yara_sources})
add_executable(yarac  ${yarac_sources})

target_link_libraries(yarac PRIVATE libyara ${libyara_dependencies})
target_link_libraries(yara PRIVATE libyara ${libyara_dependencies})

install(
  TARGETS libyara
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
)

if(NOT DISABLE_INSTALL_TOOLS)
  install (
    TARGETS yarac yara
    RUNTIME DESTINATION tools/yara
  )
endif()

if(NOT DISABLE_INSTALL_HEADERS)
  install(DIRECTORY libyara/include/ DESTINATION include)
endif()
