Revision control
Copy as Markdown
Other Tools
ninja_required_version = 1.3
CXX = %{cxx}
LINKER = %{linker}
PYTHON_EXE = %{python_exe}
ABI_FLAGS = %{cc_sysroot} %{cxx_abi_flags}
LANG_FLAGS = %{cc_lang_flags} %{os_feature_macros}
LANG_EXE_FLAGS = %{cc_lang_binary_linker_flags}
CXXFLAGS = %{cc_compile_flags}
WARN_FLAGS = %{cc_warning_flags}
LDFLAGS = %{ldflags}
EXE_LINK_CMD = %{exe_link_cmd}
LIB_LINKS_TO = %{external_link_cmd} %{link_to}
BUILD_DIR_LINK_PATH = %{build_dir_link_path}
EXE_LINKS_TO = %{link_to_botan} ${LIB_LINKS_TO} %{extra_libs}
SCRIPTS_DIR = %{scripts_dir}
INSTALLED_LIB_DIR = %{libdir}
rule compile_lib
%{if header_deps_out}
depfile = $out.d
%{endif}
%{if ninja_header_deps_style}
deps = %{ninja_header_deps_style}
%{endif}
command = %{cxx} %{lib_flags} ${ABI_FLAGS} ${LANG_FLAGS} ${CXXFLAGS} -DBOTAN_IS_BEING_BUILT ${WARN_FLAGS} ${isa_flags} %{public_include_flags} %{internal_include_flags} %{external_include_flags} %{header_deps_flag} %{header_deps_out|concat: $out.d} %{dash_c} $in %{dash_o}$out
rule compile_exe
%{if header_deps_out}
depfile = $out.d
%{endif}
%{if ninja_header_deps_style}
deps = %{ninja_header_deps_style}
%{endif}
command = %{cxx} ${ABI_FLAGS} ${LANG_FLAGS} ${CXXFLAGS} -DBOTAN_IS_BEING_BUILT ${WARN_FLAGS} ${isa_flags} %{public_include_flags} %{internal_include_flags} %{external_include_flags} %{header_deps_flag} %{header_deps_out|concat: $out.d} %{dash_c} $in %{dash_o}$out
rule compile_example_exe
%{if header_deps_out}
depfile = $out.d
%{endif}
%{if ninja_header_deps_style}
deps = %{ninja_header_deps_style}
%{endif}
command = %{cxx} ${ABI_FLAGS} ${LANG_FLAGS} ${CXXFLAGS} ${WARN_FLAGS} ${isa_flags} %{public_include_flags} %{external_include_flags} %{header_deps_flag} %{header_deps_out|concat: $out.d} %{dash_c} $in %{dash_o}$out
# The primary target
build all: phony %{all_targets}
default all
# Library targets
%{if build_static_lib}
rule link_static
rspfile = %{response_file_dir}/static.txt
rspfile_content = $in
command = %{ar_command} %{ar_options} %{ar_output_to}$out @%{response_file_dir}/static.txt
build %{out_dir}/%{static_lib_name}: link_static %{join lib_objs}
%{endif}
%{if build_shared_lib}
rule link_shared
rspfile = %{response_file_dir}/shared.txt
rspfile_content = $in
command = %{lib_link_cmd} ${ABI_FLAGS} ${LDFLAGS} @%{response_file_dir}/shared.txt ${LIB_LINKS_TO} %{output_to_exe}$out
build %{out_dir}/%{shared_lib_name}: link_shared %{join lib_objs}
%{endif}
%{if symlink_shared_lib}
rule symlink
command = cd %{out_dir} && ln -fs $in $out
build %{out_dir}/%{soname_base}: symlink %{out_dir}/%{shared_lib_name}
build %{out_dir}/%{soname_patch}: symlink %{out_dir}/%{shared_lib_name}
%{endif}
rule link_cli
rspfile = %{response_file_dir}/cli_${cli_name}.txt
rspfile_content = $in
command = ${EXE_LINK_CMD} ${ABI_FLAGS} @%{response_file_dir}/cli_${cli_name}.txt ${BUILD_DIR_LINK_PATH} ${LANG_EXE_FLAGS} ${LDFLAGS} ${EXE_LINKS_TO} %{output_to_exe}$out
rule link_tests
rspfile = %{response_file_dir}/tests.txt
rspfile_content = $in
command = ${EXE_LINK_CMD} ${ABI_FLAGS} @%{response_file_dir}/tests.txt ${BUILD_DIR_LINK_PATH} ${LANG_EXE_FLAGS} ${LDFLAGS} %{test_exe_extra_ldflags} ${EXE_LINKS_TO} %{output_to_exe}$out
# Executable targets
build %{cli_exe}: link_cli %{join cli_objs} | libs
cli_name = cli
build %{test_exe}: link_tests %{join test_objs} | libs
%{if build_fuzzers}
build fuzzers: phony %{fuzzer_bin}
rule fuzzer_corpus
build fuzzer_corpus: fuzzer_corpus
rule fuzzer_corpus_zip
command = %{base_dir}/src/scripts/create_corpus_zip.py fuzzer_corpus %{fuzzobj_dir}
build fuzzer_corpus_zip: fuzzer_corpus_zip | fuzzer_corpus
rule link_fuzzer
command = ${EXE_LINK_CMD} ${ABI_FLAGS} $in ${BUILD_DIR_LINK_PATH} ${LANG_EXE_FLAGS} ${LDFLAGS} ${EXE_LINKS_TO} %{fuzzer_lib} %{output_to_exe}$out
%{endif}
%{if build_examples}
build examples: phony | %{example_bin}
%{endif}
%{if build_bogo_shim}
build botan_bogo_shim: link_cli bogo_shim_object | libs
cli_name = bogo
# BoGo shim
build %{out_dir}/bogo_shim_object: compile_exe %{bogo_shim_src}
%{endif}
%{if build_ct_selftest}
build botan_ct_selftest: link_cli ct_selftest_object | libs
cli_name = ct_selftest
build %{out_dir}/ct_selftest_object: compile_exe %{ct_selftest_src}
%{endif}
# Misc targets
rule build_docs
command = "${PYTHON_EXE}" "${SCRIPTS_DIR}/build_docs.py" --build-dir="%{build_dir}"
build %{doc_stamp_file}: build_docs
rule clean
command = "${PYTHON_EXE}" "${SCRIPTS_DIR}/cleanup.py" --build-dir="%{build_dir}"
rule distclean
command = "${PYTHON_EXE}" "${SCRIPTS_DIR}/cleanup.py" --build-dir="%{build_dir}" --distclean
rule install
command = "${PYTHON_EXE}" "${SCRIPTS_DIR}/install.py" --build-dir="%{build_dir}"
rule check
command = "${PYTHON_EXE}" "${SCRIPTS_DIR}/check.py" --build-dir="%{build_dir}"
rule fmt
command = "${PYTHON_EXE}" "${SCRIPTS_DIR}/dev_tools/run_clang_format.py"
rule tidy
command = "${PYTHON_EXE}" "${SCRIPTS_DIR}/dev_tools/run_clang_tidy.py" --only-changed-files
# Target aliases
build cli: phony %{cli_exe}
build tests: phony %{test_exe}
build bogo_shim: phony botan_bogo_shim
build ct_selftest: phony botan_ct_selftest
build libs: phony %{library_targets} $
%{if symlink_shared_lib}
%{out_dir}/%{soname_base} %{out_dir}/%{soname_patch}
%{endif}
build docs: phony %{doc_stamp_file}
build clean: clean
build distclean: distclean
build install: install | %{install_targets}
build check: check | tests
build fmt: fmt
build tidy: tidy
# Build Commands
%{for lib_build_info}
build %{obj}: compile_lib %{src}
isa_flags = %{isa_flags}
%{endfor}
%{for cli_build_info}
build %{obj}: compile_exe %{src}
%{endfor}
%{for test_build_info}
build %{obj}: compile_exe %{src}
%{endfor}
%{for fuzzer_build_info}
build %{obj}: compile_exe %{src}
build %{exe}: link_fuzzer %{obj} | libs
%{endfor}
%{for examples_build_info}
build %{obj}: compile_example_exe %{src}
build %{exe}: link_cli %{obj} | libs
cli_name = example_%{exe_basename}
%{endfor}