Skip to content

Commit

Permalink
dev-build/ninja: wire up tests again
Browse files Browse the repository at this point in the history
Bug: https://bugs.gentoo.org/929221
Signed-off-by: Sam James <[email protected]>
  • Loading branch information
thesamesam committed Jul 3, 2024
1 parent a088dc1 commit b83f3dd
Show file tree
Hide file tree
Showing 4 changed files with 201 additions and 12 deletions.
1 change: 1 addition & 0 deletions dev-build/ninja/Manifest
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
DIST gtest-1.14.0.tar.gz 867764 BLAKE2B c457f55ac572b9fb1553eee3df7eeeaf1e7dd2c3d747dd5e90dd279038fa5c71bb7b7d9ba1cf7e6143898b2a1d24d100584bd2a48ded41a426870c4825eec1b2 SHA512 765c326ccc1b87a01027385e69238266e356361cd4ee3e18e3c9d137a5d11fa5d657c164d02dd1be8fe693c8e10f2b580588dbfa57d27f070e2750f50d3e662c
DIST ninja-1.11.1.tar.gz 229479 BLAKE2B c96cf7c319b7abd65f644465688d256f8b3a576c4616d0c63852e25dd0dc5f63c66708d429d8dddb6228502eb147211a86a5dd369b80ec2228902b370d2343e5 SHA512 1bca38877c70ee6613f347ffccef5adc02ba0a3947c62ae004ea97f918442b5a3de92378e4f820ae2a7676bc7609d25fbc7d41f6cfb3a61e5e4b26ec3639e403
DIST ninja-1.12.1.tar.gz 240483 BLAKE2B 915545888cbd7d9e6e7e4fb0bad42f6c36ecef2de93356966541de0f8f4315e59e47cf20f189de5de11ba2a038488c7964ec709bad8868488cc03524a88483f4 SHA512 d6e6f0e89a4844a69069ff0c7cefc07704a41c7b0c062a57534de87decdde63e27928147b321111b806aa7efa1061f031a1319b074391db61b0cbdccf096954c
135 changes: 135 additions & 0 deletions dev-build/ninja/files/ninja-1.12.1-restore-tests-bootstrap.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
https://bugs.gentoo.org/929221
https://github.com/ninja-build/ninja/issues/2447
https://github.com/ninja-build/ninja/commit/afcd4a146fb82843f6ff695f89504ce4ca65ddfd

From afcd4a146fb82843f6ff695f89504ce4ca65ddfd Mon Sep 17 00:00:00 2001
From: David 'Digit' Turner <[email protected]>
Date: Sun, 12 May 2024 23:45:28 +0200
Subject: [PATCH] configure.py: Support --gtest-source-dir to build tests.

Allow the Ninja build plan generated by configure.py to
build `ninja_test` by compiling GoogleTest from source if
the path to the library if passed through the new option
`--gtest-source-dir` or the GTEST_SOURCE_DIR environment
variable.

For simplicity, probing for an installed version of the
library, and linking to it, is not supported (use the
CMake build for this).

This also removes the obsolete `--gtest-dir` option.

Fixes #2447
---
configure.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 95 insertions(+), 1 deletion(-)

diff --git a/configure.py b/configure.py
index f9e49f9cdf..2b16618c43 100755
--- a/configure.py
+++ b/configure.py
@@ -223,7 +223,10 @@ def _run_command(self, cmdline: str) -> None:
parser.add_option('--profile', metavar='TYPE',
choices=profilers,
help='enable profiling (' + '/'.join(profilers) + ')',)
-parser.add_option('--with-gtest', metavar='PATH', help='ignored')
+parser.add_option('--gtest-source-dir', metavar='PATH',
+ help='Path to GoogleTest source directory. If not provided ' +
+ 'GTEST_SOURCE_DIR will be probed in the environment. ' +
+ 'Tests will not be built without a value.')
parser.add_option('--with-python', metavar='EXE',
help='use EXE as the Python interpreter',
default=os.path.basename(sys.executable))
@@ -435,6 +438,7 @@ def shell_escape(str: str) -> str:
if 'LDFLAGS' in configure_env:
ldflags.append(configure_env['LDFLAGS'])
n.variable('ldflags', ' '.join(shell_escape(flag) for flag in ldflags))
+
n.newline()

if platform.is_msvc():
@@ -592,6 +596,83 @@ def has_re2c() -> bool:
# build.ninja file.
n = ninja_writer

+# Build the ninja_test executable only if the GTest source directory
+# is provided explicitly. Either from the environment with GTEST_SOURCE_DIR
+# or with the --gtest-source-dir command-line option.
+#
+# Do not try to look for an installed binary version, and link against it
+# because doing so properly is platform-specific (use the CMake build for
+# this).
+if options.gtest_source_dir:
+ gtest_src_dir = options.gtest_source_dir
+else:
+ gtest_src_dir = os.environ.get('GTEST_SOURCE_DIR')
+
+if gtest_src_dir:
+ # Verify GoogleTest source directory, and add its include directory
+ # to the global include search path (even for non-test sources) to
+ # keep the build plan generation simple.
+ gtest_all_cc = os.path.join(gtest_src_dir, 'googletest', 'src', 'gtest-all.cc')
+ if not os.path.exists(gtest_all_cc):
+ print('ERROR: Missing GoogleTest source file: %s' % gtest_all_cc)
+ sys.exit(1)
+
+ n.comment('Tests all build into ninja_test executable.')
+
+ # Test-specific version of cflags, must include the GoogleTest
+ # include directory. Also GoogleTest can only build with a C++14 compiler.
+ test_cflags = [f.replace('std=c++11', 'std=c++14') for f in cflags]
+ test_cflags.append('-I' + os.path.join(gtest_src_dir, 'googletest', 'include'))
+
+ test_variables = [('cflags', test_cflags)]
+ if platform.is_msvc():
+ test_variables += [('pdb', 'ninja_test.pdb')]
+
+ test_names = [
+ 'build_log_test',
+ 'build_test',
+ 'clean_test',
+ 'clparser_test',
+ 'depfile_parser_test',
+ 'deps_log_test',
+ 'disk_interface_test',
+ 'dyndep_parser_test',
+ 'edit_distance_test',
+ 'graph_test',
+ 'json_test',
+ 'lexer_test',
+ 'manifest_parser_test',
+ 'ninja_test',
+ 'state_test',
+ 'string_piece_util_test',
+ 'subprocess_test',
+ 'test',
+ 'util_test',
+ ]
+ if platform.is_windows():
+ test_names += [
+ 'includes_normalize_test',
+ 'msvc_helper_test',
+ ]
+
+ objs = []
+ for name in test_names:
+ objs += cxx(name, variables=test_variables)
+
+ # Build GTest as a monolithic source file.
+ # This requires one extra include search path, so replace the
+ # value of 'cflags' in our list.
+ gtest_all_variables = test_variables[1:] + [
+ ('cflags', test_cflags + ['-I' + os.path.join(gtest_src_dir, 'googletest') ]),
+ ]
+ # Do not use cxx() directly to ensure the object file is under $builddir.
+ objs += n.build(built('gtest_all' + objext), 'cxx', gtest_all_cc, variables=gtest_all_variables)
+
+ ninja_test = n.build(binary('ninja_test'), 'link', objs, implicit=ninja_lib,
+ variables=[('libs', libs)])
+ n.newline()
+ all_targets += ninja_test
+
n.comment('Ancillary executables.')

if platform.is_aix() and '-maix64' not in ldflags:

39 changes: 33 additions & 6 deletions dev-build/ninja/ninja-1.12.1.ebuild
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@ else
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
fi

GTEST_VER=1.14.0
SRC_URI+=" test? ( https://github.com/google/googletest/archive/refs/tags/v${GTEST_VER}.tar.gz -> gtest-${GTEST_VER}.tar.gz )"

DESCRIPTION="A small build system similar to make"
HOMEPAGE="https://ninja-build.org/"

LICENSE="Apache-2.0"
SLOT="0"
IUSE="doc"
IUSE="doc test"
RESTRICT="!test? ( test )"

BDEPEND="
${PYTHON_DEPS}
Expand All @@ -36,14 +40,20 @@ PDEPEND="
app-alternatives/ninja
"

PATCHES=(
"${FILESDIR}"/ninja-cflags.patch
"${FILESDIR}"/${P}-restore-tests-bootstrap.patch
)

pkg_setup() {
:
}

src_prepare() {
local PATCHES=(
"${FILESDIR}"/ninja-cflags.patch
)
src_unpack() {
if [[ ${PV} == 9999 ]] ; then
git-r3_src_unpack
fi

default
}

Expand All @@ -55,7 +65,15 @@ bootstrap() {
local -x CXXFLAGS="${BUILD_CXXFLAGS} -D_FILE_OFFSET_BITS=64"
local -x LDFLAGS=${BUILD_LDFLAGS}
fi
edo ${EPYTHON} configure.py --with-python=python --bootstrap --verbose

local bootstrap_args=(
--with-python=python
--bootstrap
--verbose
$(usev test --gtest-source-dir="${WORKDIR}"/googletest-${GTEST_VER})
)

edo ${EPYTHON} configure.py "${bootstrap_args[@]}"
}

src_compile() {
Expand All @@ -77,6 +95,15 @@ src_compile() {
fi
}

src_test() {
if ! tc-is-cross-compiler; then
# Bug 485772
ulimit -n 2048
edo ./ninja -v ninja_test
edo ./ninja_test
fi
}

src_install() {
newbin ninja{,-reference}

Expand Down
38 changes: 32 additions & 6 deletions dev-build/ninja/ninja-9999.ebuild
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@ else
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
fi

GTEST_VER=1.14.0
SRC_URI+=" test? ( https://github.com/google/googletest/archive/refs/tags/v${GTEST_VER}.tar.gz -> gtest-${GTEST_VER}.tar.gz )"

DESCRIPTION="A small build system similar to make"
HOMEPAGE="https://ninja-build.org/"

LICENSE="Apache-2.0"
SLOT="0"
IUSE="doc"
IUSE="doc test"
RESTRICT="!test? ( test )"

BDEPEND="
${PYTHON_DEPS}
Expand All @@ -36,14 +40,19 @@ PDEPEND="
app-alternatives/ninja
"

PATCHES=(
"${FILESDIR}"/ninja-cflags.patch
)

pkg_setup() {
:
}

src_prepare() {
local PATCHES=(
"${FILESDIR}"/ninja-cflags.patch
)
src_unpack() {
if [[ ${PV} == 9999 ]] ; then
git-r3_src_unpack
fi

default
}

Expand All @@ -55,7 +64,15 @@ bootstrap() {
local -x CXXFLAGS="${BUILD_CXXFLAGS} -D_FILE_OFFSET_BITS=64"
local -x LDFLAGS=${BUILD_LDFLAGS}
fi
edo ${EPYTHON} configure.py --with-python=python --bootstrap --verbose

local bootstrap_args=(
--with-python=python
--bootstrap
--verbose
$(usev test --gtest-source-dir="${WORKDIR}"/googletest-${GTEST_VER})
)

edo ${EPYTHON} configure.py "${bootstrap_args[@]}"
}

src_compile() {
Expand All @@ -77,6 +94,15 @@ src_compile() {
fi
}

src_test() {
if ! tc-is-cross-compiler; then
# Bug 485772
ulimit -n 2048
edo ./ninja -v ninja_test
edo ./ninja_test
fi
}

src_install() {
newbin ninja{,-reference}

Expand Down

0 comments on commit b83f3dd

Please sign in to comment.