cmake_minimum_required (VERSION 3.1) project (efsw) include(GNUInstallDirs) find_package(Threads REQUIRED) option (VERBOSE "Build efsw with verbose mode.") option (CXX11 "Build efsw with C++11") option (BUILD_SHARED_LIBS "Build efsw as a shared library" ON) option (BUILD_TEST_APP "Build the test app") option (EFSW_INSTALL "Add efsw install targets" ON) add_library(efsw) target_sources(efsw PRIVATE 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/Mutex.cpp src/efsw/String.cpp src/efsw/System.cpp src/efsw/Thread.cpp src/efsw/Watcher.cpp src/efsw/WatcherGeneric.cpp ) target_include_directories(efsw PRIVATE src/ PUBLIC $ $ $ ) if (VERBOSE) target_compile_definitions(efsw PRIVATE EFSW_VERBOSE) endif() if (CXX11) target_compile_definitions(efsw PRIVATE EFSW_USE_CXX11) target_compile_features(efsw PRIVATE cxx_std_11) endif() if (BUILD_SHARED_LIBS) target_compile_definitions(efsw PRIVATE EFSW_DYNAMIC EFSW_EXPORTS) endif() # platforms if (WIN32) target_sources(efsw PRIVATE src/efsw/platform/win/FileSystemImpl.cpp src/efsw/platform/win/MutexImpl.cpp src/efsw/platform/win/SystemImpl.cpp src/efsw/platform/win/ThreadImpl.cpp ) else () target_sources(efsw PRIVATE src/efsw/platform/posix/FileSystemImpl.cpp src/efsw/platform/posix/MutexImpl.cpp src/efsw/platform/posix/SystemImpl.cpp src/efsw/platform/posix/ThreadImpl.cpp ) endif() # watcher implementations if (APPLE) target_sources(efsw PRIVATE src/efsw/FileWatcherFSEvents.cpp src/efsw/FileWatcherKqueue.cpp src/efsw/WatcherFSEvents.cpp src/efsw/WatcherKqueue.cpp ) if (NOT CMAKE_SYSTEM_VERSION GREATER 9) target_compile_definitions(efsw PRIVATE EFSW_FSEVENTS_NOT_SUPPORTED) endif() elseif (WIN32) target_sources(efsw PRIVATE src/efsw/FileWatcherWin32.cpp src/efsw/WatcherWin32.cpp ) elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") target_sources(efsw PRIVATE src/efsw/FileWatcherInotify.cpp src/efsw/WatcherInotify.cpp ) if (NOT EXISTS "/usr/include/sys/inotify.h" AND NOT EXISTS "/usr/local/include/sys/inotify.h") target_compile_definitions(efsw PRIVATE EFSW_INOTIFY_NOSYS) endif() elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") target_sources(efsw PRIVATE src/efsw/FileWatcherKqueue.cpp src/efsw/WatcherKqueue.cpp ) endif() if (MSVC) target_compile_definitions(efsw PRIVATE _SCL_SECURE_NO_WARNINGS) else () target_compile_options(efsw PRIVATE -Wall -Wno-long-long -fPIC) endif() if (${CMAKE_BUILD_TYPE} MATCHES "Debug") target_compile_definitions(efsw PRIVATE DEBUG) elseif (${CMAKE_BUILD_TYPE} MATCHES "Release") target_compile_definitions(efsw PRIVATE NDEBUG) endif() if (APPLE) set(MAC_LIBS "-framework CoreFoundation" "-framework CoreServices") target_link_libraries(efsw PRIVATE ${MAC_LIBS}) elseif (NOT (${CMAKE_SYSTEM_NAME} MATCHES "Haiku") AND NOT WIN32) target_link_libraries(efsw PRIVATE Threads::Threads) endif() include(CMakePackageConfigHelpers) set(packageDestDir "${CMAKE_INSTALL_LIBDIR}/cmake/${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/${CMAKE_PROJECT_NAME}Targets.cmake) 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 src/efsw/base.hpp src/efsw/System.hpp src/efsw/FileSystem.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/efsw ) install(EXPORT efswExport NAMESPACE efsw:: DESTINATION "${packageDestDir}" FILE ${CMAKE_PROJECT_NAME}Targets.cmake) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/efswConfig.cmake DESTINATION "${packageDestDir}") endif() if (BUILD_TEST_APP) add_executable(efsw-test src/test/efsw-test.cpp) target_link_libraries(efsw-test efsw) endif()