# 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.10)
project(testobject LANGUAGES CXX)

add_library(testobject SHARED 
  ArrayOfByte.hpp
  BatchObject.cpp
  BatchObject.hpp
  DeltaFastAssetAccount.cpp
  DeltaFastAssetAccount.hpp
  DeltaPSTObject.cpp
  DeltaPSTObject.hpp
  DeltaTestImpl.cpp
  DeltaTestImpl.hpp
  DeltaTestObj.hpp
  EqStruct.cpp
  EqStruct.hpp
  FastAsset.cpp
  FastAsset.hpp
  FastAssetAccount.cpp
  FastAssetAccount.hpp
  InvalidPdxUsage.cpp
  InvalidPdxUsage.hpp
  NestedPdxObject.cpp
  NestedPdxObject.hpp
  NonPdxType.cpp
  NonPdxType.hpp
  NoopAuthInit.cpp
  NoopAuthInit.hpp
  PdxClassV1.cpp
  PdxClassV1.hpp
  PdxClassV2.cpp
  PdxClassV2.hpp
  PdxType.cpp
  PdxType.hpp
  PdxVersioned1.cpp
  PdxVersioned1.hpp
  PdxVersioned2.cpp
  PdxVersioned2.hpp
  Portfolio.cpp
  Portfolio.hpp
  PortfolioPdx.cpp
  PortfolioPdx.hpp
  Position.cpp
  Position.hpp
  PositionPdx.cpp
  PositionPdx.hpp
  PSTObject.cpp
  PSTObject.hpp
  TestObject1.cpp
  TestObject1.hpp
  TimestampedObject.hpp
  VariousPdxTypes.cpp
  VariousPdxTypes.hpp
)

include(GenerateExportHeader)
generate_export_header(testobject)

target_include_directories(testobject
  PUBLIC
	$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)

target_compile_definitions(testobject
  PRIVATE
    BUILD_TESTOBJECT
    __STDC_FORMAT_MACROS
)

target_include_directories(testobject
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<TARGET_PROPERTY:apache-geode,SOURCE_DIR>/../src
)

target_link_libraries(testobject
  PUBLIC 
    apache-geode
    framework
  PRIVATE
    ACE
	  _WarningsAsError
)

add_clangformat(testobject)

# For Visual Studio organization
set_target_properties(testobject PROPERTIES FOLDER test-common)
