@@ -191,30 +191,29 @@ project('git', 'c',
191191fs = import (' fs' )
192192
193193program_path = []
194- # Git for Windows provides all the tools we need to build Git.
195- if host_machine .system() == ' windows'
196- program_path += [ ' C:/Program Files/Git/bin' , ' C:/Program Files/Git/usr/bin' ]
194+ if get_option (' sane_tool_path' ).length() != 0
195+ program_path = get_option (' sane_tool_path' )
196+ elif host_machine .system() == ' windows'
197+ # Git for Windows provides all the tools we need to build Git.
198+ program_path = [ ' C:/Program Files/Git/bin' , ' C:/Program Files/Git/usr/bin' ]
197199endif
198200
199201cygpath = find_program (' cygpath' , dirs : program_path, required : false )
200202diff = find_program (' diff' , dirs : program_path)
203+ git = find_program (' git' , dirs : program_path, required : false )
204+ sed = find_program (' sed' , dirs : program_path)
201205shell = find_program (' sh' , dirs : program_path)
202206tar = find_program (' tar' , dirs : program_path)
203207
204- script_environment = environment ()
205- foreach tool : [' cat' , ' cut' , ' grep' , ' sed' , ' sort' , ' tr' , ' uname' ]
206- program = find_program (tool, dirs : program_path)
207- script_environment.prepend(' PATH' , fs.parent(program.full_path()))
208+ # Sanity-check that programs required for the build exist.
209+ foreach tool : [' cat' , ' cut' , ' grep' , ' sort' , ' tr' , ' uname' ]
210+ find_program (tool, dirs : program_path)
208211endforeach
209212
210- git = find_program (' git' , dirs : program_path, required : false )
211- if git.found()
212- script_environment.prepend(' PATH' , fs.parent(git.full_path()))
213- endif
214-
215- if get_option (' sane_tool_path' ) != ''
216- script_environment.prepend(' PATH' , get_option (' sane_tool_path' ))
217- endif
213+ script_environment = environment ()
214+ foreach path : program_path
215+ script_environment.prepend(' PATH' , path)
216+ endforeach
218217
219218# The environment used by GIT-VERSION-GEN. Note that we explicitly override
220219# environment variables that might be set by the user. This is by design so
@@ -479,6 +478,7 @@ libgit_sources = [
479478 ' userdiff.c' ,
480479 ' utf8.c' ,
481480 ' varint.c' ,
481+ ' version.c' ,
482482 ' versioncmp.c' ,
483483 ' walker.c' ,
484484 ' wildmatch.c' ,
678678 build_options_config.set(' WITH_BREAKING_CHANGES' , '' )
679679endif
680680
681- if get_option (' sane_tool_path' ) != ''
682- build_options_config.set_quoted(' BROKEN_PATH_FIX' , ' s|^\# @BROKEN_PATH_FIX@$|git_broken_path_fix "' + get_option (' sane_tool_path' ) + ' "|' )
681+ if get_option (' sane_tool_path' ).length() != 0
682+ sane_tool_path = (host_machine .system() == ' windows' ? ' ;' : ' :' ).join(get_option (' sane_tool_path' ))
683+ build_options_config.set_quoted(' BROKEN_PATH_FIX' , ' s|^\# @BROKEN_PATH_FIX@$|git_broken_path_fix "' + sane_tool_path + ' "|' )
683684else
684685 build_options_config.set_quoted(' BROKEN_PATH_FIX' , ' /^\# @BROKEN_PATH_FIX@$/d' )
685686endif
@@ -699,7 +700,6 @@ libgit_c_args = [
699700 ' -DETC_GITATTRIBUTES="' + get_option (' gitattributes' ) + ' "' ,
700701 ' -DETC_GITCONFIG="' + get_option (' gitconfig' ) + ' "' ,
701702 ' -DFALLBACK_RUNTIME_PREFIX="' + get_option (' prefix' ) + ' "' ,
702- ' -DGIT_EXEC_PATH="' + get_option (' prefix' ) / get_option (' libexecdir' ) / ' git-core"' ,
703703 ' -DGIT_HOST_CPU="' + host_machine .cpu_family() + ' "' ,
704704 ' -DGIT_HTML_PATH="' + get_option (' datadir' ) / ' doc/git-doc"' ,
705705 ' -DGIT_INFO_PATH="' + get_option (' infodir' ) + ' "' ,
@@ -963,7 +963,9 @@ if curl.found()
963963 use_curl_for_imap_send = true
964964 endif
965965
966- libgit_dependencies += curl
966+ # Most executables don't have to link against libcurl, but we still need its
967+ # include directories so that we can resolve LIBCURL_VERSION in "help.c".
968+ libgit_dependencies += curl.partial_dependency(includes : true )
967969 libgit_c_args += ' -DCURL_DISABLE_TYPECHECK'
968970 build_options_config.set(' NO_CURL' , '' )
969971else
@@ -1388,7 +1390,11 @@ if https_backend == 'auto' and security_framework.found()
13881390endif
13891391
13901392openssl_required = ' openssl' in [csprng_backend, https_backend, sha1_backend, sha1_unsafe_backend, sha256_backend]
1391- openssl = dependency (' openssl' , required : openssl_required, default_options : [' default_library=static' ])
1393+ openssl = dependency (' openssl' ,
1394+ required : openssl_required,
1395+ allow_fallback : openssl_required or https_backend == ' auto' ,
1396+ default_options : [' default_library=static' ],
1397+ )
13921398if https_backend == ' auto' and openssl.found()
13931399 https_backend = ' openssl'
13941400endif
@@ -1402,6 +1408,7 @@ elif https_backend == 'openssl'
14021408else
14031409 # We either couldn't find any dependencies with 'auto' or the user requested
14041410 # 'none'. Both cases are benign.
1411+ https_backend = ' none'
14051412endif
14061413
14071414if https_backend != ' openssl'
@@ -1501,6 +1508,7 @@ endif
15011508if get_option (' runtime_prefix' )
15021509 libgit_c_args += ' -DRUNTIME_PREFIX'
15031510 build_options_config.set(' RUNTIME_PREFIX' , ' true' )
1511+ git_exec_path = get_option (' libexecdir' ) / ' git-core'
15041512
15051513 if compiler.has_header(' mach-o/dyld.h' )
15061514 libgit_c_args += ' -DHAVE_NS_GET_EXECUTABLE_PATH'
@@ -1537,7 +1545,9 @@ if get_option('runtime_prefix')
15371545 endif
15381546else
15391547 build_options_config.set(' RUNTIME_PREFIX' , ' false' )
1548+ git_exec_path = get_option (' prefix' ) / get_option (' libexecdir' ) / ' git-core'
15401549endif
1550+ libgit_c_args += ' -DGIT_EXEC_PATH="' + git_exec_path + ' "'
15411551
15421552git_version_file = custom_target (
15431553 command : [
@@ -1568,32 +1578,18 @@ version_def_h = custom_target(
15681578 depends : [git_version_file],
15691579 env : version_gen_environment,
15701580)
1571-
1572- # Build a separate library for "version.c" so that we do not have to rebuild
1573- # everything when the current Git commit changes.
1574- libgit_version_library = static_library (' git-version' ,
1575- sources : [
1576- ' version.c' ,
1577- version_def_h,
1578- ],
1579- c_args : libgit_c_args + [
1580- ' -DGIT_VERSION_H="' + version_def_h.full_path() + ' "' ,
1581- ],
1582- dependencies : libgit_dependencies,
1583- include_directories : libgit_include_directories,
1584- )
1585-
1586- libgit_library = static_library (' git' ,
1587- sources : libgit_sources,
1588- c_args : libgit_c_args,
1589- link_with : libgit_version_library,
1590- dependencies : libgit_dependencies,
1591- include_directories : libgit_include_directories,
1592- )
1581+ libgit_sources += version_def_h
15931582
15941583libgit = declare_dependency (
1584+ link_with : static_library (' git' ,
1585+ sources : libgit_sources,
1586+ c_args : libgit_c_args + [
1587+ ' -DGIT_VERSION_H="' + version_def_h.full_path() + ' "' ,
1588+ ],
1589+ dependencies : libgit_dependencies,
1590+ include_directories : libgit_include_directories,
1591+ ),
15951592 compile_args : libgit_c_args,
1596- link_with : libgit_library,
15971593 dependencies : libgit_dependencies,
15981594 include_directories : libgit_include_directories,
15991595)
@@ -1634,97 +1630,95 @@ if host_machine.system() == 'windows'
16341630 error (' Unsupported compiler ' + compiler.get_id())
16351631 endif
16361632endif
1637- common_main_library = static_library (' common-main' ,
1633+
1634+ libgit_commonmain = declare_dependency (
16381635 sources : common_main_sources,
1639- c_args : libgit_c_args,
1640- dependencies : libgit_dependencies,
1641- include_directories : libgit_include_directories,
1642- )
1643- common_main = declare_dependency (
1644- link_with : common_main_library,
16451636 link_args : common_main_link_args,
1637+ dependencies : [ libgit ],
16461638)
16471639
16481640bin_wrappers = [ ]
16491641test_dependencies = [ ]
16501642
1651- git = executable (' git' ,
1643+ git_builtin = executable (' git' ,
16521644 sources : builtin_sources + ' git.c' ,
1653- dependencies : [libgit, common_main ],
1645+ dependencies : [libgit_commonmain ],
16541646 install : true ,
16551647 install_dir : get_option (' libexecdir' ) / ' git-core' ,
16561648)
1657- bin_wrappers += git
1649+ bin_wrappers += git_builtin
16581650
16591651test_dependencies += executable (' git-daemon' ,
16601652 sources : ' daemon.c' ,
1661- dependencies : [libgit, common_main ],
1653+ dependencies : [libgit_commonmain ],
16621654 install : true ,
16631655 install_dir : get_option (' libexecdir' ) / ' git-core' ,
16641656)
16651657
16661658test_dependencies += executable (' git-sh-i18n--envsubst' ,
16671659 sources : ' sh-i18n--envsubst.c' ,
1668- dependencies : [libgit, common_main ],
1660+ dependencies : [libgit_commonmain ],
16691661 install : true ,
16701662 install_dir : get_option (' libexecdir' ) / ' git-core' ,
16711663)
16721664
16731665bin_wrappers += executable (' git-shell' ,
16741666 sources : ' shell.c' ,
1675- dependencies : [libgit, common_main ],
1667+ dependencies : [libgit_commonmain ],
16761668 install : true ,
16771669 install_dir : get_option (' libexecdir' ) / ' git-core' ,
16781670)
16791671
16801672test_dependencies += executable (' git-http-backend' ,
16811673 sources : ' http-backend.c' ,
1682- dependencies : [libgit, common_main ],
1674+ dependencies : [libgit_commonmain ],
16831675 install : true ,
16841676 install_dir : get_option (' libexecdir' ) / ' git-core' ,
16851677)
16861678
16871679bin_wrappers += executable (' scalar' ,
16881680 sources : ' scalar.c' ,
1689- dependencies : [libgit, common_main ],
1681+ dependencies : [libgit_commonmain ],
16901682 install : true ,
16911683 install_dir : get_option (' libexecdir' ) / ' git-core' ,
16921684)
16931685
16941686if get_option (' curl' ).enabled()
1695- curl_sources = [
1696- ' http.c' ,
1697- ' http-walker.c' ,
1698- ]
1687+ libgit_curl = declare_dependency (
1688+ sources : [
1689+ ' http.c' ,
1690+ ' http-walker.c' ,
1691+ ],
1692+ dependencies : [libgit_commonmain, curl],
1693+ )
16991694
1700- git_remote_http = executable (' git-remote-http' ,
1701- sources : curl_sources + ' remote-curl.c' ,
1702- dependencies : [libgit, common_main ],
1695+ test_dependencies + = executable (' git-remote-http' ,
1696+ sources : ' remote-curl.c' ,
1697+ dependencies : [libgit_curl ],
17031698 install : true ,
17041699 install_dir : get_option (' libexecdir' ) / ' git-core' ,
17051700 )
1706- test_dependencies += git_remote_http
17071701
17081702 test_dependencies += executable (' git-http-fetch' ,
1709- sources : curl_sources + ' http-fetch.c' ,
1710- dependencies : [libgit, common_main ],
1703+ sources : ' http-fetch.c' ,
1704+ dependencies : [libgit_curl ],
17111705 install : true ,
17121706 install_dir : get_option (' libexecdir' ) / ' git-core' ,
17131707 )
17141708
17151709 if expat.found()
17161710 test_dependencies += executable (' git-http-push' ,
1717- sources : curl_sources + ' http-push.c' ,
1718- dependencies : [libgit, common_main ],
1711+ sources : ' http-push.c' ,
1712+ dependencies : [libgit_curl ],
17191713 install : true ,
17201714 install_dir : get_option (' libexecdir' ) / ' git-core' ,
17211715 )
17221716 endif
17231717
17241718 foreach alias : [ ' git-remote-https' , ' git-remote-ftp' , ' git-remote-ftps' ]
17251719 test_dependencies += executable (alias,
1726- objects : git_remote_http.extract_all_objects( recursive : false ) ,
1727- dependencies : [libgit, common_main ],
1720+ sources : ' remote-curl.c ' ,
1721+ dependencies : [libgit_curl ],
17281722 )
17291723
17301724 install_symlink(alias + executable_suffix,
@@ -1734,22 +1728,17 @@ if get_option('curl').enabled()
17341728 endforeach
17351729endif
17361730
1737- imap_send_sources = [' imap-send.c' ]
1738- if use_curl_for_imap_send
1739- imap_send_sources += curl_sources
1740- endif
1741-
17421731test_dependencies += executable (' git-imap-send' ,
1743- sources : imap_send_sources ,
1744- dependencies : [libgit, common_main ],
1732+ sources : ' imap-send.c ' ,
1733+ dependencies : [ use_curl_for_imap_send ? libgit_curl : libgit_commonmain ],
17451734 install : true ,
17461735 install_dir : get_option (' libexecdir' ) / ' git-core' ,
17471736)
17481737
17491738foreach alias : [ ' git-receive-pack' , ' git-upload-archive' , ' git-upload-pack' ]
17501739 bin_wrappers += executable (alias,
1751- objects : git .extract_all_objects(recursive : false ),
1752- dependencies : [libgit, common_main ],
1740+ objects : git_builtin .extract_all_objects(recursive : false ),
1741+ dependencies : [libgit],
17531742 )
17541743
17551744 install_symlink(alias + executable_suffix,
0 commit comments