#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#

cmake_minimum_required(VERSION 3.16)
project("thrift-compiler" VERSION ${PACKAGE_VERSION})

# version.h now handled via veralign.sh
#configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/thrift/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/thrift/version.h)

find_package(FLEX REQUIRED)
find_package(BISON REQUIRED)

# create directory for thrifty and thriftl
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/thrift/)

# Create flex and bison files and build the lib parse static library
BISON_TARGET(thrifty ${CMAKE_CURRENT_SOURCE_DIR}/src/thrift/thrifty.yy ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.cc)
FLEX_TARGET(thriftl ${CMAKE_CURRENT_SOURCE_DIR}/src/thrift/thriftl.ll ${CMAKE_CURRENT_BINARY_DIR}/thrift/thriftl.cc)
ADD_FLEX_BISON_DEPENDENCY(thriftl thrifty)

set(parse_SOURCES
    ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.cc
    ${CMAKE_CURRENT_BINARY_DIR}/thrift/thriftl.cc
    ${CMAKE_CURRENT_BINARY_DIR}/thrift/thrifty.hh
)

add_library(parse STATIC ${parse_SOURCES})

# Create the thrift compiler
set(compiler_core
    src/thrift/common.cc
    src/thrift/generate/t_generator.cc
    src/thrift/generate/validator_parser.cc
    src/thrift/generate/validator_parser.h
    src/thrift/parse/t_typedef.cc
    src/thrift/parse/parse.cc
    src/thrift/version.h
)

set(thrift-compiler_SOURCES
    src/thrift/main.cc
    src/thrift/audit/t_audit.cpp
)

set(thrift_compiler_LANGS
)

# This macro adds an option THRIFT_COMPILER_${NAME}
# that allows enabling or disabling certain languages
macro(THRIFT_ADD_COMPILER name description initial)
    string(TOUPPER "THRIFT_COMPILER_${name}" enabler)
    set(src "src/thrift/generate/t_${name}_generator.cc")
    option(${enabler} ${description} ${initial})
    if(${enabler})
        list(APPEND thrift-compiler_SOURCES ${src})
        list(APPEND thrift_compiler_LANGS ${name})
    endif()
endmacro()

# This macro adds an option THRIFT_VALIDATOR_COMPILER_${NAME}
# that allows enabling or disabling certain languages' validator
macro(THRIFT_ADD_VALIDATOR_COMPILER name description initial)
    string(TOUPPER "THRIFT_COMPILER_${name}" enabler)
    set(src "src/thrift/generate/${name}_validator_generator.cc")
    list(APPEND "src/thrift/generate/${name}_validator_generator.h")
    option(${enabler} ${description} ${initial})
    if(${enabler})
        list(APPEND thrift-compiler_SOURCES ${src})
    endif()
endmacro()

# The following compiler can be enabled or disabled
THRIFT_ADD_COMPILER(c_glib        "Enable compiler for C with Glib" ON)
THRIFT_ADD_COMPILER(cl            "Enable compiler for Common LISP" ON)
THRIFT_ADD_COMPILER(cpp           "Enable compiler for C++" ON)
THRIFT_ADD_COMPILER(d             "Enable compiler for D" ON)
THRIFT_ADD_COMPILER(dart          "Enable compiler for Dart" ON)
THRIFT_ADD_COMPILER(delphi        "Enable compiler for Delphi" ON)
THRIFT_ADD_COMPILER(erl           "Enable compiler for Erlang" ON)
THRIFT_ADD_COMPILER(go            "Enable compiler for Go" ON)
THRIFT_ADD_COMPILER(gv            "Enable compiler for GraphViz" ON)
THRIFT_ADD_COMPILER(haxe          "Enable compiler for Haxe" ON)
THRIFT_ADD_COMPILER(html          "Enable compiler for HTML Documentation" ON)
THRIFT_ADD_COMPILER(markdown      "Enable compiler for Markdown Documentation" ON)
THRIFT_ADD_COMPILER(java          "Enable compiler for Java"   ON)
THRIFT_ADD_COMPILER(javame        "Enable compiler for Java ME" ON)
THRIFT_ADD_COMPILER(js            "Enable compiler for JavaScript" ON)
THRIFT_ADD_COMPILER(json          "Enable compiler for JSON" ON)
THRIFT_ADD_COMPILER(kotlin        "Enable compiler for Kotlin" ON)
THRIFT_ADD_COMPILER(lua           "Enable compiler for Lua" ON)
THRIFT_ADD_COMPILER(netstd        "Enable compiler for .NET Standard" ON)
THRIFT_ADD_COMPILER(ocaml         "Enable compiler for OCaml" ON)
THRIFT_ADD_COMPILER(perl          "Enable compiler for Perl" ON)
THRIFT_ADD_COMPILER(php           "Enable compiler for PHP" ON)
THRIFT_ADD_COMPILER(py            "Enable compiler for Python 2.0" ON)
THRIFT_ADD_COMPILER(rb            "Enable compiler for Ruby" ON)
THRIFT_ADD_COMPILER(rs            "Enable compiler for Rust" ON)
THRIFT_ADD_COMPILER(st            "Enable compiler for Smalltalk" ON)
THRIFT_ADD_COMPILER(swift         "Enable compiler for Cocoa Swift" ON)
THRIFT_ADD_COMPILER(xml           "Enable compiler for XML" ON)
THRIFT_ADD_COMPILER(xsd           "Enable compiler for XSD" ON)

# The following compiler can be enabled or disabled by enabling or disabling certain languages
THRIFT_ADD_VALIDATOR_COMPILER(go           "Enable validator compiler for Go" ON)

# Thrift is looking for include files in the src directory
# we also add the current binary directory for generated files
include_directories(${CMAKE_CURRENT_BINARY_DIR} src)

list(APPEND thrift-compiler_SOURCES ${compiler_core})

add_executable(thrift-compiler ${thrift-compiler_SOURCES})

set_target_properties(thrift-compiler PROPERTIES RUNTIME_OUTPUT_DIRECTORY bin/)
set_target_properties(thrift-compiler PROPERTIES OUTPUT_NAME thrift)

target_link_libraries(thrift-compiler parse)

add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/thrift${CMAKE_EXECUTABLE_SUFFIX}"
    DEPENDS thrift-compiler
    COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:thrift-compiler>" "${CMAKE_CURRENT_SOURCE_DIR}/"
    COMMENT "Copying the thrift compiler to the source tree for use by downstream targets")
add_custom_target(copy-thrift-compiler
    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/thrift${CMAKE_EXECUTABLE_SUFFIX}")

install(TARGETS thrift-compiler DESTINATION bin)

if(BUILD_TESTING)
    add_subdirectory(test)
endif()
