1cmake_minimum_required(VERSION 3.15) 2project(ninja) 3 4# --- optional link-time optimization 5if(CMAKE_BUILD_TYPE MATCHES "Release") 6 include(CheckIPOSupported) 7 check_ipo_supported(RESULT lto_supported OUTPUT error) 8 9 if(lto_supported) 10 message(STATUS "IPO / LTO enabled") 11 set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) 12 else() 13 message(STATUS "IPO / LTO not supported: <${error}>") 14 endif() 15endif() 16 17# --- compiler flags 18if(MSVC) 19 set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") 20 string(APPEND CMAKE_CXX_FLAGS " /W4 /GR- /Zc:__cplusplus") 21else() 22 include(CheckCXXCompilerFlag) 23 check_cxx_compiler_flag(-Wno-deprecated flag_no_deprecated) 24 if(flag_no_deprecated) 25 string(APPEND CMAKE_CXX_FLAGS " -Wno-deprecated") 26 endif() 27 check_cxx_compiler_flag(-fdiagnostics-color flag_color_diag) 28 if(flag_color_diag) 29 string(APPEND CMAKE_CXX_FLAGS " -fdiagnostics-color") 30 endif() 31endif() 32 33# --- optional re2c 34find_program(RE2C re2c) 35if(RE2C) 36 # the depfile parser and ninja lexers are generated using re2c. 37 function(re2c IN OUT) 38 add_custom_command(DEPENDS ${IN} OUTPUT ${OUT} 39 COMMAND ${RE2C} -b -i --no-generation-date -o ${OUT} ${IN} 40 ) 41 endfunction() 42 re2c(${PROJECT_SOURCE_DIR}/src/depfile_parser.in.cc ${PROJECT_BINARY_DIR}/depfile_parser.cc) 43 re2c(${PROJECT_SOURCE_DIR}/src/lexer.in.cc ${PROJECT_BINARY_DIR}/lexer.cc) 44 add_library(libninja-re2c OBJECT ${PROJECT_BINARY_DIR}/depfile_parser.cc ${PROJECT_BINARY_DIR}/lexer.cc) 45else() 46 message(WARNING "re2c was not found; changes to src/*.in.cc will not affect your build.") 47 add_library(libninja-re2c OBJECT src/depfile_parser.cc src/lexer.cc) 48endif() 49target_include_directories(libninja-re2c PRIVATE src) 50 51# Core source files all build into ninja library. 52add_library(libninja OBJECT 53 src/build_log.cc 54 src/build.cc 55 src/clean.cc 56 src/clparser.cc 57 src/dyndep.cc 58 src/dyndep_parser.cc 59 src/debug_flags.cc 60 src/deps_log.cc 61 src/disk_interface.cc 62 src/edit_distance.cc 63 src/eval_env.cc 64 src/graph.cc 65 src/graphviz.cc 66 src/line_printer.cc 67 src/manifest_parser.cc 68 src/metrics.cc 69 src/parser.cc 70 src/state.cc 71 src/string_piece_util.cc 72 src/util.cc 73 src/version.cc 74) 75if(WIN32) 76 target_sources(libninja PRIVATE 77 src/subprocess-win32.cc 78 src/includes_normalize-win32.cc 79 src/msvc_helper-win32.cc 80 src/msvc_helper_main-win32.cc 81 src/getopt.c 82 ) 83 if(MSVC) 84 target_sources(libninja PRIVATE src/minidump-win32.cc) 85 endif() 86else() 87 target_sources(libninja PRIVATE src/subprocess-posix.cc) 88endif() 89 90#Fixes GetActiveProcessorCount on MinGW 91if(MINGW) 92target_compile_definitions(libninja PRIVATE _WIN32_WINNT=0x0601 __USE_MINGW_ANSI_STDIO=1) 93endif() 94 95# Main executable is library plus main() function. 96add_executable(ninja src/ninja.cc) 97target_link_libraries(ninja PRIVATE libninja libninja-re2c) 98 99# Tests all build into ninja_test executable. 100add_executable(ninja_test 101 src/build_log_test.cc 102 src/build_test.cc 103 src/clean_test.cc 104 src/clparser_test.cc 105 src/depfile_parser_test.cc 106 src/deps_log_test.cc 107 src/disk_interface_test.cc 108 src/dyndep_parser_test.cc 109 src/edit_distance_test.cc 110 src/graph_test.cc 111 src/lexer_test.cc 112 src/manifest_parser_test.cc 113 src/ninja_test.cc 114 src/state_test.cc 115 src/string_piece_util_test.cc 116 src/subprocess_test.cc 117 src/test.cc 118 src/util_test.cc 119) 120if(WIN32) 121 target_sources(ninja_test PRIVATE src/includes_normalize_test.cc src/msvc_helper_test.cc) 122endif() 123target_link_libraries(ninja_test PRIVATE libninja libninja-re2c) 124 125foreach(perftest 126 build_log_perftest 127 canon_perftest 128 clparser_perftest 129 depfile_parser_perftest 130 hash_collision_bench 131 manifest_parser_perftest 132) 133 add_executable(${perftest} src/${perftest}.cc) 134 target_link_libraries(${perftest} PRIVATE libninja libninja-re2c) 135endforeach() 136 137enable_testing() 138add_test(NinjaTest ninja_test) 139 140install(TARGETS ninja DESTINATION bin) 141