blob: b907ff8407f9236b06ded5283ea43d2f52363ec7 [file] [log] [blame] [edit]
include(CMakeParseArguments)
# fuzztest_cc_library()
#
# CMake function to imitate Bazel's cc_library rule.
#
# Parameters:
#
# NAME: Name of target (see Note)
# HDRS: List of public header files for the library
# SRCS: List of source files for the library
# DEPS: List of other libraries to be linked in to the binary targets
# COPTS: List of private compile options
# DEFINES: List of public defines
# LINKOPTS: List of link options
# PUBLIC: Add this so that this library will be exported under fuzztest::
# TESTONLY: When added, this target will only be built if both
# BUILD_TESTING=ON and FUZZTEST_BUILD_TESTING=ON.
#
# Note:
#
# By default, fuzztest_cc_library will always create a library named
# fuzztest_${NAME}, and alias target fuzztest::${NAME}. The fuzztest:: form
# should always be used. This is to reduce namespace pollution.
#
# Usage:
#
# fuzztest_cc_library(
# NAME
# awesome
# HDRS
# "a.h"
# SRCS
# "a.cc"
# )
# fuzztest_cc_library(
# NAME
# fantastic_lib
# SRCS
# "b.cc"
# DEPS
# fuzztest::awesome # not "awesome" !
# PUBLIC
# )
#
# fuzztest_cc_library(
# NAME
# main_lib
# ...
# DEPS
# fuzztest::fantastic_lib
# )
#
function(fuzztest_cc_library)
cmake_parse_arguments(
FUZZTEST_CC_LIB
"PUBLIC;TESTONLY"
"NAME"
"HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DEPS"
${ARGN}
)
if(FUZZTEST_CC_LIB_TESTONLY AND NOT (BUILD_TESTING AND FUZZTEST_BUILD_TESTING))
return()
endif()
set(_NAME "fuzztest_${FUZZTEST_CC_LIB_NAME}")
# Check if this is a header-only library
# TODO: Use list(FILTER...)
set(FUZZTEST_CC_SRCS "${FUZZTEST_CC_LIB_SRCS}")
foreach(src_file IN LISTS FUZZTEST_CC_SRCS)
if(${src_file} MATCHES ".*\\.(h|inc)")
list(REMOVE_ITEM FUZZTEST_CC_SRCS "${src_file}")
endif()
endforeach()
if(FUZZTEST_CC_SRCS STREQUAL "")
set(FUZZTEST_CC_LIB_IS_INTERFACE 1)
else()
set(FUZZTEST_CC_LIB_IS_INTERFACE 0)
endif()
if(NOT FUZZTEST_CC_LIB_IS_INTERFACE)
add_library(${_NAME} "")
target_sources(
${_NAME}
PRIVATE
${FUZZTEST_CC_LIB_SRCS}
${FUZZTEST_CC_LIB_HDRS}
)
target_link_libraries(
${_NAME}
PUBLIC
${FUZZTEST_CC_LIB_DEPS}
PRIVATE
${FUZZTEST_CC_LIB_LINKOPTS}
${FUZZTEST_DEFAULT_LINKOPTS}
)
set_property(
TARGET ${_NAME}
PROPERTY LINKER_LANGUAGE "CXX")
target_include_directories(
${_NAME}
PUBLIC
"$<BUILD_INTERFACE:${fuzztest_SOURCE_DIR}>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>"
)
target_compile_options(
${_NAME}
PRIVATE
${FUZZTEST_CC_LIB_COPTS}
)
target_compile_definitions(
${_NAME}
PUBLIC
${FUZZTEST_CC_LIB_DEFINES}
)
else()
# Header-only library.
add_library(
${_NAME}
INTERFACE
)
target_include_directories(
${_NAME}
INTERFACE
"$<BUILD_INTERFACE:${fuzztest_SOURCE_DIR}>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>"
)
target_link_libraries(
${_NAME}
INTERFACE
${FUZZTEST_CC_LIB_DEPS}
${FUZZTEST_CC_LIB_LINKOPTS}
${FUZZTEST_DEFAULT_LINKOPTS}
)
target_compile_definitions(
${_NAME}
INTERFACE
${FUZZTEST_CC_LIB_DEFINES})
endif()
add_library(fuzztest::${FUZZTEST_CC_LIB_NAME} ALIAS ${_NAME})
endfunction()
# fuzztest_cc_test()
#
# CMake function to imitate Bazel's cc_test rule.
#
# Parameters:
#
# NAME: name of target (see Usage below)
# SRCS: List of source files for the binary
# DEPS: List of other libraries to be linked in to the binary targets
# COPTS: List of private compile options
# DEFINES: List of public defines
# LINKOPTS: List of link options
#
# Note:
#
# By default, fuzztest_cc_test will always create a binary named
# fuzztest_${NAME}. This will also add it to ctest list as fuzztest_${NAME}.
#
# Usage:
#
# fuzztest_cc_library(
# NAME
# awesome
# HDRS
# "a.h"
# SRCS
# "a.cc"
# PUBLIC
# )
#
# fuzztest_cc_test(
# NAME
# awesome_test
# SRCS
# "awesome_test.cc"
# DEPS
# fuzztest::awesome
# GTest::gmock
# GTest::gtest_main
# )
#
function(fuzztest_cc_test)
if(NOT (BUILD_TESTING AND FUZZTEST_BUILD_TESTING))
return()
endif()
cmake_parse_arguments(FUZZTEST_CC_TEST
""
"NAME"
"SRCS;COPTS;DEFINES;LINKOPTS;DEPS"
${ARGN}
)
set(_NAME "fuzztest_${FUZZTEST_CC_TEST_NAME}")
add_executable(
${_NAME}
""
)
target_sources(
${_NAME}
PRIVATE
${FUZZTEST_CC_TEST_SRCS}
)
target_include_directories(
${_NAME}
PUBLIC
"$<BUILD_INTERFACE:${fuzztest_SOURCE_DIR}>"
)
target_compile_definitions(
${_NAME}
PUBLIC
${FUZZTEST_CC_TEST_DEFINES}
)
target_compile_options(
${_NAME}
PRIVATE
${FUZZTEST_CC_TEST_COPTS}
)
target_link_libraries(
${_NAME}
PUBLIC
${FUZZTEST_CC_TEST_DEPS}
PRIVATE
${FUZZTEST_CC_TEST_LINKOPTS}
)
add_test(NAME ${_NAME} COMMAND ${_NAME})
endfunction()