Commit 6b3aaa2b authored by Tushar Maheshwari's avatar Tushar Maheshwari Committed by Facebook Github Bot

Improve modern CMake usage

Summary:
Summary of the changes
 ---
- Fix broken MSVC build:
  - Compiling `GenerateFingerprintTables.cpp` complained about missing header file `glog/logging.h`.
  - Targets `GenerateFingerprintTables` and `folly_fingerprint` don't specify `FOLLY_INCLUDE_DIRECTORIES` in its include directories.

* Introduce a "shiny" target `folly_deps` for managing folly's dependencies and interface specification.
  * `folly_deps` is an [INTERFACE library target](https://cmake.org/cmake/help/v3.0/command/add_library.html).
  * It encapsulates the interface dependencies (compile definitions, include directories, link libraries, etc.) for other targets.
  * The usage of the new target is clean and simple:
    `target_link_libraries(<target_name> (PUBLIC|PRIVATE) folly_deps)`
    (except for OBJECT library targets, like `folly_base` - included in the change).

Possible modifications
 ---
The name `folly_deps` could be replaced with a better one.
The target can be extended to include the PUBLIC compile options set on individual targets.
Reviews and suggestions welcome.
Closes https://github.com/facebook/folly/pull/818

Reviewed By: simpkins

Differential Revision: D7642870

Pulled By: Orvid

fbshipit-source-id: c1c5fdae67f5a677c82f05757217af6b6de9db02
parent 69957e94
......@@ -285,3 +285,9 @@ function(apply_folly_compile_options_to_target THETARGET)
set_property(TARGET ${THETARGET} APPEND_STRING PROPERTY LINK_FLAGS_RELEASE " /LTCG")
endif()
endfunction()
target_link_libraries(folly_deps
INTERFACE
Iphlpapi.lib
Ws2_32.lib
)
......@@ -27,9 +27,9 @@ if (gflags_FOUND)
message(STATUS "Found gflags from package config")
set(FOLLY_HAVE_LIBGFLAGS ON)
if (TARGET gflags-shared)
set(FOLLY_SHINY_DEPENDENCIES ${FOLLY_SHINY_DEPENDENCIES} gflags-shared)
list(APPEND FOLLY_SHINY_DEPENDENCIES gflags-shared)
elseif (TARGET gflags)
set(FOLLY_SHINY_DEPENDENCIES ${FOLLY_SHINY_DEPENDENCIES} gflags)
list(APPEND FOLLY_SHINY_DEPENDENCIES gflags)
else()
message(FATAL_ERROR "Unable to determine the target name for the GFlags package.")
endif()
......@@ -49,7 +49,7 @@ find_package(glog CONFIG QUIET)
if (glog_FOUND)
message(STATUS "Found glog from package config")
set(FOLLY_HAVE_LIBGLOG ON)
set(FOLLY_SHINY_DEPENDENCIES ${FOLLY_SHINY_DEPENDENCIES} glog::glog)
list(APPEND FOLLY_SHINY_DEPENDENCIES glog::glog)
else()
find_package(GLog MODULE)
set(FOLLY_HAVE_LIBGLOG ${LIBGLOG_FOUND})
......@@ -60,7 +60,7 @@ endif()
find_package(Libevent CONFIG QUIET)
if(TARGET event)
message(STATUS "Found libevent from package config")
set(FOLLY_SHINY_DEPENDENCIES ${FOLLY_SHINY_DEPENDENCIES} event)
list(APPEND FOLLY_SHINY_DEPENDENCIES event)
else()
find_package(LibEvent MODULE REQUIRED)
list(APPEND FOLLY_LINK_LIBRARIES ${LIBEVENT_LIB})
......@@ -144,3 +144,10 @@ list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBURCU_INCLUDE_DIRS})
list(APPEND FOLLY_LINK_LIBRARIES ${CMAKE_DL_LIBS})
list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_DL_LIBS})
add_library(folly_deps INTERFACE)
target_include_directories(folly_deps INTERFACE ${FOLLY_INCLUDE_DIRECTORIES})
target_link_libraries(folly_deps INTERFACE
${FOLLY_LINK_LIBRARIES}
${FOLLY_SHINY_DEPENDENCIES}
)
......@@ -10,7 +10,6 @@ endif()
# includes
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
# package information
set(PACKAGE_NAME "folly")
......@@ -198,49 +197,35 @@ if (BUILD_SHARED_LIBS)
endif()
auto_source_group(folly ${FOLLY_DIR} ${files} ${hfiles})
apply_folly_compile_options_to_target(folly_base)
target_include_directories(folly_base PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
# Add the generated files to the correct source group.
source_group("folly" FILES ${CMAKE_CURRENT_BINARY_DIR}/folly/folly-config.h)
source_group("folly\\build" FILES
${CMAKE_CURRENT_BINARY_DIR}/folly/build/FingerprintTables.cpp
)
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(FOLLY_LINK_LIBRARIES
${FOLLY_LINK_LIBRARIES}
Iphlpapi.lib
Ws2_32.lib
)
endif()
set(FOLLY_LINK_LIBRARIES
${FOLLY_LINK_LIBRARIES}
${FOLLY_SHINY_DEPENDENCIES}
target_include_directories(folly_deps
INTERFACE
$<BUILD_INTERFACE:
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:include>
)
target_include_directories(folly_base
PUBLIC
${FOLLY_INCLUDE_DIRECTORIES}
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<TARGET_PROPERTY:folly_deps,INTERFACE_INCLUDE_DIRECTORIES>
)
target_compile_definitions(folly_base
PUBLIC
$<TARGET_PROPERTY:folly_deps,INTERFACE_COMPILE_DEFINITIONS>
)
foreach (LIB ${FOLLY_SHINY_DEPENDENCIES})
target_include_directories(folly_base PUBLIC $<TARGET_PROPERTY:${LIB},INCLUDE_DIRECTORIES>)
target_compile_definitions(folly_base PUBLIC $<TARGET_PROPERTY:${LIB},INTERFACE_COMPILE_DEFINITIONS>)
endforeach()
if (FOLLY_HAVE_PTHREAD)
target_include_directories(folly_base PUBLIC ${LIBPTHREAD_INCLUDE_DIRS})
endif()
# Now to generate the fingerprint tables
add_executable(GenerateFingerprintTables
${FOLLY_DIR}/build/GenerateFingerprintTables.cpp
$<TARGET_OBJECTS:folly_base>
)
target_link_libraries(GenerateFingerprintTables PRIVATE ${FOLLY_LINK_LIBRARIES})
target_include_directories(GenerateFingerprintTables PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
add_dependencies(GenerateFingerprintTables folly_base)
target_link_libraries(GenerateFingerprintTables PRIVATE folly_deps)
apply_folly_compile_options_to_target(GenerateFingerprintTables)
set_property(TARGET GenerateFingerprintTables PROPERTY FOLDER "Build")
source_group("" FILES ${FOLLY_DIR}/build/GenerateFingerprintTables.cpp)
......@@ -263,9 +248,7 @@ add_library(folly_fingerprint STATIC
${FOLLY_DIR}/detail/FingerprintPolynomial.h
$<TARGET_OBJECTS:folly_base>
)
target_link_libraries(folly_fingerprint PRIVATE ${FOLLY_LINK_LIBRARIES})
target_include_directories(folly_fingerprint PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
add_dependencies(folly_fingerprint folly_base)
target_link_libraries(folly_fingerprint PRIVATE folly_deps)
apply_folly_compile_options_to_target(folly_fingerprint)
# We want to generate a single library and target for folly, but we needed a
......@@ -283,15 +266,9 @@ add_library(folly
apply_folly_compile_options_to_target(folly)
source_group("" FILES ${CMAKE_CURRENT_BINARY_DIR}/folly_dep.cpp)
target_link_libraries(folly PUBLIC ${FOLLY_LINK_LIBRARIES})
target_include_directories(folly
INTERFACE
${FOLLY_INCLUDE_DIRECTORIES}
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(folly PUBLIC folly_deps)
install(TARGETS folly
install(TARGETS folly folly_deps
EXPORT folly
RUNTIME DESTINATION bin
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
......
......@@ -5,13 +5,9 @@ if (FOLLY_USE_SYMBOLIZER)
StackTrace.cpp
)
apply_folly_compile_options_to_target(folly_exception_tracer_base)
target_include_directories(folly_exception_tracer_base
PUBLIC
${FOLLY_INCLUDE_DIRECTORIES}
)
target_link_libraries(
folly_exception_tracer_base
PUBLIC folly ${FOLLY_LINK_LIBRARIES}
PUBLIC folly
)
add_library(
......@@ -20,10 +16,6 @@ if (FOLLY_USE_SYMBOLIZER)
ExceptionTracerLib.cpp
)
apply_folly_compile_options_to_target(folly_exception_tracer)
target_include_directories(folly_exception_tracer
PUBLIC
${FOLLY_INCLUDE_DIRECTORIES}
)
target_link_libraries(
folly_exception_tracer
PUBLIC folly_exception_tracer_base
......@@ -34,10 +26,6 @@ if (FOLLY_USE_SYMBOLIZER)
ExceptionCounterLib.cpp
)
apply_folly_compile_options_to_target(folly_exception_counter)
target_include_directories(folly_exception_counter
PUBLIC
${FOLLY_INCLUDE_DIRECTORIES}
)
target_link_libraries(
folly_exception_counter
PUBLIC folly_exception_tracer
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment