#
# 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.3)
#if (POLICY CMP0042)
#    cmake_policy(SET CMP0042 NEW)
#endif ()

cmake_minimum_required(VERSION 3.4.1)

if(DEFINED ENV{WEEX_CORE_SOURCE_DIR})
    message('WEEX_CORE_SOURCE_DIR has set')
else()
#    message("rewrite WEEX_CORE_SOURCE_DIR before ${WEEX_CORE_SOURCE_DIR}")
#    set(WEEX_CORE_SOURCE_DIR ../)
endif()


if(DEFINED ENV{ANDROID_PLATFORM})
    message('ANDROID_PLATFORM has set')
else()
    message('rewrite ANDROID_PLATFORM')
    set(ANDROID_PLATFORM " ")
endif()


set(PORT JSCOnly)
add_definitions(-DPRINT_LOG_CACHEFILE=0)
add_definitions(-DOS_ANDROID)

# log switch for debug in file "js_runtime/utils/log_utils.h"
#add_definitions(-DLOG_JS_RUNTIME_DEBUG=1)
#add_definitions(-DLOG_WEEX_RUNTIME_DEBUG=1)
#add_definitions(-DLOG_CONVERSION_DEBUG=0)
#add_definitions(-DLOG_WEEX_BINDING_DEBUG=1)
add_definitions(-DLOG_JS_DEBUG=0)
add_definitions(-DUSE_JS_RUNTIME=1)


add_definitions(-DUSE_SYSTEM_MALLOC=1)
if (${ANDROID_PLATFORM} STREQUAL "android-21")
else ()
    add_definitions(-D_POSIX_THREAD_KEYS_MAX=128)                              
    add_definitions(-DPTHREAD_KEYS_MAX=_POSIX_THREAD_KEYS_MAX)
endif ()

if ("${ANDROID_ABI}" STREQUAL "armeabi")
    add_definitions(-DWTF_CPU_ARM)
    set(WTF_CPU_ARM 1)

    if ("${ANDROID_TOOLCHAIN}" STREQUAL clang)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a")
    endif ()
elseif ("${ANDROID_ABI}" STREQUAL "armeabi-v7a")
    add_definitions(-DWTF_CPU_ARM)
    set(WTF_CPU_ARM 1)
elseif("${ANDROID_ABI}" STREQUAL "arm64-v8a")
    add_definitions(-DWTF_CPU_ARM64)
    set(WTF_CPU_ARM64 1)
else ()
    add_definitions(-DWTF_CPU_X86)
    set(WTF_CPU_X86_64 1)
endif ()

set(USE_SYSTEM_MALLOC 1)
set(WEEXJSSERVER_NAME weexjss)

include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

include_directories(${WEEX_CORE_SOURCE_DIR})
include_directories(${WEEX_CORE_SOURCE_DIR}/include)
include_directories(${WEEX_CORE_SOURCE_DIR}/include/JavaScriptCore)
include_directories(${WEEX_CORE_SOURCE_DIR}/include/JavaScriptCore/ForwardingHeaders)






set(JS_RUNTIME_API_SRCS
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/runtime_vm.cc
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/runtime_context_android.cc
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/runtime_values.cc
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/binding_macro.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/jsc/engine_context_jsc.cc
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/jsc/jsc_utils.cc
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/jsc/runtime_object_jsc.cc
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/jsc/runtime_values_jsc.cc
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/jsc/vm_jsc.cc
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/jsc/binding_macro_jsc.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/js_runtime_conversion.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/runtime/js_runtime_conversion.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/utils/log_utils.h
        )
set(WEEX_BINDING
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/weex_instance_binding.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/weex_instance_binding.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/weex_global_binding.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/weex_global_binding.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/app_context_binding.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/app_context_binding.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/weex_console_binding.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/weex_console_binding.h

        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/utils/wson_for_runtime.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/utils/wson_for_runtime.h

        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/weex_binding_utils.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/binding/weex_binding_utils.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/utils/weex_conversion_utils.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/utils/weex_conversion_utils.h

        )

set(JSON_SRC
        ${WEEX_CORE_SOURCE_DIR}/third_party/json11/json11.hpp
        ${WEEX_CORE_SOURCE_DIR}/third_party/json11/json11.cc
        )
set(WEEX_RUNTIME_V2
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/object/weex_runtime_v2.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/object/weex_runtime_v2.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/object/weex_object_holder_v2.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/object/weex_object_holder_v2.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/object/weex_global_object_v2.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/object/weex_global_object_v2.h
        )




set(${WEEXJSSERVER_NAME}_SOURCES
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/weex_ipc_client.h
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/weex_ipc_client.cpp
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/weex_ipc_server.h
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/weex_ipc_server.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/utils/weex_jsc_utils.h
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/utils/weex_jsc_utils.cpp

        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/bridge/script/script_side_in_simple.cpp
        ${WEEX_CORE_SOURCE_DIR}/js_runtime/weex/bridge/script/script_side_in_queue.cpp

        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/bridge/script/script_bridge_in_multi_so.cpp
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/bridge/script/core_side_in_multi_so.cpp
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/bridge/script/core_side_in_multi_process.cpp
        #${WEEX_CORE_SOURCE_DIR}/android/jsengine/bridge/script/script_side_in_simple.cpp
        #${WEEX_CORE_SOURCE_DIR}/android/jsengine/bridge/script/script_side_in_queue.cpp

        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/object/args/exe_js_args.cpp
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/object/args/init_framework_args.cpp
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/object/args.h
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/object/args.cpp
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/object/weex_env.h
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/object/weex_env.cpp

        weex/task/impl/init_framework_task.cpp
        weex/task/impl/create_app_context_task.cpp
        weex/task/impl/create_instance_task.cpp
        weex/task/impl/call_js_on_app_context_task.cpp
        weex/task/impl/destory_app_context_task.cpp
        weex/task/impl/destory_instance_task.cpp
        weex/task/impl/exe_js_on_app_with_result.cpp
        weex/task/impl/update_global_config_task.cpp
        weex/task/impl/ctime_callback_task.cpp
        weex/task/impl/exe_js_services_task.cpp
        weex/task/impl/exe_js_on_instance_task.cpp
        weex/task/impl/exe_js_task.cpp
        weex/task/impl/take_heap_snapshot.cpp
        weex/task/impl/native_timer_task.cpp
        weex/task/impl/update_init_framework_params_task.cpp
        weex/task/weex_task.cpp
        weex/task/weex_task_queue.cpp
        weex/task/timer_task.cpp
        weex/task/timer_queue.cpp
        weex/task/back_to_weex_core_queue.cpp

      #  ${JS_RUNTIME_API_SRCS}
        ${JS_RUNTIME_API_SRCS}
        ${DOM_API_SRCS}
        ${WEEX_BINDING}
        ${JSON_SRC}
        ${WEEX_RUNTIME_V2}
)
link_directories(${LOCAL_LIBRARIES_DIR})
message("LOCAL_LIBRARIES_DIR:"${LOCAL_LIBRARIES_DIR})
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}" CACHE STRING "toolchain_exelinkflags" FORCE)
SET(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -shared")

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -fno-omit-frame-pointer")# -fsanitize=address -g3")

set(${WEEXJSSERVER_NAME}_LIBRARY_TYPE SHARED)

message("${LOCAL_LIBRARIES_DIR}")
set(${WEEXJSSERVER_NAME}_LIBRARIES
weexbase
weexipc
wson
#c++_shared
JavaScriptCore
WTF
#jsc
log
z
-lc
-ldl
-pthread
)

add_library(${WEEXJSSERVER_NAME} SHARED
            ${${WEEXJSSERVER_NAME}_SOURCES} )


target_link_libraries(${WEEXJSSERVER_NAME}
                      ${${WEEXJSSERVER_NAME}_LIBRARIES})
set_target_properties(${WEEXJSSERVER_NAME} PROPERTIES NO_SONAME TRUE)

set_target_properties(${WEEXJSSERVER_NAME}
PROPERTIES
LINK_FLAGS
"-Wl,--version-script=${WEEX_CORE_SOURCE_DIR}/android/jsengine/weexjsserver_version_script.txt -Wl,--no-undefined -Wl,-soname,libweexjss${SERVERSUFFIX}.so"
)

#add_custom_command(
#    TARGET ${WEEXJSSERVER_NAME}
#    POST_BUILD
#    COMMAND cp $<TARGET_FILE:${WEEXJSSERVER_NAME}> ${CMAKE_SOURCE_DIR}/libweexjss${SERVERSUFFIX}.so
#    VERBATIM
#)

#add_custom_command(
#    TARGET ${WEEXJSSERVERSTUB_NAME}
#    POST_BUILD
#    COMMAND cp $<TARGET_FILE:${WEEXJSSERVERSTUB_NAME}> ${CMAKE_SOURCE_DIR}/libweexjsb${SERVERSUFFIX}.so
#    VERBATIM
#)

# Compile libweexjsb.so
set(WEEXJSSERVERSTUB_NAME libweexjsb.so)
add_executable(${WEEXJSSERVERSTUB_NAME}
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/weex_js_server_main_stub.cpp)

set_target_properties(${WEEXJSSERVERSTUB_NAME} 
PROPERTIES                                                                        
LINK_FLAGS                                                                        
"-pie -fPIE"
)

target_link_libraries(${WEEXJSSERVERSTUB_NAME}
${WEEXJSSERVER_NAME}
)

if (APPLE)
set_target_properties(${WEEXJSSERVERSTUB_NAME}
PROPERTIES LINK_FLAGS
"-Wl,--entry=_start"
)
endif()

# Compile libweexjst.so
set(WEEXJSSERVERSTUB_NAME_BELOW_L libweexjst.so)
add_executable(${WEEXJSSERVERSTUB_NAME_BELOW_L}
        ${WEEX_CORE_SOURCE_DIR}/android/jsengine/weex_js_server_main_stub.cpp)

target_link_libraries(${WEEXJSSERVERSTUB_NAME_BELOW_L}
${WEEXJSSERVER_NAME}
)

if (APPLE)
set_target_properties(${WEEXJSSERVERSTUB_NAME_BELOW_L}
PROPERTIES LINK_FLAGS
"-Wl,--entry=_start"
)
endif()