Cuppa
=====
A simple, extensible build system for use with
`Scons <http://www.scons.org/>`__. **Cuppa** is designed to leverage the
capabilities of Scons, while allowing developers to focus on the task of
describing what needs to be built. In general **cuppa** supports
``make`` like usage on the command-line. That is developers can simply
write:
.. code:: sh
scons -D
and have Scons "do the right thing"; building targets for any
``sconscript`` files found in the current directory.
**Cuppa** can be installed as a normal python package or installed
locally into a ``site_scons`` directory allowing it to be effortlessly
integrated into any Scons setup.
Note: ``-D`` tells ``scons`` to look for an ``sconstruct`` file in
the current or in parent directories and if it finds one execute the
``sconscript`` files as if called from that directory. This ensures
everything works as expected. For more details refer to the `Scons
documentation <http://www.scons.org/documentation.php>`__
Quick Intro
-----------
Get **cuppa**
~~~~~~~~~~~~~
The simpest way to get **cuppa** is to ``pip install`` it using:
::
pip install cuppa
Sample ``sconstruct`` file
~~~~~~~~~~~~~~~~~~~~~~~~~~
Let's look at a minimal ``sconstruct`` that makes use of **cuppa**. It
could look like this:
.. code:: python
# Pull in all the Cuppa goodies..
import cuppa
# Call sconscripts to do the work
cuppa.run()
Calling the ``run`` method in the ``cuppa`` module starts the build
process calling ``sconscript`` files.
Sample ``sconscript`` file
~~~~~~~~~~~~~~~~~~~~~~~~~~
Here is an example ``sconscript`` file that builds all \*.cpp files in
the directory where it resides:
.. code:: python
Import( 'env' )
# Build all *.cpp source files as executables
for Source in env.GlobFiles('*.cpp'):
env.Build( Source[:-4], Source )
The ``env.Build()`` method is provided by **cuppa** and does essentially
what ``env.Program()`` does but in addition is both toolchain and
variant aware, and further can provide notifications on progress.
Note: Source[:-4] simply strips off the file extension ``.cpp``,
that is, the last 4 characters of the file name.
If our ``sconscript`` file was for a directory containing \*.cpp files
that are actually tests then we could instead write the ``sconscript``
file as:
.. code:: python
Import( 'env' )
# Build all *.cpp source files as executables to be run as tests
for Source in env.GlobFiles('*.cpp'):
env.BuildTest( Source[:-4], Source )
The ``env.BuildTest()`` method is provided by **cuppa** and builds the
sources specified as ``env.Build()`` does.
However, in addition, passing ``--test`` on the command-line will also
result in the executable produced being run by a **runner**. The default
test runner simply treats each executable as a test case and each
directory or executables as a test suite. If the process executes
cleanly the test passed, if not it failed.
To run this on the command-line we would write:
.. code:: sh
scons -D --test
If we only want to build and test *debug* executables we can instead
write this:
.. code:: sh
scons -D --dbg --test
Or for release only pass ``--rel``.
**cuppa** also makes it easy to work with dependencies. For example, if
`boost <http://www.boost.org/>`__ was a default dependency for all your
``sconscript`` files you could write your sconstruct file as follows:
.. code:: python
import cuppa
cuppa.run(
default_options = {
'boost-home': '<Location of Boost>'
},
default_dependencies = [
'boost'
]
)
This will automatically ensure that necessary includes and other compile
options are set for the boost version that is found at ``boost-home``.
If you need to link against specific boost libraries this can also be
done in the sconscript file as follows:
.. code:: python
Import('env')
Test = 'my_complex_test'
Sources = [
Test + '.cpp'
]
env.AppendUnique( STATICLIBS = [
env.BoostStaticLibrary( 'system' ),
env.BoostStaticLibrary( 'log' ),
env.BoostStaticLibrary( 'thread' ),
env.BoostStaticLibrary( 'timer' ),
env.BoostStaticLibrary( 'chrono' ),
env.BoostStaticLibrary( 'filesystem' ),
] )
env.BuildTest( Test, Sources )
The ``BoostStaticLibrary()`` method ensures that the library is built in
the correct build variant as required. If you preferred to use dynamic
linking then that can also be achieved using ``BoostSharedLibrary()``.
The point is the complexities of using `boost <http://www.boost.org/>`__
as a dependency are encapsulated and managed separately from the
scontruct and sconscript files allowing developers to focus on intent
not method.
Design Principles
-----------------
**cuppa** has been written primarily to provide a clean and structured
way to leverage the power of Scons without the usual problems of hugely
complex ``scontruct`` files that diverge between projects. Key goals of
**cuppa** are:
- minimise the need for adding logic into ``sconscript`` files, keeping
them as declarative as possible.
- allow declarative ``sconscript``\ s that are both much clearer and
significantly simpler than the equivalent ``make`` file, without the
need to learn a whole new scripting language like ``make`` or
``cmake``.
- provide a clear structure for extending the facilities offered by
**cuppa**
- provide a clear vocabulary for building projects
- codify Scons best practices into **cuppa** itself so that users just
need to call appropriate methods knowing that **cuppa** will do the
right thing with their intent
- provide a framework that allows experts to focus on providing
facilities for others to use. Write once, use everywhere. For example
one person who knows how best to make
`boost <http://www.boost.org/>`__ available as a dependency can
manage that dependency and allow others to use it seamlessly.
More Details
------------
For more details refer to the `project homepage <https://github.com/ja11sop/cuppa>`__.
Acknowledgements
----------------
This work is based on the build system used in
`clearpool.io <http://www.clearpool.io>`__ during development of its
next generation exchange platform.
Raw data
{
"_id": null,
"home_page": "https://github.com/ja11sop/cuppa",
"name": "cuppa",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "scons, build, c++",
"author": "ja11sop",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/95/27/1f52ff692c6ef59ec08ff64cd7c33dcac00e9f6bc4ef0381595a86a48095/cuppa-0.9.145.tar.gz",
"platform": null,
"description": "Cuppa\n=====\n\nA simple, extensible build system for use with\n`Scons <http://www.scons.org/>`__. **Cuppa** is designed to leverage the\ncapabilities of Scons, while allowing developers to focus on the task of\ndescribing what needs to be built. In general **cuppa** supports\n``make`` like usage on the command-line. That is developers can simply\nwrite:\n\n.. code:: sh\n\n scons -D\n\nand have Scons \"do the right thing\"; building targets for any\n``sconscript`` files found in the current directory.\n\n**Cuppa** can be installed as a normal python package or installed\nlocally into a ``site_scons`` directory allowing it to be effortlessly\nintegrated into any Scons setup.\n\n Note: ``-D`` tells ``scons`` to look for an ``sconstruct`` file in\n the current or in parent directories and if it finds one execute the\n ``sconscript`` files as if called from that directory. This ensures\n everything works as expected. For more details refer to the `Scons\n documentation <http://www.scons.org/documentation.php>`__\n\n\nQuick Intro\n-----------\n\nGet **cuppa**\n~~~~~~~~~~~~~\n\nThe simpest way to get **cuppa** is to ``pip install`` it using:\n\n::\n\n pip install cuppa\n\n\nSample ``sconstruct`` file\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nLet's look at a minimal ``sconstruct`` that makes use of **cuppa**. It\ncould look like this:\n\n.. code:: python\n\n # Pull in all the Cuppa goodies..\n import cuppa\n\n # Call sconscripts to do the work\n cuppa.run()\n\nCalling the ``run`` method in the ``cuppa`` module starts the build\nprocess calling ``sconscript`` files.\n\nSample ``sconscript`` file\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nHere is an example ``sconscript`` file that builds all \\*.cpp files in\nthe directory where it resides:\n\n.. code:: python\n\n Import( 'env' )\n\n # Build all *.cpp source files as executables\n for Source in env.GlobFiles('*.cpp'):\n env.Build( Source[:-4], Source )\n\nThe ``env.Build()`` method is provided by **cuppa** and does essentially\nwhat ``env.Program()`` does but in addition is both toolchain and\nvariant aware, and further can provide notifications on progress.\n\n Note: Source[:-4] simply strips off the file extension ``.cpp``,\n that is, the last 4 characters of the file name.\n\nIf our ``sconscript`` file was for a directory containing \\*.cpp files\nthat are actually tests then we could instead write the ``sconscript``\nfile as:\n\n.. code:: python\n\n Import( 'env' )\n\n # Build all *.cpp source files as executables to be run as tests\n for Source in env.GlobFiles('*.cpp'):\n env.BuildTest( Source[:-4], Source )\n\nThe ``env.BuildTest()`` method is provided by **cuppa** and builds the\nsources specified as ``env.Build()`` does.\n\nHowever, in addition, passing ``--test`` on the command-line will also\nresult in the executable produced being run by a **runner**. The default\ntest runner simply treats each executable as a test case and each\ndirectory or executables as a test suite. If the process executes\ncleanly the test passed, if not it failed.\n\nTo run this on the command-line we would write:\n\n.. code:: sh\n\n scons -D --test\n\nIf we only want to build and test *debug* executables we can instead\nwrite this:\n\n.. code:: sh\n\n scons -D --dbg --test\n\nOr for release only pass ``--rel``.\n\n**cuppa** also makes it easy to work with dependencies. For example, if\n`boost <http://www.boost.org/>`__ was a default dependency for all your\n``sconscript`` files you could write your sconstruct file as follows:\n\n.. code:: python\n\n import cuppa\n\n cuppa.run(\n default_options = {\n 'boost-home': '<Location of Boost>'\n },\n default_dependencies = [\n 'boost'\n ]\n )\n\nThis will automatically ensure that necessary includes and other compile\noptions are set for the boost version that is found at ``boost-home``.\nIf you need to link against specific boost libraries this can also be\ndone in the sconscript file as follows:\n\n.. code:: python\n\n Import('env')\n\n Test = 'my_complex_test'\n\n Sources = [\n Test + '.cpp'\n ]\n\n env.AppendUnique( STATICLIBS = [\n env.BoostStaticLibrary( 'system' ),\n env.BoostStaticLibrary( 'log' ),\n env.BoostStaticLibrary( 'thread' ),\n env.BoostStaticLibrary( 'timer' ),\n env.BoostStaticLibrary( 'chrono' ),\n env.BoostStaticLibrary( 'filesystem' ),\n ] )\n\n env.BuildTest( Test, Sources )\n\nThe ``BoostStaticLibrary()`` method ensures that the library is built in\nthe correct build variant as required. If you preferred to use dynamic\nlinking then that can also be achieved using ``BoostSharedLibrary()``.\n\nThe point is the complexities of using `boost <http://www.boost.org/>`__\nas a dependency are encapsulated and managed separately from the\nscontruct and sconscript files allowing developers to focus on intent\nnot method.\n\nDesign Principles\n-----------------\n\n**cuppa** has been written primarily to provide a clean and structured\nway to leverage the power of Scons without the usual problems of hugely\ncomplex ``scontruct`` files that diverge between projects. Key goals of\n**cuppa** are:\n\n- minimise the need for adding logic into ``sconscript`` files, keeping\n them as declarative as possible.\n- allow declarative ``sconscript``\\ s that are both much clearer and\n significantly simpler than the equivalent ``make`` file, without the\n need to learn a whole new scripting language like ``make`` or\n ``cmake``.\n- provide a clear structure for extending the facilities offered by\n **cuppa**\n- provide a clear vocabulary for building projects\n- codify Scons best practices into **cuppa** itself so that users just\n need to call appropriate methods knowing that **cuppa** will do the\n right thing with their intent\n- provide a framework that allows experts to focus on providing\n facilities for others to use. Write once, use everywhere. For example\n one person who knows how best to make\n `boost <http://www.boost.org/>`__ available as a dependency can\n manage that dependency and allow others to use it seamlessly.\n\nMore Details\n------------\n\nFor more details refer to the `project homepage <https://github.com/ja11sop/cuppa>`__.\n\nAcknowledgements\n----------------\n\nThis work is based on the build system used in\n`clearpool.io <http://www.clearpool.io>`__ during development of its\nnext generation exchange platform.\n",
"bugtrack_url": null,
"license": "Boost Software License 1.0 - http://www.boost.org/LICENSE_1_0.txt",
"summary": "Cuppa, an extension package to simplify and extend Scons",
"version": "0.9.145",
"project_urls": {
"Homepage": "https://github.com/ja11sop/cuppa"
},
"split_keywords": [
"scons",
" build",
" c++"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "145fe83dea166c2c2b28ec5f1fda0452b0673f312feaa303cbf79c2c3cb9f4f9",
"md5": "ba0d1f2800915b33b7dbbc32d292759f",
"sha256": "f219ab2098d915c28ac1cd8d0ee1c702725a520145a987d8776babf9fc7c44d4"
},
"downloads": -1,
"filename": "cuppa-0.9.145-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ba0d1f2800915b33b7dbbc32d292759f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 231436,
"upload_time": "2024-10-26T11:23:54",
"upload_time_iso_8601": "2024-10-26T11:23:54.294515Z",
"url": "https://files.pythonhosted.org/packages/14/5f/e83dea166c2c2b28ec5f1fda0452b0673f312feaa303cbf79c2c3cb9f4f9/cuppa-0.9.145-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "95271f52ff692c6ef59ec08ff64cd7c33dcac00e9f6bc4ef0381595a86a48095",
"md5": "2f1bd85d3e39ad8fb80095c8a2c96f94",
"sha256": "1e6686e7d2647a761de4b7b3774943cdbbe1a3aded6176ea6477bb581866e07c"
},
"downloads": -1,
"filename": "cuppa-0.9.145.tar.gz",
"has_sig": false,
"md5_digest": "2f1bd85d3e39ad8fb80095c8a2c96f94",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 181810,
"upload_time": "2024-10-26T11:23:57",
"upload_time_iso_8601": "2024-10-26T11:23:57.056309Z",
"url": "https://files.pythonhosted.org/packages/95/27/1f52ff692c6ef59ec08ff64cd7c33dcac00e9f6bc4ef0381595a86a48095/cuppa-0.9.145.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-26 11:23:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ja11sop",
"github_project": "cuppa",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "cuppa"
}