Will Salmon pushed to branch willsalmon/outOfSourecBuild at BuildStream / buildstream
Commits:
- 
15e628a0
by William Salmon at 2018-09-24T09:50:19Z
- 
9dc68d76
by William Salmon at 2018-09-24T09:50:19Z
5 changed files:
- buildstream/buildelement.py
- buildstream/source.py
- + tests/examples/autotools-outofsource.py
- + tests/examples/cmake.py
- + tests/examples/helloworld-outofsource.py
Changes:
| ... | ... | @@ -23,6 +23,38 @@ BuildElement - Abstract class for build elements | 
| 23 | 23 |  The BuildElement class is a convenience element one can derive from for
 | 
| 24 | 24 |  implementing the most common case of element.
 | 
| 25 | 25 |  | 
| 26 | +Built-in functionality
 | |
| 27 | +----------------------
 | |
| 28 | + | |
| 29 | +The BuildElement base class provides built in functionality that could be overridden by the
 | |
| 30 | +individual plugins.
 | |
| 31 | + | |
| 32 | +This section will give a brief summary of how some of the common features work, some of them or the variables they
 | |
| 33 | +use will be further detailed in the following sections.
 | |
| 34 | + | |
| 35 | +* Location for running commands
 | |
| 36 | + | |
| 37 | + The ``command-subdir`` variable sets where the build commands will be executed, if the directory dose not exist it
 | |
| 38 | + will be created, it is defined relative to the buildroot.
 | |
| 39 | + | |
| 40 | +* Location for configuring the project
 | |
| 41 | + | |
| 42 | + The ``conf-root`` is defined by default as ``.`` and is the location that specific build element can use to look
 | |
| 43 | + for build configuration files, currently autotools and cmake use this.
 | |
| 44 | + | |
| 45 | + The configuration commands are run in ``command-subdir`` and by default ``conf-root`` is ``.`` so if
 | |
| 46 | + ``conf-root`` is not set the configuration files in ``command-subdir`` will be used.
 | |
| 47 | + | |
| 48 | + By setting ``conf-root`` to ``"%{build-root}/Source/conf_location"`` and your source elements ``directory`` variable
 | |
| 49 | + to ``Source`` then the configuration files in the directory ``conf_location`` with in your Source will be used.
 | |
| 50 | + However the location where your configuration command will be run will still be wherever you set your
 | |
| 51 | + ``command-subdir`` to be.
 | |
| 52 | + | |
| 53 | +* Install Location
 | |
| 54 | + | |
| 55 | +  You should not change the ``install-root`` variable as it is a special writeable location in the sandbox but it is
 | |
| 56 | +  useful when writing custom install instructions as it may need to be supplied as the ``DESTDIR``, please see the
 | |
| 57 | +  cmake build element for example.
 | |
| 26 | 58 |  | 
| 27 | 59 |  Abstract method implementations
 | 
| 28 | 60 |  -------------------------------
 | 
| ... | ... | @@ -20,6 +20,19 @@ | 
| 20 | 20 |  Source - Base source class
 | 
| 21 | 21 |  ==========================
 | 
| 22 | 22 |  | 
| 23 | +Built-in functionality
 | |
| 24 | +----------------------
 | |
| 25 | + | |
| 26 | +The Source base class provides built in functionality that could be overridden by the
 | |
| 27 | +individual plugins.
 | |
| 28 | + | |
| 29 | +* Directory
 | |
| 30 | + | |
| 31 | +  The ``directory`` variable can be set for all sources of a type in project.conf
 | |
| 32 | +  or per source within a element.
 | |
| 33 | + | |
| 34 | +  This sets the location with in the build root that the content of the source will be
 | |
| 35 | +  loaded in to. If the location dose not exist it will be created.
 | |
| 23 | 36 |  | 
| 24 | 37 |  .. _core_source_abstract_methods:
 | 
| 25 | 38 |  | 
| 1 | +import os
 | |
| 2 | +import pytest
 | |
| 3 | + | |
| 4 | +from tests.testutils import cli_integration as cli
 | |
| 5 | +from tests.testutils.integration import assert_contains
 | |
| 6 | +from tests.testutils.site import IS_LINUX
 | |
| 7 | + | |
| 8 | +pytestmark = pytest.mark.integration
 | |
| 9 | + | |
| 10 | +DATA_DIR = os.path.join(
 | |
| 11 | +    os.path.dirname(os.path.realpath(__file__)), '..', '..', 'doc', 'examples',
 | |
| 12 | +    'out-of-source-autotool-in-source-tree'
 | |
| 13 | +)
 | |
| 14 | + | |
| 15 | + | |
| 16 | +# Tests a build of the autotools amhello project on a alpine-linux base runtime
 | |
| 17 | +@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
 | |
| 18 | +@pytest.mark.datafiles(DATA_DIR)
 | |
| 19 | +def test_autotools_build(cli, tmpdir, datafiles):
 | |
| 20 | +    project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 21 | +    checkout = os.path.join(cli.directory, 'checkout')
 | |
| 22 | + | |
| 23 | +    # Check that the project can be built correctly.
 | |
| 24 | +    result = cli.run(project=project, args=['build', 'hello.bst'])
 | |
| 25 | +    result.assert_success()
 | |
| 26 | + | |
| 27 | +    result = cli.run(project=project, args=['checkout', 'hello.bst', checkout])
 | |
| 28 | +    result.assert_success()
 | |
| 29 | + | |
| 30 | +    assert_contains(checkout, ['/usr', '/usr/lib', '/usr/bin',
 | |
| 31 | +                               '/usr/share', '/usr/lib/debug',
 | |
| 32 | +                               '/usr/lib/debug/usr', '/usr/lib/debug/usr/bin',
 | |
| 33 | +                               '/usr/lib/debug/usr/bin/hello',
 | |
| 34 | +                               '/usr/bin/hello',
 | |
| 35 | +                               '/usr/share/doc', '/usr/share/doc/amhello',
 | |
| 36 | +                               '/usr/share/doc/amhello/README'])
 | |
| 37 | + | |
| 38 | + | |
| 39 | +# Test running an executable built with autotools.
 | |
| 40 | +@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
 | |
| 41 | +@pytest.mark.datafiles(DATA_DIR)
 | |
| 42 | +def test_autotools_run(cli, tmpdir, datafiles):
 | |
| 43 | +    project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 44 | + | |
| 45 | +    result = cli.run(project=project, args=['build', 'hello.bst'])
 | |
| 46 | +    result.assert_success()
 | |
| 47 | + | |
| 48 | +    result = cli.run(project=project, args=['shell', 'hello.bst', 'hello'])
 | |
| 49 | +    result.assert_success()
 | |
| 50 | +    assert result.output == 'Hello World!\nThis is amhello 1.0.\n' | 
| 1 | +import os
 | |
| 2 | +import pytest
 | |
| 3 | + | |
| 4 | +from tests.testutils import cli_integration as cli
 | |
| 5 | +from tests.testutils.integration import assert_contains
 | |
| 6 | +from tests.testutils.site import IS_LINUX
 | |
| 7 | + | |
| 8 | +pytestmark = pytest.mark.integration
 | |
| 9 | + | |
| 10 | +DATA_DIR = os.path.join(
 | |
| 11 | +    os.path.dirname(os.path.realpath(__file__)), '..', '..', 'doc', 'examples', 'cmake'
 | |
| 12 | +)
 | |
| 13 | + | |
| 14 | + | |
| 15 | +# Tests a build using cmake with the C complier from alpine-linux base runtime
 | |
| 16 | +@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
 | |
| 17 | +@pytest.mark.datafiles(DATA_DIR)
 | |
| 18 | +def test_autotools_build(cli, tmpdir, datafiles):
 | |
| 19 | +    project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 20 | +    checkout = os.path.join(cli.directory, 'checkout')
 | |
| 21 | + | |
| 22 | +    # Check that the project can be built correctly.
 | |
| 23 | +    result = cli.run(project=project, args=['build', 'hello.bst'])
 | |
| 24 | +    result.assert_success()
 | |
| 25 | + | |
| 26 | +    result = cli.run(project=project, args=['checkout', 'hello.bst', checkout])
 | |
| 27 | +    result.assert_success()
 | |
| 28 | + | |
| 29 | +    assert_contains(checkout, ['/usr', '/usr/lib', '/usr/bin',
 | |
| 30 | +                               '/usr/share',
 | |
| 31 | +                               '/bin/hello_buildstream'])
 | |
| 32 | + | |
| 33 | + | |
| 34 | +# Test running an executable built with cmake.
 | |
| 35 | +@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
 | |
| 36 | +@pytest.mark.datafiles(DATA_DIR)
 | |
| 37 | +def test_autotools_run(cli, tmpdir, datafiles):
 | |
| 38 | +    project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 39 | + | |
| 40 | +    result = cli.run(project=project, args=['build', 'hello.bst'])
 | |
| 41 | +    result.assert_success()
 | |
| 42 | + | |
| 43 | +    result = cli.run(project=project, args=['shell', 'hello.bst', 'hello_buildstream'])
 | |
| 44 | +    result.assert_success()
 | |
| 45 | +    assert result.output == 'Hello, World!\n' | 
| 1 | +import os
 | |
| 2 | +import pytest
 | |
| 3 | + | |
| 4 | +from tests.testutils import cli_integration as cli
 | |
| 5 | +from tests.testutils.integration import assert_contains
 | |
| 6 | +from tests.testutils.site import IS_LINUX
 | |
| 7 | + | |
| 8 | +pytestmark = pytest.mark.integration
 | |
| 9 | + | |
| 10 | +DATA_DIR = os.path.join(
 | |
| 11 | +    os.path.dirname(os.path.realpath(__file__)), '..', '..', 'doc', 'examples',
 | |
| 12 | +    'out-of-source-build-helloworld'
 | |
| 13 | +)
 | |
| 14 | + | |
| 15 | + | |
| 16 | +# Tests a build of the autotools amhello project on a alpine-linux base runtime
 | |
| 17 | +@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
 | |
| 18 | +@pytest.mark.datafiles(DATA_DIR)
 | |
| 19 | +def test_autotools_build(cli, tmpdir, datafiles):
 | |
| 20 | +    project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 21 | +    checkout = os.path.join(cli.directory, 'checkout')
 | |
| 22 | + | |
| 23 | +    # Check that the project can be built correctly.
 | |
| 24 | +    result = cli.run(project=project, args=['build', 'hello.bst'])
 | |
| 25 | +    result.assert_success()
 | |
| 26 | + | |
| 27 | +    result = cli.run(project=project, args=['checkout', 'hello.bst', checkout])
 | |
| 28 | +    result.assert_success()
 | |
| 29 | + | |
| 30 | +    assert_contains(checkout, ['/usr', '/usr/bin',
 | |
| 31 | +                               '/usr/bin/hello'])
 | |
| 32 | + | |
| 33 | + | |
| 34 | +# Test running an executable built with autotools.
 | |
| 35 | +@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
 | |
| 36 | +@pytest.mark.datafiles(DATA_DIR)
 | |
| 37 | +def test_autotools_run(cli, tmpdir, datafiles):
 | |
| 38 | +    project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 39 | + | |
| 40 | +    result = cli.run(project=project, args=['build', 'hello.bst'])
 | |
| 41 | +    result.assert_success()
 | |
| 42 | + | |
| 43 | +    result = cli.run(project=project, args=['shell', 'hello.bst', '--', 'hello', 'bob'])
 | |
| 44 | +    result.assert_success()
 | |
| 45 | +    assert result.output == 'Hello bob\n' | 
