cmake_minimum_required(VERSION 3.5.1)
project(libctemplate C CXX)

# find_package(PythonInterp)
if(NOT PYTHON_EXECUTABLE)
  message(FATAL_ERROR "PYTHON_EXECUTABLE must be set")
endif()

if(MSVC)
  add_compile_options(/W3 /wd4005 /wd4996 /wd4018 -D_CRT_SECURE_NO_WARNINGS)
  add_definitions(-D_VARIADIC_MAX=10)
endif()

set(SOURCE_PATH ${PROJECT_SOURCE_DIR}/src)
set(BASE_SOURCE_PATH ${SOURCE_PATH}/base)
set(WINDOWS_SOURCE_PATH ${SOURCE_PATH}/windows)
set(HTMLPARSER_SOURCE_PATH ${SOURCE_PATH}/htmlparser)

set(COMMON_INCLUDES ${PROJECT_BINARY_DIR}/include)

set(HTMLPARSER_CONFIG ${HTMLPARSER_SOURCE_PATH}/htmlparser_fsm.config)
set(JSPASPER_CONFIG ${HTMLPARSER_SOURCE_PATH}/jsparser_fsm.config)
set(FSM_GENERATOR ${HTMLPARSER_SOURCE_PATH}/generate_fsm.py)

set(BASE_HEADERS
  "${BASE_SOURCE_PATH}/arena.h"
  "${BASE_SOURCE_PATH}/manual_constructor.h"
  "${BASE_SOURCE_PATH}/mutex.h"
  "${BASE_SOURCE_PATH}/small_map.h"
  "${BASE_SOURCE_PATH}/thread_annotations.h"
  "${BASE_SOURCE_PATH}/util.h"
  "${BASE_SOURCE_PATH}/arena-inl.h"
)

set(
  HTMLPARSER_HEADERS
  "${HTMLPARSER_SOURCE_PATH}/htmlparser.h"
  "${HTMLPARSER_SOURCE_PATH}/htmlparser_cpp.h"
  "${HTMLPARSER_SOURCE_PATH}/jsparser.h"
  "${HTMLPARSER_SOURCE_PATH}/statemachine.h"
)
set(SRC_FILES
  "${SOURCE_PATH}/base/arena.cc"
  "${SOURCE_PATH}/htmlparser/htmlparser.cc"
  "${SOURCE_PATH}/htmlparser/jsparser.cc"
  "${SOURCE_PATH}/htmlparser/statemachine.cc"
  "${SOURCE_PATH}/per_expand_data.cc"
  "${SOURCE_PATH}/template.cc"
  "${SOURCE_PATH}/template_annotator.cc"
  "${SOURCE_PATH}/template_cache.cc"
  "${SOURCE_PATH}/template_dictionary.cc"
  "${SOURCE_PATH}/template_modifiers.cc"
  "${SOURCE_PATH}/template_namelist.cc"
  "${SOURCE_PATH}/template_pathops.cc"
  "${SOURCE_PATH}/template_string.cc"
  "${SOURCE_PATH}/windows/port.cc"
)

file(COPY "${WINDOWS_SOURCE_PATH}/" DESTINATION ${COMMON_INCLUDES})
file(COPY "${WINDOWS_SOURCE_PATH}/config.h" DESTINATION ${COMMON_INCLUDES}/windows)
file(COPY "${WINDOWS_SOURCE_PATH}/port.h" DESTINATION ${COMMON_INCLUDES}/windows)
file(COPY ${HTMLPARSER_HEADERS} DESTINATION ${COMMON_INCLUDES}/htmlparser)
file(COPY ${BASE_HEADERS} DESTINATION ${COMMON_INCLUDES}/base)

execute_process(
  COMMAND ${PYTHON_EXECUTABLE} ${FSM_GENERATOR} ${HTMLPARSER_CONFIG}
  WORKING_DIRECTORY ${COMMON_INCLUDES}/htmlparser
  OUTPUT_VARIABLE  HTMLPARSER_CONFIG_H
)
execute_process(
  COMMAND ${PYTHON_EXECUTABLE} ${FSM_GENERATOR} ${JSPASPER_CONFIG}
  WORKING_DIRECTORY ${COMMON_INCLUDES}/htmlparser
  OUTPUT_VARIABLE JSPASPER_CONFIG_H
)

file(WRITE "${COMMON_INCLUDES}/htmlparser/htmlparser_fsm.h" "${HTMLPARSER_CONFIG_H}")
file(WRITE "${COMMON_INCLUDES}/htmlparser/jsparser_fsm.h" "${JSPASPER_CONFIG_H}")

include_directories(${COMMON_INCLUDES})

add_library(libctemplate ${SRC_FILES})
if(NOT BUILD_SHARED_LIBS)
  # Note: CTEMPLATE_DLL_DECL should be empty to build static file
  target_compile_definitions(libctemplate PRIVATE -DCTEMPLATE_DLL_DECL=)
endif()

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

if(NOT DISABLE_INSTALL_HEADERS)
  install(DIRECTORY "${COMMON_INCLUDES}/ctemplate" DESTINATION include FILES_MATCHING PATTERN "*.h")
endif()