# CMake build for xalan-c
#
# Written by Roger Leigh <rleigh@codelibre.net>
#
# 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.

if(msgloader STREQUAL "inmemory")

  set(msglib_sources
    XalanMsgLib.cpp)

  set(msglib_headers
    XalanMsgLib.hpp
    XalanMsgLibDefinitions.hpp)

  add_library(xalanMsg ${msglib_sources} ${msglib_headers})
  add_dependencies(xalanMsg locale)
  target_compile_definitions(xalanMsg PRIVATE "${MSGLOADER_DEF}=1")
  if(BUILD_SHARED_LIBS)
    target_compile_definitions(xalanMsg PRIVATE XALAN_XALANMSGLIB_BUILD_DLL=1)
  endif()
  target_include_directories(xalanMsg PUBLIC
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
    $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src>
    $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src/xalanc/PlatformSupport>
    $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src/xalanc/NLS/include>
    $<INSTALL_INTERFACE:include/xalanc>)
  target_link_libraries(xalanMsg XercesC::XercesC)

  add_library(XalanC::XalanMsg ALIAS xalanMsg)

  if(MSVC)
    # Add configuration-specific library name to resource file.
    target_compile_definitions(xalanMsg PRIVATE "XALAN_DLL_NAME=\"$<TARGET_FILE_NAME:xalanMsg>\\0\"")
    # Different naming for Windows than for Unix builds for backward
    # compatibility with the existing project files.
    set_target_properties(xalanMsg PROPERTIES OUTPUT_NAME "XalanMsgLib_${XALAN_META_MS_LIB_MAJOR_VER}${CMAKE_DEBUG_POSTFIX}")
    set_target_properties(xalanMsg PROPERTIES RUNTIME_OUTPUT_NAME "XalanMessages_${XALAN_META_MS_LIB_MAJOR_VER}_${XALAN_META_MS_LIB_MINOR_VER}${CMAKE_DEBUG_POSTFIX}")
    set_target_properties(xalanMsg PROPERTIES DEBUG_POSTFIX "D")
  else()
    # Not used for the common cases, though this would be the default if
    # not for libtool compatibility.
    set_target_properties(xalanMsg PROPERTIES SOVERSION ${XALAN_META_LIB_MAJOR_VER})
    if(NOT CYGWIN)
      # This property causes shared libraries on Linux to have the full
      # version encoded into their final filename.  We disable this on
      # Cygwin because it causes xalanMsg-${XALAN_C_FULL_VERSION}.dll
      # to be created when xalanMsg.dll seems to be the default.
      set_target_properties(xalanMsg PROPERTIES VERSION ${XALAN_META_LIB_MAJOR_VER}.${XALAN_META_LIB_MINOR_VER})
    endif()
  endif()
  set_target_properties(xalanMsg PROPERTIES FOLDER "Message Library")

  install(TARGETS xalanMsg
    EXPORT XalanCConfigInternal
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    COMPONENT "runtime"
    INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")

endif()
