# 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.

# source files
project(rocketmq-client)

file(GLOB_RECURSE SRC_FILES ${CMAKE_SOURCE_DIR}/src/*)
list(REMOVE_ITEM SRC_FILES ${CMAKE_SOURCE_DIR}/src/dllmain.cpp)

# subdirs
SET(SUB_DIRS)
file(GLOB children ${CMAKE_SOURCE_DIR}/src/*)
FOREACH (child ${children})
    IF (IS_DIRECTORY ${child})
        LIST(APPEND SUB_DIRS ${child})
    ENDIF ()
ENDFOREACH ()
LIST(APPEND SUB_DIRS ${CMAKE_SOURCE_DIR}/src)

include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${SUB_DIRS})

# libs_directories
file(GLOB LIB_DIRS ${CMAKE_SOURCE_DIR}/libs/*)
foreach (dir ${LIB_DIRS})
    if (IS_DIRECTORY ${dir})
        set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH};${dir})
        include_directories(${dir}/include)
    endif ()
endforeach ()

# static
if (BUILD_ROCKETMQ_STATIC)
    add_library(rocketmq_static STATIC ${SRC_FILES})
    set_target_properties(rocketmq_static PROPERTIES OUTPUT_NAME "rocketmq")
    add_dependencies(rocketmq_static Signature)
    target_link_libraries(rocketmq_static Signature)
    target_link_libraries(rocketmq_static ${JSONCPP_LIBRARIES})
    target_link_libraries(rocketmq_static ${LIBEVENT_LIBRARIES})
    target_link_libraries(rocketmq_static ${Boost_LIBRARIES})
    target_link_libraries(rocketmq_static ${deplibs})
endif ()

# shared
if (BUILD_ROCKETMQ_SHARED)
    set(CMAKE_SHARED_LINKER_FLAGS "-DBOOST_ALL_DYN_LINK -shared ")
    add_library(rocketmq_shared SHARED ${SRC_FILES})
    set_target_properties(rocketmq_shared PROPERTIES OUTPUT_NAME "rocketmq")
    add_dependencies(rocketmq_shared Signature)
    target_link_libraries(rocketmq_shared Signature)
    target_link_libraries(rocketmq_shared ${JSONCPP_LIBRARIES})
    target_link_libraries(rocketmq_shared ${LIBEVENT_LIBRARIES})
    target_link_libraries(rocketmq_shared ${Boost_LIBRARIES})
    target_link_libraries(rocketmq_shared ${deplibs})
endif ()

# install
if (BUILD_ROCKETMQ_STATIC)
    install(TARGETS rocketmq_static DESTINATION lib)
endif ()
if (BUILD_ROCKETMQ_SHARED)
    install(TARGETS rocketmq_shared DESTINATION lib)
endif ()
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ DESTINATION include/rocketmq)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/doc/ DESTINATION doc)
