Git fork
at reftables-rust 4010 lines 127 kB view raw
1# The default target of this Makefile is... 2all:: 3 4# Import tree-wide shared Makefile behavior and libraries 5include shared.mak 6 7# == Makefile defines == 8# 9# These defines change the behavior of the Makefile itself, but have 10# no impact on what it builds: 11# 12# Define V=1 to have a more verbose compile. 13# 14# == Portability and optional library defines == 15# 16# These defines indicate what Git can expect from the OS, what 17# libraries are available etc. Much of this is auto-detected in 18# config.mak.uname, or in configure.ac when using the optional "make 19# configure && ./configure" (see INSTALL). 20# 21# Define SHELL_PATH to a POSIX shell if your /bin/sh is broken. 22# 23# Define SANE_TOOL_PATH to a colon-separated list of paths to prepend 24# to PATH if your tools in /usr/bin are broken. 25# 26# Define SOCKLEN_T to a suitable type (such as 'size_t') if your 27# system headers do not define a socklen_t type. 28# 29# Define INLINE to a suitable substitute (such as '__inline' or '') if git 30# fails to compile with errors about undefined inline functions or similar. 31# 32# Define SNPRINTF_RETURNS_BOGUS if you are on a system which snprintf() 33# or vsnprintf() return -1 instead of number of characters which would 34# have been written to the final string if enough space had been available. 35# 36# Define FREAD_READS_DIRECTORIES if you are on a system which succeeds 37# when attempting to read from an fopen'ed directory (or even to fopen 38# it at all). 39# 40# Define OPEN_RETURNS_EINTR if your open() system call may return EINTR 41# when a signal is received (as opposed to restarting). 42# 43# Define NO_OPENSSL environment variable if you do not have OpenSSL. 44# 45# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header. 46# 47# Define HAVE_PATHS_H if you have paths.h and want to use the default PATH 48# it specifies. 49# 50# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks 51# d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7). 52# 53# Define HAVE_STRINGS_H if you have strings.h and need it for strcasecmp. 54# 55# Define NO_STRCASESTR if you don't have strcasestr. 56# 57# Define NO_MEMMEM if you don't have memmem. 58# 59# Define NO_GETPAGESIZE if you don't have getpagesize. 60# 61# Define NO_STRLCPY if you don't have strlcpy. 62# 63# Define NO_STRTOUMAX if you don't have both strtoimax and strtoumax in the 64# C library. If your compiler also does not support long long or does not have 65# strtoull, define NO_STRTOULL. 66# 67# Define NO_SETENV if you don't have setenv in the C library. 68# 69# Define NO_UNSETENV if you don't have unsetenv in the C library. 70# 71# Define NO_MKDTEMP if you don't have mkdtemp in the C library. 72# 73# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash. 74# 75# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd 76# in the C library. 77# 78# Define NO_LIBGEN_H if you don't have libgen.h. 79# 80# Define NEEDS_LIBGEN if your libgen needs -lgen when linking 81# 82# Define NO_SYS_SELECT_H if you don't have sys/select.h. 83# 84# Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link. 85# Enable it on Windows. By default, symrefs are still used. 86# 87# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability 88# tests. These tests take up a significant amount of the total test time 89# but are not needed unless you plan to talk to SVN repos. 90# 91# Define NO_FINK if you are building on Darwin/Mac OS X, have Fink 92# installed in /sw, but don't want GIT to link against any libraries 93# installed there. If defined you may specify your own (or Fink's) 94# include directories and library directories by defining CFLAGS 95# and LDFLAGS appropriately. 96# 97# Define NO_DARWIN_PORTS if you are building on Darwin/Mac OS X, 98# have DarwinPorts installed in /opt/local, but don't want GIT to 99# link against any libraries installed there. If defined you may 100# specify your own (or DarwinPort's) include directories and 101# library directories by defining CFLAGS and LDFLAGS appropriately. 102# 103# Define NO_APPLE_COMMON_CRYPTO if you are building on Darwin/Mac OS X 104# and do not want to use Apple's CommonCrypto library. This allows you 105# to provide your own OpenSSL library, for example from MacPorts. 106# 107# Define NEEDS_CRYPTO_WITH_SSL if you need -lcrypto when using -lssl (Darwin). 108# 109# Define NEEDS_SSL_WITH_CRYPTO if you need -lssl when using -lcrypto (Darwin). 110# 111# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin). 112# 113# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv. 114# 115# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t. 116# 117# Define NEEDS_SOCKET if linking with libc is not enough (SunOS, 118# Patrick Mauritz). 119# 120# Define NEEDS_RESOLV if linking with -lnsl and/or -lsocket is not enough. 121# Notably on Solaris hstrerror resides in libresolv and on Solaris 7 122# inet_ntop and inet_pton additionally reside there. 123# 124# Define NO_MMAP if you want to avoid mmap. 125# 126# Define MMAP_PREVENTS_DELETE if a file that is currently mmapped cannot be 127# deleted or cannot be replaced using rename(). 128# 129# Define NO_POLL_H if you don't have poll.h. 130# 131# Define NO_SYS_POLL_H if you don't have sys/poll.h. 132# 133# Define NO_POLL if you do not have or don't want to use poll(). 134# This also implies NO_POLL_H and NO_SYS_POLL_H. 135# 136# Define NEEDS_SYS_PARAM_H if you need to include sys/param.h to compile, 137# *PLEASE* REPORT to git@vger.kernel.org if your platform needs this; 138# we want to know more about the issue. 139# 140# Define NO_PTHREADS if you do not have or do not want to use Pthreads. 141# 142# Define NO_PREAD if you have a problem with pread() system call (e.g. 143# cygwin1.dll before v1.5.22). 144# 145# Define NO_SETITIMER if you don't have setitimer() 146# 147# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval 148# This also implies NO_SETITIMER 149# 150# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is 151# generally faster on your platform than accessing the working directory. 152# 153# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support 154# the executable mode bit, but doesn't really do so. 155# 156# Define CSPRNG_METHOD to "arc4random" if your system has arc4random and 157# arc4random_buf, "libbsd" if your system has those functions from libbsd, 158# "getrandom" if your system has getrandom, "getentropy" if your system has 159# getentropy, "rtlgenrandom" for RtlGenRandom (Windows only), or "openssl" if 160# you'd want to use the OpenSSL CSPRNG. You may set multiple options with 161# spaces, in which case a suitable option will be chosen. If unset or set to 162# anything else, defaults to using "/dev/urandom". 163# 164# Define NEEDS_MODE_TRANSLATION if your OS strays from the typical file type 165# bits in mode values (e.g. z/OS defines I_SFMT to 0xFF000000 as opposed to the 166# usual 0xF000). 167# 168# Define NO_IPV6 if you lack IPv6 support and getaddrinfo(). 169# 170# Define NO_UNIX_SOCKETS if your system does not offer unix sockets. 171# 172# Define NO_SOCKADDR_STORAGE if your platform does not have struct 173# sockaddr_storage. 174# 175# Define NO_ICONV if your libc does not properly support iconv. 176# 177# Define OLD_ICONV if your library has an old iconv(), where the second 178# (input buffer pointer) parameter is declared with type (const char **). 179# 180# Define ICONV_OMITS_BOM if your iconv implementation does not write a 181# byte-order mark (BOM) when writing UTF-16 or UTF-32 and always writes in 182# big-endian format. 183# 184# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound. Define 185# ZLIB_NG if you want to use zlib-ng instead of zlib. 186# 187# Define NO_NORETURN if using buggy versions of gcc 4.6+ and profile feedback, 188# as the compiler can crash (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49299) 189# 190# Define USE_NSEC below if you want git to care about sub-second file mtimes 191# and ctimes. Note that you need recent glibc (at least 2.2.4) for this. On 192# Linux, kernel 2.6.11 or newer is required for reliable sub-second file times 193# on file systems with exactly 1 ns or 1 s resolution. If you intend to use Git 194# on other file systems (e.g. CEPH, CIFS, NTFS, UDF), don't enable USE_NSEC. See 195# Documentation/technical/racy-git.adoc for details. 196# 197# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of 198# "st_ctim" 199# 200# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec" 201# available. This automatically turns USE_NSEC off. 202# 203# Define USE_STDEV below if you want git to care about the underlying device 204# change being considered an inode change from the update-index perspective. 205# 206# Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks 207# field that counts the on-disk footprint in 512-byte blocks. 208# 209# Define USE_ASCIIDOCTOR to use Asciidoctor instead of AsciiDoc to build the 210# documentation. 211# 212# Define ASCIIDOCTOR_EXTENSIONS_LAB to point to the location of the Asciidoctor 213# Extensions Lab if you have it available. 214# 215# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl). 216# 217# Define NO_PERL if you do not want Perl scripts or libraries at all. 218# 219# Define NO_PERL_CPAN_FALLBACKS if you do not want to install bundled 220# copies of CPAN modules that serve as a fallback in case the modules 221# are not available on the system. This option is intended for 222# distributions that want to use their packaged versions of Perl 223# modules, instead of the fallbacks shipped with Git. 224# 225# Define NO_GITWEB if you do not want to build or install 226# 'gitweb'. Note that defining NO_PERL currently has the same effect 227# on not installing gitweb, but not on whether it's built in the 228# gitweb/ directory. 229# 230# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python 231# but /usr/bin/python2.7 or /usr/bin/python3 on some platforms). 232# 233# Define NO_PYTHON if you do not want Python scripts or libraries at all. 234# 235# Define NO_TCLTK if you do not want Tcl/Tk GUI. 236# 237# The TCL_PATH variable governs the location of the Tcl interpreter 238# used to optimize git-gui for your system. Only used if NO_TCLTK 239# is not set. Defaults to the bare 'tclsh'. 240# 241# The TCLTK_PATH variable governs the location of the Tcl/Tk interpreter. 242# If not set it defaults to the bare 'wish'. If it is set to the empty 243# string then NO_TCLTK will be forced (this is used by configure script). 244# 245# Define INTERNAL_QSORT to use Git's implementation of qsort(), which 246# is a simplified version of the merge sort used in glibc. This is 247# recommended if Git triggers O(n^2) behavior in your platform's qsort(). 248# 249# Define HAVE_ISO_QSORT_S if your platform provides a qsort_s() that's 250# compatible with the one described in C11 Annex K. 251# 252# Define UNRELIABLE_FSTAT if your system's fstat does not return the same 253# information on a not yet closed file that lstat would return for the same 254# file after it was closed. 255# 256# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems 257# when hardlinking a file to another name and unlinking the original file right 258# away (some NTFS drivers seem to zero the contents in that scenario). 259# 260# Define INSTALL_SYMLINKS if you prefer to have everything that can be 261# symlinked between bin/ and libexec/ to use relative symlinks between 262# the two. This option overrides NO_CROSS_DIRECTORY_HARDLINKS and 263# NO_INSTALL_HARDLINKS which will also use symlinking by indirection 264# within the same directory in some cases, INSTALL_SYMLINKS will 265# always symlink to the final target directly. 266# 267# Define NO_CROSS_DIRECTORY_HARDLINKS if you plan to distribute the installed 268# programs as a tar, where bin/ and libexec/ might be on different file systems. 269# 270# Define NO_INSTALL_HARDLINKS if you prefer to use either symbolic links or 271# copies to install built-in git commands e.g. git-cat-file. 272# 273# Define SKIP_DASHED_BUILT_INS if you do not need the dashed versions of the 274# built-ins to be linked/copied at all. 275# 276# Define USE_NED_ALLOCATOR if you want to replace the platforms default 277# memory allocators with the nedmalloc allocator written by Niall Douglas. 278# 279# Define OVERRIDE_STRDUP to override the libc version of strdup(3). 280# This is necessary when using a custom allocator in order to avoid 281# crashes due to allocation and free working on different 'heaps'. 282# It's defined automatically if USE_NED_ALLOCATOR is set. 283# 284# Define NO_REGEX if your C library lacks regex support with REG_STARTEND 285# feature. 286# 287# Define USE_ENHANCED_BASIC_REGULAR_EXPRESSIONS if your C library provides 288# the flag REG_ENHANCED and you'd like to use it to enable enhanced basic 289# regular expressions. 290# 291# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the 292# user. 293# 294# Define JSMIN to point to JavaScript minifier that functions as 295# a filter to have gitweb.js minified. 296# 297# Define CSSMIN to point to a CSS minifier in order to generate a minified 298# version of gitweb.css 299# 300# Define DEFAULT_PAGER to a sensible pager command (defaults to "less") if 301# you want to use something different. The value will be interpreted by the 302# shell at runtime when it is used. 303# 304# Define DEFAULT_EDITOR to a sensible editor command (defaults to "vi") if you 305# want to use something different. The value will be interpreted by the shell 306# if necessary when it is used. Examples: 307# 308# DEFAULT_EDITOR='~/bin/vi', 309# DEFAULT_EDITOR='$GIT_FALLBACK_EDITOR', 310# DEFAULT_EDITOR='"C:\Program Files\Vim\gvim.exe" --nofork' 311# 312# Define COMPUTE_HEADER_DEPENDENCIES to "yes" if you want dependencies on 313# header files to be automatically computed, to avoid rebuilding objects when 314# an unrelated header file changes. Define it to "no" to use the hard-coded 315# dependency rules. The default is "auto", which means to use computed header 316# dependencies if your compiler is detected to support it. 317# 318# Define NATIVE_CRLF if your platform uses CRLF for line endings. 319# 320# Define GIT_USER_AGENT if you want to change how git identifies itself during 321# network interactions. The default is "git/$(GIT_VERSION)". 322# 323# Define DEFAULT_HELP_FORMAT to "man", "info" or "html" 324# (defaults to "man") if you want to have a different default when 325# "git help" is called without a parameter specifying the format. 326# 327# Define GIT_TEST_INDEX_VERSION to 2, 3 or 4 to run the test suite 328# with a different indexfile format version. If it isn't set the index 329# file format used is index-v[23]. 330# 331# Define GIT_TEST_UTF8_LOCALE to preferred utf-8 locale for testing. 332# If it isn't set, fallback to $LC_ALL, $LANG or use the first utf-8 333# locale returned by "locale -a". 334# 335# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime. 336# 337# Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC. 338# 339# Define HAVE_SYNC_FILE_RANGE if your platform has sync_file_range. 340# 341# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function. 342# 343# Define HAVE_GETDELIM if your system has the getdelim() function. 344# 345# Define FILENO_IS_A_MACRO if fileno() is a macro, not a real function. 346# 347# Define NEED_ACCESS_ROOT_HANDLER if access() under root may success for X_OK 348# even if execution permission isn't granted for any user. 349# 350# Define PAGER_ENV to a SP separated VAR=VAL pairs to define 351# default environment variables to be passed when a pager is spawned, e.g. 352# 353# PAGER_ENV = LESS=FRX LV=-c 354# 355# to say "export LESS=FRX (and LV=-c) if the environment variable 356# LESS (and LV) is not set, respectively". 357# 358# Define TEST_SHELL_PATH if you want to use a shell besides SHELL_PATH for 359# running the test scripts (e.g., bash has better support for "set -x" 360# tracing). 361# 362# When cross-compiling, define HOST_CPU as the canonical name of the CPU on 363# which the built Git will run (for instance "x86_64"). 364# 365# Define RUNTIME_PREFIX to configure Git to resolve its ancillary tooling and 366# support files relative to the location of the runtime binary, rather than 367# hard-coding them into the binary. Git installations built with RUNTIME_PREFIX 368# can be moved to arbitrary filesystem locations. RUNTIME_PREFIX also causes 369# Perl scripts to use a modified entry point header allowing them to resolve 370# support files at runtime. 371# 372# When using RUNTIME_PREFIX, define HAVE_BSD_KERN_PROC_SYSCTL if your platform 373# supports the KERN_PROC BSD sysctl function. 374# 375# When using RUNTIME_PREFIX, define PROCFS_EXECUTABLE_PATH if your platform 376# mounts a "procfs" filesystem capable of resolving the path of the current 377# executable. If defined, this must be the canonical path for the "procfs" 378# current executable path. 379# 380# When using RUNTIME_PREFIX, define HAVE_NS_GET_EXECUTABLE_PATH if your platform 381# supports calling _NSGetExecutablePath to retrieve the path of the running 382# executable. 383# 384# When using RUNTIME_PREFIX, define HAVE_ZOS_GET_EXECUTABLE_PATH if your platform 385# supports calling __getprogramdir and getprogname to retrieve the path of the 386# running executable. 387# 388# When using RUNTIME_PREFIX, define HAVE_WPGMPTR if your platform offers 389# the global variable _wpgmptr containing the absolute path of the current 390# executable (this is the case on Windows). 391# 392# INSTALL_STRIP can be set to "-s" to strip binaries during installation, 393# if your $(INSTALL) command supports the option. 394# 395# Define GENERATE_COMPILATION_DATABASE to "yes" to generate JSON compilation 396# database entries during compilation if your compiler supports it, using the 397# `-MJ` flag. The JSON entries will be placed in the `compile_commands/` 398# directory, and the JSON compilation database 'compile_commands.json' will be 399# created at the root of the repository. 400# 401# If your platform supports a built-in fsmonitor backend, set 402# FSMONITOR_DAEMON_BACKEND to the "<name>" of the corresponding 403# `compat/fsmonitor/fsm-listen-<name>.c` and 404# `compat/fsmonitor/fsm-health-<name>.c` files 405# that implement the `fsm_listen__*()` and `fsm_health__*()` routines. 406# 407# If your platform has OS-specific ways to tell if a repo is incompatible with 408# fsmonitor (whether the hook or IPC daemon version), set FSMONITOR_OS_SETTINGS 409# to the "<name>" of the corresponding `compat/fsmonitor/fsm-settings-<name>.c` 410# that implements the `fsm_os_settings__*()` routines. 411# 412# Define LINK_FUZZ_PROGRAMS if you want `make all` to also build the fuzz test 413# programs in oss-fuzz/. 414# 415# Define INCLUDE_LIBGIT_RS if you want `make all` and `make test` to build and 416# test the Rust crates in contrib/libgit-sys and contrib/libgit-rs. 417# 418# === Optional library: libintl === 419# 420# Define NO_GETTEXT if you don't want Git output to be translated. 421# A translated Git requires GNU libintl or another gettext implementation, 422# plus libintl-perl at runtime. 423# 424# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust 425# the installed gettext translation of the shell scripts output. 426# 427# Define HAVE_LIBCHARSET_H if you haven't set NO_GETTEXT and you can't 428# trust the langinfo.h's nl_langinfo(CODESET) function to return the 429# current character set. GNU and Solaris have a nl_langinfo(CODESET), 430# FreeBSD can use either, but MinGW and some others need to use 431# libcharset.h's locale_charset() instead. 432# 433# Define CHARSET_LIB to the library you need to link with in order to 434# use locale_charset() function. On some platforms this needs to set to 435# -lcharset, on others to -liconv . 436# 437# Define LIBC_CONTAINS_LIBINTL if your gettext implementation doesn't 438# need -lintl when linking. 439# 440# Define NO_MSGFMT_EXTENDED_OPTIONS if your implementation of msgfmt 441# doesn't support GNU extensions like --check and --statistics 442# 443# === Optional library: libexpat === 444# 445# Define NO_EXPAT if you do not have expat installed. git-http-push is 446# not built, and you cannot push using http:// and https:// transports (dumb). 447# 448# Define EXPATDIR=/foo/bar if your expat header and library files are in 449# /foo/bar/include and /foo/bar/lib directories. 450# 451# Define EXPAT_NEEDS_XMLPARSE_H if you have an old version of expat (e.g., 452# 1.1 or 1.2) that provides xmlparse.h instead of expat.h. 453 454# === Optional library: libcurl === 455# 456# Define NO_CURL if you do not have libcurl installed. git-http-fetch and 457# git-http-push are not built, and you cannot use http:// and https:// 458# transports (neither smart nor dumb). 459# 460# Define CURLDIR=/foo/bar if your curl header and library files are in 461# /foo/bar/include and /foo/bar/lib directories. 462# 463# Define CURL_CONFIG to curl's configuration program that prints information 464# about the library (e.g., its version number). The default is 'curl-config'. 465# 466# Define CURL_LDFLAGS to specify flags that you need to link when using libcurl, 467# if you do not want to rely on the libraries provided by CURL_CONFIG. The 468# default value is a result of `curl-config --libs`. An example value for 469# CURL_LDFLAGS is as follows: 470# 471# CURL_LDFLAGS=-lcurl 472# 473# === Optional library: libpcre2 === 474# 475# Define USE_LIBPCRE if you have and want to use libpcre. Various 476# commands such as log and grep offer runtime options to use 477# Perl-compatible regular expressions instead of standard or extended 478# POSIX regular expressions. 479# 480# Only libpcre version 2 is supported. USE_LIBPCRE2 is a synonym for 481# USE_LIBPCRE, support for the old USE_LIBPCRE1 has been removed. 482# 483# Define LIBPCREDIR=/foo/bar if your PCRE header and library files are 484# in /foo/bar/include and /foo/bar/lib directories. 485# 486# == Optional Rust support == 487# 488# Define WITH_RUST if you want to include features and subsystems written in 489# Rust into Git. For now, Rust is still an optional feature of the build 490# process. With Git 3.0 though, Rust will always be enabled. 491# 492# Building Rust code requires Cargo. 493# 494# == SHA-1 and SHA-256 defines == 495# 496# === SHA-1 backend === 497# 498# ==== Security ==== 499# 500# Due to the SHAttered (https://shattered.io) attack vector on SHA-1 501# it's strongly recommended to use the sha1collisiondetection 502# counter-cryptanalysis library for SHA-1 hashing. 503# 504# If you know that you can trust the repository contents, or where 505# potential SHA-1 attacks are otherwise mitigated the other backends 506# listed in "SHA-1 implementations" are faster than 507# sha1collisiondetection. 508# 509# ==== Default SHA-1 backend ==== 510# 511# If no *_SHA1 backend is picked, the first supported one listed in 512# "SHA-1 implementations" will be picked. 513# 514# ==== Options common to all SHA-1 implementations ==== 515# 516# Define SHA1_MAX_BLOCK_SIZE to limit the amount of data that will be hashed 517# in one call to the platform's SHA1_Update(). e.g. APPLE_COMMON_CRYPTO 518# wants 'SHA1_MAX_BLOCK_SIZE=1024L*1024L*1024L' defined. 519# 520# ==== SHA-1 implementations ==== 521# 522# Define OPENSSL_SHA1 to link to the SHA-1 routines from the OpenSSL 523# library. 524# 525# Define BLK_SHA1 to make use of optimized C SHA-1 routines bundled 526# with git (in the block-sha1/ directory). 527# 528# Define APPLE_COMMON_CRYPTO_SHA1 to use Apple's CommonCrypto for 529# SHA-1. 530# 531# Define the same Makefile knobs as above, but suffixed with _UNSAFE to 532# use the corresponding implementations for unsafe SHA-1 hashing for 533# non-cryptographic purposes. 534# 535# If don't enable any of the *_SHA1 settings in this section, Git will 536# default to its built-in sha1collisiondetection library, which is a 537# collision-detecting sha1 This is slower, but may detect attempted 538# collision attacks. 539# 540# ==== Options for the sha1collisiondetection library ==== 541# 542# Define DC_SHA1_EXTERNAL if you want to build / link 543# git with the external SHA1 collision-detect library. 544# Without this option, i.e. the default behavior is to build git with its 545# own built-in code (or submodule). 546# 547# Define DC_SHA1_SUBMODULE to use the 548# sha1collisiondetection shipped as a submodule instead of the 549# non-submodule copy in sha1dc/. This is an experimental option used 550# by the git project to migrate to using sha1collisiondetection as a 551# submodule. 552# 553# === SHA-256 backend === 554# 555# ==== Security ==== 556# 557# Unlike SHA-1 the SHA-256 algorithm does not suffer from any known 558# vulnerabilities, so any implementation will do. 559# 560# ==== SHA-256 implementations ==== 561# 562# Define OPENSSL_SHA256 to use the SHA-256 routines in OpenSSL. 563# 564# Define NETTLE_SHA256 to use the SHA-256 routines in libnettle. 565# 566# Define GCRYPT_SHA256 to use the SHA-256 routines in libgcrypt. 567# 568# If don't enable any of the *_SHA256 settings in this section, Git 569# will default to its built-in sha256 implementation. 570# 571# == DEVELOPER defines == 572# 573# Define DEVELOPER to enable more compiler warnings. Compiler version 574# and family are auto detected, but could be overridden by defining 575# COMPILER_FEATURES (see config.mak.dev). You can still set 576# CFLAGS="..." in combination with DEVELOPER enables, whether that's 577# for tweaking something unrelated (e.g. optimization level), or for 578# selectively overriding something DEVELOPER or one of the DEVOPTS 579# (see just below) brings in. 580# 581# When DEVELOPER is set, DEVOPTS can be used to control compiler 582# options. This variable contains keywords separated by 583# whitespace. The following keywords are recognized: 584# 585# no-error: 586# 587# suppresses the -Werror that implicitly comes with 588# DEVELOPER=1. Useful for getting the full set of errors 589# without immediately dying, or for logging them. 590# 591# extra-all: 592# 593# The DEVELOPER mode enables -Wextra with a few exceptions. By 594# setting this flag the exceptions are removed, and all of 595# -Wextra is used. 596# 597# no-pedantic: 598# 599# Disable -pedantic compilation. 600 601# Set our default configuration. 602# 603# Among the variables below, these: 604# gitexecdir 605# template_dir 606# sysconfdir 607# can be specified as a relative path some/where/else; 608# this is interpreted as relative to $(prefix) and "git" built with 609# RUNTIME_PREFIX flag will figure out (at runtime) where they are 610# based on the path to the executable. 611# Additionally, the following will be treated as relative by "git" if they 612# begin with "$(prefix)/": 613# mandir 614# infodir 615# htmldir 616# localedir 617# perllibdir 618# This can help installing the suite in a relocatable way. 619 620prefix = $(HOME) 621bindir = $(prefix)/bin 622mandir = $(prefix)/share/man 623infodir = $(prefix)/share/info 624bash_completion_dir = $(prefix)/share/bash-completion/completions 625gitexecdir = libexec/git-core 626mergetoolsdir = $(gitexecdir)/mergetools 627sharedir = $(prefix)/share 628gitwebdir = $(sharedir)/gitweb 629gitwebstaticdir = $(gitwebdir)/static 630perllibdir = $(sharedir)/perl5 631localedir = $(sharedir)/locale 632template_dir = share/git-core/templates 633htmldir = $(prefix)/share/doc/git-doc 634ETC_GITCONFIG = $(sysconfdir)/gitconfig 635ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes 636lib = lib 637# DESTDIR = 638pathsep = : 639 640bindir_relative = $(patsubst $(prefix)/%,%,$(bindir)) 641mandir_relative = $(patsubst $(prefix)/%,%,$(mandir)) 642infodir_relative = $(patsubst $(prefix)/%,%,$(infodir)) 643gitexecdir_relative = $(patsubst $(prefix)/%,%,$(gitexecdir)) 644localedir_relative = $(patsubst $(prefix)/%,%,$(localedir)) 645htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir)) 646perllibdir_relative = $(patsubst $(prefix)/%,%,$(perllibdir)) 647 648export prefix bindir sharedir sysconfdir perllibdir localedir 649 650# Set our default programs 651CC = cc 652AR = ar 653RM = rm -f 654DIFF = diff 655TAR = tar 656FIND = find 657INSTALL = install 658TCL_PATH = tclsh 659TCLTK_PATH = wish 660XGETTEXT = xgettext 661MSGCAT = msgcat 662MSGFMT = msgfmt 663MSGMERGE = msgmerge 664CURL_CONFIG = curl-config 665GCOV = gcov 666STRIP = strip 667SPATCH = spatch 668LD = ld 669OBJCOPY = objcopy 670 671export TCL_PATH TCLTK_PATH 672 673# Set our default LIBS variables 674PTHREAD_LIBS = -lpthread 675 676# Guard against environment variables 677BUILTIN_OBJS = 678BUILT_INS = 679COMPAT_CFLAGS = 680COMPAT_OBJS = 681XDIFF_OBJS = 682GENERATED_H = 683EXTRA_CPPFLAGS = 684FUZZ_OBJS = 685FUZZ_PROGRAMS = 686GIT_OBJS = 687LIB_OBJS = 688LIBGIT_PUB_OBJS = 689SCALAR_OBJS = 690OBJECTS = 691OTHER_PROGRAMS = 692PROGRAM_OBJS = 693PROGRAMS = 694RUST_SOURCES = 695EXCLUDED_PROGRAMS = 696SCRIPT_PERL = 697SCRIPT_PYTHON = 698SCRIPT_SH = 699SCRIPT_LIB = 700TEST_BUILTINS_OBJS = 701TEST_OBJS = 702TEST_PROGRAMS_NEED_X = 703THIRD_PARTY_SOURCES = 704UNIT_TEST_PROGRAMS = 705UNIT_TEST_DIR = t/unit-tests 706UNIT_TEST_BIN = $(UNIT_TEST_DIR)/bin 707 708# Having this variable in your environment would break pipelines because 709# you cause "cd" to echo its destination to stdout. It can also take 710# scripts to unexpected places. If you like CDPATH, define it for your 711# interactive shell sessions without exporting it. 712unexport CDPATH 713 714SCRIPT_SH += git-difftool--helper.sh 715SCRIPT_SH += git-filter-branch.sh 716SCRIPT_SH += git-merge-octopus.sh 717SCRIPT_SH += git-merge-one-file.sh 718SCRIPT_SH += git-merge-resolve.sh 719SCRIPT_SH += git-mergetool.sh 720SCRIPT_SH += git-quiltimport.sh 721SCRIPT_SH += git-request-pull.sh 722SCRIPT_SH += git-submodule.sh 723SCRIPT_SH += git-web--browse.sh 724 725SCRIPT_LIB += git-mergetool--lib 726SCRIPT_LIB += git-sh-i18n 727SCRIPT_LIB += git-sh-setup 728 729SCRIPT_PERL += git-archimport.perl 730SCRIPT_PERL += git-cvsexportcommit.perl 731SCRIPT_PERL += git-cvsimport.perl 732SCRIPT_PERL += git-cvsserver.perl 733SCRIPT_PERL += git-send-email.perl 734SCRIPT_PERL += git-svn.perl 735 736SCRIPT_PYTHON += git-p4.py 737 738# Generated files for scripts 739SCRIPT_SH_GEN = $(patsubst %.sh,%,$(SCRIPT_SH)) 740SCRIPT_PERL_GEN = $(patsubst %.perl,%,$(SCRIPT_PERL)) 741SCRIPT_PYTHON_GEN = $(patsubst %.py,%,$(SCRIPT_PYTHON)) 742 743# Individual rules to allow e.g. 744# "make -C ../.. SCRIPT_PERL=contrib/foo/bar.perl build-perl-script" 745# from subdirectories like contrib/*/ 746.PHONY: build-perl-script build-sh-script build-python-script 747build-perl-script: $(SCRIPT_PERL_GEN) 748build-sh-script: $(SCRIPT_SH_GEN) 749build-python-script: $(SCRIPT_PYTHON_GEN) 750 751.PHONY: install-perl-script install-sh-script install-python-script 752install-sh-script: $(SCRIPT_SH_GEN) 753 $(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' 754install-perl-script: $(SCRIPT_PERL_GEN) 755 $(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' 756install-python-script: $(SCRIPT_PYTHON_GEN) 757 $(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' 758 759.PHONY: clean-perl-script clean-sh-script clean-python-script 760clean-sh-script: 761 $(RM) $(SCRIPT_SH_GEN) 762clean-perl-script: 763 $(RM) $(SCRIPT_PERL_GEN) 764clean-python-script: 765 $(RM) $(SCRIPT_PYTHON_GEN) 766 767SCRIPTS = $(SCRIPT_SH_GEN) \ 768 $(SCRIPT_PERL_GEN) \ 769 $(SCRIPT_PYTHON_GEN) \ 770 git-instaweb 771 772ETAGS_TARGET = TAGS 773 774# Empty... 775EXTRA_PROGRAMS = 776 777# ... and all the rest that could be moved out of bindir to gitexecdir 778PROGRAMS += $(EXTRA_PROGRAMS) 779 780PROGRAM_OBJS += daemon.o 781PROGRAM_OBJS += http-backend.o 782PROGRAM_OBJS += imap-send.o 783PROGRAM_OBJS += sh-i18n--envsubst.o 784PROGRAM_OBJS += shell.o 785.PHONY: program-objs 786program-objs: $(PROGRAM_OBJS) 787 788# Binary suffix, set to .exe for Windows builds 789X = 790 791PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS)) 792 793TEST_BUILTINS_OBJS += test-advise.o 794TEST_BUILTINS_OBJS += test-bitmap.o 795TEST_BUILTINS_OBJS += test-bloom.o 796TEST_BUILTINS_OBJS += test-bundle-uri.o 797TEST_BUILTINS_OBJS += test-cache-tree.o 798TEST_BUILTINS_OBJS += test-chmtime.o 799TEST_BUILTINS_OBJS += test-config.o 800TEST_BUILTINS_OBJS += test-crontab.o 801TEST_BUILTINS_OBJS += test-csprng.o 802TEST_BUILTINS_OBJS += test-date.o 803TEST_BUILTINS_OBJS += test-delete-gpgsig.o 804TEST_BUILTINS_OBJS += test-delta.o 805TEST_BUILTINS_OBJS += test-dir-iterator.o 806TEST_BUILTINS_OBJS += test-drop-caches.o 807TEST_BUILTINS_OBJS += test-dump-cache-tree.o 808TEST_BUILTINS_OBJS += test-dump-fsmonitor.o 809TEST_BUILTINS_OBJS += test-dump-split-index.o 810TEST_BUILTINS_OBJS += test-dump-untracked-cache.o 811TEST_BUILTINS_OBJS += test-env-helper.o 812TEST_BUILTINS_OBJS += test-example-tap.o 813TEST_BUILTINS_OBJS += test-find-pack.o 814TEST_BUILTINS_OBJS += test-fsmonitor-client.o 815TEST_BUILTINS_OBJS += test-genrandom.o 816TEST_BUILTINS_OBJS += test-genzeros.o 817TEST_BUILTINS_OBJS += test-getcwd.o 818TEST_BUILTINS_OBJS += test-hash-speed.o 819TEST_BUILTINS_OBJS += test-hash.o 820TEST_BUILTINS_OBJS += test-hashmap.o 821TEST_BUILTINS_OBJS += test-hexdump.o 822TEST_BUILTINS_OBJS += test-json-writer.o 823TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o 824TEST_BUILTINS_OBJS += test-match-trees.o 825TEST_BUILTINS_OBJS += test-mergesort.o 826TEST_BUILTINS_OBJS += test-mktemp.o 827TEST_BUILTINS_OBJS += test-name-hash.o 828TEST_BUILTINS_OBJS += test-online-cpus.o 829TEST_BUILTINS_OBJS += test-pack-deltas.o 830TEST_BUILTINS_OBJS += test-pack-mtimes.o 831TEST_BUILTINS_OBJS += test-parse-options.o 832TEST_BUILTINS_OBJS += test-parse-pathspec-file.o 833TEST_BUILTINS_OBJS += test-partial-clone.o 834TEST_BUILTINS_OBJS += test-path-utils.o 835TEST_BUILTINS_OBJS += test-path-walk.o 836TEST_BUILTINS_OBJS += test-pcre2-config.o 837TEST_BUILTINS_OBJS += test-pkt-line.o 838TEST_BUILTINS_OBJS += test-proc-receive.o 839TEST_BUILTINS_OBJS += test-progress.o 840TEST_BUILTINS_OBJS += test-reach.o 841TEST_BUILTINS_OBJS += test-read-cache.o 842TEST_BUILTINS_OBJS += test-read-graph.o 843TEST_BUILTINS_OBJS += test-read-midx.o 844TEST_BUILTINS_OBJS += test-ref-store.o 845TEST_BUILTINS_OBJS += test-reftable.o 846TEST_BUILTINS_OBJS += test-regex.o 847TEST_BUILTINS_OBJS += test-rot13-filter.o 848TEST_BUILTINS_OBJS += test-repository.o 849TEST_BUILTINS_OBJS += test-revision-walking.o 850TEST_BUILTINS_OBJS += test-run-command.o 851TEST_BUILTINS_OBJS += test-scrap-cache-tree.o 852TEST_BUILTINS_OBJS += test-serve-v2.o 853TEST_BUILTINS_OBJS += test-sha1.o 854TEST_BUILTINS_OBJS += test-sha256.o 855TEST_BUILTINS_OBJS += test-sigchain.o 856TEST_BUILTINS_OBJS += test-simple-ipc.o 857TEST_BUILTINS_OBJS += test-string-list.o 858TEST_BUILTINS_OBJS += test-submodule-config.o 859TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o 860TEST_BUILTINS_OBJS += test-submodule.o 861TEST_BUILTINS_OBJS += test-subprocess.o 862TEST_BUILTINS_OBJS += test-trace2.o 863TEST_BUILTINS_OBJS += test-truncate.o 864TEST_BUILTINS_OBJS += test-userdiff.o 865TEST_BUILTINS_OBJS += test-wildmatch.o 866TEST_BUILTINS_OBJS += test-windows-named-pipe.o 867TEST_BUILTINS_OBJS += test-write-cache.o 868TEST_BUILTINS_OBJS += test-xml-encode.o 869TEST_BUILTINS_OBJS += test-zlib.o 870 871# Do not add more tests here unless they have extra dependencies. Add 872# them in TEST_BUILTINS_OBJS above. 873TEST_PROGRAMS_NEED_X += test-fake-ssh 874TEST_PROGRAMS_NEED_X += test-tool 875 876TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X)) 877 878# List built-in command $C whose implementation cmd_$C() is not in 879# builtin/$C.o but is linked in as part of some other command. 880BUILT_INS += $(patsubst builtin/%.o,git-%$X,$(BUILTIN_OBJS)) 881 882BUILT_INS += git-cherry$X 883BUILT_INS += git-cherry-pick$X 884BUILT_INS += git-format-patch$X 885BUILT_INS += git-fsck-objects$X 886BUILT_INS += git-init$X 887BUILT_INS += git-maintenance$X 888BUILT_INS += git-merge-subtree$X 889BUILT_INS += git-restore$X 890BUILT_INS += git-show$X 891BUILT_INS += git-stage$X 892BUILT_INS += git-status$X 893BUILT_INS += git-switch$X 894BUILT_INS += git-version$X 895ifndef WITH_BREAKING_CHANGES 896BUILT_INS += git-whatchanged$X 897endif 898 899# what 'all' will build but not install in gitexecdir 900OTHER_PROGRAMS += git$X 901OTHER_PROGRAMS += scalar$X 902 903# what test wrappers are needed and 'install' will install, in bindir 904BINDIR_PROGRAMS_NEED_X += git 905BINDIR_PROGRAMS_NEED_X += scalar 906BINDIR_PROGRAMS_NEED_X += git-receive-pack 907BINDIR_PROGRAMS_NEED_X += git-shell 908BINDIR_PROGRAMS_NEED_X += git-upload-archive 909BINDIR_PROGRAMS_NEED_X += git-upload-pack 910 911BINDIR_PROGRAMS_NO_X += git-cvsserver 912 913# Set paths to tools early so that they can be used for version tests. 914ifndef SHELL_PATH 915 SHELL_PATH = /bin/sh 916endif 917ifndef PERL_PATH 918 PERL_PATH = /usr/bin/perl 919endif 920ifndef PYTHON_PATH 921 PYTHON_PATH = /usr/bin/python 922endif 923 924export PERL_PATH 925export PYTHON_PATH 926 927TEST_SHELL_PATH = $(SHELL_PATH) 928 929LIB_FILE = libgit.a 930 931ifdef DEBUG 932RUST_TARGET_DIR = target/debug 933else 934RUST_TARGET_DIR = target/release 935endif 936 937ifeq ($(uname_S),Windows) 938RUST_LIB = $(RUST_TARGET_DIR)/gitcore.lib 939else 940RUST_LIB = $(RUST_TARGET_DIR)/libgitcore.a 941endif 942 943GITLIBS = common-main.o $(LIB_FILE) 944EXTLIBS = 945 946GIT_USER_AGENT = git/$(GIT_VERSION) 947 948ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/sha1.h) 949DC_SHA1_SUBMODULE = auto 950endif 951 952# Set CFLAGS, LDFLAGS and other *FLAGS variables. These might be 953# tweaked by config.* below as well as the command-line, both of 954# which'll override these defaults. 955# Older versions of GCC may require adding "-std=gnu99" at the end. 956CFLAGS = -g -O2 -Wall 957LDFLAGS = 958CC_LD_DYNPATH = -Wl,-rpath, 959BASIC_CFLAGS = -I. 960BASIC_LDFLAGS = 961 962# library flags 963ARFLAGS = rcs 964PTHREAD_CFLAGS = 965 966# Rust flags 967CARGO_ARGS = 968ifndef V 969CARGO_ARGS += --quiet 970endif 971ifndef DEBUG 972CARGO_ARGS += --release 973endif 974 975# For the 'sparse' target 976SPARSE_FLAGS ?= -std=gnu99 -D__STDC_NO_VLA__ 977SP_EXTRA_FLAGS = 978 979# For informing GIT-BUILD-OPTIONS of the SANITIZE=leak,address targets 980SANITIZE_LEAK = 981SANITIZE_ADDRESS = 982 983# For the 'coccicheck' target 984SPATCH_INCLUDE_FLAGS = --all-includes 985SPATCH_FLAGS = 986SPATCH_TEST_FLAGS = 987 988# If *.o files are present, have "coccicheck" depend on them, with 989# COMPUTE_HEADER_DEPENDENCIES this will speed up the common-case of 990# only needing to re-generate coccicheck results for the users of a 991# given API if it's changed, and not all files in the project. If 992# COMPUTE_HEADER_DEPENDENCIES=no this will be unset too. 993SPATCH_USE_O_DEPENDENCIES = YesPlease 994 995# Set SPATCH_CONCAT_COCCI to concatenate the contrib/cocci/*.cocci 996# files into a single contrib/cocci/ALL.cocci before running 997# "coccicheck". 998# 999# Pros: 1000# 1001# - Speeds up a one-shot run of "make coccicheck", as we won't have to 1002# parse *.[ch] files N times for the N *.cocci rules 1003# 1004# Cons: 1005# 1006# - Will make incremental development of *.cocci slower, as 1007# e.g. changing strbuf.cocci will re-run all *.cocci. 1008# 1009# - Makes error and performance analysis harder, as rules will be 1010# applied from a monolithic ALL.cocci, rather than 1011# e.g. strbuf.cocci. To work around this either undefine this, or 1012# generate a specific patch, e.g. this will always use strbuf.cocci, 1013# not ALL.cocci: 1014# 1015# make contrib/coccinelle/strbuf.cocci.patch 1016SPATCH_CONCAT_COCCI = YesPlease 1017 1018# Rebuild 'coccicheck' if $(SPATCH), its flags etc. change 1019TRACK_SPATCH_DEFINES = 1020TRACK_SPATCH_DEFINES += $(SPATCH) 1021TRACK_SPATCH_DEFINES += $(SPATCH_INCLUDE_FLAGS) 1022TRACK_SPATCH_DEFINES += $(SPATCH_FLAGS) 1023TRACK_SPATCH_DEFINES += $(SPATCH_TEST_FLAGS) 1024GIT-SPATCH-DEFINES: FORCE 1025 @FLAGS='$(TRACK_SPATCH_DEFINES)'; \ 1026 if test x"$$FLAGS" != x"`cat GIT-SPATCH-DEFINES 2>/dev/null`" ; then \ 1027 echo >&2 " * new spatch flags"; \ 1028 echo "$$FLAGS" >GIT-SPATCH-DEFINES; \ 1029 fi 1030 1031include config.mak.uname 1032-include config.mak.autogen 1033-include config.mak 1034 1035ifdef DEVELOPER 1036include config.mak.dev 1037endif 1038 1039GENERATED_H += command-list.h 1040GENERATED_H += config-list.h 1041GENERATED_H += hook-list.h 1042GENERATED_H += $(UNIT_TEST_DIR)/clar-decls.h 1043GENERATED_H += $(UNIT_TEST_DIR)/clar.suite 1044 1045.PHONY: generated-hdrs 1046generated-hdrs: $(GENERATED_H) 1047 1048## Exhaustive lists of our source files, either dynamically generated, 1049## or hardcoded. 1050SOURCES_CMD = ( \ 1051 git ls-files --deduplicate \ 1052 '*.[hcS]' \ 1053 '*.sh' \ 1054 ':!*[tp][0-9][0-9][0-9][0-9]*' \ 1055 ':!contrib' \ 1056 2>/dev/null || \ 1057 $(FIND) . \ 1058 \( -name .git -type d -prune \) \ 1059 -o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \ 1060 -o \( -name contrib -type d -prune \) \ 1061 -o \( -name build -type d -prune \) \ 1062 -o \( -name .build -type d -prune \) \ 1063 -o \( -name 'trash*' -type d -prune \) \ 1064 -o \( -name '*.[hcS]' -type f -print \) \ 1065 -o \( -name '*.sh' -type f -print \) \ 1066 | sed -e 's|^\./||' \ 1067 ) 1068FOUND_SOURCE_FILES := $(filter-out $(GENERATED_H),$(shell $(SOURCES_CMD))) 1069 1070FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES)) 1071FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES)) 1072 1073COCCI_SOURCES = $(filter-out $(THIRD_PARTY_SOURCES) reftable/%,$(FOUND_C_SOURCES)) 1074 1075LIB_H = $(FOUND_H_SOURCES) 1076 1077LIB_OBJS += abspath.o 1078LIB_OBJS += add-interactive.o 1079LIB_OBJS += add-patch.o 1080LIB_OBJS += advice.o 1081LIB_OBJS += alias.o 1082LIB_OBJS += alloc.o 1083LIB_OBJS += apply.o 1084LIB_OBJS += archive-tar.o 1085LIB_OBJS += archive-zip.o 1086LIB_OBJS += archive.o 1087LIB_OBJS += attr.o 1088LIB_OBJS += base85.o 1089LIB_OBJS += bisect.o 1090LIB_OBJS += blame.o 1091LIB_OBJS += blob.o 1092LIB_OBJS += bloom.o 1093LIB_OBJS += branch.o 1094LIB_OBJS += bundle-uri.o 1095LIB_OBJS += bundle.o 1096LIB_OBJS += cache-tree.o 1097LIB_OBJS += cbtree.o 1098LIB_OBJS += chdir-notify.o 1099LIB_OBJS += checkout.o 1100LIB_OBJS += chunk-format.o 1101LIB_OBJS += color.o 1102LIB_OBJS += column.o 1103LIB_OBJS += combine-diff.o 1104LIB_OBJS += commit-graph.o 1105LIB_OBJS += commit-reach.o 1106LIB_OBJS += commit.o 1107LIB_OBJS += common-exit.o 1108LIB_OBJS += common-init.o 1109LIB_OBJS += compat/nonblock.o 1110LIB_OBJS += compat/obstack.o 1111LIB_OBJS += compat/open.o 1112LIB_OBJS += compat/terminal.o 1113LIB_OBJS += compiler-tricks/not-constant.o 1114LIB_OBJS += config.o 1115LIB_OBJS += connect.o 1116LIB_OBJS += connected.o 1117LIB_OBJS += convert.o 1118LIB_OBJS += copy.o 1119LIB_OBJS += credential.o 1120LIB_OBJS += csum-file.o 1121LIB_OBJS += ctype.o 1122LIB_OBJS += date.o 1123LIB_OBJS += decorate.o 1124LIB_OBJS += delta-islands.o 1125LIB_OBJS += diagnose.o 1126LIB_OBJS += diff-delta.o 1127LIB_OBJS += diff-merges.o 1128LIB_OBJS += diff-lib.o 1129LIB_OBJS += diff-no-index.o 1130LIB_OBJS += diff.o 1131LIB_OBJS += diffcore-break.o 1132LIB_OBJS += diffcore-delta.o 1133LIB_OBJS += diffcore-order.o 1134LIB_OBJS += diffcore-pickaxe.o 1135LIB_OBJS += diffcore-rename.o 1136LIB_OBJS += diffcore-rotate.o 1137LIB_OBJS += dir-iterator.o 1138LIB_OBJS += dir.o 1139LIB_OBJS += editor.o 1140LIB_OBJS += entry.o 1141LIB_OBJS += environment.o 1142LIB_OBJS += ewah/bitmap.o 1143LIB_OBJS += ewah/ewah_bitmap.o 1144LIB_OBJS += ewah/ewah_io.o 1145LIB_OBJS += ewah/ewah_rlw.o 1146LIB_OBJS += exec-cmd.o 1147LIB_OBJS += fetch-negotiator.o 1148LIB_OBJS += fetch-pack.o 1149LIB_OBJS += fmt-merge-msg.o 1150LIB_OBJS += fsck.o 1151LIB_OBJS += fsmonitor.o 1152LIB_OBJS += fsmonitor-ipc.o 1153LIB_OBJS += fsmonitor-settings.o 1154LIB_OBJS += gettext.o 1155LIB_OBJS += git-zlib.o 1156LIB_OBJS += gpg-interface.o 1157LIB_OBJS += graph.o 1158LIB_OBJS += grep.o 1159LIB_OBJS += hash-lookup.o 1160LIB_OBJS += hash.o 1161LIB_OBJS += hashmap.o 1162LIB_OBJS += help.o 1163LIB_OBJS += hex.o 1164LIB_OBJS += hex-ll.o 1165LIB_OBJS += hook.o 1166LIB_OBJS += ident.o 1167LIB_OBJS += json-writer.o 1168LIB_OBJS += kwset.o 1169LIB_OBJS += levenshtein.o 1170LIB_OBJS += line-log.o 1171LIB_OBJS += line-range.o 1172LIB_OBJS += linear-assignment.o 1173LIB_OBJS += list-objects-filter-options.o 1174LIB_OBJS += list-objects-filter.o 1175LIB_OBJS += list-objects.o 1176LIB_OBJS += lockfile.o 1177LIB_OBJS += log-tree.o 1178LIB_OBJS += loose.o 1179LIB_OBJS += ls-refs.o 1180LIB_OBJS += mailinfo.o 1181LIB_OBJS += mailmap.o 1182LIB_OBJS += match-trees.o 1183LIB_OBJS += mem-pool.o 1184LIB_OBJS += merge-blobs.o 1185LIB_OBJS += merge-ll.o 1186LIB_OBJS += merge-ort.o 1187LIB_OBJS += merge-ort-wrappers.o 1188LIB_OBJS += merge.o 1189LIB_OBJS += midx.o 1190LIB_OBJS += midx-write.o 1191LIB_OBJS += name-hash.o 1192LIB_OBJS += negotiator/default.o 1193LIB_OBJS += negotiator/noop.o 1194LIB_OBJS += negotiator/skipping.o 1195LIB_OBJS += notes-cache.o 1196LIB_OBJS += notes-merge.o 1197LIB_OBJS += notes-utils.o 1198LIB_OBJS += notes.o 1199LIB_OBJS += object-file-convert.o 1200LIB_OBJS += object-file.o 1201LIB_OBJS += object-name.o 1202LIB_OBJS += object.o 1203LIB_OBJS += odb.o 1204LIB_OBJS += oid-array.o 1205LIB_OBJS += oidmap.o 1206LIB_OBJS += oidset.o 1207LIB_OBJS += oidtree.o 1208LIB_OBJS += pack-bitmap-write.o 1209LIB_OBJS += pack-bitmap.o 1210LIB_OBJS += pack-check.o 1211LIB_OBJS += pack-mtimes.o 1212LIB_OBJS += pack-objects.o 1213LIB_OBJS += pack-refs.o 1214LIB_OBJS += pack-revindex.o 1215LIB_OBJS += pack-write.o 1216LIB_OBJS += packfile.o 1217LIB_OBJS += pager.o 1218LIB_OBJS += parallel-checkout.o 1219LIB_OBJS += parse.o 1220LIB_OBJS += parse-options-cb.o 1221LIB_OBJS += parse-options.o 1222LIB_OBJS += patch-delta.o 1223LIB_OBJS += patch-ids.o 1224LIB_OBJS += path.o 1225LIB_OBJS += path-walk.o 1226LIB_OBJS += pathspec.o 1227LIB_OBJS += pkt-line.o 1228LIB_OBJS += preload-index.o 1229LIB_OBJS += pretty.o 1230LIB_OBJS += prio-queue.o 1231LIB_OBJS += progress.o 1232LIB_OBJS += promisor-remote.o 1233LIB_OBJS += prompt.o 1234LIB_OBJS += protocol.o 1235LIB_OBJS += protocol-caps.o 1236LIB_OBJS += prune-packed.o 1237LIB_OBJS += pseudo-merge.o 1238LIB_OBJS += quote.o 1239LIB_OBJS += range-diff.o 1240LIB_OBJS += reachable.o 1241LIB_OBJS += read-cache.o 1242LIB_OBJS += rebase-interactive.o 1243LIB_OBJS += rebase.o 1244LIB_OBJS += ref-filter.o 1245LIB_OBJS += reflog-walk.o 1246LIB_OBJS += reflog.o 1247LIB_OBJS += refs.o 1248LIB_OBJS += refs/debug.o 1249LIB_OBJS += refs/files-backend.o 1250LIB_OBJS += refs/reftable-backend.o 1251LIB_OBJS += refs/iterator.o 1252LIB_OBJS += refs/packed-backend.o 1253LIB_OBJS += refs/ref-cache.o 1254LIB_OBJS += refspec.o 1255LIB_OBJS += reftable/basics.o 1256LIB_OBJS += reftable/block.o 1257LIB_OBJS += reftable/blocksource.o 1258LIB_OBJS += reftable/error.o 1259LIB_OBJS += reftable/fsck.o 1260LIB_OBJS += reftable/iter.o 1261LIB_OBJS += reftable/merged.o 1262LIB_OBJS += reftable/pq.o 1263LIB_OBJS += reftable/record.o 1264LIB_OBJS += reftable/stack.o 1265LIB_OBJS += reftable/system.o 1266LIB_OBJS += reftable/table.o 1267LIB_OBJS += reftable/tree.o 1268LIB_OBJS += reftable/writer.o 1269LIB_OBJS += remote.o 1270LIB_OBJS += replace-object.o 1271LIB_OBJS += repo-settings.o 1272LIB_OBJS += repository.o 1273LIB_OBJS += rerere.o 1274LIB_OBJS += reset.o 1275LIB_OBJS += resolve-undo.o 1276LIB_OBJS += revision.o 1277LIB_OBJS += run-command.o 1278LIB_OBJS += send-pack.o 1279LIB_OBJS += sequencer.o 1280LIB_OBJS += serve.o 1281LIB_OBJS += server-info.o 1282LIB_OBJS += setup.o 1283LIB_OBJS += shallow.o 1284LIB_OBJS += sideband.o 1285LIB_OBJS += sigchain.o 1286LIB_OBJS += sparse-index.o 1287LIB_OBJS += split-index.o 1288LIB_OBJS += stable-qsort.o 1289LIB_OBJS += statinfo.o 1290LIB_OBJS += strbuf.o 1291LIB_OBJS += streaming.o 1292LIB_OBJS += string-list.o 1293LIB_OBJS += strmap.o 1294LIB_OBJS += strvec.o 1295LIB_OBJS += sub-process.o 1296LIB_OBJS += submodule-config.o 1297LIB_OBJS += submodule.o 1298LIB_OBJS += symlinks.o 1299LIB_OBJS += tag.o 1300LIB_OBJS += tempfile.o 1301LIB_OBJS += thread-utils.o 1302LIB_OBJS += tmp-objdir.o 1303LIB_OBJS += trace.o 1304LIB_OBJS += trace2.o 1305LIB_OBJS += trace2/tr2_cfg.o 1306LIB_OBJS += trace2/tr2_cmd_name.o 1307LIB_OBJS += trace2/tr2_ctr.o 1308LIB_OBJS += trace2/tr2_dst.o 1309LIB_OBJS += trace2/tr2_sid.o 1310LIB_OBJS += trace2/tr2_sysenv.o 1311LIB_OBJS += trace2/tr2_tbuf.o 1312LIB_OBJS += trace2/tr2_tgt_event.o 1313LIB_OBJS += trace2/tr2_tgt_normal.o 1314LIB_OBJS += trace2/tr2_tgt_perf.o 1315LIB_OBJS += trace2/tr2_tls.o 1316LIB_OBJS += trace2/tr2_tmr.o 1317LIB_OBJS += trailer.o 1318LIB_OBJS += transport-helper.o 1319LIB_OBJS += transport.o 1320LIB_OBJS += tree-diff.o 1321LIB_OBJS += tree-walk.o 1322LIB_OBJS += tree.o 1323LIB_OBJS += unpack-trees.o 1324LIB_OBJS += upload-pack.o 1325LIB_OBJS += url.o 1326LIB_OBJS += urlmatch.o 1327LIB_OBJS += usage.o 1328LIB_OBJS += userdiff.o 1329LIB_OBJS += utf8.o 1330ifndef WITH_RUST 1331LIB_OBJS += varint.o 1332endif 1333LIB_OBJS += version.o 1334LIB_OBJS += versioncmp.o 1335LIB_OBJS += walker.o 1336LIB_OBJS += wildmatch.o 1337LIB_OBJS += worktree.o 1338LIB_OBJS += wrapper.o 1339LIB_OBJS += write-or-die.o 1340LIB_OBJS += ws.o 1341LIB_OBJS += wt-status.o 1342LIB_OBJS += xdiff-interface.o 1343LIB_OBJS += xdiff/xdiffi.o 1344LIB_OBJS += xdiff/xemit.o 1345LIB_OBJS += xdiff/xhistogram.o 1346LIB_OBJS += xdiff/xmerge.o 1347LIB_OBJS += xdiff/xpatience.o 1348LIB_OBJS += xdiff/xprepare.o 1349LIB_OBJS += xdiff/xutils.o 1350 1351BUILTIN_OBJS += builtin/add.o 1352BUILTIN_OBJS += builtin/am.o 1353BUILTIN_OBJS += builtin/annotate.o 1354BUILTIN_OBJS += builtin/apply.o 1355BUILTIN_OBJS += builtin/archive.o 1356BUILTIN_OBJS += builtin/backfill.o 1357BUILTIN_OBJS += builtin/bisect.o 1358BUILTIN_OBJS += builtin/blame.o 1359BUILTIN_OBJS += builtin/branch.o 1360BUILTIN_OBJS += builtin/bugreport.o 1361BUILTIN_OBJS += builtin/bundle.o 1362BUILTIN_OBJS += builtin/cat-file.o 1363BUILTIN_OBJS += builtin/check-attr.o 1364BUILTIN_OBJS += builtin/check-ignore.o 1365BUILTIN_OBJS += builtin/check-mailmap.o 1366BUILTIN_OBJS += builtin/check-ref-format.o 1367BUILTIN_OBJS += builtin/checkout--worker.o 1368BUILTIN_OBJS += builtin/checkout-index.o 1369BUILTIN_OBJS += builtin/checkout.o 1370BUILTIN_OBJS += builtin/clean.o 1371BUILTIN_OBJS += builtin/clone.o 1372BUILTIN_OBJS += builtin/column.o 1373BUILTIN_OBJS += builtin/commit-graph.o 1374BUILTIN_OBJS += builtin/commit-tree.o 1375BUILTIN_OBJS += builtin/commit.o 1376BUILTIN_OBJS += builtin/config.o 1377BUILTIN_OBJS += builtin/count-objects.o 1378BUILTIN_OBJS += builtin/credential-cache--daemon.o 1379BUILTIN_OBJS += builtin/credential-cache.o 1380BUILTIN_OBJS += builtin/credential-store.o 1381BUILTIN_OBJS += builtin/credential.o 1382BUILTIN_OBJS += builtin/describe.o 1383BUILTIN_OBJS += builtin/diagnose.o 1384BUILTIN_OBJS += builtin/diff-files.o 1385BUILTIN_OBJS += builtin/diff-index.o 1386BUILTIN_OBJS += builtin/diff-pairs.o 1387BUILTIN_OBJS += builtin/diff-tree.o 1388BUILTIN_OBJS += builtin/diff.o 1389BUILTIN_OBJS += builtin/difftool.o 1390BUILTIN_OBJS += builtin/fast-export.o 1391BUILTIN_OBJS += builtin/fast-import.o 1392BUILTIN_OBJS += builtin/fetch-pack.o 1393BUILTIN_OBJS += builtin/fetch.o 1394BUILTIN_OBJS += builtin/fmt-merge-msg.o 1395BUILTIN_OBJS += builtin/for-each-ref.o 1396BUILTIN_OBJS += builtin/for-each-repo.o 1397BUILTIN_OBJS += builtin/fsck.o 1398BUILTIN_OBJS += builtin/fsmonitor--daemon.o 1399BUILTIN_OBJS += builtin/gc.o 1400BUILTIN_OBJS += builtin/get-tar-commit-id.o 1401BUILTIN_OBJS += builtin/grep.o 1402BUILTIN_OBJS += builtin/hash-object.o 1403BUILTIN_OBJS += builtin/help.o 1404BUILTIN_OBJS += builtin/hook.o 1405BUILTIN_OBJS += builtin/index-pack.o 1406BUILTIN_OBJS += builtin/init-db.o 1407BUILTIN_OBJS += builtin/interpret-trailers.o 1408BUILTIN_OBJS += builtin/last-modified.o 1409BUILTIN_OBJS += builtin/log.o 1410BUILTIN_OBJS += builtin/ls-files.o 1411BUILTIN_OBJS += builtin/ls-remote.o 1412BUILTIN_OBJS += builtin/ls-tree.o 1413BUILTIN_OBJS += builtin/mailinfo.o 1414BUILTIN_OBJS += builtin/mailsplit.o 1415BUILTIN_OBJS += builtin/merge-base.o 1416BUILTIN_OBJS += builtin/merge-file.o 1417BUILTIN_OBJS += builtin/merge-index.o 1418BUILTIN_OBJS += builtin/merge-ours.o 1419BUILTIN_OBJS += builtin/merge-recursive.o 1420BUILTIN_OBJS += builtin/merge-tree.o 1421BUILTIN_OBJS += builtin/merge.o 1422BUILTIN_OBJS += builtin/mktag.o 1423BUILTIN_OBJS += builtin/mktree.o 1424BUILTIN_OBJS += builtin/multi-pack-index.o 1425BUILTIN_OBJS += builtin/mv.o 1426BUILTIN_OBJS += builtin/name-rev.o 1427BUILTIN_OBJS += builtin/notes.o 1428BUILTIN_OBJS += builtin/pack-objects.o 1429ifndef WITH_BREAKING_CHANGES 1430BUILTIN_OBJS += builtin/pack-redundant.o 1431endif 1432BUILTIN_OBJS += builtin/pack-refs.o 1433BUILTIN_OBJS += builtin/patch-id.o 1434BUILTIN_OBJS += builtin/prune-packed.o 1435BUILTIN_OBJS += builtin/prune.o 1436BUILTIN_OBJS += builtin/pull.o 1437BUILTIN_OBJS += builtin/push.o 1438BUILTIN_OBJS += builtin/range-diff.o 1439BUILTIN_OBJS += builtin/read-tree.o 1440BUILTIN_OBJS += builtin/rebase.o 1441BUILTIN_OBJS += builtin/receive-pack.o 1442BUILTIN_OBJS += builtin/reflog.o 1443BUILTIN_OBJS += builtin/refs.o 1444BUILTIN_OBJS += builtin/remote-ext.o 1445BUILTIN_OBJS += builtin/remote-fd.o 1446BUILTIN_OBJS += builtin/remote.o 1447BUILTIN_OBJS += builtin/repack.o 1448BUILTIN_OBJS += builtin/replace.o 1449BUILTIN_OBJS += builtin/replay.o 1450BUILTIN_OBJS += builtin/repo.o 1451BUILTIN_OBJS += builtin/rerere.o 1452BUILTIN_OBJS += builtin/reset.o 1453BUILTIN_OBJS += builtin/rev-list.o 1454BUILTIN_OBJS += builtin/rev-parse.o 1455BUILTIN_OBJS += builtin/revert.o 1456BUILTIN_OBJS += builtin/rm.o 1457BUILTIN_OBJS += builtin/send-pack.o 1458BUILTIN_OBJS += builtin/shortlog.o 1459BUILTIN_OBJS += builtin/show-branch.o 1460BUILTIN_OBJS += builtin/show-index.o 1461BUILTIN_OBJS += builtin/show-ref.o 1462BUILTIN_OBJS += builtin/sparse-checkout.o 1463BUILTIN_OBJS += builtin/stash.o 1464BUILTIN_OBJS += builtin/stripspace.o 1465BUILTIN_OBJS += builtin/submodule--helper.o 1466BUILTIN_OBJS += builtin/symbolic-ref.o 1467BUILTIN_OBJS += builtin/tag.o 1468BUILTIN_OBJS += builtin/unpack-file.o 1469BUILTIN_OBJS += builtin/unpack-objects.o 1470BUILTIN_OBJS += builtin/update-index.o 1471BUILTIN_OBJS += builtin/update-ref.o 1472BUILTIN_OBJS += builtin/update-server-info.o 1473BUILTIN_OBJS += builtin/upload-archive.o 1474BUILTIN_OBJS += builtin/upload-pack.o 1475BUILTIN_OBJS += builtin/var.o 1476BUILTIN_OBJS += builtin/verify-commit.o 1477BUILTIN_OBJS += builtin/verify-pack.o 1478BUILTIN_OBJS += builtin/verify-tag.o 1479BUILTIN_OBJS += builtin/worktree.o 1480BUILTIN_OBJS += builtin/write-tree.o 1481 1482# THIRD_PARTY_SOURCES is a list of patterns compatible with the 1483# $(filter) and $(filter-out) family of functions. They specify source 1484# files which are taken from some third-party source where we want to be 1485# less strict about issues such as coding style so we don't diverge from 1486# upstream unnecessarily (making merging in future changes easier). 1487THIRD_PARTY_SOURCES += compat/inet_ntop.c 1488THIRD_PARTY_SOURCES += compat/inet_pton.c 1489THIRD_PARTY_SOURCES += compat/nedmalloc/% 1490THIRD_PARTY_SOURCES += compat/obstack.% 1491THIRD_PARTY_SOURCES += compat/poll/% 1492THIRD_PARTY_SOURCES += compat/regex/% 1493THIRD_PARTY_SOURCES += sha1collisiondetection/% 1494THIRD_PARTY_SOURCES += sha1dc/% 1495THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/% 1496THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/clar/% 1497 1498CLAR_TEST_SUITES += u-ctype 1499CLAR_TEST_SUITES += u-dir 1500CLAR_TEST_SUITES += u-example-decorate 1501CLAR_TEST_SUITES += u-hash 1502CLAR_TEST_SUITES += u-hashmap 1503CLAR_TEST_SUITES += u-mem-pool 1504CLAR_TEST_SUITES += u-oid-array 1505CLAR_TEST_SUITES += u-oidmap 1506CLAR_TEST_SUITES += u-oidtree 1507CLAR_TEST_SUITES += u-prio-queue 1508CLAR_TEST_SUITES += u-reftable-basics 1509CLAR_TEST_SUITES += u-reftable-block 1510CLAR_TEST_SUITES += u-reftable-merged 1511CLAR_TEST_SUITES += u-reftable-pq 1512CLAR_TEST_SUITES += u-reftable-readwrite 1513CLAR_TEST_SUITES += u-reftable-stack 1514CLAR_TEST_SUITES += u-reftable-table 1515CLAR_TEST_SUITES += u-reftable-tree 1516CLAR_TEST_SUITES += u-strbuf 1517CLAR_TEST_SUITES += u-strcmp-offset 1518CLAR_TEST_SUITES += u-string-list 1519CLAR_TEST_SUITES += u-strvec 1520CLAR_TEST_SUITES += u-trailer 1521CLAR_TEST_SUITES += u-urlmatch-normalization 1522CLAR_TEST_PROG = $(UNIT_TEST_BIN)/unit-tests$(X) 1523CLAR_TEST_OBJS = $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(CLAR_TEST_SUITES)) 1524CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/clar/clar.o 1525CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/lib-oid.o 1526CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/lib-reftable.o 1527CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/unit-test.o 1528 1529UNIT_TEST_OBJS += $(UNIT_TEST_DIR)/test-lib.o 1530 1531RUST_SOURCES += src/lib.rs 1532RUST_SOURCES += src/varint.rs 1533 1534GIT-VERSION-FILE: FORCE 1535 @OLD=$$(cat $@ 2>/dev/null || :) && \ 1536 $(call version_gen,"$(shell pwd)",GIT-VERSION-FILE.in,$@) && \ 1537 NEW=$$(cat $@ 2>/dev/null || :) && \ 1538 if test "$$OLD" != "$$NEW"; then echo "$$NEW" >&2; fi 1539 1540# We need to set GIT_VERSION_OVERRIDE before including the version file as 1541# otherwise any user-provided value for GIT_VERSION would have been overridden 1542# already. 1543GIT_VERSION_OVERRIDE := $(GIT_VERSION) 1544-include GIT-VERSION-FILE 1545 1546# what 'all' will build and 'install' will install in gitexecdir, 1547# excluding programs for built-in commands 1548ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS) 1549ALL_COMMANDS_TO_INSTALL = $(ALL_PROGRAMS) 1550ifeq (,$(SKIP_DASHED_BUILT_INS)) 1551ALL_COMMANDS_TO_INSTALL += $(BUILT_INS) 1552else 1553# git-upload-pack, git-receive-pack and git-upload-archive are special: they 1554# are _expected_ to be present in the `bin/` directory in their dashed form. 1555ALL_COMMANDS_TO_INSTALL += git-receive-pack$(X) 1556ALL_COMMANDS_TO_INSTALL += git-upload-archive$(X) 1557ALL_COMMANDS_TO_INSTALL += git-upload-pack$(X) 1558endif 1559 1560ALL_CFLAGS = $(DEVELOPER_CFLAGS) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_APPEND) 1561ALL_LDFLAGS = $(LDFLAGS) $(LDFLAGS_APPEND) 1562 1563ifdef WITH_RUST 1564BASIC_CFLAGS += -DWITH_RUST 1565GITLIBS += $(RUST_LIB) 1566ifeq ($(uname_S),Windows) 1567EXTLIBS += -luserenv 1568endif 1569endif 1570 1571ifdef SANITIZE 1572SANITIZERS := $(foreach flag,$(subst $(comma),$(space),$(SANITIZE)),$(flag)) 1573BASIC_CFLAGS += -fsanitize=$(SANITIZE) -fno-sanitize-recover=$(SANITIZE) 1574BASIC_CFLAGS += -fno-omit-frame-pointer 1575ifneq ($(filter undefined,$(SANITIZERS)),) 1576BASIC_CFLAGS += -DSHA1DC_FORCE_ALIGNED_ACCESS 1577endif 1578ifneq ($(filter leak,$(SANITIZERS)),) 1579BASIC_CFLAGS += -O0 1580SANITIZE_LEAK = YesCompiledWithIt 1581endif 1582ifneq ($(filter address,$(SANITIZERS)),) 1583NO_REGEX = NeededForASAN 1584SANITIZE_ADDRESS = YesCompiledWithIt 1585endif 1586endif 1587 1588ifndef sysconfdir 1589ifeq ($(prefix),/usr) 1590sysconfdir = /etc 1591else 1592sysconfdir = etc 1593endif 1594endif 1595 1596ifndef COMPUTE_HEADER_DEPENDENCIES 1597COMPUTE_HEADER_DEPENDENCIES = auto 1598endif 1599 1600ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto) 1601dep_check = $(shell $(CC) $(ALL_CFLAGS) \ 1602 -Wno-pedantic \ 1603 -c -MF /dev/null -MQ /dev/null -MMD -MP \ 1604 -x c /dev/null -o /dev/null 2>&1; \ 1605 echo $$?) 1606ifeq ($(dep_check),0) 1607override COMPUTE_HEADER_DEPENDENCIES = yes 1608else 1609override COMPUTE_HEADER_DEPENDENCIES = no 1610endif 1611endif 1612 1613ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes) 1614USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease 1615else 1616ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no) 1617$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \ 1618(not "$(COMPUTE_HEADER_DEPENDENCIES)")) 1619endif 1620endif 1621 1622ifndef GENERATE_COMPILATION_DATABASE 1623GENERATE_COMPILATION_DATABASE = no 1624endif 1625 1626ifeq ($(GENERATE_COMPILATION_DATABASE),yes) 1627compdb_check = $(shell $(CC) $(ALL_CFLAGS) \ 1628 -Wno-pedantic \ 1629 -c -MJ /dev/null \ 1630 -x c /dev/null -o /dev/null 2>&1; \ 1631 echo $$?) 1632ifneq ($(compdb_check),0) 1633override GENERATE_COMPILATION_DATABASE = no 1634$(warning GENERATE_COMPILATION_DATABASE is set to "yes", but your compiler does not \ 1635support generating compilation database entries) 1636endif 1637else 1638ifneq ($(GENERATE_COMPILATION_DATABASE),no) 1639$(error please set GENERATE_COMPILATION_DATABASE to "yes" or "no" \ 1640(not "$(GENERATE_COMPILATION_DATABASE)")) 1641endif 1642endif 1643 1644ifdef SANE_TOOL_PATH 1645SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH)) 1646BROKEN_PATH_FIX = s|^\# @BROKEN_PATH_FIX@$$|git_broken_path_fix "$(SANE_TOOL_PATH_SQ)"| 1647PATH := $(SANE_TOOL_PATH):${PATH} 1648else 1649BROKEN_PATH_FIX = /^\# @BROKEN_PATH_FIX@$$/d 1650endif 1651 1652ifeq (,$(HOST_CPU)) 1653 BASIC_CFLAGS += -DGIT_HOST_CPU="\"$(firstword $(subst -, ,$(uname_M)))\"" 1654else 1655 BASIC_CFLAGS += -DGIT_HOST_CPU="\"$(HOST_CPU)\"" 1656endif 1657 1658ifneq (,$(INLINE)) 1659 BASIC_CFLAGS += -Dinline=$(INLINE) 1660endif 1661 1662ifneq (,$(SOCKLEN_T)) 1663 BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T) 1664endif 1665 1666ifeq ($(uname_S),Darwin) 1667 ifndef NO_FINK 1668 ifeq ($(shell test -d /sw/lib && echo y),y) 1669 BASIC_CFLAGS += -I/sw/include 1670 BASIC_LDFLAGS += -L/sw/lib 1671 endif 1672 endif 1673 ifndef NO_DARWIN_PORTS 1674 ifeq ($(shell test -d /opt/local/lib && echo y),y) 1675 BASIC_CFLAGS += -I/opt/local/include 1676 BASIC_LDFLAGS += -L/opt/local/lib 1677 endif 1678 endif 1679 ifndef NO_APPLE_COMMON_CRYPTO 1680 NO_OPENSSL = YesPlease 1681 APPLE_COMMON_CRYPTO = YesPlease 1682 COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO 1683 endif 1684 PTHREAD_LIBS = 1685endif 1686 1687ifdef NO_LIBGEN_H 1688 COMPAT_CFLAGS += -DNO_LIBGEN_H 1689 COMPAT_OBJS += compat/basename.o 1690endif 1691 1692ifdef USE_LIBPCRE1 1693$(error The USE_LIBPCRE1 build option has been removed, use version 2 with USE_LIBPCRE) 1694endif 1695 1696USE_LIBPCRE2 ?= $(USE_LIBPCRE) 1697 1698ifneq (,$(USE_LIBPCRE2)) 1699 BASIC_CFLAGS += -DUSE_LIBPCRE2 1700 EXTLIBS += -lpcre2-8 1701endif 1702 1703ifdef LIBPCREDIR 1704 BASIC_CFLAGS += -I$(LIBPCREDIR)/include 1705 EXTLIBS += $(call libpath_template,$(LIBPCREDIR)/$(lib)) 1706endif 1707 1708ifdef HAVE_ALLOCA_H 1709 BASIC_CFLAGS += -DHAVE_ALLOCA_H 1710endif 1711 1712IMAP_SEND_BUILDDEPS = 1713IMAP_SEND_LDFLAGS = 1714 1715ifdef NO_CURL 1716 BASIC_CFLAGS += -DNO_CURL 1717 REMOTE_CURL_PRIMARY = 1718 REMOTE_CURL_ALIASES = 1719 REMOTE_CURL_NAMES = 1720 EXCLUDED_PROGRAMS += git-http-fetch git-http-push 1721else 1722 ifdef CURLDIR 1723 # Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case. 1724 CURL_CFLAGS = -I$(CURLDIR)/include 1725 CURL_LIBCURL = $(call libpath_template,$(CURLDIR)/$(lib)) 1726 else 1727 CURL_CFLAGS = 1728 CURL_LIBCURL = 1729 endif 1730 1731 ifndef CURL_LDFLAGS 1732 CURL_LDFLAGS = $(eval CURL_LDFLAGS := $$(shell $$(CURL_CONFIG) --libs))$(CURL_LDFLAGS) 1733 endif 1734 CURL_LIBCURL += $(CURL_LDFLAGS) 1735 1736 ifndef CURL_CFLAGS 1737 CURL_CFLAGS = $(eval CURL_CFLAGS := $$(shell $$(CURL_CONFIG) --cflags))$(CURL_CFLAGS) 1738 endif 1739 BASIC_CFLAGS += $(CURL_CFLAGS) 1740 1741 REMOTE_CURL_PRIMARY = git-remote-http$X 1742 REMOTE_CURL_ALIASES = git-remote-https$X git-remote-ftp$X git-remote-ftps$X 1743 REMOTE_CURL_NAMES = $(REMOTE_CURL_PRIMARY) $(REMOTE_CURL_ALIASES) 1744 PROGRAM_OBJS += http-fetch.o 1745 PROGRAMS += $(REMOTE_CURL_NAMES) 1746 ifndef NO_EXPAT 1747 PROGRAM_OBJS += http-push.o 1748 endif 1749 curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p) 1750 ifeq "$(curl_check)" "072200" 1751 USE_CURL_FOR_IMAP_SEND = YesPlease 1752 endif 1753 ifdef USE_CURL_FOR_IMAP_SEND 1754 BASIC_CFLAGS += -DUSE_CURL_FOR_IMAP_SEND 1755 IMAP_SEND_BUILDDEPS = http.o 1756 IMAP_SEND_LDFLAGS += $(CURL_LIBCURL) 1757 endif 1758 ifndef NO_EXPAT 1759 ifdef EXPATDIR 1760 BASIC_CFLAGS += -I$(EXPATDIR)/include 1761 EXPAT_LIBEXPAT = $(call libpath_template,$(EXPATDIR)/$(lib)) -lexpat 1762 else 1763 EXPAT_LIBEXPAT = -lexpat 1764 endif 1765 ifdef EXPAT_NEEDS_XMLPARSE_H 1766 BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H 1767 endif 1768 endif 1769endif 1770IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO) 1771 1772ifdef ZLIB_NG 1773 BASIC_CFLAGS += -DHAVE_ZLIB_NG 1774 ifdef ZLIB_NG_PATH 1775 BASIC_CFLAGS += -I$(ZLIB_NG_PATH)/include 1776 EXTLIBS += $(call libpath_template,$(ZLIB_NG_PATH)/$(lib)) 1777 endif 1778 EXTLIBS += -lz-ng 1779else 1780 ifdef ZLIB_PATH 1781 BASIC_CFLAGS += -I$(ZLIB_PATH)/include 1782 EXTLIBS += $(call libpath_template,$(ZLIB_PATH)/$(lib)) 1783 endif 1784 EXTLIBS += -lz 1785endif 1786 1787ifndef NO_OPENSSL 1788 OPENSSL_LIBSSL = -lssl 1789 ifdef OPENSSLDIR 1790 BASIC_CFLAGS += -I$(OPENSSLDIR)/include 1791 OPENSSL_LINK = $(call libpath_template,$(OPENSSLDIR)/$(lib)) 1792 else 1793 OPENSSL_LINK = 1794 endif 1795 ifdef NEEDS_CRYPTO_WITH_SSL 1796 OPENSSL_LIBSSL += -lcrypto 1797 endif 1798else 1799 BASIC_CFLAGS += -DNO_OPENSSL 1800 OPENSSL_LIBSSL = 1801endif 1802ifdef NO_OPENSSL 1803 LIB_4_CRYPTO = 1804else 1805ifdef NEEDS_SSL_WITH_CRYPTO 1806 LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -lssl 1807else 1808 LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto 1809endif 1810ifdef APPLE_COMMON_CRYPTO 1811 LIB_4_CRYPTO += -framework Security -framework CoreFoundation 1812endif 1813endif 1814ifndef NO_ICONV 1815 ifdef NEEDS_LIBICONV 1816 ifdef ICONVDIR 1817 BASIC_CFLAGS += -I$(ICONVDIR)/include 1818 ICONV_LINK = $(call libpath_template,$(ICONVDIR)/$(lib)) 1819 else 1820 ICONV_LINK = 1821 endif 1822 ifdef NEEDS_LIBINTL_BEFORE_LIBICONV 1823 ICONV_LINK += -lintl 1824 endif 1825 EXTLIBS += $(ICONV_LINK) -liconv 1826 endif 1827endif 1828ifdef ICONV_OMITS_BOM 1829 BASIC_CFLAGS += -DICONV_OMITS_BOM 1830endif 1831ifdef NEEDS_LIBGEN 1832 EXTLIBS += -lgen 1833endif 1834ifndef NO_GETTEXT 1835ifndef LIBC_CONTAINS_LIBINTL 1836 EXTLIBS += -lintl 1837endif 1838endif 1839ifdef NEEDS_SOCKET 1840 EXTLIBS += -lsocket 1841endif 1842ifdef NEEDS_NSL 1843 EXTLIBS += -lnsl 1844endif 1845ifdef NEEDS_RESOLV 1846 EXTLIBS += -lresolv 1847endif 1848ifdef NO_D_TYPE_IN_DIRENT 1849 BASIC_CFLAGS += -DNO_D_TYPE_IN_DIRENT 1850endif 1851ifdef NO_GECOS_IN_PWENT 1852 BASIC_CFLAGS += -DNO_GECOS_IN_PWENT 1853endif 1854ifdef NO_ST_BLOCKS_IN_STRUCT_STAT 1855 BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT 1856endif 1857ifdef USE_NSEC 1858 BASIC_CFLAGS += -DUSE_NSEC 1859endif 1860ifdef USE_ST_TIMESPEC 1861 BASIC_CFLAGS += -DUSE_ST_TIMESPEC 1862endif 1863ifdef NO_NORETURN 1864 BASIC_CFLAGS += -DNO_NORETURN 1865endif 1866ifdef NO_NSEC 1867 BASIC_CFLAGS += -DNO_NSEC 1868endif 1869ifdef SNPRINTF_RETURNS_BOGUS 1870 COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS 1871 COMPAT_OBJS += compat/snprintf.o 1872endif 1873ifdef FREAD_READS_DIRECTORIES 1874 COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES 1875 COMPAT_OBJS += compat/fopen.o 1876endif 1877ifdef OPEN_RETURNS_EINTR 1878 COMPAT_CFLAGS += -DOPEN_RETURNS_EINTR 1879endif 1880ifdef NO_SYMLINK_HEAD 1881 BASIC_CFLAGS += -DNO_SYMLINK_HEAD 1882endif 1883ifdef NO_GETTEXT 1884 BASIC_CFLAGS += -DNO_GETTEXT 1885 USE_GETTEXT_SCHEME ?= fallthrough 1886endif 1887ifdef NO_POLL 1888 NO_POLL_H = YesPlease 1889 NO_SYS_POLL_H = YesPlease 1890 COMPAT_CFLAGS += -DNO_POLL -Icompat/poll 1891 COMPAT_OBJS += compat/poll/poll.o 1892endif 1893ifdef NO_STRCASESTR 1894 COMPAT_CFLAGS += -DNO_STRCASESTR 1895 COMPAT_OBJS += compat/strcasestr.o 1896endif 1897ifdef NO_STRLCPY 1898 COMPAT_CFLAGS += -DNO_STRLCPY 1899 COMPAT_OBJS += compat/strlcpy.o 1900endif 1901ifdef NO_STRTOUMAX 1902 COMPAT_CFLAGS += -DNO_STRTOUMAX 1903 COMPAT_OBJS += compat/strtoumax.o compat/strtoimax.o 1904endif 1905ifdef NO_STRTOULL 1906 COMPAT_CFLAGS += -DNO_STRTOULL 1907endif 1908ifdef NO_SETENV 1909 COMPAT_CFLAGS += -DNO_SETENV 1910 COMPAT_OBJS += compat/setenv.o 1911endif 1912ifdef NO_MKDTEMP 1913 COMPAT_CFLAGS += -DNO_MKDTEMP 1914 COMPAT_OBJS += compat/mkdtemp.o 1915endif 1916ifdef MKDIR_WO_TRAILING_SLASH 1917 COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH 1918 COMPAT_OBJS += compat/mkdir.o 1919endif 1920ifdef NO_UNSETENV 1921 COMPAT_CFLAGS += -DNO_UNSETENV 1922 COMPAT_OBJS += compat/unsetenv.o 1923endif 1924ifdef NO_SYS_SELECT_H 1925 BASIC_CFLAGS += -DNO_SYS_SELECT_H 1926endif 1927ifdef NO_POLL_H 1928 BASIC_CFLAGS += -DNO_POLL_H 1929endif 1930ifdef NO_SYS_POLL_H 1931 BASIC_CFLAGS += -DNO_SYS_POLL_H 1932endif 1933ifdef NEEDS_SYS_PARAM_H 1934 BASIC_CFLAGS += -DNEEDS_SYS_PARAM_H 1935endif 1936ifdef NO_INTTYPES_H 1937 BASIC_CFLAGS += -DNO_INTTYPES_H 1938endif 1939ifdef NO_INITGROUPS 1940 BASIC_CFLAGS += -DNO_INITGROUPS 1941endif 1942ifdef NO_MMAP 1943 COMPAT_CFLAGS += -DNO_MMAP 1944 COMPAT_OBJS += compat/mmap.o 1945else 1946 ifdef USE_WIN32_MMAP 1947 COMPAT_CFLAGS += -DUSE_WIN32_MMAP 1948 COMPAT_OBJS += compat/win32mmap.o 1949 endif 1950endif 1951ifdef MMAP_PREVENTS_DELETE 1952 BASIC_CFLAGS += -DMMAP_PREVENTS_DELETE 1953endif 1954ifdef OBJECT_CREATION_USES_RENAMES 1955 COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1 1956endif 1957ifdef NO_STRUCT_ITIMERVAL 1958 COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL 1959 NO_SETITIMER = YesPlease 1960endif 1961ifdef NO_SETITIMER 1962 COMPAT_CFLAGS += -DNO_SETITIMER 1963endif 1964ifdef NO_PREAD 1965 COMPAT_CFLAGS += -DNO_PREAD 1966 COMPAT_OBJS += compat/pread.o 1967endif 1968ifdef NO_FAST_WORKING_DIRECTORY 1969 BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY 1970endif 1971ifdef NO_TRUSTABLE_FILEMODE 1972 BASIC_CFLAGS += -DNO_TRUSTABLE_FILEMODE 1973endif 1974ifdef NEEDS_MODE_TRANSLATION 1975 COMPAT_CFLAGS += -DNEEDS_MODE_TRANSLATION 1976 COMPAT_OBJS += compat/stat.o 1977endif 1978ifdef NO_IPV6 1979 BASIC_CFLAGS += -DNO_IPV6 1980endif 1981ifdef NO_INTPTR_T 1982 COMPAT_CFLAGS += -DNO_INTPTR_T 1983endif 1984ifdef NO_SOCKADDR_STORAGE 1985ifdef NO_IPV6 1986 BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in 1987else 1988 BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in6 1989endif 1990endif 1991ifdef NO_INET_NTOP 1992 LIB_OBJS += compat/inet_ntop.o 1993 BASIC_CFLAGS += -DNO_INET_NTOP 1994endif 1995ifdef NO_INET_PTON 1996 LIB_OBJS += compat/inet_pton.o 1997 BASIC_CFLAGS += -DNO_INET_PTON 1998endif 1999ifdef NO_UNIX_SOCKETS 2000 BASIC_CFLAGS += -DNO_UNIX_SOCKETS 2001else 2002 LIB_OBJS += unix-socket.o 2003 LIB_OBJS += unix-stream-server.o 2004endif 2005 2006# Simple IPC requires threads and platform-specific IPC support. 2007# Only platforms that have both should include these source files 2008# in the build. 2009# 2010# On Windows-based systems, Simple IPC requires threads and Windows 2011# Named Pipes. These are always available, so Simple IPC support 2012# is optional. 2013# 2014# On Unix-based systems, Simple IPC requires pthreads and Unix 2015# domain sockets. So support is only enabled when both are present. 2016# 2017ifdef USE_WIN32_IPC 2018 BASIC_CFLAGS += -DSUPPORTS_SIMPLE_IPC 2019 LIB_OBJS += compat/simple-ipc/ipc-shared.o 2020 LIB_OBJS += compat/simple-ipc/ipc-win32.o 2021else 2022ifndef NO_PTHREADS 2023ifndef NO_UNIX_SOCKETS 2024 BASIC_CFLAGS += -DSUPPORTS_SIMPLE_IPC 2025 LIB_OBJS += compat/simple-ipc/ipc-shared.o 2026 LIB_OBJS += compat/simple-ipc/ipc-unix-socket.o 2027endif 2028endif 2029endif 2030 2031ifdef NO_ICONV 2032 BASIC_CFLAGS += -DNO_ICONV 2033endif 2034 2035ifdef OLD_ICONV 2036 BASIC_CFLAGS += -DOLD_ICONV 2037endif 2038 2039ifdef NO_DEFLATE_BOUND 2040 BASIC_CFLAGS += -DNO_DEFLATE_BOUND 2041endif 2042 2043ifdef NO_POSIX_GOODIES 2044 BASIC_CFLAGS += -DNO_POSIX_GOODIES 2045endif 2046 2047ifdef APPLE_COMMON_CRYPTO_SHA1 2048 # Apple CommonCrypto requires chunking 2049 SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L 2050endif 2051 2052ifdef PPC_SHA1 2053$(error the PPC_SHA1 flag has been removed along with the PowerPC-specific SHA-1 implementation.) 2054endif 2055 2056ifdef OPENSSL_SHA1 2057 EXTLIBS += $(LIB_4_CRYPTO) 2058 BASIC_CFLAGS += -DSHA1_OPENSSL 2059else 2060ifdef BLK_SHA1 2061 LIB_OBJS += block-sha1/sha1.o 2062 BASIC_CFLAGS += -DSHA1_BLK 2063else 2064ifdef APPLE_COMMON_CRYPTO_SHA1 2065 COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL 2066 BASIC_CFLAGS += -DSHA1_APPLE 2067else 2068 BASIC_CFLAGS += -DSHA1_DC 2069 LIB_OBJS += sha1dc_git.o 2070ifdef DC_SHA1_EXTERNAL 2071 ifdef DC_SHA1_SUBMODULE 2072 ifneq ($(DC_SHA1_SUBMODULE),auto) 2073$(error Only set DC_SHA1_EXTERNAL or DC_SHA1_SUBMODULE, not both) 2074 endif 2075 endif 2076 BASIC_CFLAGS += -DDC_SHA1_EXTERNAL 2077 EXTLIBS += -lsha1detectcoll 2078else 2079ifdef DC_SHA1_SUBMODULE 2080 LIB_OBJS += sha1collisiondetection/lib/sha1.o 2081 LIB_OBJS += sha1collisiondetection/lib/ubc_check.o 2082 BASIC_CFLAGS += -DDC_SHA1_SUBMODULE 2083else 2084 LIB_OBJS += sha1dc/sha1.o 2085 LIB_OBJS += sha1dc/ubc_check.o 2086endif 2087 BASIC_CFLAGS += \ 2088 -DSHA1DC_NO_STANDARD_INCLUDES \ 2089 -DSHA1DC_INIT_SAFE_HASH_DEFAULT=0 \ 2090 -DSHA1DC_CUSTOM_INCLUDE_SHA1_C="\"git-compat-util.h\"" \ 2091 -DSHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C="\"git-compat-util.h\"" 2092endif 2093endif 2094endif 2095endif 2096 2097ifdef OPENSSL_SHA1_UNSAFE 2098ifndef OPENSSL_SHA1 2099 EXTLIBS += $(LIB_4_CRYPTO) 2100 BASIC_CFLAGS += -DSHA1_OPENSSL_UNSAFE 2101endif 2102else 2103ifdef BLK_SHA1_UNSAFE 2104ifndef BLK_SHA1 2105 LIB_OBJS += block-sha1/sha1.o 2106 BASIC_CFLAGS += -DSHA1_BLK_UNSAFE 2107endif 2108else 2109ifdef APPLE_COMMON_CRYPTO_SHA1_UNSAFE 2110ifndef APPLE_COMMON_CRYPTO_SHA1 2111 COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL 2112 BASIC_CFLAGS += -DSHA1_APPLE_UNSAFE 2113endif 2114endif 2115endif 2116endif 2117 2118ifdef OPENSSL_SHA256 2119 EXTLIBS += $(LIB_4_CRYPTO) 2120 BASIC_CFLAGS += -DSHA256_OPENSSL 2121else 2122ifdef NETTLE_SHA256 2123 BASIC_CFLAGS += -DSHA256_NETTLE 2124 EXTLIBS += -lnettle 2125else 2126ifdef GCRYPT_SHA256 2127 BASIC_CFLAGS += -DSHA256_GCRYPT 2128 EXTLIBS += -lgcrypt 2129else 2130 LIB_OBJS += sha256/block/sha256.o 2131 BASIC_CFLAGS += -DSHA256_BLK 2132endif 2133endif 2134endif 2135 2136ifdef SHA1_MAX_BLOCK_SIZE 2137 LIB_OBJS += compat/sha1-chunked.o 2138 BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)" 2139endif 2140ifdef NO_HSTRERROR 2141 COMPAT_CFLAGS += -DNO_HSTRERROR 2142 COMPAT_OBJS += compat/hstrerror.o 2143endif 2144ifdef NO_MEMMEM 2145 COMPAT_CFLAGS += -DNO_MEMMEM 2146 COMPAT_OBJS += compat/memmem.o 2147endif 2148ifdef NO_GETPAGESIZE 2149 COMPAT_CFLAGS += -DNO_GETPAGESIZE 2150endif 2151ifdef INTERNAL_QSORT 2152 COMPAT_CFLAGS += -DINTERNAL_QSORT 2153endif 2154ifdef HAVE_ISO_QSORT_S 2155 COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S 2156else 2157 COMPAT_OBJS += compat/qsort_s.o 2158endif 2159ifdef RUNTIME_PREFIX 2160 COMPAT_CFLAGS += -DRUNTIME_PREFIX 2161endif 2162 2163ifdef NO_PTHREADS 2164 BASIC_CFLAGS += -DNO_PTHREADS 2165else 2166 BASIC_CFLAGS += $(PTHREAD_CFLAGS) 2167 EXTLIBS += $(PTHREAD_LIBS) 2168endif 2169 2170ifdef HAVE_PATHS_H 2171 BASIC_CFLAGS += -DHAVE_PATHS_H 2172endif 2173 2174ifdef HAVE_LIBCHARSET_H 2175 BASIC_CFLAGS += -DHAVE_LIBCHARSET_H 2176 EXTLIBS += $(CHARSET_LIB) 2177endif 2178 2179ifdef HAVE_STRINGS_H 2180 BASIC_CFLAGS += -DHAVE_STRINGS_H 2181endif 2182 2183ifdef HAVE_DEV_TTY 2184 BASIC_CFLAGS += -DHAVE_DEV_TTY 2185endif 2186 2187ifdef DIR_HAS_BSD_GROUP_SEMANTICS 2188 COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS 2189endif 2190ifdef UNRELIABLE_FSTAT 2191 BASIC_CFLAGS += -DUNRELIABLE_FSTAT 2192endif 2193ifdef NO_REGEX 2194 COMPAT_CFLAGS += -Icompat/regex 2195 COMPAT_OBJS += compat/regex/regex.o 2196else 2197ifdef USE_ENHANCED_BASIC_REGULAR_EXPRESSIONS 2198 COMPAT_CFLAGS += -DUSE_ENHANCED_BASIC_REGULAR_EXPRESSIONS 2199 COMPAT_OBJS += compat/regcomp_enhanced.o 2200endif 2201endif 2202ifdef NATIVE_CRLF 2203 BASIC_CFLAGS += -DNATIVE_CRLF 2204endif 2205 2206ifdef USE_NED_ALLOCATOR 2207 COMPAT_CFLAGS += -Icompat/nedmalloc 2208 COMPAT_OBJS += compat/nedmalloc/nedmalloc.o 2209 OVERRIDE_STRDUP = YesPlease 2210endif 2211 2212ifdef OVERRIDE_STRDUP 2213 COMPAT_CFLAGS += -DOVERRIDE_STRDUP 2214 COMPAT_OBJS += compat/strdup.o 2215endif 2216 2217ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT 2218 export GIT_TEST_CMP_USE_COPIED_CONTEXT 2219endif 2220 2221ifndef NO_MSGFMT_EXTENDED_OPTIONS 2222 MSGFMT += --check 2223endif 2224 2225ifdef HAVE_CLOCK_GETTIME 2226 BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME 2227endif 2228 2229ifdef HAVE_CLOCK_MONOTONIC 2230 BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC 2231endif 2232 2233ifdef HAVE_SYNC_FILE_RANGE 2234 BASIC_CFLAGS += -DHAVE_SYNC_FILE_RANGE 2235endif 2236 2237ifdef HAVE_SYSINFO 2238 BASIC_CFLAGS += -DHAVE_SYSINFO 2239endif 2240 2241ifdef HAVE_BSD_SYSCTL 2242 BASIC_CFLAGS += -DHAVE_BSD_SYSCTL 2243endif 2244 2245ifdef HAVE_GETDELIM 2246 BASIC_CFLAGS += -DHAVE_GETDELIM 2247endif 2248 2249ifneq ($(findstring arc4random,$(CSPRNG_METHOD)),) 2250 BASIC_CFLAGS += -DHAVE_ARC4RANDOM 2251endif 2252 2253ifneq ($(findstring libbsd,$(CSPRNG_METHOD)),) 2254 BASIC_CFLAGS += -DHAVE_ARC4RANDOM_LIBBSD 2255 EXTLIBS += -lbsd 2256endif 2257 2258ifneq ($(findstring getrandom,$(CSPRNG_METHOD)),) 2259 BASIC_CFLAGS += -DHAVE_GETRANDOM 2260endif 2261 2262ifneq ($(findstring getentropy,$(CSPRNG_METHOD)),) 2263 BASIC_CFLAGS += -DHAVE_GETENTROPY 2264endif 2265 2266ifneq ($(findstring rtlgenrandom,$(CSPRNG_METHOD)),) 2267 BASIC_CFLAGS += -DHAVE_RTLGENRANDOM 2268endif 2269 2270ifneq ($(findstring openssl,$(CSPRNG_METHOD)),) 2271 BASIC_CFLAGS += -DHAVE_OPENSSL_CSPRNG 2272 EXTLIBS += -lcrypto -lssl 2273endif 2274 2275ifndef HAVE_PLATFORM_PROCINFO 2276 COMPAT_OBJS += compat/stub/procinfo.o 2277endif 2278 2279ifdef RUNTIME_PREFIX 2280 2281 ifdef HAVE_BSD_KERN_PROC_SYSCTL 2282 BASIC_CFLAGS += -DHAVE_BSD_KERN_PROC_SYSCTL 2283 endif 2284 2285 ifneq ($(PROCFS_EXECUTABLE_PATH),) 2286 pep_SQ = $(subst ','\'',$(PROCFS_EXECUTABLE_PATH)) 2287 BASIC_CFLAGS += '-DPROCFS_EXECUTABLE_PATH="$(pep_SQ)"' 2288 endif 2289 2290 ifdef HAVE_NS_GET_EXECUTABLE_PATH 2291 BASIC_CFLAGS += -DHAVE_NS_GET_EXECUTABLE_PATH 2292 endif 2293 2294 ifdef HAVE_ZOS_GET_EXECUTABLE_PATH 2295 BASIC_CFLAGS += -DHAVE_ZOS_GET_EXECUTABLE_PATH 2296 endif 2297 2298 ifdef HAVE_WPGMPTR 2299 BASIC_CFLAGS += -DHAVE_WPGMPTR 2300 endif 2301 2302endif 2303 2304ifdef FILENO_IS_A_MACRO 2305 COMPAT_CFLAGS += -DFILENO_IS_A_MACRO 2306 COMPAT_OBJS += compat/fileno.o 2307endif 2308 2309ifdef NEED_ACCESS_ROOT_HANDLER 2310 COMPAT_CFLAGS += -DNEED_ACCESS_ROOT_HANDLER 2311 COMPAT_OBJS += compat/access.o 2312endif 2313 2314ifdef FSMONITOR_DAEMON_BACKEND 2315 COMPAT_CFLAGS += -DHAVE_FSMONITOR_DAEMON_BACKEND 2316 COMPAT_OBJS += compat/fsmonitor/fsm-listen-$(FSMONITOR_DAEMON_BACKEND).o 2317 COMPAT_OBJS += compat/fsmonitor/fsm-health-$(FSMONITOR_DAEMON_BACKEND).o 2318 COMPAT_OBJS += compat/fsmonitor/fsm-ipc-$(FSMONITOR_DAEMON_BACKEND).o 2319endif 2320 2321ifdef FSMONITOR_OS_SETTINGS 2322 COMPAT_CFLAGS += -DHAVE_FSMONITOR_OS_SETTINGS 2323 COMPAT_OBJS += compat/fsmonitor/fsm-settings-$(FSMONITOR_OS_SETTINGS).o 2324 COMPAT_OBJS += compat/fsmonitor/fsm-path-utils-$(FSMONITOR_OS_SETTINGS).o 2325endif 2326 2327ifdef WITH_BREAKING_CHANGES 2328 BASIC_CFLAGS += -DWITH_BREAKING_CHANGES 2329endif 2330 2331ifdef CHECK_ASSERTION_SIDE_EFFECTS 2332 BASIC_CFLAGS += -DCHECK_ASSERTION_SIDE_EFFECTS 2333endif 2334 2335ifdef INCLUDE_LIBGIT_RS 2336 # Enable symbol hiding in contrib/libgit-sys/libgitpub.a without making 2337 # us rebuild the whole tree every time we run a Rust build. 2338 BASIC_CFLAGS += -fvisibility=hidden 2339endif 2340 2341ifeq ($(TCLTK_PATH),) 2342NO_TCLTK = NoThanks 2343endif 2344 2345ifeq ($(PERL_PATH),) 2346NO_PERL = NoThanks 2347endif 2348 2349ifeq ($(PYTHON_PATH),) 2350NO_PYTHON = NoThanks 2351endif 2352 2353ifndef PAGER_ENV 2354PAGER_ENV = LESS=FRX LV=-c 2355endif 2356 2357ifdef NO_INSTALL_HARDLINKS 2358 export NO_INSTALL_HARDLINKS 2359endif 2360 2361### profile feedback build 2362# 2363 2364# Can adjust this to be a global directory if you want to do extended 2365# data gathering 2366PROFILE_DIR := $(CURDIR) 2367 2368ifeq ("$(PROFILE)","GEN") 2369 BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1 2370 EXTLIBS += -lgcov 2371 export CCACHE_DISABLE = t 2372 V = 1 2373else 2374ifneq ("$(PROFILE)","") 2375 BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1 2376 export CCACHE_DISABLE = t 2377 V = 1 2378endif 2379endif 2380 2381# Shell quote (do not use $(call) to accommodate ancient setups); 2382 2383ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG)) 2384ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES)) 2385 2386DESTDIR_SQ = $(subst ','\'',$(DESTDIR)) 2387NO_GETTEXT_SQ = $(subst ','\'',$(NO_GETTEXT)) 2388bindir_SQ = $(subst ','\'',$(bindir)) 2389bindir_relative_SQ = $(subst ','\'',$(bindir_relative)) 2390mandir_SQ = $(subst ','\'',$(mandir)) 2391mandir_relative_SQ = $(subst ','\'',$(mandir_relative)) 2392infodir_relative_SQ = $(subst ','\'',$(infodir_relative)) 2393bash_completion_dir_SQ = $(subst ','\'',$(bash_completion_dir)) 2394perllibdir_SQ = $(subst ','\'',$(perllibdir)) 2395localedir_SQ = $(subst ','\'',$(localedir)) 2396localedir_relative_SQ = $(subst ','\'',$(localedir_relative)) 2397gitexecdir_SQ = $(subst ','\'',$(gitexecdir)) 2398gitexecdir_relative_SQ = $(subst ','\'',$(gitexecdir_relative)) 2399template_dir_SQ = $(subst ','\'',$(template_dir)) 2400htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative)) 2401prefix_SQ = $(subst ','\'',$(prefix)) 2402perllibdir_relative_SQ = $(subst ','\'',$(perllibdir_relative)) 2403gitwebdir_SQ = $(subst ','\'',$(gitwebdir)) 2404gitwebstaticdir_SQ = $(subst ','\'',$(gitwebstaticdir)) 2405 2406SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) 2407TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH)) 2408PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH)) 2409PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH)) 2410TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH)) 2411DIFF_SQ = $(subst ','\'',$(DIFF)) 2412PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA)) 2413 2414# RUNTIME_PREFIX's resolution logic requires resource paths to be expressed 2415# relative to each other and share an installation path. 2416# 2417# This is a dependency in: 2418# - Git's binary RUNTIME_PREFIX logic in (see "exec_cmd.c"). 2419# - The runtime prefix Perl header (see 2420# "perl/header_templates/runtime_prefix.template.pl"). 2421ifdef RUNTIME_PREFIX 2422 2423ifneq ($(filter /%,$(firstword $(gitexecdir_relative))),) 2424$(error RUNTIME_PREFIX requires a relative gitexecdir, not: $(gitexecdir)) 2425endif 2426 2427ifneq ($(filter /%,$(firstword $(localedir_relative))),) 2428$(error RUNTIME_PREFIX requires a relative localedir, not: $(localedir)) 2429endif 2430 2431ifndef NO_PERL 2432ifneq ($(filter /%,$(firstword $(perllibdir_relative))),) 2433$(error RUNTIME_PREFIX requires a relative perllibdir, not: $(perllibdir)) 2434endif 2435endif 2436 2437endif 2438 2439# We must filter out any object files from $(GITLIBS), 2440# as it is typically used like: 2441# 2442# foo: foo.o $(GITLIBS) 2443# $(CC) $(filter %.o,$^) $(LIBS) 2444# 2445# where we use it as a dependency. Since we also pull object files 2446# from the dependency list, that would make each entry appear twice. 2447LIBS = $(filter-out %.o, $(GITLIBS)) $(EXTLIBS) 2448 2449BASIC_CFLAGS += $(COMPAT_CFLAGS) 2450LIB_OBJS += $(COMPAT_OBJS) 2451 2452# Quote for C 2453 2454ifdef DEFAULT_EDITOR 2455DEFAULT_EDITOR_CQ = "$(subst ",\",$(subst \,\\,$(DEFAULT_EDITOR)))" 2456DEFAULT_EDITOR_CQ_SQ = $(subst ','\'',$(DEFAULT_EDITOR_CQ)) 2457 2458BASIC_CFLAGS += -DDEFAULT_EDITOR='$(DEFAULT_EDITOR_CQ_SQ)' 2459endif 2460 2461ifdef DEFAULT_PAGER 2462DEFAULT_PAGER_CQ = "$(subst ",\",$(subst \,\\,$(DEFAULT_PAGER)))" 2463DEFAULT_PAGER_CQ_SQ = $(subst ','\'',$(DEFAULT_PAGER_CQ)) 2464 2465BASIC_CFLAGS += -DDEFAULT_PAGER='$(DEFAULT_PAGER_CQ_SQ)' 2466endif 2467 2468ifdef SHELL_PATH 2469SHELL_PATH_CQ = "$(subst ",\",$(subst \,\\,$(SHELL_PATH)))" 2470SHELL_PATH_CQ_SQ = $(subst ','\'',$(SHELL_PATH_CQ)) 2471 2472BASIC_CFLAGS += -DSHELL_PATH='$(SHELL_PATH_CQ_SQ)' 2473endif 2474 2475GIT_USER_AGENT_SQ = $(subst ','\'',$(GIT_USER_AGENT)) 2476GIT_USER_AGENT_CQ = "$(subst ",\",$(subst \,\\,$(GIT_USER_AGENT)))" 2477GIT_USER_AGENT_CQ_SQ = $(subst ','\'',$(GIT_USER_AGENT_CQ)) 2478GIT-USER-AGENT: FORCE 2479 @if test x'$(GIT_USER_AGENT_SQ)' != x"`cat GIT-USER-AGENT 2>/dev/null`"; then \ 2480 echo '$(GIT_USER_AGENT_SQ)' >GIT-USER-AGENT; \ 2481 fi 2482 2483ifdef DEFAULT_HELP_FORMAT 2484BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"' 2485endif 2486 2487ALL_CFLAGS += $(BASIC_CFLAGS) 2488ALL_LDFLAGS += $(BASIC_LDFLAGS) 2489 2490export DIFF TAR INSTALL DESTDIR SHELL_PATH 2491 2492 2493### Build rules 2494 2495SHELL = $(SHELL_PATH) 2496 2497all:: shell_compatibility_test 2498 2499ifeq "$(PROFILE)" "BUILD" 2500all:: profile 2501endif 2502 2503profile:: profile-clean 2504 $(MAKE) PROFILE=GEN all 2505 $(MAKE) PROFILE=GEN -j1 test 2506 @if test -n "$$GIT_PERF_REPO" || test -d .git; then \ 2507 $(MAKE) PROFILE=GEN -j1 perf; \ 2508 else \ 2509 echo "Skipping profile of perf tests..."; \ 2510 fi 2511 $(MAKE) PROFILE=USE all 2512 2513profile-fast: profile-clean 2514 $(MAKE) PROFILE=GEN all 2515 $(MAKE) PROFILE=GEN -j1 perf 2516 $(MAKE) PROFILE=USE all 2517 2518 2519all:: $(ALL_COMMANDS_TO_INSTALL) $(SCRIPT_LIB) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS 2520ifneq (,$X) 2521 $(QUIET_BUILT_IN)$(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_COMMANDS_TO_INSTALL) $(OTHER_PROGRAMS))), if test ! -d '$p' && test ! '$p' -ef '$p$X'; then $(RM) '$p'; fi;) 2522endif 2523 2524all:: 2525ifndef NO_TCLTK 2526 $(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all 2527 $(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all 2528endif 2529 $(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)' 2530 2531# If you add a new fuzzer, please also make sure to run it in 2532# ci/run-build-and-minimal-fuzzers.sh so that we make sure it still links and 2533# runs in the future. 2534FUZZ_OBJS += oss-fuzz/dummy-cmd-main.o 2535FUZZ_OBJS += oss-fuzz/fuzz-commit-graph.o 2536FUZZ_OBJS += oss-fuzz/fuzz-config.o 2537FUZZ_OBJS += oss-fuzz/fuzz-credential-from-url-gently.o 2538FUZZ_OBJS += oss-fuzz/fuzz-date.o 2539FUZZ_OBJS += oss-fuzz/fuzz-pack-headers.o 2540FUZZ_OBJS += oss-fuzz/fuzz-pack-idx.o 2541FUZZ_OBJS += oss-fuzz/fuzz-parse-attr-line.o 2542FUZZ_OBJS += oss-fuzz/fuzz-url-decode-mem.o 2543.PHONY: fuzz-objs 2544fuzz-objs: $(FUZZ_OBJS) 2545 2546# Always build fuzz objects even if not testing, to prevent bit-rot. 2547all:: $(FUZZ_OBJS) 2548 2549FUZZ_PROGRAMS += $(patsubst %.o,%,$(filter-out %dummy-cmd-main.o,$(FUZZ_OBJS))) 2550 2551# Build fuzz programs when possible, even without the necessary fuzzing support, 2552# to prevent bit-rot. 2553ifdef LINK_FUZZ_PROGRAMS 2554all:: $(FUZZ_PROGRAMS) 2555endif 2556 2557please_set_SHELL_PATH_to_a_more_modern_shell: 2558 @$$(:) 2559 2560shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell 2561 2562strip: $(PROGRAMS) git$X 2563 $(STRIP) $(STRIP_OPTS) $^ 2564 2565### Target-specific flags and dependencies 2566 2567# The generic compilation pattern rule and automatically 2568# computed header dependencies (falling back to a dependency on 2569# LIB_H) are enough to describe how most targets should be built, 2570# but some targets are special enough to need something a little 2571# different. 2572# 2573# - When a source file "foo.c" #includes a generated header file, 2574# we need to list that dependency for the "foo.o" target. 2575# 2576# We also list it from other targets that are built from foo.c 2577# like "foo.sp" and "foo.s", even though that is easy to forget 2578# to do because the generated header is already present around 2579# after a regular build attempt. 2580# 2581# - Some code depends on configuration kept in makefile 2582# variables. The target-specific variable EXTRA_CPPFLAGS can 2583# be used to convey that information to the C preprocessor 2584# using -D options. 2585# 2586# The "foo.o" target should have a corresponding dependency on 2587# a file that changes when the value of the makefile variable 2588# changes. For example, targets making use of the 2589# $(GIT_VERSION) variable depend on GIT-VERSION-FILE. 2590# 2591# Technically the ".sp" and ".s" targets do not need this 2592# dependency because they are force-built, but they get the 2593# same dependency for consistency. This way, you do not have to 2594# know how each target is implemented. And it means the 2595# dependencies here will not need to change if the force-build 2596# details change some day. 2597 2598git.sp git.s git.o: GIT-PREFIX 2599git.sp git.s git.o: EXTRA_CPPFLAGS = \ 2600 '-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \ 2601 '-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \ 2602 '-DGIT_INFO_PATH="$(infodir_relative_SQ)"' 2603 2604git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS) 2605 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \ 2606 $(filter %.o,$^) $(LIBS) 2607 2608help.sp help.s help.o: command-list.h 2609builtin/bugreport.sp builtin/bugreport.s builtin/bugreport.o: hook-list.h 2610 2611builtin/help.sp builtin/help.s builtin/help.o: config-list.h GIT-PREFIX 2612builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \ 2613 '-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \ 2614 '-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \ 2615 '-DGIT_INFO_PATH="$(infodir_relative_SQ)"' 2616 2617PAGER_ENV_SQ = $(subst ','\'',$(PAGER_ENV)) 2618PAGER_ENV_CQ = "$(subst ",\",$(subst \,\\,$(PAGER_ENV)))" 2619PAGER_ENV_CQ_SQ = $(subst ','\'',$(PAGER_ENV_CQ)) 2620pager.sp pager.s pager.o: EXTRA_CPPFLAGS = \ 2621 -DPAGER_ENV='$(PAGER_ENV_CQ_SQ)' 2622 2623version-def.h: version-def.h.in GIT-VERSION-GEN GIT-VERSION-FILE GIT-USER-AGENT 2624 $(QUIET_GEN)$(call version_gen,"$(shell pwd)",$<,$@) 2625 2626version.sp version.s version.o: version-def.h 2627 2628$(BUILT_INS): git$X 2629 $(QUIET_BUILT_IN)$(RM) $@ && \ 2630 ln $< $@ 2>/dev/null || \ 2631 ln -s $< $@ 2>/dev/null || \ 2632 cp $< $@ 2633 2634config-list.h: generate-configlist.sh 2635 2636config-list.h: Documentation/*config.adoc Documentation/config/*.adoc 2637 $(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh . $@ 2638 2639command-list.h: generate-cmdlist.sh command-list.txt 2640 2641command-list.h: $(wildcard Documentation/git*.adoc) 2642 $(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh \ 2643 $(patsubst %,--exclude-program %,$(EXCLUDED_PROGRAMS)) \ 2644 . $@ 2645 2646hook-list.h: generate-hooklist.sh Documentation/githooks.adoc 2647 $(QUIET_GEN)$(SHELL_PATH) ./generate-hooklist.sh . $@ 2648 2649SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):\ 2650 $(localedir_SQ):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\ 2651 $(gitwebdir_SQ):$(PERL_PATH_SQ):$(PAGER_ENV):\ 2652 $(perllibdir_SQ) 2653GIT-SCRIPT-DEFINES: FORCE 2654 @FLAGS='$(SCRIPT_DEFINES)'; \ 2655 if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \ 2656 echo >&2 " * new script parameters"; \ 2657 echo "$$FLAGS" >$@; \ 2658 fi 2659 2660$(SCRIPT_SH_GEN) $(SCRIPT_LIB) : % : %.sh generate-script.sh GIT-BUILD-OPTIONS GIT-SCRIPT-DEFINES 2661 $(QUIET_GEN)./generate-script.sh "$<" "$@+" ./GIT-BUILD-OPTIONS && \ 2662 mv $@+ $@ 2663 2664git.rc: git.rc.in GIT-VERSION-GEN GIT-VERSION-FILE 2665 $(QUIET_GEN)$(call version_gen,"$(shell pwd)",$<,$@) 2666 2667git.res: git.rc GIT-PREFIX 2668 $(QUIET_RC)$(RC) -i $< -o $@ 2669 2670# This makes sure we depend on the NO_PERL setting itself. 2671$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS 2672 2673# Used for substitution in Perl modules. Disabled when using RUNTIME_PREFIX 2674# since the locale directory is injected. 2675perl_localedir_SQ = $(localedir_SQ) 2676 2677ifndef NO_PERL 2678PERL_HEADER_TEMPLATE = perl/header_templates/fixed_prefix.template.pl 2679PERL_DEFINES = 2680PERL_DEFINES += $(PERL_PATH_SQ) 2681PERL_DEFINES += $(PERLLIB_EXTRA_SQ) 2682PERL_DEFINES += $(perllibdir_SQ) 2683PERL_DEFINES += $(RUNTIME_PREFIX) 2684PERL_DEFINES += $(NO_PERL_CPAN_FALLBACKS) 2685PERL_DEFINES += $(NO_GETTEXT) 2686 2687# Support Perl runtime prefix. In this mode, a different header is installed 2688# into Perl scripts. 2689ifdef RUNTIME_PREFIX 2690 2691PERL_HEADER_TEMPLATE = perl/header_templates/runtime_prefix.template.pl 2692 2693# Don't export a fixed $(localedir) path; it will be resolved by the Perl header 2694# at runtime. 2695perl_localedir_SQ = 2696 2697endif 2698 2699PERL_DEFINES += $(gitexecdir) $(perllibdir) $(localedir) 2700 2701$(SCRIPT_PERL_GEN): % : %.perl generate-perl.sh GIT-PERL-DEFINES GIT-PERL-HEADER GIT-VERSION-FILE 2702 $(QUIET_GEN)$(SHELL_PATH) generate-perl.sh ./GIT-BUILD-OPTIONS ./GIT-VERSION-FILE GIT-PERL-HEADER "$<" "$@+" && \ 2703 mv $@+ $@ 2704 2705PERL_DEFINES := $(subst $(space),:,$(PERL_DEFINES)) 2706GIT-PERL-DEFINES: FORCE 2707 @FLAGS='$(PERL_DEFINES)'; \ 2708 if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \ 2709 echo >&2 " * new perl-specific parameters"; \ 2710 echo "$$FLAGS" >$@; \ 2711 fi 2712 2713GIT-PERL-HEADER: $(PERL_HEADER_TEMPLATE) GIT-PERL-DEFINES Makefile 2714 $(QUIET_GEN) \ 2715 INSTLIBDIR='$(perllibdir_SQ)' && \ 2716 INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \ 2717 INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \ 2718 sed -e 's=@PATHSEP@=$(pathsep)=g' \ 2719 -e "s=@INSTLIBDIR@=$$INSTLIBDIR=g" \ 2720 -e 's=@PERLLIBDIR_REL@=$(perllibdir_relative_SQ)=g' \ 2721 -e 's=@GITEXECDIR_REL@=$(gitexecdir_relative_SQ)=g' \ 2722 -e 's=@LOCALEDIR_REL@=$(localedir_relative_SQ)=g' \ 2723 $< >$@+ && \ 2724 mv $@+ $@ 2725 2726.PHONY: perllibdir 2727perllibdir: 2728 @echo '$(perllibdir_SQ)' 2729 2730git-instaweb: git-instaweb.sh generate-script.sh GIT-BUILD-OPTIONS GIT-SCRIPT-DEFINES 2731 $(QUIET_GEN)./generate-script.sh "$<" "$@+" ./GIT-BUILD-OPTIONS && \ 2732 chmod +x $@+ && \ 2733 mv $@+ $@ 2734else # NO_PERL 2735$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh 2736 $(QUIET_GEN) \ 2737 sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ 2738 -e 's|@REASON@|NO_PERL=$(NO_PERL)|g' \ 2739 unimplemented.sh >$@+ && \ 2740 chmod +x $@+ && \ 2741 mv $@+ $@ 2742endif # NO_PERL 2743 2744# This makes sure we depend on the NO_PYTHON setting itself. 2745$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS 2746 2747ifndef NO_PYTHON 2748$(SCRIPT_PYTHON_GEN): generate-python.sh 2749$(SCRIPT_PYTHON_GEN): % : %.py 2750 $(QUIET_GEN)$(SHELL_PATH) generate-python.sh ./GIT-BUILD-OPTIONS "$<" "$@" 2751else # NO_PYTHON 2752$(SCRIPT_PYTHON_GEN): % : unimplemented.sh 2753 $(QUIET_GEN) \ 2754 sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ 2755 -e 's|@REASON@|NO_PYTHON=$(NO_PYTHON)|g' \ 2756 unimplemented.sh >$@+ && \ 2757 chmod +x $@+ && \ 2758 mv $@+ $@ 2759endif # NO_PYTHON 2760 2761CONFIGURE_RECIPE = sed -e 's/@GIT_VERSION@/$(GIT_VERSION)/g' \ 2762 configure.ac >configure.ac+ && \ 2763 autoconf -o configure configure.ac+ && \ 2764 $(RM) configure.ac+ 2765 2766configure: configure.ac GIT-VERSION-FILE 2767 $(QUIET_GEN)$(CONFIGURE_RECIPE) 2768 2769ifdef AUTOCONFIGURED 2770# We avoid depending on 'configure' here, because it gets rebuilt 2771# every time GIT-VERSION-FILE is modified, only to update the embedded 2772# version number string, which config.status does not care about. We 2773# do want to recheck when the platform/environment detection logic 2774# changes, hence this depends on configure.ac. 2775config.status: configure.ac 2776 $(QUIET_GEN)$(CONFIGURE_RECIPE) && \ 2777 if test -f config.status; then \ 2778 ./config.status --recheck; \ 2779 else \ 2780 ./configure; \ 2781 fi 2782reconfigure config.mak.autogen: config.status 2783 $(QUIET_GEN)./config.status 2784.PHONY: reconfigure # This is a convenience target. 2785endif 2786 2787TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) 2788 2789.PHONY: test-objs 2790test-objs: $(TEST_OBJS) 2791 2792GIT_OBJS += $(LIB_OBJS) 2793GIT_OBJS += $(BUILTIN_OBJS) 2794GIT_OBJS += common-main.o 2795GIT_OBJS += git.o 2796.PHONY: git-objs 2797git-objs: $(GIT_OBJS) 2798 2799SCALAR_OBJS += scalar.o 2800.PHONY: scalar-objs 2801scalar-objs: $(SCALAR_OBJS) 2802 2803OBJECTS += $(GIT_OBJS) 2804OBJECTS += $(SCALAR_OBJS) 2805OBJECTS += $(PROGRAM_OBJS) 2806OBJECTS += $(TEST_OBJS) 2807OBJECTS += $(FUZZ_OBJS) 2808OBJECTS += $(REFTABLE_TEST_OBJS) 2809OBJECTS += $(UNIT_TEST_OBJS) 2810OBJECTS += $(CLAR_TEST_OBJS) 2811OBJECTS += $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(UNIT_TEST_PROGRAMS)) 2812 2813ifdef INCLUDE_LIBGIT_RS 2814 OBJECTS += contrib/libgit-sys/public_symbol_export.o 2815endif 2816 2817ifndef NO_CURL 2818 OBJECTS += http.o http-walker.o remote-curl.o 2819endif 2820 2821.PHONY: objects 2822objects: $(OBJECTS) 2823 2824dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d) 2825dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS)))) 2826 2827ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes) 2828$(dep_dirs): 2829 @mkdir -p $@ 2830 2831missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs)) 2832dep_file = $(dir $@).depend/$(notdir $@).d 2833dep_args = -MF $(dep_file) -MQ $@ -MMD -MP 2834endif 2835 2836ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes) 2837missing_dep_dirs = 2838dep_args = 2839endif 2840 2841compdb_dir = compile_commands 2842 2843ifeq ($(GENERATE_COMPILATION_DATABASE),yes) 2844missing_compdb_dir = $(filter-out $(wildcard $(compdb_dir)), $(compdb_dir)) 2845$(missing_compdb_dir): 2846 @mkdir -p $@ 2847 2848compdb_file = $(compdb_dir)/$(subst /,-,$@.json) 2849compdb_args = -MJ $(compdb_file) 2850else 2851missing_compdb_dir = 2852compdb_args = 2853endif 2854 2855$(OBJECTS): %.o: %.c GIT-CFLAGS $(missing_dep_dirs) $(missing_compdb_dir) 2856 $(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(compdb_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $< 2857 2858%.s: %.c GIT-CFLAGS FORCE 2859 $(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $< 2860 2861ifdef USE_COMPUTED_HEADER_DEPENDENCIES 2862# Take advantage of gcc's on-the-fly dependency generation 2863# See <https://gcc.gnu.org/gcc-3.0/features.html>. 2864dep_files_present := $(wildcard $(dep_files)) 2865ifneq ($(dep_files_present),) 2866include $(dep_files_present) 2867endif 2868else 2869$(OBJECTS): $(LIB_H) $(GENERATED_H) 2870endif 2871 2872ifeq ($(GENERATE_COMPILATION_DATABASE),yes) 2873all:: compile_commands.json 2874compile_commands.json: 2875 $(QUIET_GEN)sed -e '1s/^/[/' -e '$$s/,$$/]/' $(compdb_dir)/*.o.json > $@+ 2876 @if test -s $@+; then mv $@+ $@; else $(RM) $@+; fi 2877endif 2878 2879exec-cmd.sp exec-cmd.s exec-cmd.o: GIT-PREFIX 2880exec-cmd.sp exec-cmd.s exec-cmd.o: EXTRA_CPPFLAGS = \ 2881 '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \ 2882 '-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \ 2883 '-DBINDIR="$(bindir_relative_SQ)"' \ 2884 '-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"' 2885 2886setup.sp setup.s setup.o: GIT-PREFIX 2887setup.sp setup.s setup.o: EXTRA_CPPFLAGS = \ 2888 -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' 2889 2890config.sp config.s config.o: GIT-PREFIX 2891config.sp config.s config.o: EXTRA_CPPFLAGS = \ 2892 -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"' 2893 2894attr.sp attr.s attr.o: GIT-PREFIX 2895attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \ 2896 -DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"' 2897 2898gettext.sp gettext.s gettext.o: GIT-PREFIX 2899gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \ 2900 -DGIT_LOCALE_PATH='"$(localedir_relative_SQ)"' 2901 2902http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SP_EXTRA_FLAGS += \ 2903 -DCURL_DISABLE_TYPECHECK 2904 2905pack-revindex.sp: SP_EXTRA_FLAGS += -Wno-memcpy-max-count 2906 2907ifdef NO_EXPAT 2908http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT 2909endif 2910 2911ifdef NO_REGEX 2912compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \ 2913 -DGAWK -DNO_MBSUPPORT 2914endif 2915 2916ifdef USE_NED_ALLOCATOR 2917compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \ 2918 -DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR 2919compat/nedmalloc/nedmalloc.sp: SP_EXTRA_FLAGS += -Wno-non-pointer-null 2920endif 2921 2922headless-git.o: compat/win32/headless.c GIT-CFLAGS 2923 $(QUIET_CC)$(CC) $(ALL_CFLAGS) $(COMPAT_CFLAGS) \ 2924 -fno-stack-protector -o $@ -c -Wall -Wwrite-strings $< 2925 2926headless-git$X: headless-git.o git.res GIT-LDFLAGS 2927 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) $(ALL_LDFLAGS) -mwindows -o $@ $< git.res 2928 2929git-%$X: %.o GIT-LDFLAGS $(GITLIBS) 2930 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) 2931 2932git-imap-send$X: imap-send.o $(IMAP_SEND_BUILDDEPS) GIT-LDFLAGS $(GITLIBS) 2933 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ 2934 $(IMAP_SEND_LDFLAGS) $(LIBS) 2935 2936git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS) 2937 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ 2938 $(CURL_LIBCURL) $(LIBS) 2939git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS) 2940 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ 2941 $(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS) 2942 2943$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY) 2944 $(QUIET_LNCP)$(RM) $@ && \ 2945 ln $< $@ 2>/dev/null || \ 2946 ln -s $< $@ 2>/dev/null || \ 2947 cp $< $@ 2948 2949$(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o GIT-LDFLAGS $(GITLIBS) 2950 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ 2951 $(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS) 2952 2953scalar$X: scalar.o GIT-LDFLAGS $(GITLIBS) 2954 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \ 2955 $(filter %.o,$^) $(LIBS) 2956 2957$(LIB_FILE): $(LIB_OBJS) 2958 $(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^ 2959 2960$(RUST_LIB): Cargo.toml $(RUST_SOURCES) 2961 $(QUIET_CARGO)cargo build $(CARGO_ARGS) 2962 2963.PHONY: rust 2964rust: $(RUST_LIB) 2965 2966export DEFAULT_EDITOR DEFAULT_PAGER 2967 2968Documentation/GIT-EXCLUDED-PROGRAMS: FORCE 2969 @EXCLUDED='EXCLUDED_PROGRAMS := $(EXCLUDED_PROGRAMS)'; \ 2970 if test x"$$EXCLUDED" != \ 2971 x"`cat Documentation/GIT-EXCLUDED-PROGRAMS 2>/dev/null`" ; then \ 2972 echo >&2 " * new documentation flags"; \ 2973 echo "$$EXCLUDED" >Documentation/GIT-EXCLUDED-PROGRAMS; \ 2974 fi 2975 2976.PHONY: doc man man-perl html info pdf 2977doc: man-perl 2978 $(MAKE) -C Documentation all 2979 2980man: man-perl 2981 $(MAKE) -C Documentation man 2982 2983man-perl: perl/build/man/man3/Git.3pm 2984 2985html: 2986 $(MAKE) -C Documentation html 2987 2988info: 2989 $(MAKE) -C Documentation info 2990 2991pdf: 2992 $(MAKE) -C Documentation pdf 2993 2994XGETTEXT_FLAGS = \ 2995 --force-po \ 2996 --add-comments=TRANSLATORS: \ 2997 --msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \ 2998 --package-name=Git 2999XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \ 3000 --keyword=_ --keyword=N_ --keyword="Q_:1,2" 3001XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \ 3002 --keyword=gettextln --keyword=eval_gettextln 3003XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \ 3004 --keyword=__ --keyword=N__ --keyword="__n:1,2" 3005MSGMERGE_FLAGS = --add-location --backup=off --update 3006LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(GENERATED_H)) 3007LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh) 3008LOCALIZED_PERL = $(sort $(SCRIPT_PERL)) 3009 3010ifdef XGETTEXT_INCLUDE_TESTS 3011LOCALIZED_C += t/t0200/test.c 3012LOCALIZED_SH += t/t0200/test.sh 3013LOCALIZED_PERL += t/t0200/test.perl 3014endif 3015 3016## We generate intermediate .build/pot/po/%.po files containing a 3017## extract of the translations we find in each file in the source 3018## tree. We will assemble them using msgcat to create the final 3019## "po/git.pot" file. 3020LOCALIZED_ALL_GEN_PO = 3021 3022LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po) 3023LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO) 3024 3025LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po) 3026LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO) 3027 3028LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po) 3029LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO) 3030 3031## Gettext tools cannot work with our own custom PRItime type, so 3032## we replace PRItime with PRIuMAX. We need to update this to 3033## PRIdMAX if we switch to a signed type later. 3034$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: % 3035 $(call mkdir_p_parent_template) 3036 $(QUIET_XGETTEXT) \ 3037 if grep -q PRItime $<; then \ 3038 (\ 3039 sed -e 's|PRItime|PRIuMAX|g' <$< \ 3040 >.build/pot/po/$< && \ 3041 cd .build/pot/po && \ 3042 $(XGETTEXT) --omit-header \ 3043 -o $(@:.build/pot/po/%=%) \ 3044 $(XGETTEXT_FLAGS_C) $< && \ 3045 rm $<; \ 3046 ); \ 3047 else \ 3048 $(XGETTEXT) --omit-header \ 3049 -o $@ $(XGETTEXT_FLAGS_C) $<; \ 3050 fi 3051 3052$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: % 3053 $(call mkdir_p_parent_template) 3054 $(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \ 3055 -o$@ $(XGETTEXT_FLAGS_SH) $< 3056 3057$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: % 3058 $(call mkdir_p_parent_template) 3059 $(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \ 3060 -o$@ $(XGETTEXT_FLAGS_PERL) $< 3061 3062define gen_pot_header 3063$(XGETTEXT) $(XGETTEXT_FLAGS_C) \ 3064 -o - /dev/null | \ 3065sed -e 's|charset=CHARSET|charset=UTF-8|' \ 3066 -e 's|\(Last-Translator: \)FULL NAME <.*>|\1make by the Makefile|' \ 3067 -e 's|\(Language-Team: \)LANGUAGE <.*>|\1Git Mailing List <git@vger.kernel.org>|' \ 3068 >$@ && \ 3069echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@ 3070endef 3071 3072.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO) 3073 $(call mkdir_p_parent_template) 3074 $(QUIET_GEN)$(gen_pot_header) 3075 3076po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) 3077 $(QUIET_GEN)$(MSGCAT) $^ >$@ 3078 3079.PHONY: pot 3080pot: po/git.pot 3081 3082define check_po_file_envvar 3083 $(if $(PO_FILE), \ 3084 $(if $(filter po/%.po,$(PO_FILE)), , \ 3085 $(error PO_FILE should match pattern: "po/%.po")), \ 3086 $(error PO_FILE is not defined)) 3087endef 3088 3089.PHONY: po-update 3090po-update: po/git.pot 3091 $(check_po_file_envvar) 3092 @if test ! -e $(PO_FILE); then \ 3093 echo >&2 "error: $(PO_FILE) does not exist"; \ 3094 echo >&2 'To create an initial po file, use: "make po-init PO_FILE=po/XX.po"'; \ 3095 exit 1; \ 3096 fi 3097 $(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot 3098 3099.PHONY: check-pot 3100check-pot: $(LOCALIZED_ALL_GEN_PO) 3101 3102### TODO FIXME: Translating everything in these files is a bad 3103### heuristic for "core", as we'll translate obscure error() messages 3104### along with commonly seen i18n messages. A better heuristic would 3105### be to e.g. use spatch to first remove error/die/warning 3106### etc. messages. 3107LOCALIZED_C_CORE = 3108LOCALIZED_C_CORE += builtin/checkout.c 3109LOCALIZED_C_CORE += builtin/clone.c 3110LOCALIZED_C_CORE += builtin/index-pack.c 3111LOCALIZED_C_CORE += builtin/push.c 3112LOCALIZED_C_CORE += builtin/reset.c 3113LOCALIZED_C_CORE += remote.c 3114LOCALIZED_C_CORE += wt-status.c 3115 3116LOCALIZED_C_CORE_GEN_PO = $(LOCALIZED_C_CORE:%=.build/pot/po/%.po) 3117 3118.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO) 3119 $(call mkdir_p_parent_template) 3120 $(QUIET_GEN)$(gen_pot_header) 3121 3122po/git-core.pot: .build/pot/git-core.header $(LOCALIZED_C_CORE_GEN_PO) 3123 $(QUIET_GEN)$(MSGCAT) $^ >$@ 3124 3125.PHONY: po-init 3126po-init: po/git-core.pot 3127 $(check_po_file_envvar) 3128 @if test -e $(PO_FILE); then \ 3129 echo >&2 "error: $(PO_FILE) exists already"; \ 3130 exit 1; \ 3131 fi 3132 $(QUIET_MSGINIT)msginit \ 3133 --input=$< \ 3134 --output=$(PO_FILE) \ 3135 --no-translator \ 3136 --locale=$(PO_FILE:po/%.po=%) 3137 3138## po/*.po files & their rules 3139ifdef NO_GETTEXT 3140POFILES := 3141MOFILES := 3142else 3143POFILES := $(wildcard po/*.po) 3144MOFILES := $(patsubst po/%.po,po/build/locale/%/LC_MESSAGES/git.mo,$(POFILES)) 3145 3146all:: $(MOFILES) 3147endif 3148 3149po/build/locale/%/LC_MESSAGES/git.mo: po/%.po 3150 $(call mkdir_p_parent_template) 3151 $(QUIET_MSGFMT)$(MSGFMT) -o $@ $< 3152 3153LIB_PERL := $(wildcard perl/Git.pm perl/Git/*.pm perl/Git/*/*.pm perl/Git/*/*/*.pm) 3154LIB_PERL_GEN := $(patsubst perl/%.pm,perl/build/lib/%.pm,$(LIB_PERL)) 3155LIB_CPAN := $(wildcard perl/FromCPAN/*.pm perl/FromCPAN/*/*.pm) 3156LIB_CPAN_GEN := $(patsubst perl/%.pm,perl/build/lib/%.pm,$(LIB_CPAN)) 3157 3158ifndef NO_PERL 3159all:: $(LIB_PERL_GEN) 3160ifndef NO_PERL_CPAN_FALLBACKS 3161all:: $(LIB_CPAN_GEN) 3162endif 3163NO_PERL_CPAN_FALLBACKS_SQ = $(subst ','\'',$(NO_PERL_CPAN_FALLBACKS)) 3164endif 3165 3166perl/build/lib/%.pm: perl/%.pm generate-perl.sh GIT-BUILD-OPTIONS GIT-VERSION-FILE GIT-PERL-DEFINES 3167 $(call mkdir_p_parent_template) 3168 $(QUIET_GEN)$(SHELL_PATH) generate-perl.sh ./GIT-BUILD-OPTIONS ./GIT-VERSION-FILE GIT-PERL-HEADER "$<" "$@" 3169 3170perl/build/man/man3/Git.3pm: perl/Git.pm 3171 $(call mkdir_p_parent_template) 3172 $(QUIET_GEN)pod2man $< $@ 3173 3174$(ETAGS_TARGET): $(FOUND_SOURCE_FILES) 3175 $(QUIET_GEN)$(RM) $@+ && \ 3176 echo $(FOUND_SOURCE_FILES) | xargs etags -a -o $@+ && \ 3177 mv $@+ $@ 3178 3179tags: $(FOUND_SOURCE_FILES) 3180 $(QUIET_GEN)$(RM) $@+ && \ 3181 echo $(FOUND_SOURCE_FILES) | xargs ctags -a -o $@+ && \ 3182 mv $@+ $@ 3183 3184cscope.out: $(FOUND_SOURCE_FILES) 3185 $(QUIET_GEN)$(RM) $@+ && \ 3186 echo $(FOUND_SOURCE_FILES) | xargs cscope -f$@+ -b && \ 3187 mv $@+ $@ 3188 3189.PHONY: cscope 3190cscope: cscope.out 3191 3192### Detect prefix changes 3193TRACK_PREFIX = $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ):\ 3194 $(localedir_SQ) 3195 3196GIT-PREFIX: FORCE 3197 @FLAGS='$(TRACK_PREFIX)'; \ 3198 if test x"$$FLAGS" != x"`cat GIT-PREFIX 2>/dev/null`" ; then \ 3199 echo >&2 " * new prefix flags"; \ 3200 echo "$$FLAGS" >GIT-PREFIX; \ 3201 fi 3202 3203TRACK_CFLAGS = $(CC):$(subst ','\'',$(ALL_CFLAGS)):$(USE_GETTEXT_SCHEME) 3204 3205GIT-CFLAGS: FORCE 3206 @FLAGS='$(TRACK_CFLAGS)'; \ 3207 if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \ 3208 echo >&2 " * new build flags"; \ 3209 echo "$$FLAGS" >GIT-CFLAGS; \ 3210 fi 3211 3212TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS)) 3213 3214GIT-LDFLAGS: FORCE 3215 @FLAGS='$(TRACK_LDFLAGS)'; \ 3216 if test x"$$FLAGS" != x"`cat GIT-LDFLAGS 2>/dev/null`" ; then \ 3217 echo >&2 " * new link flags"; \ 3218 echo "$$FLAGS" >GIT-LDFLAGS; \ 3219 fi 3220 3221ifdef RUNTIME_PREFIX 3222RUNTIME_PREFIX_OPTION = true 3223else 3224RUNTIME_PREFIX_OPTION = false 3225endif 3226 3227# We need to apply sq twice, once to protect from the shell 3228# that runs GIT-BUILD-OPTIONS, and then again to protect it 3229# and the first level quoting from the shell that runs "echo". 3230GIT-BUILD-OPTIONS: FORCE 3231 @sed \ 3232 -e "s!@BROKEN_PATH_FIX@!\'$(BROKEN_PATH_FIX)\'!" \ 3233 -e "s|@DIFF@|\'$(DIFF)\'|" \ 3234 -e "s|@FSMONITOR_DAEMON_BACKEND@|\'$(FSMONITOR_DAEMON_BACKEND)\'|" \ 3235 -e "s|@FSMONITOR_OS_SETTINGS@|\'$(FSMONITOR_OS_SETTINGS)\'|" \ 3236 -e "s|@GITWEBDIR@|\'$(gitwebdir_SQ)\'|" \ 3237 -e "s|@GIT_INTEROP_MAKE_OPTS@|\'$(GIT_INTEROP_MAKE_OPTS)\'|" \ 3238 -e "s|@GIT_PERF_LARGE_REPO@|\'$(GIT_PERF_LARGE_REPO)\'|" \ 3239 -e "s|@GIT_PERF_MAKE_COMMAND@|\'$(GIT_PERF_MAKE_COMMAND)\'|" \ 3240 -e "s|@GIT_PERF_MAKE_OPTS@|\'$(GIT_PERF_MAKE_OPTS)\'|" \ 3241 -e "s|@GIT_PERF_REPEAT_COUNT@|\'$(GIT_PERF_REPEAT_COUNT)\'|" \ 3242 -e "s|@GIT_PERF_REPO@|\'$(GIT_PERF_REPO)\'|" \ 3243 -e "s|@GIT_SOURCE_DIR@|\'$(shell pwd)\'|" \ 3244 -e "s|@GIT_TEST_CMP@|\'$(GIT_TEST_CMP)\'|" \ 3245 -e "s|@GIT_TEST_CMP_USE_COPIED_CONTEXT@|\'$(GIT_TEST_CMP_USE_COPIED_CONTEXT)\'|" \ 3246 -e "s|@GIT_TEST_GITPERLLIB@|\'$(shell pwd)/perl/build/lib\'|" \ 3247 -e "s|@GIT_TEST_INDEX_VERSION@|\'$(GIT_TEST_INDEX_VERSION)\'|" \ 3248 -e "s|@GIT_TEST_OPTS@|\'$(GIT_TEST_OPTS)\'|" \ 3249 -e "s|@GIT_TEST_PERL_FATAL_WARNINGS@|\'$(GIT_TEST_PERL_FATAL_WARNINGS)\'|" \ 3250 -e "s|@GIT_TEST_TEMPLATE_DIR@|\'$(shell pwd)/templates/blt\'|" \ 3251 -e "s|@GIT_TEST_TEXTDOMAINDIR@|\'$(shell pwd)/po/build/locale\'|" \ 3252 -e "s|@GIT_TEST_UTF8_LOCALE@|\'$(GIT_TEST_UTF8_LOCALE)\'|" \ 3253 -e "s|@LOCALEDIR@|\'$(localedir_SQ)\'|" \ 3254 -e "s|@NO_CURL@|\'$(NO_CURL)\'|" \ 3255 -e "s|@NO_EXPAT@|\'$(NO_EXPAT)\'|" \ 3256 -e "s|@NO_GETTEXT@|\'$(NO_GETTEXT)\'|" \ 3257 -e "s|@NO_GITWEB@|\'$(NO_GITWEB)\'|" \ 3258 -e "s|@NO_ICONV@|\'$(NO_ICONV)\'|" \ 3259 -e "s|@NO_PERL@|\'$(NO_PERL)\'|" \ 3260 -e "s|@NO_PERL_CPAN_FALLBACKS@|\'$(NO_PERL_CPAN_FALLBACKS_SQ)\'|" \ 3261 -e "s|@NO_PTHREADS@|\'$(NO_PTHREADS)\'|" \ 3262 -e "s|@NO_PYTHON@|\'$(NO_PYTHON)\'|" \ 3263 -e "s|@NO_REGEX@|\'$(NO_REGEX)\'|" \ 3264 -e "s|@NO_UNIX_SOCKETS@|\'$(NO_UNIX_SOCKETS)\'|" \ 3265 -e "s|@PAGER_ENV@|\'$(PAGER_ENV)\'|" \ 3266 -e "s|@PERL_LOCALEDIR@|\'$(perl_localedir_SQ)\'|" \ 3267 -e "s|@PERL_PATH@|\'$(PERL_PATH_SQ)\'|" \ 3268 -e "s|@PYTHON_PATH@|\'$(PYTHON_PATH_SQ)\'|" \ 3269 -e "s|@RUNTIME_PREFIX@|\'$(RUNTIME_PREFIX_OPTION)\'|" \ 3270 -e "s|@SANITIZE_ADDRESS@|\'$(SANITIZE_ADDRESS)\'|" \ 3271 -e "s|@SANITIZE_LEAK@|\'$(SANITIZE_LEAK)\'|" \ 3272 -e "s|@SHELL_PATH@|\'$(SHELL_PATH_SQ)\'|" \ 3273 -e "s|@TAR@|\'$(TAR)\'|" \ 3274 -e "s|@TEST_OUTPUT_DIRECTORY@|\'$(TEST_OUTPUT_DIRECTORY)\'|" \ 3275 -e "s|@TEST_SHELL_PATH@|\'$(TEST_SHELL_PATH_SQ)\'|" \ 3276 -e "s|@USE_GETTEXT_SCHEME@|\'$(USE_GETTEXT_SCHEME)\'|" \ 3277 -e "s|@USE_LIBPCRE2@|\'$(USE_LIBPCRE2)\'|" \ 3278 -e "s|@WITH_BREAKING_CHANGES@|\'$(WITH_BREAKING_CHANGES)\'|" \ 3279 -e "s|@X@|\'$(X)\'|" \ 3280 GIT-BUILD-OPTIONS.in >$@+ 3281 @if grep -q '^[A-Z][A-Z_]*=@.*@$$' $@+; then echo "Unsubstituted build options in $@" >&2 && exit 1; fi 3282 @if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi 3283 @if test -f GIT-BUILD-DIR; then rm GIT-BUILD-DIR; fi 3284 3285### Detect Python interpreter path changes 3286ifndef NO_PYTHON 3287TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)') 3288 3289GIT-PYTHON-VARS: FORCE 3290 @VARS='$(TRACK_PYTHON)'; \ 3291 if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \ 3292 echo >&2 " * new Python interpreter location"; \ 3293 echo "$$VARS" >$@; \ 3294 fi 3295endif 3296 3297test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X)) 3298 3299all:: $(TEST_PROGRAMS) $(test_bindir_programs) $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG) 3300 3301$(test_bindir_programs): bin-wrappers/%: bin-wrappers/wrap-for-bin.sh 3302 $(QUIET_GEN)sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ 3303 -e 's|@BUILD_DIR@|$(shell pwd)|' \ 3304 -e 's|@GIT_TEXTDOMAINDIR@|$(shell pwd)/po/build/locale|' \ 3305 -e 's|@GITPERLLIB@|$(shell pwd)/perl/build/lib|' \ 3306 -e 's|@MERGE_TOOLS_DIR@|$(shell pwd)/mergetools|' \ 3307 -e 's|@TEMPLATE_DIR@|$(shell pwd)/templates/blt|' \ 3308 -e 's|@PROG@|$(shell pwd)/$(patsubst test-%,t/helper/test-%,$(@F))$(if $(filter-out $(BINDIR_PROGRAMS_NO_X),$(@F)),$(X),)|' < $< > $@ && \ 3309 chmod +x $@ 3310 3311# GNU make supports exporting all variables by "export" without parameters. 3312# However, the environment gets quite big, and some programs have problems 3313# with that. 3314 3315export NO_SVN_TESTS 3316export TEST_NO_MALLOC_CHECK 3317 3318### Testing rules 3319 3320test: all 3321 $(MAKE) -C t/ all 3322 3323perf: all 3324 $(MAKE) -C t/perf/ all 3325 3326.PHONY: test perf 3327 3328.PRECIOUS: $(TEST_OBJS) 3329 3330t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) $(UNIT_TEST_DIR)/test-lib.o 3331 3332t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) 3333 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS) 3334 3335check-sha1:: t/helper/test-tool$X 3336 t/helper/test-sha1.sh 3337 3338SP_SRC = $(filter-out $(THIRD_PARTY_SOURCES),$(patsubst %.o,%.c,$(OBJECTS))) 3339SP_OBJ = $(patsubst %.c,%.sp,$(SP_SRC)) 3340 3341$(SP_OBJ): %.sp: %.c %.o $(GENERATED_H) 3342 $(QUIET_SP)cgcc -no-compile $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) \ 3343 -Wsparse-error \ 3344 $(SPARSE_FLAGS) $(SP_EXTRA_FLAGS) $< && \ 3345 >$@ 3346 3347.PHONY: sparse 3348sparse: $(SP_OBJ) 3349 3350EXCEPT_HDRS := $(GENERATED_H) unicode-width.h compat/% xdiff/% $(UNIT_TEST_DIR)/clar/% $(UNIT_TEST_DIR)/clar/clar/% 3351ifndef OPENSSL_SHA1 3352 EXCEPT_HDRS += sha1/openssl.h 3353endif 3354ifndef OPENSSL_SHA256 3355 EXCEPT_HDRS += sha256/openssl.h 3356endif 3357ifndef NETTLE_SHA256 3358 EXCEPT_HDRS += sha256/nettle.h 3359endif 3360ifndef GCRYPT_SHA256 3361 EXCEPT_HDRS += sha256/gcrypt.h 3362endif 3363CHK_HDRS = $(filter-out $(EXCEPT_HDRS),$(LIB_H)) 3364HCO = $(patsubst %.h,%.hco,$(CHK_HDRS)) 3365HCC = $(HCO:hco=hcc) 3366 3367%.hcc: %.h 3368 @echo '#include "git-compat-util.h"' >$@ 3369 @echo '#include "$<"' >>$@ 3370 3371$(HCO): %.hco: %.hcc $(GENERATED_H) FORCE 3372 $(QUIET_HDR)$(CC) $(ALL_CFLAGS) -o /dev/null -c -xc $< 3373 3374# TODO: deprecate 'hdr-check' in lieu of 'check-headers' in Git 2.51+ 3375.PHONY: hdr-check check-headers $(HCO) 3376hdr-check: $(HCO) 3377check-headers: hdr-check 3378 3379.PHONY: style 3380style: 3381 git clang-format --style file --diff --extensions c,h 3382 3383.PHONY: check 3384check: 3385 @if sparse; \ 3386 then \ 3387 echo >&2 "Use 'make sparse' instead"; \ 3388 $(MAKE) --no-print-directory sparse; \ 3389 else \ 3390 echo >&2 "Did you mean 'make test'?"; \ 3391 exit 1; \ 3392 fi 3393 3394COCCI_GEN_ALL = .build/contrib/coccinelle/ALL.cocci 3395COCCI_GLOB = $(wildcard contrib/coccinelle/*.cocci) 3396COCCI_RULES_TRACKED = $(COCCI_GLOB:%=.build/%) 3397COCCI_RULES_TRACKED_NO_PENDING = $(filter-out %.pending.cocci,$(COCCI_RULES_TRACKED)) 3398COCCI_RULES = 3399COCCI_RULES += $(COCCI_GEN_ALL) 3400COCCI_RULES += $(COCCI_RULES_TRACKED) 3401COCCI_NAMES = 3402COCCI_NAMES += $(COCCI_RULES:.build/contrib/coccinelle/%.cocci=%) 3403 3404COCCICHECK_PENDING = $(filter %.pending.cocci,$(COCCI_RULES)) 3405COCCICHECK = $(filter-out $(COCCICHECK_PENDING),$(COCCI_RULES)) 3406 3407COCCICHECK_PATCHES = $(COCCICHECK:%=%.patch) 3408COCCICHECK_PATCHES_PENDING = $(COCCICHECK_PENDING:%=%.patch) 3409 3410COCCICHECK_PATCHES_INTREE = $(COCCICHECK_PATCHES:.build/%=%) 3411COCCICHECK_PATCHES_PENDING_INTREE = $(COCCICHECK_PATCHES_PENDING:.build/%=%) 3412 3413# It's expensive to compute the many=many rules below, only eval them 3414# on $(MAKECMDGOALS) that match these $(COCCI_RULES) 3415COCCI_RULES_GLOB = 3416COCCI_RULES_GLOB += cocci% 3417COCCI_RULES_GLOB += .build/contrib/coccinelle/% 3418COCCI_RULES_GLOB += $(COCCICHECK_PATCHES) 3419COCCI_RULES_GLOB += $(COCCICHEC_PATCHES_PENDING) 3420COCCI_RULES_GLOB += $(COCCICHECK_PATCHES_INTREE) 3421COCCI_RULES_GLOB += $(COCCICHECK_PATCHES_PENDING_INTREE) 3422COCCI_GOALS = $(filter $(COCCI_RULES_GLOB),$(MAKECMDGOALS)) 3423 3424COCCI_TEST_RES = $(wildcard contrib/coccinelle/tests/*.res) 3425 3426$(COCCI_RULES_TRACKED): .build/% : % 3427 $(call mkdir_p_parent_template) 3428 $(QUIET_CP)cp $< $@ 3429 3430.build/contrib/coccinelle/FOUND_H_SOURCES: $(FOUND_H_SOURCES) 3431 $(call mkdir_p_parent_template) 3432 $(QUIET_GEN) >$@ 3433 3434$(COCCI_GEN_ALL): $(COCCI_RULES_TRACKED_NO_PENDING) 3435 $(call mkdir_p_parent_template) 3436 $(QUIET_SPATCH_CAT)cat $^ >$@ 3437 3438ifeq ($(COMPUTE_HEADER_DEPENDENCIES),no) 3439SPATCH_USE_O_DEPENDENCIES = 3440endif 3441define cocci-rule 3442 3443## Rule for .build/$(1).patch/$(2); Params: 3444# $(1) = e.g. ".build/contrib/coccinelle/free.cocci" 3445# $(2) = e.g. "grep.c" 3446# $(3) = e.g. "grep.o" 3447COCCI_$(1:.build/contrib/coccinelle/%.cocci=%) += $(1).d/$(2).patch 3448$(1).d/$(2).patch: GIT-SPATCH-DEFINES 3449$(1).d/$(2).patch: $(if $(and $(SPATCH_USE_O_DEPENDENCIES),$(wildcard $(3))),$(3),.build/contrib/coccinelle/FOUND_H_SOURCES) 3450$(1).d/$(2).patch: $(1) 3451$(1).d/$(2).patch: $(1).d/%.patch : % 3452 $$(call mkdir_p_parent_template) 3453 $$(QUIET_SPATCH)if ! $$(SPATCH) $$(SPATCH_FLAGS) \ 3454 $$(SPATCH_INCLUDE_FLAGS) \ 3455 --sp-file $(1) --patch . $$< \ 3456 >$$@ 2>$$@.log; \ 3457 then \ 3458 echo "ERROR when applying '$(1)' to '$$<'; '$$@.log' follows:"; \ 3459 cat $$@.log; \ 3460 exit 1; \ 3461 fi 3462endef 3463 3464define cocci-matrix 3465 3466$(foreach s,$(COCCI_SOURCES),$(call cocci-rule,$(c),$(s),$(s:%.c=%.o))) 3467endef 3468 3469ifdef COCCI_GOALS 3470$(eval $(foreach c,$(COCCI_RULES),$(call cocci-matrix,$(c)))) 3471endif 3472 3473define spatch-rule 3474 3475.build/contrib/coccinelle/$(1).cocci.patch: $$(COCCI_$(1)) 3476 $$(QUIET_SPATCH_CAT)cat $$^ >$$@ && \ 3477 if test -s $$@; \ 3478 then \ 3479 echo ' ' SPATCH result: $$@; \ 3480 fi 3481contrib/coccinelle/$(1).cocci.patch: .build/contrib/coccinelle/$(1).cocci.patch 3482 $$(QUIET_CP)cp $$< $$@ 3483 3484endef 3485 3486ifdef COCCI_GOALS 3487$(eval $(foreach n,$(COCCI_NAMES),$(call spatch-rule,$(n)))) 3488endif 3489 3490COCCI_TEST_RES_GEN = $(addprefix .build/,$(COCCI_TEST_RES)) 3491$(COCCI_TEST_RES_GEN): GIT-SPATCH-DEFINES 3492$(COCCI_TEST_RES_GEN): .build/%.res : %.c 3493$(COCCI_TEST_RES_GEN): .build/%.res : %.res 3494ifdef SPATCH_CONCAT_COCCI 3495$(COCCI_TEST_RES_GEN): .build/contrib/coccinelle/tests/%.res : $(COCCI_GEN_ALL) 3496else 3497$(COCCI_TEST_RES_GEN): .build/contrib/coccinelle/tests/%.res : contrib/coccinelle/%.cocci 3498endif 3499 $(call mkdir_p_parent_template) 3500 $(QUIET_SPATCH_TEST)$(SPATCH) $(SPATCH_TEST_FLAGS) \ 3501 --very-quiet --no-show-diff \ 3502 --sp-file $< -o $@ \ 3503 $(@:.build/%.res=%.c) && \ 3504 cmp $(@:.build/%=%) $@ || \ 3505 git -P diff --no-index $(@:.build/%=%) $@ 2>/dev/null; \ 3506 3507.PHONY: coccicheck-test 3508coccicheck-test: $(COCCI_TEST_RES_GEN) 3509 3510coccicheck: coccicheck-test 3511 3512ifdef SPATCH_CONCAT_COCCI 3513COCCICHECK_PATCH_MUST_BE_EMPTY_FILES = contrib/coccinelle/ALL.cocci.patch 3514else 3515COCCICHECK_PATCH_MUST_BE_EMPTY_FILES = $(COCCICHECK_PATCHES_INTREE) 3516endif 3517coccicheck: $(COCCICHECK_PATCH_MUST_BE_EMPTY_FILES) 3518 ! grep -q ^ $(COCCICHECK_PATCH_MUST_BE_EMPTY_FILES) /dev/null 3519 3520# See contrib/coccinelle/README 3521coccicheck-pending: coccicheck-test 3522coccicheck-pending: $(COCCICHECK_PATCHES_PENDING_INTREE) 3523 3524.PHONY: coccicheck coccicheck-pending 3525 3526# "Sub"-Makefiles, not really because they can't be run stand-alone, 3527# only there to contain directory-specific rules and variables 3528## gitweb/Makefile inclusion: 3529MAK_DIR_GITWEB = gitweb/ 3530include gitweb/Makefile 3531 3532.PHONY: gitweb 3533gitweb: $(MAK_DIR_GITWEB_ALL) 3534ifndef NO_GITWEB 3535all:: gitweb 3536endif 3537 3538### Installation rules 3539 3540ifneq ($(filter /%,$(firstword $(template_dir))),) 3541template_instdir = $(template_dir) 3542else 3543template_instdir = $(prefix)/$(template_dir) 3544endif 3545export template_instdir 3546 3547ifneq ($(filter /%,$(firstword $(gitexecdir))),) 3548gitexec_instdir = $(gitexecdir) 3549else 3550gitexec_instdir = $(prefix)/$(gitexecdir) 3551endif 3552gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir)) 3553export gitexec_instdir 3554 3555ifneq ($(filter /%,$(firstword $(mergetoolsdir))),) 3556mergetools_instdir = $(mergetoolsdir) 3557else 3558mergetools_instdir = $(prefix)/$(mergetoolsdir) 3559endif 3560mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir)) 3561 3562install_bindir_xprograms := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) 3563install_bindir_programs := $(install_bindir_xprograms) $(BINDIR_PROGRAMS_NO_X) 3564 3565.PHONY: profile-install profile-fast-install 3566profile-install: profile 3567 $(MAKE) install 3568 3569profile-fast-install: profile-fast 3570 $(MAKE) install 3571 3572INSTALL_STRIP = 3573 3574install: all 3575 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)' 3576 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' 3577 $(INSTALL) $(INSTALL_STRIP) $(PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' 3578 $(INSTALL) $(SCRIPTS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' 3579 $(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' 3580 $(INSTALL) $(INSTALL_STRIP) $(install_bindir_xprograms) '$(DESTDIR_SQ)$(bindir_SQ)' 3581 $(INSTALL) $(BINDIR_PROGRAMS_NO_X) '$(DESTDIR_SQ)$(bindir_SQ)' 3582 3583ifdef MSVC 3584 # We DO NOT install the individual foo.o.pdb files because they 3585 # have already been rolled up into the exe's pdb file. 3586 # We DO NOT have pdb files for the builtin commands (like git-status.exe) 3587 # because it is just a copy/hardlink of git.exe, rather than a unique binary. 3588 $(INSTALL) $(patsubst %.exe,%.pdb,$(filter-out $(BUILT_INS),$(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)))) '$(DESTDIR_SQ)$(bindir_SQ)' 3589 $(INSTALL) $(patsubst %.exe,%.pdb,$(filter-out $(BUILT_INS) $(REMOTE_CURL_ALIASES),$(PROGRAMS))) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' 3590ifndef DEBUG 3591 $(INSTALL) $(vcpkg_rel_bin)/*.dll '$(DESTDIR_SQ)$(bindir_SQ)' 3592 $(INSTALL) $(vcpkg_rel_bin)/*.pdb '$(DESTDIR_SQ)$(bindir_SQ)' 3593else 3594 $(INSTALL) $(vcpkg_dbg_bin)/*.dll '$(DESTDIR_SQ)$(bindir_SQ)' 3595 $(INSTALL) $(vcpkg_dbg_bin)/*.pdb '$(DESTDIR_SQ)$(bindir_SQ)' 3596endif 3597endif 3598 $(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install 3599 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)' 3600 $(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)' 3601ifndef NO_GETTEXT 3602 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(localedir_SQ)' 3603 (cd po/build/locale && $(TAR) cf - .) | \ 3604 (cd '$(DESTDIR_SQ)$(localedir_SQ)' && umask 022 && $(TAR) xof -) 3605endif 3606ifndef NO_PERL 3607 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perllibdir_SQ)' 3608 (cd perl/build/lib && $(TAR) cf - .) | \ 3609 (cd '$(DESTDIR_SQ)$(perllibdir_SQ)' && umask 022 && $(TAR) xof -) 3610endif 3611ifndef NO_TCLTK 3612 $(MAKE) -C gitk-git install 3613 $(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install 3614endif 3615ifneq (,$X) 3616 $(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_COMMANDS_TO_INSTALL) $(OTHER_PROGRAMS))), test '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p' -ef '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p$X' || $(RM) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p';) 3617endif 3618ifndef NO_BASH_COMPLETION 3619 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bash_completion_dir_SQ)' && \ 3620 $(INSTALL) -m 644 contrib/completion/git-completion.bash '$(DESTDIR_SQ)$(bash_completion_dir_SQ)/git' 3621endif 3622 3623 bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \ 3624 execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \ 3625 destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e 's|[^/][^/]*|..|g') && \ 3626 { test "$$bindir/" = "$$execdir/" || \ 3627 for p in $(OTHER_PROGRAMS) $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \ 3628 $(RM) "$$execdir/$$p" && \ 3629 test -n "$(INSTALL_SYMLINKS)" && \ 3630 ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/$$p" "$$execdir/$$p" || \ 3631 { test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \ 3632 ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \ 3633 cp "$$bindir/$$p" "$$execdir/$$p" || exit; } \ 3634 done; \ 3635 } && \ 3636 for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \ 3637 $(RM) "$$bindir/$$p" && \ 3638 test -n "$(INSTALL_SYMLINKS)" && \ 3639 ln -s "git$X" "$$bindir/$$p" || \ 3640 { test -z "$(NO_INSTALL_HARDLINKS)" && \ 3641 ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \ 3642 ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \ 3643 cp "$$bindir/git$X" "$$bindir/$$p" || exit; }; \ 3644 done && \ 3645 for p in $(BUILT_INS); do \ 3646 $(RM) "$$execdir/$$p" && \ 3647 if test -z "$(SKIP_DASHED_BUILT_INS)"; \ 3648 then \ 3649 test -n "$(INSTALL_SYMLINKS)" && \ 3650 ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/git$X" "$$execdir/$$p" || \ 3651 { test -z "$(NO_INSTALL_HARDLINKS)" && \ 3652 ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \ 3653 ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \ 3654 cp "$$execdir/git$X" "$$execdir/$$p" || exit; }; \ 3655 fi \ 3656 done && \ 3657 remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \ 3658 for p in $$remote_curl_aliases; do \ 3659 $(RM) "$$execdir/$$p" && \ 3660 test -n "$(INSTALL_SYMLINKS)" && \ 3661 ln -s "git-remote-http$X" "$$execdir/$$p" || \ 3662 { test -z "$(NO_INSTALL_HARDLINKS)" && \ 3663 ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ 3664 ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ 3665 cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \ 3666 done 3667 3668.PHONY: install-doc install-man install-man-perl install-html install-info install-pdf 3669.PHONY: quick-install-doc quick-install-man quick-install-html 3670 3671install-doc: install-man-perl 3672 $(MAKE) -C Documentation install 3673 3674install-man: install-man-perl 3675 $(MAKE) -C Documentation install-man 3676 3677install-man-perl: man-perl 3678 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mandir_SQ)/man3' 3679 (cd perl/build/man/man3 && $(TAR) cf - .) | \ 3680 (cd '$(DESTDIR_SQ)$(mandir_SQ)/man3' && umask 022 && $(TAR) xof -) 3681 3682install-html: 3683 $(MAKE) -C Documentation install-html 3684 3685install-info: 3686 $(MAKE) -C Documentation install-info 3687 3688install-pdf: 3689 $(MAKE) -C Documentation install-pdf 3690 3691quick-install-doc: 3692 $(MAKE) -C Documentation quick-install 3693 3694quick-install-man: 3695 $(MAKE) -C Documentation quick-install-man 3696 3697quick-install-html: 3698 $(MAKE) -C Documentation quick-install-html 3699 3700 3701 3702### Maintainer's dist rules 3703 3704GIT_TARNAME = git-$(GIT_VERSION) 3705GIT_ARCHIVE_EXTRA_FILES = \ 3706 --prefix=$(GIT_TARNAME)/ \ 3707 --add-file=configure \ 3708 --add-file=.dist-tmp-dir/version \ 3709 --prefix=$(GIT_TARNAME)/git-gui/ \ 3710 --add-file=.dist-tmp-dir/git-gui/version 3711ifdef DC_SHA1_SUBMODULE 3712GIT_ARCHIVE_EXTRA_FILES += \ 3713 --prefix=$(GIT_TARNAME)/sha1collisiondetection/ \ 3714 --add-file=sha1collisiondetection/LICENSE.txt \ 3715 --prefix=$(GIT_TARNAME)/sha1collisiondetection/lib/ \ 3716 --add-file=sha1collisiondetection/lib/sha1.c \ 3717 --add-file=sha1collisiondetection/lib/sha1.h \ 3718 --add-file=sha1collisiondetection/lib/ubc_check.c \ 3719 --add-file=sha1collisiondetection/lib/ubc_check.h 3720endif 3721dist: git-archive$(X) configure 3722 @$(RM) -r .dist-tmp-dir 3723 @mkdir .dist-tmp-dir 3724 @echo $(GIT_VERSION) > .dist-tmp-dir/version 3725 @$(MAKE) -C git-gui TARDIR=../.dist-tmp-dir/git-gui dist-version 3726 ./git-archive --format=tar \ 3727 $(GIT_ARCHIVE_EXTRA_FILES) \ 3728 --prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar 3729 @$(RM) -r .dist-tmp-dir 3730 gzip -f -9 $(GIT_TARNAME).tar 3731 3732rpm:: 3733 @echo >&2 "Use distro packaged sources to run rpmbuild" 3734 @false 3735.PHONY: rpm 3736 3737ifneq ($(INCLUDE_DLLS_IN_ARTIFACTS),) 3738OTHER_PROGRAMS += $(shell echo *.dll t/helper/*.dll t/unit-tests/bin/*.dll) 3739endif 3740 3741artifacts-tar:: $(ALL_COMMANDS_TO_INSTALL) $(SCRIPT_LIB) $(OTHER_PROGRAMS) \ 3742 GIT-BUILD-OPTIONS $(TEST_PROGRAMS) $(test_bindir_programs) \ 3743 $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG) $(MOFILES) 3744 $(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) \ 3745 SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)' 3746 test -n "$(ARTIFACTS_DIRECTORY)" 3747 mkdir -p "$(ARTIFACTS_DIRECTORY)" 3748 $(TAR) czf "$(ARTIFACTS_DIRECTORY)/artifacts.tar.gz" $^ templates/blt/ 3749.PHONY: artifacts-tar 3750 3751htmldocs = git-htmldocs-$(GIT_VERSION) 3752manpages = git-manpages-$(GIT_VERSION) 3753.PHONY: dist-doc distclean 3754dist-doc: git$X 3755 $(RM) -r .doc-tmp-dir 3756 mkdir .doc-tmp-dir 3757 $(MAKE) -C Documentation WEBDOC_DEST=../.doc-tmp-dir install-webdoc 3758 ./git -C .doc-tmp-dir init 3759 ./git -C .doc-tmp-dir add . 3760 ./git -C .doc-tmp-dir commit -m htmldocs 3761 ./git -C .doc-tmp-dir archive --format=tar --prefix=./ HEAD^{tree} \ 3762 > $(htmldocs).tar 3763 gzip -n -9 -f $(htmldocs).tar 3764 : 3765 $(RM) -r .doc-tmp-dir 3766 mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7 3767 $(MAKE) -C Documentation DESTDIR=./ \ 3768 man1dir=../.doc-tmp-dir/man1 \ 3769 man5dir=../.doc-tmp-dir/man5 \ 3770 man7dir=../.doc-tmp-dir/man7 \ 3771 install 3772 ./git -C .doc-tmp-dir init 3773 ./git -C .doc-tmp-dir add . 3774 ./git -C .doc-tmp-dir commit -m manpages 3775 ./git -C .doc-tmp-dir archive --format=tar --prefix=./ HEAD^{tree} \ 3776 > $(manpages).tar 3777 gzip -n -9 -f $(manpages).tar 3778 $(RM) -r .doc-tmp-dir 3779 3780### Cleaning rules 3781 3782distclean: clean 3783 $(RM) configure 3784 $(RM) config.log config.status config.cache 3785 $(RM) config.mak.autogen config.mak.append 3786 $(RM) -r autom4te.cache 3787 3788profile-clean: 3789 $(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs))) 3790 $(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs))) 3791 3792cocciclean: 3793 $(RM) GIT-SPATCH-DEFINES 3794 $(RM) -r .build/contrib/coccinelle 3795 $(RM) contrib/coccinelle/*.cocci.patch 3796 3797clean: profile-clean coverage-clean cocciclean 3798 $(RM) -r .build $(UNIT_TEST_BIN) 3799 $(RM) GIT-TEST-SUITES 3800 $(RM) po/git.pot po/git-core.pot 3801 $(RM) git.rc git.res 3802 $(RM) $(OBJECTS) 3803 $(RM) headless-git.o 3804 $(RM) $(LIB_FILE) 3805 $(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) 3806 $(RM) $(TEST_PROGRAMS) 3807 $(RM) $(FUZZ_PROGRAMS) 3808 $(RM) $(SP_OBJ) 3809 $(RM) $(HCC) 3810 $(RM) -r Cargo.lock target/ 3811 $(RM) version-def.h 3812 $(RM) -r $(dep_dirs) $(compdb_dir) compile_commands.json 3813 $(RM) $(test_bindir_programs) 3814 $(RM) -r po/build/ 3815 $(RM) *.pyc *.pyo */*.pyc */*.pyo $(GENERATED_H) $(ETAGS_TARGET) tags cscope* 3816 $(RM) -r .dist-tmp-dir .doc-tmp-dir 3817 $(RM) $(GIT_TARNAME).tar.gz 3818 $(RM) $(htmldocs).tar.gz $(manpages).tar.gz 3819 $(MAKE) -C Documentation/ clean 3820 $(RM) Documentation/GIT-EXCLUDED-PROGRAMS 3821 $(RM) -r contrib/libgit-sys/target contrib/libgit-rs/target 3822 $(RM) contrib/libgit-sys/partial_symbol_export.o 3823 $(RM) contrib/libgit-sys/hidden_symbol_export.o 3824 $(RM) contrib/libgit-sys/libgitpub.a 3825ifndef NO_PERL 3826 $(RM) -r perl/build/ 3827endif 3828 $(MAKE) -C templates/ clean 3829 $(MAKE) -C t/ clean 3830ifndef NO_TCLTK 3831 $(MAKE) -C gitk-git clean 3832 $(MAKE) -C git-gui clean 3833endif 3834 $(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS 3835 $(RM) GIT-USER-AGENT GIT-PREFIX 3836 $(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PERL-HEADER GIT-PYTHON-VARS 3837ifdef MSVC 3838 $(RM) $(patsubst %.o,%.o.pdb,$(OBJECTS)) 3839 $(RM) headless-git.o.pdb 3840 $(RM) $(patsubst %.exe,%.pdb,$(OTHER_PROGRAMS)) 3841 $(RM) $(patsubst %.exe,%.iobj,$(OTHER_PROGRAMS)) 3842 $(RM) $(patsubst %.exe,%.ipdb,$(OTHER_PROGRAMS)) 3843 $(RM) $(patsubst %.exe,%.pdb,$(PROGRAMS)) 3844 $(RM) $(patsubst %.exe,%.iobj,$(PROGRAMS)) 3845 $(RM) $(patsubst %.exe,%.ipdb,$(PROGRAMS)) 3846 $(RM) $(patsubst %.exe,%.pdb,$(TEST_PROGRAMS)) 3847 $(RM) $(patsubst %.exe,%.iobj,$(TEST_PROGRAMS)) 3848 $(RM) $(patsubst %.exe,%.ipdb,$(TEST_PROGRAMS)) 3849 $(RM) compat/vcbuild/MSVC-DEFS-GEN 3850endif 3851 3852.PHONY: all install profile-clean cocciclean clean strip 3853.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell 3854.PHONY: FORCE 3855 3856### Check documentation 3857# 3858ALL_COMMANDS = $(ALL_COMMANDS_TO_INSTALL) $(SCRIPT_LIB) 3859ALL_COMMANDS += git 3860ALL_COMMANDS += git-citool 3861ALL_COMMANDS += git-gui 3862ALL_COMMANDS += gitk 3863ALL_COMMANDS += gitweb 3864ALL_COMMANDS += scalar 3865 3866.PHONY: check-docs 3867check-docs:: 3868 $(MAKE) -C Documentation lint-docs 3869 3870### Make sure built-ins do not have dups and listed in git.c 3871# 3872check-builtins:: 3873 ./check-builtins.sh 3874 3875### Test suite coverage testing 3876# 3877.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report 3878.PHONY: coverage-untested-functions cover_db cover_db_html 3879.PHONY: coverage-clean-results 3880 3881coverage: 3882 $(MAKE) coverage-test 3883 $(MAKE) coverage-untested-functions 3884 3885object_dirs := $(sort $(dir $(OBJECTS))) 3886coverage-clean-results: 3887 $(RM) $(addsuffix *.gcov,$(object_dirs)) 3888 $(RM) $(addsuffix *.gcda,$(object_dirs)) 3889 $(RM) coverage-untested-functions 3890 $(RM) -r cover_db/ 3891 $(RM) -r cover_db_html/ 3892 $(RM) coverage-test.made 3893 3894coverage-clean: coverage-clean-results 3895 $(RM) $(addsuffix *.gcno,$(object_dirs)) 3896 3897COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs 3898COVERAGE_LDFLAGS = $(CFLAGS) -O0 -lgcov 3899GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks 3900 3901coverage-compile: 3902 $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all 3903 3904coverage-test: coverage-clean-results coverage-compile 3905 $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \ 3906 DEFAULT_TEST_TARGET=test -j1 test 3907 touch coverage-test.made 3908 3909coverage-test.made: 3910 $(MAKE) coverage-test 3911 3912coverage-prove: coverage-clean-results coverage-compile 3913 $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \ 3914 DEFAULT_TEST_TARGET=prove GIT_PROVE_OPTS="$(GIT_PROVE_OPTS) -j1" \ 3915 -j1 test 3916 3917coverage-report: coverage-test.made 3918 $(QUIET_GCOV)for dir in $(object_dirs); do \ 3919 $(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \ 3920 done 3921 3922coverage-untested-functions: coverage-report 3923 grep '^function.*called 0 ' *.c.gcov \ 3924 | sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \ 3925 > coverage-untested-functions 3926 3927cover_db: coverage-report 3928 gcov2perl -db cover_db *.gcov 3929 3930cover_db_html: cover_db 3931 cover -report html -outputdir cover_db_html cover_db 3932 3933 3934### Fuzz testing 3935# 3936# Building fuzz targets generally requires a special set of compiler flags that 3937# are not necessarily appropriate for general builds, and that vary greatly 3938# depending on the compiler version used. 3939# 3940# An example command to build against libFuzzer from LLVM 11.0.0: 3941# 3942# make CC=clang FUZZ_CXX=clang++ \ 3943# CFLAGS="-fsanitize=fuzzer-no-link,address" \ 3944# LIB_FUZZING_ENGINE="-fsanitize=fuzzer,address" \ 3945# fuzz-all 3946# 3947FUZZ_CXX ?= $(CC) 3948FUZZ_CXXFLAGS ?= $(ALL_CFLAGS) 3949 3950.PHONY: fuzz-all 3951fuzz-all: $(FUZZ_PROGRAMS) 3952 3953$(FUZZ_PROGRAMS): %: %.o oss-fuzz/dummy-cmd-main.o $(GITLIBS) GIT-LDFLAGS 3954 $(QUIET_LINK)$(FUZZ_CXX) $(FUZZ_CXXFLAGS) -o $@ $(ALL_LDFLAGS) \ 3955 -Wl,--allow-multiple-definition \ 3956 $(filter %.o,$^) $(filter %.a,$^) $(LIBS) $(LIB_FUZZING_ENGINE) 3957 3958$(UNIT_TEST_PROGS): $(UNIT_TEST_BIN)/%$X: $(UNIT_TEST_DIR)/%.o $(UNIT_TEST_OBJS) \ 3959 $(GITLIBS) GIT-LDFLAGS 3960 $(call mkdir_p_parent_template) 3961 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \ 3962 $(filter %.o,$^) $(filter %.a,$^) $(LIBS) 3963 3964GIT-TEST-SUITES: FORCE 3965 @FLAGS='$(CLAR_TEST_SUITES)'; \ 3966 if test x"$$FLAGS" != x"`cat GIT-TEST-SUITES 2>/dev/null`" ; then \ 3967 echo >&2 " * new test suites"; \ 3968 echo "$$FLAGS" >GIT-TEST-SUITES; \ 3969 fi 3970 3971$(UNIT_TEST_DIR)/clar-decls.h: $(patsubst %,$(UNIT_TEST_DIR)/%.c,$(CLAR_TEST_SUITES)) $(UNIT_TEST_DIR)/generate-clar-decls.sh GIT-TEST-SUITES 3972 $(QUIET_GEN)$(SHELL_PATH) $(UNIT_TEST_DIR)/generate-clar-decls.sh "$@" $(filter %.c,$^) 3973$(UNIT_TEST_DIR)/clar.suite: $(UNIT_TEST_DIR)/clar-decls.h $(UNIT_TEST_DIR)/generate-clar-suites.sh 3974 $(QUIET_GEN)$(SHELL_PATH) $(UNIT_TEST_DIR)/generate-clar-suites.sh $< $(UNIT_TEST_DIR)/clar.suite 3975$(UNIT_TEST_DIR)/clar/clar.o: $(UNIT_TEST_DIR)/clar.suite 3976$(CLAR_TEST_OBJS): $(UNIT_TEST_DIR)/clar-decls.h 3977$(CLAR_TEST_OBJS): EXTRA_CPPFLAGS = -I$(UNIT_TEST_DIR) 3978$(CLAR_TEST_PROG): $(UNIT_TEST_DIR)/clar.suite $(CLAR_TEST_OBJS) $(GITLIBS) GIT-LDFLAGS 3979 $(call mkdir_p_parent_template) 3980 $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) 3981 3982.PHONY: build-unit-tests unit-tests 3983build-unit-tests: $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG) 3984unit-tests: $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG) t/helper/test-tool$X 3985 $(MAKE) -C t/ unit-tests 3986 3987.PHONY: libgit-sys libgit-rs 3988libgit-sys: 3989 $(QUIET)cargo build --manifest-path contrib/libgit-sys/Cargo.toml 3990libgit-rs: libgit-sys 3991 $(QUIET)cargo build --manifest-path contrib/libgit-rs/Cargo.toml 3992ifdef INCLUDE_LIBGIT_RS 3993all:: libgit-rs 3994endif 3995 3996LIBGIT_PUB_OBJS += contrib/libgit-sys/public_symbol_export.o 3997LIBGIT_PUB_OBJS += libgit.a 3998 3999LIBGIT_PARTIAL_EXPORT = contrib/libgit-sys/partial_symbol_export.o 4000 4001LIBGIT_HIDDEN_EXPORT = contrib/libgit-sys/hidden_symbol_export.o 4002 4003$(LIBGIT_PARTIAL_EXPORT): $(LIBGIT_PUB_OBJS) 4004 $(LD) -r $^ -o $@ 4005 4006$(LIBGIT_HIDDEN_EXPORT): $(LIBGIT_PARTIAL_EXPORT) 4007 $(OBJCOPY) --localize-hidden $^ $@ 4008 4009contrib/libgit-sys/libgitpub.a: $(LIBGIT_HIDDEN_EXPORT) 4010 $(AR) $(ARFLAGS) $@ $^