# Copyright (c) 2014-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under both the Apache 2.0 license (found in the # LICENSE file in the root directory of this source tree) and the GPLv2 (found # in the COPYING file in the root directory of this source tree). # You may select, at your option, one of the above-listed licenses. cmake_minimum_required(VERSION 2.8.12) string(ASCII 27 ESC) macro(WARNING_LOG MESSAGE) message("-- ${ESC}[31m${MESSAGE}${ESC}[m") endmacro(WARNING_LOG) macro(LOG MESSAGE) message("-- ${MESSAGE}") endmacro(LOG) # Set expected directory for within-build dependencies if(DEFINED ENV{OSQUERY_DEPS}) set(BUILD_DEPS "$ENV{OSQUERY_DEPS}") else() set(BUILD_DEPS "/usr/local/osquery") endif() if(WIN32) set(WINDOWS_DEP_DIR "$ENV{ChocolateyInstall}/lib") string(REGEX REPLACE "\\\\" "/" WINDOWS_DEP_DIR ${WINDOWS_DEP_DIR}) list(APPEND WINDOWS_DEP_LIST ${WINDOWS_DEP_DIR}) list(APPEND CMAKE_PROGRAM_PATH "${WINDOWS_DEP_DIR}/*/tools") endif() # If no explicit compiler override and clang++ exists, prefer clang. find_program(CLANGXX_EXECUTABLE "clang++" ENV PATH) if(DEFINED ENV{CC}) set(CMAKE_C_COMPILER "$ENV{CC}") LOG("Overriding C compiler from clang to $ENV{CC}") elseif(CLANGXX_EXECUTABLE) set(CMAKE_C_COMPILER "clang") endif() if(DEFINED ENV{CXX}) set(CMAKE_CXX_COMPILER "$ENV{CXX}") LOG("Overriding CXX compiler from clang++ to $ENV{CXX}") elseif(CLANGXX_EXECUTABLE) set(CMAKE_CXX_COMPILER "clang++") endif() if(CMAKE_CXX_COMPILER MATCHES "clang") set(CLANG TRUE) else() set(CLANG FALSE) endif() # We will add a lot of extra flags and options when using the osquery runtime. # The "DEPS" environment is the osquery runtime compiler and 3rd-party deps. if(NOT DEFINED ENV{SKIP_DEPS}) set(DEPS TRUE) else() set(DEPS FALSE) endif() if(NOT DEFINED ENV{SKIP_CCACHE}) find_program(CCACHE_EXECUTABLE ccache ENV PATH) if(CCACHE_EXECUTABLE) if(NOT DEFINED CCACHE_FOUND_LOG) set(CCACHE_FOUND_LOG TRUE CACHE BOOL "Write log line for ccache.") LOG("Found ccache ${CCACHE_EXECUTABLE}") LOG("Using ccache to speed up compilation") endif() set(ENV{CCACHE_CPP2} "yes") set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_EXECUTABLE}") set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_EXECUTABLE}") endif() endif() # osquery additional compiler flags added by CMake. set(CXX_STD "c++14") find_program(PYTHON_EXECUTABLE "python" ${BUILD_DEPS} ENV PATH) # Use osquery language to set platform/os if(DEFINED ENV{OSQUERY_PLATFORM}) set(PLATFORM "$ENV{OSQUERY_PLATFORM}") else() execute_process( COMMAND "${PYTHON_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/tools/get_platform.py" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE PLATFORM OUTPUT_STRIP_TRAILING_WHITESPACE ) endif() if(PLATFORM STREQUAL "") WARNING_LOG("Unable to detect osquery platform: ./tools/get_platform.py failed") message(FATAL_ERROR "Cannot proceed without knowing the build platform") endif() list(GET PLATFORM 0 OSQUERY_BUILD_PLATFORM) list(GET PLATFORM 1 OSQUERY_BUILD_DISTRO) string(REPLACE "." "_" PLATFORM "${PLATFORM}") string(TOUPPER "${PLATFORM}" PLATFORM) list(GET PLATFORM 0 OSQUERY_BUILD_PLATFORM_DEFINE) list(GET PLATFORM 1 OSQUERY_BUILD_DISTRO_DEFINE) if(DEFINED ENV{FAST}) set(ENV{OSQUERY_BUILD_SHARED} TRUE) endif() # Set non-C compile flags and whole-loading linker flags. # osquery needs ALL symbols in the libraries it includes for relaxed ctors # late-loading modules and SQLite introspection utilities. if(APPLE) if(DEFINED ENV{OSX_VERSION_MIN}) set(OSX_VERSION_MIN "$ENV{OSX_VERSION_MIN}") elseif(DEFINED ENV{OSX_VERSION_NATIVE}) set(OSX_VERSION_MIN "${OSQUERY_BUILD_DISTRO}") else() set(OSX_VERSION_MIN "10.11") endif() add_compile_options( -mmacosx-version-min=${OSX_VERSION_MIN} ) set(OS_WHOLELINK_PRE "-Wl,-force_load") set(OS_WHOLELINK_POST "") # Special compile flags for Objective-C++ set(OBJCXX_COMPILE_FLAGS "-x objective-c++ -fobjc-arc -Wno-c++11-extensions") set(POSIX TRUE) elseif(WIN32) # Windows # C++11 features should be on by default in 2012 and beyond. set(OS_WHOLELINK_PRE "-WHOLEARCHIVE:") set(OS_WHOLELINK_POST "") set(WINDOWS TRUE) else() set(OS_WHOLELINK_PRE "-Wl,-whole-archive") set(OS_WHOLELINK_POST "-Wl,-no-whole-archive") # Set CMAKE variables depending on platform, to know which tables and what # component-specific globbing is needed. if(${OSQUERY_BUILD_PLATFORM} STREQUAL "freebsd") set(FREEBSD TRUE) set(DEPS FALSE) include_directories("/usr/local/include") include_directories("/usr/include") else() set(LINUX TRUE) endif() set(POSIX TRUE) endif() # Configure the CXX standard and optionally set the stdlib to LLVM's. if(NOT WIN32) if(CLANG) set(CXX_STDLIB "-stdlib=libc++") else() set(CXX_STDLIB "") endif() # Only allow adding CXX flags if using SKIP_DEPS. if(DEFINED ENV{SKIP_DEPS}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=${CXX_STD} ${CXX_STDLIB}" CACHE STRING "" FORCE) else() set(CMAKE_CXX_FLAGS "-std=${CXX_STD} ${CXX_STDLIB}" CACHE STRING "" FORCE) endif() endif() if(POSIX) if(CLANG) add_compile_options( -Qunused-arguments -Wabi-tag -Wno-unused-local-typedef -Wno-deprecated-register -Wno-unknown-warning-option -Wstrict-aliasing -Wno-missing-field-initializers -Wnon-virtual-dtor -Wchar-subscripts -Wpointer-arith -Woverloaded-virtual ) else() add_compile_options( -Wno-unknown-pragmas ) endif() add_compile_options( -Wformat -Wformat-security -Werror=format-security -fpermissive -fstack-protector-all -pipe -fdata-sections -ffunction-sections ) if(NOT FREEBSD AND NOT DEFINED ENV{OSQUERY_BUILD_SHARED}) add_compile_options( -fvisibility=hidden -fvisibility-inlines-hidden ) endif() elseif(WINDOWS) add_compile_options( /EHsc /W3 /guard:cf ) add_definitions( -DWIN32_LEAN_AND_MEAN -DBOOST_ALL_NO_LIB ) endif() set(TEST_ARGS "") if(LINUX AND CLANG AND DEPS) # Use the LLVM versions of ar and ranlib to support LTO builds find_program(LLVMRANLIB_EXECUTABLE "llvm-ranlib" ENV PATH) find_program(LLVMAR_EXECUTABLE "llvm-ar" ENV PATH) set(CMAKE_AR "${LLVMAR_EXECUTABLE}") set(CMAKE_RANLIB "${LLVMRANLIB_EXECUTABLE}") set(CMAKE_C_ARCHIVE_CREATE "${LLVMAR_EXECUTABLE} qc ") set(CMAKE_CXX_ARCHIVE_CREATE "${LLVMAR_EXECUTABLE} qc ") set(CMAKE_C_ARCHIVE_FINISH "${LLVMRANLIB_EXECUTABLE} ") set(CMAKE_CXX_ARCHIVE_FINISH "${CMAKE_C_ARCHIVE_FINISH}") endif() # make debug (environment variable from Makefile) if(DEFINED ENV{DEBUG}) set(DEBUG TRUE) set(CMAKE_BUILD_TYPE "Debug") if(WINDOWS) # TODO(#1985): Is there a MSVC flag congruent to -fstandalone-debug? add_compile_options( /Zi /Od ) else() add_compile_options( -g -O0 -fstandalone-debug ) endif() add_definitions(-DDEBUG) WARNING_LOG("Setting DEBUG build") elseif(DEFINED ENV{SANITIZE}) # make sanitize (cannot make debug sanitize) set(SANITIZE_BLACKLIST "${CMAKE_SOURCE_DIR}/tools/analysis/sanitize_blacklist.txt") add_compile_options( -g -fstandalone-debug -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize-blacklist=${SANITIZE_BLACKLIST} ) if (DEFINED ENV{SANITIZE_THREAD}) add_compile_options(-fsanitize=thread) elseif(DEFINED ENV{SANITIZE_UNDEFINED}) add_compile_options(-fsanitize=undefined) else() add_compile_options(-fsanitize=address) if(LINUX) # LSAN is not available on OS X 10.12. add_compile_options(-fsanitize=leak) endif() endif() if(LINUX) # Tests that fail TSAN Checks. set(SANITIZE_SKIP_TEST ProcessTests.test_launchExtension BufferedLogForwarderTests.test_index CarverTests.test_carve_files_locally FileEventsTableTests.* YARATest.* ) string(REPLACE ";" ":" TEST_ARGS "${SANITIZE_SKIP_TEST}") set(TEST_ARGS "--gtest_filter=-${TEST_ARGS}") endif() else() set(DEBUG FALSE) if(WINDOWS) add_compile_options(/Ot /WX) elseif(CLANG) add_compile_options(-Oz) else() add_compile_options(-Os) endif() add_definitions(-DNDEBUG) # Do not enable fortify with clang: http://llvm.org/bugs/show_bug.cgi?id=16821 # Visual Studio does not support generation of PIC code if(POSIX) # TSAN and MSAN do not like PIE/PIC on Linux 4.1. # To be safe, only include them when building 'release' outputs. add_compile_options( -fPIE -fpie -fPIC -fpic ) if (CLANG AND DEPS AND NOT FREEBSD) # Only enable LTO builds when using clang on Unix, for now add_compile_options(-flto=thin) endif() endif() endif() # Generate a compile_commands.json for static analyzer input. set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(NOT DEFINED ENV{OPTIMIZED}) if(WINDOWS) # It is unclear if AVX must be managed on Windows. add_compile_options(/favor:AMD64) else() add_compile_options(-march=x86-64 -mno-avx) endif() endif() # make analyze (environment variable from Makefile) if(DEFINED ENV{ANALYZE}) # TODO(#1985): clang-analyze on Windows if(WINDOWS) message(FATAL_ERROR "Cannot analyze on Windows right now." ) else() set(CMAKE_CXX_COMPILER "${CMAKE_SOURCE_DIR}/tools/analysis/clang-analyze.sh") endif() endif() # make sdk (tests building SDK-based extensions) if(DEFINED ENV{SDK}) set(OSQUERY_BUILD_SDK_ONLY TRUE) else() set(OSQUERY_BUILD_SDK_ONLY FALSE) endif() # make packages will set release to true and blacklist development features, # development plugins, etc. if(DEFINED ENV{PACKAGE}) set(OSQUERY_BUILD_RELEASE TRUE) else() set(OSQUERY_BUILD_RELEASE FALSE) endif() # Feature environment variables (flags), their use is highly discouraged. # The recommended osquery build, and distributed packages, do not use these. if(DEFINED ENV{SKIP_AWS}) set(SKIP_AWS TRUE) add_definitions(-DSKIP_AWS=1) endif() if(DEFINED ENV{SKIP_TSK}) set(SKIP_TSK TRUE) add_definitions(-DSKIP_TSK=1) endif() if(DEFINED ENV{SKIP_LLDPD}) set(SKIP_LLDPD TRUE) add_definitions(-DSKIP_LLDPD=1) endif() if(DEFINED ENV{SKIP_YARA}) set(SKIP_YARA TRUE) add_definitions(-DSKIP_YARA=1) endif() if(DEFINED ENV{SKIP_KAFKA}) set(SKIP_KAFKA TRUE) add_definitions(-DSKIP_KAFKA=1) endif() if(DEFINED ENV{SKIP_CARVER}) set(SKIP_CARVER TRUE) add_definitions(-DSKIP_CARVER=1) endif() # The kernel builds are skipped by default. if(DEFINED ENV{SKIP_KERNEL} AND "$ENV{SKIP_KERNEL}" STREQUAL "False") set(SKIP_KERNEL FALSE) else() set(SKIP_KERNEL TRUE) endif() # Similar to the feature skips, there are default-build skips. if(DEFINED ENV{SKIP_TESTS}) set(SKIP_TESTS TRUE) endif() if(DEFINED ENV{SKIP_BENCHMARKS}) set(SKIP_BENCHMARKS TRUE) endif() if(DEFINED ENV{SKIP_TABLES}) set(SKIP_TABLES TRUE) endif() # Finished setting compiler/compiler flags. project(OSQUERY) set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY TRUE) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" "${CMAKE_MODULE_PATH}") include(CMakeLibs) find_program(CLANG_TIDY NAMES "clang-tidy" ENV PATH) if(DEFINED ENV{TIDY} AND CLANG_TIDY) message(STATUS "clang-tidy found: ${CLANG_TIDY}") set(TIDY_CHECKS "*" "-cert-err58-cpp" "-cppcoreguidelines-pro-bounds-array-to-pointer-decay" "-readability-else-after-return" "-cppcoreguidelines-pro-type-union-access" "-modernize-use-bool-literals" "-modernize-use-emplace" "-google-runtime-references" # This adds header guards when we already use pragmas "-llvm-header-guard" # This adds an explicit for operator TYPE() in flags.h "-google-explicit-constructor" # Too many notes about not defining all specials "-cppcoreguidelines-special-member-functions" # These default arguments are very valuable "-google-default-arguments" ) JOIN("${TIDY_CHECKS}" "," TIDY_CHECKS) set(DO_CLANG_TIDY "${CLANG_TIDY}" "-checks=${TIDY_CHECKS}" "-p=${CMAKE_BINARY_DIR}" "-fix" ) endif() if(WINDOWS) foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) if(${flag_var} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endif(${flag_var} MATCHES "/MD") # Ignore unused parameter messages for C-based projects (e.g. sqlite3) if (flag_var MATCHES "^CMAKE_C_FLAGS*") set(${flag_var} "${${flag_var}} /wd4101") endif(flag_var MATCHES "^CMAKE_C_FLAGS*") endforeach(flag_var) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG") elseif(CLANG AND DEPS AND NOT FREEBSD) # Clang on Unix uses LTO; we also need to pass -flto when linking set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto=thin") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -flto=thin") endif() if(NOT IS_DIRECTORY "${CMAKE_SOURCE_DIR}/third-party/sqlite3") WARNING_LOG("Cannot find git submodule third-party/sqlite3 directory") WARNING_LOG("Please run: make deps or git submodule update --init") message(FATAL_ERROR "No sqlite3 directory") endif() # Make sure deps were built before compiling (else show warning). execute_process( COMMAND "${CMAKE_SOURCE_DIR}/tools/provision.sh" check "${CMAKE_BINARY_DIR}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE OSQUERY_DEPS_MESSAGE RESULT_VARIABLE OSQUERY_DEPS_CHECK OUTPUT_STRIP_TRAILING_WHITESPACE ) if(OSQUERY_DEPS_CHECK) WARNING_LOG("${OSQUERY_DEPS_MESSAGE}") endif() # Discover build version from an environment variable or from the git checkout. if(DEFINED ENV{OSQUERY_BUILD_VERSION}) set(OSQUERY_BUILD_VERSION "$ENV{OSQUERY_BUILD_VERSION}") else() # Generate version from git execute_process( COMMAND git describe --tags HEAD --always WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE OSQUERY_BUILD_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) endif() # Discover the SDK version from an environment variable or the build version. if(OSQUERY_BUILD_VERSION STREQUAL "") WARNING_LOG("Unable to detect osquery version: 'git describe' failed") WARNING_LOG("Setting the version to: 1.0.0-unknown (beware!)") set(OSQUERY_BUILD_VERSION "1.0.0-unknown") endif() if(DEFINED ENV{SDK_VERSION}) set(OSQUERY_BUILD_SDK_VERSION "${ENV{SDK_VERSION}}") else() string(REPLACE "-" ";" OSQUERY_BUILD_SDK_VERSION ${OSQUERY_BUILD_VERSION}) list(GET OSQUERY_BUILD_SDK_VERSION 0 OSQUERY_BUILD_SDK_VERSION) endif() # Set various platform/platform-version/build version/etc defines. add_definitions( -DOSQUERY_BUILD_SDK_VERSION=${OSQUERY_BUILD_SDK_VERSION} -DOSQUERY_BUILD_PLATFORM=${OSQUERY_BUILD_PLATFORM} -DOSQUERY_BUILD_DISTRO=${OSQUERY_BUILD_DISTRO} -D${OSQUERY_BUILD_PLATFORM_DEFINE} -D${OSQUERY_BUILD_PLATFORM_DEFINE}_${OSQUERY_BUILD_DISTRO_DEFINE} -DSTRIP_FLAG_HELP=1 -DBOOST_NETWORK_ENABLE_HTTPS -DNOMINMAX # See boost 1.65 breakage https://github.com/Homebrew/homebrew-core/pull/17150 -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 ) # Remove console output (not handled by logged). add_definitions(-DTHRIFT_SQUELCH_CONSOLE_OUTPUT=1) if(DEFINED ENV{SQLITE_DEBUG}) add_definitions( -DSQLITE_DEBUG=1 -DSQLITE_ENABLE_WHERETRACE=1 ) endif() if(APPLE) LOG_PLATFORM("OS X") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "debian") LOG_PLATFORM("Debian") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "ubuntu") LOG_PLATFORM("Ubuntu") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "centos") LOG_PLATFORM("CentOS") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "scientific") LOG_PLATFORM("Scientific Linux") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "rhel") LOG_PLATFORM("RHEL") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "amazon") LOG_PLATFORM("Amazon Linux") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "oracle") LOG_PLATFORM("Oracle Linux") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "gentoo") LOG_PLATFORM("Gentoo Linux") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "funtoo") LOG_PLATFORM("Funtoo Linux") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "freebsd") LOG_PLATFORM("FreeBSD") elseif(OSQUERY_BUILD_PLATFORM STREQUAL "windows") LOG_PLATFORM("Windows") endif() # Add sysroot overrides for each platform/distro. # These should be prioritized over all other includes. if(APPLE) include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/third-party/sysroots/darwin") elseif(LINUX) include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/third-party/sysroots/linux") endif() if(POSIX AND DEPS) set(CMAKE_REQUIRED_INCLUDES "${BUILD_DEPS}/legacy/include" "${BUILD_DEPS}/include" ) # The order here matters, please do not reorder. if(CLANG) include_directories(SYSTEM "${BUILD_DEPS}/include/c++/v1") endif() include_directories(SYSTEM "${BUILD_DEPS}/legacy/include") include_directories(SYSTEM "${BUILD_DEPS}/include") if(CLANG) include_directories(SYSTEM "${BUILD_DEPS}/lib/clang/4.0.0/include") endif() endif() include_directories("${CMAKE_SOURCE_DIR}/third-party/sqlite3") include_directories("${CMAKE_SOURCE_DIR}/include") include_directories("${CMAKE_SOURCE_DIR}") if(NOT FREEBSD) include_directories("${CMAKE_SOURCE_DIR}/third-party/linenoise-ng") endif() set(MKDIR_OPTS "") if(WINDOWS) set(PROCESS_FAMILY "windows") # Win64 specific gflags set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build static gtest/gmock library" FORCE) file(GLOB INCLUDE_DIRS LIST_DIRECTORIES true "${WINDOWS_DEP_DIR}/*/*/include") include_directories(SYSTEM ${INCLUDE_DIRS}) include_directories(SYSTEM "${WINDOWS_DEP_DIR}/boost-msvc14/local") ## TODO(FIXME): temporary for now include_directories("${WINDOWS_DEP_DIR}/linenoise-ng/local/include/linenoise") else() set(PROCESS_FAMILY "posix") set(MKDIR_OPTS "-p") endif() if(WINDOWS) foreach(DEP_DIR ${WINDOWS_DEP_LIST}) file(GLOB_RECURSE WINDOWS_LOCAL_LIB_DIRS LIST_DIRECTORIES false "${DEP_DIR}/*.lib") foreach(LIB_FILE ${WINDOWS_LOCAL_LIB_DIRS}) get_filename_component(LIB_DIR ${LIB_FILE} DIRECTORY) list(APPEND OS_LIB_DIRS ${LIB_DIR}) endforeach() endforeach() list(REMOVE_DUPLICATES OS_LIB_DIRS) link_directories(${OS_LIB_DIRS}) else() set(OS_LIB_DIRS "/lib" "/lib64" "/usr/lib" "/usr/lib64" "/usr/lib/x86_64-linux-gnu/" ) endif() # Make sure the generated paths exist execute_process(COMMAND mkdir ${MKDIR_OPTS} "${CMAKE_BINARY_DIR}/generated") # We need to link some packages as dynamic/dependent. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .dylib .so .a) set(CMAKE_SKIP_RPATH TRUE) # FreeBSD does not use the osquery build system, link discovered libraries. if(FREEBSD) set(ENV{BUILD_LINK_SHARED} TRUE) endif() # Most dependent packages/libs we want static. if(DEFINED ENV{BUILD_LINK_SHARED}) set(ENV{OSQUERY_BUILD_LINK_SHARED} TRUE) endif() if(NOT DEFINED ENV{OSQUERY_BUILD_LINK_SHARED}) set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a .dylib .so) endif() # Previously, this would find_package for Gtest. # We can supply the known include paths within each test as compile flags. enable_testing() set(CTEST_TEST_TIMEOUT 600) set(BUILD_GTEST TRUE) include(Thrift) # Detect TR1 usage. include(CheckIncludeFileCXX) if(WINDOWS) check_include_file_cxx("tuple" HAVE_TR1_TUPLE) else() check_include_file_cxx("tr1/tuple" HAVE_TR1_TUPLE) endif() if(FREEBSD OR "${HAVE_TR1_TUPLE}" STREQUAL "") add_definitions(-DGTEST_USE_OWN_TR1_TUPLE=1) else() add_definitions(-DGTEST_USE_OWN_TR1_TUPLE=0) endif() set(GTEST_FLAGS "-I${CMAKE_SOURCE_DIR}/third-party/googletest/googletest/include" "-I${CMAKE_SOURCE_DIR}/third-party/googletest/googlemock/include" ) join("${GTEST_FLAGS}" " " GTEST_FLAGS) if(NOT SKIP_TESTS) add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/googletest") endif() add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/sqlite3") if(NOT FREEBSD) add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/linenoise-ng") endif() add_subdirectory(osquery) if(NOT SKIP_TESTS) add_subdirectory(tools/tests) endif() # Include the kernel building targets/macros if(NOT SKIP_KERNEL AND NOT ${OSQUERY_BUILD_SDK_ONLY}) add_subdirectory(kernel) endif() # Packages must be included after all other CMake includes. if(NOT ${OSQUERY_BUILD_SDK_ONLY}) include(Packages) endif() # make docs add_custom_target( docs COMMAND "${PYTHON_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/tools/codegen/genapi.py" "${CMAKE_SOURCE_DIR}" "--output" "--directory" "${CMAKE_SOURCE_DIR}/build/docs" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "Generating API documentation with Doxygen/mkdocs" VERBATIM ) find_program(DOXYGEN_EXECUTABLE doxygen ENV PATH) if(DOXYGEN_EXECUTABLE) add_custom_command(TARGET docs POST_BUILD COMMAND echo "PROJECT_NUMBER=${OSQUERY_BUILD_VERSION}" | cat ${CMAKE_SOURCE_DIR}/Doxyfile - | "${DOXYGEN_EXECUTABLE}" -; WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) else(DEFINED ENV{DOCS}) WARNING_LOG("Cannot find Doxygen executable in path") endif() find_program(MKDOCS_EXECUTABLE mkdocs ENV PATH) if(MKDOCS_EXECUTABLE) add_custom_command(TARGET docs POST_BUILD COMMAND "${MKDOCS_EXECUTABLE}" build --clean -s WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) elseif(DEFINED ENV{DOCS}) WARNING_LOG("Cannot find mkdocs executable in path") endif() # make format-all find_program(CLANGFORMAT_EXECUTABLE "clang-format" ENV PATH) add_custom_target( format_all find osquery include tools \( -name "*.h" -o -name "*.cpp" -o -name "*.mm" \) -exec "${CLANGFORMAT_EXECUTABLE}" -i {} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "Formatting all osquery code with clang-format" VERBATIM ) # make format add_custom_target( format "${PYTHON_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/tools/formatting/git-clang-format.py" "-f" "--binary" "${BUILD_DEPS}/bin/clang-format" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "Formatting code staged code changes with clang-format" VERBATIM ) # make sync add_custom_target( sync "${CMAKE_SOURCE_DIR}/tools/sync.sh" "${CMAKE_BINARY_DIR}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "Generating sdk sync: ${CMAKE_BINARY_DIR}/sync" DEPENDS osquery_extensions osquery_amalgamation )