Clang Project

clang_source_code/tools/clang-fuzzer/CMakeLists.txt
1set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} FuzzMutate)
2set(CXX_FLAGS_NOFUZZ ${CMAKE_CXX_FLAGS})
3set(DUMMY_MAIN DummyClangFuzzer.cpp)
4if(LLVM_LIB_FUZZING_ENGINE)
5  unset(DUMMY_MAIN)
6elseif(LLVM_USE_SANITIZE_COVERAGE)
7  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer")
8  set(CXX_FLAGS_NOFUZZ "${CXX_FLAGS_NOFUZZ} -fsanitize=fuzzer-no-link")
9  unset(DUMMY_MAIN)
10endif()
11
12# Needed by LLVM's CMake checks because this file defines multiple targets.
13set(LLVM_OPTIONAL_SOURCES
14  ClangFuzzer.cpp
15  DummyClangFuzzer.cpp
16  ExampleClangProtoFuzzer.cpp
17  ExampleClangLoopProtoFuzzer.cpp
18  ExampleClangLLVMProtoFuzzer.cpp
19  )
20
21if(CLANG_ENABLE_PROTO_FUZZER)
22  # Create protobuf .h and .cc files, and put them in a library for use by
23  # clang-proto-fuzzer components.
24  find_package(Protobuf REQUIRED)
25  add_definitions(-DGOOGLE_PROTOBUF_NO_RTTI)
26  include_directories(${PROTOBUF_INCLUDE_DIRS})
27  include_directories(${CMAKE_CURRENT_BINARY_DIR})
28  protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS cxx_proto.proto)
29  protobuf_generate_cpp(LOOP_PROTO_SRCS LOOP_PROTO_HDRS cxx_loop_proto.proto)
30  set(LLVM_OPTIONAL_SOURCES ${LLVM_OPTIONAL_SOURCES} ${PROTO_SRCS})
31  add_clang_library(clangCXXProto
32    ${PROTO_SRCS}
33    ${PROTO_HDRS}
34
35    LINK_LIBS
36    ${PROTOBUF_LIBRARIES}
37    )
38
39  add_clang_library(clangCXXLoopProto
40    ${LOOP_PROTO_SRCS}
41    ${LOOP_PROTO_HDRS}
42
43    LINK_LIBS
44    ${PROTOBUF_LIBRARIES}
45    )
46
47  # Build and include libprotobuf-mutator
48  include(ProtobufMutator)
49  include_directories(${ProtobufMutator_INCLUDE_DIRS})
50
51  # Build the protobuf->C++ translation library and driver.
52  add_clang_subdirectory(proto-to-cxx)
53
54  # Build the protobuf->LLVM IR translation library and driver.
55  add_clang_subdirectory(proto-to-llvm)
56  
57  # Build the fuzzer initialization library.
58  add_clang_subdirectory(fuzzer-initialize)
59
60  # Build the protobuf fuzzer
61  add_clang_executable(clang-proto-fuzzer
62    ${DUMMY_MAIN}
63    ExampleClangProtoFuzzer.cpp
64    )
65
66  # Build the loop protobuf fuzzer
67  add_clang_executable(clang-loop-proto-fuzzer
68    ${DUMMY_MAIN}
69    ExampleClangLoopProtoFuzzer.cpp
70    )
71
72  # Build the llvm protobuf fuzzer
73  add_clang_executable(clang-llvm-proto-fuzzer
74    ${DUMMY_MAIN}
75    ExampleClangLLVMProtoFuzzer.cpp
76    )
77
78  set(COMMON_PROTO_FUZZ_LIBRARIES
79    ${ProtobufMutator_LIBRARIES}
80    ${PROTOBUF_LIBRARIES}
81    ${LLVM_LIB_FUZZING_ENGINE}
82    clangFuzzerInitialize
83    )
84
85  target_link_libraries(clang-proto-fuzzer
86    PRIVATE
87    ${COMMON_PROTO_FUZZ_LIBRARIES}
88    clangHandleCXX
89    clangCXXProto
90    clangProtoToCXX
91    )
92  target_link_libraries(clang-loop-proto-fuzzer
93    PRIVATE
94    ${COMMON_PROTO_FUZZ_LIBRARIES}
95    clangHandleCXX
96    clangCXXLoopProto
97    clangLoopProtoToCXX
98    )
99  target_link_libraries(clang-llvm-proto-fuzzer
100    PRIVATE
101    ${COMMON_PROTO_FUZZ_LIBRARIES}
102    clangHandleLLVM
103    clangCXXLoopProto
104    clangLoopProtoToLLVM
105    )
106
107endif()
108
109add_clang_subdirectory(handle-cxx)
110add_clang_subdirectory(handle-llvm)
111
112add_clang_executable(clang-fuzzer
113  EXCLUDE_FROM_ALL
114  ${DUMMY_MAIN}
115  ClangFuzzer.cpp
116  )
117
118target_link_libraries(clang-fuzzer
119  PRIVATE
120  ${LLVM_LIB_FUZZING_ENGINE}
121  clangHandleCXX
122  )
123