Compare commits

...

241 Commits

Author SHA1 Message Date
ita1024 6595748b91 Merge branch 'flang' into 'master'
fc: add support for the flang compiler

See merge request ita1024/waf!2372
2024-05-30 23:34:51 +00:00
Harald Klimach b5a6e58934 fc: add support for the flang compiler 2024-05-30 17:14:45 +02:00
ita1024 7c0532a82d Merge branch 'master' into 'master'
Options: set argparse conflict_handler in constructor

See merge request ita1024/waf!2371
2024-05-26 07:55:05 +00:00
Alibek Omarov bba5047716 Options: set argparse conflict_handler in constructor 2024-05-26 07:55:05 +00:00
Waf Project 0c0f49ce6f Update playground/updates 2024-05-25 19:33:04 +08:00
ita1024 b2f89369fc Merge branch 'a1batross-master-patch-59640' into 'master'
softlink_libs.py: fix printing default option value with argparse

See merge request ita1024/waf!2370
2024-05-25 08:52:28 +00:00
Alibek Omarov b94ec720d9 softlink_libs.py: fix printing default option value with argparse
As per argparse documentation
2024-05-25 01:39:55 +00:00
Waf Project 0d2f819d1e
waf-2.1.1 2024-05-21 20:52:15 +02:00
Waf Project bdd70055df Due to arparse, Python >= 2.7 is now required 2024-05-21 20:36:19 +02:00
Waf Project b47fceb86a Update more examples 2024-05-21 20:35:25 +02:00
Waf Project 69049d83b8 Update the javatest example 2024-05-20 23:45:39 +02:00
Waf Project 8d2ad010f5 Update the pyqt example 2024-05-20 23:37:27 +02:00
Waf Project 72db8e0240 Update the protobuf example 2024-05-20 23:24:32 +02:00
Waf Project 2485ab46cd Update the build file tracker example 2024-05-20 23:12:43 +02:00
Waf Project 68f84f9084 Fix the example in playground/rst 2024-05-20 21:04:25 +02:00
Waf Project 43c5ae670a Remove old broken examples 2024-05-19 15:59:06 +02:00
Waf Project 8a0ecaef5f Update another example 2024-05-19 15:28:36 +02:00
Waf Project 967abf694c Remove the dbus example since dbus-binding-tool is part of a deprecated library for D-Bus IPC 2024-05-19 12:46:04 +02:00
Waf Project 327471474f Options on the command-line should not raise conflicts by default 2024-05-19 12:44:53 +02:00
Waf Project 9ad45cb350 Update a few examples, and improve jni detection 2024-05-19 12:43:55 +02:00
Waf Project 149102f11f Argparse updates 2024-05-14 00:26:16 +02:00
Waf Project 4d0edd113a Print waf version 2024-05-12 02:20:25 +02:00
Waf Project 66a013ed28 waf-2.1.0
Signed-off-by: Waf Project <noreply@waf.io>
2024-05-02 00:03:48 +02:00
Waf Project bd5c22d484 Move from optparse to argparse 2024-04-28 00:35:28 +02:00
Waf Project a3fec9f0b3 Improve ldscript example 2024-04-21 06:59:27 +02:00
Waf Project e0dcfae373 Update c_nec and c_emscripten 2024-04-16 00:25:45 +02:00
Waf Project a7d05142c5 Update outdated playground examples 2024-04-07 19:34:00 +02:00
Waf Project 76f416ca14 Lock wafcache on non-posix systems 2024-04-01 17:02:15 +02:00
Waf Project 9f0773cfba Move wafcache optional imports 2024-04-01 11:18:07 +02:00
Waf Project ec63a7dd38 Change _add_task to add_task in Runner.py - part 2 2024-04-01 09:35:13 +02:00
swaldhoer 974d0589fd Minor docs improvement 2024-03-29 12:02:50 +01:00
Waf Project 39413bedfd Update playground/ldscript 2024-03-28 16:47:29 +01:00
Waf Project aef2c6ef23 Remove old Itanium references in msvc/ifort detection 2024-03-23 10:59:16 +01:00
Waf Project 456bd879bc Change _add_task to add_task in Runner.py 2024-03-23 10:58:59 +01:00
Waf Project 707b362685 Add the script path to OneApi Fortran compilers 2024-03-23 10:55:08 +01:00
Alibek Omarov 6e675dfc30 Configure: remove unused error_handlers
ConfigurationContext's error_handlers isn't used anywhere in the whole project,
and it's unknown how it should've been implemented
2024-03-09 12:21:02 +01:00
Waf Project d166646556 Reduce verbosity when both Qt5 and Qt6 are installed on a system
See aff9ec24a6
2024-03-09 12:16:56 +01:00
Federico Pellegrin a0b8f6a2a3 qt5: Revert pattern matching libraries as that breaks libs like QtX3D 2024-03-09 11:10:48 +01:00
Waf Project 761ed9beda Describe why color_gcc.py is no longer relevant 2024-03-09 11:10:41 +01:00
Waf Project ea1412b7e7 Avoid coloring all MSVC logs #2366 2024-03-09 11:10:34 +01:00
ita1024 53ca5a71ed Merge branch 'a1batross-waf-2.1-patch-93534' into 'waf-2.1'
extras: pthread: fix check for C mode with paranoid -Werror=old-style-declaration and -Werror=unused-variable

See merge request ita1024/waf!2365
2024-01-24 23:38:32 +00:00
Alibek Omarov 611cd30114 extras: pthread: fix check for C mode with paranoid -Werror=old-style-declaration and -Werror=unused-variable 2024-01-23 21:46:06 +03:00
Wynn Wilkes 84ba1e9da0 Fix possible crash in ctx.cmd_and_log() when verbose mode is on
- When waf is run with -v, and it runs a call to context.cmd_and_log() with an argument list,
  argument[0] is a relative path, and a cwd **kwarg is passed so that the argument[0] resolves
  correctly, then the call will crash saying the program could not be found. For example, the
  caller may be wrapping calls using a nodejs environment like:

  ctx.cmd_and_log("./node_modules/bin/webpack", cwd="webui")

  and this will fail with "Program ./node_modules/.bin/webpack not found!"
  if waf is run with -v. The user friendly check for usable programs still
  stays in place for shell calls and absolute paths, but allows the caller
  to use this pattern even when verbose mode is on. This same fix was
  previously made for context.exec_command().
2024-01-12 14:28:29 +01:00
Waf Project 01b4c03a84 Improve Qt6 detection with msvc 2024-01-12 14:13:07 +01:00
Waf Project 97a54d72da Typo 2024-01-12 14:10:54 +01:00
Waf Project 5122ef89f2 Fix exec_command & waf -v & custom path in environment 2023-12-10 22:43:52 +01:00
Wynn Wilkes 4a650f3455 Fix possible crash in ctx.exec_command() when verbose mode is on
- When waf is run with -v, and it runs a call to context.exec_command() with an argument list,
  argument[0] is a relative path, and a cwd **kwarg is passed so that the argument[0] resolves
  correctly, then the call will crash saying the program could not be found. For example, the
  caller may be wrapping calls using a nodejs environment like:

  ctx.exec_command("./node_modules/bin/webpack", cwd="webui")

  and this will fail with "Program ./node_modules/.bin/webpack not found!"
  if waf is run with -v. The user friendly check for usable programs still
  stays in place for shell calls and absolute paths, but allows the caller
  to use this pattern even when verbose mode is on.
2023-12-10 22:43:42 +01:00
Michael Vincent 20b04dd137 Improve msvc log output 2023-12-07 21:53:03 +01:00
Waf Project 266a75a4ef Switch to nonstopmode for latex prompts #2421 2023-12-07 21:14:05 +01:00
Björn Lindqvist 18192437a0 glib-mkenums is a Python script no need to check for perl 2023-10-21 10:47:05 +02:00
Waf Project 37808b3de4 Update the public key from the main branch 2023-10-21 10:36:54 +02:00
Waf Project d115501165 Duplicate the license to a file #2357
The license is in waf-light, but some people really want to have a file for it.
2023-10-21 10:17:57 +02:00
Björn Lindqvist 8b140fd541 Pass the args parameter through to parse_cmd_args 2023-10-21 10:05:03 +02:00
Waf Project 49231ab9ff Add macros for intel compiler detection (icx, icpx, ifx) 2023-10-21 10:04:38 +02:00
Dan Church 2689cc9518 Only detect binaries with execution permission
If for instance a program was in PATH and the file was marked
non-executable (`chmod -x`), `find_binary` it would still pick it up as
executable.
2023-10-21 10:04:05 +02:00
Waf Project 50644394f6 Detect new intel compilers (icx, icpx, ifx) 2023-09-26 22:40:09 +02:00
Björn Lindqvist f0b2fb9816 Fix crash in demos/asm
Crash is likely because gcc has become more strict in recent
version. To fix it I had to add the -no-pie flag and move mult10 to
the text section.
2023-09-26 22:39:40 +02:00
Waf Project dc5602608e Update the example that cleans any non-declared file #2415 2023-09-15 18:39:31 +02:00
Thomas Nagy 270a2e09b6 Update the documentation 2023-07-15 15:29:53 +02:00
ita1024 218da8fe28 Merge branch 'qt6-experimental2' into 'waf-2.1'
qt5: Add support for Qt6

See merge request ita1024/waf!2355
2023-07-15 11:05:10 +00:00
Rafaël Kooi 6c0a8c7c84 qt5: Add support for Qt6
Implements support for Qt6 by extending qt5.py. The user can opt in for
Qt6 support by setting cfg.want_qt6 = True. There's also a qt6 feature,
which at the moment is identical to the qt5 feature. Splitting has been
done now for futureproofing purposes. Qt6 libraries can be selected
through the cfg.qt6_vars variable. I didn't make an attempt at any
backwards compatibility by trying to load cfg.qt5_vars if it exists,
this is done so the move from Qt5 to Qt6 is a more deliberate process.

Signed-off-by: Rafaël Kooi <3961583-RA-Kooi@users.noreply.gitlab.com>
2023-06-22 19:08:28 +02:00
Alibek Omarov 2e8121f63f waflib: extras: msvs: enclose solution path into doublequotes in generated shell commands 2023-04-10 19:58:22 +02:00
ita1024 215de5f7d3 Merge branch 'waf-2.1' into 'waf-2.1'
Haxe Toolkit support

See merge request ita1024/waf!2352
2023-03-28 22:57:15 +00:00
Adam Barton 67dcb2b7f6 Haxe Toolkit support 2023-03-28 22:57:14 +00:00
Thomas Nagy d4f495bced Add Python 3.11 and 3.12 too 2023-03-28 01:21:30 +02:00
Alibek Omarov d7da1547f7 waf.bat fixes 2023-03-28 01:21:17 +02:00
Thomas Nagy ff0a8cec14 Support SOURCE_DATE_EPOCH in some places 2023-02-12 10:42:11 +01:00
Thomas Nagy 99bdb12a60 Add asynchronous wafcache uploads 2023-01-01 14:18:50 +01:00
Thomas Nagy 412c9e6b22 Fix suspicious warnings 2023-01-01 14:16:40 +01:00
Thomas Nagy c24ef5f3e6 Python3: install packages to "site-packages" (same as waf-2.0) 2022-12-31 10:19:18 +01:00
Thomas Nagy 69c95b5341 Provide a replacement for distutils.version.LooseVersion 2022-12-22 18:58:31 +01:00
Harald Klimach 240555a979 Adding an extra module to detect the Fujitsu Fortran compiler on ARM64FX. 2022-11-20 06:56:06 +01:00
Thomas Nagy e559bd08f2 Ensure find_program replaces more invalid characters 2022-11-20 06:55:13 +01:00
Thomas Nagy 698888f149 wafcache: skip uploads when inputs are modified while building 2022-10-02 01:51:02 +02:00
André Bauer af9a1a249d Fix typo in documentation. 2022-10-02 01:50:57 +02:00
Andrew Malachowski f69602d1df Improve cp65001 compat in cpython < 3.3 2022-10-02 01:50:50 +02:00
Federico Pellegrin fae5693f41 sphinx: support multiple output formats 2022-10-02 01:50:40 +02:00
Andrew Malachowski 23c975064e gccdeps: Harden class wrapping 2022-10-02 01:50:30 +02:00
Federico Pellegrin 78f49d44c8 pyqt5: improve autodetection of tools and add flag support
Improves autodetection by adding tool naming as found in some recent
distributions (ie. Fedora). Adds also possibility to pass via env
command line options to tools (needed ie. to explicitly pass
generator due to changes to uic/rcc tool).

Test updated to demonstrate and document the parameter needed to
work out of the box with newest tooling.
2022-10-02 01:50:23 +02:00
Thomas Nagy 7b912a0439 Ensure signed waf files can be created using Python3 2022-10-02 01:50:14 +02:00
Thomas Nagy 2a1eeba691 Sort visual studio versions by version number #2352 2022-05-22 11:30:52 +02:00
Alibek Omarov b91ef6a91b msvc: fix version detection when new and old compilers are installed 2022-05-22 11:30:34 +02:00
David Kassa b0ea8121e8 modernize macos demo 2022-05-19 00:46:03 +02:00
Thomas Nagy d7d5e9d2d6 docs: fix the inheritance diagrams in the apidocs 2022-05-17 23:54:58 +02:00
Thomas Nagy 5c90204a96 doc: fix the empty apidocs 2022-05-17 23:54:50 +02:00
Thomas Nagy 6b820ba879 docs: improve the featuremap's layout 2022-05-17 20:20:19 +02:00
Miro Hrončok b093e9eac7 Python: Use EXT_SUFFIX config var over the deprecated/removed SO
Fixes https://gitlab.com/ita1024/waf/-/issues/2386
2022-05-17 17:31:40 +02:00
ita1024 5d56dff596 Merge branch 'waf-2.1' into 'waf-2.1'
tools: c_tests: use stlib flag instead of shlib in check_endianness

See merge request ita1024/waf!2339
2022-05-14 22:21:10 +00:00
Francescodario Cuzzocrea 317e3e8579
tools: c_tests: use stlib flag instead of shlib in check_endianness
shlib is no-op in some baremetal newlib based toolchains (for example in
riscv one), and causes the check to fail as the --dynamic flag is not
recognized
2022-05-12 14:56:09 +02:00
Mathieu Parent 97302d9758 Add support for GNU/kFreeBSD
Where default compiler is gcc
2021-12-14 14:24:32 +01:00
Thomas Nagy 00c3cd31b6 Remove the 'check' target from eclipse.py because it is unused 2021-12-09 15:47:16 +01:00
Thomas Nagy 02d906f69a Avoid errors in case ECLIPSE_EXTRA_TARGETS is is set to None 2021-12-09 15:46:57 +01:00
Federico Pellegrin 41eb8ef35f eclipse: add possibility to add custom targets execution
Make it easy to add custom target executions in the automatic
eclipse configuration generation, for example to call other
standard waf targets from other tools or with specific options.
2021-12-09 15:44:30 +01:00
Thomas Nagy 8dc07cc533 Detect qt5 libraries in alphabetical order 2021-12-08 02:19:28 +01:00
Thomas Nagy 8ca3cbd277 Detect Qt3D* libraries #2368 2021-12-08 02:19:20 +01:00
Thomas Nagy d27e0bd271 Update the CI pipelines 2021-12-04 10:22:00 +01:00
Thomas Nagy 2bbee630cc Update the CI Pipelines for Python 2.7 2021-12-04 09:49:46 +01:00
Thomas Nagy f3c09355ef Update the CI pipelines 2021-12-04 09:38:20 +01:00
Federico Pellegrin 910133a5b6 wafcache: support stats also for multiple build commands 2021-11-24 20:42:26 +01:00
ita1024 065496a619 Merge branch 'waf-2.1-fix-python-tool' into 'waf-2.1'
Waf 2.1 fix python tool

See merge request ita1024/waf!2332
2021-09-30 19:30:49 +00:00
Morten V. Pedersen 59a9b24cf8 Waf 2.1 fix python tool 2021-09-30 19:30:49 +00:00
Federico Pellegrin 9c5945d85a eclipse: remove repeated entries in include paths for C/C++
Make sure just unique include paths (both system and local) are
added to prevent overcrowding with useless redundant include paths
that grow up a lot the generated XML file and make the usage of
the GUI messy.
The filter was already there for Java/Python.
2021-09-04 22:38:01 +02:00
Federico Pellegrin 229bf15ab2 eclipse: add generation of editor language settings
Add automatic generation of editor language settings for C and C++,
so the automatic code correction uses the correct compiler and
compiler flags, including for example the correct C/C++ standard
so construct from such standards are correctly managed by the IDE.
Correct compiler and flags are automatically generated using the
build environment data gathered during configure phase.
The playground example has been modified to contain some code that
is standard specific to demonstrate the new feature when run under
Eclipse.
2021-09-01 00:43:35 +02:00
Federico Giovanardi 664513aa44 Make clang_compilation_database compatible with variants
In the current implementation if a project is using
build variants it's not possible to use the clang_compilation_database
plugin because it strips the variant information from the build object.
2021-07-15 19:09:43 +02:00
Erik Parker 45bc50e523 color_gcc: Check that cmd has elements in it before processing it. 2021-07-15 19:09:24 +02:00
Thomas Nagy 9a60e7ed9e Process dependency Nodes in bld(rule=..., deps=[..]) 2021-07-15 19:09:18 +02:00
Thomas Nagy 95c2bc0702 Improve error messages from scanner errors #2356 2021-07-15 19:09:04 +02:00
Thomas Nagy 55d57d0b58 Handle deprecated Thread.setDaemon in Python 3.10 2021-05-13 17:12:40 +02:00
Thomas Nagy 747a339b7f Ensure ConfigurationContext.load/Context.load have the same interface (continued) 2021-05-13 17:02:31 +02:00
Thomas Nagy 86b1f0def1 Ensure ConfigurationContext.load/Context.load have the same interface 2021-05-09 10:32:16 +02:00
Thomas Nagy 2f248f78e2 Disable OpenIndiana from the pipelines 2021-05-06 21:48:46 +02:00
Thomas Nagy 58b58fb0ee On windows, try $INCLUDEPY/../libs to detect the Python library path 2021-05-06 21:48:39 +02:00
Federico Pellegrin 6ccfd6d704 swig: skip CR (\r) if present in module name
Handles presence of \r in module name (ie. DOS mode swig .i files)
Should fix #2350
2021-05-06 21:48:29 +02:00
Michael Vincent 22b72e167f gccdeps: Refactor cache lock
Rework how gccdeps' cached_nodes lock is used so acquiring the lock is
only necessary on a cache miss. Also use a "with" context manager to
simplify management of the lock lifecycle.

Ported from 8b5a2a2086
2021-05-06 21:48:18 +02:00
Michael Vincent bf97987991 gccdeps: Move scan() method
Move the scan() method down in the file to match msvcdeps' method
ordering. This makes it easier to compare gccdeps.py and msvcdeps.py
to keep them in sync.
2021-05-06 21:48:12 +02:00
Michael Vincent 30508f53c2 gccdeps: Rename some variables
Rename some local variables to clarify their purpose and to align with
msvcdeps.py.
2021-05-06 21:48:05 +02:00
Michael Vincent 615c32faef msvcdeps: Align with gccdeps
Just a few small changes to make msvcdeps.py align with gccdeps.py
better.
2021-05-06 21:47:53 +02:00
Michael Vincent e55b4b2375 msvcdeps: Remove unused variable 2021-05-06 21:47:45 +02:00
Thomas Nagy 67793aa173 Let msvcsdeps process relative paths and in a deterministic manner 2021-05-06 21:47:38 +02:00
Michael Vincent ba44704dbf msvcdeps: Faster case correction
Visual Studio returns paths to dependencies with incorrect case.
ant_glob() is very slow for this use case (40~50% impact to overall
build time). This patch uses os.listdir() to find the correct case
of each path component.
2021-05-06 21:47:28 +02:00
Alibek Omarov a82625297d c_config: add RISC-V generic detection 2021-04-15 17:30:54 +02:00
Erik Parker a23b3f5e9b winres: Pass include paths by environment variable 2021-04-05 22:04:23 +02:00
Erik Parker 68ff6f13b2 msvs: Update project sorting in visual studio solution file
In order to correctly set a default project in visual studio any folders
must be listed at the top of the solution file. This change ensures that
any folders included in generated solutions sort to the top of the .sln
file. The default project, if one exists, will be located after the
folders. Note that it should also be correct to place the default
at the top of the file, followed by any folders.
2021-03-13 07:11:17 +01:00
Thomas Nagy 28318c9cca Remove the method conf.add_as_needed because it does not check for the flag usage 2021-03-12 07:54:52 +01:00
Thomas Nagy bf5a825317 Work around faulty vcvarsall.bat scripts #2315 2021-01-30 16:22:55 +01:00
Bootsma, James ca3ca0591e waf_unit_test: Fix command handling under windows
The unit test tool moved from a simple split to using shlex.split for
handling the unit test command. This results in the path separators on
windows being treated as escapes.

To handle this the unit test exec command is properly escaped before
joining so that the subsequent split restores the original arguments.
The quote function is also exposed in the Utilities module so that
wscripts making use of the unit test tool can properly quote their
contributions to the command as well.
2021-01-21 18:51:47 +01:00
Thomas Nagy ff8c1828aa Allow mixing Unix paths with destdir on non-Unix platforms 2021-01-19 20:52:57 +01:00
Thomas Nagy b864388e12 Fix Build.py indentation 2021-01-19 17:51:01 +01:00
Thomas Nagy da5769172b Add more docs to clang_compilation_database 2021-01-19 17:50:56 +01:00
Thomas Nagy 0d0aa45d0b Increase clang_compilation_database and swig compatibility 2021-01-19 17:14:58 +01:00
Thomas Nagy e0c16b3ada Suppress cache trimming operation errors 2021-01-19 17:14:52 +01:00
Federico Pellegrin a8469f49d8 wafcache: fix reporting of concurrent trim error
As this is run in the non-waf process we don't have Logs, so we
write to stderr instead or we will get a NameError name 'Logs' is
not defined.
2021-01-11 23:39:45 +01:00
Federico Pellegrin 236e6a7945 cuda: pass correctly compiler options from nvcc to the underlying compiler with --compiler-options 2021-01-09 01:28:32 +01:00
Federico Pellegrin d17780bc6b cuda: solve warnings due to testapp being created by two tg 2021-01-09 01:28:24 +01:00
Federico Pellegrin 1d722360be wafcache: fix small typo on stats log message 2021-01-09 01:26:58 +01:00
Thomas Nagy a296b4119e Do not detect Qt6 when detecting Qt5 2020-12-26 20:43:37 +01:00
Federico Pellegrin 54464f0a20 wafcache: add simple cache statistics collection, configurable via env 2020-12-26 20:24:57 +01:00
ita1024 8a0850dd89 Merge branch 'waf-2.1' into 'waf-2.1'
Haxe support

This commit adds support for haxe over [lix](https://github.com/lix-pm/lix.client) toolkit
- haxe library validation: check and fetch missing libs if needed
- "haxe" loader with "hx" compiler
- HAXEFLAGS
- lib checking and uselib_store support
- ctx.haxe with `res` argument to be more simple
- error checking

See merge request ita1024/waf!2308
2020-12-23 20:38:58 +00:00
Andrew Brodko 5841a8571e Haxe support 2020-12-23 20:38:58 +00:00
Thomas Nagy 1e729ba345 Work around distutils MACOSX_DEPLOYMENT_TARGET regression #2330 2020-12-17 14:18:33 +01:00
Thomas Nagy a74d40a505 Improve clang_compilation_database interaction with wafcache 2020-12-15 13:07:47 +01:00
Thomas Nagy 6ed66ce90b Reduce wafcache verbosity on cleanup operations 2020-12-15 11:06:05 +01:00
Thomas Nagy 6a5753da93 Conceal wafcache decoding errors in Python3 2020-12-15 10:58:00 +01:00
Thomas Nagy b7c7ffccab Fix the file_to_object example 2020-12-09 08:21:19 +01:00
Thomas Nagy 81bb79ab3d Update the project's public key 2020-12-09 08:21:02 +01:00
Thomas Nagy 3af7222fa0 Improve the WAFCACHE_CMD description 2020-12-09 08:20:32 +01:00
Thomas Nagy 4219f0822c Reduce verbosity in out-of-tree builds 2020-12-09 08:20:21 +01:00
Thomas Nagy 4e61e3a563 Improve WAFCACHE_CMD parameter handling 2020-12-09 08:20:07 +01:00
Federico Pellegrin 5584d1e687 wafcache: make the extra more configurable for cloud providers usage 2020-12-09 08:19:58 +01:00
Thomas Nagy b41f13b3a0 Exclude wafcache symlink handling
- Exclude classes having folder or symlinks
- Exclude well-known Task classes from wafcache processing
- Remove stale 'waflib.Task.Task.chmod' processing
2020-12-08 22:00:52 +01:00
Federico Pellegrin d1eb41f944 wafcache: add support for MinIO/mc cache
Add support for MinIO object storage (https://min.io/) using the
MinIO client (https://github.com/minio/mc) to wafcache.

MinIO is an open-source, self-hostable, S3 compatible cache. The
MinIO client supports MinIO connections as well as normal S3/GCS
storages by configuring aliases beforehand.

Hint: some distributions have `mc` (the GNU Midnight Commander)
installed which is not the minio client, be aware of this (or your
build may get stuck with waf waiting for `mc` to never finish)
2020-11-02 17:50:13 +01:00
Federico Pellegrin 9cd8a801c7 waf_unit_test: consider ut_cmd always for task signature 2020-11-01 21:20:02 +01:00
Thomas Nagy 6f8828dc3a Force unit test re-runs on environment or command changes 2020-11-01 21:19:56 +01:00
Federico Pellegrin 47d097d5a0 waf_unit_test: make sure test is rerun if ut_str changes 2020-11-01 21:19:38 +01:00
Thomas Nagy cc03657db7 Invalidate previous configurations on "waf configure"
Previously-configured projects are now invalidated when
running "waf configure" so that subsequent builds
cannot continue.
2020-09-19 10:38:05 +02:00
Thomas Nagy 2b03690f02 The lrelease program is necessary, not lupdate 2020-09-19 10:09:45 +02:00
Thomas Nagy e73e8d680a Fail Qt5 detection immediately when the c++ compiler is missing 2020-09-19 08:49:05 +02:00
Thomas Nagy 3b41d92e3c Make sure lupdate is explicitly required 2020-09-19 08:40:44 +02:00
Dotan Cohen 6fba8d3742 Update tutorial.rst to clarify that the env attribute is shared between the cnf and bld parameters to their respective methods. 2020-09-06 20:00:37 +02:00
Dotan Cohen 2831c75093 Update tutorial.rst to use uniform parameter names in all places where the configure() method or its parameter is mentioned. 2020-09-06 20:00:29 +02:00
Thomas Nagy ea509dd782 Determine a suitable msvc version option from VSCMD_VER in environment
See b3d1a0c2d4
2020-08-19 23:54:04 +02:00
Thomas Nagy 025ba60ebf Force an asm-specific defines flag 2020-08-15 12:16:36 +02:00
ita1024 ccfe1fc19c Merge branch 'FixClangCL' into 'waf-2.1'
Fix configuration fail on Windows with clang-cl module when not using the llvm.org release

See merge request ita1024/waf!2298
2020-08-14 06:36:40 +00:00
3961583-RA-Kooi@users.noreply.gitlab.com 1f92d020e7 Fix configuration fail when using portable LLVM on Windows 2020-08-13 20:54:19 +02:00
Thomas Nagy 35b60bed61 Remove an extra 'pch' annotation in playgroud/pch/wscript 2020-08-10 21:23:16 +02:00
Thomas Nagy 43ce688cdf Fix playground/pch's second example 2020-08-10 21:23:09 +02:00
Thomas Nagy a168e28ec8 Port file_to_obj to Python3 2020-08-03 23:30:33 +02:00
Thomas Nagy f65d08f5d5 Improve wafcache process pre-allocation 2020-08-03 23:20:53 +02:00
Thomas Nagy b41b1741d1 Improve the definition of static link tasks 2020-07-20 22:51:24 +02:00
Alibek Omarov 260f6065b9 c_config: add MCST Elbrus detection 2020-07-20 22:37:51 +02:00
Matt Selsky 778c7ad74c Typo 2020-07-20 22:37:40 +02:00
Thomas Nagy e21aead3b3 Conceal gccdeps/msvcdeps errors on inaccessible/unreadable files 2020-07-20 22:37:34 +02:00
Thomas Nagy 05198a8302 gccdeps/msvcdeps: renaming a header must rebuild silently #2293 2020-07-20 22:37:28 +02:00
Thomas Nagy cd589cd86b Update c_dumbpreproc (broken) 2020-07-20 22:37:18 +02:00
Andreu Montiel 988542e500 Allow parameter "always" in doxygen tool (waflib/extra/doxygen.py) 2020-07-20 22:37:00 +02:00
Johan Pauwels cc11c1dec1 Escape quoted strings in Xcode project 2020-07-20 22:36:39 +02:00
Johan Pauwels 668392f9fb Export preprocessor macros in Xcode project 2020-07-20 22:36:28 +02:00
Johan Pauwels f67f175c39 Fix configuration of linker flags in Xcode file 2020-07-20 22:36:14 +02:00
Johan Pauwels 84e71c9408 Fix alignment in generated Xcode file 2020-07-20 22:35:57 +02:00
Johan Pauwels 495b7c0e04 Xcode6 py3 fix.
The return type of .keys() in Python 3 is no longer a list, but a 
'dict_keys', which does not support the '+' operator.
2020-07-20 22:35:41 +02:00
Federico Pellegrin 0c843e5d40 sphinx: fix installation phase (as generated files are unknown until build) 2020-07-20 22:35:28 +02:00
Thomas Nagy 14b7d15a03 Ensure that the assertion message is showed in python.py #2302 2020-07-15 17:35:22 +02:00
Thomas Nagy 6c99c7cb0b Add a configuration test for pthread detection #2264 2020-05-02 21:04:28 +02:00
Federico Pellegrin 5ee61cfa91 qt5: improve documentation on library detection and options 2020-05-02 19:09:43 +02:00
Michael Vincent d3c0017d21 msvcdeps: Tweak debug output
Print out which source file waf is gathering dependencies for and leave
the leading spaces in the dependency debug output because it can be
helpful to see the dependency hierarchy.
2020-05-02 19:09:34 +02:00
Mathieu Courtois 2a6817fa1c boost: ignore version number from library name 2020-05-02 19:09:22 +02:00
Thomas Nagy a910d07d55 Make the unit test result format API compatible with waf 2.0 2020-04-28 01:17:07 +02:00
ita1024 b599c8bb9d Merge branch 'waf_unit_tg' into 'waf-2.1'
waf_unit_test: return also task generator in report tuples

See merge request ita1024/waf!2285
2020-04-27 22:56:38 +00:00
Federico Pellegrin 04e586b28a waf_unit_test: correct also demos/playgrounds with addition of ut_task change 2020-04-24 08:52:01 +02:00
Federico Pellegrin ba9ddfbfcb waf_unit_test: return also test task in report tuples 2020-04-22 03:55:38 +02:00
Mathieu Courtois 186f627203 boost: fix removal of lib extension 2020-04-09 16:55:14 +02:00
Federico Pellegrin 0c616901b4 c_config: -flto and -fno-lto need to be passed also when linking 2020-03-27 20:20:30 +01:00
Thomas Nagy 4f8099fbdc Improve custom option processing #2280 2020-03-27 20:20:22 +01:00
swaldhoer 93a0258996 Add support for clang++ on cygwin 2020-03-27 20:20:12 +01:00
Thomas Nagy 4bfab7f926 Remove the accidental gccdeps requirement 2020-03-27 20:20:00 +01:00
swaldhoer 02cff4a20c add support for clang on cygwin 2020-03-27 20:19:49 +01:00
Michael Vincent b7549d33ed gccdeps: Add support for gas
Add support for generating and using gcc's native dependency files with
the GNU Assembler in addition to the existing C/C++ support.

When the gas and gccdeps tools are loaded, the configure step will test
whether gcc operating on an assembly file supports the -MMD argument.
If so, waf will pass the -MMD argument to .S files assembled with gcc
which will cause it to generate .d dependency files. Waf will then parse
those files for dependency information.

Note: This will only work for assembly files compiled through the gcc
frontend, not with GNU as directly. It also requires assembly files to
use the uppercase .S file extension.
2020-03-27 20:19:35 +01:00
Federico Pellegrin 405c322489 doxygen: add ext_int to force build ordering 2020-03-27 20:19:25 +01:00
Federico Pellegrin 0c855b0aa2 javatest: add dependency management for jar/java taskgens 2020-01-04 11:31:25 +01:00
Federico Pellegrin c438138476 javaw: fix buglet overwrites working variable while adding dependencies
variable x is used in the outer loop and gets corrupted by inner enumeration in case of non-jar dependency

to reproduce: use the demos/java and run waf build twice: the first time will work (since no class files around)
while the second will not since will by bad luck pick a class file in the inner loop
2020-01-04 11:31:15 +01:00
Morten V. Pedersen 3204e2597c Using suggested self.cmd.startswith approach 2020-01-02 19:58:25 +01:00
Morten V. Pedersen 058b5d3793 Fix detection of build context when a custom context is used 2020-01-02 19:58:18 +01:00
Thomas Nagy ce2e5ca9a2 Exclude ConfigSet from altering ConfigurationContext.run_build caches #2273 2019-12-20 07:57:20 +01:00
Thomas Nagy 13d9c8566c Reduce relative path lengths to work around Visual Studio limitations #2272 2019-12-18 07:27:03 +01:00
Thomas Nagy 07d3203e0b
Make multicheck collisions less likely 2019-12-14 23:49:24 +01:00
Thomas Nagy 35617abe5e Remove another sys.platform == win32 2019-12-11 19:51:49 +01:00
Thomas Nagy 015a51a7cf Split llvm-lib path discovery into its own function 2019-12-11 07:42:02 +01:00
Thomas Nagy 52a49960c1 Improve extras/clang_cl 2019-12-10 07:53:23 +01:00
Adriano Scoditti e3c275a96a Make distclean target 'no_lock_in_top/run' modifiers compatible with env vars 2019-12-10 07:32:16 +01:00
Thomas Nagy bab51bf9f4 Remove conf.find_cpp from irix compiler detection 2019-12-10 07:32:08 +01:00
Thomas Nagy 5ec740ad2e Update irixcc 2019-12-10 07:32:01 +01:00
ita1024 73d432eb0a Merge branch 'clang_cl2' into 'waf-2.1'
Clang-cl support

See merge request ita1024/waf!2273
2019-12-10 06:29:06 +00:00
Rafaël Kooi c4f18f8182 Add a ReadMe and example environment for clang-cl on Linux 2019-12-10 05:07:35 +01:00
Rafaël Kooi 273d9dbe73 Add a small example utilizing clang-cl 2019-12-10 05:07:35 +01:00
Rafaël Kooi 32c2a49bf0 Support pure clang-cl builds on not Windows
A.k.a. I just tested it on Linux.
2019-12-10 05:07:35 +01:00
Rafaël Kooi 7310ade7c3 Initial clang-cl support 2019-12-10 05:07:35 +01:00
Rafaël Kooi 9fee4dfa75 Ignore VIM temporary files and Windows waf unpacks 2019-12-10 04:55:31 +01:00
Severin Strobl 799001bfae Support versioned shared libraries.
Shared libraries often use a suffix encoding their version which should
be handled when parsing linker flags.
2019-11-24 09:07:58 +01:00
Thomas Nagy d97ac90419
Improve the Qt5 fPIC/fPIE detection 2019-11-16 18:47:34 +01:00
Thomas Nagy b27afc7bbc
Use task.get_cwd() in clang_compilation_database 2019-11-10 19:01:38 +01:00
ita1024 11f449ee57 Merge branch 'FixTypo' into 'waf-2.1'
Add back an accidentally deleted line clang_compilation_database.py

See merge request ita1024/waf!2269
2019-11-10 14:49:14 +00:00
Rafaël Kooi 5343e8547a Add back an accidentally deleted line clang_compilation_database.py 2019-11-10 15:45:36 +01:00
Thomas Nagy 394f3cdac8
Typo 2019-11-10 12:34:36 +01:00
Thomas Nagy 16dbeb73e8
Fix relative path comparisons in clang_compilation_database 2019-11-10 12:32:20 +01:00
Thomas Nagy 38b6f24d73
Update msvc_pdb.py from the master branch 2019-11-10 10:41:25 +01:00
Thomas Nagy e485b45472 Remove the dependency on Qt5Gui in the Qt5 detection 2019-11-10 10:39:39 +01:00
Federico Pellegrin 26309403fd Tools/c_config.py: update to documentation 2019-11-07 07:07:44 +01:00
Alibek Omarov 261a589a66 msvc_pdb: check compiled_tasks existence, so it will not misleadingly throw a stacktrace if no sources was added 2019-11-04 21:26:29 +01:00
Federico Pellegrin 64b74c7659 playground/swig: clean up java swig example 2019-11-04 21:26:13 +01:00
Thomas Nagy 142fe5016a
The future version will be 2.1.0 2019-11-03 10:45:20 +01:00
Thomas Nagy 4e171c87ad
Improve os.environ propagation #2264 2019-11-03 10:24:13 +01:00
Thomas Nagy b8f19bfea3 Improve cache activity verbosity 2019-10-29 07:31:41 +01:00
Thomas Nagy a6ff2fc274
Push wafcache files synchronously for now 2019-10-23 19:53:18 +02:00
Thomas Nagy 6ef3a95c48 Insert the classpath dependencies from other task generators in first position #2186 2019-10-23 07:39:03 +02:00
Rafaël Kooi dbc66d19ba [MSVC/Fortran] Add /Fd flag when /Zi or /ZI flags are detected
Fixes #1731
2019-10-22 07:25:31 +02:00
Thomas Nagy f93cd67b14
Remove WinCE detection from msvc.py 2019-10-20 08:23:36 +02:00
Thomas Nagy 4aaadc1320
Remove Winphone detection 2019-10-20 07:45:02 +02:00
Thomas Nagy 5041a862fb
Propagate ldflags to fortran tasks #2262 2019-10-20 07:39:11 +02:00
Thomas Nagy dbe338c246
Make wafcache a default module 2019-10-18 23:05:12 +02:00
Thomas Nagy 959d57b757
Remove the metaclass hierarchy in Python 2 2019-10-18 23:02:19 +02:00
Thomas Nagy 1068ff98ec
Waf file creation will now require Python 3 2019-10-17 20:05:48 +02:00
209 changed files with 3081 additions and 3548 deletions

8
.gitignore vendored
View File

@ -8,7 +8,9 @@ build
demos/*/build*
playground/*/build*
.waf-*
waf-*
.waf3-*
waf3-*
*.log
.DS_Store
.AppleDouble
@ -37,3 +39,9 @@ Temporary Items
# Windows build output
waf.bat
# Vim temporary files
*.swp
# YouCompleteMe configuration
.ycm_extra_conf.py

View File

@ -9,7 +9,8 @@ pipeline {
label "ubuntu"
}
steps {
sh 'python2.7 ./waf-light'
sh 'python3 ./waf-light'
sh 'python2.7 ./waf --help'
stash includes: 'waf', name: 'waf'
}
}
@ -155,31 +156,14 @@ cd tests/install_group/
steps {
sh '''
export WAF_NO_PREFORK=1
/home/jenkins/jython/bin/jython ./waf-light
python3 ./waf-light
cp waf demos/c
cd demos/c
/home/jenkins/jython/bin/jython ./waf distclean configure clean build
'''
}
}
stage('py27') {
agent {
label "openbsd"
}
steps {
dir('demos') {
unstash 'waf'
}
sh '''cd demos/asm; /usr/local/bin/python2.7 ../waf configure clean build'''
sh '''cd demos/c; /usr/local/bin/python2.7 ../waf configure clean build'''
sh '''cd demos/c++; /usr/local/bin/python2.7 ../waf configure clean build'''
sh '''cd demos/glib2; /usr/local/bin/python2.7 ../waf configure clean build'''
sh '''cd demos/perl; /usr/local/bin/python2.7 ../waf configure clean build'''
sh '''cd demos/python; /usr/local/bin/python2.7 ../waf configure clean build'''
sh '''cd demos/subst; /usr/local/bin/python2.7 ../waf configure clean build'''
}
}
stage('py36') {
stage('py38') {
agent {
label "openbsd"
}
@ -261,28 +245,6 @@ cd tests/install_group/
}
}
}
stage('OpenIndiana') {
stages {
stage('py27') {
agent {
label "openindiana"
}
steps {
dir('demos') {
unstash 'waf'
}
sh '''export CFLAGS='-std=c99 -D_STDC_C99' '''
sh '''cd demos; ./waf configure clean build --top=c'''
sh '''cd demos; ./waf configure clean build --top=c++'''
sh '''cd demos; ./waf configure clean build --top=dbus'''
sh '''cd demos; ./waf configure clean build --top=java'''
sh '''cd demos; ./waf configure clean build --top=perl'''
sh '''cd demos; ./waf configure clean build --top=python'''
sh '''cd demos; ./waf configure clean build --top=ruby'''
}
}
}
}
stage('FreeBSD') {
stages {
stage('py36') {

199
ChangeLog
View File

@ -1,169 +1,24 @@
NEW IN WAF 2.0.19
-----------------
* Fix negative values for -j #2256
* Fix the Swig example compatibility with Python3 #2259
* Add extras/wafcache
* Tune the application name on --help #2254
NEW IN WAF 2.0.18
-----------------
* Fix a deadlock with cython and subst tasks #2244
* Fix rpath processing so that it no longer breaks dependency chains
* Fix fast_partial.py failures on configuration tests
* Fix duplicate -fno-strict-aliasing flags in Python compilation flags detection
* Fix annoying PIE errors in demos/asm/
* Improve configuration tests cache accuracy #2251
* Improve extras/fast_partial.py compatibility
* Improve extras/doxygen.py outdir parameter settings #2255
* Add a dependency scanner for assembly files (Gas/Yasm)
* Add executable arguments for configuration tests / execute=True
* Add a QtTest example to demos/qt5/ #2241
* Add a cross-compilation option to extras/objcopy.py #2247
NEW IN WAF 2.0.17
-----------------
* Improve build performance on FreeBSD and Python3 #2241
* Add Python 3.8 flag detection for building embedded interpreters #2239
* Prevent Qt5 uninstallation errors when c++ files are generated
* Improve installation/uninstallation colors
NEW IN WAF 2.0.16
-----------------
* Fix task semaphore errors on stateful tasks #2232
* Fix encoding errors with UTF-8 paths on Python 2 #2230
* Fix encoding errors in waf_unit_test #2220
* Improve dependency between javac task and use-d generated jars nodes
* Install pdb files with /debug:* flags #2224
* Make javadoc detection optional #2225
* Improve md5_tstamp documentation #2221
* Add extras/color_msvc to colorizes MSVC outputs #2221
* Fix symbol regex on mac-o binaries in extras/syms #2222
* Maintain order of lines in doxyfile in extras/doxygen #2223
* Improve extras/msvcdeps path handling
* Add extras/clang_cross for cross-compilation using clang
NEW IN WAF 2.0.15
-----------------
* Fix Python path detection under Git-Bash #2217
* Provide an option to disable args files #2216
* Improve command line length calculation for args files #2214
* Add libs/stubs to Cuda library path #2213
* Suppress ant_glob java warnings #2212
* Support multiple 'default_cmd' #2211
* Warn when buildcopy is used without any files to copy #2210
* Protobuf examples enhancements #2208 #2209
* Fix all DeprecationWarning: invalid escape sequence #2207
NEW IN WAF 2.0.14
-----------------
* Support Fortran 2008 submodules #2205
* Possible solution for Msys/Python 3.6 path issues #2217
* Support NEC SX-Aurora TSUBASA system's Fortran compiler extras/fc_nfort.py #2206
* Fix ignored configuration flags in gccdeps extras/gccdeps.py #2203
* Fix included protoc search on nested wscripts extras/protoc.py #2202
* Support extra taskgen and out of project include directories extras/protoc.py #2204
NEW IN WAF 2.0.13
-----------------
* Fix "broken revdeps" extra error message on certain build failures
* Avoid duplicate flags in Python configuration tests
* Find more Swig dependencies #2206
* Avoid spawning threads with -j1 on AIX systems
NEW IN WAF 2.0.12
-----------------
* Fix broken inheritance task trees #2194
NEW IN WAF 2.0.11
-----------------
* Do not raise an exception on check_cfg/mandatory=False/-vv #2193
* Post past task generators in lazy sub-folder builds #2191
* Disable warnings on versioned library installation
* Fix cpplint concurrent execution problems
NEW IN WAF 2.0.10
-----------------
* Add a task semaphore system
* Fix --help when no wscript is supplied #2184
* Fix Fortran processing with generated Fortran files
NEW IN WAF 2.0.9
NEW IN WAF 2.1.1
----------------
* Add dependencies on scriptlet outputs
* Made options optional for cython waftool
* Improve doxygen error handling
* Fixed some argparse regressions
* Fixed 'waf --version'
* Updated most project examples
NEW IN WAF 2.0.8
----------------
* Improve Windows console encoding outputs on Python 3.6 and Japanese code page #2163
* Improve msvc detection on Python 3.6 and Japanese code page #2155
* Improve moc/rcc flag parsing with msvc #2169
* Improve Eclipse project generation #2166 #2165 #2164 #2149 #2145
* Improve Boost project detection on dpkg-based systems #2146
CHANGES IN WAF 2.1.0
--------------------
* While the Waf file runs on Python 2 and 3, creating it requires Python 3
+ Added wafcache
+ waf_unit_test: Added task in returned tuples, custom reports should be adapted
~ Ensure ConfigurationContext.load and Context.load definitions are consistent and remove unused *k parameters
~ Remove the dependency on optparse and use argparse instead
- Remove waflib.Runner.PriorityTasks.appendleft
- Remove waflib.Task.TaskBase
- Remove the upper class of waflib.Task.Task (metaclass syntax)
- Remove Winphone/WinCE detection in msvc.py
- Remove conf.add_as_needed because it does not check for the flag usage
NEW IN WAF 2.0.7
----------------
* Apply priorities to dynamically-generated tasks #2137
* Fix upcoming Python 3.7 incompatibilities #2126
* Fix Python3 support in extras/xcode6.py #2121
* Improve priority support in extras/swig.py #2137
* Improve support extras/protoc.py #2135
* Improve argument handling in extras/clang_compilation_database.py #2127
* Add glib DBus bindings in extras/gdbus.py #2134
* Avoid name collisions for precompiled headers and libraries with similar names in extras/pch.py #2122
NEW IN WAF 2.0.6
----------------
* Add Task.deep_inputs to enable further dependencies on input file tasks
* Set unit tests to depend on input file tasks instead of timestamps
NEW IN WAF 2.0.5
----------------
* Force unit tests to depend on the executable creation time besides file contents
* Enhance the Eclipse project generator
* Update the cuda examples
NEW IN WAF 2.0.4
----------------
* Enable more advanced warnings of ant_glob on build folders in verbose mode
* Defer node.ant_glob(..., generator=True) evaluation
* Enable 'waf clean' to get the list of files to remove from bld.clean_files
* Define the environment variable WAF_NO_PREFORK to skip pre-forking
* Fix Can't pickle local object '_createenviron.<locals>.encode' exceptions (Python 3.6)
* Improve the Erlang module #2095
* Add task target to parallel_debug outputs #2091
NEW IN WAF 2.0.3
----------------
* Enable install_path=None for Python targets #2087
* Skip empty or duplicates in java user classpath #2084
* Change the unit test summary color scheme to use green and red colors
* Improve the deadlock error message
* Report sys.path values from Context.load_tool to improve error messages
* Cache qrc uic->h conversions to enable qrc re-use across targets
* Output long-running tasks outputs immediately using bld(rule=..., stdout=None)
NEW IN WAF 2.0.2
----------------
* Improve Intel Fortran compiler detection on Windows #2063
* Ensure that the task count starts at 1 in the build outputs
* Add a --pdb option to start pdb on unexpected exceptions #2052
* Fix conflicting qm/qrc re-used output files for multiple targets #2065
* Add java support in protobuf (extras) #2049
* Add a java test example (extras) #2062
* Enable symbol processing for empty targets (extras) #2053
NEW IN WAF 2.0.1
----------------
* Improve the default preprocessor behaviour for gcc/msvc
* Accept task objects in Build.add_to_group for compatibility reasons
* Prevent xcode generator from overwriting existing features #2038
* Fix self.includes data scope #2035
* Fix Node.ant_glob case sensitivity regression #2034
* Fix Logs.verbose options regression #2033
NEW IN WAF 2.0.0
----------------
CHANGES IN WAF 2.0.0
--------------------
* Provide a new priority system to improve scalability on complex builds
* Provide TaskGroup objects to improve scalability on complex builds
* Force new files into the build directory by default (use Node objects to bypass)
@ -174,12 +29,12 @@ NEW IN WAF 2.0.0
* Accept nested lists and generators in bld(source=...)
* Sort TaskGen methods in alphabetical order by reversing TaskGen.prec order
* Remove 'ut_fun' from waf_unit_test.py
* Remove Node.sig and Node.cache_sig
* Remove the BuildContext.rule decorator
* Remove Task.update_outputs, Task.always_run
* Remove atleast-version, exact-version and max-version from conf.check_cfg
* Remove c_preproc.trimquotes
* Remove field_name, type_name, function_name from conf.check() tests
* Remove extras/mem_reducer.py as a better solution has been merged
* Remove Utils.ex_stack (use traceback.format_exc())
- Remove 'ut_fun' from waf_unit_test.py
- Remove Node.sig and Node.cache_sig
- Remove the BuildContext.rule decorator
- Remove Task.update_outputs, Task.always_run
- Remove atleast-version, exact-version and max-version from conf.check_cfg
- Remove c_preproc.trimquotes
- Remove field_name, type_name, function_name from conf.check() tests
- Remove extras/mem_reducer.py as a better solution has been merged
- Remove Utils.ex_stack (use traceback.format_exc())

1
DEVEL
View File

@ -38,4 +38,3 @@ or in playground/ for modules under waflib/extras.
The files under waflib/Tools/ are kept API-compatible for the duration
of a middle version (currently 2.0).

25
LICENSE Normal file
View File

@ -0,0 +1,25 @@
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,32 +1,24 @@
## ABOUT WAF
# ABOUT WAF
Waf is a Python-based framework for configuring, compiling and installing applications. Here are perhaps the most important features of Waf:
* *Automatic build order*: the build order is computed from input and output files, among others
* *Automatic dependencies*: tasks to execute are detected by hashing files and commands
* *Performance*: tasks are executed in parallel automatically, the startup time is meant to be fast (separation between configuration and build)
* *Flexibility*: new commands and tasks can be added very easily through subclassing, bottlenecks for specific builds can be eliminated through dynamic method replacement
* *Extensibility*: though many programming languages and compilers are already supported by default, many others are available as extensions
* *IDE support*: Eclipse, Visual Studio and Xcode project generators (`waflib/extras/`)
* *Documentation*: the application is based on a robust model documented in [The Waf Book](https://waf.io/book/) and in the [API docs](https://waf.io/apidocs/)
* *Python compatibility*: cPython 2.5 to 3.x, Jython 2.5, IronPython, and Pypy
* *Automatic build order*: the build order is computed from input and output files, among others
* *Automatic dependencies*: tasks to execute are detected by hashing files and commands
* *Performance*: tasks are executed in parallel automatically, the startup time is meant to be fast (separation between configuration and build)
* *Flexibility*: new commands and tasks can be added very easily through subclassing, bottlenecks for specific builds can be eliminated through dynamic method replacement
* *Extensibility*: though many programming languages and compilers are already supported by default, many others are available as extensions
* *IDE support*: Eclipse, Visual Studio and Xcode project generators (`waflib/extras/`)
* *Documentation*: the application is based on a robust model documented in [The Waf Book](https://waf.io/book/) and in the [API docs](https://waf.io/apidocs/)
* *Python compatibility*: cPython 2.7 to 3.x, Jython 2.7 and PyPy
Waf is used in particular by innovative companies such as [Avalanche Studios](http://www.avalanchestudios.se) and by open-source projects such as [RTEMS](https://www.rtems.org/). Learn more about Waf by reading [The Waf Book](https://waf.io/book/).
Learn more about Waf by reading [The Waf Book](https://waf.io/book/). For researchers and build system writers, Waf also provides a framework and examples for creating [custom build systems](https://gitlab.com/ita1024/waf/tree/master/build_system_kit) and [package distribution systems](https://gitlab.com/ita1024/waf/blob/master/playground/distnet/README.rst).
For researchers and build system writers, Waf also provides a framework for creating [custom build systems](https://gitlab.com/ita1024/waf/tree/master/build_system_kit) and [package distribution systems](https://gitlab.com/ita1024/waf/blob/master/playground/distnet/README.rst).
Download the project from our page on [waf.io](https://waf.io/) or from a mirror on [freehackers.org](http://www.freehackers.org/~tnagy/release/), consult the [manual](https://waf.io/book/), the [API documentation](https://waf.io/apidocs/) and the [showcases](https://gitlab.com/ita1024/waf/tree/master/demos) and [experiments](https://gitlab.com/ita1024/waf/tree/master/playground).
Download the project from our page on [waf.io](https://waf.io/), consult the [manual](https://waf.io/book/), the [API documentation](https://waf.io/apidocs/) and the [showcases](https://gitlab.com/ita1024/waf/tree/master/demos) and [experiments](https://gitlab.com/ita1024/waf/tree/master/playground).
## HOW TO CREATE THE WAF SCRIPT
Python >= 2.6 is required to generate the waf script, and the resulting file can then run on Python 2.5.
Just run:
```sh
$ python ./waf-light configure build
```
Or, if several python versions are installed:
```sh
$ python3 ./waf-light configure build
python ./waf-light configure build
```
## CUSTOMIZATION
@ -34,20 +26,23 @@ $ python3 ./waf-light configure build
The Waf tools in waflib/extras are not added to the waf script. To add
some of them, use the --tools switch. An absolute path can be passed
if the module does not exist under the 'extras' folder:
```sh
$ ./waf-light --tools=swig
./waf-light --tools=swig
```
To customize the initialization, pass the parameter 'prelude'. Here is for example
how to create a waf file using the compat15 module:
```sh
$ ./waf-light --tools=compat15 --prelude=$'\tfrom waflib.extras import compat15\n'
./waf-light --tools=compat15 --prelude=$'\tfrom waflib.extras import compat15\n'
```
Although any kind of initialization is possible, using the build system kit
may be easier (folder build\_system\_kit):
```sh
$ ./waf-light --make-waf --tools=compat15,/comp/waf/aba.py --prelude=$'\tfrom waflib.extras import compat15\n\tprint("ok")'
./waf-light --make-waf --tools=compat15,/comp/waf/aba.py --prelude=$'\tfrom waflib.extras import compat15\n\tprint("ok")'
```
To avoid regenerating the waf file all the time, just set the `WAFDIR` environment variable to the directory containing "waflib".
@ -55,9 +50,9 @@ To avoid regenerating the waf file all the time, just set the `WAFDIR` environme
## HOW TO RUN THE EXAMPLES
Try this:
```sh
cp waf demos/c/
cd demos/c/
./waf configure build
```

12
TODO
View File

@ -1,12 +0,0 @@
Waf 2.1
-------
- Remove Winphone/WinCE detection in msvc.py
- Fix the circular imports ccroot<->c_config.py
- Remove superfluous *k in ctx.load() and other unused parameters
Ensure conf.load() has the same interface as ctx.load()
- Remove waflib.Runner.PriorityTasks.appendleft
- Remove waflib.Task.TaskBase
- Remove the upper class of waflib.Task.Task (metaclasses)
- Ordered_iter_dict in python 3.7
- Change _add_task to add_task in Runner.py

View File

@ -1,16 +1,16 @@
#include "header.h"
.text
.align 2
.section .data
.data
val:
.long SOME_VALUE
.text
.align 2
// Multiply input value by 421...
.global mult10
.type mult10, function
.type mult10, @function
mult10:
pushq %rbp
movq %rsp,%rbp
@ -20,4 +20,3 @@ mult10:
popq %rbp
ret

View File

@ -19,10 +19,10 @@ def build(bld):
target = 'asmtest',
defines = 'foo=12',
asflags = '-Os',
includes = '.')
includes = '.',
linkflags = '-no-pie')
def disp(ctx):
node = ctx.bldnode.ant_glob('asmtest*', remove=False)[0]
ctx.exec_command('%s' % node.abspath(), shell=False)
bld.add_post_fun(disp)

View File

@ -1,3 +0,0 @@
int main() {
return 0;
}

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<node name="/org/freedesktop/DBus/Properties">
<interface name="org.freedesktop.DBus.Properties">
<method name="Set">
<arg type="s" name="interface_name"/>
<arg type="s" name="property_name"/>
<arg type="v" name="value"/>
</method>
</interface>
</node>

View File

@ -1,21 +0,0 @@
#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2010 (ita)
VERSION = '1.0'
def options(opt):
opt.load('compiler_c')
def configure(conf):
conf.load('compiler_c dbus')
conf.find_program('glib-genmarshal') # required on a few systems
def build(bld):
tg = bld.program(
includes = '.',
source = bld.path.ant_glob('*.c'),
target = 'gnome-hello')
tg.add_dbus_file('test.xml', 'test_prefix', 'glib-server')

View File

@ -8,7 +8,7 @@ def build(bld):
# javac
srcdir = 'src',
compat = '1.7',
compat = '8',
# jar
basedir = '.',

View File

@ -4,7 +4,7 @@ def build(bld):
bld(features = 'javac',
srcdir = 'src',
compat = '1.7',
compat = '8',
use = 'cats-src',
name = 'bengala-cat',
recurse_use = True,

View File

@ -4,7 +4,7 @@ def build(bld):
bld(features = 'javac',
srcdir = 'src',
compat = '1.7',
compat = '8',
use = 'animals',
name = 'cats-src',
)

View File

@ -36,7 +36,7 @@ def build(bld):
bld(features = 'javac jar javadoc',
srcdir = 'src/', # folder containing the sources to compile
outdir = 'src', # folder where to output the classes (in the build directory)
compat = '1.6', # java compatibility version number
compat = '8', # java compatibility version number
sourcepath = ['src', 'sup'],
classpath = ['.', '..'],
#jaropts = ['-C', 'default/src/', '.'], # can be used to give files

View File

@ -1,6 +1,6 @@
#include "StringUtils.h"
#include <string.h>
#include <ctype.h>
JNIEXPORT jboolean JNICALL Java_StringUtils_isAlpha(JNIEnv *env, jclass clazz,
jstring jStr)

View File

@ -1,6 +1,7 @@
// waf sample Mac application - main.m
// Chris Pickel, 2011
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
int main(int argc, const char* argv[]) {

View File

@ -21,7 +21,7 @@ def configure(conf):
if not conf.env.ARCH_ST:
conf.fatal('This example is for macs only')
conf.env.FRAMEWORK_COCOA = 'Cocoa'
conf.env.ARCH_COCOA = ['i386', 'x86_64']
conf.env.ARCH_COCOA = ['x86_64', 'arm64']
def build(bld):
bld.program(

View File

@ -35,4 +35,3 @@ Bar_private::Bar_private() : QWidget(NULL) {
}
#include "foo.moc"

View File

@ -16,6 +16,10 @@ def configure(conf):
conf.load('compiler_cxx qt5 waf_unit_test')
#conf.env.append_value('CXXFLAGS', ['-g']) # test
if not conf.env.QT_LRELEASE:
# While qt5 detects most Qt tools, most of them are optional
conf.fatal('lrelease was not found')
# These tests would run on Ubuntu but not on other platforms
conf.check(
define_name = 'XYZ_QT5_TESTS',
@ -78,7 +82,7 @@ def print_test_results(bld):
lst = getattr(bld, 'utest_results', [])
if not lst:
return
for (f, code, out, err) in lst:
print(out.decode('utf-8'))
print(err.decode('utf-8'))
for result in lst:
print(result.out.decode('utf-8'))
print(result.err.decode('utf-8'))

View File

@ -10,7 +10,8 @@
\maketitle
\tableofcontents
\glossarystyle{altlist}
% next line is broken after using a newer texlive version
%\glossarystyle{altlist}
%% The glossary entries
\newglossaryentry{african}

View File

@ -17,7 +17,7 @@ def build(bld):
# optional parameters
obj.outs = 'ps' # we want a postscript output too - 'ps pdf' works too
obj.prompt = 1 # put 0 for the batchmode (conceals the debug output)
obj.prompt = 1 # put 0 for the nonstopmode (conceals the debug output)
obj.deps = 'wscript crossreferencing.ltx' # use this to give dependencies directly
# or more simply, for a pdf..

View File

@ -7,6 +7,7 @@ bld(
source = 'HelloWorldTest.cpp',
target = 'unit_test_program',
use = 'unittestmain useless CPPUNIT',
ut_str = '${SRC[0].abspath()} -flag1 ${NARG}'
ut_str = '${SRC[0].abspath()} -flag1 ${NARG}',
name = 'test0',
)

View File

@ -7,5 +7,6 @@ bld(
target = 'unit_test_program',
use = 'unittestmain useless CPPUNIT',
ut_cwd = bld.path,
name = 'test1',
)

View File

@ -5,7 +5,8 @@ if bld.env['PYTHON']:
bld(
features = 'test_scripts',
test_scripts_source = 'test.py',
test_scripts_template = '${PYTHON} ${SCRIPT}'
test_scripts_template = '${PYTHON} ${SCRIPT}',
name = 'test2',
)

View File

@ -23,7 +23,8 @@ if bld.env['PYTHON']:
features = 'test_scripts',
test_scripts_source = 'test.1.py test.2.py',
test_scripts_template = '${PYTHON} ${SCRIPT}',
test_scripts_paths = paths
test_scripts_paths = paths,
name = 'test3',
)

View File

@ -40,12 +40,16 @@ def summary(bld):
Logs.pprint('CYAN', 'test report %3.0f%% success' % val)
Logs.pprint('CYAN', ' tests that fail %d/%d' % (tfail, total))
for (f, code, out, err) in lst:
if code:
Logs.pprint('CYAN', ' %s' % f)
Logs.pprint('RED', 'status: %r' % code)
if out: Logs.pprint('RED', 'out: %r' % out)
if err: Logs.pprint('RED', 'err: %r' % err)
for result in lst:
if result.exit_code:
# In ut_task we have the task running the test and we can get any extra information
# from there (in this example just the generator name)
Logs.pprint('CYAN', ' %s (%s)' % (result.test_path, result.generator.name))
Logs.pprint('RED', 'status: %r' % result.exit_code)
if result.out:
Logs.pprint('RED', 'out: %r' % result.out)
if result.err:
Logs.pprint('RED', 'err: %r' % result.err)
def build(bld):
bld.recurse('src tests')

View File

@ -45,7 +45,7 @@ def build(bld):
#
# the config set 'debug' is loaded automatically when the 'debug' variant is used
if not bld.variant:
bld.fatal('Call "waf build_debug" or "waf build_release", and read the comments in the wscript file!')
bld.fatal('Call "waf build_debug" or "waf build_release" (same with "clean_debug") and read the comments in the wscript file!')
# the includes='.' add the build directory path to the command arguments
# (look at the -I flags by using waf -v)

View File

@ -2,4 +2,5 @@ Build
-----
.. automodule:: waflib.Build
:members:

View File

@ -2,4 +2,5 @@ ConfigSet
---------
.. automodule:: waflib.ConfigSet
:members:

View File

@ -2,4 +2,5 @@ Configure
---------
.. automodule:: waflib.Configure
:members:

View File

@ -2,4 +2,5 @@ Context
---------
.. automodule:: waflib.Context
:members:

View File

@ -2,4 +2,5 @@ Errors
------
.. automodule:: waflib.Errors
:members:

View File

@ -2,4 +2,5 @@ Logs
----
.. automodule:: waflib.Logs
:members:

View File

@ -2,4 +2,5 @@ Node
----
.. automodule:: waflib.Node
:members:

View File

@ -2,4 +2,5 @@ Options
-------
.. automodule:: waflib.Options
:members:

View File

@ -2,4 +2,5 @@ Runner
------
.. automodule:: waflib.Runner
:members:

View File

@ -2,4 +2,5 @@ Scripting
---------
.. automodule:: waflib.Scripting
:members:

View File

@ -2,4 +2,5 @@ Task
----
.. automodule:: waflib.Task
:members:

View File

@ -2,4 +2,5 @@ TaskGen
-------
.. automodule:: waflib.TaskGen
:members:

View File

@ -2,4 +2,5 @@ Utils
-----
.. automodule:: waflib.Utils
:members:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -3,9 +3,5 @@
About this documentation
------------------------
These documents are generated from `reStructuredText`_ sources by `Sphinx`_, a
document processor specifically written for the Python documentation.
.. _reStructuredText: http://docutils.sf.net/rst.html
.. _Sphinx: http://sphinx.pocoo.org/
This is the automatically generated documentation for the Waf project.

View File

@ -21,6 +21,14 @@ sys.path.append(os.path.abspath('.'))
graphviz_output_format = 'svg'
html_theme_options = {
"body_min_width": "none",
"body_max_width": "none",
}
inheritance_graph_attrs = dict(rankdir="LR", size='""', fontsize=14, ratio='compress')
# monkey patch a few waf classes for documentation purposes!
#-----------------------------------------------------------
@ -170,8 +178,9 @@ Configure.ConfigurationContext.__doc__ = """
ctx.myhelper()
"""
from waflib.Tools import asm
del asm.__dict__['link_task']
del asm.__dict__['stlink_task']
# Import all tools and build tool->feature map
tool_to_features = {}
@ -207,7 +216,7 @@ for x in lst:
tool_to_features[x].append(feat)
txt = ""
txt += "%s\n%s\n\n.. automodule:: waflib.Tools.%s\n\n" % (x, "="*len(x), x)
txt += "%s\n%s\n\n.. automodule:: waflib.Tools.%s\n :members:\n\n" % (x, "="*len(x), x)
if x in tool_to_features:
txt += "Features defined in this module:"
for feat in sorted(list(set(tool_to_features[x]))):
@ -258,7 +267,8 @@ for z in lst:
for x, y in links:
ms.append('\t\t"%s" -> "%s" [arrowsize=0.5,style="setlinewidth(0.5)"];' % (x, y))
rs = '\tdigraph feature_%s {\n\t\tsize="8.0, 12.0";\n%s\n\t}\n' % (z == '*' and 'all' or z, '\n'.join(ms))
#rs = '\tdigraph feature_%s {\n\t\tsize="8.0, 12.0";\n%s\n\t}\n' % (z == '*' and 'all' or z, '\n'.join(ms))
rs = '\tdigraph feature_%s {\n\t\t\n%s\n\t}\n' % (z == '*' and 'all' or z, '\n'.join(ms))
title = "Feature %s" % (z == '*' and '\\*' or z)
title += "\n" + len(title) * '='
@ -347,7 +357,7 @@ master_doc = 'index'
# General information about the project.
project = u'Waf'
copyright = u'2005-2018, Thomas Nagy'
copyright = u'2005-2023 waf.io'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@ -495,7 +505,7 @@ latex_elements = {
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'waf.tex', u'waf Documentation',
u'Thomas Nagy', 'manual'),
u'waf.io', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@ -528,7 +538,7 @@ latex_documents = [
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'waf', u'waf Documentation',
[u'Thomas Nagy'], 1)
[u'waf.io'], 1)
]
#autodoc_default_flags = ['members', 'no-undoc-members', 'show-inheritance']

View File

@ -24,7 +24,7 @@ In general, a project will consist of several phases:
Each phase is modelled in the wscript file as a python function which takes as argument an instance of :py:class:`waflib.Context.Context`.
Let's start with a new wscript file in the directory '/tmp/myproject'::
def configure(conf):
def configure(cnf):
print("configure!")
def build(bld):
@ -62,7 +62,7 @@ by using the *${}* symbol, which reads the values from the attribute bld.env::
bld(rule='echo ${MESSAGE}', always=True)
The bld object is an instance of :py:class:`waflib.Build.BuildContext`, its *env* attribute is an instance :py:class:`waflib.ConfigSet.ConfigSet`.
The values are set in this object to be shared/stored/loaded easily. Here is how to do the same thing by sharing data between the configuration and build::
This object is also accessible as an attribute on the `configure()` method's `cnf` parameter. Therefore, values can be shared/stored/loaded easily:
def configure(cnf):
cnf.env.MESSAGE = 'Hello, world!'
@ -111,9 +111,9 @@ Here is a script for a more complicated project::
The method :py:func:`waflib.Tools.c_config.check` executes a build internally to check if the library ``libm`` is present on the operating system.
It will then define variables such as:
* ``conf.env.LIB_M = ['m']``
* ``conf.env.CFLAGS_M = ['-Wall']``
* ``conf.env.DEFINES_M = ['var=foo']``
* ``cnf.env.LIB_M = ['m']``
* ``cnf.env.CFLAGS_M = ['-Wall']``
* ``cnf.env.DEFINES_M = ['var=foo']``
By stating ``use=['M', 'mylib']``, the program *app* is going to inherit all the *M* variables defined
during the configuration. The program will also use the library *mylib* and both the build order and the dependencies

View File

@ -1,22 +0,0 @@
#!/usr/bin/env Rscript
require(R.utils)
require(tools)
cmdArgs <- commandArgs(asValues = TRUE, excludeReserved = FALSE, excludeEnvVars = TRUE, os = "current")
if(!is.null(cmdArgs[["numTrees"]])) nTrees <- (as.integer(cmdArgs[["numTrees"]])) else nTrees <- 500
ffff <- cmdArgs[["ffff"]]
print(paste("nTrees =", nTrees, sep = " "))
Sweave(ffff)
texi2dvi("testSweave.tex", pdf = TRUE)
Stangle(ffff)
source("testSweave.R")
print(paste("Current Date/Time: ", date(), sep=""))
(sessionInfoObj <- sessionInfo())

View File

@ -1,13 +0,0 @@
\documentclass{article}
\SweaveOpts{eps=FALSE}
<<setup, echo=FALSE, results=hide>>=
options(width=80)
@
\begin{document}
Estimate a random Forest model composed of
\Sexpr{format(nTrees, big.mark = ',')}
trees.
\end{document}

View File

@ -1,29 +0,0 @@
#! /usr/bin/env python
# encoding: utf-8
VERSION = '1.0.0'
APPNAME = 'testR'
top = '.'
out = 'build'
def configure(ctx):
ctx.find_program('texi2dvi')
ctx.load('R')
def build(ctx):
ctx(
rule = '${R} CMD BATCH ${tsk.generator.ropts} ${tsk.generator.fopt % tsk.inputs[1].abspath()} -- ${SRC[0].abspath()} foo.log',
source = 'src/test.R src/testSweave.Rnw',
target = 'src/testSweave.pdf',
cwd = ctx.path.find_node('src').get_bld().abspath(),
install_path = '${PREFIX}/share',
shell = False,
ropts = '--no-restore --no-save --no-readline --numTrees=1000',
fopt = '--ffff=%s'
)
def dist(ctx):
ctx.algo = 'zip'
ctx.excl = ' **/waf-* **/.waf-* **/*~ **/*.orig **/*.pyc **/*.pyo **/*.bak **/.lock-w* **/*.log **/*.lot **/*.lof **/*.lst **/*.aux **/*.bbl **/*.blg **/*.out **/*.toc'

View File

@ -1 +0,0 @@
World.SayHello()

View File

@ -1,3 +0,0 @@
class World:
static def SayHello():
print "hello from boo"

View File

@ -1,6 +0,0 @@
public class World {
public static void SayHello()
{
System.Console.WriteLine("Hello from C#");
}
}

View File

@ -1,49 +0,0 @@
#! /usr/bin/env python
##
# This wscript shows the power of the CLI!
# You have an hello.exe using a world.dll,
# the world.dll can be generating using
# world.cs (in C#) or world.boo.
top = '.'
out = 'build'
def options(opt):
opt.load('cs')
opt.add_option("--use-cs", dest="use_cs", action="store_true",
help="use world.cs to generate world.dll")
def configure(conf):
conf.env.USE_CS = conf.options.use_cs
if conf.env.USE_CS:
conf.load('cs')
conf.load('boo')
def build(bld):
if bld.env.USE_CS:
# C# world library
bld(features = "cs",
source = "world.cs",
type = "library",
gen = "world.dll",
name = "world"
)
else:
# boo world library
bld(features = "boo",
source = "world.boo",
type = "library",
gen = "world.dll",
name = "world"
)
# executable that uses the world library
bld(features = "boo",
source = "hello.boo",
type = "exe",
gen = "hello.exe",
use = "world"
)

View File

@ -0,0 +1,27 @@
# Clang-CL
Clang-CL is a drop-in MSVC compatible driver replacing CL.exe
The clang compiler offers high compatibility with MSVC, but also offers more up to date C++ support.
It features better code generation, but still adheres to the MSVC ABI, letting you link with link.exe, offering you superior performance but also PDB debug info.
On Windows this waf module should just work, on Linux it tries to find the LLVM replacements and requires an environment containing the paths defined by the vsvars batch files (Visual Studio C++ Developer command prompt).
# Cross compilation
To cross compile for Windows from Linux, you will require the following:
* A partition with Windows installed (NTFS).
* Visual Studio (Tested with 2017).
* The Windows SDK.
* lowntfs-3g file system driver.
Make sure the Windows partition is mounted with `-t lowntfs-3g -o defaults,ignore_case,windows_names`.
This will allow Clang to find all headers and libraries referenced by scripts and headers, otherwise you will run into case sensitivity errors.
You can run a script to make all filenames lowercase, but that edits your Visual Studio installation, and I don't know if that has an effect on upgradability.
Clang uses the following environment variables to detect the Visual Studio install: `VCINSTALLDIR`, `VCToolsInstallDir`, `INCLUDE`, `LIB`, `LIBPATH`
I just copied these from the output of the `set` command in an MSVC command prompt on Windows and translated the paths to Linux paths.
Notice how the semicolon is still used as a path separator.
See `example_environment_linux.sh` for how my setup looks like. It expects the Windows partition to be mounted on `/mnt/windows`, with VS2017 installed and Windows 10 SDK 10.0.17763.0.
To specify a custom LLVM installation, you can put the path in the `LLVM_PATH` environment variable, or put the path in `cfg.env.LLVM_PATH` in your wscript.

View File

@ -0,0 +1,5 @@
export VCINSTALLDIR="/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/"
export VCToolsInstallDir="/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/tools/msvc/14.16.27023/"
export INCLUDE="/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/tools/msvc/14.16.27023/atlmfc/include;/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/tools/msvc/14.16.27023/include;/mnt/windows/program files (x86)/windows kits/10/include/10.0.17763.0/ucrt;/mnt/windows/program files (x86)/windows kits/10/include/10.0.17763.0/shared;/mnt/windows/program files (x86)/windows kits/10/include/10.0.17763.0/um;/mnt/windows/program files (x86)/windows kits/10/include/10.0.17763.0/winrt;/mnt/windows/program files (x86)/windows kits/10/include/10.0.17763.0/cppwinrt"
export LIB="/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/tools/msvc/14.16.27023/atlmfc/lib/x64;/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/tools/msvc/14.16.27023/lib/x64;/mnt/windows/program files (x86)/windows kits/10/lib/10.0.17763.0/ucrt/x64;/mnt/windows/program files (x86)/windows kits/10/lib/10.0.17763.0/um/x64"
export LIBPATH="/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/tools/msvc/14.16.27023/atlmfc/lib/x64;/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/tools/msvc/14.16.27023/lib/x64;/mnt/windows/program files (x86)/microsoft visual studio/2017/community/vc/tools/msvc/14.16.27023/lib/x86/store/references;/mnt/windows/program files (x86)/windows kits/10/unionmetadata/10.0.17763.0;/mnt/windows/program files (x86)/windows kits/10/references/10.0.17763.0"

View File

@ -0,0 +1,11 @@
#include <stdio.h>
int main(int argc, char** argv)
{
(void)argc;
(void)argv;
puts("This is a simple test program.\n");
return 0;
}

View File

@ -0,0 +1,21 @@
#!/usr/bin/env python
# encoding: utf-8
# vim: ts=4 sw=4 noexpandtab
top = '.'
out = 'build'
def options(opt):
opt.load('clang_cl')
def configure(cfg):
cfg.load('clang_cl')
cfg.env.append_value('CFLAGS','/Zi')
cfg.env.append_value('LDFLAGS','/DEBUG')
def build(bld):
bld.program(
name='test',
source=['test.c'],
target='test',
use='CRT_MULTITHREADED_DLL')

View File

@ -25,7 +25,7 @@ import random, bz2, os, threading
lock = threading.Lock()
def options(opt):
opt.add_option('--num', action='store', type='int', default=200, help='amount of compressed files to create')
opt.add_option('--num', action='store', type=int, default=200, help='amount of compressed files to create')
# values for storing the min and max
gzip = [10000000, 0]

View File

@ -10,7 +10,7 @@ from waflib.Tools import ccroot, c_preproc
from waflib.Configure import conf
class cuda(Task.Task):
run_str = '${NVCC} ${CUDAFLAGS} ${CXXFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXX_SRC_F}${SRC} ${CXX_TGT_F} ${TGT}'
run_str = '${NVCC} ${CUDAFLAGS} ${NVCCFLAGS_ST:CXXFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXX_SRC_F}${SRC} ${CXX_TGT_F} ${TGT}'
color = 'GREEN'
ext_in = ['.h']
vars = ['CCDEPS']
@ -32,6 +32,7 @@ def cxx_hook(self, node):
def configure(conf):
conf.find_program('nvcc', var='NVCC')
conf.find_cuda_libs()
conf.env.NVCCFLAGS_ST = "--compiler-options=%s"
@conf
def find_cuda_libs(self):

View File

@ -18,6 +18,9 @@ def configure(conf):
conf.load('cuda', tooldir='.')
# Add a few flags to test proper passing to nvcc
conf.env.CXXFLAGS=['-fPIC', '--std=c++11']
def build(bld):
# cuda application
@ -35,7 +38,7 @@ def build(bld):
# native application
bld.program(
source = 'test.cpp',
target = 'testapp')
target = 'testapp-native')
# cuda application
bld.program(

View File

@ -1,3 +0,0 @@
int main() {
return 0;
}

View File

@ -1,14 +0,0 @@
#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2016 (ita)
def options(opt):
opt.load('compiler_c')
def configure(conf):
conf.load('compiler_c')
def build(bld):
bld.load('print_commands')
bld.program(source='main.c', target='app')

View File

@ -1,9 +1,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <pkg1/exLibC/exLibC.hpp>
int check_smaller(int value) {
const char* foo = u8"bar"; // u8 is C++17 only
std::cout << __cplusplus << std::endl; // Check version of C++ standard
if (value < HELLO_LIMIT) {
return 0;
} else {

View File

@ -2,12 +2,15 @@
# encoding: utf-8
def options(opt):
# We are using C++
opt.load('compiler_cxx')
# We are using C and C++
opt.load('compiler_c compiler_cxx')
def configure(conf):
# We are using C++
conf.load('compiler_cxx')
# We are using C and C++
conf.load('compiler_c compiler_cxx')
# Force some standards to see that IDE will follow them
conf.env.CXXFLAGS=['-std=c++17']
conf.env.CFLAGS=['-std=c17']
def build(bld):
bld.shlib(source='exLibC/src/exLibC.cpp', includes='exLibC/src/include', target='exampleLibC', export_includes='exLibC/src/include/')

View File

@ -54,6 +54,7 @@ def options(opt):
def configure(conf):
conf.env.ECLIPSE_EXTRA_TARGETS = ['test', 'lint', 'foo --bar']
conf.load('eclipse')
# We recurse configurations in our submodules
conf.recurse(module_list)

View File

@ -24,6 +24,7 @@ def build(bld):
name='example',
source='main.c',
features='file_to_object',
includes_nodes=[],
)
bld(
target = 'app',

View File

@ -1,3 +0,0 @@
int main() {
return 0;
}

View File

@ -1,20 +0,0 @@
#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2010 (ita)
top = '.'
out = 'build'
def options(opt):
opt.load('compiler_c')
opt.load('errcheck')
def configure(conf):
conf.load('compiler_c')
def build(bld):
bld(feature='c cprogram', source='main.c', target='app1')
bld.program(sources='main.c', target='app2')
bld.program(source='main.c', targets='app3')
bld.program(source='main.c', target='app4', include='.')
bld.program(source='main.c', target='app5', define='x=1')

View File

@ -1,3 +0,0 @@
"""
nothing to see here
"""

View File

@ -1,15 +0,0 @@
#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2010 (ita)
"""
Setting the source directory below the current folder is a
bad idea in general
"""
top = 'src'
out = 'build'
def configure(conf):
pass

View File

@ -25,11 +25,11 @@ def h_file(filename):
"""now folders can have a signature too"""
st = os.stat(filename)
if stat.S_ISDIR(st[stat.ST_MODE]):
return Utils.md5(filename).digest()
return Utils.md5(filename.encode('latin-1')).digest()
m = Utils.md5()
m.update(str(st.st_mtime))
m.update(str(st.st_size))
m.update(filename)
m.update(filename.encode('latin-1'))
return m.digest()
Utils.h_file = h_file

View File

@ -1,88 +0,0 @@
#!/usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2006-2008 (ita)
"""
Native compilation using gcj
highly experimental, and gcj sucks anyway
"""
import os, re
from waflib.Configure import conf
from waflib import TaskGen, Task, Utils, Node
from waflib.TaskGen import feature, before, after
from waflib.Tools import ccroot
def configure(conf):
conf.find_program('gcj', var='GCJ')
conf.env.GCJLINK = conf.env.GCJ
conf.env.GCJLINKFLAGS_gcj_shlib = ['-shared']
conf.env.GCJFLAGS_gcj_shlib = ['-fPIC']
class gcj(Task.Task):
run_str = '${GCJ} ${GCJFLAGS} -classpath ${CLASSPATH} -c -o ${TGT} ${SRC}'
class gcj_program(ccroot.link_task):
run_str = '${GCJLINK} ${GCJLINKFLAGS} ${SRC} -o ${TGT}'
color = 'YELLOW'
class gcj_shlib(gcj_program):
pass
ccroot.USELIB_VARS['gcj'] = set(['CLASSPATH', 'JAVACFLAGS', 'GCJFLAGS'])
ccroot.USELIB_VARS['gcj_program'] = set(['CLASSPATH', 'JAVACFLAGS', 'GCJLINKFLAGS'])
ccroot.USELIB_VARS['gcj_shlib'] = set(['CLASSPATH', 'JAVACFLAGS', 'GCJLINKFLAGS'])
feature('gcj_program', 'gcj_shlib')(ccroot.apply_link)
feature('gcj_program', 'gcj_shlib')(ccroot.propagate_uselib_vars)
@feature('gcj')
@after('propagate_uselib_vars', 'apply_gcj')
def set_gcj_classpath(self):
lst = [isinstance(x, str) and x or x.abspath() for x in self.env.CLASSPATH]
self.env.CLASSPATH = os.pathsep.join(lst) + os.pathsep
@feature('gcj')
@before('apply_java')
def apply_gcj(self):
if 'javac' in self.features:
self.bld.fatal('feature gcj_native is not compatible with javac %r' % self)
srcdir = getattr(self, 'srcdir', '')
if isinstance(srcdir, Node.Node):
srcdir = [srcdir]
tmp = []
for x in Utils.to_list(srcdir):
if isinstance(x, Node.Node):
y = x
else:
y = self.path.find_dir(x)
if not y:
self.bld.fatal('Could not find the folder %s from %s' % (x, self.path))
tmp.append(y)
nodes = []
for x in tmp:
nodes.extend(x.ant_glob('**/*.java'))
if not getattr(self, 'gcjonce', None):
for x in nodes:
self.create_compiled_task('gcj', x)
#############################################################
# gcj is still beta software
# and this workaround cannot work for shared object (-fPIC)
class fix_dummy(Task.Task):
run_str = 'objcopy -L _ZGr8_$$_dummy ${SRC}'
before = ['gcj_program', 'gcj_shlib']
@feature('gcj')
@after('apply_gcj')
def gcj_developers_like_duplicate_dummy_symbols(self):
if self.env.FIX_DUMMY:
for tsk in self.compiled_tasks:
if isinstance(tsk, gcj):
self.create_task('fix_dummy', tsk.outputs[0])

View File

@ -1,5 +0,0 @@
public class Hi {
public Hi() {
System.out.println("hi");
}
}

View File

@ -1,5 +0,0 @@
package es;
public class Comp {
public static final String WAF = "-.-.-.-.-";
}

View File

@ -1,36 +0,0 @@
package es; // obligatory
import es.Comp;
public class Hello
{
int m_var = 0;
public Hello()
{
this.m_var = 2;
}
class MyHelperClass
{
MyHelperClass() { }
int someHelperMethod(int z, int q) { return 2; }
}
public Object makeObj(String name)
{
final String objName = "My name is " + name;
return new Object() {
public String toString()
{
return objName;
}
};
}
public static void main(String args[])
{
System.out.println("Hello, world" + Comp.WAF);
}
}

View File

@ -1,23 +0,0 @@
#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2008 (ita)
VERSION='0.0.2'
APPNAME='gcj_test'
top = '.'
out = 'out'
def configure(conf):
conf.load('gcj', tooldir='.')
conf.env.FIX_DUMMY = True
def build(bld):
bld(
features = 'gcj gcj_program',
srcdir = 'src more',
target = 'test',
gcjlinkflags = '--main=es.Hello',
classpath = [bld.path.find_dir(x) for x in ('src', 'more')],
)

View File

@ -1,9 +0,0 @@
#include "example.h"
constexpr int Example::not_exposed;
int Example::calculate(int some_argument) const { return _value + some_argument; }
int Example::getSomething() const { return _value; }
void Example::setSomething(int value) { _value = value; }

View File

@ -1,20 +0,0 @@
#pragma once
#include "genpybind.h"
class GENPYBIND(visible) Example {
public:
static constexpr int GENPYBIND(hidden) not_exposed = 10;
/// \brief Do a complicated calculation.
int calculate(int some_argument = 5) const;
GENPYBIND(getter_for(something))
int getSomething() const;
GENPYBIND(setter_for(something))
void setSomething(int value);
private:
int _value = 0;
};

View File

@ -1,9 +0,0 @@
import pyexample as m
def test_example():
obj = m.Example()
obj.something = 42
assert obj.something == 42
assert obj.calculate() == 47 # with default argument
assert obj.calculate(2) == 44

View File

@ -1,37 +0,0 @@
#!/usr/bin/env python
def options(opt):
opt.load('python')
opt.load('compiler_cxx')
opt.load('genpybind')
def configure(cfg):
cfg.load('python')
cfg.load('compiler_cxx')
cfg.check_python_version((2, 7))
cfg.check_python_headers()
cfg.load('genpybind')
cfg.check(compiler='cxx',
features='cxx pyext',
uselib_store='PYBIND11GENPYBIND_EXAMPLE',
mandatory=True,
header_name='pybind11/pybind11.h')
def build(bld):
bld(target='example_inc',
export_includes='.')
bld.shlib(target='example',
source='example.cpp',
features='use',
use='example_inc')
bld(target='pyexample',
source='example.h',
genpybind_tags='genpybind_example',
features='use genpybind cxx cxxshlib pyext',
use=['PYBIND11GENPYBIND_EXAMPLE', 'example'])

View File

@ -29,22 +29,22 @@ def gtest_results(bld):
lst = getattr(bld, 'utest_results', [])
if not lst:
return
for (f, code, out, err) in lst:
# if not code:
for result in lst:
# if not result.exit_code:
# continue
# uncomment if you want to see what's happening
# print(str(out, 'utf-8'))
output = str(out, 'utf-8').splitlines()
output = str(result.out, 'utf-8').splitlines()
for i, line in enumerate(output):
if '[ RUN ]' in line and code:
if '[ RUN ]' in line and result.exit_code:
i += 1
if ' OK ]' in output[i]:
continue
while not '[ ' in output[i]:
Logs.warn(output[i])
i += 1
elif ' FAILED ]' in line and code:
elif ' FAILED ]' in line and result.exit_code:
Logs.error(line)
elif ' PASSED ]' in line:
Logs.info(line)

View File

@ -0,0 +1,5 @@
class Main {
static function main() {
trace('hello');
}
}

View File

@ -0,0 +1,15 @@
def configure(ctx):
ctx.load('haxe')
ctx.check_haxe(mini='4.0.0', maxi='4.7.5')
ctx.check_haxe_pkg(
libs=['hashlink'],
uselib_store='HLR',
fetch=False)
def build(ctx):
ctx.env.HAXE_FLAGS = ['-dce', 'full', '-main', 'Main']
ctx(
compiler = 'HL',
source = 'Main.hx',
target = 'out.hl',
use = ['HLR'])

View File

@ -0,0 +1,8 @@
top = '.'
out = 'build'
def configure(ctx):
ctx.recurse('src')
def build(ctx):
ctx.recurse('src')

View File

@ -0,0 +1,19 @@
# Using `HLC` source generation with `clang`
## Environment
In this particular case, you need to have a distribution of `hashlink` in your system. After installing, you need to perform additional steps to pass required files for binary generation (in this case - to `clang`):
- either add hashlink's `lib` folder to `ctx.env.LIBPATH_HL`
- or replace `lib` folder with a symlink to hashlink's `lib` folder
- either add hashlink's `include` folder to `ctx.env.INCLUDES_HL`
- or replace `include` folder with a symlink to hashlink's `include` folder
## Targets
In this particular case, generated `.c` files are placed in separate `bin` subdirectory. This enhances your build transparency and allows you to add desired checks or perform additional operations with generated `.c` sources if needed, while keeping things in parallel. Keep this in mind if you're planning to extend your build layout with additional Haxe targets
## Running assembled binaries
Assuming that you have a `hashlink` distribution and all relevant system paths are adjusted, you could easily run your binary and see resulting output of `Main.hx:3: hello`. Keep in mind that if you're using an official `hashlink` distribution, it doesn't come with static libs for linking - this means that your produced binary requires paths to `libhl.dll` (or `.so`/`.dylib` - depends on your system). Of course, there may be a use case when you're building `hashlink` from sources or using it as a portable distribution - in these cases, you could run your binary while pointing paths to your dynamic libraries with adding correct paths (`$PWD/lib/` for example) to:
- `PATH` on windows
- `LD_LIBRARY_PATH` on linux
- `DYLD_LIBRARY_PATH` on macOS

View File

@ -0,0 +1,14 @@
def configure(ctx):
ctx.load('clang')
ctx.check(
compiler='c',
lib='hl',
use='HL',
uselib_store='HL')
def build(ctx):
ctx.program(
source = [ctx.bldnode.make_node('src/main/main.c')],
includes = [ctx.env.ROOT_INCLUDE_DIR],
target = 'app',
use = ['HL'])

View File

@ -0,0 +1 @@
place hashlink includes here (e.g. hlc.h) or replace this directory with symlink if using package manager - dedicated directory is used when native hashlink includes are used

View File

@ -0,0 +1 @@
place hashlink libraries here (e.g. libhl.so) or replace this directory with symlink if using package manager - dedicated directory is used when native hashlink libs are linked

View File

@ -0,0 +1,5 @@
class Main {
static function main() {
trace('hello');
}
}

View File

@ -0,0 +1,15 @@
def configure(ctx):
ctx.load('haxe')
ctx.check_haxe(mini='4.0.0', maxi='4.2.5')
ctx.check_haxe_pkg(
libs=['hashlink'],
uselib_store='HLR')
def build(ctx):
ctx.env.HAXE_FLAGS = ['-dce', 'full', '-main', 'Main']
ctx(
compiler = 'HLC',
source = 'Main.hx',
res = ctx.env.ROOT_RES_DIR,
target = 'main',
use = ['HLR'])

View File

@ -0,0 +1,15 @@
top = '.'
out = 'bin/waf'
def configure(ctx):
ctx.env.ROOT_INCLUDE_DIR = ctx.path.get_bld().make_node('src').make_node('main').abspath()
ctx.env.ROOT_RES_DIR = ctx.path.make_node('res').abspath()
ctx.env.LIBPATH_HAXE = ctx.path.make_node('haxe_libraries').abspath()
ctx.env.LIBPATH_HL = ctx.path.make_node('lib').abspath()
ctx.env.INCLUDES_HL = ctx.path.make_node('include').abspath()
ctx.recurse('src')
ctx.recurse('bin')
def build(ctx):
ctx.recurse('src')
ctx.recurse('bin')

View File

@ -14,9 +14,9 @@ def build(bld):
from waflib import Utils
from waflib.TaskGen import feature, after
from waflib.TaskGen import feature, after_method
@feature('hidden')
@after('apply_rule')
@after_method('process_rule')
def hide_it(self):
self.tasks[0].__class__.log_display = Utils.nada

View File

@ -18,7 +18,7 @@ def configure(conf):
def build(bld):
bld(rule='echo "int ko = $$RANDOM;" > ${TGT}', target='faa.h', always=True, shell=True, name='z2')
bld(rule='echo "int ko = $$$$ ;" > ${TGT}', target='faa.h', always=True, shell=True, name='z2')
bld.program(source='a.c main.c', target='foo', includes='.')
# sort the tasks in reverse order to force the 'faa.h' creation in last position

View File

@ -6,6 +6,8 @@
# Simple script to demonstrate integration of Java Unit testing inside
# standard waf_unit_test using either TestNG or JUnit
#
# try:
# waf configure --jtpath=/usr/share/java/testng.jar:/usr/share/java/jcommander.jar clean build
def test_results(bld):
"""
@ -14,9 +16,9 @@ def test_results(bld):
lst = getattr(bld, 'utest_results', [])
if not lst:
return
for (f, code, out, err) in lst:
print(out.decode('utf-8'))
print(err.decode('utf-8'))
for result in lst:
print(result.out.decode('utf-8'))
print(result.err.decode('utf-8'))
def options(opt):

View File

@ -1,2 +1,8 @@
ENTRY(init)
SECTIONS
{
. = 0x20000;
.text : { *(.text) }
. = 0x986754;
.data : { *(.data) }
.bss : { *(.bss) }
}

View File

@ -20,10 +20,10 @@ def build(bld):
linkflags = ['-nostdlib'],
)
from waflib import Utils
from waflib.TaskGen import after, feature
from waflib import Errors
from waflib.TaskGen import after_method, feature
@after('apply_link')
@after_method('propagate_uselib_vars')
@feature('cprogram', 'cshlib')
def process_ldscript(self):
if not getattr(self, 'ldscript', None) or self.env.CC_NAME != 'gcc':
@ -31,7 +31,7 @@ def process_ldscript(self):
node = self.path.find_resource(self.ldscript)
if not node:
raise Utils.WafError('could not find %r' % self.ldscript)
raise Errors.WafError('could not find %r' % self.ldscript)
self.link_task.env.append_value('LINKFLAGS', '-Wl,-T,%s' % node.abspath())
self.link_task.dep_nodes.append(node)

View File

@ -1,11 +1,13 @@
#! /usr/bin/env python
# The following example shows how several build processes can collaborate
# to stop spawning new processes when a special task of type K is executed
# this may be useful for link tasks for example
#
# several processes can wait on a resource limit
# in this case the maximum amount of "very busy" tasks is one across several processes
# also:
# - this example is posix-only (fcntl)
# - it assumes that the lock file "busy_lock.txt" is already created by another process
def options(opt):
opt.add_option('--loops', action='store', type='int', default=5, help='amount of cpu-intensive loops to perform')
opt.add_option('--loops', action='store', type=int, default=5, help='amount of cpu-intensive loops to perform')
def configure(conf):
busy = conf.path.find_node('look_busy.py').abspath()
@ -33,71 +35,56 @@ def lock_maxjob(self):
# lock the file, telling other build processes to avoid spawining tasks during that time
while True:
try:
self.lockfd = os.open(self.generator.bld.lockfile, os.O_TRUNC | os.O_CREAT | os.O_RDWR)
fcntl.flock(self.lockfd, fcntl.LOCK_EX | fcntl.LOCK_NB)
# each task/thread will have its own "lockfd"
# it is important to not create too many of them
if not getattr(self, 'lockfd', None):
with lock:
self.lockfd = os.open(self.generator.bld.lockfile, os.O_TRUNC | os.O_CREAT | os.O_RDWR)
with lock:
fcntl.flock(self.lockfd, fcntl.LOCK_EX | fcntl.LOCK_NB)
except EnvironmentError as e:
if e.errno in (errno.EACCES, errno.EAGAIN):
time.sleep(0.3)
continue
raise
os.write(self.lockfd, "%d" % os.getpid())
os.write(self.lockfd, b"%d %s\n" % (os.getpid(), repr(threading.current_thread()).encode()))
self.start_time = time.time()
break
def release_maxjob(self):
# release the lock file
print("> long task %d" % (time.time() - self.start_time))
try:
os.remove(self.generator.bld.lockfile)
os.close(self.lockfd)
except OSError, e:
# of someone else has removed the lock... bad luck! but do not fail here
print "unexpected failure", e
pass
def wait_maxjob(self):
# wait on the lock file.. up to a certain limit
while True:
with lock:
try:
ini = os.stat(self.generator.bld.lockfile).st_mtime
except OSError, e:
return
diff = time.time() - ini
if diff > 300: # stale lock file? wait 5 minutes
return
time.sleep(0.5)
fcntl.flock(self.lockfd, fcntl.LOCK_UN)
os.close(self.lockfd)
except OSError as e:
# of someone else has removed the lock... bad luck! but do not fail here
pass
except Exception as e:
print(e)
#print("lock released!", threading.current_thread())
# the method process is called by threads...
def process2(self):
if getattr(self.generator, 'exclusive', False):
lock.acquire()
try:
self.lock_maxjob()
finally:
lock.release()
else:
self.wait_maxjob()
self.lock_maxjob()
# regular work
ret = self.process_bound_maxjobs()
if getattr(self.generator, 'exclusive', False):
lock.acquire()
try:
self.release_maxjob()
finally:
lock.release()
self.release_maxjob()
return ret
def process(self):
try:
process2(self)
except Exception, e:
print type(e), e
except Exception as e:
print(type(e), e)
Task.Task.process_bound_maxjobs = Task.Task.process
Task.Task.process = process
Task.Task.lock_maxjob = lock_maxjob
Task.Task.release_maxjob = release_maxjob
Task.Task.wait_maxjob = wait_maxjob

View File

@ -8,6 +8,9 @@ def configure(conf):
def build(bld):
p = bld.srcnode.find_node('compute').abspath()
lockf = bld.srcnode.make_node('busy_lock.txt')
lockf.write('')
bld.jobs = JOBS = 3
for i in range(JOBS):
bld(rule='waf configure build -o test%d'%i, cwd=p, always=True)

View File

@ -53,7 +53,7 @@ def build(bld):
source = 'a.cpp',
use = 'BOOST')
bld.program(
bld(features = 'cxx cxxprogram',
target = 'test1',
source = 'b.cpp c.cpp main.cpp',
use = 'base-with-pch')

View File

@ -1,26 +0,0 @@
#!/usr/bin/env python
# encoding: utf-8
from waflib.TaskGen import extension
top = '.'
out = 'build'
@extension('.py', 'wscript')
def check_syntax(self, node):
self.create_task('Pep8', node)
def options(opt):
opt.load('pep8')
def configure(conf):
# warning after this comment
conf.load('pep8')
def build(bld):
bld(source='wscript')

Some files were not shown because too many files have changed in this diff Show More