#
# 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 2.8)
project (etch-cpp-helloworld)

IF (EXISTS "${CMAKE_SOURCE_DIR}/CMakeLists_local.txt")
  INCLUDE ("${CMAKE_SOURCE_DIR}/CMakeLists_local.txt" OPTIONAL)
ENDIF()

include (${CMAKE_TOOLCHAIN_FILE})

#====================================================================================#

#Etch Home
IF (NOT ETCH_HOME)
    MESSAGE(FATAL_ERROR "ETCH_HOME not set")
ENDIF (NOT ETCH_HOME)

SET(ETCH_CPP_HOME ${ETCH_HOME}/binding-cpp)
SET(ETCH_CPP_INCLUDE_DIR ${ETCH_CPP_HOME}/include)
SET(ETCH_CPP_LIBRARY_DIR ${ETCH_CPP_HOME}/lib)
SET(ETCH_CPP_LIBRARY_DIR_PLATFORM_SPECIFIC ${ETCH_CPP_LIBRARY_DIR}/${TARGET_OS}_${TARGET_ARCH}/${CMAKE_BUILD_TYPE})

# set include dirs
include_directories (${ETCH_CPP_INCLUDE_DIR})
include_directories (${PROJECT_SOURCE_DIR}/src/main/include)
include_directories (${PROJECT_SOURCE_DIR}/target/generated-sources/cpp/include)

link_directories(${ETCH_CPP_LIBRARY_DIR_PLATFORM_SPECIFIC})


#STATUS
message(STATUS " ")
message(STATUS "====================================================")
message(STATUS "build target:            ${CMAKE_BUILD_TYPE}")
message(STATUS "using Etch home Dir:     ${ETCH_HOME}")
message(STATUS "using include dir:       ${ETCH_CPP_INCLUDE_DIR}")
message(STATUS "using library dir:       ${ETCH_CPP_LIBRARY_DIR_PLATFORM_SPECIFIC}")

#====================================================================================#
# SERVER
#====================================================================================#



add_executable(etch-cpp-helloworld-server
 src/main/src/ImplHelloWorldServer.cpp
 src/main/src/MainHelloWorldListener.cpp
 target/generated-sources/cpp/src/HelloWorld.cpp
 target/generated-sources/cpp/src/HelloWorldClient.cpp

 target/generated-sources/cpp/src/HelloWorldServer.cpp
 target/generated-sources/cpp/src/BaseHelloWorldClient.cpp
 target/generated-sources/cpp/src/BaseHelloWorldServer.cpp
 target/generated-sources/cpp/src/HelloWorldHelper.cpp

 target/generated-sources/cpp/src/RemoteHelloWorld.cpp

 target/generated-sources/cpp/src/RemoteHelloWorldClient.cpp
 target/generated-sources/cpp/src/RemoteHelloWorldServer.cpp
 target/generated-sources/cpp/src/StubHelloWorld.cpp
 target/generated-sources/cpp/src/StubHelloWorldClient.cpp
 target/generated-sources/cpp/src/StubHelloWorldServer.cpp
 target/generated-sources/cpp/src/ValueFactoryHelloWorld.cpp
)


IF (TARGET_OS STREQUAL "Linux")
  target_link_libraries(etch-cpp-helloworld-server etch Capu pthread rt)
ELSEIF(TARGET_OS STREQUAL "Windows")
  target_link_libraries(etch-cpp-helloworld-server etch Capu)
  IF (BUILD_CHECK_MEMORY)
    add_definitions(-DBUILD_CHECK_MEMORY)
    include_directories (${VLD}/include)
    file (COPY ${VLD}/vld.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
    file (COPY ${VLD}/bin/Win32/dbghelp.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
	file (COPY ${VLD}/bin/Win32/Microsoft.DTfW.DHL.manifest DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
    file (COPY ${VLD}/bin/Win32/vld_x86.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
    target_link_libraries (etch-cpp-helloworld-server ${VLD}/lib/Win32/vld.lib)
  ENDIF (BUILD_CHECK_MEMORY)
ELSEIF(TARGET_OS STREQUAL "QNX")
  target_link_libraries (etch-cpp-helloworld-server etch Capu c socket)
ENDIF()

set_target_properties(etch-cpp-helloworld-server PROPERTIES OUTPUT_NAME "helloworld-server")

#====================================================================================#
# CLIENT
#====================================================================================#

add_executable(etch-cpp-helloworld-client
 src/main/src/ImplHelloWorldClient.cpp
 src/main/src/MainHelloWorldClient.cpp
 target/generated-sources/cpp/src/HelloWorld.cpp
 target/generated-sources/cpp/src/HelloWorldClient.cpp
 target/generated-sources/cpp/src/HelloWorldServer.cpp
 target/generated-sources/cpp/src/BaseHelloWorldClient.cpp
 target/generated-sources/cpp/src/BaseHelloWorldServer.cpp
 target/generated-sources/cpp/src/HelloWorldHelper.cpp
 target/generated-sources/cpp/src/RemoteHelloWorld.cpp
 target/generated-sources/cpp/src/RemoteHelloWorldClient.cpp
 target/generated-sources/cpp/src/RemoteHelloWorldServer.cpp
 target/generated-sources/cpp/src/StubHelloWorld.cpp
 target/generated-sources/cpp/src/StubHelloWorldClient.cpp
 target/generated-sources/cpp/src/StubHelloWorldServer.cpp
 target/generated-sources/cpp/src/ValueFactoryHelloWorld.cpp
)

IF (TARGET_OS STREQUAL "Linux")
  target_link_libraries(etch-cpp-helloworld-client etch Capu pthread rt)
ELSEIF(TARGET_OS STREQUAL "Windows")
  target_link_libraries(etch-cpp-helloworld-client etch Capu )
  IF (BUILD_CHECK_MEMORY)
    add_definitions(-DBUILD_CHECK_MEMORY)
    include_directories (${VLD}/include)
    file (COPY ${VLD}/vld.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
    file (COPY ${VLD}/bin/Win32/dbghelp.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
	file (COPY ${VLD}/bin/Win32/Microsoft.DTfW.DHL.manifest DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
    file (COPY ${VLD}/bin/Win32/vld_x86.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
    target_link_libraries (etch-cpp-helloworld-client ${VLD}/lib/Win32/vld.lib)
  ENDIF (BUILD_CHECK_MEMORY)
ELSEIF(TARGET_OS STREQUAL "QNX")
  target_link_libraries (etch-cpp-helloworld-client etch Capu c socket)
ENDIF()

set_target_properties(etch-cpp-helloworld-client PROPERTIES OUTPUT_NAME "helloworld-client")



