# Copyright (c) Facebook, Inc. and its affiliates. include(FBCMakeParseArgs) include(FBThriftPyLibrary) include(FBThriftCppLibrary) # # add_fbthrift_library() # # This is a convenience function that generates thrift libraries for multiple # languages. # # For example: # add_fbthrift_library( # foo foo.thrift # LANGUAGES cpp py # SERVICES Foo # DEPENDS bar) # # will be expanded into two separate calls: # # add_fbthrift_cpp_library(foo_cpp foo.thrift SERVICES Foo DEPENDS bar_cpp) # add_fbthrift_py_library(foo_py foo.thrift SERVICES Foo DEPENDS bar_py) # function(add_fbthrift_library LIB_NAME THRIFT_FILE) # Parse the arguments set(one_value_args PY_NAMESPACE INCLUDE_DIR THRIFT_INCLUDE_DIR) set(multi_value_args SERVICES DEPENDS LANGUAGES CPP_OPTIONS PY_OPTIONS) fb_cmake_parse_args( ARG "" "${one_value_args}" "${multi_value_args}" "${ARGN}" ) if(NOT DEFINED ARG_INCLUDE_DIR) set(ARG_INCLUDE_DIR "include") endif() if(NOT DEFINED ARG_THRIFT_INCLUDE_DIR) set(ARG_THRIFT_INCLUDE_DIR "${ARG_INCLUDE_DIR}/thrift-files") endif() # CMake 3.12+ adds list(TRANSFORM) which would be nice to use here, but for # now we still want to support older versions of CMake. set(CPP_DEPENDS) set(PY_DEPENDS) foreach(dep IN LISTS ARG_DEPENDS) list(APPEND CPP_DEPENDS "${dep}_cpp") list(APPEND PY_DEPENDS "${dep}_py") endforeach() foreach(lang IN LISTS ARG_LANGUAGES) if ("${lang}" STREQUAL "cpp") add_fbthrift_cpp_library( "${LIB_NAME}_cpp" "${THRIFT_FILE}" SERVICES ${ARG_SERVICES} DEPENDS ${CPP_DEPENDS} OPTIONS ${ARG_CPP_OPTIONS} INCLUDE_DIR "${ARG_INCLUDE_DIR}" THRIFT_INCLUDE_DIR "${ARG_THRIFT_INCLUDE_DIR}" ) elseif ("${lang}" STREQUAL "py" OR "${lang}" STREQUAL "python") if (DEFINED ARG_PY_NAMESPACE) set(namespace_args NAMESPACE "${ARG_PY_NAMESPACE}") endif() add_fbthrift_py_library( "${LIB_NAME}_py" "${THRIFT_FILE}" SERVICES ${ARG_SERVICES} ${namespace_args} DEPENDS ${PY_DEPENDS} OPTIONS ${ARG_PY_OPTIONS} THRIFT_INCLUDE_DIR "${ARG_THRIFT_INCLUDE_DIR}" ) else() message( FATAL_ERROR "unknown language for thrift library ${LIB_NAME}: ${lang}" ) endif() endforeach() endfunction()