CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)

PROJECT(seafile-fsplugin)
SET(PROJECT_VERSION "1.0.0")

IF (NOT (${CMAKE_BUILD_TYPE} MATCHES Release))
  SET(CMAKE_BUILD_TYPE Debug)
ENDIF()

SET(CODESIGN_CERTIFICATE "-" CACHE STRING "the certificate to sign code")

MESSAGE(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

IF (NOT APPLE)
    MESSAGE(FATAL_ERROR "Support only on OS X")
ENDIF()

IF (NOT CMAKE_GENERATOR STREQUAL Xcode)
    MESSAGE(FATAL_ERROR "Support only for Xcode generator")
ENDIF()

## Build with warnings
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wsign-compare -Wno-long-long -Wno-unused-parameter")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wsign-compare -Wno-long-long -Wno-unused-parameter -Woverloaded-virtual")

## Find the dependencies

FIND_LIBRARY(AppKit_LIBRARY AppKit)
FIND_LIBRARY(FinderSync_LIBRARY FinderSync)
FIND_LIBRARY(PlugInKit_LIBRARY PlugInKit
  PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks/)

if (NOT PlugInKit_LIBRARY)
  MESSAGE(FATAL_ERROR "PlugInKit not found")
endif()

ADD_DEFINITIONS(-fapplication-extension -fmodules)
SET(CMAKE_EXE_LINKER_FLAGS "-fapplication-extension -e _NSExtensionMain -fobjc-arc -fobjc-link-runtime ${CMAKE_EXE_LINKER_FLAGS}")

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
SET(FSPLUGIN_SRC
  ../src/utils/stl.cpp
  ../src/utils/stl.h
  FinderSync.mm
  FinderSyncClient.mm
  )

## update en.lproj
ADD_CUSTOM_TARGET(update-lproj
  COMMAND genstrings -o en.lproj ${FSPLUGIN_SRC}
  DEPENDS ${FSPLUGIN_SRC})

ADD_EXECUTABLE(seafile-finder-sync MACOSX_BUNDLE
  ${FSPLUGIN_SRC}
)

SET_TARGET_PROPERTIES(seafile-finder-sync PROPERTIES
  OUTPUT_NAME "Seafile FinderSync"
  MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
  XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET "10.14"
  XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks @executable_path/../../../../Frameworks"
  XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "YES"
  XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11"
  XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++"
  XCODE_ATTRIBUTE_DEVELOPMENT_LANGUAGE "English"
  XCODE_ATTRIBUTE_LOCALIZED_RESOURCES_FOLDER_PATH "Seafile FinderSync.appex/English.lproj"
  XCODE_ATTRIBUTE_INFOSTRINGS_PATH "Seafile FinderSync.appex/English.lproj/InfoPlist.strings"
  XCODE_ATTRIBUTE_UNLOCALIZED_RESOURCES_FOLDER_PATH "Seafile FinderSync.appex"
  )

TARGET_LINK_LIBRARIES(seafile-finder-sync
  ${FinderSync_LIBRARY}
  ${PlugInKit_LIBRARY}
  ${AppKit_LIBRARY}
)

### rename to Seafile Client.appex and copy related resource files

SET(BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CONFIGURATION}/Seafile FinderSync.app")
SET(TARGET_DIR "${CMAKE_CURRENT_BINARY_DIR}/Seafile FinderSync.appex")

ADD_CUSTOM_TARGET(clean_old_target
  COMMAND ${CMAKE_COMMAND} -E remove -f ${TARGET_DIR}
  )
ADD_CUSTOM_TARGET(copy_fsplugin
  COMMAND ${CMAKE_COMMAND} -E copy_directory ${BUILD_DIR} ${TARGET_DIR}
  DEPENDS seafile-finder-sync clean_old_target
  )

ADD_CUSTOM_TARGET(create_resource_dir
  COMMAND ${CMAKE_COMMAND} -E make_directory ${TARGET_DIR}/Contents/Resources
  DEPENDS copy_fsplugin
  )
ADD_CUSTOM_TARGET(copy_resources_icns
  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/../seafile.icns ${TARGET_DIR}/Contents/Resources/
  COMMAND ${CMAKE_COMMAND} -E copy status-done.icns ${TARGET_DIR}/Contents/Resources/
  COMMAND ${CMAKE_COMMAND} -E copy status-error.icns ${TARGET_DIR}/Contents/Resources/
  COMMAND ${CMAKE_COMMAND} -E copy status-syncing.icns ${TARGET_DIR}/Contents/Resources/
  COMMAND ${CMAKE_COMMAND} -E copy status-ignored.icns ${TARGET_DIR}/Contents/Resources/
  COMMAND ${CMAKE_COMMAND} -E copy status-locked.icns ${TARGET_DIR}/Contents/Resources/
  COMMAND ${CMAKE_COMMAND} -E copy status-locked-by-me.icns ${TARGET_DIR}/Contents/Resources/
  DEPENDS create_resource_dir
  )
ADD_CUSTOM_TARGET(copy_resources_lproj
  DEPENDS create_resource_dir)

SET(FSPLUGIN_LANGS)
file(GLOB FSPLUGIN_LPROJS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.lproj")

FOREACH(LPROJ ${FSPLUGIN_LPROJS})
  STRING(REGEX REPLACE "^.*/([a-z]+)\\.lproj/.*$" "\\1" _LANG ${LPROJ})
  LIST(FIND FSPLUGIN_LANGS "${_LANG}" _INDEX)
  IF(_INDEX EQUAL -1)
    LIST(APPEND FSPLUGIN_LANGS ${_LANG})
    ADD_CUSTOM_TARGET(copy_resources_lproj_${_LANG}
    COMMAND cp -r ${_LANG} ${TARGET_DIR}/Contents/Resources/
    DEPENDS create_resource_dir)
    ADD_DEPENDENCIES(copy_resources_lproj copy_resources_lproj_${_LANG})
  ENDIF(_INDEX EQUAL -1)
ENDFOREACH()

### codesign

FIND_PROGRAM(CODESIGN codesign)

ADD_CUSTOM_TARGET(codesign ALL
  COMMAND ${CODESIGN} --force --sign ${CODESIGN_CERTIFICATE} --entitlements ${CMAKE_CURRENT_SOURCE_DIR}/seafile-fsplugin.entitlements ${TARGET_DIR}
  DEPENDS copy_resources_icns copy_resources_lproj
  )
