193 lines
5.2 KiB
CMake
193 lines
5.2 KiB
CMake
cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
|
|
|
|
project(efsw)
|
|
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
|
|
set(ESFW_MAIN_PROJECT OFF)
|
|
|
|
if((CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) AND(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME))
|
|
set(ESFW_MAIN_PROJECT ON)
|
|
endif()
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
option(VERBOSE "Build efsw with verbose mode.")
|
|
option(BUILD_SHARED_LIBS "Build efsw as a shared library" ON)
|
|
option(BUILD_STATIC_LIBS "Build efsw as a static library" ON)
|
|
option(BUILD_TEST_APP "Build the test app" ${ESFW_MAIN_PROJECT})
|
|
option(EFSW_INSTALL "Add efsw install targets" ${ESFW_MAIN_PROJECT})
|
|
|
|
add_library(efsw)
|
|
|
|
if(BUILD_STATIC_LIBS)
|
|
add_library(efsw-static STATIC)
|
|
|
|
target_include_directories(efsw-static
|
|
PRIVATE src/
|
|
PUBLIC
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
)
|
|
endif()
|
|
|
|
set(EFSW_CPP_SOURCE
|
|
src/efsw/Debug.cpp
|
|
src/efsw/DirectorySnapshot.cpp
|
|
src/efsw/DirectorySnapshotDiff.cpp
|
|
src/efsw/DirWatcherGeneric.cpp
|
|
src/efsw/FileInfo.cpp
|
|
src/efsw/FileSystem.cpp
|
|
src/efsw/FileWatcher.cpp
|
|
src/efsw/FileWatcherCWrapper.cpp
|
|
src/efsw/FileWatcherGeneric.cpp
|
|
src/efsw/FileWatcherImpl.cpp
|
|
src/efsw/Log.cpp
|
|
src/efsw/String.cpp
|
|
src/efsw/System.cpp
|
|
src/efsw/Watcher.cpp
|
|
src/efsw/WatcherGeneric.cpp
|
|
)
|
|
|
|
target_include_directories(efsw
|
|
PRIVATE src/
|
|
PUBLIC
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
)
|
|
|
|
if(VERBOSE)
|
|
target_compile_definitions(efsw PRIVATE EFSW_VERBOSE)
|
|
endif()
|
|
|
|
target_compile_features(efsw PRIVATE cxx_std_11)
|
|
|
|
if(BUILD_SHARED_LIBS)
|
|
target_compile_definitions(efsw PRIVATE EFSW_DYNAMIC EFSW_EXPORTS)
|
|
endif()
|
|
|
|
# platforms
|
|
if(WIN32)
|
|
list(APPEND EFSW_CPP_SOURCE
|
|
src/efsw/platform/win/FileSystemImpl.cpp
|
|
src/efsw/platform/win/SystemImpl.cpp
|
|
)
|
|
else()
|
|
list(APPEND EFSW_CPP_SOURCE
|
|
src/efsw/platform/posix/FileSystemImpl.cpp
|
|
src/efsw/platform/posix/SystemImpl.cpp
|
|
)
|
|
endif()
|
|
|
|
# watcher implementations
|
|
if(APPLE)
|
|
list(APPEND EFSW_CPP_SOURCE
|
|
src/efsw/FileWatcherFSEvents.cpp
|
|
src/efsw/FileWatcherKqueue.cpp
|
|
src/efsw/WatcherFSEvents.cpp
|
|
src/efsw/WatcherKqueue.cpp
|
|
)
|
|
elseif(WIN32)
|
|
list(APPEND EFSW_CPP_SOURCE
|
|
src/efsw/FileWatcherWin32.cpp
|
|
src/efsw/WatcherWin32.cpp
|
|
)
|
|
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
|
list(APPEND EFSW_CPP_SOURCE
|
|
src/efsw/FileWatcherInotify.cpp
|
|
src/efsw/WatcherInotify.cpp
|
|
)
|
|
|
|
find_path(EFSW_INOTIFY_H NAMES sys/inotify.h NO_CACHE)
|
|
if(EFSW_INOTIFY_H STREQUAL "EFSW_INOTIFY_H-NOTFOUND")
|
|
target_compile_definitions(efsw PRIVATE EFSW_INOTIFY_NOSYS)
|
|
endif()
|
|
elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
|
|
list(APPEND EFSW_CPP_SOURCE
|
|
src/efsw/FileWatcherKqueue.cpp
|
|
src/efsw/WatcherKqueue.cpp
|
|
)
|
|
endif()
|
|
|
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR
|
|
(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))
|
|
target_compile_definitions(efsw PRIVATE _SCL_SECURE_NO_WARNINGS)
|
|
else()
|
|
target_compile_options(efsw PRIVATE -Wall -Wno-long-long -fPIC)
|
|
endif()
|
|
|
|
target_compile_definitions(efsw PRIVATE $<IF:$<CONFIG:Debug>,DEBUG,NDEBUG>)
|
|
|
|
if(APPLE)
|
|
set(MAC_LIBS "-framework CoreFoundation" "-framework CoreServices")
|
|
target_link_libraries(efsw PRIVATE ${MAC_LIBS})
|
|
if(BUILD_STATIC_LIBS)
|
|
target_link_libraries(efsw-static PRIVATE ${MAC_LIBS})
|
|
endif()
|
|
elseif(NOT(${CMAKE_SYSTEM_NAME} MATCHES "Haiku") AND NOT WIN32)
|
|
target_link_libraries(efsw PRIVATE Threads::Threads)
|
|
endif()
|
|
|
|
target_sources(efsw PRIVATE ${EFSW_CPP_SOURCE})
|
|
|
|
if(BUILD_STATIC_LIBS)
|
|
target_sources(efsw-static PRIVATE ${EFSW_CPP_SOURCE})
|
|
endif()
|
|
|
|
include(CMakePackageConfigHelpers)
|
|
|
|
set(packageDestDir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
|
|
|
|
configure_package_config_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/efswConfig.cmake.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/cmake/efswConfig.cmake
|
|
INSTALL_DESTINATION "${packageDestDir}"
|
|
NO_SET_AND_CHECK_MACRO
|
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO
|
|
)
|
|
|
|
export(TARGETS efsw NAMESPACE efsw:: FILE ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Targets.cmake)
|
|
if(BUILD_STATIC_LIBS)
|
|
export(TARGETS efsw-static NAMESPACE efsw:: APPEND FILE ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Targets.cmake)
|
|
endif()
|
|
|
|
if(EFSW_INSTALL)
|
|
install(TARGETS efsw EXPORT efswExport
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
)
|
|
|
|
install(
|
|
FILES
|
|
include/efsw/efsw.h include/efsw/efsw.hpp
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/efsw
|
|
)
|
|
|
|
if(BUILD_STATIC_LIBS)
|
|
install(TARGETS efsw-static EXPORT efswExport
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
)
|
|
endif()
|
|
|
|
install(EXPORT efswExport NAMESPACE efsw:: DESTINATION "${packageDestDir}" FILE ${PROJECT_NAME}Targets.cmake)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/efswConfig.cmake DESTINATION "${packageDestDir}")
|
|
endif()
|
|
|
|
if(BUILD_TEST_APP)
|
|
# C++ test application
|
|
add_executable(efsw-test src/test/efsw-test.cpp)
|
|
target_link_libraries(efsw-test efsw-static)
|
|
|
|
# C test application
|
|
add_executable(efsw-test-stdc src/test/efsw-test.c)
|
|
target_link_libraries(efsw-test-stdc efsw-static)
|
|
endif()
|