Skip to content

Commit ab09edd

Browse files
committed
Merge branch 'ps/build-meson-fixes-0130'
Assorted fixes and improvements to the build procedure based on meson. * ps/build-meson-fixes-0130: gitlab-ci: restrict maximum number of link jobs on Windows meson: consistently use custom program paths to resolve programs meson: fix overwritten `git` variable meson: prevent finding sed(1) in a loop meson: improve handling of `sane_tool_path` option meson: improve PATH handling meson: drop separate version library meson: stop linking libcurl into all executables meson: introduce `libgit_curl` dependency meson: simplify use of the common-main library meson: inline the static 'git' library meson: fix OpenSSL fallback when not explicitly required meson: fix exec path with enabled runtime prefix
2 parents 1aabec0 + 9350423 commit ab09edd

File tree

8 files changed

+89
-98
lines changed

8 files changed

+89
-98
lines changed

.gitlab-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ build:msvc-meson:
164164
extends: .msvc-meson
165165
stage: build
166166
script:
167-
- meson setup build -Dperl=disabled
167+
- meson setup build -Dperl=disabled -Dbackend_max_links=1
168168
- meson compile -C build
169169
artifacts:
170170
paths:

Documentation/howto/meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ custom_target(
4141
foreach howto : howto_sources
4242
howto_stripped = custom_target(
4343
command: [
44-
find_program('sed'),
44+
sed,
4545
'-e',
4646
'1,/^$/d',
4747
'@INPUT@',

Documentation/meson.build

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -207,17 +207,17 @@ manpages = {
207207

208208
docs_backend = get_option('docs_backend')
209209
if docs_backend == 'auto'
210-
if find_program('asciidoc', required: false).found()
210+
if find_program('asciidoc', dirs: program_path, required: false).found()
211211
docs_backend = 'asciidoc'
212-
elif find_program('asciidoctor', required: false).found()
212+
elif find_program('asciidoctor', dirs: program_path, required: false).found()
213213
docs_backend = 'asciidoctor'
214214
else
215215
error('Neither asciidoc nor asciidoctor were found.')
216216
endif
217217
endif
218218

219219
if docs_backend == 'asciidoc'
220-
asciidoc = find_program('asciidoc', required: true)
220+
asciidoc = find_program('asciidoc', dirs: program_path)
221221
asciidoc_html = 'xhtml11'
222222
asciidoc_docbook = 'docbook'
223223
xmlto_extra = [ ]
@@ -246,7 +246,7 @@ if docs_backend == 'asciidoc'
246246
asciidoc_conf,
247247
]
248248
elif docs_backend == 'asciidoctor'
249-
asciidoctor = find_program('asciidoctor', required: true)
249+
asciidoctor = find_program('asciidoctor', dirs: program_path)
250250
asciidoc_html = 'xhtml5'
251251
asciidoc_docbook = 'docbook5'
252252
xmlto_extra = [
@@ -284,8 +284,7 @@ elif docs_backend == 'asciidoctor'
284284
]
285285
endif
286286

287-
git = find_program('git', required: false)
288-
xmlto = find_program('xmlto')
287+
xmlto = find_program('xmlto', dirs: program_path)
289288

290289
cmd_lists = [
291290
'cmds-ancillaryinterrogators.adoc',
@@ -406,7 +405,7 @@ if get_option('docs').contains('html')
406405
pointing_to: 'git.html',
407406
)
408407

409-
xsltproc = find_program('xsltproc')
408+
xsltproc = find_program('xsltproc', dirs: program_path)
410409

411410
user_manual_xml = custom_target(
412411
command: asciidoc_common_options + [

meson.build

Lines changed: 74 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -191,30 +191,29 @@ project('git', 'c',
191191
fs = import('fs')
192192

193193
program_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' ]
197199
endif
198200

199201
cygpath = find_program('cygpath', dirs: program_path, required: false)
200202
diff = find_program('diff', dirs: program_path)
203+
git = find_program('git', dirs: program_path, required: false)
204+
sed = find_program('sed', dirs: program_path)
201205
shell = find_program('sh', dirs: program_path)
202206
tar = 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)
208211
endforeach
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',
@@ -678,8 +678,9 @@ else
678678
build_options_config.set('WITH_BREAKING_CHANGES', '')
679679
endif
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 + '"|')
683684
else
684685
build_options_config.set_quoted('BROKEN_PATH_FIX', '/^\# @BROKEN_PATH_FIX@$/d')
685686
endif
@@ -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', '')
969971
else
@@ -1388,7 +1390,11 @@ if https_backend == 'auto' and security_framework.found()
13881390
endif
13891391

13901392
openssl_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+
)
13921398
if https_backend == 'auto' and openssl.found()
13931399
https_backend = 'openssl'
13941400
endif
@@ -1402,6 +1408,7 @@ elif https_backend == 'openssl'
14021408
else
14031409
# We either couldn't find any dependencies with 'auto' or the user requested
14041410
# 'none'. Both cases are benign.
1411+
https_backend = 'none'
14051412
endif
14061413

14071414
if https_backend != 'openssl'
@@ -1501,6 +1508,7 @@ endif
15011508
if 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
15381546
else
15391547
build_options_config.set('RUNTIME_PREFIX', 'false')
1548+
git_exec_path = get_option('prefix') / get_option('libexecdir') / 'git-core'
15401549
endif
1550+
libgit_c_args += '-DGIT_EXEC_PATH="' + git_exec_path + '"'
15411551

15421552
git_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

15941583
libgit = 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,98 @@ if host_machine.system() == 'windows'
16341630
error('Unsupported compiler ' + compiler.get_id())
16351631
endif
16361632
endif
1637-
common_main_library = static_library('common-main',
1638-
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,
1633+
1634+
libgit_commonmain = declare_dependency(
1635+
link_with: static_library('common-main',
1636+
sources: common_main_sources,
1637+
dependencies: [ libgit ],
1638+
),
16451639
link_args: common_main_link_args,
1640+
dependencies: [ libgit ],
16461641
)
16471642

16481643
bin_wrappers = [ ]
16491644
test_dependencies = [ ]
16501645

1651-
git = executable('git',
1646+
git_builtin = executable('git',
16521647
sources: builtin_sources + 'git.c',
1653-
dependencies: [libgit, common_main],
1648+
dependencies: [libgit_commonmain],
16541649
install: true,
16551650
install_dir: get_option('libexecdir') / 'git-core',
16561651
)
1657-
bin_wrappers += git
1652+
bin_wrappers += git_builtin
16581653

16591654
test_dependencies += executable('git-daemon',
16601655
sources: 'daemon.c',
1661-
dependencies: [libgit, common_main],
1656+
dependencies: [libgit_commonmain],
16621657
install: true,
16631658
install_dir: get_option('libexecdir') / 'git-core',
16641659
)
16651660

16661661
test_dependencies += executable('git-sh-i18n--envsubst',
16671662
sources: 'sh-i18n--envsubst.c',
1668-
dependencies: [libgit, common_main],
1663+
dependencies: [libgit_commonmain],
16691664
install: true,
16701665
install_dir: get_option('libexecdir') / 'git-core',
16711666
)
16721667

16731668
bin_wrappers += executable('git-shell',
16741669
sources: 'shell.c',
1675-
dependencies: [libgit, common_main],
1670+
dependencies: [libgit_commonmain],
16761671
install: true,
16771672
install_dir: get_option('libexecdir') / 'git-core',
16781673
)
16791674

16801675
test_dependencies += executable('git-http-backend',
16811676
sources: 'http-backend.c',
1682-
dependencies: [libgit, common_main],
1677+
dependencies: [libgit_commonmain],
16831678
install: true,
16841679
install_dir: get_option('libexecdir') / 'git-core',
16851680
)
16861681

16871682
bin_wrappers += executable('scalar',
16881683
sources: 'scalar.c',
1689-
dependencies: [libgit, common_main],
1684+
dependencies: [libgit_commonmain],
16901685
install: true,
16911686
install_dir: get_option('libexecdir') / 'git-core',
16921687
)
16931688

16941689
if get_option('curl').enabled()
1695-
curl_sources = [
1696-
'http.c',
1697-
'http-walker.c',
1698-
]
1690+
libgit_curl = declare_dependency(
1691+
sources: [
1692+
'http.c',
1693+
'http-walker.c',
1694+
],
1695+
dependencies: [libgit_commonmain, curl],
1696+
)
16991697

1700-
git_remote_http = executable('git-remote-http',
1701-
sources: curl_sources + 'remote-curl.c',
1702-
dependencies: [libgit, common_main],
1698+
test_dependencies += executable('git-remote-http',
1699+
sources: 'remote-curl.c',
1700+
dependencies: [libgit_curl],
17031701
install: true,
17041702
install_dir: get_option('libexecdir') / 'git-core',
17051703
)
1706-
test_dependencies += git_remote_http
17071704

17081705
test_dependencies += executable('git-http-fetch',
1709-
sources: curl_sources + 'http-fetch.c',
1710-
dependencies: [libgit, common_main],
1706+
sources: 'http-fetch.c',
1707+
dependencies: [libgit_curl],
17111708
install: true,
17121709
install_dir: get_option('libexecdir') / 'git-core',
17131710
)
17141711

17151712
if expat.found()
17161713
test_dependencies += executable('git-http-push',
1717-
sources: curl_sources + 'http-push.c',
1718-
dependencies: [libgit, common_main],
1714+
sources: 'http-push.c',
1715+
dependencies: [libgit_curl],
17191716
install: true,
17201717
install_dir: get_option('libexecdir') / 'git-core',
17211718
)
17221719
endif
17231720

17241721
foreach alias : [ 'git-remote-https', 'git-remote-ftp', 'git-remote-ftps' ]
17251722
test_dependencies += executable(alias,
1726-
objects: git_remote_http.extract_all_objects(recursive: false),
1727-
dependencies: [libgit, common_main],
1723+
sources: 'remote-curl.c',
1724+
dependencies: [libgit_curl],
17281725
)
17291726

17301727
install_symlink(alias + executable_suffix,
@@ -1734,22 +1731,17 @@ if get_option('curl').enabled()
17341731
endforeach
17351732
endif
17361733

1737-
imap_send_sources = ['imap-send.c']
1738-
if use_curl_for_imap_send
1739-
imap_send_sources += curl_sources
1740-
endif
1741-
17421734
test_dependencies += executable('git-imap-send',
1743-
sources: imap_send_sources,
1744-
dependencies: [libgit, common_main],
1735+
sources: 'imap-send.c',
1736+
dependencies: [ use_curl_for_imap_send ? libgit_curl : libgit_commonmain ],
17451737
install: true,
17461738
install_dir: get_option('libexecdir') / 'git-core',
17471739
)
17481740

17491741
foreach alias : [ 'git-receive-pack', 'git-upload-archive', 'git-upload-pack' ]
17501742
bin_wrappers += executable(alias,
1751-
objects: git.extract_all_objects(recursive: false),
1752-
dependencies: [libgit, common_main],
1743+
objects: git_builtin.extract_all_objects(recursive: false),
1744+
dependencies: [libgit_commonmain],
17531745
)
17541746

17551747
install_symlink(alias + executable_suffix,

meson_options.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ option('perl_cpan_fallback', type: 'boolean', value: true,
1313
description: 'Install bundled copies of CPAN modules that serve as a fallback in case the modules are not available on the system.')
1414
option('runtime_prefix', type: 'boolean', value: false,
1515
description: 'Resolve ancillary tooling and support files relative to the location of the runtime binary instead of hard-coding them into the binary.')
16-
option('sane_tool_path', type: 'string', value: '',
17-
description: 'A colon-separated list of paths to prepend to PATH if your tools in /usr/bin are broken.')
16+
option('sane_tool_path', type: 'array', value: [],
17+
description: 'An array of paths to pick up tools from in case the normal tools are broken or lacking.')
1818

1919
# Build information compiled into Git and other parts like documentation.
2020
option('build_date', type: 'string', value: '',

0 commit comments

Comments
 (0)