• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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