debian/0000755000000000000000000000000012230526623007167 5ustar debian/jackd2.examples0000644000000000000000000000002112115643311012052 0ustar debian/asound.rc debian/jackd2-firewire.install0000644000000000000000000000004012115643311013515 0ustar usr/lib/*/jack/jack_firewire.so debian/libjack-jackd2-0.lintian-overrides0000644000000000000000000000023612115643311015434 0ustar # libjacknet isn't public, so we don't expose it in the shlib. shlib-missing-in-control-file # libjack0 != libjack-jackd2-0 package-name-doesnt-match-sonames debian/control.in0000644000000000000000000000635312230526575011214 0ustar Source: jackd2 Section: sound Priority: optional Maintainer: Debian Multimedia Maintainers Uploaders: Adrian Knoth , Jonas Smedegaard , Reinhard Tartler Build-Depends: @cdbs@, d-shlibs, python (>= 2.6.6-3~), libsamplerate-dev, libasound2-dev (>= 1.0.18) [linux-any], libdbus-1-dev, libexpat1-dev, libsndfile1-dev, libncurses-dev, libreadline-dev, libraw1394-dev [linux-any], libffado-dev (>= 2.0.0) [linux-any], libopus-dev, po-debconf Standards-Version: 3.9.4 Homepage: http://jackaudio.org/ Vcs-Git: git://git.debian.org/git/pkg-multimedia/jackd2.git Vcs-Browser: http://anonscm.debian.org/gitweb/?p=pkg-multimedia/jackd2.git Package: jackd2 Architecture: any Replaces: libjack0 (<= 1.9.5~dfsg-13), jackd (<< 3), jack-daemon Provides: jack-daemon Conflicts: jack-daemon, jackd (<< 3) Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, coreutils (>= 4.0), python-dbus, debconf | debconf-2.0, libjack-jackd2-0 (= ${binary:Version}) Pre-Depends: ${misc:Pre-Depends} Recommends: qjackctl, libpam-modules, jackd2-firewire [amd64 i386 powerpc] Suggests: jack-tools, meterbridge Description: JACK Audio Connection Kit (server and example clients) JACK is a low-latency sound server, allowing multiple applications to connect to one audio device, and to share audio between themselves. . This package contains the daemon jackd as well as some example clients. Package: libjack-jackd2-0 Architecture: any Section: libs Depends: ${shlibs:Depends}, ${misc:Depends} Conflicts: jackd2 (>> ${binary:Version}), jackd2 (<< ${binary:Version}), libjack0, libjack-0.116 Suggests: jackd2 (= ${binary:Version}) Provides: libjack-0.116 Replaces: libjack-0.116 Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} Description: JACK Audio Connection Kit (libraries) JACK is a low-latency sound server, allowing multiple applications to connect to one audio device, and to share audio between themselves. . This package contains the shared libraries. Package: jackd2-firewire Architecture: amd64 i386 powerpc Provides: jackd-firewire Replaces: jackd-firewire Conflicts: jackd-firewire Pre-Depends: ${misc:Pre-Depends} Depends: ${shlibs:Depends}, ${misc:Depends}, jackd2 (= ${binary:Version}) Description: JACK Audio Connection Kit (FFADO and FreeBoB backends) JACK is a low-latency sound server, allowing multiple applications to connect to one audio device, and to share audio between themselves. . This package contains the IEEE1394 (FireWire) backends FFADO and FreeBoB. Package: libjack-jackd2-dev Architecture: any Section: libdevel Multi-Arch: same Depends: libjack-jackd2-0 (= ${binary:Version}), ${asound:Depends}, ${misc:Depends}, ${shlibs:Depends}, pkg-config, libdbus-1-dev Conflicts: libjack0.100.0-dev (<< 0.102.20-2), libjack-dev Provides: libjack0.100.0-dev, libjack-dev-session, libjack-dev Replaces: libjack0.71.2-0 (<< 0.75.0-1) Description: JACK Audio Connection Kit (development files) JACK is a low-latency sound server, allowing multiple applications to connect to one audio device, and to share audio between themselves. . This package contains files needed for the development of JACK applications and an API reference. debian/symbols-common.in0000644000000000000000000000520612115643311012474 0ustar (optional)cleanup_mlock@Base __ABI__ (optional)default_jack_error_callback@Base __ABI__ (optional)default_jack_info_callback@Base __ABI__ (optional)jack_attach_port_segment@Base __ABI__ (optional)jack_attach_shm@Base __ABI__ (optional)jack_builtin_audio_functions@Base __ABI__ (optional)jack_builtin_midi_functions@Base __ABI__ (optional)jack_builtin_NULL_functions@Base __ABI__ (optional)jack_builtin_port_types@Base __ABI__ (optional)jack_call_sync_client@Base __ABI__ (optional)jack_call_timebase_master@Base __ABI__ (optional)jack_cleanup_shm@Base __ABI__ (optional)jack_client_alloc@Base __ABI__ (optional)jack_client_alloc_internal@Base __ABI__ (optional)jack_client_deliver_request@Base __ABI__ (optional)jack_client_handle_port_connection@Base __ABI__ (optional)jack_client_invalidate_port_buffers@Base __ABI__ (optional)jack_clock_source_name@Base __ABI__ (optional)jack_default_server_name@Base __ABI__ (optional)jack_destroy_shm@Base __ABI__ (optional)jack_error@Base __ABI__ (optional)jack_error_callback@Base __ABI__ (optional)jack_generate_unique_id@Base __ABI__ (optional)jack_get_free_shm_info@Base __ABI__ (optional)jack_get_mhz@Base __ABI__ (optional)_jack_get_microseconds@Base __ABI__ (optional)jack_get_microseconds_from_cycles@Base __ABI__ (optional)jack_get_microseconds_from_system@Base __ABI__ (optional)jack_get_port_functions@Base __ABI__ (optional)jack_get_process_done_fd@Base __ABI__ (optional)jack_info@Base __ABI__ (optional)jack_info_callback@Base __ABI__ (optional)jack_initialize_shm@Base __ABI__ (optional)jack_init_time@Base __ABI__ (optional)jack_messagebuffer_add@Base __ABI__ (optional)jack_messagebuffer_exit@Base __ABI__ (optional)jack_messagebuffer_init@Base __ABI__ (optional)jack_pool_alloc@Base __ABI__ (optional)jack_pool_release@Base __ABI__ (optional)jack_port_by_id_int@Base __ABI__ (optional)jack_port_by_name_int@Base __ABI__ (optional)jack_port_name_equals@Base __ABI__ (optional)jack_port_new@Base __ABI__ (optional)jack_register_server@Base __ABI__ (optional)jack_release_shm@Base __ABI__ (optional)jack_release_shm_info@Base __ABI__ (optional)jack_resize_shm@Base __ABI__ (optional)jack_server_dir@Base __ABI__ (optional)jack_set_clock_source@Base __ABI__ (optional)jack_shmalloc@Base __ABI__ (optional)jack_start_freewheel@Base __ABI__ (optional)jack_stop_freewheel@Base __ABI__ (optional)jack_thread_creator@Base __ABI__ (optional)jack_tmpdir@Base __ABI__ (optional)jack_transport_copy_position@Base __ABI__ (optional)jack_unregister_server@Base __ABI__ (optional)jack_user_dir@Base __ABI__ (optional)silent_jack_error_callback@Base __ABI__ (optional)start_server@Base __ABI__ debian/copyright0000644000000000000000000006444212115643311011130 0ustar Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: jackdmp Upstream-Contact: JACK developers Source: https://github.com/jackaudio/jack2 Repackaged, excluding non-DFSG files Files-Excluded: *.a *.dll *.Lib ./windows/**.rc ./waf Files: * Copyright: 2004-2012, Grame License: LGPL-2.1+ Files: dbus/reserve.* Copyright: 2009, Lennart Poettering License: Expat Files: windows/getopt* Copyright: 1987-1999, Free Software Foundation, Inc License: LGPL-2+ Files: common/JackAudioAdapter.cpp common/JackAudioAdapter.h common/JackAudioAdapterFactory.cpp common/JackAudioAdapterInterface.cpp common/JackAudioAdapterInterface.h common/JackCompilerDeps.h common/JackConstants.h common/JackEngine.cpp common/JackEngine.h common/JackException.cpp common/JackException.h common/JackFilters.h common/JackInternalClientChannel.h common/JackLibSampleRateResampler.cpp common/JackLibSampleRateResampler.h common/JackLockedEngine.h common/JackMidiDriver.h common/JackProfiler.cpp common/JackProfiler.h common/JackResampler.cpp common/JackResampler.h common/JackServerGlobals.cpp common/JackServerGlobals.h common/JackSystemDeps.h example-clients/netmaster.c example-clients/netslave.c example-clients/server_control.cpp linux/alsa/JackAlsaAdapter.cpp linux/alsa/JackAlsaAdapter.h macosx/JackCompilerDeps_os.h macosx/coreaudio/JackCoreAudioAdapter.cpp macosx/coreaudio/JackCoreAudioAdapter.h macosx/coreaudio/JackCoreAudioDriver.cpp macosx/coreaudio/JackCoreAudioDriver.h macosx/coreaudio/TiPhoneCoreAudioRenderer.cpp macosx/coreaudio/TiPhoneCoreAudioRenderer.h posix/JackCompilerDeps_os.h posix/JackSystemDeps_os.h solaris/oss/JackBoomerDriver.cpp solaris/oss/JackBoomerDriver.h tests/testAtomic.cpp tests/testMutex.cpp tests/testSem.cpp tests/testSynchroClient.cpp tests/testSynchroServer.cpp tests/testSynchroServerClient.cpp tests/testThread.cpp windows/JackWinNamedPipeServerNotifyChannel.cpp windows/portaudio/JackPortAudioAdapter.cpp windows/portaudio/JackPortAudioAdapter.h windows/portaudio/JackPortAudioDriver.cpp windows/portaudio/JackPortAudioDriver.h Copyright: 2004-2012, Grame License: GPL-2+ Files: linux/alsarawmidi/JackALSARawMidiDriver.cpp linux/alsarawmidi/JackALSARawMidiDriver.h linux/alsarawmidi/JackALSARawMidiInputPort.cpp linux/alsarawmidi/JackALSARawMidiInputPort.h linux/alsarawmidi/JackALSARawMidiOutputPort.cpp linux/alsarawmidi/JackALSARawMidiOutputPort.h linux/alsarawmidi/JackALSARawMidiPort.cpp linux/alsarawmidi/JackALSARawMidiPort.h linux/alsarawmidi/JackALSARawMidiReceiveQueue.cpp linux/alsarawmidi/JackALSARawMidiReceiveQueue.h linux/alsarawmidi/JackALSARawMidiSendQueue.cpp linux/alsarawmidi/JackALSARawMidiSendQueue.h linux/alsarawmidi/JackALSARawMidiUtil.h macosx/coremidi/JackCoreMidiInputPort.cpp macosx/coremidi/JackCoreMidiInputPort.h macosx/coremidi/JackCoreMidiOutputPort.cpp macosx/coremidi/JackCoreMidiOutputPort.h macosx/coremidi/JackCoreMidiPhysicalInputPort.cpp macosx/coremidi/JackCoreMidiPhysicalInputPort.h macosx/coremidi/JackCoreMidiPhysicalOutputPort.cpp macosx/coremidi/JackCoreMidiPhysicalOutputPort.h macosx/coremidi/JackCoreMidiPort.cpp macosx/coremidi/JackCoreMidiPort.h macosx/coremidi/JackCoreMidiUtil.cpp macosx/coremidi/JackCoreMidiUtil.h macosx/coremidi/JackCoreMidiVirtualInputPort.cpp macosx/coremidi/JackCoreMidiVirtualInputPort.h macosx/coremidi/JackCoreMidiVirtualOutputPort.cpp macosx/coremidi/JackCoreMidiVirtualOutputPort.h windows/winmme/JackWinMMEInputPort.cpp windows/winmme/JackWinMMEInputPort.h windows/winmme/JackWinMMEOutputPort.cpp windows/winmme/JackWinMMEOutputPort.h windows/winmme/JackWinMMEPort.cpp windows/winmme/JackWinMMEPort.h Copyright: 2011, Devin Anderson License: GPL-2+ Files: common/JackMidiAsyncQueue.cpp common/JackMidiAsyncQueue.h common/JackMidiAsyncWaitQueue.cpp common/JackMidiAsyncWaitQueue.h common/JackMidiBufferReadQueue.cpp common/JackMidiBufferReadQueue.h common/JackMidiBufferWriteQueue.cpp common/JackMidiBufferWriteQueue.h common/JackMidiRawInputWriteQueue.cpp common/JackMidiRawInputWriteQueue.h common/JackMidiRawOutputWriteQueue.cpp common/JackMidiRawOutputWriteQueue.h common/JackMidiReadQueue.cpp common/JackMidiReadQueue.h common/JackMidiReceiveQueue.cpp common/JackMidiReceiveQueue.h common/JackMidiSendQueue.cpp common/JackMidiSendQueue.h common/JackMidiUtil.cpp common/JackMidiUtil.h common/JackMidiWriteQueue.cpp common/JackMidiWriteQueue.h example-clients/midi_latency_test.c linux/firewire/JackFFADOMidiInputPort.cpp linux/firewire/JackFFADOMidiInputPort.h linux/firewire/JackFFADOMidiOutputPort.cpp linux/firewire/JackFFADOMidiOutputPort.h linux/firewire/JackFFADOMidiReceiveQueue.cpp linux/firewire/JackFFADOMidiReceiveQueue.h linux/firewire/JackFFADOMidiSendQueue.cpp linux/firewire/JackFFADOMidiSendQueue.h Copyright: 2010, Devin Anderson License: LGPL-2.1+ Files: common/JackAudioDriver.h common/JackDriver.cpp common/JackDriver.h common/JackDriverInfo.h common/JackDriverLoader.cpp common/JackDriverLoader.h common/JackDummyDriver.cpp common/JackDummyDriver.h common/JackExternalClient.cpp common/JackExternalClient.h common/JackFreewheelDriver.cpp common/JackFreewheelDriver.h common/JackInternalClient.cpp common/JackInternalClient.h common/JackLoopbackDriver.cpp common/JackLoopbackDriver.h common/JackRestartThreadedDriver.cpp common/JackRestartThreadedDriver.h common/JackServer.cpp common/JackServer.h common/JackServerAPI.cpp common/JackThreadedDriver.cpp common/JackThreadedDriver.h common/JackTimedDriver.cpp common/JackTimedDriver.h common/JackWaitThreadedDriver.cpp common/JackWaitThreadedDriver.h linux/alsa/JackAlsaDriver.cpp linux/alsa/JackAlsaDriver.h posix/JackShmMem_os.h Copyright: 2001-2005, Paul Davis 2004-2008, Grame License: GPL-2+ Files: common/JackAPI.cpp common/JackAudioPort.cpp common/JackClient.cpp common/JackClient.h common/JackClientControl.h common/JackClientInterface.h common/JackEngineControl.cpp common/JackEngineControl.h common/JackFrameTimer.cpp common/JackFrameTimer.h common/JackGraphManager.cpp common/JackGraphManager.h common/JackLibAPI.cpp common/JackPort.cpp common/JackPort.h common/JackRequest.h common/JackServerLaunch.h common/JackThread.h common/JackTime.h common/JackTransportEngine.cpp common/JackTransportEngine.h common/shm.c common/shm.h macosx/JackMachThread.cpp macosx/JackMachTime.c posix/JackPosixServerLaunch.cpp posix/JackPosixThread.cpp posix/JackPosixThread.h solaris/JackSolarisTime.c Copyright: 2001-2003, Paul Davis 2004-2012, Grame License: LGPL-2.1+ Files: common/memops.c common/memops.h example-clients/evmon.c example-clients/freewheel.c linux/alsa/alsa_driver.c linux/alsa/alsa_driver.h linux/alsa/generic.h linux/alsa/generic_hw.c linux/alsa/hammerfall.c linux/alsa/hammerfall.h linux/alsa/hardware.h linux/alsa/hdsp.h linux/cycles.h linux/driver.h Copyright: 1999-2001, 2003, 2007, Paul Davis License: GPL-2+ Files: dbus/controller.h dbus/controller_iface_session_manager.c dbus/params.c dbus/params.h dbus/xml.c dbus/xml.h dbus/xml_expat.c dbus/xml_nop.c dbus/xml_write_raw.c Copyright: 2007-2008,,2011 Nedko Arnaudov License: GPL-2~either Files: common/JackNetAdapter.cpp common/JackNetAdapter.h common/JackNetDriver.cpp common/JackNetDriver.h common/JackNetInterface.cpp common/JackNetInterface.h common/JackNetManager.cpp common/JackNetManager.h common/JackNetSocket.h common/JackNetTool.cpp common/JackNetTool.h posix/JackNetUnixSocket.cpp posix/JackNetUnixSocket.h windows/portaudio/JackPortAudioDevices.cpp windows/portaudio/JackPortAudioDevices.h Copyright: 2008-2011, Romain Moret at Grame License: GPL-2+ Files: common/JackTypes.h common/jack/thread.h common/jack/weakjack.h common/jack/weakmacros.h common/timestamps.c common/timestamps.h example-clients/internal_metro.h posix/JackTypes_os.h tests/external_metro.h Copyright: 2001-2004, 2010, Paul Davis License: LGPL-2.1+ Files: dbus/controller.c dbus/controller_iface_configure.c dbus/controller_iface_control.c dbus/controller_iface_introspectable.c dbus/controller_iface_patchbay.c dbus/controller_iface_transport.c dbus/controller_internal.h Copyright: 2007-2008, Juuso Alasuutari 2007-2008, 2011, Nedko Arnaudov License: GPL-2~either Files: linux/alsa/alsa_midi.h linux/alsa/alsa_midi_impl.h linux/alsa/alsa_rawmidi.c linux/alsa/midi_pack.h linux/alsa/midi_unpack.h Copyright: 2006-2007, Dmitry S. Baikov License: GPL-2+ Files: macosx/coremidi/JackCoreMidiDriver.cpp macosx/coremidi/JackCoreMidiDriver.h windows/winmme/JackWinMMEDriver.cpp windows/winmme/JackWinMMEDriver.h Copyright: 2009, Grame 2011, Devin Anderson License: GPL-2+ Files: example-clients/bufsize.c example-clients/samplerate.c example-clients/transport.c linux/alsa/bitset.h Copyright: 2003, 2005, Jack O'Quin License: GPL-2+ Files: macosx/iphone/freeverb.mm macosx/iphone/iPhoneNetAppDelegate.h macosx/iphone/iPhoneNetAppDelegate.m macosx/iphone/iphone-faust.mm macosx/iphone/main_master.mm macosx/iphone/main_slave.mm Copyright: 2009, Grame License: None FIXME Files: common/JackMidiDriver.cpp Copyright: 2009, Grame License: GPL-2~or Files: dbus/audio_reserve.c dbus/audio_reserve.h Copyright: 2009, Grame License: GPL-2~either Files: linux/freebob/JackFreebobDriver.cpp linux/freebob/JackFreebobDriver.h Copyright: 2001, Paul Davis 2004, Grame 2007, Pieter Palmers License: GPL-2+ Files: common/JackMidiAPI.cpp common/JackMidiPort.cpp common/JackMidiPort.h Copyright: 2004, Ian Esten 2007, Dmitry Baikov License: LGPL-2.1+ Files: common/jack/jack.h common/jack/transport.h common/jack/types.h Copyright: 2001, Paul Davis 2002, Paul Davis 2003-2004, Jack O'Quin License: LGPL-2.1+ Files: debian/patches/waf.patch Copyright: 2005-2011, Thomas Nagy License: BSD-3-clause Files: windows/JackRouter/JackRouter.cpp windows/JackRouter/JackRouter.h Copyright: 2006-2011, Grame License: Expat Files: windows/portaudio/pa_asio.h windows/portaudio/portaudio.h Copyright: 1999-2002, Ross Bencina and Phil Burk License: Expat~modrequest Files: dbus/jackdbus.c dbus/jackdbus.h Copyright: 2007-2008, Juuso Alasuutari 2007-2008, 2010, Nedko Arnaudov 2008, Marc-Olivier Barre License: GPL-2~either Files: common/JackControlAPI.cpp common/JackControlAPI.h Copyright: 2008, Grame 2008, Nedko Arnaudov License: GPL-2 Files: example-clients/metro.c tests/external_metro.cpp Copyright: 2002, Anthony Van Groningen License: GPL-2+ Files: linux/alsa/ice1712.c linux/alsa/ice1712.h Copyright: 2000, Jaroslav Kysela 2002, Anthony Van Groningen License: GPL-2+ Files: linux/alsa/alsa_midi_jackmp.cpp linux/alsa/alsa_seqmidi.c Copyright: 2006-2007, Dmitry S. Baikov License: GPL-2+ Files: common/JackAC3Encoder.cpp common/JackAC3Encoder.h Copyright: 2006, Jesse Chappell (AC3Jack) 2012, Grame License: GPL-2+ Files: solaris/oss/JackOSSAdapter.cpp solaris/oss/JackOSSAdapter.h Copyright: 2008, Grame 2008, RTL License: GPL-2+ Files: solaris/oss/JackOSSDriver.cpp solaris/oss/JackOSSDriver.h Copyright: 2003-2007, Jussi Laako 2008, Grame 2008, RTL License: GPL-2+ Files: example-clients/midiseq.c example-clients/midisine.c Copyright: 2004, Ian Esten License: GPL-2+ Files: example-clients/connect.c example-clients/zombie.c Copyright: 2002, Jeremy Hall License: GPL-2+ Files: linux/alsa/usx2y.c linux/alsa/usx2y.h Copyright: 2001, Paul Davis 2004-2005, Karsten Wiese 2004-2005, Rui Nuno Capela License: GPL-2+ Files: common/netjack_packet.c example-clients/netsource.c Copyright: 2006, Torben Hohn 2008, Marc-Olivier Barre 2008, Pieter Palmers License: GPL-2+ Files: common/JackNetOneDriver.cpp common/JackNetOneDriver.h Copyright: 2008-2011, Torben Horn License: GPL-2+ Files: common/JackPortType.cpp common/JackPortType.h Copyright: 2007, Dmitry Baikov License: LGPL-2.1+ Files: common/JackError.cpp common/JackError.h Copyright: 2001, Paul Davis 2004-2008, Grame 2008, Nedko Arnaudov License: LGPL-2.1+ Files: common/JackMessageBuffer.cpp common/JackMessageBuffer.h Copyright: 2004, Rui Nuno Capela 2004, Steve Harris 2008, Grame 2008, Nedko Arnaudov License: LGPL-2.1+ Files: common/JackEngineProfiling.cpp common/JackEngineProfiling.h Copyright: 2008, Grame 2008, RTL License: LGPL-2.1+ Files: common/jack/intclient.h common/varargs.h Copyright: 2004, Jack O'Quin License: LGPL-2.1+ Files: common/JackSession.h common/jack/session.h Copyright: 2001, Paul Davis 2004, Jack O'Quin 2010, Torben Hohn License: LGPL-2.1+ Files: common/jack/jslist.h linux/alsa/jslist.h Copyright: 2002, Kai Vehmanen License: LGPL-2.1+ Files: common/jack/ringbuffer.h common/ringbuffer.c Copyright: 2000, Paul Davis 2003, Rohan Drape License: LGPL-2.1+ Files: debian/po/fi.po debian/po/sv.po Copyright: 2009 License: GPL-2~jack-audio-connection-kit Comment: FIXME: No copyright holder. Files: common/JackAudioDriver.cpp Copyright: 2001, Paul Davis 2004-2008, Grame License: GPL-2~or Files: windows/Setup/src/gpl_installer.rtf Copyright: 2001, Paul Davis 2004-2011, Grame License: GPL-3+ Files: common/jack/control.h Copyright: 2008, Grame 2008, Nedko Arnaudov License: GPL-2 Files: dbus/list.h Copyright: unknown License: GPL-2 Comment: Licensing header contains the following explanation for copyright holder being unknown: . Linux kernel header adapted for user-mode The 2.6.17-rt1 version was used. . Original copyright holders of this code are unknown, they were not mentioned in the original file. Files: linux/firewire/JackFFADODriver.h Copyright: 2001, Paul Davis 2004, Grame 2007, Pieter Palmers 2012, Adrian Knoth License: GPL-2+ Files: example-clients/internal_metro.cpp Copyright: 2002, Anthony Van Groningen 2005, Grame License: GPL-2+ Files: linux/alsa/hdsp.c Copyright: 2001, Paul Davis 2002, Dave LaRose License: GPL-2+ Files: linux/firewire/JackFFADODriver.cpp Copyright: 2001, Paul Davis 2004, Grame 2007, Pieter Palmers 2009, Devin Anderson 2012, Adrian Knoth 2012, Jonathan Woithe License: GPL-2+ Files: linux/firewire/ffado_driver.h Copyright: 2005-2007, Pieter Palmers 2009, Devin Anderson License: GPL-2+ Files: windows/samplerate.h Copyright: 2002-2008, Erik de Castro Lopo License: GPL-2+ Files: debian/patches/alsa-portnames.patch Copyright: 2010, Florian Faber License: GPL-2+ Files: tests/iodelay.cpp Copyright: 2003-2008, Fons Adriaensen License: GPL-2+ Files: common/Jackdmp.cpp Copyright: 2001-2005, Paul Davis 2004-2012, Grame License: GPL-2+ Files: tests/cpu.c Copyright: 2005, Samuel TRACOL 2008, Grame License: GPL-2+ Files: example-clients/capture_client.c Copyright: 2001, Paul Davis 2003, Jack O'Quin License: GPL-2+ Files: common/netjack.c Copyright: 2001, Paul Davis 2003, Robert Ham 2006, Torben Hohn 2008, Pieter Palmers License: GPL-2+ Files: linux/freebob/freebob_driver.h Copyright: 2005-2007, Pieter Palmers License: GPL-2+ Files: common/netjack.h Copyright: 2003, Robert Ham 2005, Torben Hohn License: GPL-2+ Files: tests/test.cpp Copyright: 2005, Samuel TRACOL License: GPL-2+ Files: example-clients/impulse_grabber.c Copyright: 2001, Steve Harris License: GPL-2+ Files: common/netjack_packet.h example-clients/session_notify.c Copyright: 2006, Torben Hohn License: GPL-2+ Files: macosx/JackMachThread.h Copyright: 2001, Paul Davis 2002, Apple Computer, Inc. 2004-2008, Grame License: LGPL-2.1+ Files: common/driver_interface.h Copyright: 2003, Bob Ham 2008, Nedko Arnaudov License: LGPL-2.1+ Files: windows/JackWinServerLaunch.cpp Copyright: 2001-2003, Paul Davis 2004-2008, Grame 2011, John Emmas License: LGPL-2.1+ Files: linux/JackLinuxTime.c Copyright: 2001-2003, Paul Davis 2004-2008, Grame 2005, Jussi Laako License: LGPL-2.1+ Files: common/JackWeakAPI.c Copyright: 2002-2007, Werner Schweer and others 2009, Grame License: LGPL-2.1+ Comment: FIXME: List explicitly who those others are. Files: common/jack/midiport.h Copyright: 2004, Ian Esten License: LGPL-2.1+ Files: common/jack/statistics.h Copyright: 2004, Lee Revell 2004, Rui Nuno Capela License: LGPL-2.1+ Files: dbus/sigsegv.c Copyright: 2005-2008, Jaco Kroon License: public-domain~Kroon This code is in the public domain. Use it as you see fit, some credit would be appreciated, but is not a prerequisite for usage. Feedback on it's use would encourage further development and maintenance. Comment: FIXME: Public domain statement and copyright claim are arguably incompatible. Files: debian/po/gl.po Copyright: 2009, Debian License: GPL-2~jack-audio-connection-kit Comment: FIXME: Debian cannot legally be copyright holder. Files: debian/po/fr.po Copyright: 2009, Debian French l10n team License: GPL-2~jack-audio-connection-kit Files: debian/po/ja.po Copyright: 2009, Debian Multimedia Maintainers License: GPL-2~jack-audio-connection-kit Files: debian/po/vi.po Copyright: 2009, Free Software Foundation, Inc License: None FIXME Files: debian/po/de.po Copyright: 2009, Helge Kreutzmann License: GPL-2~jack-audio-connection-kit Files: debian/po/es.po Copyright: 2009, Software in the Public Interest License: GPL-2~jack-audio-connection-kit Files: debian/po/it.po Copyright: 2009, THE JACK-AUDIO-CONNECTION-KIT'S HOLDER License: GPL-2~jack-audio-connection-kit Comment: FIXME: Bogus copyright holder. Files: debian/po/nl.po Copyright: 2011, THE PACKAGE'S HOLDER License: GPL-2~jackd2 Comment: FIXME: Bogus copyright holder. Files: debian/po/pt_BR.po Copyright: 2010, THE jackd2'S HOLDER License: GPL-2~jackd2 Comment: FIXME: Bogus copyright holder. Files: debian/po/pt.po Copyright: 2009, the jack-audio-connection-kit's holder License: GPL-2~jack-audio-connection-kit Comment: FIXME: Bogus copyright holder. Files: debian/po/da.po Copyright: 2011, jackd2 2011, Joe Hansen License: GPL-2~jackd2 Comment: FIXME: jackd2 cannot legally be copyright holder. License: LGPL-2.1+ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. . This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. . Comment: . On Debian systems the 'GNU Lesser General Public License' version 2.1 is located in '/usr/share/common-licenses/LGPL-2.1'. . You should have received a copy of the 'GNU Lesser General Public License' along with this program. If not, see . License: GPL-2+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . Comment: . On Debian systems the 'GNU General Public License' version 2 is located in '/usr/share/common-licenses/GPL-2'. . You should have received a copy of the 'GNU General Public License' along with this program. If not, see . License: GPL-2 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. License: GPL-2~either This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. License: GPL-2~or This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the (at your option) any later version. . GNU General Public License for more details. License: GPL-3+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . Comment: . On Debian systems the 'GNU General Public License version 3 is located in '/usr/share/common-licenses/GPL-3'. License: GPL-2~jackd2 This file is distributed under the same license as the jackd2 package. Comment: jackd2 has multiple differently licensed parts, only the most restrictive being listed here. License: GPL-2~jack-audio-connection-kit This file is distributed under the same license as the jack-audio-connection-kit package. Comment: jack-audio-connection-kit has multiple differently licensed parts, only the most restrictive being listed here. . TODO: Request relicensing to be tied to this package. License: Expat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License: Expat~modrequest Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License: BSD-3-clause 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. debian/libjack0.symbols0000644000000000000000000000026412115643311012256 0ustar libjack.so.0 libjack0 #MINVER# #include "symbols-common" #include "symbols-libjack" libjackserver.so.0 libjack0 #MINVER# #include "symbols-common" #include "symbols-libjackserver" debian/symbols-libjackserver.in0000644000000000000000000001726012115643311014035 0ustar jack_acquire_real_time_scheduling@Base __ABI__ jack_activate@Base __ABI__ jack_client_close@Base __ABI__ jack_client_create_thread@Base __ABI__ jack_client_max_real_time_priority@Base __ABI__ jack_client_name_size@Base __ABI__ jack_client_new@Base __ABI__ jack_client_open@Base __ABI__ jack_client_real_time_priority@Base __ABI__ jack_client_thread_id@Base __ABI__ jack_connect@Base __ABI__ jack_cpu_load@Base __ABI__ jack_cycle_signal@Base __ABI__ jack_cycle_wait@Base __ABI__ jack_deactivate@Base __ABI__ jack_disconnect@Base __ABI__ jack_drop_real_time_scheduling@Base __ABI__ jack_engine_takeover_timebase@Base __ABI__ jack_frames_since_cycle_start@Base __ABI__ jack_frames_to_time@Base __ABI__ jack_frame_time@Base __ABI__ jack_get_buffer_size@Base __ABI__ jack_get_client_name@Base __ABI__ jack_get_current_transport_frame@Base __ABI__ jack_get_internal_client_name@Base __ABI__ jack_get_max_delayed_usecs@Base __ABI__ jack_get_ports@Base __ABI__ jack_get_sample_rate@Base __ABI__ jack_get_time@Base __ABI__ jack_get_transport_info@Base __ABI__ jack_get_xrun_delayed_usecs@Base __ABI__ jack_info@Base __ABI__ jack_internal_client_close@Base __ABI__ jack_internal_client_handle@Base __ABI__ jack_internal_client_load_aux@Base __ABI__ jack_internal_client_load@Base __ABI__ jack_internal_client_new@Base __ABI__ jack_internal_client_unload@Base __ABI__ jack_is_realtime@Base __ABI__ jack_last_frame_time@Base __ABI__ jack_midi_clear_buffer@Base __ABI__ jack_midi_event_get@Base __ABI__ jack_midi_event_reserve@Base __ABI__ jack_midi_event_write@Base __ABI__ jack_midi_get_event_count@Base __ABI__ jack_midi_get_lost_event_count@Base __ABI__ jack_midi_max_event_size@Base __ABI__ jack_on_shutdown@Base __ABI__ jack_port_by_id@Base __ABI__ jack_port_by_name@Base __ABI__ jack_port_connected@Base __ABI__ jack_port_connected_to@Base __ABI__ jack_port_disconnect@Base __ABI__ jack_port_ensure_monitor@Base __ABI__ jack_port_flags@Base __ABI__ jack_port_get_aliases@Base __ABI__ jack_port_get_all_connections@Base __ABI__ jack_port_get_buffer@Base __ABI__ jack_port_get_connections@Base __ABI__ jack_port_get_latency@Base __ABI__ jack_port_get_total_latency@Base __ABI__ jack_port_is_mine@Base __ABI__ jack_port_monitoring_input@Base __ABI__ jack_port_name@Base __ABI__ jack_port_name_size@Base __ABI__ jack_port_register@Base __ABI__ jack_port_request_monitor@Base __ABI__ jack_port_request_monitor_by_name@Base __ABI__ jack_port_set_alias@Base __ABI__ jack_port_set_latency@Base __ABI__ jack_port_set_name@Base __ABI__ jack_port_short_name@Base __ABI__ jack_port_tie@Base __ABI__ jack_port_type@Base __ABI__ jack_port_type_size@Base __ABI__ jack_port_unregister@Base __ABI__ jack_port_unset_alias@Base __ABI__ jack_port_untie@Base __ABI__ jack_recompute_total_latencies@Base __ABI__ jack_recompute_total_latency@Base __ABI__ jack_release_timebase@Base __ABI__ jack_reset_max_delayed_usecs@Base __ABI__ jack_ringbuffer_create@Base __ABI__ jack_ringbuffer_free@Base __ABI__ jack_ringbuffer_get_read_vector@Base __ABI__ jack_ringbuffer_get_write_vector@Base __ABI__ jack_ringbuffer_mlock@Base __ABI__ jack_ringbuffer_peek@Base __ABI__ jack_ringbuffer_read_advance@Base __ABI__ jack_ringbuffer_read@Base __ABI__ jack_ringbuffer_read_space@Base __ABI__ jack_ringbuffer_reset@Base __ABI__ jack_ringbuffer_write_advance@Base __ABI__ jack_ringbuffer_write@Base __ABI__ jack_ringbuffer_write_space@Base __ABI__ jack_set_buffer_size@Base __ABI__ jack_set_buffer_size_callback@Base __ABI__ jack_set_client_registration_callback@Base __ABI__ jack_set_error_function@Base __ABI__ jack_set_freewheel@Base __ABI__ jack_set_freewheel_callback@Base __ABI__ jack_set_graph_order_callback@Base __ABI__ jack_set_info_function@Base __ABI__ jack_set_port_connect_callback@Base __ABI__ jack_set_port_registration_callback@Base __ABI__ jack_set_process_callback@Base __ABI__ jack_set_process_thread@Base __ABI__ jack_set_sample_rate_callback@Base __ABI__ jack_set_sync_callback@Base __ABI__ jack_set_sync_timeout@Base __ABI__ jack_set_thread_creator@Base __ABI__ jack_set_thread_init_callback@Base __ABI__ jack_set_timebase_callback@Base __ABI__ jack_set_transport_info@Base __ABI__ jack_set_xrun_callback@Base __ABI__ jack_thread_wait@Base __ABI__ jack_time_to_frames@Base __ABI__ jack_transport_locate@Base __ABI__ jack_transport_query@Base __ABI__ jack_transport_reposition@Base __ABI__ jack_transport_start@Base __ABI__ jack_transport_stop@Base __ABI__ (optional)clock_source@Base __ABI__ (optional)cpu_type@Base __ABI__ (optional)have_3dnow@Base __ABI__ (optional)have_sse@Base __ABI__ (optional)internal_client_request@Base __ABI__ (optional)jack_check_clients@Base __ABI__ (optional)jack_client_activate@Base __ABI__ (optional)jack_client_create@Base __ABI__ (optional)jack_client_deactivate@Base __ABI__ (optional)jack_client_delete@Base __ABI__ (optional)jack_client_do_deactivate@Base __ABI__ (optional)jack_client_internal_by_id@Base __ABI__ (optional)jack_client_registration_notify@Base __ABI__ (optional)jack_create_driver_client@Base __ABI__ (optional)jack_driver_init@Base __ABI__ (optional)jack_driver_nt_finish@Base __ABI__ (optional)jack_driver_nt_init@Base __ABI__ (optional)jack_driver_unload@Base __ABI__ (optional)jack_dump_configuration@Base __ABI__ (optional)jack_engine_delete@Base __ABI__ (optional)jack_engine_load_driver@Base __ABI__ (optional)jack_engine_new@Base __ABI__ (optional)jack_engine_place_port_buffers@Base __ABI__ (optional)jack_engine_reset_rolling_usecs@Base __ABI__ (optional)jack_free@Base 0.118+svn3796 (optional)jack_get_fifo_fd@Base __ABI__ (optional)jack_get_port_internal_by_name@Base __ABI__ (optional)jack_hpet_init@Base __ABI__ (optional)jack_intclient_handle_request@Base __ABI__ (optional)jack_intclient_load_request@Base __ABI__ (optional)jack_intclient_name_request@Base __ABI__ (optional)jack_intclient_unload_request@Base __ABI__ (optional)jack_mark_client_socket_error@Base __ABI__ (optional)jack_on_info_shutdown@Base 0.118+svn3796 (optional)jack_port_clear_connections@Base __ABI__ (optional)jack_port_registration_notify@Base __ABI__ (optional)jack_port_release@Base __ABI__ (optional)jack_port_set_funcs@Base __ABI__ (optional)jack_remove_clients@Base __ABI__ (optional)jack_set_buffer_size_request@Base __ABI__ (optional)jack_set_sample_rate@Base __ABI__ (optional)jack_sort_graph@Base __ABI__ (optional)jack_timebase_reset@Base __ABI__ (optional)jack_timebase_set@Base __ABI__ (optional)jack_transport_activate@Base __ABI__ (optional)jack_transport_client_exit@Base __ABI__ (optional)jack_transport_client_new@Base __ABI__ (optional)jack_transport_client_reset_sync@Base __ABI__ (optional)jack_transport_client_set_sync@Base __ABI__ (optional)jack_transport_cycle_end@Base __ABI__ (optional)jack_transport_cycle_start@Base __ABI__ (optional)jack_transport_init@Base __ABI__ (optional)jack_transport_set_sync_timeout@Base __ABI__ (optional)sanitycheck@Base __ABI__ (optional)system_available_physical_mem@Base __ABI__ (optional)system_get_username@Base __ABI__ (optional)system_has_audiogroup@Base __ABI__ (optional)system_has_frequencyscaling@Base __ABI__ (optional)system_has_rtprio_limits_conf@Base __ABI__ (optional)system_kernel_version@Base __ABI__ (optional)system_memlock_amount@Base __ABI__ (optional)system_memlock_is_unlimited@Base __ABI__ (optional)system_user_can_rtprio@Base __ABI__ (optional)system_user_in_audiogroup@Base __ABI__ (optional)system_uses_frequencyscaling@Base __ABI__ (optional)x86_3dnow_add2f@Base __ABI__ (optional)x86_3dnow_copyf@Base __ABI__ (optional)x86_sse_add2f@Base __ABI__ (optional)x86_sse_copyf@Base __ABI__ (optional)x86_sse_f2i@Base __ABI__ (optional)x86_sse_i2f@Base __ABI__ debian/libjack-jackd2-dev.README0000644000000000000000000000114112115643311013346 0ustar libjack*-dev: JACK Audio Connection Kit (development files) ----------------------------------------------------------- You'll find the API documentation in the /usr/share/doc/libjack*-dev/HTML directory. The source code of the example clients is not included in the binary packages, please get the source package if you need it (by doing "apt-get source jack-audio-connection-kit", for example). Some (and more user-specific) documentation is also contained in the jackd package. originally, Stefan Schwandter, $Date: 2003/01/07 20:02:48 $ Junichi Uekawa, 2 Mar 2003. Robert Jordens debian/jackd2.templates0000644000000000000000000000156612115643311012251 0ustar # These templates have been reviewed by the debian-l10n-english # team # # If modifications/additions/rewording are needed, please ask # debian-l10n-english@lists.debian.org for advice. # # Even minor modifications require translation updates and such # changes should be coordinated with translators and reviewers. Template: jackd/tweak_rt_limits Type: boolean Default: false _Description: Enable realtime process priority? If you want to run jackd with realtime priorities, the user starting jackd needs realtime permissions. Accept this option to create the file /etc/security/limits.d/audio.conf, granting realtime priority and memlock privileges to the audio group. . Running jackd with realtime priority minimizes latency, but may lead to complete system lock-ups by requesting all the available physical system memory, which is unacceptable in multi-user environments. debian/jackd2.docs0000644000000000000000000000013312115643311011170 0ustar build-tree/jack-audio-connection-kit-*/TODO build-tree/jack-audio-connection-kit-*/AUTHORS debian/changelog0000644000000000000000000013242412230526623011047 0ustar jackd2 (1.9.9.5+20130622git7de15e7a-1ubuntu1) trusty; urgency=low * Build-depend on libffado on any linux architecture. -- Matthias Klose Sat, 19 Oct 2013 18:03:16 +0200 jackd2 (1.9.9.5+20130622git7de15e7a-1) unstable; urgency=low [ Jonas Smedegaard ] * Add README.source emphasizing control.in file as *not* a show-stopper for contributions, referring to wiki page for details. [ Adrian Knoth ] * Don't fail in postinst after skipping debconf dialog (Closes: #688202) * Imported Upstream version 1.9.9.5+20130622git7de15e7a * Recompiling fixes netone backend (Closes: #709550) * Drop no-selfconnect.patch * Drop obsolte DMUA flag * Bump standards version to 3.9.4 -- Adrian Knoth Sat, 22 Jun 2013 12:38:35 +0200 jackd2 (1.9.9.5+20130306git47f3a68c-1) experimental; urgency=low [ upstream ] * New upstream release. [ Jonas Smedegaard ] * Update and improve get-orig-source target: + Update to use github.com URLs in watch file and CDBS hints. + Simplify to strip all *.a, .dll and *.Lib files (i.e. catch *.a files also below windows dir, and skip lower-case *.lib files). + Extend to strip waf file. + Update copyright file Source and Excluded-Files fields. + Add comment in rules file on how to do git snapshots. + Drop obsolete make_tarball.sh script. * Add patch to reapply stripped-from-source waflib as unpacked source and add waf-light. * Build-depend on libopus-dev. * Use anonscm.debian.org for Vcs-Browser field. * Drop pre-squeeze conffile cleanup in preinst. * Tidy bash-completion file: + Use tab indentation. + Strip excess space. * Remove debian/source/local-options: abort-on-upstream-changes and unapply-patches are default in dpkg-source since 1.16.1. * Rewrite copyright file using file format 1.0. + Cover new/changed files, and extend some copyrights. [ Adrian Knoth ] * Imported Upstream version 1.9.9.5+20130306git47f3a68c * Invoke ./waf-light instead of ./waf -- Adrian Knoth Wed, 06 Mar 2013 14:44:55 +0100 jackd2 (1.9.9.5+20130127git15950eb1-1) experimental; urgency=low * Imported Upstream version 1.9.9.5+20130127git15950eb1 * Refresh no-selfconnect.patch -- Adrian Knoth Sun, 27 Jan 2013 13:50:55 +0100 jackd2 (1.9.8~dfsg.4+20121110git67ac4440-1) experimental; urgency=low * Imported Upstream version 1.9.8~dfsg.4+20121110git67ac4440 (Closes: #682792) * Fix FTBFS on ppc64 (Closes: #684470) * Switch to dh_python2 (Closes: #676922) * Refresh no-selfconnect.patch -- Adrian Knoth Sat, 10 Nov 2012 11:01:03 +0100 jackd2 (1.9.8~dfsg.4+20120529git007cdc37-4.1) unstable; urgency=low * Non-maintainer upload. * No longer ship /etc/security/limits.d/audio.conf as a conffile (Closes: #688204) -- Sébastien Villemot Fri, 28 Sep 2012 20:25:20 +0200 jackd2 (1.9.8~dfsg.4+20120529git007cdc37-4) unstable; urgency=low * Only include DBUS files on Linux (Closes: #685776) -- Adrian Knoth Wed, 29 Aug 2012 21:26:01 +0200 jackd2 (1.9.8~dfsg.4+20120529git007cdc37-3) unstable; urgency=low * Fix manpage corruption (Closes: #680159, #672881) -- Adrian Knoth Sat, 11 Aug 2012 12:38:09 +0200 jackd2 (1.9.8~dfsg.4+20120529git007cdc37-2) unstable; urgency=low * Fix syntax error in jack_control (Closes: #675719) -- Adrian Knoth Thu, 02 Aug 2012 22:17:30 +0200 jackd2 (1.9.8~dfsg.4+20120529git007cdc37-1) unstable; urgency=low * Update helper script to replace waf by waf-light * Imported Upstream version 1.9.8~dfsg.4+20120529git007cdc37 * Drop CELT support (Closes: #674652) -- Adrian Knoth Tue, 29 May 2012 22:00:18 +0200 jackd2 (1.9.8~dfsg.3+20120418gitf82ec715-6) unstable; urgency=low * Bump compat to 9 for multiarch * Drop dh_buildinfo dependency * Mark libjack-jackd2-0 as multiarch (Closes: #670608) -- Adrian Knoth Mon, 30 Apr 2012 15:25:53 +0200 jackd2 (1.9.8~dfsg.3+20120418gitf82ec715-4) unstable; urgency=low * Disabled --mixed builds. * Add detection for GNU/Hurd. -- Adrian Knoth Thu, 26 Apr 2012 13:23:50 +0200 jackd2 (1.9.8~dfsg.3+20120418gitf82ec715-3) unstable; urgency=low * Add patch to fix FTBFS on kFreeBSD (Closes: #669566) -- Adrian Knoth Tue, 24 Apr 2012 21:57:15 +0200 jackd2 (1.9.8~dfsg.3+20120418gitf82ec715-1) unstable; urgency=low * New Upstream version (supports FFADO buffersize changes) * Disable hppa build patch * Disable kFreeBSD patch * Refresh hurd.patch * Update no-selfconnect.patch -- Adrian Knoth Wed, 18 Apr 2012 22:29:58 +0200 jackd2 (1.9.8~dfsg.2-1) unstable; urgency=low * Install ALSA raw midi driver on Linux (Closes: #661820) * Reimport tarball because of pristine-tar bug #661902 -- Adrian Knoth Sun, 04 Mar 2012 11:49:15 +0100 jackd2 (1.9.8~dfsg.1-1) unstable; urgency=low * Add patch to fix FTBFS on kFreeBSD (Closes: #651108) * Add Korean debconf translation * Limit jackdbus to Linux platforms * Repackage upstream tarball without binary waf (Closes: #654477) -- Adrian Knoth Wed, 18 Jan 2012 14:27:38 +0100 jackd2 (1.9.8~dfsg-1) unstable; urgency=low * Imported Upstream version 1.9.8~dfsg * Refresh no-selfconnect.patch -- Adrian Knoth Thu, 22 Dec 2011 23:38:24 +0100 jackd2 (1.9.7~dfsg-2) unstable; urgency=low * Update Brazilian Portuguese translation (Closes: #621097) * Add patch to support SH4 architectures (Closes: #622713) * Replace hardcoded architecture list by linux-any (Closes: #634296) * Dutch translation of debconf templates (Closes: #637508) * Danish translation for debconf templates (Closes: #621025) * Sync to upstream VCS r4627 (1.9.8-preview) * Refresh no-selfconnect-patch * Bump standards version (3.9.2) * Use linux-any in the architecture list * Drop mixed 32/64bit builds. Will be replaced by multiarch. -- Adrian Knoth Mon, 05 Dec 2011 16:58:46 +0100 jackd2 (1.9.7~dfsg-1) unstable; urgency=low * New upstream version 1.9.7 (ALSA resume, new latency API) * Build with --mixed on i386 to be compatible with amd64. * Don't patch jack_connect for fast consecutive calls anymore, it's now using the same code as in jackd1 and waits for the port connection to appear. -- Adrian Knoth Thu, 31 Mar 2011 13:54:50 +0200 jackd2 (1.9.6~dfsg.1-5) experimental; urgency=low * Add no-self-connect patch to provide better ladish support. -- Adrian Knoth Sat, 29 Jan 2011 19:00:05 +0100 jackd2 (1.9.6~dfsg.1-4) experimental; urgency=low * Add Brazilian Portuguese translation. * Provide libjack-dev-session * Refresh VCS version to r4104 -- Adrian Knoth Wed, 12 Jan 2011 17:46:58 +0100 jackd2 (1.9.6~dfsg.1-3) experimental; urgency=low * Sync to upstream r4089 * Includes: jack-session support, fixes ALSA suspend/resume and machine lock-up after FFADO crashes -- Adrian Knoth Mon, 22 Nov 2010 19:31:37 +0100 jackd2 (1.9.6~dfsg.1-2) unstable; urgency=low * Strip .DS_Store, an OSX specific folder db. * Remove audio.conf.disabled upon purge (Closes: #603457) -- Adrian Knoth Mon, 15 Nov 2010 15:05:33 +0100 jackd2 (1.9.6~dfsg-1) unstable; urgency=low * New upstream release. [ Adrian Knoth ] * jackrec is now called jack_rec (like in jackd1) * Make libjack-jackd2-dev provide libjack-dev. * Don't suggest libjackasyn0, nobody really uses it. * Depend on python-dbus (Closes: #595520) [ Jonas Smedegaard ] * Unfuzz patches. * Update copyright file: Extend some copyright years. * Extend repackaging of upstream source to strip unneeded and possibly sourceless binary ./macosx/libcelt.a. -- Adrian Knoth Mon, 25 Oct 2010 16:31:10 +0200 jackd2 (1.9.5~dfsg-19) unstable; urgency=low * Fix FTBFS on kFreeBSD and sparc (Closes: #591247) -- Adrian Knoth Sun, 01 Aug 2010 19:54:32 +0200 jackd2 (1.9.5~dfsg-18) unstable; urgency=low * Sync to upstream r4036 (Closes: #582744) -- Adrian Knoth Fri, 30 Jul 2010 17:57:43 +0200 jackd2 (1.9.5~dfsg-17) unstable; urgency=low * Augment sigsegv.c patch to support SH4 CPUs (Closes: #588124) * Make RTPRIO handling more robust (allow users to delete audio.conf) -- Adrian Knoth Tue, 06 Jul 2010 09:40:36 +0200 jackd2 (1.9.5~dfsg-16) experimental; urgency=low * reupload to experimental -- Reinhard Tartler Fri, 25 Jun 2010 22:11:22 +0200 jackd2 (1.9.5~dfsg-15) unstable; urgency=low [ Adrian Knoth ] * Also provide the shlibs file for libjack-jackd2-0 * Fix FTBFS on sparc64 (Closes: #586257) [ Reinhard Tartler ] * jackd must not be a virtual package, use 'jack-daemon' for that * add breaks/replaces on old libjack0 * change shlibsfile to prefer jackd2's libjack * use conflicts instead of breaks. libjack-jackd2-0 has file conflicts with libjack0 and will keep it [ Jonas Smedegaard ] * Update control file. -- Reinhard Tartler Sat, 19 Jun 2010 18:54:29 +0200 jackd2 (1.9.5~dfsg-14) unstable; urgency=low * Rename source package to jackd2 * Don't provide libjack-dev anymore * Don't compile libjack0, use libjack-jackd2-0 instead * Move inprocess clients from libjack0 into jackd2 package * Update to upstream SVN revision 4024 -- Adrian Knoth Thu, 17 Jun 2010 18:20:21 +0200 jack-audio-connection-kit (1.9.5~dfsg-13) unstable; urgency=low * Fix FTBFS on hppa (Closes: #580824) -- Adrian Knoth Sun, 09 May 2010 12:08:12 +0200 jack-audio-connection-kit (1.9.5~dfsg-12) unstable; urgency=low * Add -fvisibility=hidden to build flags. * Fix FTBFS on hurd -- Adrian Knoth Sat, 08 May 2010 16:52:27 +0200 jack-audio-connection-kit (1.9.5~dfsg-11) unstable; urgency=low * Don't use Debian provided waf anymore. (Closes: #580363) * Drop doxygen build dependency. * Update to upstream SVN revision 4008. (uses semaphores on Linux now) -- Adrian Knoth Fri, 07 May 2010 20:06:37 +0200 jack-audio-connection-kit (1.9.5~dfsg-10) unstable; urgency=low * Fix FTBFS on armel (Closes: #580618) -- Adrian Knoth Fri, 07 May 2010 13:54:18 +0200 jack-audio-connection-kit (1.9.5~dfsg-9) unstable; urgency=low * Provide fix for GNU/kFreeBSD (Closes: #579465) * Conditionally include audioadapter.so on ALSA platforms only. -- Adrian Knoth Thu, 06 May 2010 15:58:23 +0200 jack-audio-connection-kit (1.9.5~dfsg-8) unstable; urgency=low * Fix endif placement in ia64/alpha patch. -- Adrian Knoth Wed, 05 May 2010 14:46:20 +0200 jack-audio-connection-kit (1.9.5~dfsg-7) unstable; urgency=low * Update to upstream SVN version 4003 * Dropping local Debian patches, they are included upstream * Add local patch for IA64 and alpha (Closes: #580089) -- Adrian Knoth Wed, 05 May 2010 11:49:30 +0200 jack-audio-connection-kit (1.9.5~dfsg-6) unstable; urgency=low * Fix more varargs issues on armel and alpha -- Adrian Knoth Mon, 03 May 2010 22:50:50 +0200 jack-audio-connection-kit (1.9.5~dfsg-5) unstable; urgency=low * Fix FTBFS on alpha and ia64 (Closes: #580089) * Fix FTBFS on armel (Closes: #580088) -- Adrian Knoth Mon, 03 May 2010 19:16:23 +0200 jack-audio-connection-kit (1.9.5~dfsg-4) unstable; urgency=low * Upgrade to svn version r3995. (Closes: bug#548537) * Fix FTBFS on kFreeBSD (conditionally enable ALSA) (Closes: bug#579465) * Fix FTBFS on powerpc (Closes: bug#579479) * Fix FTBFS caused by missing atomic operations (Closes: #579464) * Remove outdated documentation (Closes: #577444) -- Adrian Knoth Sun, 02 May 2010 21:55:26 +0200 jack-audio-connection-kit (1.9.5~dfsg-3) unstable; urgency=low * Fix restructure configure options to only add --firewire on supported architectures. Closes: bug#579237, thanks to Bastian Blank. * Handle library ABI through generalized packaging variable. * Bump API to 0.118.0 (from 9.116.2): Jackd2 1.9.4 declared compliance this newer version of jackd1, and does not promise backwards compatibility. * Tighten symbols older than API version to instead follow API: Future alternative implementations potentially of older version themselves are not assured to be binary compatible. * Have libjack-dev provide virtual libjack0.100.0-dev (...again - was apparently lost at some point upgrading to jackd2). -- Jonas Smedegaard Mon, 26 Apr 2010 20:41:50 +0200 jack-audio-connection-kit (1.9.5~dfsg-2) unstable; urgency=low * Fix relax shlibs file to libjack0 0.116.2 or newer: library API promised upstream to not have changed since. Closes: bug#579134, thanks to Reinhard Tartler. * Fix rename symbols file to get properly handled by dh_makeshlibs. * Fix tighten symbols file to depend at minimum 0.116.2 (not 0.116.0). * Suppress lintian error about newly added symbols: Any library symbols changing since 0.116.2 supposedly are outside public API. -- Jonas Smedegaard Sun, 25 Apr 2010 20:36:19 +0200 jack-audio-connection-kit (1.9.5~dfsg-1) unstable; urgency=low [ Adrian Knoth ] * New upstream version 1.9.5 * Remove FreeBoB support. Use the FFADO firewire backend instead. * Build against FFADO-2.0.0 * Enable jackdbus * Rename jack_rec to jackrec (as done in jackd1) * Include (updated) manpages from jackd1 [ Jonas Smedegaard ] * Repackage source: + Strip binary code (shared libraries for MacOS X and Windows). + Strip unneeded sources copyright-protected without licence. + Isolate as patch 0000 changes between tarball release and upstream SVN trunk as of revision 3968. * Sync control.in with latest hand-edited changes to control. * Add myself as uploader. * Drop old Vcs-Bzr stanza from control. * Fix tighten libasound-dev build-dependency to at least 1.0.18. * Lower debhelper build-dependency to 6, to ease backporting (we need no newer features anyway). Fix bump debhelper compat level to match build-dependency. * Update patch handling: + Use source format "3.0 (quilt)" (not CDBS simple-patchsys.mk). + Unfuzz. + Refresh, compacting with quilt --no-timestamps --no-index -pab. + Rename with leading number, and add README to source documenting micro naming scheme. + Add DEP3 header to patch 1001 "earlier connect.diff"). + Unpatch as last clean target to please both git-buildpackage and source format 3.0 (quilt). * Update watch file: + Track jackd2 releases. + Handle DFSG mangling. + Add usage hint. * Fix non-unix line-ends in PO files. * Tidy build routines: + Drop install hints automagically handled by CDBS already. + Separate configure from build in rules file. + Avoid unneeded ifeq construct in rules file. + Use single space in multi-line fields of control file. + Mention use of 'waf distclean' when upstream ships cleaned source. + Fix avoid remove man subdir (clash with dpkg unpatch routine). * Drop file user-howto (7 years old, newest version 4 years old, and is apparently included in jackd.1 manpage already). * Use d-shlibs to resolve development library dependencies. Build-depend on d-shlibs. * Stop build-depending on scons (upstream use waf now). * Use system waf. Build-depend on waf. - Strip binary waf file (too risky to blindly invoke, and too much hassle unpacking and inspecting properly). Stop build-depending on python (only used by local waf now dropped). * Recursively-expand a variable and avoid a linewrap in rules file. * Enable waf verbose mode (easing porter work). * Setup get-orig-source routine: + include cdbs snippet upstream-tarball (suppressing its build- dependencies unneeded for normal builds, to ease backporting). + Repackage source, stripping DFSG-violating files. * Rewrite debian/copyright using draft DEP5 rev. 135 format. * Track symbols, but relaxed due to uncertainty on public library ABI. -- Jonas Smedegaard Sun, 25 Apr 2010 16:38:58 +0200 jack-audio-connection-kit (1.9.4+svn3842-2) experimental; urgency=low * Fix a problem with jack_connect using a hard coded JACK client name and when calling jack_connect or jack_disconnect multiple times in a fast sequence, then the subsequent jack_(dis)connect calls fail. -- Free Ekanayaka Sun, 27 Dec 2009 17:30:06 +0100 jack-audio-connection-kit (1.9.4+svn3842-1) experimental; urgency=low * New upstream release -- Adrian Knoth Thu, 19 Nov 2009 15:34:47 +0100 jack-audio-connection-kit (0.118+svn3796-1) unstable; urgency=low [ Jonathan Wiltshire ] * Debconf templates and debian/control reviewed by the debian-l10n- english team as part of the Smith review project. Closes: #550036 * Debconf translation updates: - Swedish (closes: #550493) - Czech (closes: #550499) - Vietnamese (closes: #550563) - Finnish (closes: #550573) - Portugese (closes: #546645, #550574) - Italian (closes: #551924) - Spanish (closes: #551977) - Russian (closes: #552005) - French (closes: #552072) [ Adrian Knoth ] * New upstream release (see NEWS, cmdline args have changed) * Drop versioned build dependency for libreadline. (Closes: #553791) * Remove Guenter Geiger from Uploaders (Closes: #546951) * Build with celt-0.7.0 (Closes: #556821) * Debconf translation updates: - Japanese (Closes: #552230) - German (Closes: #550986) - Galician (Closes: #554228) -- Adrian Knoth Sun, 13 Sep 2009 17:57:19 +0200 jack-audio-connection-kit (0.116.2+svn3592-3) unstable; urgency=low [ Adrian Knoth ] * Include Russian translation (Closes: #539460) * Include Czech translation (Closes: #538955) * Include Italian translation (Closes: #543514) * Actively remove /etc/init.d/jackd (Closes: #538963) * Explain new realtime default in the NEWS file (Closes: #539581) * Move FreeBoB and FFADO drivers to new package jackd-firewire, so users without 1394 devices have fewer dependencies. (Closes: #540891) * Fix FTBFS caused by double-installing the manpages (Closes: #543077) * Fix 24bit little endian problem on BE CPUs (Closes: #486308) -- Adrian Knoth Sun, 02 Aug 2009 20:21:06 +0200 jack-audio-connection-kit (0.116.2+svn3592-2) unstable; urgency=low [ Adrian Knoth ] * Only include alsa_in and alsa_out on Linux kernels. (Closes: #537976) * Remove /etc/init.d/jackd. (Closes: #527642, #528851) * Remove obsolete jackstart manpage (Closes: 491120) * Allow db_input to fail (Closes: #538051) -- Adrian Knoth Wed, 22 Jul 2009 11:19:49 +0200 jack-audio-connection-kit (0.116.2+svn3592-1) unstable; urgency=low [ Adrian Knoth ] * New upstream version 0.116.2+svn3592. Fixes: - segfault in jack_impulse_grabber (Closes: #432208) - jack_connect, jack_disconnect error case (Closes: #465073) - Fix build issues on Hurd (Closes: #320736) * Include updated upstream manpages (Closes: #386466, #521771) * Fix lintian warning about libjack-dev's doc-base * Include new alsa_in and alsa_out binaries * Prompt the user for realtime priority settings (Closes: #507248) * Include armel in dependency arch list (Closes: #460084) * Update upstream location in control files (Closes: #511239) * Enable FFADO firewire audio driver (Closes: #519797) * Remove notes about fetchmail in /etc/init.d/jackd (Closes: #530380) * Fix building jackd twice in a row (Closes: #527335) * Add myself to Uploaders -- Adrian Knoth Mon, 30 Mar 2009 15:56:14 +0200 jack-audio-connection-kit (0.116.1-4) unstable; urgency=low * Bugfix: FTBFS on kFreeBSD (Closes: #510127) * Remove obsolete debian/control.in file * debian/control: Reformat Build-Depends field * remove libcap-dev from Build-Depends and Build-Conflits. It was only useful for 2.4 kernels, that we don't want to support anymore anyways. (Closes: #492628) * Redirect stderr in bash completion (Closes: #504488) (LP: #139995) * use ${binary:Version} / ${source:Version} in debian/control instead of the deprecated ${Source-Version} substvar -- Reinhard Tartler Tue, 24 Feb 2009 23:04:00 +0100 jack-audio-connection-kit (0.116.1-3) unstable; urgency=low * Don't install *.la files in libjack-dev. (Closes: #510673) * Add myself to Uploaders -- Reinhard Tartler Fri, 09 Jan 2009 08:28:07 +0100 jack-audio-connection-kit (0.116.1-2) unstable; urgency=low * Build-Depend on libsamplerate-dev and libcelt-dev (Closes: #509579) * Use su to start jackd from the init script, because start-stop-daemon is not pam-aware and doesn't honor the settings of /etc/security/limits.conf * Maintainer is now pkg-multimedia, set control field accordingly -- Free Ekanayaka Wed, 24 Dec 2008 16:49:34 +0000 jack-audio-connection-kit (0.116.1-1) unstable; urgency=low [ Asheesh Laroia ] * 11_fix_varargs_to_fix_ftbfs_on_alpha.patch: Add patch to fix alpha build failure by using var args correctly (earlier versions of Jack improperly passed the va_list around). The issue is fixed in upstream svn r3205. (Closes: #508114) [ Free Ekanayaka ] * New upstream release -- Free Ekanayaka Mon, 15 Dec 2008 12:11:54 +0100 jack-audio-connection-kit (0.115.6-1) unstable; urgency=low * New Upstream Version * Drop kbsd patch, merged upstream * Not using tarball.mk anymore * Update synopsis-spelling patch * Drop path-max patch, fixed upstream -- Free Ekanayaka Sun, 30 Nov 2008 19:53:26 +0100 jack-audio-connection-kit (0.109.2-4) unstable; urgency=low * Added init script to start jackd at system startup -- Free Ekanayaka Wed, 17 Sep 2008 14:43:18 +0200 jack-audio-connection-kit (0.109.2-3) unstable; urgency=low * Included patches and changelog entry from NMU 0.109.2-1.1 -- Free Ekanayaka Mon, 12 May 2008 21:17:42 +0100 jack-audio-connection-kit (0.109.2-2) unstable; urgency=low * Support DEB_BUILD_OPTIONS=dopot for optmised re-builds -- Free Ekanayaka Mon, 12 May 2008 20:37:38 +0100 jack-audio-connection-kit (0.109.2-1.1) unstable; urgency=low * Non-maintainer upload. * Don't use lib64 and so avoid setting the rpath in other packages (Closes: #430961) * Don't create a debian/tmp/usr/lib/lib64 that points to itself. * There is no need to remove rpath's from binaries anymore so drop the build dependency on chrpath. -- Kurt Roeckx Sat, 15 Mar 2008 11:49:05 +0000 jack-audio-connection-kit (0.109.2-1) unstable; urgency=low * New upstream release -- Free Ekanayaka Thu, 31 Jan 2008 21:25:22 +0000 jack-audio-connection-kit (0.109.0-1) unstable; urgency=low * New upstream release * Conflicts with libjack0.80.0-0, removed reference to the non existing linux-patch-realtime-preempt (Closes: #445528) * Downgraded Recommends jackd to Suggests (Closes: #442814) * Fixed broken chunks in debian/patches/09_kbsd.patch -- Free Ekanayaka Tue, 22 Jan 2008 13:23:13 +0000 jack-audio-connection-kit (0.103.0-6) unstable; urgency=low * debian/jackd.README.Debian: - added note about using PAM to jack grant realtime privileges (Closes: #425180, #269661) - added note about using the realtime-preempt patch * debian/control: - added libpam-modules to Recommends: - moved qjackctl from Suggests: to Recommends: * debian/rules: - pass --enable-static=yes to ./configure (Closes: #425265) - don't enable -m3dnow and -msse on i386 (Closes: #426144) * rebuilt against flac 1.1.4 (Closes: #426648) -- Free Ekanayaka Mon, 28 May 2007 14:13:09 +0200 jack-audio-connection-kit (0.103.0-5) unstable; urgency=low * debian/control: - build-depend on libfreebob0-dev only on Linux systems, to solve FTBFS on GNU/kFreeBSD (closes: #423895) * debian/patches: - added 09_kbsd.patch, thanks to Petr Salinger * debian/rules: - removed enable-capabilities, as it was causing excessive CPU load when using audacity 1.3.0 with jack via portaudio -- Free Ekanayaka Thu, 17 May 2007 02:03:28 +0200 jack-audio-connection-kit (0.103.0-4) unstable; urgency=low * debian/rules: - enable -m3dnow and -msse on i386 and amd64 - include simple-patchsys.mk before tarball.mk (closes: #422588) -- Free Ekanayaka Wed, 9 May 2007 20:36:42 +0200 jack-audio-connection-kit (0.103.0-3.1) unstable; urgency=low * Non-maintainer upload. * Drop i386 specific CFLAGS. (closes: #422289) -- Bastian Blank Mon, 07 May 2007 09:07:23 +0000 jack-audio-connection-kit (0.103.0-3) unstable; urgency=low * We are not depending anymore from automake (see changelog entry for version 0.103.0-1), and now the package builds corretly on a plain etch system (Closes: #328133) * Enable dynsimd only for amd64 (Closes: #422076) -- Free Ekanayaka Fri, 4 May 2007 11:29:00 +0200 jack-audio-connection-kit (0.103.0-2) unstable; urgency=low * Enabled dynsimd -- Free Ekanayaka Tue, 17 Apr 2007 15:58:11 +0200 jack-audio-connection-kit (0.103.0-1) unstable; urgency=low * New upstream release * Drop patches 04_configure_in_jack_version and 02_release-in-libjack-name as suggested by the upstream developers, they will take are of possible ABI changes and add the relevant runtime checks * Drop patch 11_configure.ac, fixed the lib64 path in debian/rules * Drop build-dependency on automake * Rename the library and the headers binary packages to reflect the fact that they are not anymore version-specific, add dummy binary package libjack0.100.0 to provide an upgrade path * Bug fix: "libjack0.100.0-0: 04_configure_in_jack_version.patch makes add-on installation complicated", thanks to Mario Lang (Closes: #353680). * Remove rpath from the binary programs using chrpath * Enabled SSE (see http://ardour.org/node/820) -- Free Ekanayaka Wed, 11 Apr 2007 01:43:06 +0200 jack-audio-connection-kit (0.102.20-1) experimental; urgency=low * New upstream release * Deleted patches 10_freebob.patch and 09_jack-ia64.diff, as they are part of the new upstream * Build-Depend on libfreebob0-dev, thanks to Marcio Roberto Teixeira (Closes: #399246). * Added myself to Uploaders * Updated standards to 3.7.2 -- Free Ekanayaka Mon, 20 Nov 2006 13:50:57 +0100 jack-audio-connection-kit (0.101.1-2) unstable; urgency=low * incorporated patch to fix ia64 atomic operations (closes: #394021) * prepared for freebob support by backporting the freebob driver from jack svn version. -- Guenter Geiger (Debian/GNU) Thu, 19 Oct 2006 12:03:37 +0200 jack-audio-connection-kit (0.101.1-1) unstable; urgency=low * new upstream release + no freebob support since libfreebob is not yet packaged -- Robert Jordens Fri, 21 Apr 2006 20:00:08 +0200 jack-audio-connection-kit (0.100.7-1) unstable; urgency=low * new upstream release -- Robert Jordens Thu, 9 Mar 2006 14:52:35 +0100 jack-audio-connection-kit (0.100.0-5) unstable; urgency=low * debian/bash-completion.d/jackd: updated; see Bug#329806 * dont depend on libglib1.2-dev; closes: Bug#326212 * debian/watch: update -- Robert Jordens Sat, 4 Mar 2006 13:13:20 +0100 jack-audio-connection-kit (0.100.0-4) unstable; urgency=low * debian/bash_completion.d/jackd, debian/jackd.install: closes: #319764 (jackd: bash completion for jack_connect) -- Robert Jordens Wed, 3 Aug 2005 23:23:16 +0200 jack-audio-connection-kit (0.100.0-3) unstable; urgency=low * debian/rules: build with tmpdir=/dev/shm again; closes: Bug#321149 (jackd not using /dev/shm as tmpdir) * debian/patches/07_path-max.patch: closes: Bug#320736 (Patch to handle PATH_MAX-less systems) * debian/patches/08_synopsis-spelling.patch: closes: #311465 ('man jack_bufsize' typo: "SYNOPSYS") * debian/copyright: mention authors as copyright holders and license as license and not as copyright; closes: #290186 (Improper copyright file) -- Robert Jordens Wed, 3 Aug 2005 22:58:01 +0200 jack-audio-connection-kit (0.100.0-2) unstable; urgency=low * upload 0.100.0-1 unchanged to unstable -- Robert Jordens Mon, 27 Jun 2005 15:34:00 +0200 jack-audio-connection-kit (0.100.0-1) experimental; urgency=low * new upstream release * new SONAME again. noone was using that 0.99.61 from experimental and it confuses people. -- Robert Jordens Mon, 13 Jun 2005 20:16:50 +0200 jack-audio-connection-kit (0.99.61-1) experimental; urgency=low * intermediate snapshot release + new jack_client_open() interface requiring a new SONAME: 0.99.61 (although the first incompatible change happened at least in 0.99.14) + debian/patches/04_configure_in_jack_version.patch: updated * debian/FAQ: updated from webpage -- Robert Jordens Sat, 7 May 2005 18:30:20 +0200 jack-audio-connection-kit (0.99.0-6) unstable; urgency=high * do not use the "[system: linux]" stuff for "Depends"; patch from Daniel Schepler ; closes: Bug#295804 * urgency high due to things in 0.99.0-5 * debian/control: build against libreadline5-dev -- Robert Jordens Sun, 20 Feb 2005 22:01:41 +0100 jack-audio-connection-kit (0.99.0-5) unstable; urgency=high * debian/patches/01a_force-copy-autogen.sh.patch: dont make symlinks for config.{guess,sub}; let cdbs play with it; closes: Bug#295284 * urgency high because the bug is present in testing and will surface as soon as the next cdbs gets there * debian/control.in, rules: use cdbs' new crazy mechanism of mangling control; closes: Bug#272307 -- Robert Jordens Mon, 14 Feb 2005 23:32:10 +0100 jack-audio-connection-kit (0.99.0-4) unstable; urgency=low * debian/control.in: added a Recommends: jackd (= ${Source-Version}) to libjack to express the need to install jackd in order to get a working libjack. -- Robert Jordens Tue, 1 Feb 2005 13:22:54 +0100 jack-audio-connection-kit (0.99.0-3) unstable; urgency=low * moved Junichi to Uploaders and me to Maintainer in debian/control. Thanks, Junichi, for your great work reagrding this package! * debian/control.in, debian/rules: added kfreebsd-gnu handling; thanks to Robert Millan ; closes: Bug#272307 * debian/control.in: convert "Depends: jackd" into a two-sided conflicts; closes: Bug#248665 -- Robert Jordens Sun, 30 Jan 2005 21:22:21 +0100 jack-audio-connection-kit (0.99.0-2) unstable; urgency=medium * upload unchanged to unstable; * urgency medium because of important fixes for i586 users (Bug#266975) and NPTL workaround (Bug#266507) -- Robert Jordens Tue, 2 Nov 2004 20:16:51 +0100 jack-audio-connection-kit (0.99.0-1) experimental; urgency=low * new upstream release + works around pthread-create bug in glibc (Bug#266507) + debian/patches/03_remove-cpp-atomicity.patch, debian/patches/07_dont_add_readline_to_LIBS.patch: removed since applied upstream + --disable-iec61883 since it doesn't compile * uplod to experimental to not hinder the other version entering testing * debian/rules: don't optimize for i686 on i386; closes: Bug#266975 -- Robert Jordens Wed, 22 Sep 2004 23:01:39 +0200 jack-audio-connection-kit (0.98.1-5) unstable; urgency=medium * debian/patches/03_remove-cpp-atomicity.patch: use a regular patch for removing the atomicity files for sparc and hppa * debian/patches/07_dont_add_readline_to_LIBS.patch: added; add a noop to prevent linking libjack0.80.0-0 against libreadline4; closes: Bug#260954, Bug#260961; urgency medium because this breaks other packages' builds * correct spelling error in debian/jackd.README.Debian: powerful * debian/watch: added -- Robert Jordens Sat, 31 Jul 2004 17:21:44 +0200 jack-audio-connection-kit (0.98.1-4) unstable; urgency=low * debian/rules: remove atomicity.h for hppa and sparc to work around the FTBS; closes: Bug#256221 for now -- Robert Jordens Wed, 30 Jun 2004 02:20:09 +0200 jack-audio-connection-kit (0.98.1-3) unstable; urgency=low * upload experimental version unchanged to unstable -- Robert Jordens Tue, 15 Jun 2004 01:18:46 +0200 jack-audio-connection-kit (0.98.1-2) experimental; urgency=low * debian/shlibs.local: use ${Source-Version}, thanks to Elimar Riesebieter -- Robert Jordens Sun, 16 May 2004 15:49:20 +0200 jack-audio-connection-kit (0.98.1-1) experimental; urgency=low * new upstream release + fulfills whishes for init.d scripts or other ways of automatically starting jackd if applications need it (analogy to esd); set JACK_START_SERVER in your environment to enable it; closes: Bug#169776 + non-existent function has been removed from the header; closes: Bug#245742 * debian/FAQ: updated from webpage * debian/README.developers: updated from webpage * debian/user-howto: updated from webpage -- Robert Jordens Fri, 7 May 2004 15:24:54 +0200 jack-audio-connection-kit (0.96.2-1) experimental; urgency=low * new upstream snapshot from CVS branch EXP to test new autoconf structure. + also contains new features, does not break binary compatibility + probably won't compile on arm because the generic atomicity.h implementation is broken. * debian/patches/20-check-rc-from-initialize-shm.diff: integrated upstream -- Robert Jordens Wed, 31 Mar 2004 23:44:30 +0200 jack-audio-connection-kit (0.94.0-4) unstable; urgency=low * the "you are never entirely done" release * forgot to update debian/shlibs.local -- Robert Jordens Mon, 1 Mar 2004 01:32:14 +0100 jack-audio-connection-kit (0.94.0-3) unstable; urgency=low * libjack0.80.0-dev should indeed be Section: libdevel. I don't know, where the actual change disapeared. -- Robert Jordens Sun, 29 Feb 2004 01:16:34 +0100 jack-audio-connection-kit (0.94.0-2) unstable; urgency=low * debian/control: libjack0.80.0-dev is Section: libdevel * debian/jackd.README.Debian, debian/rules: + add a lot of documentation and support for setuid jackstart; addresses our part of Bug#229709, which can then be reassigned to wnpp + manpages, FAQ, a user-howto and a extensive README.Debian are there; closes: Bug#148933 + add documentation and support for /dev/shm as tmpdir; needs libc6 >= 2.3.2.ds1-11 because they create and mount the tmpfs; closes: Bug#229374 + added hints to the lowlatency and preempt patches in Debian and to the givertcap patch in AGNULA. + add information and pointers to the realtime LSM * debian/control: + jackd "Suggests: qjackctl, jack-tools, meterbridge, libjackasyn0" which create a sufficient and extended toolkit and environment for jackd + libjack0.80.0-0: Depends: jackd (= ${Source-Version}), for discussion see l.d.o/debian-multimedia * debian/patches/20-check-rc-from-initialize-shm.diff: added; addresses the remaining notes and finally closes: Bug#234072 -- Robert Jordens Sat, 28 Feb 2004 20:00:05 +0100 jack-audio-connection-kit (0.94.0-1) unstable; urgency=low * new upstream release + fixes command-line parsing * rewrote urls as as recommended in RFC 2396, Appendix E * JACK 0.75.0 entered testing; uploading to unstable -- Robert Jordens Tue, 13 Jan 2004 19:57:04 +0100 jack-audio-connection-kit (0.91.1-1) experimental; urgency=low * New upstream release + does not break binary compatibility + enable experimental firewire drivers - debian/control: Build-Depends: libraw1394-dev - debian/patches/06_iec61883_headers.patch add files missing from tarball + obsoletes debian/patches/03_cpuinfo_other_archs.patch * debian/FAQ: updated from webpage * debian/libjack0.80.0-dev.install: don't install *.la files for jack plugins * debian/shlibs.local: added: remove duplicate depends on libjack for jackd * debian/jack_freewheel.1, debian/jack_bufsize.1: wrote manpages -- Robert Jordens Tue, 30 Dec 2003 19:51:04 +0100 jack-audio-connection-kit (0.80.0-1) experimental; urgency=low * new upstream release; binary compatibility mostly remains, source compatibility breaks, chose the new soname; upload to experimental * debian/patches/03_cycles-h-other-archs.patch: partially integrated upstream * debian/patches/03_cpuinfo_other_archs.patch: parses cpuinfo on other architectures by Junichi Uekawa; closes: #207435 * debian/control: changed rjo@gmx.de to jordens@debian.org -- Robert Jordens Tue, 2 Sep 2003 22:18:01 +0200 jack-audio-connection-kit (0.75.0-2) unstable; urgency=low * Add replaces libjack0.71.2-0 (<< 0.75.0-1), due to moved 'development binaries for plugins'. (closes: #207731) * Standards-Version: 3.6.1 -- Junichi Uekawa Fri, 29 Aug 2003 18:01:26 +0900 jack-audio-connection-kit (0.75.0-1) unstable; urgency=low * new upstream release * debian/rules: switched to cdbs + tarball.mk: great way to ensure the autotools horror doesn't pollute the diff + simple-patchsys.mk: works great with the dpatches renamed. + debian/rules: builds optimized for i386: closes: #202589 have a nonoptimized version with DEB_BUILD_OPTIONS=noopt as per policy * debian/control: + use dh-buildinfo + new comaintainers Guenter Geiger and Robert Jordens + Standards-Version: 3.6.0: no changes + won't change the package name (and release of libjack) again because binary compatibility didn't break. JACK_API_CURRENT will be set to 1 as soon as the new era of binary compatibility starts upstream. Then libjack0.71.2 will be named libjack1. closes: #205552 + Build-Depends: libreadline4-dev to build jack_transport * debian/lib*.install: moved the jack plugins' development versions to libjack0.71.2-dev * debian/libjack0.71.2-dev.docs: added README.developers to libjack0.71.2-dev and ship it as a file, not as a patch * debian/FAQ: updated from webpage * 03_cycles-h-other-archs.patch: updated with code from the kernel headers that works well for ardour, thus reducing the number of archs where the workaround is used to: arm, sparc, m68k * debian/jack_load.1, debian/jack_unload.1, debian/jack_transport.1, debian/jack_monitor_client.1, debian/jack_simple_client.1: wrote the missing manpages. * debian/user-howto: added to jackd documentation and updated from webpage -- Robert Jordens Fri, 22 Aug 2003 11:00:45 +0200 jack-audio-connection-kit (0.71.2-1) unstable; urgency=low * New upstream release * Update patches: 04_configure_in_jack_version: update for 0.71.2 02_version-soname: update. * debian/*: manually edit for 0.71.2 debian/jackd.manpages: use upstream manpages for jackd and jackstart * add rules to build jack_md5.h before jackstart * FAQ update rules fixed to add changelog entry * build in a subdir * debian/FAQ: updated from webpage * debian/rules: use patch-stamp instead of patch * [05_jack_md5h.dpatch] fix jack_md5.h dependency * run autoconf2.5/automake1.7 over source -- Junichi Uekawa Wed, 21 May 2003 00:12:08 +0900 jack-audio-connection-kit (0.50.0-2) UNRELEASED; urgency=low * Use dpatch to manage patches. 01_readme-developers 02_version-soname 03_cycles-h 04_configure_in_jack_version - autoconf/automake needs to be re-ran after applying those patches, added a rule to do that to debian/rules (auto-run) * debian/rules: fix to properly handle autoconf 2.57-generated configure, instead of 2.13 -- Junichi Uekawa Mon, 7 Apr 2003 20:55:59 +0900 jack-audio-connection-kit (0.50.0-1) unstable; urgency=low * New upstream release, new maintainer. * Use DESTDIR instead of prefix= in install target. * Misc updating, forward-porting of patches, etc. * I am keeping the soname convention as it is, since upstream is still not decided on a stable interface. * re-run aclocal/autoconf/automake. * use w3m instead of lynx to get the FAQ -- Junichi Uekawa Sun, 2 Mar 2003 17:49:15 +0900 jack-audio-connection-kit (0.44.0-1) unstable; urgency=low * New upstream release (CVS) * Re-add some missing binaries and manpages that got lost somehow. -- Stefan Schwandter Tue, 7 Jan 2003 18:25:28 +0100 jack-audio-connection-kit (0.40.1-1) unstable; urgency=low * New upstream release (CVS) * Keep library versioning based on package version although upstream doesn't anymore, as long as different "releases" (CVS snapshots actually) aren't guaranteed to be binary compatible. * JACK now doesn't depend on glib anymore (closes: #154773). -- Stefan Schwandter Sat, 30 Nov 2002 14:42:59 +0100 jack-audio-connection-kit (0.38.0-1) unstable; urgency=low * New upstream release (CVS). -- Stefan Schwandter Fri, 20 Sep 2002 19:20:20 +0200 jack-audio-connection-kit (0.37.2-1) unstable; urgency=low * New upstream release (CVS). As there doesn't seem to be a release in sight, and cvs has been on it's current status for a while i decided to switch to the cvs version. Unfortunately this means recompiling for packages depending on libjack again... * Ship a changelog generated by cvs2cl from the upstream sources. Upstream doesn't unfortunately. -- Stefan Schwandter Mon, 16 Sep 2002 09:14:51 +0200 jack-audio-connection-kit (0.34.0-6) unstable; urgency=low * Added patch for jackrec to build with libsndfile1. * debian/control: build-dep on libsndfile1-dev -- Stefan Schwandter Thu, 5 Sep 2002 15:04:24 +0200 jack-audio-connection-kit (0.34.0-5) unstable; urgency=low * Change address in debian/control as well... -- Stefan Schwandter Wed, 4 Sep 2002 09:58:54 +0200 jack-audio-connection-kit (0.34.0-4) unstable; urgency=low * New maintainer email address * Applied patch by Junichi Uekawa to remove the unconditional error from cycles.h to hopefully enable build on more architectures (closes: #148699). -- Stefan Schwandter Wed, 4 Sep 2002 09:29:14 +0200 jack-audio-connection-kit (0.34.0-3) unstable; urgency=low * Small manpage updates * Added ALSA-related URLs to debian/asound.rc * Renamed libjack0 to libjack0.34.0-0 and relaxed shlibs dependency (closes: #149687) * Removed jack_alsa from shlibs file * Fixed FAQ line-length * Removed autogen.sh from the diff.gz * debian/rules - Avoid stripping of the jackd binary if DEB_BUILD_OPTIONS=nostrip is set - Made configure a phony target again - Added faq target to fetch the FAQ from the website * libjack0.34.0-dev: added dependency on pkg-config (closes: #150089) * Removed some of the less useful example clients, upstream will do the same in the next release, build-dep on libfltk could be dropped -- Stefan Schwandter Mon, 1 Jul 2002 20:06:27 +0200 jack-audio-connection-kit (0.34.0-2) unstable; urgency=low * Added more documentation (first step to address #148933) - added manpages - added w3m -dump'ed version of the FAQ from the website - added example .asoundrc - remove rather pointless upstream README * Applied patch by Junichi Uekawa to enable build on ppc * Removed maintainer-only rules from debian/rules -- Stefan Schwandter Wed, 5 Jun 2002 10:04:01 +0200 jack-audio-connection-kit (0.34.0-1) unstable; urgency=low * Repackaged from scratch. Thanks to Junichi Uekawa for his previous work on jack packaging and for useful hints how to get my package into a releasable state! (closes: #141450) * New upstream release -- Stefan Schwandter Fri, 24 May 2002 11:00:24 +0200 jack (0.8.0.cvs) unstable; urgency=low * cvs update -- Junichi Uekawa Tue, 5 Feb 2002 22:12:15 +0900 jack (0.6.0.cvs) unstable; urgency=low * CVS Checkout source, packaging it. -- Junichi Uekawa Sun, 23 Dec 2001 17:19:50 +0900 jack (0.4.7-1) unstable; urgency=low * Initial attempt to create a Debian package out of the Sourceforge file release. -- Junichi Uekawa Sun, 23 Dec 2001 17:13:22 +0900 debian/libjack-jackd2-dev.install0000644000000000000000000000007312115643311014062 0ustar usr/include/jack/*.h usr/lib/*/pkgconfig usr/lib/*/lib*.so debian/jackd2.config0000644000000000000000000000022212115643311011504 0ustar #!/bin/sh set -e # Source debconf library. . /usr/share/debconf/confmodule # realtime prio? db_input high jackd/tweak_rt_limits || true db_go debian/jackd2.postinst0000644000000000000000000000120512161271034012124 0ustar #!/bin/sh set -e # Source debconf library. . /usr/share/debconf/confmodule CONFIG_FILE=/etc/security/limits.d/audio.conf # if neither $CONFIG_FILE nor ${CONFIG_FILE}.disabled exists, # let's copy it over from /usr/share/ if [ ! -s ${CONFIG_FILE} ] && [ ! -s ${CONFIG_FILE}.disabled ]; then cp /usr/share/jackd/audio.conf ${CONFIG_FILE}.disabled fi db_get jackd/tweak_rt_limits if [ "x$RET" = "xtrue" ]; then if [ -e ${CONFIG_FILE}.disabled ]; then mv ${CONFIG_FILE}.disabled ${CONFIG_FILE} || true fi else # user doesn't want RT prio if [ -e $CONFIG_FILE ]; then mv $CONFIG_FILE ${CONFIG_FILE}.disabled || true fi fi #DEBHELPER# debian/libjack-jackd2-0.shlibs0000644000000000000000000000007612115643311013264 0ustar libjack 0 libjack-jackd2-0 (>= 1.9.5~dfsg-14) | libjack-0.116 debian/libjack0.lintian-overrides0000644000000000000000000000021212115643311014215 0ustar # Any library symbols changing since 0.116.2 supposedly are outside public API symbols-file-contains-current-version-with-debian-revision debian/jackd2.install0000644000000000000000000000052112115643311011707 0ustar usr/bin/jack* usr/lib/*/libjackserver.so.* usr/lib/*/jack/netmanager.so usr/lib/*/jack/profiler.so usr/lib/*/jack/inprocess.so usr/lib/*/jack/jack_net.so usr/lib/*/jack/jack_loopback.so usr/lib/*/jack/jack_netone.so usr/lib/*/jack/netadapter.so usr/lib/*/jack/jack_dummy.so debian/bash_completion.d etc debian/audio.conf usr/share/jackd debian/po/0000755000000000000000000000000012115643311007601 5ustar debian/po/pt.po0000644000000000000000000000413212115643311010564 0ustar # translation of jack-audio-connection-kit debconf to Portuguese # Copyright (C) 2009 the jack-audio-connection-kit's copyright holder # This file is distributed under the same license as the jack-audio-connection-kit package. # # Américo Monteiro , 2009. msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit 0.116.2+svn3592-4\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-11 10:52+0100\n" "Last-Translator: Américo Monteiro \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Activar prioridade do processo em tempo real?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Se deseja correr o jackd com prioridades de tempo real, o utilizador que " "arrancar o jackd precisa ter permissões de tempo real. Aceite esta opção " "para criar o ficheiro /etc/security/limits.d/audio.conf. garantindo " "prioridade de tempo real e privilégios memlock ao grupo audio." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Correr o jackd com prioridade de tempo real minimiza a latência, mas pode " "levar a paragens completas do sistema ao requisitar toda a memória física " "disponível do sistema, o que é inaceitável em ambientes de multi-utilizador." debian/po/sv.po0000644000000000000000000000377712115643311010607 0ustar # translation of jack-audio-connection-kit_sv.po to Swedish # Copyright (C) 2009 # This file is distributed under the same license as the jack-audio-connection-kit package. # # Martin Ågren , 2009. msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit_sv\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-10 18:08+0200\n" "Last-Translator: Martin Ågren \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Aktivera realtidsprocessprioritet?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Om du vill köra jackd med realtidsprioriteter, behöver den användare som " "startar jackd realtidsrättigheter. Acceptera detta val för att skapa filen /" "etc/security/limits.d/audio.conf, vilket ger realtidsprioritet och " "memlockrättigheter till audiogruppen." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Om jackd körs med realtidsprioritet minimeras latensen, men det kan leda " "till att systemet låser sig fullständigt genom att efterfråga allt " "tillgängligt fysiskt systemminne, vilket är oacceptabelt i en " "fleranvändarmiljö." debian/po/pt_BR.po0000644000000000000000000000377212115643311011160 0ustar # Debconf translations for jackd2. # Copyright (C) 2010 THE jackd2'S COPYRIGHT HOLDER # This file is distributed under the same license as the jackd2 package. # Adriano Rafael Gomes , 2010. # msgid "" msgstr "" "Project-Id-Version: jackd2 1.9.6~dfsg.1-2\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2010-12-12 19:16-0200\n" "Last-Translator: Adriano Rafael Gomes \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "pt_BR utf-8\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Habilitar prioridade de processo em tempo real?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Se você quiser executar o jackd com prioridades de tempo real, o usuário que " "for iniciar o jackd precisa ter permissões de tempo real. Aceite esta opção " "para criar o arquivo /etc/security/limits.d/audio.conf, concedendo " "prioridade de tempo real e privilégios de memlock para o grupo audio." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Executar o jackd com prioridade de tempo real minimiza a latência, mas pode " "levar a travamentos completos do sistema por requisitar toda a memória " "física disponível do sistema, o que é inaceitável em ambientes multi-usuário." debian/po/nl.po0000644000000000000000000000401012115643311010545 0ustar # Dutch translation of jackd2 debconf templates. # Copyright (C) 2011 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the jackd2 package. # Jeroen Schot , 2011. # msgid "" msgstr "" "Project-Id-Version: jackd2 1.9.7~dfsg-1\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2011-07-22 10:11+0200\n" "Last-Translator: Jeroen Schot \n" "Language-Team: Debian l10n Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Realtime procesprioriteit activeren?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Als u wilt dat jackd wordt uitgevoerd met \"realtime\" prioriteit, dan heeft " "de gebruiker die jackd start realtime-privileges nodig. Als u deze optie " "accepteert wordt het bestand /etc/security/limits.d/audio.conf aangemaakt. " "Hiermee worden de realtime prioriteit- en memlock-privileges aan de groep " "\"audio\" toegekend." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Het uitvoeren van jackd met realtime prioriteit minimaliseert vertragingen, " "maar kan er voor zorgen dat het systeem vastloopt wanneer deze het volledige " "fysieke geheugen opvraagt. Dit is onaanvaardbaar op systemen waar meerdere " "gebruikers tegelijk werken." debian/po/it.po0000644000000000000000000000375612115643311010570 0ustar # Italian translation of jack-audio-connection-kit. # COPYRIGHT (C) 2009 THE JACK-AUDIO-CONNECTION-KIT'S COPYRIGHT HOLDER # This file is distributed under the same license as the jack-audio-connection-kit package. # Luca Monducci , 2009. # msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit 0.116.2+svn3592 debconf " "templates\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-21 21:31+0200\n" "Last-Translator: Luca Monducci \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Attivare la priorità realtime del processo?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Per eseguire jackd con le priorità realtime, l'utente che avvia jackd " "necessita dei permessi realtime. Accettando verrà creato il file /etc/" "security/limits.conf, che garantirà i privilegi di priorità realtime e di " "memlock al gruppo audio." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "L'esecuzione di jackd con priorità in realtime minimizza la latenza, ma " "potrebbe comportare dei blocchi del sistema dovuti alla richiesta di tutta " "la memoria fisica disponibile sul sistema, inaccettabile in ambienti multi-" "utente." debian/po/es.po0000644000000000000000000000546612115643311010563 0ustar # jack-audio-connection-kit po-debconf translation to Spanish # Copyright (C) 2009 Software in the Public Interest # This file is distributed under the same license as the jack-audio-connection-kit package. # # Changes: # - Initial translation # Francisco Javier Cuadrado , 2009 # # Traductores, si no conocen el formato PO, merece la pena leer la # documentación de gettext, especialmente las secciones dedicadas a este # formato, por ejemplo ejecutando: # info -n '(gettext)PO Files' # info -n '(gettext)Header Entry' # # Equipo de traducción al español, por favor, lean antes de traducir # los siguientes documentos: # # - El proyecto de traducción de Debian al español # http://www.debian.org/intl/spanish/ # especialmente las notas de traducción en # http://www.debian.org/intl/spanish/notas # # - La guía de traducción de po's de debconf: # /usr/share/doc/po-debconf/README-trans # o http://www.debian.org/intl/l10n/po-debconf/README-trans # msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit 0.116.2+svn3592-4\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-10 18:00+0200\n" "Last-Translator: Francisco Javier Cuadrado \n" "Language-Team: Debian l10n Spanish \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "¿Desea habilitar la prioridad en tiempo real del proceso?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Si quiere ejecutar jackd con prioridades en tiempo real, el usuario que " "ejecute jackd necesita tener permisos para dicha prioridad. Acepte esta " "opción para crear el archivo «/etc/security/limits.d/audio.conf», para " "permitir la prioridad en tiempo real y los privilegios de «memlock» al grupo " "audio." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Ejecutar jackd con la prioridad en tiempo real reduce la latencia, pero " "puede llevar a un bloqueo completo del sistema al pedir toda la memoria " "física disponible del sistema, lo que es inaceptable en entornos " "multiusuario." debian/po/POTFILES.in0000644000000000000000000000005412115643311011355 0ustar [type: gettext/rfc822deb] jackd2.templates debian/po/vi.po0000644000000000000000000000435312115643311010564 0ustar # Vietnamese translation for Jack Audio Conection Kit. # Copyright © 2009 Free Software Foundation, Inc. # Clytie Siddall , 2009. # msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit 0.116.2+svn3592-4\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-11 17:37+1030\n" "Last-Translator: Clytie Siddall \n" "Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: LocFactoryEditor 1.8\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Bật mức ưu tiên tiến trình thời gian thực ?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Nếu bạn muốn chạy trình nền jackd ở mức ưu tiên thời gian thực thì người " "dùng khởi chạy jackd cần có quyền truy cập thời gian thực. Hiệu lực tuỳ chọn " "này để tạo tập tin cấu hình « /etc/security/limits.d/audio.conf » mà cấp cho " "nhóm « audio » (âm thânh) quyền truy cập thời gian thực đối với mức ưu tiên " "và khoá bộ nhớ." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Chạy trình nền jackd ở mức ưu tiên thời gian thực thì giảm sự âm ỷ, nhưng mà " "cũng có thể dẫn tới toàn bộ hệ thống đang treo cứng do yêu cầu tất cả các bộ " "nhớ hệ thống vật lý sẵn sàng, một trường hợp không thể chấp nhận được trong " "môi trường đa người dùng." debian/po/ru.po0000644000000000000000000000507112115643311010572 0ustar # translation of ru.po to Russian # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Yuri Kozlov , 2009. msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit 0.116.2+svn3592-4\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-11 09:40+0400\n" "Last-Translator: Yuri Kozlov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Использовать приоритет реального времени в работе?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Если вы хотите, чтобы jackd выполнялся с приоритетом реального времени, то " "пользователю, запускающему jackd, нужны права на работу с приоритетом " "реального времени. Если ответить утвердительно, то будет создан файл /etc/" "security/limits.d/audio.conf, предоставляющий приоритет реального времени " "memlock для группы audio." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Работа jackd с приоритетом реального времени сократит задержку, но может " "привести к полной блокировке системы, запрашивая всю доступную физическую " "системную память, что неприемлемо в многопользовательских системах." debian/po/gl.po0000644000000000000000000000367612115643311010557 0ustar # Copyright (C) 2009 Debian # This file is distributed under the same license as the jack-audio-connection-kit package. # # Marce Villarino , 2009. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-11-03 21:17+0100\n" "Last-Translator: Marce Villarino \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Desexa activar a prioridade de tempo real?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Se desexa executar jackd con prioridades de tempo real o usuario que inicie " "jackd precisa ter permisos para tempo real. Escolle esta opción para crear o " "ficheiro /etc/security/limits.d/audio.conf, que lle concederá a prioridade " "para tempo real e privilexios de bloqueo de memoria para o grupo de son." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Executa jackd con prioridade de tempo real minimiza a latencia pero pode " "causar bloqueos completos do sistema se pide toda a memoria física " "dispoñíbel no sistema, o que non é admisíbel en ambientes multiusuario." debian/po/fi.po0000644000000000000000000000377012115643311010546 0ustar # Copyright (C) 2009 # This file is distributed under the same license as the jack-audio-connection-kit package. # # Esko Arajärvi , 2009. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-11 12:23+0300\n" "Last-Translator: Esko Arajärvi \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Asetetaanko prosessi ajettavaksi reaaliaikaisella prioriteetilla?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Ohjelman jackd ajaminen reaaliaikaisella prioriteetilla vaatii, että sen " "käynnistäjällä on tähän vaadittavat oikeudet. Tämän vaihtoehdon valitseminen " "luo tiedoston /etc/security/limits.d/audio.conf, jossa ryhmälle ”audio” " "annetaan oikeudet reaaliaikaisen prioriteetin ja memlockin käyttöön." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Ohjelman jackd ajaminen reaaliaikaisella prioriteetilla minimoi latenssin, " "mutta voi aiheuttaa järjestelmän täydellisen lukkiutumisen vaatimalla " "järjestelmän kaiken fyysisen muistin, mikä ei ole hyväksyttävää monen " "käyttäjän ympäristössä." debian/po/ja.po0000644000000000000000000000430312115643311010533 0ustar # Copyright (C) 2009 Debian Multimedia Maintainers # This file is distributed under the same license as jack-audio-connection-kit package. # Hideki Yamane (Debian-JP) , 2009. # msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit 0.116.2+svn3592-3\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-14 17:32+0900\n" "Last-Translator: Hideki Yamane (Debian-JP) \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "リアルタイム実行優先度の設定を有効にしますか?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "jackd をリアルタイム優先度で動作させたい場合、jackd を起動したユーザはリアル" "タイム動作をさせられるパーミッションが必要です。このオプションを選択すると、/" "etc/security/limits.d/audio.conf ファイルを作成し、audio グループに対してリア" "ルタイム優先度と memlock 権限を許可します。" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "レイテンシー (遅延) を抑えて jackd をリアルタイム優先度でに動作させると、シス" "テムの物理メモリを可能な限り要求して完全にシステム停止を引き起こす可能性があ" "ります。これは、マルチユーザ環境では容認出来ません。" debian/po/templates.pot0000644000000000000000000000250512115643311012325 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" debian/po/de.po0000644000000000000000000000377612115643311010546 0ustar # Translation of jack-audio-connection-kit debconf templates to German # Copyright (C) Helge Kreutzmann , 2009. # This file is distributed under the same license as the jack-audio-connection-kit package. # msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit 0.116.2+svn3592-4\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-12 18:42+0200\n" "Last-Translator: Helge Kreutzmann \n" "Language-Team: de \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Echtzeit-Verarbeitungspriorität aktivieren?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Falls Sie Jackd mit Echtzeitpriorität ausführen möchten, benötigt der " "Benutzer, der Jackd startet, die Echtzeit-Rechte. Akzeptieren Sie diese " "Option, um die Datei /etc/security/limits.d/audio.conf zu erstellen und " "damit der Gruppe »audio« Echtzeit- und Memlock-Priorität zu gewähren." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Durch Betrieb von Jackd mit Echtzeitpriorität wird die Latenz minimiert. " "Dies kann aber auch zum kompletten Aufhängen des Systems führen, indem der " "gesamte physische Speicher angefordert wird, was in einer " "Mehrbenutzerumgebung nicht akzeptabel ist." debian/po/ko.po0000644000000000000000000000414012115643311010551 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Jong\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2011-07-01 17:29+0900\n" "Last-Translator: 김종규 \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Korean\n" "X-Poedit-Country: KOREA, REPUBLIC OF\n" "X-Poedit-SourceCharset: utf-8\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "실시간 프로세스 우선 순위를 사용하시겠습니까?" #. Type: boolean #. Description #: ../jackd2.templates:2001 #, fuzzy msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "실시간 우선 순위로 jackd를 실행하려는 경우, jackd를 시작하는 사용자는 실시간 " "권한이 필요합니다. 오디오 그룹에 실시간 우선 순위 및 memlock 권한을 부여하고 " "파일/etc/security/limits.d/audio.conf를 생성하려면 이 옵션을 선택해주세요" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "실시간 우선 순위로 jackd를 실행하는 것은 지연을 최소화합니다. 하지만 가능한 " "모든 실제 시스템 메모리를 요청함으로서 잠금 업 시스템을 완료할 수 있도록 하" "고, 이것은 다중 사용자 환경에서는 허용되지 않습니다. " debian/po/cs.po0000644000000000000000000000525412115643311010554 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the jack-audio-connection-kit package. # Martin Sin , 2009. # msgid "" msgstr "" "Project-Id-Version: jack-audio-connection-kit 0.116.2+svn3592-2\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-10 18:49+0200\n" "Last-Translator: Martin Sin \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Povolit realtimovou prioritu procesu?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Pokud chcete spouštět jackd s realtimovými prioritami, potřebuje uživatel " "který spouští jackd příslušná realtimová oprávnění. Budete-li s tím " "souhlasit, dojde k vytvoření souboru /etc/security/limits.d/audio.conf a " "přiřazení příslušných práv (realtimové priority a memlock) pro skupinu audio." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Spuštění jackd s realtimovou prioritou minimalizuje reakce počítače, ale " "může vést ke kompletnímu zatuhnutí systému způsobenému plným obsazením " "fyzické paměti což je nepřípustné zejména ve více-uživatelských prostředích." #~ msgid "Do you want to enable realtime priorities in /etc/security/limits.d?" #~ msgstr "Chcete povolit realtimové priority v /etc/security/limits.d?" #~ msgid "" #~ "The Debian default is to DISABLE realtime priorities, however, if you " #~ "intend to run jackd with very low latencies, enable this option in order " #~ "to place the approriate settings in /etc/security/limits.d/audio.conf." #~ msgstr "" #~ "Výchozím nastavením v Debianu je ZAKÁZAT realtimové priority, samozřejmě " #~ "pokud chcete spouštět jackd s nízkým reakčním časem, povolte tuto volbu a " #~ "tím budou provedena odpovídající nastavení v /etc/security/limits.d/audio." #~ "conf za vás." debian/po/fr.po0000644000000000000000000000437112115643311010555 0ustar # Translation of jack-audio-connection-kit debconf templates to French # Copyright (C) 2009 Debian French l10n team # This file is distributed under the same license as the jack-audio-connection-kit package. # # Translators: # Christian Perrier , 2009. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2009-10-19 19:16+0200\n" "Last-Translator: Christian Perrier \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Faut-il activer la gestion des priorités de processus en temps réel ?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Si vous voulez exécuter jackd avec des priorités en temps réel, " "l'identifiant qui exécute le démon doit avoir des autorisations " "« realtime ». Vous pouvez choisir cette option pour créer un fichier /etc/" "security/limits.d/audio.conf qui donnera la priorité « realtime » et le " "privilège « memlock » (verrouillage de la mémoire) au groupe « audio »." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Si jackd est exécuté en priorité temps réel, les délais de latence seront " "diminués mais cela peut provoquer un gel complet du système si toute la " "mémoire physique du système est mobilisée, ce qui est difficilement " "acceptable en environnement multi-utilisateurs." debian/po/da.po0000644000000000000000000000356112115643311010532 0ustar # Danish translation jackd2. # Copyright (C) 2011 jackd2 & nedenstående oversættere. # This file is distributed under the same license as the jackd2 package. # Joe Hansen , 2011. # msgid "" msgstr "" "Project-Id-Version: jackd2\n" "Report-Msgid-Bugs-To: jackd2@packages.debian.org\n" "POT-Creation-Date: 2011-12-22 23:36+0100\n" "PO-Revision-Date: 2011-04-03 17:30+01:00\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "Enable realtime process priority?" msgstr "Aktiver realtidsprocesprioritet?" #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "If you want to run jackd with realtime priorities, the user starting jackd " "needs realtime permissions. Accept this option to create the file /etc/" "security/limits.d/audio.conf, granting realtime priority and memlock " "privileges to the audio group." msgstr "" "Hvis du ønsker at køre jackd med realtidsprioriteter, skal brugeren der " "starter jackd have rettigheder for realtid. Accepter denne indstilling for " "at oprette filen /etc/security/limits.d/audio.conf der giver " "realtidsprioritet og memlock-privilegier til lydgruppen." #. Type: boolean #. Description #: ../jackd2.templates:2001 msgid "" "Running jackd with realtime priority minimizes latency, but may lead to " "complete system lock-ups by requesting all the available physical system " "memory, which is unacceptable in multi-user environments." msgstr "" "Kørsel af jackd med realtidsprioritet minimerer latens, men kan føre til " "fuldstændig systemlåsning ved at anmode om al den tilgængelige fysiske " "systemhukommelse, hvilket er uacceptabelt i flerbrugermiljøer." debian/compat0000644000000000000000000000000212115643311010361 0ustar 9 debian/jackd2.postrm0000644000000000000000000000064312115643311011572 0ustar #!/bin/sh set -e CONFIG_FILE=/etc/security/limits.d/audio.conf if [ "$1" = "purge" ]; then for conffile in ${CONFIG_FILE} ${CONFIG_FILE}.disabled; do if [ -e ${conffile} ]; then rm ${conffile} fi done # if we still have debconf, also remove our entries from the DB if [ -e /usr/share/debconf/confmodule ]; then # Source debconf library. . /usr/share/debconf/confmodule db_purge fi fi #DEBHELPER# debian/patches/0000755000000000000000000000000012161277426010625 5ustar debian/patches/alsa-portnames.patch0000644000000000000000000002451412115643311014567 0ustar --- /dev/null +++ b/linux/alsa/port_names.c @@ -0,0 +1,179 @@ +/* -*- mode: c; c-file-style: "linux"; -*- */ +/* + Copyright (C) 2010 Florian Faber, faber@faberman.de + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "alsa_driver.h" + + +static int port_names_load_portfile(alsa_driver_t *driver, const char *filename, char **buf, const unsigned int offset, const unsigned int num) { + int fh, i, ret, lineno, id, res=0; + char line[256]; + + printf("Trying to load portnames from %s\n", filename); + fh = open(filename, O_RDONLY); + if (-1!=fh) { + res = 1; + i = 0; + lineno = 1; + for (;;) { + ret = read(fh, &line[i], 1); + if (0==ret) { + break; + } else if (-1==ret) { + sprintf(stderr, "Error while reading \"%s\": %s", filename, strerror(errno)); + break; + } + if (0x0A==line[i]) { + /* new line, parse input */ + line[i] = 0; + + if ('#' != line[0]) { + i=0; + while ((i<255) && (line[i]!='=')) i++; + if (255==i) { + sprintf(stderr, "Error while reading \"%s\": Line %d has no key=value syntax!", filename, lineno); + } else { + line[i] = 0; + id = atoi(line); + if ((id>=1) && (id<=num)) { + if (NULL==buf[id-1+offset]) { + /* don't overwrite existing names */ + buf[id-1+offset] = strdup(&line[i+1]); + } + } else { + sprintf(stderr, "Error while reading \"%s\": Key %d out of range in line %d (1..%d)", filename, id, lineno, num); + } + } + } + + i = 0; + lineno++; + } else { + i++; + if (i==255) { + sprintf(stderr, "Error while reading \"%s\": Line %d is too long", filename, lineno); + break; + } + } + } + + (void) close(fh); + } + + return res; +} + + +static void port_names_default_portnames(char **buf, const unsigned int offset, const unsigned int num, const char *defaultname) { + unsigned int i; + char line[256]; + + /* Fill in default names */ + for (i=0; iframe_rate > 96000) { + speed="qs"; + } else if (driver->frame_rate > 48000) { + speed="ds"; + } else { + speed="ss"; + } + + snd_ctl_card_info_alloca(&card_info); + err = snd_ctl_card_info(driver->ctl_handle, card_info); + if (err >= 0) { + card_name = snd_ctl_card_info_get_name(card_info); + } else { + card_name = "noname"; + } + + buf = malloc(sizeof(char *)*(driver->capture_nchannels + driver->playback_nchannels)); + if (NULL==buf) { + sprintf(stderr, "ALSA: Not enough memory for %d port names", driver->capture_nchannels + driver->playback_nchannels); + return NULL; + } + bzero(buf, sizeof(char *)*(driver->capture_nchannels + driver->playback_nchannels)); + + /* Read port names from special to general: + * Begin with user and speed specific port names */ + snprintf(filename, 255, "%s/.config/jack/cards/%s.%s.ports.in", getenv("HOME"), card_name, speed); + (void) port_names_load_portfile(driver, filename, buf, 0, driver->capture_nchannels); + + /* Now user general */ + snprintf(filename, 255, "%s/.config/jack/cards/%s.ports.in", getenv("HOME"), card_name); + (void) port_names_load_portfile(driver, filename, buf, 0, driver->capture_nchannels); + + /* System speed specific */ + snprintf(filename, 255, "/etc/jack/cards/%s.%s.ports.in", card_name, speed); + (void) port_names_load_portfile(driver, filename, buf, 0, driver->capture_nchannels); + + /* System general */ + snprintf(filename, 255, "/etc/jack/cards/%s.ports.in", card_name); + (void) port_names_load_portfile(driver, filename, buf, 0, driver->capture_nchannels); + + /* Fill all still unnamed ports with default names */ + port_names_default_portnames(buf, 0, driver->capture_nchannels, "capture_%lu"); + + + /* Same procedure for the playback channels */ + snprintf(filename, 255, "%s/.config/jack/cards/%s.%s.ports.out", getenv("HOME"), card_name, speed); + (void) port_names_load_portfile(driver, filename, buf, driver->capture_nchannels, driver->playback_nchannels); + + snprintf(filename, 255, "%s/.config/jack/cards/%s.ports.out", getenv("HOME"), card_name); + (void) port_names_load_portfile(driver, filename, buf, driver->capture_nchannels, driver->playback_nchannels); + + snprintf(filename, 255, "/etc/jack/cards/%s.%s.ports.out", card_name, speed); + (void) port_names_load_portfile(driver, filename, buf, driver->capture_nchannels, driver->playback_nchannels); + + snprintf(filename, 255, "/etc/jack/cards/%s.ports.out", card_name); + (void) port_names_load_portfile(driver, filename, buf, driver->capture_nchannels, driver->playback_nchannels); + + port_names_default_portnames(buf, driver->capture_nchannels, driver->playback_nchannels, "playback_%lu"); + + return buf; +} --- /dev/null +++ b/linux/alsa/port_names.h @@ -0,0 +1,34 @@ +/* + Copyright (C) 2010 Florian Faber, faber@faberman.de + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __jack_port_names_h__ +#define __jack_port_names_h__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +char** port_names_get_portnames(alsa_driver_t *driver); + +#ifdef __cplusplus +} +#endif + +#endif /* __jack_port_names_h__ */ --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -43,6 +43,7 @@ #include "JackPosixThread.h" #include "JackCompilerDeps.h" #include "JackServerGlobals.h" +#include "port_names.h" namespace Jack { @@ -72,6 +73,8 @@ unsigned long port_flags = (unsigned long)CaptureDriverFlags; char name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; char alias[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; + char old_name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; + char **portnames; jack_latency_range_t range; assert(fCaptureChannels < DRIVER_PORT_NUM); @@ -88,15 +91,20 @@ jack_log("JackAlsaDriver::Attach fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate); + portnames = port_names_get_portnames(alsa_driver); + for (int i = 0; i < fCaptureChannels; i++) { snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", fAliasName, fCaptureDriverName, i + 1); - snprintf(name, sizeof(name) - 1, "%s:capture_%d", fClientControl.fName, i + 1); + snprintf(old_name, sizeof(old_name) - 1, "%s:capture_%d", fClientControl.fName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:%s", fClientControl.fName, portnames[i]); if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("driver: cannot register port for %s", name); return -1; } + free(portnames[i]); port = fGraphManager->GetPort(port_index); port->SetAlias(alias); + port->SetAlias(old_name); range.min = range.max = alsa_driver->frames_per_cycle + alsa_driver->capture_frame_latency; port->SetLatencyRange(JackCaptureLatency, &range); fCapturePortList[i] = port_index; @@ -107,13 +115,16 @@ for (int i = 0; i < fPlaybackChannels; i++) { snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", fAliasName, fPlaybackDriverName, i + 1); - snprintf(name, sizeof(name) - 1, "%s:playback_%d", fClientControl.fName, i + 1); + snprintf(old_name, sizeof(old_name) - 1, "%s:playback_%d", fClientControl.fName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:%s", fClientControl.fName, portnames[i+fCaptureChannels]); if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("driver: cannot register port for %s", name); return -1; } + free(portnames[i+fCaptureChannels]); port = fGraphManager->GetPort(port_index); port->SetAlias(alias); + port->SetAlias(old_name); // Add one buffer more latency if "async" mode is used... range.min = range.max = (alsa_driver->frames_per_cycle * (alsa_driver->user_nperiods - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + alsa_driver->playback_frame_latency; @@ -137,6 +148,8 @@ } } + free(portnames); + if (alsa_driver->midi) { int err = (alsa_driver->midi->attach)(alsa_driver->midi); if (err) --- a/linux/wscript +++ b/linux/wscript @@ -54,6 +54,7 @@ 'alsa/hdsp.c', 'alsa/alsa_driver.c', 'alsa/hammerfall.c', + 'alsa/port_names.c', 'alsa/ice1712.c' ] debian/patches/README0000644000000000000000000000021112115643311011464 0ustar 0xxx: Grabbed from upstream development. 1xxx: Possibly relevant for upstream adoption. 2xxx: Only relevant for official Debian release. debian/patches/series0000644000000000000000000000001212161277426012033 0ustar waf.patch debian/patches/waf.patch0000644000000000000000000135435512115643311012430 0ustar Description: Reapply waflib as unpacked source, and add waf-light waf was shipped by upstream but in non-DFSG binary form so stripped from Debian redistributed source. . This patch was made roughly from these routines: . ./waf ; \ mv .waf*/waflib waflib && \ rm waf ; \ find ./waflib -iname "*.pyc" -delete ; \ wget http://waf.googlecode.com/git-history/waf-1.6.11/waf-light ; \ ln -s waf-light waf && chmod +x waf-light Author: Adrian Knoth Bug-Debian: http://bugs.debian.org/654477 Last-Update: 2012-12-21 --- /dev/null +++ b/waf-light @@ -0,0 +1,164 @@ +#!/usr/bin/env python +# encoding: ISO8859-1 +# Thomas Nagy, 2005-2011 + +""" +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. +""" + +import os, sys + +VERSION="1.6.11" +REVISION="x" +INSTALL="x" +C1='x' +C2='x' +cwd = os.getcwd() +join = os.path.join + +if sys.hexversion<0x206000f: + raise ImportError('Python >= 2.6 is required to create the waf file') + +WAF='waf' +def b(x): + return x +if sys.hexversion>0x300000f: + WAF='waf3' + def b(x): + return x.encode() + +def err(m): + print(('\033[91mError: %s\033[0m' % m)) + sys.exit(1) + +def unpack_wafdir(dir): + f = open(sys.argv[0],'rb') + c = 'corrupt archive (%d)' + while 1: + line = f.readline() + if not line: err('run waf-light from a folder containing waflib') + if line == b('#==>\n'): + txt = f.readline() + if not txt: err(c % 1) + if f.readline() != b('#<==\n'): err(c % 2) + break + if not txt: err(c % 3) + txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')) + + import shutil, tarfile + try: shutil.rmtree(dir) + except OSError: pass + try: + for x in ['Tools', 'extras']: + os.makedirs(join(dir, 'waflib', x)) + except OSError: + err("Cannot unpack waf lib into %s\nMove waf into a writeable directory" % dir) + + os.chdir(dir) + tmp = 't.bz2' + t = open(tmp,'wb') + t.write(txt) + t.close() + + try: + t = tarfile.open(tmp) + except: + try: + os.system('bunzip2 t.bz2') + t = tarfile.open('t') + tmp = 't' + except: + os.chdir(cwd) + try: shutil.rmtree(dir) + except OSError: pass + err("Waf cannot be unpacked, check that bzip2 support is present") + + for x in t: t.extract(x) + t.close() + + for x in ['Tools', 'extras']: + os.chmod(join('waflib',x), 493) + + if sys.hexversion<0x300000f: + sys.path = [join(dir, 'waflib')] + sys.path + import fixpy2 + fixpy2.fixdir(dir) + + os.unlink(tmp) + os.chdir(cwd) + + try: dir = unicode(dir, 'mbcs') + except: pass + try: + from ctypes import windll + windll.kernel32.SetFileAttributesW(dir, 2) + except: + pass + +def test(dir): + try: + os.stat(join(dir, 'waflib')) + return os.path.abspath(dir) + except OSError: + pass + +def find_lib(): + name = sys.argv[0] + base = os.path.dirname(os.path.abspath(name)) + + #devs use $WAFDIR + w=test(os.environ.get('WAFDIR', '')) + if w: return w + + #waf-light + if name.endswith('waf-light'): + w = test(base) + if w: return w + err('waf-light requires waflib -> export WAFDIR=/folder') + + dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) + for i in [INSTALL,'/usr','/usr/local','/opt']: + w = test(i + '/lib/' + dirname) + if w: return w + + #waf-local + dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) + w = test(dir) + if w: return w + + #unpack + unpack_wafdir(dir) + return dir + +wafdir = find_lib() +sys.path.insert(0, wafdir) + +if __name__ == '__main__': + import waflib.extras.compat15#PRELUDE + from waflib import Scripting + Scripting.waf_entry_point(cwd, VERSION, wafdir) + --- /dev/null +++ b/waflib/Build.py @@ -0,0 +1,731 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys,errno,re,shutil +try:import cPickle +except:import pickle as cPickle +from waflib import Runner,TaskGen,Utils,ConfigSet,Task,Logs,Options,Context,Errors +import waflib.Node +CACHE_DIR='c4che' +CACHE_SUFFIX='_cache.py' +INSTALL=1337 +UNINSTALL=-1337 +SAVED_ATTRS='root node_deps raw_deps task_sigs'.split() +CFG_FILES='cfg_files' +POST_AT_ONCE=0 +POST_LAZY=1 +POST_BOTH=2 +class BuildContext(Context.Context): + '''executes the build''' + cmd='build' + variant='' + def __init__(self,**kw): + super(BuildContext,self).__init__(**kw) + self.is_install=0 + self.top_dir=kw.get('top_dir',Context.top_dir) + self.run_dir=kw.get('run_dir',Context.run_dir) + self.post_mode=POST_AT_ONCE + self.out_dir=kw.get('out_dir',Context.out_dir) + self.cache_dir=kw.get('cache_dir',None) + if not self.cache_dir: + self.cache_dir=self.out_dir+os.sep+CACHE_DIR + self.all_envs={} + self.task_sigs={} + self.node_deps={} + self.raw_deps={} + self.cache_dir_contents={} + self.task_gen_cache_names={} + self.launch_dir=Context.launch_dir + self.jobs=Options.options.jobs + self.targets=Options.options.targets + self.keep=Options.options.keep + self.cache_global=Options.cache_global + self.nocache=Options.options.nocache + self.progress_bar=Options.options.progress_bar + self.deps_man=Utils.defaultdict(list) + self.current_group=0 + self.groups=[] + self.group_names={} + def get_variant_dir(self): + if not self.variant: + return self.out_dir + return os.path.join(self.out_dir,self.variant) + variant_dir=property(get_variant_dir,None) + def __call__(self,*k,**kw): + kw['bld']=self + ret=TaskGen.task_gen(*k,**kw) + self.task_gen_cache_names={} + self.add_to_group(ret,group=kw.get('group',None)) + return ret + def __copy__(self): + raise Errors.WafError('build contexts are not supposed to be copied') + def install_files(self,*k,**kw): + pass + def install_as(self,*k,**kw): + pass + def symlink_as(self,*k,**kw): + pass + def load_envs(self): + node=self.root.find_node(self.cache_dir) + if not node: + raise Errors.WafError('The project was not configured: run "waf configure" first!') + lst=node.ant_glob('**/*%s'%CACHE_SUFFIX,quiet=True) + if not lst: + raise Errors.WafError('The cache directory is empty: reconfigure the project') + for x in lst: + name=x.path_from(node).replace(CACHE_SUFFIX,'').replace('\\','/') + env=ConfigSet.ConfigSet(x.abspath()) + self.all_envs[name]=env + for f in env[CFG_FILES]: + newnode=self.root.find_resource(f) + try: + h=Utils.h_file(newnode.abspath()) + except(IOError,AttributeError): + Logs.error('cannot find %r'%f) + h=Utils.SIG_NIL + newnode.sig=h + def init_dirs(self): + if not(os.path.isabs(self.top_dir)and os.path.isabs(self.out_dir)): + raise Errors.WafError('The project was not configured: run "waf configure" first!') + self.path=self.srcnode=self.root.find_dir(self.top_dir) + self.bldnode=self.root.make_node(self.variant_dir) + self.bldnode.mkdir() + def execute(self): + self.restore() + if not self.all_envs: + self.load_envs() + self.execute_build() + def execute_build(self): + Logs.info("Waf: Entering directory `%s'"%self.variant_dir) + self.recurse([self.run_dir]) + self.pre_build() + self.timer=Utils.Timer() + if self.progress_bar: + sys.stderr.write(Logs.colors.cursor_off) + try: + self.compile() + finally: + if self.progress_bar==1: + c=len(self.returned_tasks)or 1 + self.to_log(self.progress_line(c,c,Logs.colors.BLUE,Logs.colors.NORMAL)) + print('') + sys.stdout.flush() + sys.stderr.write(Logs.colors.cursor_on) + Logs.info("Waf: Leaving directory `%s'"%self.variant_dir) + self.post_build() + def restore(self): + try: + env=ConfigSet.ConfigSet(os.path.join(self.cache_dir,'build.config.py')) + except(IOError,OSError): + pass + else: + if env['version']').ljust(cols) + msg=Utils.indicator%(left,bar,right) + return msg + def declare_chain(self,*k,**kw): + return TaskGen.declare_chain(*k,**kw) + def pre_build(self): + for m in getattr(self,'pre_funs',[]): + m(self) + def post_build(self): + for m in getattr(self,'post_funs',[]): + m(self) + def add_pre_fun(self,meth): + try: + self.pre_funs.append(meth) + except AttributeError: + self.pre_funs=[meth] + def add_post_fun(self,meth): + try: + self.post_funs.append(meth) + except AttributeError: + self.post_funs=[meth] + def get_group(self,x): + if not self.groups: + self.add_group() + if x is None: + return self.groups[self.current_group] + if x in self.group_names: + return self.group_names[x] + return self.groups[x] + def add_to_group(self,tgen,group=None): + assert(isinstance(tgen,TaskGen.task_gen)or isinstance(tgen,Task.TaskBase)) + tgen.bld=self + self.get_group(group).append(tgen) + def get_group_name(self,g): + if not isinstance(g,list): + g=self.groups[g] + for x in self.group_names: + if id(self.group_names[x])==id(g): + return x + return'' + def get_group_idx(self,tg): + se=id(tg) + for i in range(len(self.groups)): + for t in self.groups[i]: + if id(t)==se: + return i + return None + def add_group(self,name=None,move=True): + if name and name in self.group_names: + Logs.error('add_group: name %s already present'%name) + g=[] + self.group_names[name]=g + self.groups.append(g) + if move: + self.current_group=len(self.groups)-1 + def set_group(self,idx): + if isinstance(idx,str): + g=self.group_names[idx] + for i in range(len(self.groups)): + if id(g)==id(self.groups[i]): + self.current_group=i + else: + self.current_group=idx + def total(self): + total=0 + for group in self.groups: + for tg in group: + try: + total+=len(tg.tasks) + except AttributeError: + total+=1 + return total + def get_targets(self): + to_post=[] + min_grp=0 + for name in self.targets.split(','): + tg=self.get_tgen_by_name(name) + if not tg: + raise Errors.WafError('target %r does not exist'%name) + m=self.get_group_idx(tg) + if m>min_grp: + min_grp=m + to_post=[tg] + elif m==min_grp: + to_post.append(tg) + return(min_grp,to_post) + def post_group(self): + if self.targets=='*': + for tg in self.groups[self.cur]: + try: + f=tg.post + except AttributeError: + pass + else: + f() + elif self.targets: + if self.cur%r'%(src,tgt)) + Utils.check_dir(d) + srclbl=src.replace(self.srcnode.abspath()+os.sep,'') + if not Options.options.force: + try: + st1=os.stat(tgt) + st2=os.stat(src) + except OSError: + pass + else: + if st1.st_mtime+2>=st2.st_mtime and st1.st_size==st2.st_size: + if not self.progress_bar: + Logs.info('- install %s (from %s)'%(tgt,srclbl)) + return False + if not self.progress_bar: + Logs.info('+ install %s (from %s)'%(tgt,srclbl)) + try: + os.remove(tgt) + except OSError: + pass + try: + shutil.copy2(src,tgt) + os.chmod(tgt,chmod) + except IOError: + try: + os.stat(src) + except(OSError,IOError): + Logs.error('File %r does not exist'%src) + raise Errors.WafError('Could not install the file %r'%tgt) + def do_link(self,src,tgt): + d,_=os.path.split(tgt) + Utils.check_dir(d) + link=False + if not os.path.islink(tgt): + link=True + elif os.readlink(tgt)!=src: + link=True + if link: + try:os.remove(tgt) + except OSError:pass + if not self.progress_bar: + Logs.info('+ symlink %s (to %s)'%(tgt,src)) + os.symlink(src,tgt) + else: + if not self.progress_bar: + Logs.info('- symlink %s (to %s)'%(tgt,src)) + def run_task_now(self,tsk,postpone): + tsk.post() + if not postpone: + if tsk.runnable_status()==Task.ASK_LATER: + raise self.WafError('cannot post the task %r'%tsk) + tsk.run() + def install_files(self,dest,files,env=None,chmod=Utils.O644,relative_trick=False,cwd=None,add=True,postpone=True): + tsk=inst(env=env or self.env) + tsk.bld=self + tsk.path=cwd or self.path + tsk.chmod=chmod + if isinstance(files,waflib.Node.Node): + tsk.source=[files] + else: + tsk.source=Utils.to_list(files) + tsk.dest=dest + tsk.exec_task=tsk.exec_install_files + tsk.relative_trick=relative_trick + if add:self.add_to_group(tsk) + self.run_task_now(tsk,postpone) + return tsk + def install_as(self,dest,srcfile,env=None,chmod=Utils.O644,cwd=None,add=True,postpone=True): + tsk=inst(env=env or self.env) + tsk.bld=self + tsk.path=cwd or self.path + tsk.chmod=chmod + tsk.source=[srcfile] + tsk.dest=dest + tsk.exec_task=tsk.exec_install_as + if add:self.add_to_group(tsk) + self.run_task_now(tsk,postpone) + return tsk + def symlink_as(self,dest,src,env=None,cwd=None,add=True,postpone=True): + if Utils.is_win32: + return + tsk=inst(env=env or self.env) + tsk.bld=self + tsk.dest=dest + tsk.path=cwd or self.path + tsk.source=[] + tsk.link=src + tsk.exec_task=tsk.exec_symlink_as + if add:self.add_to_group(tsk) + self.run_task_now(tsk,postpone) + return tsk +class UninstallContext(InstallContext): + '''removes the targets installed''' + cmd='uninstall' + def __init__(self,**kw): + super(UninstallContext,self).__init__(**kw) + self.is_install=UNINSTALL + def do_install(self,src,tgt,chmod=Utils.O644): + if not self.progress_bar: + Logs.info('- remove %s'%tgt) + self.uninstall.append(tgt) + try: + os.remove(tgt) + except OSError ,e: + if e.errno!=errno.ENOENT: + if not getattr(self,'uninstall_error',None): + self.uninstall_error=True + Logs.warn('build: some files could not be uninstalled (retry with -vv to list them)') + if Logs.verbose>1: + Logs.warn('could not remove %s (error code %r)'%(e.filename,e.errno)) + while tgt: + tgt=os.path.dirname(tgt) + try: + os.rmdir(tgt) + except OSError: + break + def do_link(self,src,tgt): + try: + if not self.progress_bar: + Logs.info('- unlink %s'%tgt) + os.remove(tgt) + except OSError: + pass + while tgt: + tgt=os.path.dirname(tgt) + try: + os.rmdir(tgt) + except OSError: + break + def execute(self): + try: + def runnable_status(self): + return Task.SKIP_ME + setattr(Task.Task,'runnable_status_back',Task.Task.runnable_status) + setattr(Task.Task,'runnable_status',runnable_status) + super(UninstallContext,self).execute() + finally: + setattr(Task.Task,'runnable_status',Task.Task.runnable_status_back) +class CleanContext(BuildContext): + '''cleans the project''' + cmd='clean' + def execute(self): + self.restore() + if not self.all_envs: + self.load_envs() + self.recurse([self.run_dir]) + try: + self.clean() + finally: + self.store() + def clean(self): + Logs.debug('build: clean called') + if self.bldnode!=self.srcnode: + lst=[self.root.find_or_declare(f)for f in self.env[CFG_FILES]] + for n in self.bldnode.ant_glob('**/*',excl='lock* *conf_check_*/** config.log c4che/*',quiet=True): + if n in lst: + continue + n.delete() + self.root.children={} + for v in'node_deps task_sigs raw_deps'.split(): + setattr(self,v,{}) +class ListContext(BuildContext): + '''lists the targets to execute''' + cmd='list' + def execute(self): + self.restore() + if not self.all_envs: + self.load_envs() + self.recurse([self.run_dir]) + self.pre_build() + self.timer=Utils.Timer() + for g in self.groups: + for tg in g: + try: + f=tg.post + except AttributeError: + pass + else: + f() + try: + self.get_tgen_by_name('') + except: + pass + lst=list(self.task_gen_cache_names.keys()) + lst.sort() + for k in lst: + Logs.pprint('GREEN',k) +class StepContext(BuildContext): + '''executes tasks in a step-by-step fashion, for debugging''' + cmd='step' + def __init__(self,**kw): + super(StepContext,self).__init__(**kw) + self.files=Options.options.files + def compile(self): + if not self.files: + Logs.warn('Add a pattern for the debug build, for example "waf step --files=main.c,app"') + BuildContext.compile(self) + return + for g in self.groups: + for tg in g: + try: + f=tg.post + except AttributeError: + pass + else: + f() + for pat in self.files.split(','): + matcher=self.get_matcher(pat) + for tg in g: + if isinstance(tg,Task.TaskBase): + lst=[tg] + else: + lst=tg.tasks + for tsk in lst: + do_exec=False + for node in getattr(tsk,'inputs',[]): + if matcher(node,output=False): + do_exec=True + break + for node in getattr(tsk,'outputs',[]): + if matcher(node,output=True): + do_exec=True + break + if do_exec: + ret=tsk.run() + Logs.info('%s -> exit %r'%(str(tsk),ret)) + def get_matcher(self,pat): + inn=True + out=True + if pat.startswith('in:'): + out=False + pat=pat.replace('in:','') + elif pat.startswith('out:'): + inn=False + pat=pat.replace('out:','') + anode=self.root.find_node(pat) + pattern=None + if not anode: + if not pat.startswith('^'): + pat='^.+?%s'%pat + if not pat.endswith('$'): + pat='%s$'%pat + pattern=re.compile(pat) + def match(node,output): + if output==True and not out: + return False + if output==False and not inn: + return False + if anode: + return anode==node + else: + return pattern.match(node.abspath()) + return match +BuildContext.store=Utils.nogc(BuildContext.store) +BuildContext.restore=Utils.nogc(BuildContext.restore) --- /dev/null +++ b/waflib/ConfigSet.py @@ -0,0 +1,151 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import copy,re,os +from waflib import Logs,Utils +re_imp=re.compile('^(#)*?([^#=]*?)\ =\ (.*?)$',re.M) +class ConfigSet(object): + __slots__=('table','parent') + def __init__(self,filename=None): + self.table={} + if filename: + self.load(filename) + def __contains__(self,key): + if key in self.table:return True + try:return self.parent.__contains__(key) + except AttributeError:return False + def keys(self): + keys=set() + cur=self + while cur: + keys.update(cur.table.keys()) + cur=getattr(cur,'parent',None) + keys=list(keys) + keys.sort() + return keys + def __str__(self): + return"\n".join(["%r %r"%(x,self.__getitem__(x))for x in self.keys()]) + def __getitem__(self,key): + try: + while 1: + x=self.table.get(key,None) + if not x is None: + return x + self=self.parent + except AttributeError: + return[] + def __setitem__(self,key,value): + self.table[key]=value + def __delitem__(self,key): + self[key]=[] + def __getattr__(self,name): + if name in self.__slots__: + return object.__getattr__(self,name) + else: + return self[name] + def __setattr__(self,name,value): + if name in self.__slots__: + object.__setattr__(self,name,value) + else: + self[name]=value + def __delattr__(self,name): + if name in self.__slots__: + object.__delattr__(self,name) + else: + del self[name] + def derive(self): + newenv=ConfigSet() + newenv.parent=self + return newenv + def detach(self): + tbl=self.get_merged_dict() + try: + delattr(self,'parent') + except AttributeError: + pass + else: + keys=tbl.keys() + for x in keys: + tbl[x]=copy.deepcopy(tbl[x]) + self.table=tbl + def get_flat(self,key): + s=self[key] + if isinstance(s,str):return s + return' '.join(s) + def _get_list_value_for_modification(self,key): + try: + value=self.table[key] + except KeyError: + try:value=self.parent[key] + except AttributeError:value=[] + if isinstance(value,list): + value=value[:] + else: + value=[value] + else: + if not isinstance(value,list): + value=[value] + self.table[key]=value + return value + def append_value(self,var,val): + current_value=self._get_list_value_for_modification(var) + if isinstance(val,str): + val=[val] + current_value.extend(val) + def prepend_value(self,var,val): + if isinstance(val,str): + val=[val] + self.table[var]=val+self._get_list_value_for_modification(var) + def append_unique(self,var,val): + if isinstance(val,str): + val=[val] + current_value=self._get_list_value_for_modification(var) + for x in val: + if x not in current_value: + current_value.append(x) + def get_merged_dict(self): + table_list=[] + env=self + while 1: + table_list.insert(0,env.table) + try:env=env.parent + except AttributeError:break + merged_table={} + for table in table_list: + merged_table.update(table) + return merged_table + def store(self,filename): + try: + os.makedirs(os.path.split(filename)[0]) + except OSError: + pass + f=None + try: + f=open(filename,'w') + merged_table=self.get_merged_dict() + keys=list(merged_table.keys()) + keys.sort() + for k in keys: + if k!='undo_stack': + f.write('%s = %r\n'%(k,merged_table[k])) + finally: + if f: + f.close() + def load(self,filename): + tbl=self.table + code=Utils.readf(filename) + for m in re_imp.finditer(code): + g=m.group + tbl[g(2)]=eval(g(3)) + Logs.debug('env: %s'%str(self.table)) + def update(self,d): + for k,v in d.items(): + self[k]=v + def stash(self): + self.undo_stack=self.undo_stack+[self.table] + self.table=self.table.copy() + def revert(self): + self.table=self.undo_stack.pop(-1) --- /dev/null +++ b/waflib/Configure.py @@ -0,0 +1,315 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,shlex,sys,time +from waflib import ConfigSet,Utils,Options,Logs,Context,Build,Errors +try: + from urllib import request +except: + from urllib import urlopen +else: + urlopen=request.urlopen +BREAK='break' +CONTINUE='continue' +WAF_CONFIG_LOG='config.log' +autoconfig=False +conf_template='''# project %(app)s configured on %(now)s by +# waf %(wafver)s (abi %(abi)s, python %(pyver)x on %(systype)s) +# using %(args)s +#''' +def download_check(node): + pass +def download_tool(tool,force=False,ctx=None): + for x in Utils.to_list(Context.remote_repo): + for sub in Utils.to_list(Context.remote_locs): + url='/'.join((x,sub,tool+'.py')) + try: + web=urlopen(url) + try: + if web.getcode()!=200: + continue + except AttributeError: + pass + except Exception: + continue + else: + tmp=ctx.root.make_node(os.sep.join((Context.waf_dir,'waflib','extras',tool+'.py'))) + tmp.write(web.read()) + Logs.warn('Downloaded %s from %s'%(tool,url)) + download_check(tmp) + try: + module=Context.load_tool(tool) + except: + Logs.warn('The tool %s from %s is unusable'%(tool,url)) + try: + tmp.delete() + except: + pass + continue + return module + raise Errors.WafError('Could not load the Waf tool') +class ConfigurationContext(Context.Context): + '''configures the project''' + cmd='configure' + error_handlers=[] + def __init__(self,**kw): + super(ConfigurationContext,self).__init__(**kw) + self.environ=dict(os.environ) + self.all_envs={} + self.top_dir=None + self.out_dir=None + self.tools=[] + self.hash=0 + self.files=[] + self.tool_cache=[] + self.setenv('') + def setenv(self,name,env=None): + if name not in self.all_envs or env: + if not env: + env=ConfigSet.ConfigSet() + self.prepare_env(env) + else: + env=env.derive() + self.all_envs[name]=env + self.variant=name + def get_env(self): + return self.all_envs[self.variant] + def set_env(self,val): + self.all_envs[self.variant]=val + env=property(get_env,set_env) + def init_dirs(self): + top=self.top_dir + if not top: + top=Options.options.top + if not top: + top=getattr(Context.g_module,Context.TOP,None) + if not top: + top=self.path.abspath() + top=os.path.abspath(top) + self.srcnode=(os.path.isabs(top)and self.root or self.path).find_dir(top) + assert(self.srcnode) + out=self.out_dir + if not out: + out=Options.options.out + if not out: + out=getattr(Context.g_module,Context.OUT,None) + if not out: + out=Options.lockfile.replace('.lock-waf_%s_'%sys.platform,'').replace('.lock-waf','') + self.bldnode=(os.path.isabs(out)and self.root or self.path).make_node(out) + self.bldnode.mkdir() + if not os.path.isdir(self.bldnode.abspath()): + conf.fatal('could not create the build directory %s'%self.bldnode.abspath()) + def execute(self): + self.init_dirs() + self.cachedir=self.bldnode.make_node(Build.CACHE_DIR) + self.cachedir.mkdir() + path=os.path.join(self.bldnode.abspath(),WAF_CONFIG_LOG) + self.logger=Logs.make_logger(path,'cfg') + app=getattr(Context.g_module,'APPNAME','') + if app: + ver=getattr(Context.g_module,'VERSION','') + if ver: + app="%s (%s)"%(app,ver) + now=time.ctime() + pyver=sys.hexversion + systype=sys.platform + args=" ".join(sys.argv) + wafver=Context.WAFVERSION + abi=Context.ABI + self.to_log(conf_template%vars()) + self.msg('Setting top to',self.srcnode.abspath()) + self.msg('Setting out to',self.bldnode.abspath()) + if id(self.srcnode)==id(self.bldnode): + Logs.warn('Setting top == out (remember to use "update_outputs")') + elif id(self.path)!=id(self.srcnode): + if self.srcnode.is_child_of(self.path): + Logs.warn('Are you certain that you do not want to set top="." ?') + super(ConfigurationContext,self).execute() + self.store() + Context.top_dir=self.srcnode.abspath() + Context.out_dir=self.bldnode.abspath() + env=ConfigSet.ConfigSet() + env['argv']=sys.argv + env['options']=Options.options.__dict__ + env.run_dir=Context.run_dir + env.top_dir=Context.top_dir + env.out_dir=Context.out_dir + env['hash']=self.hash + env['files']=self.files + env['environ']=dict(self.environ) + if not self.env.NO_LOCK_IN_RUN: + env.store(Context.run_dir+os.sep+Options.lockfile) + if not self.env.NO_LOCK_IN_TOP: + env.store(Context.top_dir+os.sep+Options.lockfile) + if not self.env.NO_LOCK_IN_OUT: + env.store(Context.out_dir+os.sep+Options.lockfile) + def prepare_env(self,env): + if not env.PREFIX: + env.PREFIX=os.path.abspath(os.path.expanduser(Options.options.prefix)) + if not env.BINDIR: + env.BINDIR=Utils.subst_vars('${PREFIX}/bin',env) + if not env.LIBDIR: + env.LIBDIR=Utils.subst_vars('${PREFIX}/lib',env) + def store(self): + n=self.cachedir.make_node('build.config.py') + n.write('version = 0x%x\ntools = %r\n'%(Context.HEXVERSION,self.tools)) + if not self.all_envs: + self.fatal('nothing to store in the configuration context!') + for key in self.all_envs: + tmpenv=self.all_envs[key] + tmpenv.store(os.path.join(self.cachedir.abspath(),key+Build.CACHE_SUFFIX)) + def load(self,input,tooldir=None,funs=None,download=True): + tools=Utils.to_list(input) + if tooldir:tooldir=Utils.to_list(tooldir) + for tool in tools: + mag=(tool,id(self.env),funs) + if mag in self.tool_cache: + self.to_log('(tool %s is already loaded, skipping)'%tool) + continue + self.tool_cache.append(mag) + module=None + try: + module=Context.load_tool(tool,tooldir) + except ImportError ,e: + if Options.options.download: + module=download_tool(tool,ctx=self) + if not module: + self.fatal('Could not load the Waf tool %r or download a suitable replacement from the repository (sys.path %r)\n%s'%(tool,sys.path,e)) + else: + self.fatal('Could not load the Waf tool %r from %r (try the --download option?):\n%s'%(tool,sys.path,e)) + except Exception ,e: + self.to_log('imp %r (%r & %r)'%(tool,tooldir,funs)) + self.to_log(Utils.ex_stack()) + raise + if funs is not None: + self.eval_rules(funs) + else: + func=getattr(module,'configure',None) + if func: + if type(func)is type(Utils.readf):func(self) + else:self.eval_rules(func) + self.tools.append({'tool':tool,'tooldir':tooldir,'funs':funs}) + def post_recurse(self,node): + super(ConfigurationContext,self).post_recurse(node) + self.hash=hash((self.hash,node.read('rb'))) + self.files.append(node.abspath()) + def eval_rules(self,rules): + self.rules=Utils.to_list(rules) + for x in self.rules: + f=getattr(self,x) + if not f:self.fatal("No such method '%s'."%x) + try: + f() + except Exception ,e: + ret=self.err_handler(x,e) + if ret==BREAK: + break + elif ret==CONTINUE: + continue + else: + raise + def err_handler(self,fun,error): + pass +def conf(f): + def fun(*k,**kw): + mandatory=True + if'mandatory'in kw: + mandatory=kw['mandatory'] + del kw['mandatory'] + try: + return f(*k,**kw) + except Errors.ConfigurationError ,e: + if mandatory: + raise e + setattr(ConfigurationContext,f.__name__,fun) + setattr(Build.BuildContext,f.__name__,fun) + return f +def add_os_flags(self,var,dest=None): + try:self.env.append_value(dest or var,shlex.split(self.environ[var])) + except KeyError:pass +def cmd_to_list(self,cmd): + if isinstance(cmd,str)and cmd.find(' '): + try: + os.stat(cmd) + except OSError: + return shlex.split(cmd) + else: + return[cmd] + return cmd +def check_waf_version(self,mini='1.6.0',maxi='1.7.0'): + self.start_msg('Checking for waf version in %s-%s'%(str(mini),str(maxi))) + ver=Context.HEXVERSION + if Utils.num2ver(mini)>ver: + self.fatal('waf version should be at least %r (%r found)'%(Utils.num2ver(mini),ver)) + if Utils.num2ver(maxi) %r'%(filename,path_list,var,ret)) + if not ret: + self.fatal(kw.get('errmsg','')or'Could not find the program %s'%','.join(filename)) + if var: + self.env[var]=ret + return ret +def find_perl_program(self,filename,path_list=[],var=None,environ=None,exts=''): + try: + app=self.find_program(filename,path_list=path_list,var=var,environ=environ,exts=exts) + except: + self.find_program('perl',var='PERL') + app=self.find_file(filename,os.environ['PATH'].split(os.pathsep)) + if not app: + raise + if var: + self.env[var]=Utils.to_list(self.env['PERL'])+[app] + self.msg('Checking for %r'%filename,app) + +conf(add_os_flags) +conf(cmd_to_list) +conf(check_waf_version) +conf(find_file) +conf(find_program) +conf(find_perl_program) \ No newline at end of file --- /dev/null +++ b/waflib/Context.py @@ -0,0 +1,299 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,imp,sys +from waflib import Utils,Errors,Logs +import waflib.Node +HEXVERSION=0x1060b00 +WAFVERSION="1.6.11" +WAFREVISION="a7e69d6b81b04729804754c4d5214da063779a65" +ABI=98 +DBFILE='.wafpickle-%d'%ABI +APPNAME='APPNAME' +VERSION='VERSION' +TOP='top' +OUT='out' +WSCRIPT_FILE='wscript' +launch_dir='' +run_dir='' +top_dir='' +out_dir='' +waf_dir='' +local_repo='' +remote_repo='http://waf.googlecode.com/git/' +remote_locs=['waflib/extras','waflib/Tools'] +g_module=None +STDOUT=1 +STDERR=-1 +BOTH=0 +classes=[] +def create_context(cmd_name,*k,**kw): + global classes + for x in classes: + if x.cmd==cmd_name: + return x(*k,**kw) + ctx=Context(*k,**kw) + ctx.fun=cmd_name + return ctx +class store_context(type): + def __init__(cls,name,bases,dict): + super(store_context,cls).__init__(name,bases,dict) + name=cls.__name__ + if name=='ctx'or name=='Context': + return + try: + cls.cmd + except AttributeError: + raise Errors.WafError('Missing command for the context class %r (cmd)'%name) + if not getattr(cls,'fun',None): + cls.fun=cls.cmd + global classes + classes.insert(0,cls) +ctx=store_context('ctx',(object,),{}) +class Context(ctx): + errors=Errors + tools={} + def __init__(self,**kw): + try: + rd=kw['run_dir'] + except KeyError: + global run_dir + rd=run_dir + class node_class(waflib.Node.Node): + pass + self.node_class=node_class + self.node_class.__module__="waflib.Node" + self.node_class.__name__="Nod3" + self.node_class.ctx=self + self.root=self.node_class('',None) + self.cur_script=None + self.path=self.root.find_dir(rd) + self.stack_path=[] + self.exec_dict={'ctx':self,'conf':self,'bld':self,'opt':self} + self.logger=None + def __hash__(self): + return id(self) + def load(self,tool_list,*k,**kw): + tools=Utils.to_list(tool_list) + path=Utils.to_list(kw.get('tooldir','')) + for t in tools: + module=load_tool(t,path) + fun=getattr(module,kw.get('name',self.fun),None) + if fun: + fun(self) + def execute(self): + global g_module + self.recurse([os.path.dirname(g_module.root_path)]) + def pre_recurse(self,node): + self.stack_path.append(self.cur_script) + self.cur_script=node + self.path=node.parent + def post_recurse(self,node): + self.cur_script=self.stack_path.pop() + if self.cur_script: + self.path=self.cur_script.parent + def recurse(self,dirs,name=None,mandatory=True,once=True): + try: + cache=self.recurse_cache + except: + cache=self.recurse_cache={} + for d in Utils.to_list(dirs): + if not os.path.isabs(d): + d=os.path.join(self.path.abspath(),d) + WSCRIPT=os.path.join(d,WSCRIPT_FILE) + WSCRIPT_FUN=WSCRIPT+'_'+(name or self.fun) + node=self.root.find_node(WSCRIPT_FUN) + if node and(not once or node not in cache): + cache[node]=True + self.pre_recurse(node) + try: + function_code=node.read('rU') + exec(compile(function_code,node.abspath(),'exec'),self.exec_dict) + finally: + self.post_recurse(node) + elif not node: + node=self.root.find_node(WSCRIPT) + tup=(node,name or self.fun) + if node and(not once or tup not in cache): + cache[tup]=True + self.pre_recurse(node) + try: + wscript_module=load_module(node.abspath()) + user_function=getattr(wscript_module,(name or self.fun),None) + if not user_function: + if not mandatory: + continue + raise Errors.WafError('No function %s defined in %s'%(name or self.fun,node.abspath())) + user_function(self) + finally: + self.post_recurse(node) + elif not node: + if not mandatory: + continue + raise Errors.WafError('No wscript file in directory %s'%d) + def exec_command(self,cmd,**kw): + subprocess=Utils.subprocess + kw['shell']=isinstance(cmd,str) + Logs.debug('runner: %r'%cmd) + Logs.debug('runner_env: kw=%s'%kw) + try: + if self.logger: + self.logger.info(cmd) + kw['stdout']=kw['stderr']=subprocess.PIPE + p=subprocess.Popen(cmd,**kw) + (out,err)=p.communicate() + if out: + self.logger.debug('out: %s'%out.decode(sys.stdout.encoding or'iso8859-1')) + if err: + self.logger.error('err: %s'%err.decode(sys.stdout.encoding or'iso8859-1')) + return p.returncode + else: + p=subprocess.Popen(cmd,**kw) + return p.wait() + except OSError: + return-1 + def cmd_and_log(self,cmd,**kw): + subprocess=Utils.subprocess + kw['shell']=isinstance(cmd,str) + Logs.debug('runner: %r'%cmd) + if'quiet'in kw: + quiet=kw['quiet'] + del kw['quiet'] + else: + quiet=None + if'output'in kw: + to_ret=kw['output'] + del kw['output'] + else: + to_ret=STDOUT + kw['stdout']=kw['stderr']=subprocess.PIPE + if quiet is None: + self.to_log(cmd) + try: + p=subprocess.Popen(cmd,**kw) + (out,err)=p.communicate() + except Exception ,e: + raise Errors.WafError('Execution failure: %s'%str(e),ex=e) + if not isinstance(out,str): + out=out.decode(sys.stdout.encoding or'iso8859-1') + if not isinstance(err,str): + err=err.decode(sys.stdout.encoding or'iso8859-1') + if out and quiet!=STDOUT and quiet!=BOTH: + self.to_log('out: %s'%out) + if err and quiet!=STDERR and quiet!=BOTH: + self.to_log('err: %s'%err) + if p.returncode: + e=Errors.WafError('Command %r returned %r'%(cmd,p.returncode)) + e.returncode=p.returncode + e.stderr=err + e.stdout=out + raise e + if to_ret==BOTH: + return(out,err) + elif to_ret==STDERR: + return err + return out + def fatal(self,msg,ex=None): + if self.logger: + self.logger.info('from %s: %s'%(self.path.abspath(),msg)) + try: + msg='%s\n(complete log in %s)'%(msg,self.logger.handlers[0].baseFilename) + except: + pass + raise self.errors.ConfigurationError(msg,ex=ex) + def to_log(self,msg): + if not msg: + return + if self.logger: + self.logger.info(msg) + else: + sys.stderr.write(str(msg)) + sys.stderr.flush() + def msg(self,msg,result,color=None): + self.start_msg(msg) + if not isinstance(color,str): + color=result and'GREEN'or'YELLOW' + self.end_msg(result,color) + def start_msg(self,msg): + try: + if self.in_msg: + self.in_msg+=1 + return + except: + self.in_msg=0 + self.in_msg+=1 + try: + self.line_just=max(self.line_just,len(msg)) + except AttributeError: + self.line_just=max(40,len(msg)) + for x in(self.line_just*'-',msg): + self.to_log(x) + Logs.pprint('NORMAL',"%s :"%msg.ljust(self.line_just),sep='') + def end_msg(self,result,color=None): + self.in_msg-=1 + if self.in_msg: + return + defcolor='GREEN' + if result==True: + msg='ok' + elif result==False: + msg='not found' + defcolor='YELLOW' + else: + msg=str(result) + self.to_log(msg) + Logs.pprint(color or defcolor,msg) + def load_special_tools(self,var,ban=[]): + global waf_dir + lst=self.root.find_node(waf_dir).find_node('waflib/extras').ant_glob(var) + for x in lst: + if not x.name in ban: + load_tool(x.name.replace('.py','')) +cache_modules={} +def load_module(path): + try: + return cache_modules[path] + except KeyError: + pass + module=imp.new_module(WSCRIPT_FILE) + try: + code=Utils.readf(path,m='rU') + except(IOError,OSError): + raise Errors.WafError('Could not read the file %r'%path) + module_dir=os.path.dirname(path) + sys.path.insert(0,module_dir) + exec(compile(code,path,'exec'),module.__dict__) + sys.path.remove(module_dir) + cache_modules[path]=module + return module +def load_tool(tool,tooldir=None): + tool=tool.replace('++','xx') + tool=tool.replace('java','javaw') + tool=tool.replace('compiler_cc','compiler_c') + if tooldir: + assert isinstance(tooldir,list) + sys.path=tooldir+sys.path + try: + __import__(tool) + ret=sys.modules[tool] + Context.tools[tool]=ret + return ret + finally: + for d in tooldir: + sys.path.remove(d) + else: + global waf_dir + try: + os.stat(os.path.join(waf_dir,'waflib','extras',tool+'.py')) + d='waflib.extras.%s'%tool + except: + try: + os.stat(os.path.join(waf_dir,'waflib','Tools',tool+'.py')) + d='waflib.Tools.%s'%tool + except: + d=tool + __import__(d) + ret=sys.modules[d] + Context.tools[tool]=ret + return ret --- /dev/null +++ b/waflib/Errors.py @@ -0,0 +1,37 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import traceback,sys +class WafError(Exception): + def __init__(self,msg='',ex=None): + self.msg=msg + assert not isinstance(msg,Exception) + self.stack=[] + if ex: + if not msg: + self.msg=str(ex) + if isinstance(ex,WafError): + self.stack=ex.stack + else: + self.stack=traceback.extract_tb(sys.exc_info()[2]) + self.stack+=traceback.extract_stack()[:-1] + self.verbose_msg=''.join(traceback.format_list(self.stack)) + def __str__(self): + return str(self.msg) +class BuildError(WafError): + def __init__(self,error_tasks=[]): + self.tasks=error_tasks + WafError.__init__(self,self.format_error()) + def format_error(self): + lst=['Build failed'] + for tsk in self.tasks: + txt=tsk.format_error() + if txt:lst.append(txt) + return'\n'.join(lst) +class ConfigurationError(WafError): + pass +class TaskRescan(WafError): + pass +class TaskNotReady(WafError): + pass --- /dev/null +++ b/waflib/Logs.py @@ -0,0 +1,149 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,re,traceback,sys +_nocolor=os.environ.get('NOCOLOR','no')not in('no','0','false') +try: + if not _nocolor: + import waflib.ansiterm +except: + pass +import logging +LOG_FORMAT="%(asctime)s %(c1)s%(zone)s%(c2)s %(message)s" +HOUR_FORMAT="%H:%M:%S" +zones='' +verbose=0 +colors_lst={'USE':True,'BOLD':'\x1b[01;1m','RED':'\x1b[01;31m','GREEN':'\x1b[32m','YELLOW':'\x1b[33m','PINK':'\x1b[35m','BLUE':'\x1b[01;34m','CYAN':'\x1b[36m','NORMAL':'\x1b[0m','cursor_on':'\x1b[?25h','cursor_off':'\x1b[?25l',} +got_tty=not os.environ.get('TERM','dumb')in['dumb','emacs'] +if got_tty: + try: + got_tty=sys.stderr.isatty() + except AttributeError: + got_tty=False +if(not got_tty and os.environ.get('TERM','dumb')!='msys')or _nocolor: + colors_lst['USE']=False +def get_term_cols(): + return 80 +try: + import struct,fcntl,termios +except ImportError: + pass +else: + if got_tty: + def get_term_cols_real(): + dummy_lines,cols=struct.unpack("HHHH",fcntl.ioctl(sys.stderr.fileno(),termios.TIOCGWINSZ,struct.pack("HHHH",0,0,0,0)))[:2] + return cols + try: + get_term_cols_real() + except: + pass + else: + get_term_cols=get_term_cols_real +get_term_cols.__doc__=""" + Get the console width in characters. + + :return: the number of characters per line + :rtype: int + """ +def get_color(cl): + if not colors_lst['USE']:return'' + return colors_lst.get(cl,'') +class color_dict(object): + def __getattr__(self,a): + return get_color(a) + def __call__(self,a): + return get_color(a) +colors=color_dict() +re_log=re.compile(r'(\w+): (.*)',re.M) +class log_filter(logging.Filter): + def __init__(self,name=None): + pass + def filter(self,rec): + rec.c1=colors.PINK + rec.c2=colors.NORMAL + rec.zone=rec.module + if rec.levelno>=logging.INFO: + if rec.levelno>=logging.ERROR: + rec.c1=colors.RED + elif rec.levelno>=logging.WARNING: + rec.c1=colors.YELLOW + else: + rec.c1=colors.GREEN + return True + m=re_log.match(rec.msg) + if m: + rec.zone=m.group(1) + rec.msg=m.group(2) + if zones: + return getattr(rec,'zone','')in zones or'*'in zones + elif not verbose>2: + return False + return True +class formatter(logging.Formatter): + def __init__(self): + logging.Formatter.__init__(self,LOG_FORMAT,HOUR_FORMAT) + def format(self,rec): + if rec.levelno>=logging.WARNING or rec.levelno==logging.INFO: + try: + msg=rec.msg.decode('utf-8') + except: + msg=rec.msg + return'%s%s%s'%(rec.c1,msg,rec.c2) + return logging.Formatter.format(self,rec) +log=None +def debug(*k,**kw): + if verbose: + k=list(k) + k[0]=k[0].replace('\n',' ') + global log + log.debug(*k,**kw) +def error(*k,**kw): + global log + log.error(*k,**kw) + if verbose>2: + st=traceback.extract_stack() + if st: + st=st[:-1] + buf=[] + for filename,lineno,name,line in st: + buf.append(' File "%s", line %d, in %s'%(filename,lineno,name)) + if line: + buf.append(' %s'%line.strip()) + if buf:log.error("\n".join(buf)) +def warn(*k,**kw): + global log + log.warn(*k,**kw) +def info(*k,**kw): + global log + log.info(*k,**kw) +def init_log(): + global log + log=logging.getLogger('waflib') + log.handlers=[] + log.filters=[] + hdlr=logging.StreamHandler() + hdlr.setFormatter(formatter()) + log.addHandler(hdlr) + log.addFilter(log_filter()) + log.setLevel(logging.DEBUG) +def make_logger(path,name): + logger=logging.getLogger(name) + hdlr=logging.FileHandler(path,'w') + formatter=logging.Formatter('%(message)s') + hdlr.setFormatter(formatter) + logger.addHandler(hdlr) + logger.setLevel(logging.DEBUG) + return logger +def make_mem_logger(name,to_log,size=10000): + from logging.handlers import MemoryHandler + logger=logging.getLogger(name) + hdlr=MemoryHandler(size,target=to_log) + formatter=logging.Formatter('%(message)s') + hdlr.setFormatter(formatter) + logger.addHandler(hdlr) + logger.memhandler=hdlr + logger.setLevel(logging.DEBUG) + return logger +def pprint(col,str,label='',sep='\n'): + sys.stderr.write("%s%s%s %s%s"%(colors(col),str,colors.NORMAL,label,sep)) --- /dev/null +++ b/waflib/Node.py @@ -0,0 +1,506 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,re,sys,shutil +from waflib import Utils,Errors +exclude_regs=''' +**/*~ +**/#*# +**/.#* +**/%*% +**/._* +**/CVS +**/CVS/** +**/.cvsignore +**/SCCS +**/SCCS/** +**/vssver.scc +**/.svn +**/.svn/** +**/BitKeeper +**/.git +**/.git/** +**/.gitignore +**/.bzr +**/.bzrignore +**/.bzr/** +**/.hg +**/.hg/** +**/_MTN +**/_MTN/** +**/.arch-ids +**/{arch} +**/_darcs +**/_darcs/** +**/.DS_Store''' +def split_path(path): + return path.split('/') +def split_path_cygwin(path): + if path.startswith('//'): + ret=path.split('/')[2:] + ret[0]='/'+ret[0] + return ret + return path.split('/') +re_sp=re.compile('[/\\\\]') +def split_path_win32(path): + if path.startswith('\\\\'): + ret=re.split(re_sp,path)[2:] + ret[0]='\\'+ret[0] + return ret + return re.split(re_sp,path) +if sys.platform=='cygwin': + split_path=split_path_cygwin +elif Utils.is_win32: + split_path=split_path_win32 +class Node(object): + __slots__=('name','sig','children','parent','cache_abspath','cache_isdir') + def __init__(self,name,parent): + self.name=name + self.parent=parent + if parent: + if name in parent.children: + raise Errors.WafError('node %s exists in the parent files %r already'%(name,parent)) + parent.children[name]=self + def __setstate__(self,data): + self.name=data[0] + self.parent=data[1] + if data[2]is not None: + self.children=data[2] + if data[3]is not None: + self.sig=data[3] + def __getstate__(self): + return(self.name,self.parent,getattr(self,'children',None),getattr(self,'sig',None)) + def __str__(self): + return self.name + def __repr__(self): + return self.abspath() + def __hash__(self): + return id(self) + def __eq__(self,node): + return id(self)==id(node) + def __copy__(self): + raise Errors.WafError('nodes are not supposed to be copied') + def read(self,flags='r'): + return Utils.readf(self.abspath(),flags) + def write(self,data,flags='w'): + f=None + try: + f=open(self.abspath(),flags) + f.write(data) + finally: + if f: + f.close() + def chmod(self,val): + os.chmod(self.abspath(),val) + def delete(self): + try: + if getattr(self,'children',None): + shutil.rmtree(self.abspath()) + else: + os.unlink(self.abspath()) + except: + pass + try: + delattr(self,'children') + except: + pass + def suffix(self): + k=max(0,self.name.rfind('.')) + return self.name[k:] + def height(self): + d=self + val=-1 + while d: + d=d.parent + val+=1 + return val + def listdir(self): + lst=Utils.listdir(self.abspath()) + lst.sort() + return lst + def mkdir(self): + if getattr(self,'cache_isdir',None): + return + try: + self.parent.mkdir() + except: + pass + if self.name: + try: + os.makedirs(self.abspath()) + except OSError: + pass + if not os.path.isdir(self.abspath()): + raise Errors.WafError('Could not create the directory %s'%self.abspath()) + try: + self.children + except: + self.children={} + self.cache_isdir=True + def find_node(self,lst): + if isinstance(lst,str): + lst=[x for x in split_path(lst)if x and x!='.'] + cur=self + for x in lst: + if x=='..': + cur=cur.parent or cur + continue + try: + if x in cur.children: + cur=cur.children[x] + continue + except: + cur.children={} + cur=self.__class__(x,cur) + try: + os.stat(cur.abspath()) + except: + del cur.parent.children[x] + return None + ret=cur + try: + os.stat(ret.abspath()) + except: + del ret.parent.children[ret.name] + return None + try: + while not getattr(cur.parent,'cache_isdir',None): + cur=cur.parent + cur.cache_isdir=True + except AttributeError: + pass + return ret + def make_node(self,lst): + if isinstance(lst,str): + lst=[x for x in split_path(lst)if x and x!='.'] + cur=self + for x in lst: + if x=='..': + cur=cur.parent or cur + continue + if getattr(cur,'children',{}): + if x in cur.children: + cur=cur.children[x] + continue + else: + cur.children={} + cur=self.__class__(x,cur) + return cur + def search(self,lst): + if isinstance(lst,str): + lst=[x for x in split_path(lst)if x and x!='.'] + cur=self + try: + for x in lst: + if x=='..': + cur=cur.parent or cur + else: + cur=cur.children[x] + return cur + except: + pass + def path_from(self,node): + c1=self + c2=node + c1h=c1.height() + c2h=c2.height() + lst=[] + up=0 + while c1h>c2h: + lst.append(c1.name) + c1=c1.parent + c1h-=1 + while c2h>c1h: + up+=1 + c2=c2.parent + c2h-=1 + while id(c1)!=id(c2): + lst.append(c1.name) + up+=1 + c1=c1.parent + c2=c2.parent + for i in range(up): + lst.append('..') + lst.reverse() + return os.sep.join(lst)or'.' + def abspath(self): + try: + return self.cache_abspath + except: + pass + if os.sep=='/': + if not self.parent: + val=os.sep + elif not self.parent.name: + val=os.sep+self.name + else: + val=self.parent.abspath()+os.sep+self.name + else: + if not self.parent: + val='' + elif not self.parent.name: + val=self.name+os.sep + else: + val=self.parent.abspath().rstrip(os.sep)+os.sep+self.name + self.cache_abspath=val + return val + def is_child_of(self,node): + p=self + diff=self.height()-node.height() + while diff>0: + diff-=1 + p=p.parent + return id(p)==id(node) + def ant_iter(self,accept=None,maxdepth=25,pats=[],dir=False,src=True,remove=True): + dircont=self.listdir() + dircont.sort() + try: + lst=set(self.children.keys()) + if remove: + for x in lst-set(dircont): + del self.children[x] + except: + self.children={} + for name in dircont: + npats=accept(name,pats) + if npats and npats[0]: + accepted=[]in npats[0] + node=self.make_node([name]) + isdir=os.path.isdir(node.abspath()) + if accepted: + if isdir: + if dir: + yield node + else: + if src: + yield node + if getattr(node,'cache_isdir',None)or isdir: + node.cache_isdir=True + if maxdepth: + for k in node.ant_iter(accept=accept,maxdepth=maxdepth-1,pats=npats,dir=dir,src=src,remove=remove): + yield k + raise StopIteration + def ant_glob(self,*k,**kw): + src=kw.get('src',True) + dir=kw.get('dir',False) + excl=kw.get('excl',exclude_regs) + incl=k and k[0]or kw.get('incl','**') + def to_pat(s): + lst=Utils.to_list(s) + ret=[] + for x in lst: + x=x.replace('\\','/').replace('//','/') + if x.endswith('/'): + x+='**' + lst2=x.split('/') + accu=[] + for k in lst2: + if k=='**': + accu.append(k) + else: + k=k.replace('.','[.]').replace('*','.*').replace('?','.').replace('+','\\+') + k='^%s$'%k + try: + accu.append(re.compile(k)) + except Exception ,e: + raise Errors.WafError("Invalid pattern: %s"%k,e) + ret.append(accu) + return ret + def filtre(name,nn): + ret=[] + for lst in nn: + if not lst: + pass + elif lst[0]=='**': + ret.append(lst) + if len(lst)>1: + if lst[1].match(name): + ret.append(lst[2:]) + else: + ret.append([]) + elif lst[0].match(name): + ret.append(lst[1:]) + return ret + def accept(name,pats): + nacc=filtre(name,pats[0]) + nrej=filtre(name,pats[1]) + if[]in nrej: + nacc=[] + return[nacc,nrej] + ret=[x for x in self.ant_iter(accept=accept,pats=[to_pat(incl),to_pat(excl)],maxdepth=25,dir=dir,src=src,remove=kw.get('remove',True))] + if kw.get('flat',False): + return' '.join([x.path_from(self)for x in ret]) + return ret + def find_nodes(self,find_dirs=True,find_files=True,match_fun=lambda x:True): + x=""" + Recursively finds nodes:: + + def configure(cnf): + cnf.find_nodes() + + :param find_dirs: whether to return directories + :param find_files: whether to return files + :param match_fun: matching function, taking a node as parameter + :rtype generator + :return: a generator that iterates over all the requested files + """ + files=self.listdir() + for f in files: + node=self.make_node([f]) + if os.path.isdir(node.abspath()): + if find_dirs and match_fun(node): + yield node + gen=node.find_nodes(find_dirs,find_files,match_fun) + for g in gen: + yield g + else: + if find_files and match_fun(node): + yield node + def is_src(self): + cur=self + x=id(self.ctx.srcnode) + y=id(self.ctx.bldnode) + while cur.parent: + if id(cur)==y: + return False + if id(cur)==x: + return True + cur=cur.parent + return False + def is_bld(self): + cur=self + y=id(self.ctx.bldnode) + while cur.parent: + if id(cur)==y: + return True + cur=cur.parent + return False + def get_src(self): + cur=self + x=id(self.ctx.srcnode) + y=id(self.ctx.bldnode) + lst=[] + while cur.parent: + if id(cur)==y: + lst.reverse() + return self.ctx.srcnode.make_node(lst) + if id(cur)==x: + return self + lst.append(cur.name) + cur=cur.parent + return self + def get_bld(self): + cur=self + x=id(self.ctx.srcnode) + y=id(self.ctx.bldnode) + lst=[] + while cur.parent: + if id(cur)==y: + return self + if id(cur)==x: + lst.reverse() + return self.ctx.bldnode.make_node(lst) + lst.append(cur.name) + cur=cur.parent + lst.reverse() + if lst and Utils.is_win32 and len(lst[0])==2 and lst[0].endswith(':'): + lst[0]=lst[0][0] + return self.ctx.bldnode.make_node(['__root__']+lst) + def find_resource(self,lst): + if isinstance(lst,str): + lst=[x for x in split_path(lst)if x and x!='.'] + node=self.get_bld().search(lst) + if not node: + self=self.get_src() + node=self.find_node(lst) + try: + pat=node.abspath() + if os.path.isdir(pat): + return None + except: + pass + return node + def find_or_declare(self,lst): + if isinstance(lst,str): + lst=[x for x in split_path(lst)if x and x!='.'] + node=self.get_bld().search(lst) + if node: + if not os.path.isfile(node.abspath()): + node.sig=None + try: + node.parent.mkdir() + except: + pass + return node + self=self.get_src() + node=self.find_node(lst) + if node: + if not os.path.isfile(node.abspath()): + node.sig=None + try: + node.parent.mkdir() + except: + pass + return node + node=self.get_bld().make_node(lst) + node.parent.mkdir() + return node + def find_dir(self,lst): + if isinstance(lst,str): + lst=[x for x in split_path(lst)if x and x!='.'] + node=self.find_node(lst) + try: + if not os.path.isdir(node.abspath()): + return None + except(OSError,AttributeError): + return None + return node + def change_ext(self,ext,ext_in=None): + name=self.name + if ext_in is None: + k=name.rfind('.') + if k>=0: + name=name[:k]+ext + else: + name=name+ext + else: + name=name[:-len(ext_in)]+ext + return self.parent.find_or_declare([name]) + def nice_path(self,env=None): + return self.path_from(self.ctx.launch_node()) + def bldpath(self): + return self.path_from(self.ctx.bldnode) + def srcpath(self): + return self.path_from(self.ctx.srcnode) + def relpath(self): + cur=self + x=id(self.ctx.bldnode) + while cur.parent: + if id(cur)==x: + return self.bldpath() + cur=cur.parent + return self.srcpath() + def bld_dir(self): + return self.parent.bldpath() + def bld_base(self): + s=os.path.splitext(self.name)[0] + return self.bld_dir()+os.sep+s + def get_bld_sig(self): + try: + ret=self.ctx.hash_cache[id(self)] + except KeyError: + pass + except AttributeError: + self.ctx.hash_cache={} + else: + return ret + if not self.is_bld()or self.ctx.bldnode is self.ctx.srcnode: + self.sig=Utils.h_file(self.abspath()) + self.ctx.hash_cache[id(self)]=ret=self.sig + return ret +pickle_lock=Utils.threading.Lock() +class Nod3(Node): + pass --- /dev/null +++ b/waflib/Options.py @@ -0,0 +1,134 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,tempfile,optparse,sys,re +from waflib import Logs,Utils,Context +cmds='distclean configure build install clean uninstall check dist distcheck'.split() +options={} +commands=[] +lockfile=os.environ.get('WAFLOCK','.lock-waf_%s_build'%sys.platform) +try:cache_global=os.path.abspath(os.environ['WAFCACHE']) +except KeyError:cache_global='' +platform=Utils.unversioned_sys_platform() +class opt_parser(optparse.OptionParser): + def __init__(self,ctx): + optparse.OptionParser.__init__(self,conflict_handler="resolve",version='waf %s (%s)'%(Context.WAFVERSION,Context.WAFREVISION)) + self.formatter.width=Logs.get_term_cols() + p=self.add_option + self.ctx=ctx + jobs=ctx.jobs() + p('-j','--jobs',dest='jobs',default=jobs,type='int',help='amount of parallel jobs (%r)'%jobs) + p('-k','--keep',dest='keep',default=0,action='count',help='keep running happily even if errors are found') + p('-v','--verbose',dest='verbose',default=0,action='count',help='verbosity level -v -vv or -vvv [default: 0]') + p('--nocache',dest='nocache',default=False,action='store_true',help='ignore the WAFCACHE (if set)') + p('--zones',dest='zones',default='',action='store',help='debugging zones (task_gen, deps, tasks, etc)') + gr=optparse.OptionGroup(self,'configure options') + self.add_option_group(gr) + gr.add_option('-o','--out',action='store',default='',help='build dir for the project',dest='out') + gr.add_option('-t','--top',action='store',default='',help='src dir for the project',dest='top') + default_prefix=os.environ.get('PREFIX') + if not default_prefix: + if platform=='win32': + d=tempfile.gettempdir() + default_prefix=d[0].upper()+d[1:] + else: + default_prefix='/usr/local/' + gr.add_option('--prefix',dest='prefix',default=default_prefix,help='installation prefix [default: %r]'%default_prefix) + gr.add_option('--download',dest='download',default=False,action='store_true',help='try to download the tools if missing') + gr=optparse.OptionGroup(self,'build and install options') + self.add_option_group(gr) + gr.add_option('-p','--progress',dest='progress_bar',default=0,action='count',help='-p: progress bar; -pp: ide output') + gr.add_option('--targets',dest='targets',default='',action='store',help='task generators, e.g. "target1,target2"') + gr=optparse.OptionGroup(self,'step options') + self.add_option_group(gr) + gr.add_option('--files',dest='files',default='',action='store',help='files to process, by regexp, e.g. "*/main.c,*/test/main.o"') + default_destdir=os.environ.get('DESTDIR','') + gr=optparse.OptionGroup(self,'install/uninstall options') + self.add_option_group(gr) + gr.add_option('--destdir',help='installation root [default: %r]'%default_destdir,default=default_destdir,dest='destdir') + gr.add_option('-f','--force',dest='force',default=False,action='store_true',help='force file installation') + def get_usage(self): + cmds_str={} + for cls in Context.classes: + if not cls.cmd or cls.cmd=='options': + continue + s=cls.__doc__ or'' + cmds_str[cls.cmd]=s + if Context.g_module: + for(k,v)in Context.g_module.__dict__.items(): + if k in['options','init','shutdown']: + continue + if type(v)is type(Context.create_context): + if v.__doc__ and not k.startswith('_'): + cmds_str[k]=v.__doc__ + just=0 + for k in cmds_str: + just=max(just,len(k)) + lst=[' %s: %s'%(k.ljust(just),v)for(k,v)in cmds_str.items()] + lst.sort() + ret='\n'.join(lst) + return'''waf [commands] [options] + +Main commands (example: ./waf build -j4) +%s +'''%ret +class OptionsContext(Context.Context): + cmd='options' + fun='options' + def __init__(self,**kw): + super(OptionsContext,self).__init__(**kw) + self.parser=opt_parser(self) + self.option_groups={} + def jobs(self): + count=int(os.environ.get('JOBS',0)) + if count<1: + if'NUMBER_OF_PROCESSORS'in os.environ: + count=int(os.environ.get('NUMBER_OF_PROCESSORS',1)) + else: + if hasattr(os,'sysconf_names'): + if'SC_NPROCESSORS_ONLN'in os.sysconf_names: + count=int(os.sysconf('SC_NPROCESSORS_ONLN')) + elif'SC_NPROCESSORS_CONF'in os.sysconf_names: + count=int(os.sysconf('SC_NPROCESSORS_CONF')) + if not count and os.name not in('nt','java'): + try: + tmp=self.cmd_and_log(['sysctl','-n','hw.ncpu'],quiet=0) + except Exception: + pass + else: + if re.match('^[0-9]+$',tmp): + count=int(tmp) + if count<1: + count=1 + elif count>1024: + count=1024 + return count + def add_option(self,*k,**kw): + self.parser.add_option(*k,**kw) + def add_option_group(self,*k,**kw): + try: + gr=self.option_groups[k[0]] + except: + gr=self.parser.add_option_group(*k,**kw) + self.option_groups[k[0]]=gr + return gr + def get_option_group(self,opt_str): + try: + return self.option_groups[opt_str] + except KeyError: + for group in self.parser.option_groups: + if group.title==opt_str: + return group + return None + def parse_args(self,_args=None): + global options,commands + (options,leftover_args)=self.parser.parse_args(args=_args) + commands=leftover_args + if options.destdir: + options.destdir=os.path.abspath(os.path.expanduser(options.destdir)) + if options.verbose>=1: + self.load('errcheck') + def execute(self): + super(OptionsContext,self).execute() + self.parse_args() --- /dev/null +++ b/waflib/Runner.py @@ -0,0 +1,197 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import random,atexit +try: + from queue import Queue +except: + from Queue import Queue +from waflib import Utils,Task,Errors,Logs +GAP=10 +class TaskConsumer(Utils.threading.Thread): + def __init__(self): + Utils.threading.Thread.__init__(self) + self.ready=Queue() + self.setDaemon(1) + self.start() + def run(self): + try: + self.loop() + except: + pass + def loop(self): + while 1: + tsk=self.ready.get() + if not isinstance(tsk,Task.TaskBase): + tsk(self) + else: + tsk.process() +pool=Queue() +def get_pool(): + try: + return pool.get(False) + except: + return TaskConsumer() +def put_pool(x): + pool.put(x) +def _free_resources(): + global pool + lst=[] + while pool.qsize(): + lst.append(pool.get()) + for x in lst: + x.ready.put(None) + for x in lst: + x.join() + pool=None +atexit.register(_free_resources) +class Parallel(object): + def __init__(self,bld,j=2): + self.numjobs=j + self.bld=bld + self.outstanding=[] + self.frozen=[] + self.out=Queue(0) + self.count=0 + self.processed=1 + self.stop=False + self.error=[] + self.biter=None + self.dirty=False + def get_next_task(self): + if not self.outstanding: + return None + return self.outstanding.pop(0) + def postpone(self,tsk): + if random.randint(0,1): + self.frozen.insert(0,tsk) + else: + self.frozen.append(tsk) + def refill_task_list(self): + while self.count>self.numjobs*GAP: + self.get_out() + while not self.outstanding: + if self.count: + self.get_out() + elif self.frozen: + try: + cond=self.deadlock==self.processed + except: + pass + else: + if cond: + msg='check the build order for the tasks' + for tsk in self.frozen: + if not tsk.run_after: + msg='check the methods runnable_status' + break + lst=[] + for tsk in self.frozen: + lst.append('%s\t-> %r'%(repr(tsk),[id(x)for x in tsk.run_after])) + raise Errors.WafError('Deadlock detected: %s%s'%(msg,''.join(lst))) + self.deadlock=self.processed + if self.frozen: + self.outstanding+=self.frozen + self.frozen=[] + elif not self.count: + self.outstanding.extend(self.biter.next()) + self.total=self.bld.total() + break + def add_more_tasks(self,tsk): + if getattr(tsk,'more_tasks',None): + self.outstanding+=tsk.more_tasks + self.total+=len(tsk.more_tasks) + def get_out(self): + tsk=self.out.get() + if not self.stop: + self.add_more_tasks(tsk) + self.count-=1 + self.dirty=True + return tsk + def error_handler(self,tsk): + if not self.bld.keep: + self.stop=True + self.error.append(tsk) + def add_task(self,tsk): + try: + self.pool + except AttributeError: + self.init_task_pool() + self.ready.put(tsk) + def init_task_pool(self): + pool=self.pool=[get_pool()for i in range(self.numjobs)] + self.ready=Queue(0) + def setq(consumer): + consumer.ready=self.ready + for x in pool: + x.ready.put(setq) + return pool + def free_task_pool(self): + def setq(consumer): + consumer.ready=Queue(0) + self.out.put(self) + try: + pool=self.pool + except: + pass + else: + for x in pool: + self.ready.put(setq) + for x in pool: + self.get_out() + for x in pool: + put_pool(x) + self.pool=[] + def start(self): + self.total=self.bld.total() + while not self.stop: + self.refill_task_list() + tsk=self.get_next_task() + if not tsk: + if self.count: + continue + else: + break + if tsk.hasrun: + self.processed+=1 + continue + if self.stop: + break + try: + st=tsk.runnable_status() + except Exception: + self.processed+=1 + tsk.err_msg=Utils.ex_stack() + if not self.stop and self.bld.keep: + tsk.hasrun=Task.SKIPPED + if self.bld.keep==1: + if Logs.verbose>1 or not self.error: + self.error.append(tsk) + self.stop=True + else: + if Logs.verbose>1: + self.error.append(tsk) + continue + tsk.hasrun=Task.EXCEPTION + self.error_handler(tsk) + continue + if st==Task.ASK_LATER: + self.postpone(tsk) + elif st==Task.SKIP_ME: + self.processed+=1 + tsk.hasrun=Task.SKIPPED + self.add_more_tasks(tsk) + else: + tsk.position=(self.processed,self.total) + self.count+=1 + tsk.master=self + self.processed+=1 + if self.numjobs==1: + tsk.process() + else: + self.add_task(tsk) + while self.error and self.count: + self.get_out() + assert(self.count==0 or self.stop) + self.free_task_pool() --- /dev/null +++ b/waflib/Scripting.py @@ -0,0 +1,367 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,shutil,traceback,errno,sys,stat +from waflib import Utils,Configure,Logs,Options,ConfigSet,Context,Errors,Build,Node +build_dir_override=None +no_climb_commands=['configure'] +default_cmd="build" +def waf_entry_point(current_directory,version,wafdir): + Logs.init_log() + if Context.WAFVERSION!=version: + Logs.error('Waf script %r and library %r do not match (directory %r)'%(version,Context.WAFVERSION,wafdir)) + sys.exit(1) + if'--version'in sys.argv: + Context.run_dir=current_directory + ctx=Context.create_context('options') + ctx.curdir=current_directory + ctx.parse_args() + sys.exit(0) + Context.waf_dir=wafdir + Context.launch_dir=current_directory + no_climb=os.environ.get('NOCLIMB',None) + if not no_climb: + for k in no_climb_commands: + if k in sys.argv: + no_climb=True + break + cur=current_directory + while cur: + lst=os.listdir(cur) + if Options.lockfile in lst: + env=ConfigSet.ConfigSet() + try: + env.load(os.path.join(cur,Options.lockfile)) + ino=os.stat(cur)[stat.ST_INO] + except Exception: + pass + else: + for x in[env.run_dir,env.top_dir,env.out_dir]: + if Utils.is_win32: + if cur==x: + load=True + break + else: + try: + ino2=os.stat(x)[stat.ST_INO] + except: + pass + else: + if ino==ino2: + load=True + break + else: + Logs.warn('invalid lock file in %s'%cur) + load=False + if load: + Context.run_dir=env.run_dir + Context.top_dir=env.top_dir + Context.out_dir=env.out_dir + break + if not Context.run_dir: + if Context.WSCRIPT_FILE in lst: + Context.run_dir=cur + next=os.path.dirname(cur) + if next==cur: + break + cur=next + if no_climb: + break + if not Context.run_dir: + if'-h'in sys.argv or'--help'in sys.argv: + Logs.warn('No wscript file found: the help message may be incomplete') + Context.run_dir=current_directory + ctx=Context.create_context('options') + ctx.curdir=current_directory + ctx.parse_args() + sys.exit(0) + Logs.error('Waf: Run from a directory containing a file named %r'%Context.WSCRIPT_FILE) + sys.exit(1) + try: + os.chdir(Context.run_dir) + except OSError: + Logs.error('Waf: The folder %r is unreadable'%Context.run_dir) + sys.exit(1) + try: + set_main_module(Context.run_dir+os.sep+Context.WSCRIPT_FILE) + except Errors.WafError ,e: + Logs.pprint('RED',e.verbose_msg) + Logs.error(str(e)) + sys.exit(1) + except Exception ,e: + Logs.error('Waf: The wscript in %r is unreadable'%Context.run_dir,e) + traceback.print_exc(file=sys.stdout) + sys.exit(2) + try: + run_commands() + except Errors.WafError ,e: + if Logs.verbose>1: + Logs.pprint('RED',e.verbose_msg) + Logs.error(e.msg) + sys.exit(1) + except Exception ,e: + traceback.print_exc(file=sys.stdout) + sys.exit(2) + except KeyboardInterrupt: + Logs.pprint('RED','Interrupted') + sys.exit(68) +def set_main_module(file_path): + Context.g_module=Context.load_module(file_path) + Context.g_module.root_path=file_path + def set_def(obj): + name=obj.__name__ + if not name in Context.g_module.__dict__: + setattr(Context.g_module,name,obj) + for k in[update,dist,distclean,distcheck,update]: + set_def(k) + if not'init'in Context.g_module.__dict__: + Context.g_module.init=Utils.nada + if not'shutdown'in Context.g_module.__dict__: + Context.g_module.shutdown=Utils.nada + if not'options'in Context.g_module.__dict__: + Context.g_module.options=Utils.nada +def parse_options(): + Context.create_context('options').execute() + if not Options.commands: + Options.commands=[default_cmd] + Options.commands=[x for x in Options.commands if x!='options'] + Logs.verbose=Options.options.verbose + Logs.init_log() + if Options.options.zones: + Logs.zones=Options.options.zones.split(',') + if not Logs.verbose: + Logs.verbose=1 + elif Logs.verbose>0: + Logs.zones=['runner'] + if Logs.verbose>2: + Logs.zones=['*'] +def run_command(cmd_name): + ctx=Context.create_context(cmd_name) + ctx.options=Options.options + ctx.cmd=cmd_name + ctx.execute() + return ctx +def run_commands(): + parse_options() + run_command('init') + while Options.commands: + cmd_name=Options.commands.pop(0) + timer=Utils.Timer() + run_command(cmd_name) + if not Options.options.progress_bar: + elapsed=' (%s)'%str(timer) + Logs.info('%r finished successfully%s'%(cmd_name,elapsed)) + run_command('shutdown') +def _can_distclean(name): + for k in'.o .moc .exe'.split(): + if name.endswith(k): + return True + return False +def distclean_dir(dirname): + for(root,dirs,files)in os.walk(dirname): + for f in files: + if _can_distclean(f): + fname=root+os.sep+f + try: + os.unlink(fname) + except: + Logs.warn('could not remove %r'%fname) + for x in[Context.DBFILE,'config.log']: + try: + os.unlink(x) + except: + pass + try: + shutil.rmtree('c4che') + except: + pass +def distclean(ctx): + '''removes the build directory''' + lst=os.listdir('.') + for f in lst: + if f==Options.lockfile: + try: + proj=ConfigSet.ConfigSet(f) + except: + Logs.warn('could not read %r'%f) + continue + if proj['out_dir']!=proj['top_dir']: + try: + shutil.rmtree(proj['out_dir']) + except IOError: + pass + except OSError ,e: + if e.errno!=errno.ENOENT: + Logs.warn('project %r cannot be removed'%proj[Context.OUT]) + else: + distclean_dir(proj['out_dir']) + for k in(proj['out_dir'],proj['top_dir'],proj['run_dir']): + try: + os.remove(os.path.join(k,Options.lockfile)) + except OSError ,e: + if e.errno!=errno.ENOENT: + Logs.warn('file %r cannot be removed'%f) + if f.startswith('.waf')and not Options.commands: + shutil.rmtree(f,ignore_errors=True) +class Dist(Context.Context): + cmd='dist' + fun='dist' + algo='tar.bz2' + ext_algo={} + def execute(self): + self.recurse([os.path.dirname(Context.g_module.root_path)]) + self.archive() + def archive(self): + import tarfile + arch_name=self.get_arch_name() + try: + self.base_path + except: + self.base_path=self.path + node=self.base_path.make_node(arch_name) + try: + node.delete() + except: + pass + files=self.get_files() + if self.algo.startswith('tar.'): + tar=tarfile.open(arch_name,'w:'+self.algo.replace('tar.','')) + for x in files: + self.add_tar_file(x,tar) + tar.close() + elif self.algo=='zip': + import zipfile + zip=zipfile.ZipFile(arch_name,'w',compression=zipfile.ZIP_DEFLATED) + for x in files: + archive_name=self.get_base_name()+'/'+x.path_from(self.base_path) + zip.write(x.abspath(),archive_name,zipfile.ZIP_DEFLATED) + zip.close() + else: + self.fatal('Valid algo types are tar.bz2, tar.gz or zip') + try: + from hashlib import sha1 as sha + except ImportError: + from sha import sha + try: + digest=" (sha=%r)"%sha(node.read()).hexdigest() + except: + digest='' + Logs.info('New archive created: %s%s'%(self.arch_name,digest)) + def get_tar_path(self,node): + return node.abspath() + def add_tar_file(self,x,tar): + p=self.get_tar_path(x) + tinfo=tar.gettarinfo(name=p,arcname=self.get_tar_prefix()+'/'+x.path_from(self.base_path)) + tinfo.uid=0 + tinfo.gid=0 + tinfo.uname='root' + tinfo.gname='root' + fu=None + try: + fu=open(p,'rb') + tar.addfile(tinfo,fileobj=fu) + finally: + if fu: + fu.close() + def get_tar_prefix(self): + try: + return self.tar_prefix + except: + return self.get_base_name() + def get_arch_name(self): + try: + self.arch_name + except: + self.arch_name=self.get_base_name()+'.'+self.ext_algo.get(self.algo,self.algo) + return self.arch_name + def get_base_name(self): + try: + self.base_name + except: + appname=getattr(Context.g_module,Context.APPNAME,'noname') + version=getattr(Context.g_module,Context.VERSION,'1.0') + self.base_name=appname+'-'+version + return self.base_name + def get_excl(self): + try: + return self.excl + except: + self.excl=Node.exclude_regs+' **/waf-1.6.* **/.waf-1.6* **/waf3-1.6.* **/.waf3-1.6* **/*~ **/*.rej **/*.orig **/*.pyc **/*.pyo **/*.bak **/*.swp **/.lock-w*' + nd=self.root.find_node(Context.out_dir) + if nd: + self.excl+=' '+nd.path_from(self.base_path) + return self.excl + def get_files(self): + try: + files=self.files + except: + files=self.base_path.ant_glob('**/*',excl=self.get_excl()) + return files +def dist(ctx): + '''makes a tarball for redistributing the sources''' + pass +class DistCheck(Dist): + fun='distcheck' + cmd='distcheck' + def execute(self): + self.recurse([os.path.dirname(Context.g_module.root_path)]) + self.archive() + self.check() + def check(self): + import tempfile,tarfile + t=None + try: + t=tarfile.open(self.get_arch_name()) + for x in t: + t.extract(x) + finally: + if t: + t.close() + instdir=tempfile.mkdtemp('.inst',self.get_base_name()) + ret=Utils.subprocess.Popen([sys.argv[0],'configure','install','uninstall','--destdir='+instdir],cwd=self.get_base_name()).wait() + if ret: + raise Errors.WafError('distcheck failed with code %i'%ret) + if os.path.exists(instdir): + raise Errors.WafError('distcheck succeeded, but files were left in %s'%instdir) + shutil.rmtree(self.get_base_name()) +def distcheck(ctx): + '''checks if the project compiles (tarball from 'dist')''' + pass +def update(ctx): + '''updates the plugins from the *waflib/extras* directory''' + lst=Options.options.files.split(',') + if not lst: + lst=[x for x in Utils.listdir(Context.waf_dir+'/waflib/extras')if x.endswith('.py')] + for x in lst: + tool=x.replace('.py','') + try: + Configure.download_tool(tool,force=True,ctx=ctx) + except Errors.WafError: + Logs.error('Could not find the tool %s in the remote repository'%x) +def autoconfigure(execute_method): + def execute(self): + if not Configure.autoconfig: + return execute_method(self) + env=ConfigSet.ConfigSet() + do_config=False + try: + env.load(os.path.join(Context.top_dir,Options.lockfile)) + except Exception: + Logs.warn('Configuring the project') + do_config=True + else: + if env.run_dir!=Context.run_dir: + do_config=True + else: + h=0 + for f in env['files']: + h=hash((h,Utils.readf(f,'rb'))) + do_config=h!=env.hash + if do_config: + Options.commands.insert(0,self.cmd) + Options.commands.insert(0,'configure') + return + return execute_method(self) + return execute +Build.BuildContext.execute=autoconfigure(Build.BuildContext.execute) --- /dev/null +++ b/waflib/Task.py @@ -0,0 +1,672 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,shutil,re,tempfile +from waflib import Utils,Logs,Errors +NOT_RUN=0 +MISSING=1 +CRASHED=2 +EXCEPTION=3 +SKIPPED=8 +SUCCESS=9 +ASK_LATER=-1 +SKIP_ME=-2 +RUN_ME=-3 +COMPILE_TEMPLATE_SHELL=''' +def f(tsk): + env = tsk.env + gen = tsk.generator + bld = gen.bld + wd = getattr(tsk, 'cwd', None) + p = env.get_flat + tsk.last_cmd = cmd = \'\'\' %s \'\'\' % s + return tsk.exec_command(cmd, cwd=wd, env=env.env or None) +''' +COMPILE_TEMPLATE_NOSHELL=''' +def f(tsk): + env = tsk.env + gen = tsk.generator + bld = gen.bld + wd = getattr(tsk, 'cwd', None) + def to_list(xx): + if isinstance(xx, str): return [xx] + return xx + tsk.last_cmd = lst = [] + %s + lst = [x for x in lst if x] + return tsk.exec_command(lst, cwd=wd, env=env.env or None) +''' +def cache_outputs(cls): + m1=cls.run + def run(self): + bld=self.generator.bld + if bld.cache_global and not bld.nocache: + if self.can_retrieve_cache(): + return 0 + return m1(self) + cls.run=run + m2=cls.post_run + def post_run(self): + bld=self.generator.bld + ret=m2(self) + if bld.cache_global and not bld.nocache: + self.put_files_cache() + return ret + cls.post_run=post_run + return cls +classes={} +class store_task_type(type): + def __init__(cls,name,bases,dict): + super(store_task_type,cls).__init__(name,bases,dict) + name=cls.__name__ + if name.endswith('_task'): + name=name.replace('_task','') + if name!='evil'and name!='TaskBase': + global classes + if getattr(cls,'run_str',None): + (f,dvars)=compile_fun(cls.run_str,cls.shell) + cls.hcode=cls.run_str + cls.run_str=None + cls.run=f + cls.vars=list(set(cls.vars+dvars)) + cls.vars.sort() + elif getattr(cls,'run',None)and not'hcode'in cls.__dict__: + cls.hcode=Utils.h_fun(cls.run) + if not getattr(cls,'nocache',None): + cls=cache_outputs(cls) + classes[name]=cls +evil=store_task_type('evil',(object,),{}) +class TaskBase(evil): + color='GREEN' + ext_in=[] + ext_out=[] + before=[] + after=[] + hcode='' + def __init__(self,*k,**kw): + self.hasrun=NOT_RUN + try: + self.generator=kw['generator'] + except KeyError: + self.generator=self + def __repr__(self): + return'\n\t{task %r: %s %s}'%(self.__class__.__name__,id(self),str(getattr(self,'fun',''))) + def __str__(self): + if hasattr(self,'fun'): + return'executing: %s\n'%self.fun.__name__ + return self.__class__.__name__+'\n' + def __hash__(self): + return id(self) + def exec_command(self,cmd,**kw): + bld=self.generator.bld + try: + if not kw.get('cwd',None): + kw['cwd']=bld.cwd + except AttributeError: + bld.cwd=kw['cwd']=bld.variant_dir + return bld.exec_command(cmd,**kw) + def runnable_status(self): + return RUN_ME + def process(self): + m=self.master + if m.stop: + m.out.put(self) + return + try: + del self.generator.bld.task_sigs[self.uid()] + except: + pass + try: + self.generator.bld.returned_tasks.append(self) + self.log_display(self.generator.bld) + ret=self.run() + except Exception: + self.err_msg=Utils.ex_stack() + self.hasrun=EXCEPTION + m.error_handler(self) + m.out.put(self) + return + if ret: + self.err_code=ret + self.hasrun=CRASHED + else: + try: + self.post_run() + except Errors.WafError: + pass + except Exception: + self.err_msg=Utils.ex_stack() + self.hasrun=EXCEPTION + else: + self.hasrun=SUCCESS + if self.hasrun!=SUCCESS: + m.error_handler(self) + m.out.put(self) + def run(self): + if hasattr(self,'fun'): + return self.fun(self) + return 0 + def post_run(self): + pass + def log_display(self,bld): + bld.to_log(self.display()) + def display(self): + col1=Logs.colors(self.color) + col2=Logs.colors.NORMAL + master=self.master + def cur(): + tmp=-1 + if hasattr(master,'ready'): + tmp-=master.ready.qsize() + return master.processed+tmp + if self.generator.bld.progress_bar==1: + return self.generator.bld.progress_line(cur(),master.total,col1,col2) + if self.generator.bld.progress_bar==2: + ela=str(self.generator.bld.timer) + try: + ins=','.join([n.name for n in self.inputs]) + except AttributeError: + ins='' + try: + outs=','.join([n.name for n in self.outputs]) + except AttributeError: + outs='' + return'|Total %s|Current %s|Inputs %s|Outputs %s|Time %s|\n'%(master.total,cur(),ins,outs,ela) + s=str(self) + if not s: + return None + total=master.total + n=len(str(total)) + fs='[%%%dd/%%%dd] %%s%%s%%s'%(n,n) + return fs%(cur(),total,col1,s,col2) + def attr(self,att,default=None): + ret=getattr(self,att,self) + if ret is self:return getattr(self.__class__,att,default) + return ret + def hash_constraints(self): + cls=self.__class__ + tup=(str(cls.before),str(cls.after),str(cls.ext_in),str(cls.ext_out),cls.__name__,cls.hcode) + h=hash(tup) + return h + def format_error(self): + msg=getattr(self,'last_cmd','') + name=getattr(self.generator,'name','') + if getattr(self,"err_msg",None): + return self.err_msg + elif not self.hasrun: + return'task in %r was not executed for some reason: %r'%(name,self) + elif self.hasrun==CRASHED: + try: + return' -> task in %r failed (exit status %r): %r\n%r'%(name,self.err_code,self,msg) + except AttributeError: + return' -> task in %r failed: %r\n%r'%(name,self,msg) + elif self.hasrun==MISSING: + return' -> missing files in %r: %r\n%r'%(name,self,msg) + else: + return'invalid status for task in %r: %r'%(name,self.hasrun) + def colon(self,var1,var2): + tmp=self.env[var1] + if isinstance(var2,str): + it=self.env[var2] + else: + it=var2 + if isinstance(tmp,str): + return[tmp%x for x in it] + else: + if Logs.verbose and not tmp and it: + Logs.warn('Missing env variable %r for task %r (generator %r)'%(var1,self,self.generator)) + lst=[] + for y in it: + lst.extend(tmp) + lst.append(y) + return lst +class Task(TaskBase): + vars=[] + shell=False + def __init__(self,*k,**kw): + TaskBase.__init__(self,*k,**kw) + self.env=kw['env'] + self.inputs=[] + self.outputs=[] + self.dep_nodes=[] + self.run_after=set([]) + def __str__(self): + env=self.env + src_str=' '.join([a.nice_path(env)for a in self.inputs]) + tgt_str=' '.join([a.nice_path(env)for a in self.outputs]) + if self.outputs:sep=' -> ' + else:sep='' + return'%s: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),src_str,sep,tgt_str) + def __repr__(self): + return"".join(['\n\t{task %r: '%id(self),self.__class__.__name__," ",",".join([x.name for x in self.inputs])," -> ",",".join([x.name for x in self.outputs]),'}']) + def uid(self): + try: + return self.uid_ + except AttributeError: + m=Utils.md5() + up=m.update + up(self.__class__.__name__) + for x in self.inputs+self.outputs: + up(x.abspath()) + self.uid_=m.digest() + return self.uid_ + def set_inputs(self,inp): + if isinstance(inp,list):self.inputs+=inp + else:self.inputs.append(inp) + def set_outputs(self,out): + if isinstance(out,list):self.outputs+=out + else:self.outputs.append(out) + def set_run_after(self,task): + assert isinstance(task,TaskBase) + self.run_after.add(task) + def signature(self): + try:return self.cache_sig + except AttributeError:pass + self.m=Utils.md5() + self.m.update(self.hcode) + self.sig_explicit_deps() + self.sig_vars() + if self.scan: + try: + self.sig_implicit_deps() + except Errors.TaskRescan: + return self.signature() + ret=self.cache_sig=self.m.digest() + return ret + def runnable_status(self): + for t in self.run_after: + if not t.hasrun: + return ASK_LATER + bld=self.generator.bld + try: + new_sig=self.signature() + except Errors.TaskNotReady: + return ASK_LATER + key=self.uid() + try: + prev_sig=bld.task_sigs[key] + except KeyError: + Logs.debug("task: task %r must run as it was never run before or the task code changed"%self) + return RUN_ME + for node in self.outputs: + try: + if node.sig!=new_sig: + return RUN_ME + except AttributeError: + Logs.debug("task: task %r must run as the output nodes do not exist"%self) + return RUN_ME + if new_sig!=prev_sig: + return RUN_ME + return SKIP_ME + def post_run(self): + bld=self.generator.bld + sig=self.signature() + for node in self.outputs: + try: + os.stat(node.abspath()) + except OSError: + self.hasrun=MISSING + self.err_msg='-> missing file: %r'%node.abspath() + raise Errors.WafError(self.err_msg) + node.sig=sig + bld.task_sigs[self.uid()]=self.cache_sig + def sig_explicit_deps(self): + bld=self.generator.bld + upd=self.m.update + for x in self.inputs+self.dep_nodes: + try: + upd(x.get_bld_sig()) + except(AttributeError,TypeError): + raise Errors.WafError('Missing node signature for %r (required by %r)'%(x,self)) + if bld.deps_man: + additional_deps=bld.deps_man + for x in self.inputs+self.outputs: + try: + d=additional_deps[id(x)] + except KeyError: + continue + for v in d: + if isinstance(v,bld.root.__class__): + try: + v=v.get_bld_sig() + except AttributeError: + raise Errors.WafError('Missing node signature for %r (required by %r)'%(v,self)) + elif hasattr(v,'__call__'): + v=v() + upd(v) + return self.m.digest() + def sig_vars(self): + bld=self.generator.bld + env=self.env + upd=self.m.update + act_sig=bld.hash_env_vars(env,self.__class__.vars) + upd(act_sig) + dep_vars=getattr(self,'dep_vars',None) + if dep_vars: + upd(bld.hash_env_vars(env,dep_vars)) + return self.m.digest() + scan=None + def sig_implicit_deps(self): + bld=self.generator.bld + key=self.uid() + prev=bld.task_sigs.get((key,'imp'),[]) + if prev: + try: + if prev==self.compute_sig_implicit_deps(): + return prev + except: + for x in bld.node_deps.get(self.uid(),[]): + if x.is_child_of(bld.srcnode): + try: + os.stat(x.abspath()) + except: + try: + del x.parent.children[x.name] + except: + pass + del bld.task_sigs[(key,'imp')] + raise Errors.TaskRescan('rescan') + (nodes,names)=self.scan() + if Logs.verbose: + Logs.debug('deps: scanner for %s returned %s %s'%(str(self),str(nodes),str(names))) + bld.node_deps[key]=nodes + bld.raw_deps[key]=names + self.are_implicit_nodes_ready() + try: + bld.task_sigs[(key,'imp')]=sig=self.compute_sig_implicit_deps() + except: + if Logs.verbose: + for k in bld.node_deps.get(self.uid(),[]): + try: + k.get_bld_sig() + except: + Logs.warn('Missing signature for node %r (may cause rebuilds)'%k) + else: + return sig + def compute_sig_implicit_deps(self): + upd=self.m.update + bld=self.generator.bld + self.are_implicit_nodes_ready() + for k in bld.node_deps.get(self.uid(),[]): + upd(k.get_bld_sig()) + return self.m.digest() + def are_implicit_nodes_ready(self): + bld=self.generator.bld + try: + cache=bld.dct_implicit_nodes + except: + bld.dct_implicit_nodes=cache={} + try: + dct=cache[bld.cur] + except KeyError: + dct=cache[bld.cur]={} + for tsk in bld.cur_tasks: + for x in tsk.outputs: + dct[x]=tsk + modified=False + for x in bld.node_deps.get(self.uid(),[]): + if x in dct: + self.run_after.add(dct[x]) + modified=True + if modified: + for tsk in self.run_after: + if not tsk.hasrun: + raise Errors.TaskNotReady('not ready') + def can_retrieve_cache(self): + if not getattr(self,'outputs',None): + return None + sig=self.signature() + ssig=Utils.to_hex(self.uid())+Utils.to_hex(sig) + dname=os.path.join(self.generator.bld.cache_global,ssig) + try: + t1=os.stat(dname).st_mtime + except OSError: + return None + for node in self.outputs: + orig=os.path.join(dname,node.name) + try: + shutil.copy2(orig,node.abspath()) + os.utime(orig,None) + except(OSError,IOError): + Logs.debug('task: failed retrieving file') + return None + try: + t2=os.stat(dname).st_mtime + except OSError: + return None + if t1!=t2: + return None + for node in self.outputs: + node.sig=sig + if self.generator.bld.progress_bar<1: + self.generator.bld.to_log('restoring from cache %r\n'%node.abspath()) + self.cached=True + return True + def put_files_cache(self): + if getattr(self,'cached',None): + return None + if not getattr(self,'outputs',None): + return None + sig=self.signature() + ssig=Utils.to_hex(self.uid())+Utils.to_hex(sig) + dname=os.path.join(self.generator.bld.cache_global,ssig) + tmpdir=tempfile.mkdtemp(prefix=self.generator.bld.cache_global+os.sep+'waf') + try: + shutil.rmtree(dname) + except: + pass + try: + for node in self.outputs: + dest=os.path.join(tmpdir,node.name) + shutil.copy2(node.abspath(),dest) + except(OSError,IOError): + try: + shutil.rmtree(tmpdir) + except: + pass + else: + try: + os.rename(tmpdir,dname) + except OSError: + try: + shutil.rmtree(tmpdir) + except: + pass + else: + try: + os.chmod(dname,Utils.O755) + except: + pass +def is_before(t1,t2): + to_list=Utils.to_list + for k in to_list(t2.ext_in): + if k in to_list(t1.ext_out): + return 1 + if t1.__class__.__name__ in to_list(t2.after): + return 1 + if t2.__class__.__name__ in to_list(t1.before): + return 1 + return 0 +def set_file_constraints(tasks): + ins=Utils.defaultdict(set) + outs=Utils.defaultdict(set) + for x in tasks: + for a in getattr(x,'inputs',[])+getattr(x,'dep_nodes',[]): + ins[id(a)].add(x) + for a in getattr(x,'outputs',[]): + outs[id(a)].add(x) + links=set(ins.keys()).intersection(outs.keys()) + for k in links: + for a in ins[k]: + a.run_after.update(outs[k]) +def set_precedence_constraints(tasks): + cstr_groups=Utils.defaultdict(list) + for x in tasks: + h=x.hash_constraints() + cstr_groups[h].append(x) + keys=list(cstr_groups.keys()) + maxi=len(keys) + for i in range(maxi): + t1=cstr_groups[keys[i]][0] + for j in range(i+1,maxi): + t2=cstr_groups[keys[j]][0] + if is_before(t1,t2): + a=i + b=j + elif is_before(t2,t1): + a=j + b=i + else: + continue + for x in cstr_groups[keys[b]]: + x.run_after.update(cstr_groups[keys[a]]) +def funex(c): + dc={} + exec(c,dc) + return dc['f'] +reg_act=re.compile(r"(?P\\)|(?P\$\$)|(?P\$\{(?P\w+)(?P.*?)\})",re.M) +def compile_fun_shell(line): + extr=[] + def repl(match): + g=match.group + if g('dollar'):return"$" + elif g('backslash'):return'\\\\' + elif g('subst'):extr.append((g('var'),g('code')));return"%s" + return None + line=reg_act.sub(repl,line)or line + parm=[] + dvars=[] + app=parm.append + for(var,meth)in extr: + if var=='SRC': + if meth:app('tsk.inputs%s'%meth) + else:app('" ".join([a.path_from(bld.bldnode) for a in tsk.inputs])') + elif var=='TGT': + if meth:app('tsk.outputs%s'%meth) + else:app('" ".join([a.path_from(bld.bldnode) for a in tsk.outputs])') + elif meth: + if meth.startswith(':'): + m=meth[1:] + if m=='SRC': + m='[a.path_from(bld.bldnode) for a in tsk.inputs]' + elif m=='TGT': + m='[a.path_from(bld.bldnode) for a in tsk.outputs]' + elif m[:3]not in('tsk','gen','bld'): + dvars.extend([var,meth[1:]]) + m='%r'%m + app('" ".join(tsk.colon(%r, %s))'%(var,m)) + else: + app('%s%s'%(var,meth)) + else: + if not var in dvars:dvars.append(var) + app("p('%s')"%var) + if parm:parm="%% (%s) "%(',\n\t\t'.join(parm)) + else:parm='' + c=COMPILE_TEMPLATE_SHELL%(line,parm) + Logs.debug('action: %s'%c) + return(funex(c),dvars) +def compile_fun_noshell(line): + extr=[] + def repl(match): + g=match.group + if g('dollar'):return"$" + elif g('subst'):extr.append((g('var'),g('code')));return"<<|@|>>" + return None + line2=reg_act.sub(repl,line) + params=line2.split('<<|@|>>') + assert(extr) + buf=[] + dvars=[] + app=buf.append + for x in range(len(extr)): + params[x]=params[x].strip() + if params[x]: + app("lst.extend(%r)"%params[x].split()) + (var,meth)=extr[x] + if var=='SRC': + if meth:app('lst.append(tsk.inputs%s)'%meth) + else:app("lst.extend([a.path_from(bld.bldnode) for a in tsk.inputs])") + elif var=='TGT': + if meth:app('lst.append(tsk.outputs%s)'%meth) + else:app("lst.extend([a.path_from(bld.bldnode) for a in tsk.outputs])") + elif meth: + if meth.startswith(':'): + m=meth[1:] + if m=='SRC': + m='[a.path_from(bld.bldnode) for a in tsk.inputs]' + elif m=='TGT': + m='[a.path_from(bld.bldnode) for a in tsk.outputs]' + elif m[:3]not in('tsk','gen','bld'): + dvars.extend([var,m]) + m='%r'%m + app('lst.extend(tsk.colon(%r, %s))'%(var,m)) + else: + app('lst.extend(gen.to_list(%s%s))'%(var,meth)) + else: + app('lst.extend(to_list(env[%r]))'%var) + if not var in dvars:dvars.append(var) + if extr: + if params[-1]: + app("lst.extend(%r)"%params[-1].split()) + fun=COMPILE_TEMPLATE_NOSHELL%"\n\t".join(buf) + Logs.debug('action: %s'%fun) + return(funex(fun),dvars) +def compile_fun(line,shell=False): + if line.find('<')>0 or line.find('>')>0 or line.find('&&')>0: + shell=True + if shell: + return compile_fun_shell(line) + else: + return compile_fun_noshell(line) +def task_factory(name,func=None,vars=None,color='GREEN',ext_in=[],ext_out=[],before=[],after=[],shell=False,scan=None): + params={'vars':vars or[],'color':color,'name':name,'ext_in':Utils.to_list(ext_in),'ext_out':Utils.to_list(ext_out),'before':Utils.to_list(before),'after':Utils.to_list(after),'shell':shell,'scan':scan,} + if isinstance(func,str): + params['run_str']=func + else: + params['run']=func + cls=type(Task)(name,(Task,),params) + global classes + classes[name]=cls + return cls +def always_run(cls): + old=cls.runnable_status + def always(self): + ret=old(self) + if ret==SKIP_ME: + ret=RUN_ME + return ret + cls.runnable_status=always + return cls +def update_outputs(cls): + old_post_run=cls.post_run + def post_run(self): + old_post_run(self) + for node in self.outputs: + node.sig=Utils.h_file(node.abspath()) + self.generator.bld.task_sigs[node.abspath()]=self.uid() + cls.post_run=post_run + old_runnable_status=cls.runnable_status + def runnable_status(self): + status=old_runnable_status(self) + if status!=RUN_ME: + return status + try: + bld=self.generator.bld + prev_sig=bld.task_sigs[self.uid()] + if prev_sig==self.signature(): + for x in self.outputs: + if not x.sig or bld.task_sigs[x.abspath()]!=self.uid(): + return RUN_ME + return SKIP_ME + except KeyError: + pass + except IndexError: + pass + except AttributeError: + pass + return RUN_ME + cls.runnable_status=runnable_status + return cls --- /dev/null +++ b/waflib/TaskGen.py @@ -0,0 +1,353 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import copy,re,os +from waflib import Task,Utils,Logs,Errors,ConfigSet +feats=Utils.defaultdict(set) +class task_gen(object): + mappings={} + prec=Utils.defaultdict(list) + def __init__(self,*k,**kw): + self.source='' + self.target='' + self.meths=[] + self.prec=Utils.defaultdict(list) + self.mappings={} + self.features=[] + self.tasks=[] + if not'bld'in kw: + self.env=ConfigSet.ConfigSet() + self.idx=0 + self.path=None + else: + self.bld=kw['bld'] + self.env=self.bld.env.derive() + self.path=self.bld.path + try: + self.idx=self.bld.idx[id(self.path)]=self.bld.idx.get(id(self.path),0)+1 + except AttributeError: + self.bld.idx={} + self.idx=self.bld.idx[id(self.path)]=1 + for key,val in kw.items(): + setattr(self,key,val) + def __str__(self): + return""%(self.name,self.path.abspath()) + def __repr__(self): + lst=[] + for x in self.__dict__.keys(): + if x not in['env','bld','compiled_tasks','tasks']: + lst.append("%s=%s"%(x,repr(getattr(self,x)))) + return"bld(%s) in %s"%(", ".join(lst),self.path.abspath()) + def get_name(self): + try: + return self._name + except AttributeError: + if isinstance(self.target,list): + lst=[str(x)for x in self.target] + name=self._name=','.join(lst) + else: + name=self._name=str(self.target) + return name + def set_name(self,name): + self._name=name + name=property(get_name,set_name) + def to_list(self,val): + if isinstance(val,str):return val.split() + else:return val + def post(self): + if getattr(self,'posted',None): + return False + self.posted=True + keys=set(self.meths) + self.features=Utils.to_list(self.features) + for x in self.features+['*']: + st=feats[x] + if not st: + if not x in Task.classes: + Logs.warn('feature %r does not exist - bind at least one method to it'%x) + keys.update(list(st)) + prec={} + prec_tbl=self.prec or task_gen.prec + for x in prec_tbl: + if x in keys: + prec[x]=prec_tbl[x] + tmp=[] + for a in keys: + for x in prec.values(): + if a in x:break + else: + tmp.append(a) + out=[] + while tmp: + e=tmp.pop() + if e in keys:out.append(e) + try: + nlst=prec[e] + except KeyError: + pass + else: + del prec[e] + for x in nlst: + for y in prec: + if x in prec[y]: + break + else: + tmp.append(x) + if prec: + raise Errors.WafError('Cycle detected in the method execution %r'%prec) + out.reverse() + self.meths=out + Logs.debug('task_gen: posting %s %d'%(self,id(self))) + for x in out: + try: + v=getattr(self,x) + except AttributeError: + raise Errors.WafError('%r is not a valid task generator method'%x) + Logs.debug('task_gen: -> %s (%d)'%(x,id(self))) + v() + Logs.debug('task_gen: posted %s'%self.name) + return True + def get_hook(self,node): + name=node.name + for k in self.mappings: + if name.endswith(k): + return self.mappings[k] + for k in task_gen.mappings: + if name.endswith(k): + return task_gen.mappings[k] + raise Errors.WafError("File %r has no mapping in %r (did you forget to load a waf tool?)"%(node,task_gen.mappings.keys())) + def create_task(self,name,src=None,tgt=None): + task=Task.classes[name](env=self.env.derive(),generator=self) + if src: + task.set_inputs(src) + if tgt: + task.set_outputs(tgt) + self.tasks.append(task) + return task + def clone(self,env): + newobj=self.bld() + for x in self.__dict__: + if x in['env','bld']: + continue + elif x in['path','features']: + setattr(newobj,x,getattr(self,x)) + else: + setattr(newobj,x,copy.copy(getattr(self,x))) + newobj.posted=False + if isinstance(env,str): + newobj.env=self.bld.all_envs[env].derive() + else: + newobj.env=env.derive() + return newobj +def declare_chain(name='',rule=None,reentrant=None,color='BLUE',ext_in=[],ext_out=[],before=[],after=[],decider=None,scan=None,install_path=None,shell=False): + ext_in=Utils.to_list(ext_in) + ext_out=Utils.to_list(ext_out) + if not name: + name=rule + cls=Task.task_factory(name,rule,color=color,ext_in=ext_in,ext_out=ext_out,before=before,after=after,scan=scan,shell=shell) + def x_file(self,node): + ext=decider and decider(self,node)or cls.ext_out + if ext_in: + _ext_in=ext_in[0] + tsk=self.create_task(name,node) + cnt=0 + keys=self.mappings.keys()+self.__class__.mappings.keys() + for x in ext: + k=node.change_ext(x,ext_in=_ext_in) + tsk.outputs.append(k) + if reentrant!=None: + if cnt=','exact-version':'==','max-version':'<=',} +SNIP_FUNCTION=''' + int main() { + void *p; + p=(void*)(%s); + return 0; +} +''' +SNIP_TYPE=''' +int main() { + if ((%(type_name)s *) 0) return 0; + if (sizeof (%(type_name)s)) return 0; +} +''' +SNIP_CLASS=''' +int main() { + if ( +} +''' +SNIP_EMPTY_PROGRAM=''' +int main() { + return 0; +} +''' +SNIP_FIELD=''' +int main() { + char *off; + off = (char*) &((%(type_name)s*)0)->%(field_name)s; + return (size_t) off < sizeof(%(type_name)s); +} +''' +MACRO_TO_DESTOS={'__linux__':'linux','__GNU__':'gnu','__FreeBSD__':'freebsd','__NetBSD__':'netbsd','__OpenBSD__':'openbsd','__sun':'sunos','__hpux':'hpux','__sgi':'irix','_AIX':'aix','__CYGWIN__':'cygwin','__MSYS__':'msys','_UWIN':'uwin','_WIN64':'win32','_WIN32':'win32','__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__':'darwin','__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__':'darwin','__QNX__':'qnx','__native_client__':'nacl'} +MACRO_TO_DEST_CPU={'__x86_64__':'x86_64','__i386__':'x86','__ia64__':'ia','__mips__':'mips','__sparc__':'sparc','__alpha__':'alpha','__arm__':'arm','__hppa__':'hppa','__powerpc__':'powerpc',} +def parse_flags(self,line,uselib,env=None,force_static=False): + assert(isinstance(line,str)) + env=env or self.env + app=env.append_value + appu=env.append_unique + lex=shlex.shlex(line,posix=False) + lex.whitespace_split=True + lex.commenters='' + lst=list(lex) + while lst: + x=lst.pop(0) + st=x[:2] + ot=x[2:] + if st=='-I'or st=='/I': + if not ot:ot=lst.pop(0) + appu('INCLUDES_'+uselib,[ot]) + elif st=='-include': + tmp=[x,lst.pop(0)] + app('CFLAGS',tmp) + app('CXXFLAGS',tmp) + elif st=='-D'or(self.env.CXX_NAME=='msvc'and st=='/D'): + if not ot:ot=lst.pop(0) + app('DEFINES_'+uselib,[ot]) + elif st=='-l': + if not ot:ot=lst.pop(0) + prefix=force_static and'STLIB_'or'LIB_' + appu(prefix+uselib,[ot]) + elif st=='-L': + if not ot:ot=lst.pop(0) + appu('LIBPATH_'+uselib,[ot]) + elif x=='-pthread'or x.startswith('+')or x.startswith('-std'): + app('CFLAGS_'+uselib,[x]) + app('CXXFLAGS_'+uselib,[x]) + app('LINKFLAGS_'+uselib,[x]) + elif x=='-framework': + appu('FRAMEWORK_'+uselib,[lst.pop(0)]) + elif x.startswith('-F'): + appu('FRAMEWORKPATH_'+uselib,[x[2:]]) + elif x.startswith('-Wl'): + app('LINKFLAGS_'+uselib,[x]) + elif x.startswith('-m')or x.startswith('-f')or x.startswith('-dynamic'): + app('CFLAGS_'+uselib,[x]) + app('CXXFLAGS_'+uselib,[x]) + elif x.startswith('-bundle'): + app('LINKFLAGS_'+uselib,[x]) + elif x.startswith('-undefined'): + arg=lst.pop(0) + app('LINKFLAGS_'+uselib,[x,arg]) + elif x.startswith('-arch')or x.startswith('-isysroot'): + tmp=[x,lst.pop(0)] + app('CFLAGS_'+uselib,tmp) + app('CXXFLAGS_'+uselib,tmp) + app('LINKFLAGS_'+uselib,tmp) + elif x.endswith('.a')or x.endswith('.so')or x.endswith('.dylib'): + appu('LINKFLAGS_'+uselib,[x]) +def ret_msg(self,f,kw): + if isinstance(f,str): + return f + return f(kw) +def validate_cfg(self,kw): + if not'path'in kw: + if not self.env.PKGCONFIG: + self.find_program('pkg-config',var='PKGCONFIG') + kw['path']=self.env.PKGCONFIG + if'atleast_pkgconfig_version'in kw: + if not'msg'in kw: + kw['msg']='Checking for pkg-config version >= %r'%kw['atleast_pkgconfig_version'] + return + if not'okmsg'in kw: + kw['okmsg']='yes' + if not'errmsg'in kw: + kw['errmsg']='not found' + if'modversion'in kw: + if not'msg'in kw: + kw['msg']='Checking for %r version'%kw['modversion'] + return + for x in cfg_ver.keys(): + y=x.replace('-','_') + if y in kw: + if not'package'in kw: + raise ValueError('%s requires a package'%x) + if not'msg'in kw: + kw['msg']='Checking for %r %s %s'%(kw['package'],cfg_ver[x],kw[y]) + return + if not'msg'in kw: + kw['msg']='Checking for %r'%(kw['package']or kw['path']) +def exec_cfg(self,kw): + if'atleast_pkgconfig_version'in kw: + cmd=[kw['path'],'--atleast-pkgconfig-version=%s'%kw['atleast_pkgconfig_version']] + self.cmd_and_log(cmd) + if not'okmsg'in kw: + kw['okmsg']='yes' + return + for x in cfg_ver: + y=x.replace('-','_') + if y in kw: + self.cmd_and_log([kw['path'],'--%s=%s'%(x,kw[y]),kw['package']]) + if not'okmsg'in kw: + kw['okmsg']='yes' + self.define(self.have_define(kw.get('uselib_store',kw['package'])),1,0) + break + if'modversion'in kw: + version=self.cmd_and_log([kw['path'],'--modversion',kw['modversion']]).strip() + self.define('%s_VERSION'%Utils.quote_define_name(kw.get('uselib_store',kw['modversion'])),version) + return version + lst=[kw['path']] + defi=kw.get('define_variable',None) + if not defi: + defi=self.env.PKG_CONFIG_DEFINES or{} + for key,val in defi.items(): + lst.append('--define-variable=%s=%s'%(key,val)) + if kw['package']: + lst.extend(Utils.to_list(kw['package'])) + if'variables'in kw: + env=kw.get('env',self.env) + uselib=kw.get('uselib_store',kw['package'].upper()) + vars=Utils.to_list(kw['variables']) + for v in vars: + val=self.cmd_and_log(lst+['--variable='+v]).strip() + var='%s_%s'%(uselib,v) + env[var]=val + if not'okmsg'in kw: + kw['okmsg']='yes' + return + static=False + if'args'in kw: + args=Utils.to_list(kw['args']) + if'--static'in args or'--static-libs'in args: + static=True + lst+=args + ret=self.cmd_and_log(lst) + if not'okmsg'in kw: + kw['okmsg']='yes' + self.define(self.have_define(kw.get('uselib_store',kw['package'])),1,0) + self.parse_flags(ret,kw.get('uselib_store',kw['package'].upper()),kw.get('env',self.env),force_static=static) + return ret +def check_cfg(self,*k,**kw): + if k: + lst=k[0].split() + kw['package']=lst[0] + kw['args']=' '.join(lst[1:]) + self.validate_cfg(kw) + if'msg'in kw: + self.start_msg(kw['msg']) + ret=None + try: + ret=self.exec_cfg(kw) + except self.errors.WafError ,e: + if'errmsg'in kw: + self.end_msg(kw['errmsg'],'YELLOW') + if Logs.verbose>1: + raise + else: + self.fatal('The configuration failed') + else: + kw['success']=ret + if'okmsg'in kw: + self.end_msg(self.ret_msg(kw['okmsg'],kw)) + return ret +def validate_c(self,kw): + if not'env'in kw: + kw['env']=self.env.derive() + env=kw['env'] + if not'compiler'in kw and not'features'in kw: + kw['compiler']='c' + if env['CXX_NAME']and Task.classes.get('cxx',None): + kw['compiler']='cxx' + if not self.env['CXX']: + self.fatal('a c++ compiler is required') + else: + if not self.env['CC']: + self.fatal('a c compiler is required') + if not'compile_mode'in kw: + kw['compile_mode']='c' + if'cxx'in Utils.to_list(kw.get('features',[]))or kw.get('compiler','')=='cxx': + kw['compile_mode']='cxx' + if not'type'in kw: + kw['type']='cprogram' + if not'features'in kw: + kw['features']=[kw['compile_mode'],kw['type']] + else: + kw['features']=Utils.to_list(kw['features']) + if not'compile_filename'in kw: + kw['compile_filename']='test.c'+((kw['compile_mode']=='cxx')and'pp'or'') + def to_header(dct): + if'header_name'in dct: + dct=Utils.to_list(dct['header_name']) + return''.join(['#include <%s>\n'%x for x in dct]) + return'' + if'framework_name'in kw: + fwkname=kw['framework_name'] + if not'uselib_store'in kw: + kw['uselib_store']=fwkname.upper() + if not kw.get('no_header',False): + if not'header_name'in kw: + kw['header_name']=[] + fwk='%s/%s.h'%(fwkname,fwkname) + if kw.get('remove_dot_h',None): + fwk=fwk[:-2] + kw['header_name']=Utils.to_list(kw['header_name'])+[fwk] + kw['msg']='Checking for framework %s'%fwkname + kw['framework']=fwkname + if'function_name'in kw: + fu=kw['function_name'] + if not'msg'in kw: + kw['msg']='Checking for function %s'%fu + kw['code']=to_header(kw)+SNIP_FUNCTION%fu + if not'uselib_store'in kw: + kw['uselib_store']=fu.upper() + if not'define_name'in kw: + kw['define_name']=self.have_define(fu) + elif'type_name'in kw: + tu=kw['type_name'] + if not'header_name'in kw: + kw['header_name']='stdint.h' + if'field_name'in kw: + field=kw['field_name'] + kw['code']=to_header(kw)+SNIP_FIELD%{'type_name':tu,'field_name':field} + if not'msg'in kw: + kw['msg']='Checking for field %s in %s'%(field,tu) + if not'define_name'in kw: + kw['define_name']=self.have_define((tu+'_'+field).upper()) + else: + kw['code']=to_header(kw)+SNIP_TYPE%{'type_name':tu} + if not'msg'in kw: + kw['msg']='Checking for type %s'%tu + if not'define_name'in kw: + kw['define_name']=self.have_define(tu.upper()) + elif'header_name'in kw: + if not'msg'in kw: + kw['msg']='Checking for header %s'%kw['header_name'] + l=Utils.to_list(kw['header_name']) + assert len(l)>0,'list of headers in header_name is empty' + kw['code']=to_header(kw)+SNIP_EMPTY_PROGRAM + if not'uselib_store'in kw: + kw['uselib_store']=l[0].upper() + if not'define_name'in kw: + kw['define_name']=self.have_define(l[0]) + if'lib'in kw: + if not'msg'in kw: + kw['msg']='Checking for library %s'%kw['lib'] + if not'uselib_store'in kw: + kw['uselib_store']=kw['lib'].upper() + if'stlib'in kw: + if not'msg'in kw: + kw['msg']='Checking for static library %s'%kw['stlib'] + if not'uselib_store'in kw: + kw['uselib_store']=kw['stlib'].upper() + if'fragment'in kw: + kw['code']=kw['fragment'] + if not'msg'in kw: + kw['msg']='Checking for code snippet' + if not'errmsg'in kw: + kw['errmsg']='no' + for(flagsname,flagstype)in[('cxxflags','compiler'),('cflags','compiler'),('linkflags','linker')]: + if flagsname in kw: + if not'msg'in kw: + kw['msg']='Checking for %s flags %s'%(flagstype,kw[flagsname]) + if not'errmsg'in kw: + kw['errmsg']='no' + if not'execute'in kw: + kw['execute']=False + if kw['execute']: + kw['features'].append('test_exec') + if not'errmsg'in kw: + kw['errmsg']='not found' + if not'okmsg'in kw: + kw['okmsg']='yes' + if not'code'in kw: + kw['code']=SNIP_EMPTY_PROGRAM + if self.env[INCKEYS]: + kw['code']='\n'.join(['#include <%s>'%x for x in self.env[INCKEYS]])+'\n'+kw['code'] + if not kw.get('success'):kw['success']=None + if'define_name'in kw: + self.undefine(kw['define_name']) + assert'msg'in kw,'invalid parameters, read http://freehackers.org/~tnagy/wafbook/single.html#config_helpers_c' +def post_check(self,*k,**kw): + is_success=0 + if kw['execute']: + if kw['success']is not None: + if kw.get('define_ret',False): + is_success=kw['success'] + else: + is_success=(kw['success']==0) + else: + is_success=(kw['success']==0) + if'define_name'in kw: + if'header_name'in kw or'function_name'in kw or'type_name'in kw or'fragment'in kw: + nm=kw['define_name'] + if kw['execute']and kw.get('define_ret',None)and isinstance(is_success,str): + self.define(kw['define_name'],is_success,quote=kw.get('quote',1)) + else: + self.define_cond(kw['define_name'],is_success) + else: + self.define_cond(kw['define_name'],is_success) + if'header_name'in kw: + if kw.get('auto_add_header_name',False): + self.env.append_value(INCKEYS,Utils.to_list(kw['header_name'])) + if is_success and'uselib_store'in kw: + from waflib.Tools import ccroot + _vars=set([]) + for x in kw['features']: + if x in ccroot.USELIB_VARS: + _vars|=ccroot.USELIB_VARS[x] + for k in _vars: + lk=k.lower() + if k=='INCLUDES':lk='includes' + if k=='DEFINES':lk='defines' + if lk in kw: + val=kw[lk] + if isinstance(val,str): + val=val.rstrip(os.path.sep) + self.env.append_unique(k+'_'+kw['uselib_store'],val) + return is_success +def check(self,*k,**kw): + self.validate_c(kw) + self.start_msg(kw['msg']) + ret=None + try: + ret=self.run_c_code(*k,**kw) + except self.errors.ConfigurationError ,e: + self.end_msg(kw['errmsg'],'YELLOW') + if Logs.verbose>1: + raise + else: + self.fatal('The configuration failed') + else: + kw['success']=ret + self.end_msg(self.ret_msg(kw['okmsg'],kw)) + ret=self.post_check(*k,**kw) + if not ret: + self.fatal('The configuration failed %r'%ret) + return ret +class test_exec(Task.Task): + color='PINK' + def run(self): + if getattr(self.generator,'rpath',None): + if getattr(self.generator,'define_ret',False): + self.generator.bld.retval=self.generator.bld.cmd_and_log([self.inputs[0].abspath()]) + else: + self.generator.bld.retval=self.generator.bld.exec_command([self.inputs[0].abspath()]) + else: + env=self.env.env or{} + env.update(dict(os.environ)) + for var in('LD_LIBRARY_PATH','DYLD_LIBRARY_PATH','PATH'): + env[var]=self.inputs[0].parent.abspath()+os.path.pathsep+env.get(var,'') + if getattr(self.generator,'define_ret',False): + self.generator.bld.retval=self.generator.bld.cmd_and_log([self.inputs[0].abspath()],env=env) + else: + self.generator.bld.retval=self.generator.bld.exec_command([self.inputs[0].abspath()],env=env) +def test_exec_fun(self): + self.create_task('test_exec',self.link_task.outputs[0]) +CACHE_RESULTS=1 +COMPILE_ERRORS=2 +def run_c_code(self,*k,**kw): + lst=[str(v)for(p,v)in kw.items()if p!='env'] + h=Utils.h_list(lst) + dir=self.bldnode.abspath()+os.sep+(not Utils.is_win32 and'.'or'')+'conf_check_'+Utils.to_hex(h) + try: + os.makedirs(dir) + except: + pass + try: + os.stat(dir) + except: + self.fatal('cannot use the configuration test folder %r'%dir) + cachemode=getattr(Options.options,'confcache',None) + if cachemode==CACHE_RESULTS: + try: + proj=ConfigSet.ConfigSet(os.path.join(dir,'cache_run_c_code')) + ret=proj['cache_run_c_code'] + except: + pass + else: + if isinstance(ret,str)and ret.startswith('Test does not build'): + self.fatal(ret) + return ret + bdir=os.path.join(dir,'testbuild') + if not os.path.exists(bdir): + os.makedirs(bdir) + self.test_bld=bld=Build.BuildContext(top_dir=dir,out_dir=bdir) + bld.init_dirs() + bld.progress_bar=0 + bld.targets='*' + if kw['compile_filename']: + node=bld.srcnode.make_node(kw['compile_filename']) + node.write(kw['code']) + bld.logger=self.logger + bld.all_envs.update(self.all_envs) + bld.env=kw['env'] + o=bld(features=kw['features'],source=kw['compile_filename'],target='testprog') + for k,v in kw.items(): + setattr(o,k,v) + self.to_log("==>\n%s\n<=="%kw['code']) + bld.targets='*' + ret=-1 + try: + try: + bld.compile() + except Errors.WafError: + ret='Test does not build: %s'%Utils.ex_stack() + self.fatal(ret) + else: + ret=getattr(bld,'retval',0) + finally: + proj=ConfigSet.ConfigSet() + proj['cache_run_c_code']=ret + proj.store(os.path.join(dir,'cache_run_c_code')) + return ret +def check_cxx(self,*k,**kw): + kw['compiler']='cxx' + return self.check(*k,**kw) +def check_cc(self,*k,**kw): + kw['compiler']='c' + return self.check(*k,**kw) +def define(self,key,val,quote=True): + assert key and isinstance(key,str) + if isinstance(val,int)or isinstance(val,float): + s='%s=%s' + else: + s=quote and'%s="%s"'or'%s=%s' + app=s%(key,str(val)) + ban=key+'=' + lst=self.env['DEFINES'] + for x in lst: + if x.startswith(ban): + lst[lst.index(x)]=app + break + else: + self.env.append_value('DEFINES',app) + self.env.append_unique(DEFKEYS,key) +def undefine(self,key): + assert key and isinstance(key,str) + ban=key+'=' + lst=[x for x in self.env['DEFINES']if not x.startswith(ban)] + self.env['DEFINES']=lst + self.env.append_unique(DEFKEYS,key) +def define_cond(self,key,val): + assert key and isinstance(key,str) + if val: + self.define(key,1) + else: + self.undefine(key) +def is_defined(self,key): + assert key and isinstance(key,str) + ban=key+'=' + for x in self.env['DEFINES']: + if x.startswith(ban): + return True + return False +def get_define(self,key): + assert key and isinstance(key,str) + ban=key+'=' + for x in self.env['DEFINES']: + if x.startswith(ban): + return x[len(ban):] + return None +def have_define(self,key): + return self.__dict__.get('HAVE_PAT','HAVE_%s')%Utils.quote_define_name(key) +def write_config_header(self,configfile='',guard='',top=False,env=None,defines=True,headers=False,remove=True): + if not configfile:configfile=WAF_CONFIG_H + waf_guard=guard or'_%s_WAF'%Utils.quote_define_name(configfile) + node=top and self.bldnode or self.path.get_bld() + node=node.make_node(configfile) + node.parent.mkdir() + lst=['/* WARNING! All changes made to this file will be lost! */\n'] + lst.append('#ifndef %s\n#define %s\n'%(waf_guard,waf_guard)) + lst.append(self.get_config_header(defines,headers)) + lst.append('\n#endif /* %s */\n'%waf_guard) + node.write('\n'.join(lst)) + env=env or self.env + env.append_unique(Build.CFG_FILES,[node.abspath()]) + if remove: + for key in self.env[DEFKEYS]: + self.undefine(key) + self.env[DEFKEYS]=[] +def get_config_header(self,defines=True,headers=False): + lst=[] + if headers: + for x in self.env[INCKEYS]: + lst.append('#include <%s>'%x) + if defines: + for x in self.env[DEFKEYS]: + if self.is_defined(x): + val=self.get_define(x) + lst.append('#define %s %s'%(x,val)) + else: + lst.append('/* #undef %s */'%x) + return"\n".join(lst) +def cc_add_flags(conf): + conf.add_os_flags('CPPFLAGS','CFLAGS') + conf.add_os_flags('CFLAGS') +def cxx_add_flags(conf): + conf.add_os_flags('CPPFLAGS','CXXFLAGS') + conf.add_os_flags('CXXFLAGS') +def link_add_flags(conf): + conf.add_os_flags('LINKFLAGS') + conf.add_os_flags('LDFLAGS','LINKFLAGS') +def cc_load_tools(conf): + if not conf.env.DEST_OS: + conf.env.DEST_OS=Utils.unversioned_sys_platform() + conf.load('c') +def cxx_load_tools(conf): + if not conf.env.DEST_OS: + conf.env.DEST_OS=Utils.unversioned_sys_platform() + conf.load('cxx') +def get_cc_version(conf,cc,gcc=False,icc=False): + cmd=cc+['-dM','-E','-'] + env=conf.env.env or None + try: + p=Utils.subprocess.Popen(cmd,stdin=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE,stderr=Utils.subprocess.PIPE,env=env) + p.stdin.write('\n') + out=p.communicate()[0] + except: + conf.fatal('Could not determine the compiler version %r'%cmd) + if not isinstance(out,str): + out=out.decode(sys.stdout.encoding) + if gcc: + if out.find('__INTEL_COMPILER')>=0: + conf.fatal('The intel compiler pretends to be gcc') + if out.find('__GNUC__')<0: + conf.fatal('Could not determine the compiler type') + if icc and out.find('__INTEL_COMPILER')<0: + conf.fatal('Not icc/icpc') + k={} + if icc or gcc: + out=out.split('\n') + for line in out: + lst=shlex.split(line) + if len(lst)>2: + key=lst[1] + val=lst[2] + k[key]=val + def isD(var): + return var in k + def isT(var): + return var in k and k[var]!='0' + if not conf.env.DEST_OS: + conf.env.DEST_OS='' + for i in MACRO_TO_DESTOS: + if isD(i): + conf.env.DEST_OS=MACRO_TO_DESTOS[i] + break + else: + if isD('__APPLE__')and isD('__MACH__'): + conf.env.DEST_OS='darwin' + elif isD('__unix__'): + conf.env.DEST_OS='generic' + if isD('__ELF__'): + conf.env.DEST_BINFMT='elf' + elif isD('__WINNT__')or isD('__CYGWIN__'): + conf.env.DEST_BINFMT='pe' + conf.env.LIBDIR=conf.env['PREFIX']+'/bin' + elif isD('__APPLE__'): + conf.env.DEST_BINFMT='mac-o' + if not conf.env.DEST_BINFMT: + conf.env.DEST_BINFMT=Utils.destos_to_binfmt(conf.env.DEST_OS) + for i in MACRO_TO_DEST_CPU: + if isD(i): + conf.env.DEST_CPU=MACRO_TO_DEST_CPU[i] + break + Logs.debug('ccroot: dest platform: '+' '.join([conf.env[x]or'?'for x in('DEST_OS','DEST_BINFMT','DEST_CPU')])) + if icc: + ver=k['__INTEL_COMPILER'] + conf.env['CC_VERSION']=(ver[:-2],ver[-2],ver[-1]) + else: + conf.env['CC_VERSION']=(k['__GNUC__'],k['__GNUC_MINOR__'],k['__GNUC_PATCHLEVEL__']) + return k +def get_xlc_version(conf,cc): + version_re=re.compile(r"IBM XL C/C\+\+.*, V(?P\d*)\.(?P\d*)",re.I).search + cmd=cc+['-qversion'] + try: + out,err=conf.cmd_and_log(cmd,output=0) + except Errors.WafError: + conf.fatal('Could not find xlc %r'%cmd) + if out:match=version_re(out) + else:match=version_re(err) + if not match: + conf.fatal('Could not determine the XLC version.') + k=match.groupdict() + conf.env['CC_VERSION']=(k['major'],k['minor']) +def add_as_needed(self): + if self.env.DEST_BINFMT=='elf'and'gcc'in(self.env.CXX_NAME,self.env.CC_NAME): + self.env.append_unique('LINKFLAGS','--as-needed') +class cfgtask(Task.TaskBase): + def display(self): + return'' + def runnable_status(self): + return Task.RUN_ME + def run(self): + conf=self.conf + bld=Build.BuildContext(top_dir=conf.srcnode.abspath(),out_dir=conf.bldnode.abspath()) + bld.env=conf.env + bld.init_dirs() + bld.in_msg=1 + bld.logger=self.logger + try: + bld.check(**self.args) + except: + return 1 +def multicheck(self,*k,**kw): + self.start_msg(kw.get('msg','Executing %d configuration tests'%len(k))) + class par(object): + def __init__(self): + self.keep=False + self.cache_global=Options.cache_global + self.nocache=Options.options.nocache + self.returned_tasks=[] + def total(self): + return len(tasks) + def to_log(self,*k,**kw): + return + bld=par() + tasks=[] + for dct in k: + x=cfgtask(bld=bld) + tasks.append(x) + x.args=dct + x.bld=bld + x.conf=self + x.args=dct + x.logger=Logs.make_mem_logger(str(id(x)),self.logger) + def it(): + yield tasks + while 1: + yield[] + p=Runner.Parallel(bld,Options.options.jobs) + p.biter=it() + p.start() + for x in tasks: + x.logger.memhandler.flush() + for x in tasks: + if x.hasrun!=Task.SUCCESS: + self.end_msg(kw.get('errmsg','no'),color='YELLOW') + self.fatal(kw.get('fatalmsg',None)or'One of the tests has failed, see the config.log for more information') + self.end_msg('ok') + +conf(parse_flags) +conf(ret_msg) +conf(validate_cfg) +conf(exec_cfg) +conf(check_cfg) +conf(validate_c) +conf(post_check) +conf(check) +feature('test_exec')(test_exec_fun) +after_method('apply_link')(test_exec_fun) +conf(run_c_code) +conf(check_cxx) +conf(check_cc) +conf(define) +conf(undefine) +conf(define_cond) +conf(is_defined) +conf(get_define) +conf(have_define) +conf(write_config_header) +conf(get_config_header) +conf(cc_add_flags) +conf(cxx_add_flags) +conf(link_add_flags) +conf(cc_load_tools) +conf(cxx_load_tools) +conf(get_cc_version) +conf(get_xlc_version) +conf(add_as_needed) +conf(multicheck) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/c_osx.py @@ -0,0 +1,121 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,shutil,sys,platform +from waflib import TaskGen,Task,Build,Options,Utils,Errors +from waflib.TaskGen import taskgen_method,feature,after_method,before_method +app_info=''' + + + + + CFBundlePackageType + APPL + CFBundleGetInfoString + Created by Waf + CFBundleSignature + ???? + NOTE + THIS IS A GENERATED FILE, DO NOT MODIFY + CFBundleExecutable + %s + + +''' +def set_macosx_deployment_target(self): + if self.env['MACOSX_DEPLOYMENT_TARGET']: + os.environ['MACOSX_DEPLOYMENT_TARGET']=self.env['MACOSX_DEPLOYMENT_TARGET'] + elif'MACOSX_DEPLOYMENT_TARGET'not in os.environ: + if Utils.unversioned_sys_platform()=='darwin': + os.environ['MACOSX_DEPLOYMENT_TARGET']='.'.join(platform.mac_ver()[0].split('.')[:2]) +def create_bundle_dirs(self,name,out): + bld=self.bld + dir=out.parent.find_or_declare(name) + dir.mkdir() + macos=dir.find_or_declare(['Contents','MacOS']) + macos.mkdir() + return dir +def bundle_name_for_output(out): + name=out.name + k=name.rfind('.') + if k>=0: + name=name[:k]+'.app' + else: + name=name+'.app' + return name +def create_task_macapp(self): + if self.env['MACAPP']or getattr(self,'mac_app',False): + out=self.link_task.outputs[0] + name=bundle_name_for_output(out) + dir=self.create_bundle_dirs(name,out) + n1=dir.find_or_declare(['Contents','MacOS',out.name]) + self.apptask=self.create_task('macapp',self.link_task.outputs,n1) + inst_to=getattr(self,'install_path','/Applications')+'/%s/Contents/MacOS/'%name + self.bld.install_files(inst_to,n1,chmod=Utils.O755) + if getattr(self,'mac_resources',None): + res_dir=n1.parent.parent.make_node('Resources') + inst_to=getattr(self,'install_path','/Applications')+'/%s/Resources'%name + for x in self.to_list(self.mac_resources): + node=self.path.find_node(x) + if not node: + raise Errors.WafError('Missing mac_resource %r in %r'%(x,self)) + parent=node.parent + if os.path.isdir(node.abspath()): + nodes=node.ant_glob('**') + else: + nodes=[node] + for node in nodes: + rel=node.path_from(parent) + tsk=self.create_task('macapp',node,res_dir.make_node(rel)) + self.bld.install_as(inst_to+'/%s'%rel,node) + if getattr(self.bld,'is_install',None): + self.install_task.hasrun=Task.SKIP_ME +def create_task_macplist(self): + if self.env['MACAPP']or getattr(self,'mac_app',False): + out=self.link_task.outputs[0] + name=bundle_name_for_output(out) + dir=self.create_bundle_dirs(name,out) + n1=dir.find_or_declare(['Contents','Info.plist']) + self.plisttask=plisttask=self.create_task('macplist',[],n1) + if getattr(self,'mac_plist',False): + node=self.path.find_resource(self.mac_plist) + if node: + plisttask.inputs.append(node) + else: + plisttask.code=self.mac_plist + else: + plisttask.code=app_info%self.link_task.outputs[0].name + inst_to=getattr(self,'install_path','/Applications')+'/%s/Contents/'%name + self.bld.install_files(inst_to,n1) +def apply_bundle(self): + if self.env['MACBUNDLE']or getattr(self,'mac_bundle',False): + self.env['LINKFLAGS_cshlib']=self.env['LINKFLAGS_cxxshlib']=[] + self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['macbundle_PATTERN'] + use=self.use=self.to_list(getattr(self,'use',[])) + if not'MACBUNDLE'in use: + use.append('MACBUNDLE') +app_dirs=['Contents','Contents/MacOS','Contents/Resources'] +class macapp(Task.Task): + color='PINK' + def run(self): + self.outputs[0].parent.mkdir() + shutil.copy2(self.inputs[0].srcpath(),self.outputs[0].abspath()) +class macplist(Task.Task): + color='PINK' + ext_in=['.bin'] + def run(self): + if getattr(self,'code',None): + txt=self.code + else: + txt=self.inputs[0].read() + self.outputs[0].write(txt) + +feature('c','cxx')(set_macosx_deployment_target) +taskgen_method(create_bundle_dirs) +feature('cprogram','cxxprogram')(create_task_macapp) +after_method('apply_link')(create_task_macapp) +feature('cprogram','cxxprogram')(create_task_macplist) +after_method('apply_link')(create_task_macplist) +feature('cshlib','cxxshlib')(apply_bundle) +before_method('apply_link','propagate_uselib_vars')(apply_bundle) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/c_preproc.py @@ -0,0 +1,606 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import re,sys,os,string,traceback +from waflib import Logs,Build,Utils,Errors +from waflib.Logs import debug,error +class PreprocError(Errors.WafError): + pass +POPFILE='-' +recursion_limit=150 +go_absolute=False +standard_includes=['/usr/include'] +if Utils.is_win32: + standard_includes=[] +use_trigraphs=0 +strict_quotes=0 +g_optrans={'not':'!','and':'&&','bitand':'&','and_eq':'&=','or':'||','bitor':'|','or_eq':'|=','xor':'^','xor_eq':'^=','compl':'~',} +re_lines=re.compile('^[ \t]*(#|%:)[ \t]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ \t]*(.*)\r*$',re.IGNORECASE|re.MULTILINE) +re_mac=re.compile("^[a-zA-Z_]\w*") +re_fun=re.compile('^[a-zA-Z_][a-zA-Z0-9_]*[(]') +re_pragma_once=re.compile('^\s*once\s*',re.IGNORECASE) +re_nl=re.compile('\\\\\r*\n',re.MULTILINE) +re_cpp=re.compile(r"""(/\*[^*]*\*+([^/*][^*]*\*+)*/)|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)""",re.MULTILINE) +trig_def=[('??'+a,b)for a,b in zip("=-/!'()<>",r'#~\|^[]{}')] +chr_esc={'0':0,'a':7,'b':8,'t':9,'n':10,'f':11,'v':12,'r':13,'\\':92,"'":39} +NUM='i' +OP='O' +IDENT='T' +STR='s' +CHAR='c' +tok_types=[NUM,STR,IDENT,OP] +exp_types=[r"""0[xX](?P[a-fA-F0-9]+)(?P[uUlL]*)|L*?'(?P(\\.|[^\\'])+)'|(?P\d+)[Ee](?P[+-]*?\d+)(?P[fFlL]*)|(?P\d*\.\d+)([Ee](?P[+-]*?\d+))?(?P[fFlL]*)|(?P\d+\.\d*)([Ee](?P[+-]*?\d+))?(?P[fFlL]*)|(?P0*)(?P\d+)(?P[uUlL]*)""",r'L?"([^"\\]|\\.)*"',r'[a-zA-Z_]\w*',r'%:%:|<<=|>>=|\.\.\.|<<|<%|<:|<=|>>|>=|\+\+|\+=|--|->|-=|\*=|/=|%:|%=|%>|==|&&|&=|\|\||\|=|\^=|:>|!=|##|[\(\)\{\}\[\]<>\?\|\^\*\+&=:!#;,%/\-\?\~\.]',] +re_clexer=re.compile('|'.join(["(?P<%s>%s)"%(name,part)for name,part in zip(tok_types,exp_types)]),re.M) +accepted='a' +ignored='i' +undefined='u' +skipped='s' +def repl(m): + s=m.group(1) + if s: + return' ' + return m.group(3)or'' +def filter_comments(filename): + code=Utils.readf(filename) + if use_trigraphs: + for(a,b)in trig_def:code=code.split(a).join(b) + code=re_nl.sub('',code) + code=re_cpp.sub(repl,code) + return[(m.group(2),m.group(3))for m in re.finditer(re_lines,code)] +prec={} +ops=['* / %','+ -','<< >>','< <= >= >','== !=','& | ^','&& ||',','] +for x in range(len(ops)): + syms=ops[x] + for u in syms.split(): + prec[u]=x +def trimquotes(s): + if not s:return'' + s=s.rstrip() + if s[0]=="'"and s[-1]=="'":return s[1:-1] + return s +def reduce_nums(val_1,val_2,val_op): + try:a=0+val_1 + except TypeError:a=int(val_1) + try:b=0+val_2 + except TypeError:b=int(val_2) + d=val_op + if d=='%':c=a%b + elif d=='+':c=a+b + elif d=='-':c=a-b + elif d=='*':c=a*b + elif d=='/':c=a/b + elif d=='^':c=a^b + elif d=='|':c=a|b + elif d=='||':c=int(a or b) + elif d=='&':c=a&b + elif d=='&&':c=int(a and b) + elif d=='==':c=int(a==b) + elif d=='!=':c=int(a!=b) + elif d=='<=':c=int(a<=b) + elif d=='<':c=int(a':c=int(a>b) + elif d=='>=':c=int(a>=b) + elif d=='^':c=int(a^b) + elif d=='<<':c=a<>':c=a>>b + else:c=0 + return c +def get_num(lst): + if not lst:raise PreprocError("empty list for get_num") + (p,v)=lst[0] + if p==OP: + if v=='(': + count_par=1 + i=1 + while i=prec[v]: + num2=reduce_nums(num,num2,v) + return get_term([(NUM,num2)]+lst) + else: + num3,lst=get_num(lst[1:]) + num3=reduce_nums(num2,num3,v2) + return get_term([(NUM,num),(p,v),(NUM,num3)]+lst) + raise PreprocError("cannot reduce %r"%lst) +def reduce_eval(lst): + num,lst=get_term(lst) + return(NUM,num) +def stringize(lst): + lst=[str(v2)for(p2,v2)in lst] + return"".join(lst) +def paste_tokens(t1,t2): + p1=None + if t1[0]==OP and t2[0]==OP: + p1=OP + elif t1[0]==IDENT and(t2[0]==IDENT or t2[0]==NUM): + p1=IDENT + elif t1[0]==NUM and t2[0]==NUM: + p1=NUM + if not p1: + raise PreprocError('tokens do not make a valid paste %r and %r'%(t1,t2)) + return(p1,t1[1]+t2[1]) +def reduce_tokens(lst,defs,ban=[]): + i=0 + while i=len(lst): + raise PreprocError("expected '(' after %r (got nothing)"%v) + (p2,v2)=lst[i] + if p2!=OP or v2!='(': + raise PreprocError("expected '(' after %r"%v) + del lst[i] + one_param=[] + count_paren=0 + while i1: + (p3,v3)=accu[-1] + (p4,v4)=accu[-2] + if v3=='##': + accu.pop() + if v4==','and pt.*)>|"(?P.*)")') +def extract_include(txt,defs): + m=re_include.search(txt) + if m: + if m.group('a'):return'<',m.group('a') + if m.group('b'):return'"',m.group('b') + toks=tokenize(txt) + reduce_tokens(toks,defs,['waf_include']) + if not toks: + raise PreprocError("could not parse include %s"%txt) + if len(toks)==1: + if toks[0][0]==STR: + return'"',toks[0][1] + else: + if toks[0][1]=='<'and toks[-1][1]=='>': + return stringize(toks).lstrip('<').rstrip('>') + raise PreprocError("could not parse include %s."%txt) +def parse_char(txt): + if not txt:raise PreprocError("attempted to parse a null char") + if txt[0]!='\\': + return ord(txt) + c=txt[1] + if c=='x': + if len(txt)==4 and txt[3]in string.hexdigits:return int(txt[2:],16) + return int(txt[2:],16) + elif c.isdigit(): + if c=='0'and len(txt)==2:return 0 + for i in 3,2,1: + if len(txt)>i and txt[1:1+i].isdigit(): + return(1+i,int(txt[1:1+i],8)) + else: + try:return chr_esc[c] + except KeyError:raise PreprocError("could not parse char literal '%s'"%txt) +def tokenize(s): + ret=[] + for match in re_clexer.finditer(s): + m=match.group + for name in tok_types: + v=m(name) + if v: + if name==IDENT: + try:v=g_optrans[v];name=OP + except KeyError: + if v.lower()=="true": + v=1 + name=NUM + elif v.lower()=="false": + v=0 + name=NUM + elif name==NUM: + if m('oct'):v=int(v,8) + elif m('hex'):v=int(m('hex'),16) + elif m('n0'):v=m('n0') + else: + v=m('char') + if v:v=parse_char(v) + else:v=m('n2')or m('n4') + elif name==OP: + if v=='%:':v='#' + elif v=='%:%:':v='##' + elif name==STR: + v=v[1:-1] + ret.append((name,v)) + break + return ret +def define_name(line): + return re_mac.match(line).group(0) +class c_parser(object): + def __init__(self,nodepaths=None,defines=None): + self.lines=[] + if defines is None: + self.defs={} + else: + self.defs=dict(defines) + self.state=[] + self.count_files=0 + self.currentnode_stack=[] + self.nodepaths=nodepaths or[] + self.nodes=[] + self.names=[] + self.curfile='' + self.ban_includes=set([]) + def cached_find_resource(self,node,filename): + try: + nd=node.ctx.cache_nd + except: + nd=node.ctx.cache_nd={} + tup=(node,filename) + try: + return nd[tup] + except KeyError: + ret=node.find_resource(filename) + if ret: + if getattr(ret,'children',None): + ret=None + elif ret.is_child_of(node.ctx.bldnode): + tmp=node.ctx.srcnode.search(ret.path_from(node.ctx.bldnode)) + if tmp and getattr(tmp,'children',None): + ret=None + nd[tup]=ret + return ret + def tryfind(self,filename): + self.curfile=filename + found=self.cached_find_resource(self.currentnode_stack[-1],filename) + for n in self.nodepaths: + if found: + break + found=self.cached_find_resource(n,filename) + if found: + self.nodes.append(found) + if filename[-4:]!='.moc': + self.addlines(found) + else: + if not filename in self.names: + self.names.append(filename) + return found + def addlines(self,node): + self.currentnode_stack.append(node.parent) + filepath=node.abspath() + self.count_files+=1 + if self.count_files>recursion_limit: + raise PreprocError("recursion limit exceeded") + pc=self.parse_cache + debug('preproc: reading file %r',filepath) + try: + lns=pc[filepath] + except KeyError: + pass + else: + self.lines.extend(lns) + return + try: + lines=filter_comments(filepath) + lines.append((POPFILE,'')) + lines.reverse() + pc[filepath]=lines + self.lines.extend(lines) + except IOError: + raise PreprocError("could not read the file %s"%filepath) + except Exception: + if Logs.verbose>0: + error("parsing %s failed"%filepath) + traceback.print_exc() + def start(self,node,env): + debug('preproc: scanning %s (in %s)',node.name,node.parent.name) + bld=node.ctx + try: + self.parse_cache=bld.parse_cache + except AttributeError: + bld.parse_cache={} + self.parse_cache=bld.parse_cache + self.addlines(node) + if env['DEFINES']: + try: + lst=['%s %s'%(x[0],trimquotes('='.join(x[1:])))for x in[y.split('=')for y in env['DEFINES']]] + lst.reverse() + self.lines.extend([('define',x)for x in lst]) + except AttributeError: + pass + while self.lines: + (token,line)=self.lines.pop() + if token==POPFILE: + self.count_files-=1 + self.currentnode_stack.pop() + continue + try: + ve=Logs.verbose + if ve:debug('preproc: line is %s - %s state is %s',token,line,self.state) + state=self.state + if token[:2]=='if': + state.append(undefined) + elif token=='endif': + state.pop() + if token[0]!='e': + if skipped in self.state or ignored in self.state: + continue + if token=='if': + ret=eval_macro(tokenize(line),self.defs) + if ret:state[-1]=accepted + else:state[-1]=ignored + elif token=='ifdef': + m=re_mac.match(line) + if m and m.group(0)in self.defs:state[-1]=accepted + else:state[-1]=ignored + elif token=='ifndef': + m=re_mac.match(line) + if m and m.group(0)in self.defs:state[-1]=ignored + else:state[-1]=accepted + elif token=='include'or token=='import': + (kind,inc)=extract_include(line,self.defs) + if inc in self.ban_includes: + continue + if token=='import':self.ban_includes.add(inc) + if ve:debug('preproc: include found %s (%s) ',inc,kind) + if kind=='"'or not strict_quotes: + self.tryfind(inc) + elif token=='elif': + if state[-1]==accepted: + state[-1]=skipped + elif state[-1]==ignored: + if eval_macro(tokenize(line),self.defs): + state[-1]=accepted + elif token=='else': + if state[-1]==accepted:state[-1]=skipped + elif state[-1]==ignored:state[-1]=accepted + elif token=='define': + try: + self.defs[define_name(line)]=line + except: + raise PreprocError("Invalid define line %s"%line) + elif token=='undef': + m=re_mac.match(line) + if m and m.group(0)in self.defs: + self.defs.__delitem__(m.group(0)) + elif token=='pragma': + if re_pragma_once.match(line.lower()): + self.ban_includes.add(self.curfile) + except Exception ,e: + if Logs.verbose: + debug('preproc: line parsing failed (%s): %s %s',e,line,Utils.ex_stack()) +def scan(task): + global go_absolute + try: + incn=task.generator.includes_nodes + except AttributeError: + raise Errors.WafError('%r is missing a feature such as "c", "cxx" or "includes": '%task.generator) + if go_absolute: + nodepaths=incn+standard_includes + else: + nodepaths=[x for x in incn if x.is_child_of(x.ctx.srcnode)or x.is_child_of(x.ctx.bldnode)] + tmp=c_parser(nodepaths) + tmp.start(task.inputs[0],task.env) + if Logs.verbose: + debug('deps: deps for %r: %r; unresolved %r'%(task.inputs,tmp.nodes,tmp.names)) + return(tmp.nodes,tmp.names) + +Utils.run_once(tokenize) +Utils.run_once(define_name) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/c_tests.py @@ -0,0 +1,146 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +from waflib import Task +from waflib.Configure import conf +from waflib.TaskGen import feature,before_method,after_method +import sys +LIB_CODE=''' +#ifdef _MSC_VER +#define testEXPORT __declspec(dllexport) +#else +#define testEXPORT +#endif +testEXPORT int lib_func(void) { return 9; } +''' +MAIN_CODE=''' +#ifdef _MSC_VER +#define testEXPORT __declspec(dllimport) +#else +#define testEXPORT +#endif +testEXPORT int lib_func(void); +int main(void) {return !(lib_func() == 9);} +''' +def link_lib_test_fun(self): + def write_test_file(task): + task.outputs[0].write(task.generator.code) + rpath=[] + if getattr(self,'add_rpath',False): + rpath=[self.bld.path.get_bld().abspath()] + mode=self.mode + m='%s %s'%(mode,mode) + ex=self.test_exec and'test_exec'or'' + bld=self.bld + bld(rule=write_test_file,target='test.'+mode,code=LIB_CODE) + bld(rule=write_test_file,target='main.'+mode,code=MAIN_CODE) + bld(features='%sshlib'%m,source='test.'+mode,target='test') + bld(features='%sprogram %s'%(m,ex),source='main.'+mode,target='app',use='test',rpath=rpath) +def check_library(self,mode=None,test_exec=True): + if not mode: + mode='c' + if self.env.CXX: + mode='cxx' + self.check(compile_filename=[],features='link_lib_test',msg='Checking for libraries',mode=mode,test_exec=test_exec,) +INLINE_CODE=''' +typedef int foo_t; +static %s foo_t static_foo () {return 0; } +%s foo_t foo () { + return 0; +} +''' +INLINE_VALUES=['inline','__inline__','__inline'] +def check_inline(self,**kw): + self.start_msg('Checking for inline') + if not'define_name'in kw: + kw['define_name']='INLINE_MACRO' + if not'features'in kw: + if self.env.CXX: + kw['features']=['cxx'] + else: + kw['features']=['c'] + for x in INLINE_VALUES: + kw['fragment']=INLINE_CODE%(x,x) + try: + self.check(**kw) + except self.errors.ConfigurationError: + continue + else: + self.end_msg(x) + if x!='inline': + self.define('inline',x,quote=False) + return x + self.fatal('could not use inline functions') +LARGE_FRAGMENT='#include \nint main() { return !(sizeof(off_t) >= 8); }\n' +def check_large_file(self,**kw): + if not'define_name'in kw: + kw['define_name']='HAVE_LARGEFILE' + if not'execute'in kw: + kw['execute']=True + if not'features'in kw: + if self.env.CXX: + kw['features']=['cxx','cxxprogram'] + else: + kw['features']=['c','cprogram'] + kw['fragment']=LARGE_FRAGMENT + kw['msg']='Checking for large file support' + ret=True + try: + if self.env.DEST_BINFMT!='pe': + ret=self.check(**kw) + except self.errors.ConfigurationError: + pass + else: + if ret: + return True + kw['msg']='Checking for -D_FILE_OFFSET_BITS=64' + kw['defines']=['_FILE_OFFSET_BITS=64'] + try: + ret=self.check(**kw) + except self.errors.ConfigurationError: + pass + else: + self.define('_FILE_OFFSET_BITS',64) + return ret + self.fatal('There is no support for large files') +ENDIAN_FRAGMENT=''' +short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; +} +short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; +} +extern int foo; +''' +class grep_for_endianness(Task.Task): + color='PINK' + def run(self): + txt=self.inputs[0].read(flags='rb').decode('iso8859-1') + if txt.find('LiTTleEnDian')>-1: + self.generator.tmp.append('little') + elif txt.find('BIGenDianSyS')>-1: + self.generator.tmp.append('big') + else: + return-1 +def grep_for_endianness_fun(self): + self.create_task('grep_for_endianness',self.compiled_tasks[0].outputs[0]) +def check_endianness(self): + tmp=[] + def check_msg(self): + return tmp[0] + self.check(fragment=ENDIAN_FRAGMENT,features='c grep_for_endianness',msg="Checking for endianness",define='ENDIANNESS',tmp=tmp,okmsg=check_msg) + return tmp[0] + +feature('link_lib_test')(link_lib_test_fun) +before_method('process_source')(link_lib_test_fun) +conf(check_library) +conf(check_inline) +conf(check_large_file) +feature('grep_for_endianness')(grep_for_endianness_fun) +after_method('process_source')(grep_for_endianness_fun) +conf(check_endianness) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/ccroot.py @@ -0,0 +1,375 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,sys,re +from waflib import TaskGen,Task,Utils,Logs,Build,Options,Node,Errors +from waflib.Logs import error,debug,warn +from waflib.TaskGen import after_method,before_method,feature,taskgen_method,extension +from waflib.Tools import c_aliases,c_preproc,c_config,c_osx,c_tests +from waflib.Configure import conf +USELIB_VARS=Utils.defaultdict(set) +USELIB_VARS['c']=set(['INCLUDES','FRAMEWORKPATH','DEFINES','CPPFLAGS','CCDEPS','CFLAGS','ARCH']) +USELIB_VARS['cxx']=set(['INCLUDES','FRAMEWORKPATH','DEFINES','CPPFLAGS','CXXDEPS','CXXFLAGS','ARCH']) +USELIB_VARS['d']=set(['INCLUDES','DFLAGS']) +USELIB_VARS['cprogram']=USELIB_VARS['cxxprogram']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS','FRAMEWORK','FRAMEWORKPATH','ARCH']) +USELIB_VARS['cshlib']=USELIB_VARS['cxxshlib']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS','FRAMEWORK','FRAMEWORKPATH','ARCH']) +USELIB_VARS['cstlib']=USELIB_VARS['cxxstlib']=set(['ARFLAGS','LINKDEPS']) +USELIB_VARS['dprogram']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS']) +USELIB_VARS['dshlib']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS']) +USELIB_VARS['dstlib']=set(['ARFLAGS','LINKDEPS']) +USELIB_VARS['go']=set(['GOCFLAGS']) +USELIB_VARS['goprogram']=set(['GOLFLAGS']) +USELIB_VARS['asm']=set(['ASFLAGS']) +def create_compiled_task(self,name,node): + out='%s.%d.o'%(node.name,self.idx) + task=self.create_task(name,node,node.parent.find_or_declare(out)) + try: + self.compiled_tasks.append(task) + except AttributeError: + self.compiled_tasks=[task] + return task +def to_incnodes(self,inlst): + lst=[] + seen=set([]) + for x in self.to_list(inlst): + if x in seen or not x: + continue + seen.add(x) + if isinstance(x,Node.Node): + lst.append(x) + else: + if os.path.isabs(x): + lst.append(self.bld.root.make_node(x)or x) + else: + if x[0]=='#': + p=self.bld.bldnode.make_node(x[1:]) + v=self.bld.srcnode.make_node(x[1:]) + else: + p=self.path.get_bld().make_node(x) + v=self.path.make_node(x) + if p.is_child_of(self.bld.bldnode): + p.mkdir() + lst.append(p) + lst.append(v) + return lst +def apply_incpaths(self): + lst=self.to_incnodes(self.to_list(getattr(self,'includes',[]))+self.env['INCLUDES']) + self.includes_nodes=lst + self.env['INCPATHS']=[x.abspath()for x in lst] +class link_task(Task.Task): + color='YELLOW' + inst_to=None + chmod=Utils.O644 + def add_target(self,target): + if isinstance(target,str): + pattern=self.env[self.__class__.__name__+'_PATTERN'] + if not pattern: + pattern='%s' + folder,name=os.path.split(target) + if self.__class__.__name__.find('shlib')>0: + if self.env.DEST_BINFMT=='pe'and getattr(self.generator,'vnum',None): + name=name+'-'+self.generator.vnum.split('.')[0] + tmp=folder+os.sep+pattern%name + target=self.generator.path.find_or_declare(tmp) + self.set_outputs(target) +class stlink_task(link_task): + run_str='${AR} ${ARFLAGS} ${AR_TGT_F}${TGT} ${AR_SRC_F}${SRC}' +def rm_tgt(cls): + old=cls.run + def wrap(self): + try:os.remove(self.outputs[0].abspath()) + except OSError:pass + return old(self) + setattr(cls,'run',wrap) +rm_tgt(stlink_task) +def apply_link(self): + for x in self.features: + if x=='cprogram'and'cxx'in self.features: + x='cxxprogram' + elif x=='cshlib'and'cxx'in self.features: + x='cxxshlib' + if x in Task.classes: + if issubclass(Task.classes[x],link_task): + link=x + break + else: + return + objs=[t.outputs[0]for t in getattr(self,'compiled_tasks',[])] + self.link_task=self.create_task(link,objs) + self.link_task.add_target(self.target) + try: + inst_to=self.install_path + except AttributeError: + inst_to=self.link_task.__class__.inst_to + if inst_to: + self.install_task=self.bld.install_files(inst_to,self.link_task.outputs[:],env=self.env,chmod=self.link_task.chmod) +def use_rec(self,name,**kw): + if name in self.tmp_use_not or name in self.tmp_use_seen: + return + try: + y=self.bld.get_tgen_by_name(name) + except Errors.WafError: + self.uselib.append(name) + self.tmp_use_not.add(name) + return + self.tmp_use_seen.append(name) + y.post() + y.tmp_use_objects=objects=kw.get('objects',True) + y.tmp_use_stlib=stlib=kw.get('stlib',True) + try: + link_task=y.link_task + except AttributeError: + y.tmp_use_var='' + else: + objects=False + if not isinstance(y.link_task,stlink_task): + stlib=False + y.tmp_use_var='LIB' + else: + y.tmp_use_var='STLIB' + p=self.tmp_use_prec + for x in self.to_list(getattr(y,'use',[])): + try: + p[x].append(name) + except: + p[x]=[name] + self.use_rec(x,objects=objects,stlib=stlib) +def process_use(self): + use_not=self.tmp_use_not=set([]) + use_seen=self.tmp_use_seen=[] + use_prec=self.tmp_use_prec={} + self.uselib=self.to_list(getattr(self,'uselib',[])) + self.includes=self.to_list(getattr(self,'includes',[])) + names=self.to_list(getattr(self,'use',[])) + for x in names: + self.use_rec(x) + for x in use_not: + if x in use_prec: + del use_prec[x] + out=[] + tmp=[] + for x in self.tmp_use_seen: + for k in use_prec.values(): + if x in k: + break + else: + tmp.append(x) + while tmp: + e=tmp.pop() + out.append(e) + try: + nlst=use_prec[e] + except KeyError: + pass + else: + del use_prec[e] + for x in nlst: + for y in use_prec: + if x in use_prec[y]: + break + else: + tmp.append(x) + if use_prec: + raise Errors.WafError('Cycle detected in the use processing %r'%use_prec) + out.reverse() + link_task=getattr(self,'link_task',None) + for x in out: + y=self.bld.get_tgen_by_name(x) + var=y.tmp_use_var + if var and link_task: + if var=='LIB'or y.tmp_use_stlib: + self.env.append_value(var,[y.target[y.target.rfind(os.sep)+1:]]) + self.link_task.dep_nodes.extend(y.link_task.outputs) + tmp_path=y.link_task.outputs[0].parent.path_from(self.bld.bldnode) + self.env.append_value(var+'PATH',[tmp_path]) + else: + if y.tmp_use_objects: + self.add_objects_from_tgen(y) + if getattr(y,'export_includes',None): + self.includes.extend(y.to_incnodes(y.export_includes)) + for x in names: + try: + y=self.bld.get_tgen_by_name(x) + except: + if not self.env['STLIB_'+x]and not x in self.uselib: + self.uselib.append(x) + else: + for k in self.to_list(getattr(y,'uselib',[])): + if not self.env['STLIB_'+k]and not k in self.uselib: + self.uselib.append(k) +def add_objects_from_tgen(self,tg): + try: + link_task=self.link_task + except AttributeError: + pass + else: + for tsk in getattr(tg,'compiled_tasks',[]): + for x in tsk.outputs: + if x.name.endswith('.o')or x.name.endswith('.obj'): + link_task.inputs.append(x) +def get_uselib_vars(self): + _vars=set([]) + for x in self.features: + if x in USELIB_VARS: + _vars|=USELIB_VARS[x] + return _vars +def propagate_uselib_vars(self): + _vars=self.get_uselib_vars() + env=self.env + for x in _vars: + y=x.lower() + env.append_unique(x,self.to_list(getattr(self,y,[]))) + for x in self.features: + for var in _vars: + compvar='%s_%s'%(var,x) + env.append_value(var,env[compvar]) + for x in self.to_list(getattr(self,'uselib',[])): + for v in _vars: + env.append_value(v,env[v+'_'+x]) +def apply_implib(self): + if not self.env.DEST_BINFMT=='pe': + return + dll=self.link_task.outputs[0] + if isinstance(self.target,Node.Node): + name=self.target.name + else: + name=os.path.split(self.target)[1] + implib=self.env['implib_PATTERN']%name + implib=dll.parent.find_or_declare(implib) + self.env.append_value('LINKFLAGS',self.env['IMPLIB_ST']%implib.bldpath()) + self.link_task.outputs.append(implib) + if getattr(self,'defs',None)and self.env.DEST_BINFMT=='pe': + node=self.path.find_resource(self.defs) + if not node: + raise Errors.WafError('invalid def file %r'%self.defs) + if'msvc'in(self.env.CC_NAME,self.env.CXX_NAME): + self.env.append_value('LINKFLAGS','/def:%s'%node.path_from(self.bld.bldnode)) + self.link_task.dep_nodes.append(node) + else: + self.link_task.inputs.append(node) + try: + inst_to=self.install_path + except AttributeError: + inst_to=self.link_task.__class__.inst_to + if not inst_to: + return + self.implib_install_task=self.bld.install_as('${PREFIX}/lib/%s'%implib.name,implib,self.env) +def apply_vnum(self): + if not getattr(self,'vnum','')or os.name!='posix'or self.env.DEST_BINFMT not in('elf','mac-o'): + return + link=self.link_task + nums=self.vnum.split('.') + node=link.outputs[0] + libname=node.name + if libname.endswith('.dylib'): + name3=libname.replace('.dylib','.%s.dylib'%self.vnum) + name2=libname.replace('.dylib','.%s.dylib'%nums[0]) + else: + name3=libname+'.'+self.vnum + name2=libname+'.'+nums[0] + if self.env.SONAME_ST: + v=self.env.SONAME_ST%name2 + self.env.append_value('LINKFLAGS',v.split()) + tsk=self.create_task('vnum',node,[node.parent.find_or_declare(name2),node.parent.find_or_declare(name3)]) + if getattr(self.bld,'is_install',None): + self.install_task.hasrun=Task.SKIP_ME + bld=self.bld + path=self.install_task.dest + t1=bld.install_as(path+os.sep+name3,node,env=self.env,chmod=self.link_task.chmod) + t2=bld.symlink_as(path+os.sep+name2,name3) + t3=bld.symlink_as(path+os.sep+libname,name3) + self.vnum_install_task=(t1,t2,t3) + if'-dynamiclib'in self.env['LINKFLAGS']and getattr(self,'install_task',None): + path=os.path.join(self.install_task.get_install_path(),self.link_task.outputs[0].name) + self.env.append_value('LINKFLAGS',['-install_name',path]) +class vnum(Task.Task): + color='CYAN' + quient=True + ext_in=['.bin'] + def run(self): + for x in self.outputs: + path=x.abspath() + try: + os.remove(path) + except OSError: + pass + try: + os.symlink(self.inputs[0].name,path) + except OSError: + return 1 +class fake_shlib(link_task): + def runnable_status(self): + for t in self.run_after: + if not t.hasrun: + return Task.ASK_LATER + for x in self.outputs: + x.sig=Utils.h_file(x.abspath()) + return Task.SKIP_ME +class fake_stlib(stlink_task): + def runnable_status(self): + for t in self.run_after: + if not t.hasrun: + return Task.ASK_LATER + for x in self.outputs: + x.sig=Utils.h_file(x.abspath()) + return Task.SKIP_ME +def read_shlib(self,name,paths=[]): + return self(name=name,features='fake_lib',lib_paths=paths,lib_type='shlib') +def read_stlib(self,name,paths=[]): + return self(name=name,features='fake_lib',lib_paths=paths,lib_type='stlib') +lib_patterns={'shlib':['lib%s.so','%s.so','lib%s.dll','%s.dll'],'stlib':['lib%s.a','%s.a','lib%s.dll','%s.dll','lib%s.lib','%s.lib'],} +def process_lib(self): + node=None + names=[x%self.name for x in lib_patterns[self.lib_type]] + for x in self.lib_paths+[self.path,'/usr/lib64','/usr/lib','/usr/local/lib64','/usr/local/lib']: + if not isinstance(x,Node.Node): + x=self.bld.root.find_node(x)or self.path.find_node(x) + if not x: + continue + for y in names: + node=x.find_node(y) + if node: + node.sig=Utils.h_file(node.abspath()) + break + else: + continue + break + else: + raise Errors.WafError('could not find library %r'%self.name) + self.link_task=self.create_task('fake_%s'%self.lib_type,[],[node]) + self.target=self.name +class fake_o(Task.Task): + def runnable_status(self): + return Task.SKIP_ME +def add_those_o_files(self,node): + tsk=self.create_task('fake_o',[],node) + try: + self.compiled_tasks.append(tsk) + except AttributeError: + self.compiled_tasks=[tsk] + +taskgen_method(create_compiled_task) +taskgen_method(to_incnodes) +feature('c','cxx','d','go','asm','fc','includes')(apply_incpaths) +after_method('propagate_uselib_vars','process_source')(apply_incpaths) +feature('c','cxx','d','go','fc','asm')(apply_link) +after_method('process_source')(apply_link) +taskgen_method(use_rec) +feature('c','cxx','d','use','fc')(process_use) +before_method('apply_incpaths','propagate_uselib_vars')(process_use) +after_method('apply_link','process_source')(process_use) +taskgen_method(add_objects_from_tgen) +taskgen_method(get_uselib_vars) +feature('c','cxx','d','fc','javac','cs','uselib')(propagate_uselib_vars) +after_method('process_use')(propagate_uselib_vars) +feature('cshlib','cxxshlib','fcshlib')(apply_implib) +after_method('apply_link')(apply_implib) +feature('cshlib','cxxshlib','dshlib','fcshlib','vnum')(apply_vnum) +after_method('apply_link')(apply_vnum) +conf(read_shlib) +conf(read_stlib) +feature('fake_lib')(process_lib) +extension('.o','.obj')(add_those_o_files) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/compiler_c.py @@ -0,0 +1,39 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys,imp,types +from waflib.Tools import ccroot +from waflib import Utils,Configure +from waflib.Logs import debug +c_compiler={'win32':['msvc','gcc'],'cygwin':['gcc'],'darwin':['gcc'],'aix':['xlc','gcc'],'linux':['gcc','icc'],'sunos':['suncc','gcc'],'irix':['gcc','irixcc'],'hpux':['gcc'],'gnu':['gcc'],'java':['gcc','msvc','icc'],'default':['gcc'],} +def configure(conf): + try:test_for_compiler=conf.options.check_c_compiler + except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_c')") + for compiler in test_for_compiler.split(): + conf.env.stash() + conf.start_msg('Checking for %r (c compiler)'%compiler) + try: + conf.load(compiler) + except conf.errors.ConfigurationError ,e: + conf.env.revert() + conf.end_msg(False) + debug('compiler_c: %r'%e) + else: + if conf.env['CC']: + conf.end_msg(conf.env.get_flat('CC')) + conf.env['COMPILER_CC']=compiler + break + conf.end_msg(False) + else: + conf.fatal('could not configure a c compiler!') +def options(opt): + opt.load_special_tools('c_*.py',ban=['c_dumbpreproc.py']) + global c_compiler + build_platform=Utils.unversioned_sys_platform() + possible_compiler_list=c_compiler[build_platform in c_compiler and build_platform or'default'] + test_for_compiler=' '.join(possible_compiler_list) + cc_compiler_opts=opt.add_option_group("C Compiler Options") + cc_compiler_opts.add_option('--check-c-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C-Compiler will be checked by default: "%s"'%(build_platform,test_for_compiler),dest="check_c_compiler") + for x in test_for_compiler.split(): + opt.load('%s'%x) --- /dev/null +++ b/waflib/Tools/compiler_cxx.py @@ -0,0 +1,39 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys,imp,types +from waflib.Tools import ccroot +from waflib import Utils,Configure +from waflib.Logs import debug +cxx_compiler={'win32':['msvc','g++'],'cygwin':['g++'],'darwin':['g++'],'aix':['xlc++','g++'],'linux':['g++','icpc'],'sunos':['sunc++','g++'],'irix':['g++'],'hpux':['g++'],'gnu':['g++'],'java':['g++','msvc','icpc'],'default':['g++']} +def configure(conf): + try:test_for_compiler=conf.options.check_cxx_compiler + except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_cxx')") + for compiler in test_for_compiler.split(): + conf.env.stash() + conf.start_msg('Checking for %r (c++ compiler)'%compiler) + try: + conf.load(compiler) + except conf.errors.ConfigurationError ,e: + conf.env.revert() + conf.end_msg(False) + debug('compiler_cxx: %r'%e) + else: + if conf.env['CXX']: + conf.end_msg(conf.env.get_flat('CXX')) + conf.env['COMPILER_CXX']=compiler + break + conf.end_msg(False) + else: + conf.fatal('could not configure a c++ compiler!') +def options(opt): + opt.load_special_tools('cxx_*.py') + global cxx_compiler + build_platform=Utils.unversioned_sys_platform() + possible_compiler_list=cxx_compiler[build_platform in cxx_compiler and build_platform or'default'] + test_for_compiler=' '.join(possible_compiler_list) + cxx_compiler_opts=opt.add_option_group('C++ Compiler Options') + cxx_compiler_opts.add_option('--check-cxx-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C++ Compiler will be checked by default: "%s"'%(build_platform,test_for_compiler),dest="check_cxx_compiler") + for x in test_for_compiler.split(): + opt.load('%s'%x) --- /dev/null +++ b/waflib/Tools/compiler_d.py @@ -0,0 +1,30 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys,imp,types +from waflib import Utils,Configure,Options,Logs +def configure(conf): + for compiler in conf.options.dcheck.split(','): + conf.env.stash() + conf.start_msg('Checking for %r (d compiler)'%compiler) + try: + conf.load(compiler) + except conf.errors.ConfigurationError ,e: + conf.env.revert() + conf.end_msg(False) + Logs.debug('compiler_cxx: %r'%e) + else: + if conf.env.D: + conf.end_msg(conf.env.get_flat('D')) + conf.env['COMPILER_D']=compiler + conf.env.D_COMPILER=conf.env.D + break + conf.end_msg(False) + else: + conf.fatal('no suitable d compiler was found') +def options(opt): + d_compiler_opts=opt.add_option_group('D Compiler Options') + d_compiler_opts.add_option('--check-d-compiler',default='gdc,dmd',action='store',help='check for the compiler [Default:gdc,dmd]',dest='dcheck') + for d_compiler in['gdc','dmd']: + opt.load('%s'%d_compiler) --- /dev/null +++ b/waflib/Tools/compiler_fc.py @@ -0,0 +1,43 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys,imp,types +from waflib import Utils,Configure,Options,Logs,Errors +from waflib.Tools import fc +fc_compiler={'win32':['gfortran','ifort'],'darwin':['gfortran','g95','ifort'],'linux':['gfortran','g95','ifort'],'java':['gfortran','g95','ifort'],'default':['gfortran'],'aix':['gfortran']} +def __list_possible_compiler(platform): + try: + return fc_compiler[platform] + except KeyError: + return fc_compiler["default"] +def configure(conf): + try:test_for_compiler=conf.options.check_fc + except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_fc')") + for compiler in test_for_compiler.split(): + conf.env.stash() + conf.start_msg('Checking for %r (fortran compiler)'%compiler) + try: + conf.load(compiler) + except conf.errors.ConfigurationError ,e: + conf.env.revert() + conf.end_msg(False) + Logs.debug('compiler_fortran: %r'%e) + else: + if conf.env['FC']: + conf.end_msg(conf.env.get_flat('FC')) + conf.env.COMPILER_FORTRAN=compiler + break + conf.end_msg(False) + else: + conf.fatal('could not configure a fortran compiler!') +def options(opt): + opt.load_special_tools('fc_*.py') + build_platform=Utils.unversioned_sys_platform() + detected_platform=Options.platform + possible_compiler_list=__list_possible_compiler(detected_platform) + test_for_compiler=' '.join(possible_compiler_list) + fortran_compiler_opts=opt.add_option_group("Fortran Compiler Options") + fortran_compiler_opts.add_option('--check-fortran-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following Fortran Compiler will be checked by default: "%s"'%(detected_platform,test_for_compiler),dest="check_fc") + for compiler in test_for_compiler.split(): + opt.load('%s'%compiler) --- /dev/null +++ b/waflib/Tools/cs.py @@ -0,0 +1,98 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +from waflib import Utils,Task,Options,Logs,Errors +from waflib.TaskGen import before_method,after_method,feature +from waflib.Tools import ccroot +from waflib.Configure import conf +ccroot.USELIB_VARS['cs']=set(['CSFLAGS','ASSEMBLIES','RESOURCES']) +ccroot.lib_patterns['csshlib']=['%s'] +def apply_cs(self): + cs_nodes=[] + no_nodes=[] + for x in self.to_nodes(self.source): + if x.name.endswith('.cs'): + cs_nodes.append(x) + else: + no_nodes.append(x) + self.source=no_nodes + bintype=getattr(self,'type',self.gen.endswith('.dll')and'library'or'exe') + self.cs_task=tsk=self.create_task('mcs',cs_nodes,self.path.find_or_declare(self.gen)) + tsk.env.CSTYPE='/target:%s'%bintype + tsk.env.OUT='/out:%s'%tsk.outputs[0].abspath() + inst_to=getattr(self,'install_path',bintype=='exe'and'${BINDIR}'or'${LIBDIR}') + if inst_to: + mod=getattr(self,'chmod',bintype=='exe'and Utils.O755 or Utils.O644) + self.install_task=self.bld.install_files(inst_to,self.cs_task.outputs[:],env=self.env,chmod=mod) +def use_cs(self): + names=self.to_list(getattr(self,'use',[])) + get=self.bld.get_tgen_by_name + for x in names: + try: + y=get(x) + except Errors.WafError: + self.cs_task.env.append_value('CSFLAGS','/reference:%s'%x) + continue + y.post() + tsk=getattr(y,'cs_task',None)or getattr(y,'link_task',None) + if not tsk: + self.bld.fatal('cs task has no link task for use %r'%self) + self.cs_task.dep_nodes.extend(tsk.outputs) + self.cs_task.set_run_after(tsk) + self.cs_task.env.append_value('CSFLAGS','/reference:%s'%tsk.outputs[0].abspath()) +def debug_cs(self): + csdebug=getattr(self,'csdebug',self.env.CSDEBUG) + if not csdebug: + return + node=self.cs_task.outputs[0] + if self.env.CS_NAME=='mono': + out=node.parent.find_or_declare(node.name+'.mdb') + else: + out=node.change_ext('.pdb') + self.cs_task.outputs.append(out) + try: + self.install_task.source.append(out) + except AttributeError: + pass + if csdebug=='pdbonly': + val=['/debug+','/debug:pdbonly'] + elif csdebug=='full': + val=['/debug+','/debug:full'] + else: + val=['/debug-'] + self.cs_task.env.append_value('CSFLAGS',val) +class mcs(Task.Task): + color='YELLOW' + run_str='${MCS} ${CSTYPE} ${CSFLAGS} ${ASS_ST:ASSEMBLIES} ${RES_ST:RESOURCES} ${OUT} ${SRC}' +def configure(conf): + csc=getattr(Options.options,'cscbinary',None) + if csc: + conf.env.MCS=csc + conf.find_program(['csc','mcs','gmcs'],var='MCS') + conf.env.ASS_ST='/r:%s' + conf.env.RES_ST='/resource:%s' + conf.env.CS_NAME='csc' + if str(conf.env.MCS).lower().find('mcs')>-1: + conf.env.CS_NAME='mono' +def options(opt): + opt.add_option('--with-csc-binary',type='string',dest='cscbinary') +class fake_csshlib(Task.Task): + color='YELLOW' + inst_to=None + def runnable_status(self): + for x in self.outputs: + x.sig=Utils.h_file(x.abspath()) + return Task.SKIP_ME +def read_csshlib(self,name,paths=[]): + return self(name=name,features='fake_lib',lib_paths=paths,lib_type='csshlib') + +feature('cs')(apply_cs) +before_method('process_source')(apply_cs) +feature('cs')(use_cs) +after_method('apply_cs')(use_cs) +feature('cs')(debug_cs) +after_method('apply_cs','use_cs')(debug_cs) +conf(read_csshlib) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/cxx.py @@ -0,0 +1,27 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +from waflib import TaskGen,Task,Utils +from waflib.Tools import c_preproc +from waflib.Tools.ccroot import link_task,stlink_task +def cxx_hook(self,node): + return self.create_compiled_task('cxx',node) +TaskGen.extension('.cpp','.cc','.cxx','.C','.c++')(cxx_hook) +if not'.c'in TaskGen.task_gen.mappings: + TaskGen.task_gen.mappings['.c']=TaskGen.task_gen.mappings['.cpp'] +class cxx(Task.Task): + run_str='${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXX_SRC_F}${SRC} ${CXX_TGT_F}${TGT}' + vars=['CXXDEPS'] + ext_in=['.h'] + scan=c_preproc.scan +class cxxprogram(link_task): + run_str='${LINK_CXX} ${LINKFLAGS} ${CXXLNK_SRC_F}${SRC} ${CXXLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${FRAMEWORK_ST:FRAMEWORK} ${ARCH_ST:ARCH} ${STLIB_MARKER} ${STLIBPATH_ST:STLIBPATH} ${STLIB_ST:STLIB} ${SHLIB_MARKER} ${LIBPATH_ST:LIBPATH} ${LIB_ST:LIB}' + vars=['LINKDEPS'] + ext_out=['.bin'] + inst_to='${BINDIR}' + chmod=Utils.O755 +class cxxshlib(cxxprogram): + inst_to='${LIBDIR}' +class cxxstlib(stlink_task): + pass --- /dev/null +++ b/waflib/Tools/d.py @@ -0,0 +1,56 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +from waflib import Utils,Task,Errors +from waflib.TaskGen import taskgen_method,feature,extension +from waflib.Tools import d_scan,d_config +from waflib.Tools.ccroot import link_task,stlink_task +class d(Task.Task): + color='GREEN' + run_str='${D} ${DFLAGS} ${DINC_ST:INCPATHS} ${D_SRC_F:SRC} ${D_TGT_F:TGT}' + scan=d_scan.scan +class d_with_header(d): + run_str='${D} ${DFLAGS} ${DINC_ST:INCPATHS} ${D_HDR_F:tgt.outputs[1].bldpath()} ${D_SRC_F:SRC} ${D_TGT_F:tgt.outputs[0].bldpath()}' +class d_header(Task.Task): + color='BLUE' + run_str='${D} ${D_HEADER} ${SRC}' +class dprogram(link_task): + run_str='${D_LINKER} ${LINKFLAGS} ${DLNK_SRC_F}${SRC} ${DLNK_TGT_F:TGT} ${RPATH_ST:RPATH} ${DSTLIB_MARKER} ${DSTLIBPATH_ST:STLIBPATH} ${DSTLIB_ST:STLIB} ${DSHLIB_MARKER} ${DLIBPATH_ST:LIBPATH} ${DSHLIB_ST:LIB}' + inst_to='${BINDIR}' + chmod=Utils.O755 +class dshlib(dprogram): + inst_to='${LIBDIR}' +class dstlib(stlink_task): + pass +def d_hook(self,node): + ext=Utils.destos_to_binfmt(self.env.DEST_OS)=='pe'and'obj'or'o' + out='%s.%d.%s'%(node.name,self.idx,ext) + def create_compiled_task(self,name,node): + task=self.create_task(name,node,node.parent.find_or_declare(out)) + try: + self.compiled_tasks.append(task) + except AttributeError: + self.compiled_tasks=[task] + return task + if getattr(self,'generate_headers',None): + tsk=create_compiled_task(self,'d_with_header',node) + tsk.outputs.append(node.change_ext(self.env['DHEADER_ext'])) + else: + tsk=create_compiled_task(self,'d',node) + return tsk +def generate_header(self,filename,install_path=None): + try: + self.header_lst.append([filename,install_path]) + except AttributeError: + self.header_lst=[[filename,install_path]] +def process_header(self): + for i in getattr(self,'header_lst',[]): + node=self.path.find_resource(i[0]) + if not node: + raise Errors.WafError('file %r not found on d obj'%i[0]) + self.create_task('d_header',node,node.change_ext('.di')) + +extension('.d','.di','.D')(d_hook) +taskgen_method(generate_header) +feature('d')(process_header) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/d_config.py @@ -0,0 +1,47 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +from waflib import Utils +from waflib.Configure import conf +def d_platform_flags(self): + v=self.env + if not v.DEST_OS: + v.DEST_OS=Utils.unversioned_sys_platform() + if Utils.destos_to_binfmt(self.env.DEST_OS)=='pe': + v['dprogram_PATTERN']='%s.exe' + v['dshlib_PATTERN']='lib%s.dll' + v['dstlib_PATTERN']='lib%s.a' + else: + v['dprogram_PATTERN']='%s' + v['dshlib_PATTERN']='lib%s.so' + v['dstlib_PATTERN']='lib%s.a' +DLIB=''' +version(D_Version2) { + import std.stdio; + int main() { + writefln("phobos2"); + return 0; + } +} else { + version(Tango) { + import tango.stdc.stdio; + int main() { + printf("tango"); + return 0; + } + } else { + import std.stdio; + int main() { + writefln("phobos1"); + return 0; + } + } +} +''' +def check_dlibrary(self): + ret=self.check_cc(features='d dprogram',fragment=DLIB,compile_filename='test.d',execute=True,define_ret=True) + self.env.DLIBRARY=ret.strip() + +conf(d_platform_flags) +conf(check_dlibrary) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/d_scan.py @@ -0,0 +1,133 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import re +from waflib import Utils,Logs +def filter_comments(filename): + txt=Utils.readf(filename) + i=0 + buf=[] + max=len(txt) + begin=0 + while i-1: + conf.fatal('dmd2 on Windows is not supported, use gdc or ldc instead') + conf.load('ar') + conf.load('d') + conf.common_flags_dmd() + conf.d_platform_flags() + if str(conf.env.D).find('ldc')>-1: + conf.common_flags_ldc() + +conf(find_dmd) +conf(common_flags_ldc) +conf(common_flags_dmd) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/errcheck.py @@ -0,0 +1,161 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +typos={'feature':'features','sources':'source','targets':'target','include':'includes','export_include':'export_includes','define':'defines','importpath':'includes','installpath':'install_path',} +meths_typos=['__call__','program','shlib','stlib','objects'] +from waflib import Logs,Build,Node,Task,TaskGen,ConfigSet,Errors,Utils +import waflib.Tools.ccroot +def check_same_targets(self): + mp=Utils.defaultdict(list) + uids={} + def check_task(tsk): + if not isinstance(tsk,Task.Task): + return + for node in tsk.outputs: + mp[node].append(tsk) + try: + uids[tsk.uid()].append(tsk) + except: + uids[tsk.uid()]=[tsk] + for g in self.groups: + for tg in g: + try: + for tsk in tg.tasks: + check_task(tsk) + except AttributeError: + check_task(tg) + dupe=False + for(k,v)in mp.items(): + if len(v)>1: + dupe=True + msg='* Node %r is created by more than once%s. The task generators are:'%(k,Logs.verbose==1 and" (full message on 'waf -v -v')"or"") + Logs.error(msg) + for x in v: + if Logs.verbose>1: + Logs.error(' %d. %r'%(1+v.index(x),x.generator)) + else: + Logs.error(' %d. %r in %r'%(1+v.index(x),x.generator.name,getattr(x.generator,'path',None))) + if not dupe: + for(k,v)in uids.items(): + if len(v)>1: + Logs.error('* Several tasks use the same identifier. Please check the information on\n http://waf.googlecode.com/git/docs/apidocs/Task.html#waflib.Task.Task.uid') + for tsk in v: + Logs.error(' - object %r (%r) defined in %r'%(tsk.__class__.__name__,tsk,tsk.generator)) +def check_invalid_constraints(self): + feat=set([]) + for x in list(TaskGen.feats.values()): + feat.union(set(x)) + for(x,y)in TaskGen.task_gen.prec.items(): + feat.add(x) + feat.union(set(y)) + ext=set([]) + for x in TaskGen.task_gen.mappings.values(): + ext.add(x.__name__) + invalid=ext&feat + if invalid: + Logs.error('The methods %r have invalid annotations: @extension <-> @feature/@before_method/@after_method'%list(invalid)) + for cls in list(Task.classes.values()): + for x in('before','after'): + for y in Utils.to_list(getattr(cls,x,[])): + if not Task.classes.get(y,None): + Logs.error('Erroneous order constraint %r=%r on task class %r'%(x,y,cls.__name__)) + if getattr(cls,'rule',None): + Logs.error('Erroneous attribute "rule" on task class %r (rename to "run_str")'%cls.__name__) +def replace(m): + oldcall=getattr(Build.BuildContext,m) + def call(self,*k,**kw): + ret=oldcall(self,*k,**kw) + for x in typos: + if x in kw: + err=True + Logs.error('Fix the typo %r -> %r on %r'%(x,typos[x],ret)) + return ret + setattr(Build.BuildContext,m,call) +def enhance_lib(): + for m in meths_typos: + replace(m) + def ant_glob(self,*k,**kw): + if k: + lst=Utils.to_list(k[0]) + for pat in lst: + if'..'in pat.split('/'): + Logs.error("In ant_glob pattern %r: '..' means 'two dots', not 'parent directory'"%k[0]) + if kw.get('remove',True): + try: + if self.is_child_of(self.ctx.bldnode)and not kw.get('quiet',False): + Logs.error('Using ant_glob on the build folder (%r) is dangerous (quiet=True to disable this warning)'%self) + except AttributeError: + pass + return self.old_ant_glob(*k,**kw) + Node.Node.old_ant_glob=Node.Node.ant_glob + Node.Node.ant_glob=ant_glob + old=Task.is_before + def is_before(t1,t2): + ret=old(t1,t2) + if ret and old(t2,t1): + Logs.error('Contradictory order constraints in classes %r %r'%(t1,t2)) + return ret + Task.is_before=is_before + def check_err_features(self): + lst=self.to_list(self.features) + if'shlib'in lst: + Logs.error('feature shlib -> cshlib, dshlib or cxxshlib') + for x in('c','cxx','d','fc'): + if not x in lst and lst and lst[0]in[x+y for y in('program','shlib','stlib')]: + Logs.error('%r features is probably missing %r'%(self,x)) + TaskGen.feature('*')(check_err_features) + def check_err_order(self): + if not hasattr(self,'rule'): + for x in('before','after','ext_in','ext_out'): + if hasattr(self,x): + Logs.warn('Erroneous order constraint %r on non-rule based task generator %r'%(x,self)) + else: + for x in('before','after'): + for y in self.to_list(getattr(self,x,[])): + if not Task.classes.get(y,None): + Logs.error('Erroneous order constraint %s=%r on %r'%(x,y,self)) + TaskGen.feature('*')(check_err_order) + def check_compile(self): + check_invalid_constraints(self) + try: + ret=self.orig_compile() + finally: + check_same_targets(self) + return ret + Build.BuildContext.orig_compile=Build.BuildContext.compile + Build.BuildContext.compile=check_compile + def use_rec(self,name,**kw): + try: + y=self.bld.get_tgen_by_name(name) + except Errors.WafError: + pass + else: + idx=self.bld.get_group_idx(self) + odx=self.bld.get_group_idx(y) + if odx>idx: + msg="Invalid 'use' across build groups:" + if Logs.verbose>1: + msg+='\n target %r\n uses:\n %r'%(self,y) + else: + msg+=" %r uses %r (try 'waf -v -v' for the full error)"%(self.name,name) + raise Errors.WafError(msg) + self.orig_use_rec(name,**kw) + TaskGen.task_gen.orig_use_rec=TaskGen.task_gen.use_rec + TaskGen.task_gen.use_rec=use_rec + def getattri(self,name,default=None): + if name=='append'or name=='add': + raise Errors.WafError('env.append and env.add do not exist: use env.append_value/env.append_unique') + elif name=='prepend': + raise Errors.WafError('env.prepend does not exist: use env.prepend_value') + if name in self.__slots__: + return object.__getattr__(self,name,default) + else: + return self[name] + ConfigSet.ConfigSet.__getattr__=getattri +def options(opt): + enhance_lib() +def configure(conf): + pass --- /dev/null +++ b/waflib/Tools/fc.py @@ -0,0 +1,123 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import re +from waflib import Utils,Task,TaskGen,Logs +from waflib.Tools import ccroot,fc_config,fc_scan +from waflib.TaskGen import feature,before_method,after_method,extension +from waflib.Configure import conf +ccroot.USELIB_VARS['fc']=set(['FCFLAGS','DEFINES','INCLUDES']) +ccroot.USELIB_VARS['fcprogram_test']=ccroot.USELIB_VARS['fcprogram']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS']) +ccroot.USELIB_VARS['fcshlib']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS']) +ccroot.USELIB_VARS['fcstlib']=set(['ARFLAGS','LINKDEPS']) +def dummy(self): + pass +def fc_hook(self,node): + return self.create_compiled_task('fc',node) +def modfile(conf,name): + return{'lower':name.lower()+'.mod','lower.MOD':name.upper()+'.MOD','UPPER.mod':name.upper()+'.mod','UPPER':name.upper()+'.MOD'}[conf.env.FC_MOD_CAPITALIZATION or'lower'] +def get_fortran_tasks(tsk): + bld=tsk.generator.bld + tasks=bld.get_tasks_group(bld.get_group_idx(tsk.generator)) + return[x for x in tasks if isinstance(x,fc)and not getattr(x,'nomod',None)and not getattr(x,'mod_fortran_done',None)] +class fc(Task.Task): + color='GREEN' + run_str='${FC} ${FCFLAGS} ${FCINCPATH_ST:INCPATHS} ${FCDEFINES_ST:DEFINES} ${_FCMODOUTFLAGS} ${FC_TGT_F}${TGT[0].abspath()} ${FC_SRC_F}${SRC[0].abspath()}' + vars=["FORTRANMODPATHFLAG"] + def scan(self): + tmp=fc_scan.fortran_parser(self.generator.includes_nodes) + tmp.task=self + tmp.start(self.inputs[0]) + if Logs.verbose: + Logs.debug('deps: deps for %r: %r; unresolved %r'%(self.inputs,tmp.nodes,tmp.names)) + return(tmp.nodes,tmp.names) + def runnable_status(self): + if getattr(self,'mod_fortran_done',None): + return super(fc,self).runnable_status() + bld=self.generator.bld + lst=get_fortran_tasks(self) + for tsk in lst: + tsk.mod_fortran_done=True + for tsk in lst: + ret=tsk.runnable_status() + if ret==Task.ASK_LATER: + for x in lst: + x.mod_fortran_done=None + return Task.ASK_LATER + ins=Utils.defaultdict(set) + outs=Utils.defaultdict(set) + for tsk in lst: + key=tsk.uid() + for x in bld.raw_deps[key]: + if x.startswith('MOD@'): + name=bld.modfile(x.replace('MOD@','')) + node=bld.srcnode.find_or_declare(name) + tsk.set_outputs(node) + outs[id(node)].add(tsk) + for tsk in lst: + key=tsk.uid() + for x in bld.raw_deps[key]: + if x.startswith('USE@'): + name=bld.modfile(x.replace('USE@','')) + node=bld.srcnode.find_resource(name) + if node and node not in tsk.outputs: + if not node in bld.node_deps[key]: + bld.node_deps[key].append(node) + ins[id(node)].add(tsk) + for k in ins.keys(): + for a in ins[k]: + a.run_after.update(outs[k]) + tmp=[] + for t in outs[k]: + tmp.extend(t.outputs) + a.dep_nodes.extend(tmp) + try: + a.dep_nodes.sort(key=lambda x:x.abspath()) + except: + a.dep_nodes.sort(lambda x,y:cmp(x.abspath(),y.abspath())) + for tsk in lst: + try: + delattr(tsk,'cache_sig') + except AttributeError: + pass + return super(fc,self).runnable_status() +class fcprogram(ccroot.link_task): + color='YELLOW' + run_str='${FC} ${LINKFLAGS} ${FCLNK_SRC_F}${SRC} ${FCLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FCSTLIB_MARKER} ${FCSTLIBPATH_ST:STLIBPATH} ${FCSTLIB_ST:STLIB} ${FCSHLIB_MARKER} ${FCLIBPATH_ST:LIBPATH} ${FCLIB_ST:LIB}' + inst_to='${BINDIR}' + chmod=Utils.O755 +class fcshlib(fcprogram): + inst_to='${LIBDIR}' +class fcprogram_test(fcprogram): + def can_retrieve_cache(self): + return False + def runnable_status(self): + ret=super(fcprogram_test,self).runnable_status() + if ret==Task.SKIP_ME: + ret=Task.RUN_ME + return ret + def exec_command(self,cmd,**kw): + bld=self.generator.bld + kw['shell']=isinstance(cmd,str) + kw['stdout']=kw['stderr']=Utils.subprocess.PIPE + kw['cwd']=bld.variant_dir + bld.out=bld.err='' + bld.to_log('command: %s\n'%cmd) + kw['output']=0 + try: + (bld.out,bld.err)=bld.cmd_and_log(cmd,**kw) + except Exception ,e: + return-1 + if bld.out: + bld.to_log("out: %s\n"%bld.out) + if bld.err: + bld.to_log("err: %s\n"%bld.err) +class fcstlib(ccroot.stlink_task): + pass + +feature('fcprogram','fcshlib','fcstlib','fcprogram_test')(dummy) +extension('.f','.f90','.F','.F90','.for','.FOR')(fc_hook) +conf(modfile) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/fc_config.py @@ -0,0 +1,283 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import re,shutil,os,sys,string,shlex +from waflib.Configure import conf +from waflib.TaskGen import feature,after_method,before_method +from waflib import Build,Utils +FC_FRAGMENT=' program main\n end program main\n' +FC_FRAGMENT2=' PROGRAM MAIN\n END\n' +def fc_flags(conf): + v=conf.env + v['FC_SRC_F']=[] + v['FC_TGT_F']=['-c','-o'] + v['FCINCPATH_ST']='-I%s' + v['FCDEFINES_ST']='-D%s' + if not v['LINK_FC']:v['LINK_FC']=v['FC'] + v['FCLNK_SRC_F']=[] + v['FCLNK_TGT_F']=['-o'] + v['FCFLAGS_fcshlib']=['-fpic'] + v['LINKFLAGS_fcshlib']=['-shared'] + v['fcshlib_PATTERN']='lib%s.so' + v['fcstlib_PATTERN']='lib%s.a' + v['FCLIB_ST']='-l%s' + v['FCLIBPATH_ST']='-L%s' + v['FCSTLIB_ST']='-l%s' + v['FCSTLIBPATH_ST']='-L%s' + v['FCSTLIB_MARKER']='-Wl,-Bstatic' + v['FCSHLIB_MARKER']='-Wl,-Bdynamic' + v['SONAME_ST']='-Wl,-h,%s' +def check_fortran(self,*k,**kw): + self.check_cc(fragment=FC_FRAGMENT,compile_filename='test.f',features='fc fcprogram',msg='Compiling a simple fortran app') +def check_fc(self,*k,**kw): + kw['compiler']='fc' + if not'compile_mode'in kw: + kw['compile_mode']='fc' + if not'type'in kw: + kw['type']='fcprogram' + if not'compile_filename'in kw: + kw['compile_filename']='test.f90' + if not'code'in kw: + kw['code']=FC_FRAGMENT + return self.check(*k,**kw) +def fortran_modifier_darwin(conf): + v=conf.env + v['FCFLAGS_fcshlib']=['-fPIC','-compatibility_version','1','-current_version','1'] + v['LINKFLAGS_fcshlib']=['-dynamiclib'] + v['fcshlib_PATTERN']='lib%s.dylib' + v['FRAMEWORKPATH_ST']='-F%s' + v['FRAMEWORK_ST']='-framework %s' + v['LINKFLAGS_fcstlib']=[] + v['FCSHLIB_MARKER']='' + v['FCSTLIB_MARKER']='' + v['SONAME_ST']='' +def fortran_modifier_win32(conf): + v=conf.env + v['fcprogram_PATTERN']=v['fcprogram_test_PATTERN']='%s.exe' + v['fcshlib_PATTERN']='%s.dll' + v['implib_PATTERN']='lib%s.dll.a' + v['IMPLIB_ST']='-Wl,--out-implib,%s' + v['FCFLAGS_fcshlib']=[] + v.append_value('FCFLAGS_fcshlib',['-DDLL_EXPORT']) + v.append_value('LINKFLAGS',['-Wl,--enable-auto-import']) +def fortran_modifier_cygwin(conf): + fortran_modifier_win32(conf) + v=conf.env + v['fcshlib_PATTERN']='cyg%s.dll' + v.append_value('LINKFLAGS_fcshlib',['-Wl,--enable-auto-image-base']) + v['FCFLAGS_fcshlib']=[] +def check_fortran_dummy_main(self,*k,**kw): + if not self.env.CC: + self.fatal('A c compiler is required for check_fortran_dummy_main') + lst=['MAIN__','__MAIN','_MAIN','MAIN_','MAIN'] + lst.extend([m.lower()for m in lst]) + lst.append('') + self.start_msg('Detecting whether we need a dummy main') + for main in lst: + kw['fortran_main']=main + try: + self.check_cc(fragment='int %s() { return 0; }\n'%(main or'test'),features='c fcprogram',mandatory=True) + if not main: + self.env.FC_MAIN=-1 + self.end_msg('no') + else: + self.env.FC_MAIN=main + self.end_msg('yes %s'%main) + break + except self.errors.ConfigurationError: + pass + else: + self.end_msg('not found') + self.fatal('could not detect whether fortran requires a dummy main, see the config.log') +GCC_DRIVER_LINE=re.compile('^Driving:') +POSIX_STATIC_EXT=re.compile('\S+\.a') +POSIX_LIB_FLAGS=re.compile('-l\S+') +def is_link_verbose(self,txt): + assert isinstance(txt,str) + for line in txt.splitlines(): + if not GCC_DRIVER_LINE.search(line): + if POSIX_STATIC_EXT.search(line)or POSIX_LIB_FLAGS.search(line): + return True + return False +def check_fortran_verbose_flag(self,*k,**kw): + self.start_msg('fortran link verbose flag') + for x in['-v','--verbose','-verbose','-V']: + try: + self.check_cc(features='fc fcprogram_test',fragment=FC_FRAGMENT2,compile_filename='test.f',linkflags=[x],mandatory=True) + except self.errors.ConfigurationError: + pass + else: + if self.is_link_verbose(self.test_bld.err)or self.is_link_verbose(self.test_bld.out): + self.end_msg(x) + break + else: + self.end_msg('failure') + self.fatal('Could not obtain the fortran link verbose flag (see config.log)') + self.env.FC_VERBOSE_FLAG=x + return x +LINKFLAGS_IGNORED=[r'-lang*',r'-lcrt[a-zA-Z0-9\.]*\.o',r'-lc$',r'-lSystem',r'-libmil',r'-LIST:*',r'-LNO:*'] +if os.name=='nt': + LINKFLAGS_IGNORED.extend([r'-lfrt*',r'-luser32',r'-lkernel32',r'-ladvapi32',r'-lmsvcrt',r'-lshell32',r'-lmingw',r'-lmoldname']) +else: + LINKFLAGS_IGNORED.append(r'-lgcc*') +RLINKFLAGS_IGNORED=[re.compile(f)for f in LINKFLAGS_IGNORED] +def _match_ignore(line): + for i in RLINKFLAGS_IGNORED: + if i.match(line): + return True + return False +def parse_fortran_link(lines): + final_flags=[] + for line in lines: + if not GCC_DRIVER_LINE.match(line): + _parse_flink_line(line,final_flags) + return final_flags +SPACE_OPTS=re.compile('^-[LRuYz]$') +NOSPACE_OPTS=re.compile('^-[RL]') +def _parse_flink_line(line,final_flags): + lexer=shlex.shlex(line,posix=True) + lexer.whitespace_split=True + t=lexer.get_token() + tmp_flags=[] + while t: + def parse(token): + if _match_ignore(token): + pass + elif token.startswith('-lkernel32')and sys.platform=='cygwin': + tmp_flags.append(token) + elif SPACE_OPTS.match(token): + t=lexer.get_token() + if t.startswith('P,'): + t=t[2:] + for opt in t.split(os.pathsep): + tmp_flags.append('-L%s'%opt) + elif NOSPACE_OPTS.match(token): + tmp_flags.append(token) + elif POSIX_LIB_FLAGS.match(token): + tmp_flags.append(token) + else: + pass + t=lexer.get_token() + return t + t=parse(t) + final_flags.extend(tmp_flags) + return final_flags +def check_fortran_clib(self,autoadd=True,*k,**kw): + if not self.env.FC_VERBOSE_FLAG: + self.fatal('env.FC_VERBOSE_FLAG is not set: execute check_fortran_verbose_flag?') + self.start_msg('Getting fortran runtime link flags') + try: + self.check_cc(fragment=FC_FRAGMENT2,compile_filename='test.f',features='fc fcprogram_test',linkflags=[self.env.FC_VERBOSE_FLAG]) + except: + self.end_msg(False) + if kw.get('mandatory',True): + conf.fatal('Could not find the c library flags') + else: + out=self.test_bld.err + flags=parse_fortran_link(out.splitlines()) + self.end_msg('ok (%s)'%' '.join(flags)) + self.env.LINKFLAGS_CLIB=flags + return flags + return[] +def getoutput(conf,cmd,stdin=False): + if stdin: + stdin=Utils.subprocess.PIPE + else: + stdin=None + env=conf.env.env or None + try: + p=Utils.subprocess.Popen(cmd,stdin=stdin,stdout=Utils.subprocess.PIPE,stderr=Utils.subprocess.PIPE,env=env) + if stdin: + p.stdin.write('\n') + stdout,stderr=p.communicate() + except: + conf.fatal('could not determine the compiler version %r'%cmd) + else: + if not isinstance(stdout,str): + stdout=stdout.decode(sys.stdout.encoding) + if not isinstance(stderr,str): + stderr=stderr.decode(sys.stdout.encoding) + return stdout,stderr +ROUTINES_CODE="""\ + subroutine foobar() + return + end + subroutine foo_bar() + return + end +""" +MAIN_CODE=""" +void %(dummy_func_nounder)s(void); +void %(dummy_func_under)s(void); +int %(main_func_name)s() { + %(dummy_func_nounder)s(); + %(dummy_func_under)s(); + return 0; +} +""" +def link_main_routines_tg_method(self): + def write_test_file(task): + task.outputs[0].write(task.generator.code) + bld=self.bld + bld(rule=write_test_file,target='main.c',code=MAIN_CODE%self.__dict__) + bld(rule=write_test_file,target='test.f',code=ROUTINES_CODE) + bld(features='fc fcstlib',source='test.f',target='test') + bld(features='c fcprogram',source='main.c',target='app',use='test') +def mangling_schemes(): + for u in['_','']: + for du in['','_']: + for c in["lower","upper"]: + yield(u,du,c) +def mangle_name(u,du,c,name): + return getattr(name,c)()+u+(name.find('_')!=-1 and du or'') +def check_fortran_mangling(self,*k,**kw): + if not self.env.CC: + self.fatal('A c compiler is required for link_main_routines') + if not self.env.FC: + self.fatal('A fortran compiler is required for link_main_routines') + if not self.env.FC_MAIN: + self.fatal('Checking for mangling requires self.env.FC_MAIN (execute "check_fortran_dummy_main" first?)') + self.start_msg('Getting fortran mangling scheme') + for(u,du,c)in mangling_schemes(): + try: + self.check_cc(compile_filename=[],features='link_main_routines_func',msg='nomsg',errmsg='nomsg',mandatory=True,dummy_func_nounder=mangle_name(u,du,c,"foobar"),dummy_func_under=mangle_name(u,du,c,"foo_bar"),main_func_name=self.env.FC_MAIN) + except self.errors.ConfigurationError: + pass + else: + self.end_msg("ok ('%s', '%s', '%s-case')"%(u,du,c)) + self.env.FORTRAN_MANGLING=(u,du,c) + break + else: + self.end_msg(False) + self.fatal('mangler not found') + return(u,du,c) +def set_lib_pat(self): + self.env['fcshlib_PATTERN']=self.env['pyext_PATTERN'] +def detect_openmp(self): + for x in['-fopenmp','-openmp','-mp','-xopenmp','-omp','-qsmp=omp']: + try: + self.check_fc(msg='Checking for OpenMP flag %s'%x,fragment='program main\n call omp_get_num_threads()\nend program main',fcflags=x,linkflags=x,uselib_store='OPENMP') + except self.errors.ConfigurationError: + pass + else: + break + else: + self.fatal('Could not find OpenMP') + +conf(fc_flags) +conf(check_fortran) +conf(check_fc) +conf(fortran_modifier_darwin) +conf(fortran_modifier_win32) +conf(fortran_modifier_cygwin) +conf(check_fortran_dummy_main) +conf(is_link_verbose) +conf(check_fortran_verbose_flag) +conf(check_fortran_clib) +feature('link_main_routines_func')(link_main_routines_tg_method) +before_method('process_source')(link_main_routines_tg_method) +conf(check_fortran_mangling) +feature('pyext')(set_lib_pat) +before_method('propagate_uselib_vars','apply_link')(set_lib_pat) +conf(detect_openmp) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/fc_scan.py @@ -0,0 +1,68 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import re +from waflib import Utils,Task,TaskGen,Logs +from waflib.TaskGen import feature,before_method,after_method,extension +from waflib.Configure import conf +INC_REGEX="""(?:^|['">]\s*;)\s*INCLUDE\s+(?:\w+_)?[<"'](.+?)(?=["'>])""" +USE_REGEX="""(?:^|;)\s*USE(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)""" +MOD_REGEX="""(?:^|;)\s*MODULE(?!\s*PROCEDURE)(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)""" +re_inc=re.compile(INC_REGEX,re.I) +re_use=re.compile(USE_REGEX,re.I) +re_mod=re.compile(MOD_REGEX,re.I) +class fortran_parser(object): + def __init__(self,incpaths): + self.seen=[] + self.nodes=[] + self.names=[] + self.incpaths=incpaths + def find_deps(self,node): + txt=node.read() + incs=[] + uses=[] + mods=[] + for line in txt.splitlines(): + m=re_inc.search(line) + if m: + incs.append(m.group(1)) + m=re_use.search(line) + if m: + uses.append(m.group(1)) + m=re_mod.search(line) + if m: + mods.append(m.group(1)) + return(incs,uses,mods) + def start(self,node): + self.waiting=[node] + while self.waiting: + nd=self.waiting.pop(0) + self.iter(nd) + def iter(self,node): + path=node.abspath() + incs,uses,mods=self.find_deps(node) + for x in incs: + if x in self.seen: + continue + self.seen.append(x) + self.tryfind_header(x) + for x in uses: + name="USE@%s"%x + if not name in self.names: + self.names.append(name) + for x in mods: + name="MOD@%s"%x + if not name in self.names: + self.names.append(name) + def tryfind_header(self,filename): + found=None + for n in self.incpaths: + found=n.find_resource(filename) + if found: + self.nodes.append(found) + self.waiting.append(found) + break + if not found: + if not filename in self.names: + self.names.append(filename) --- /dev/null +++ b/waflib/Tools/flex.py @@ -0,0 +1,27 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import waflib.TaskGen +def decide_ext(self,node): + if'cxx'in self.features: + return['.lex.cc'] + return['.lex.c'] +def flexfun(tsk): + env=tsk.env + bld=tsk.generator.bld + wd=bld.variant_dir + def to_list(xx): + if isinstance(xx,str):return[xx] + return xx + tsk.last_cmd=lst=[] + lst.extend(to_list(env['FLEX'])) + lst.extend(to_list(env['FLEXFLAGS'])) + lst.extend([a.path_from(bld.bldnode)for a in tsk.inputs]) + lst=[x for x in lst if x] + txt=bld.cmd_and_log(lst,cwd=wd,env=env.env or None,quiet=0) + tsk.outputs[0].write(txt) +waflib.TaskGen.declare_chain(name='flex',rule=flexfun,ext_in='.l',decider=decide_ext,) +def configure(conf): + conf.find_program('flex',var='FLEX') + conf.env.FLEXFLAGS=['-t'] --- /dev/null +++ b/waflib/Tools/g95.py @@ -0,0 +1,55 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import re +from waflib import Utils +from waflib.Tools import fc,fc_config,fc_scan +from waflib.Configure import conf +def find_g95(conf): + fc=conf.find_program('g95',var='FC') + fc=conf.cmd_to_list(fc) + conf.get_g95_version(fc) + conf.env.FC_NAME='G95' +def g95_flags(conf): + v=conf.env + v['FCFLAGS_fcshlib']=['-fPIC'] + v['FORTRANMODFLAG']=['-fmod=',''] + v['FCFLAGS_DEBUG']=['-Werror'] +def g95_modifier_win32(conf): + fc_config.fortran_modifier_win32(conf) +def g95_modifier_cygwin(conf): + fc_config.fortran_modifier_cygwin(conf) +def g95_modifier_darwin(conf): + fc_config.fortran_modifier_darwin(conf) +def g95_modifier_platform(conf): + dest_os=conf.env['DEST_OS']or Utils.unversioned_sys_platform() + g95_modifier_func=getattr(conf,'g95_modifier_'+dest_os,None) + if g95_modifier_func: + g95_modifier_func() +def get_g95_version(conf,fc): + version_re=re.compile(r"g95\s*(?P\d*)\.(?P\d*)").search + cmd=fc+['--version'] + out,err=fc_config.getoutput(conf,cmd,stdin=False) + if out: + match=version_re(out) + else: + match=version_re(err) + if not match: + conf.fatal('cannot determine g95 version') + k=match.groupdict() + conf.env['FC_VERSION']=(k['major'],k['minor']) +def configure(conf): + conf.find_g95() + conf.find_ar() + conf.fc_flags() + conf.g95_flags() + conf.g95_modifier_platform() + +conf(find_g95) +conf(g95_flags) +conf(g95_modifier_win32) +conf(g95_modifier_cygwin) +conf(g95_modifier_darwin) +conf(g95_modifier_platform) +conf(get_g95_version) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/gas.py @@ -0,0 +1,11 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import waflib.Tools.asm +from waflib.Tools import ar +def configure(conf): + conf.find_program(['gas','as','gcc'],var='AS') + conf.env.AS_TGT_F=['-o'] + conf.env.ASLNK_TGT_F=['-o'] + conf.find_ar() --- /dev/null +++ b/waflib/Tools/gcc.py @@ -0,0 +1,98 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys +from waflib import Configure,Options,Utils +from waflib.Tools import ccroot,ar +from waflib.Configure import conf +def find_gcc(conf): + cc=conf.find_program(['gcc','cc'],var='CC') + cc=conf.cmd_to_list(cc) + conf.get_cc_version(cc,gcc=True) + conf.env.CC_NAME='gcc' + conf.env.CC=cc +def gcc_common_flags(conf): + v=conf.env + v['CC_SRC_F']=[] + v['CC_TGT_F']=['-c','-o'] + if not v['LINK_CC']:v['LINK_CC']=v['CC'] + v['CCLNK_SRC_F']=[] + v['CCLNK_TGT_F']=['-o'] + v['CPPPATH_ST']='-I%s' + v['DEFINES_ST']='-D%s' + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STLIB_ST']='-l%s' + v['STLIBPATH_ST']='-L%s' + v['RPATH_ST']='-Wl,-rpath,%s' + v['SONAME_ST']='-Wl,-h,%s' + v['SHLIB_MARKER']='-Wl,-Bdynamic' + v['STLIB_MARKER']='-Wl,-Bstatic' + v['cprogram_PATTERN']='%s' + v['CFLAGS_cshlib']=['-fPIC'] + v['LINKFLAGS_cshlib']=['-shared'] + v['cshlib_PATTERN']='lib%s.so' + v['LINKFLAGS_cstlib']=['-Wl,-Bstatic'] + v['cstlib_PATTERN']='lib%s.a' + v['LINKFLAGS_MACBUNDLE']=['-bundle','-undefined','dynamic_lookup'] + v['CFLAGS_MACBUNDLE']=['-fPIC'] + v['macbundle_PATTERN']='%s.bundle' +def gcc_modifier_win32(conf): + v=conf.env + v['cprogram_PATTERN']='%s.exe' + v['cshlib_PATTERN']='%s.dll' + v['implib_PATTERN']='lib%s.dll.a' + v['IMPLIB_ST']='-Wl,--out-implib,%s' + v['CFLAGS_cshlib']=[] + v.append_value('CFLAGS_cshlib',['-DDLL_EXPORT']) + v.append_value('LINKFLAGS',['-Wl,--enable-auto-import']) +def gcc_modifier_cygwin(conf): + gcc_modifier_win32(conf) + v=conf.env + v['cshlib_PATTERN']='cyg%s.dll' + v.append_value('LINKFLAGS_cshlib',['-Wl,--enable-auto-image-base']) + v['CFLAGS_cshlib']=[] +def gcc_modifier_darwin(conf): + v=conf.env + v['CFLAGS_cshlib']=['-fPIC','-compatibility_version','1','-current_version','1'] + v['LINKFLAGS_cshlib']=['-dynamiclib'] + v['cshlib_PATTERN']='lib%s.dylib' + v['FRAMEWORKPATH_ST']='-F%s' + v['FRAMEWORK_ST']=['-framework'] + v['ARCH_ST']=['-arch'] + v['LINKFLAGS_cstlib']=[] + v['SHLIB_MARKER']=[] + v['STLIB_MARKER']=[] + v['SONAME_ST']=[] +def gcc_modifier_aix(conf): + v=conf.env + v['LINKFLAGS_cprogram']=['-Wl,-brtl'] + v['LINKFLAGS_cshlib']=['-shared','-Wl,-brtl,-bexpfull'] + v['SHLIB_MARKER']=[] +def gcc_modifier_hpux(conf): + v=conf.env + v['SHLIB_MARKER']=[] + v['CFLAGS_cshlib']=['-fPIC','-DPIC'] + v['cshlib_PATTERN']='lib%s.sl' +def gcc_modifier_platform(conf): + gcc_modifier_func=getattr(conf,'gcc_modifier_'+conf.env.DEST_OS,None) + if gcc_modifier_func: + gcc_modifier_func() +def configure(conf): + conf.find_gcc() + conf.find_ar() + conf.gcc_common_flags() + conf.gcc_modifier_platform() + conf.cc_load_tools() + conf.cc_add_flags() + conf.link_add_flags() + +conf(find_gcc) +conf(gcc_common_flags) +conf(gcc_modifier_win32) +conf(gcc_modifier_cygwin) +conf(gcc_modifier_darwin) +conf(gcc_modifier_aix) +conf(gcc_modifier_hpux) +conf(gcc_modifier_platform) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/gdc.py @@ -0,0 +1,34 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +from waflib.Tools import ar,d +from waflib.Configure import conf +def find_gdc(conf): + conf.find_program('gdc',var='D') +def common_flags_gdc(conf): + v=conf.env + v['DFLAGS']=[] + v['D_SRC_F']=['-c'] + v['D_TGT_F']='-o%s' + v['D_LINKER']=v['D'] + v['DLNK_SRC_F']='' + v['DLNK_TGT_F']='-o%s' + v['DINC_ST']='-I%s' + v['DSHLIB_MARKER']=v['DSTLIB_MARKER']='' + v['DSTLIB_ST']=v['DSHLIB_ST']='-l%s' + v['DSTLIBPATH_ST']=v['DLIBPATH_ST']='-L%s' + v['LINKFLAGS_dshlib']=['-shared'] + v['DHEADER_ext']='.di' + v.DFLAGS_d_with_header='-fintfc' + v['D_HDR_F']='-fintfc-file=%s' +def configure(conf): + conf.find_gdc() + conf.load('ar') + conf.load('d') + conf.common_flags_gdc() + conf.d_platform_flags() + +conf(find_gdc) +conf(common_flags_gdc) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/gfortran.py @@ -0,0 +1,69 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import re +from waflib import Utils +from waflib.Tools import fc,fc_config,fc_scan +from waflib.Configure import conf +def find_gfortran(conf): + fc=conf.find_program(['gfortran','g77'],var='FC') + fc=conf.cmd_to_list(fc) + conf.get_gfortran_version(fc) + conf.env.FC_NAME='GFORTRAN' +def gfortran_flags(conf): + v=conf.env + v['FCFLAGS_fcshlib']=['-fPIC'] + v['FORTRANMODFLAG']=['-J',''] + v['FCFLAGS_DEBUG']=['-Werror'] +def gfortran_modifier_win32(conf): + fc_config.fortran_modifier_win32(conf) +def gfortran_modifier_cygwin(conf): + fc_config.fortran_modifier_cygwin(conf) +def gfortran_modifier_darwin(conf): + fc_config.fortran_modifier_darwin(conf) +def gfortran_modifier_platform(conf): + dest_os=conf.env['DEST_OS']or Utils.unversioned_sys_platform() + gfortran_modifier_func=getattr(conf,'gfortran_modifier_'+dest_os,None) + if gfortran_modifier_func: + gfortran_modifier_func() +def get_gfortran_version(conf,fc): + version_re=re.compile(r"GNU\s*Fortran",re.I).search + cmd=fc+['--version'] + out,err=fc_config.getoutput(conf,cmd,stdin=False) + if out:match=version_re(out) + else:match=version_re(err) + if not match: + conf.fatal('Could not determine the compiler type') + cmd=fc+['-dM','-E','-'] + out,err=fc_config.getoutput(conf,cmd,stdin=True) + if out.find('__GNUC__')<0: + conf.fatal('Could not determine the compiler type') + k={} + out=out.split('\n') + import shlex + for line in out: + lst=shlex.split(line) + if len(lst)>2: + key=lst[1] + val=lst[2] + k[key]=val + def isD(var): + return var in k + def isT(var): + return var in k and k[var]!='0' + conf.env['FC_VERSION']=(k['__GNUC__'],k['__GNUC_MINOR__'],k['__GNUC_PATCHLEVEL__']) +def configure(conf): + conf.find_gfortran() + conf.find_ar() + conf.fc_flags() + conf.gfortran_flags() + conf.gfortran_modifier_platform() + +conf(find_gfortran) +conf(gfortran_flags) +conf(gfortran_modifier_win32) +conf(gfortran_modifier_cygwin) +conf(gfortran_modifier_darwin) +conf(gfortran_modifier_platform) +conf(get_gfortran_version) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/glib2.py @@ -0,0 +1,174 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os +from waflib import Task,Utils,Options,Errors,Logs +from waflib.TaskGen import taskgen_method,before_method,after_method,feature +def add_marshal_file(self,filename,prefix): + if not hasattr(self,'marshal_list'): + self.marshal_list=[] + self.meths.append('process_marshal') + self.marshal_list.append((filename,prefix)) +def process_marshal(self): + for f,prefix in getattr(self,'marshal_list',[]): + node=self.path.find_resource(f) + if not node: + raise Errors.WafError('file not found %r'%f) + h_node=node.change_ext('.h') + c_node=node.change_ext('.c') + task=self.create_task('glib_genmarshal',node,[h_node,c_node]) + task.env.GLIB_GENMARSHAL_PREFIX=prefix + self.source=self.to_nodes(getattr(self,'source',[])) + self.source.append(c_node) +class glib_genmarshal(Task.Task): + def run(self): + bld=self.inputs[0].__class__.ctx + get=self.env.get_flat + cmd1="%s %s --prefix=%s --header > %s"%(get('GLIB_GENMARSHAL'),self.inputs[0].srcpath(),get('GLIB_GENMARSHAL_PREFIX'),self.outputs[0].abspath()) + ret=bld.exec_command(cmd1) + if ret:return ret + c='''#include "%s"\n'''%self.outputs[0].name + self.outputs[1].write(c) + cmd2="%s %s --prefix=%s --body >> %s"%(get('GLIB_GENMARSHAL'),self.inputs[0].srcpath(),get('GLIB_GENMARSHAL_PREFIX'),self.outputs[1].abspath()) + return bld.exec_command(cmd2) + vars=['GLIB_GENMARSHAL_PREFIX','GLIB_GENMARSHAL'] + color='BLUE' + ext_out=['.h'] +def add_enums_from_template(self,source='',target='',template='',comments=''): + if not hasattr(self,'enums_list'): + self.enums_list=[] + self.meths.append('process_enums') + self.enums_list.append({'source':source,'target':target,'template':template,'file-head':'','file-prod':'','file-tail':'','enum-prod':'','value-head':'','value-prod':'','value-tail':'','comments':comments}) +def add_enums(self,source='',target='',file_head='',file_prod='',file_tail='',enum_prod='',value_head='',value_prod='',value_tail='',comments=''): + if not hasattr(self,'enums_list'): + self.enums_list=[] + self.meths.append('process_enums') + self.enums_list.append({'source':source,'template':'','target':target,'file-head':file_head,'file-prod':file_prod,'file-tail':file_tail,'enum-prod':enum_prod,'value-head':value_head,'value-prod':value_prod,'value-tail':value_tail,'comments':comments}) +def process_enums(self): + for enum in getattr(self,'enums_list',[]): + task=self.create_task('glib_mkenums') + env=task.env + inputs=[] + source_list=self.to_list(enum['source']) + if not source_list: + raise Errors.WafError('missing source '+str(enum)) + source_list=[self.path.find_resource(k)for k in source_list] + inputs+=source_list + env['GLIB_MKENUMS_SOURCE']=[k.abspath()for k in source_list] + if not enum['target']: + raise Errors.WafError('missing target '+str(enum)) + tgt_node=self.path.find_or_declare(enum['target']) + if tgt_node.name.endswith('.c'): + self.source.append(tgt_node) + env['GLIB_MKENUMS_TARGET']=tgt_node.abspath() + options=[] + if enum['template']: + template_node=self.path.find_resource(enum['template']) + options.append('--template %s'%(template_node.abspath())) + inputs.append(template_node) + params={'file-head':'--fhead','file-prod':'--fprod','file-tail':'--ftail','enum-prod':'--eprod','value-head':'--vhead','value-prod':'--vprod','value-tail':'--vtail','comments':'--comments'} + for param,option in params.items(): + if enum[param]: + options.append('%s %r'%(option,enum[param])) + env['GLIB_MKENUMS_OPTIONS']=' '.join(options) + task.set_inputs(inputs) + task.set_outputs(tgt_node) +class glib_mkenums(Task.Task): + run_str='${GLIB_MKENUMS} ${GLIB_MKENUMS_OPTIONS} ${GLIB_MKENUMS_SOURCE} > ${GLIB_MKENUMS_TARGET}' + color='PINK' + ext_out=['.h'] +def add_settings_schemas(self,filename_list): + if not hasattr(self,'settings_schema_files'): + self.settings_schema_files=[] + if not isinstance(filename_list,list): + filename_list=[filename_list] + self.settings_schema_files.extend(filename_list) +def add_settings_enums(self,namespace,filename_list): + if hasattr(self,'settings_enum_namespace'): + raise Errors.WafError("Tried to add gsettings enums to '%s' more than once"%self.name) + self.settings_enum_namespace=namespace + if type(filename_list)!='list': + filename_list=[filename_list] + self.settings_enum_files=filename_list +def r_change_ext(self,ext): + name=self.name + k=name.rfind('.') + if k>=0: + name=name[:k]+ext + else: + name=name+ext + return self.parent.find_or_declare([name]) +def process_settings(self): + enums_tgt_node=[] + install_files=[] + settings_schema_files=getattr(self,'settings_schema_files',[]) + if settings_schema_files and not self.env['GLIB_COMPILE_SCHEMAS']: + raise Errors.WafError("Unable to process GSettings schemas - glib-compile-schemas was not found during configure") + if hasattr(self,'settings_enum_files'): + enums_task=self.create_task('glib_mkenums') + source_list=self.settings_enum_files + source_list=[self.path.find_resource(k)for k in source_list] + enums_task.set_inputs(source_list) + enums_task.env['GLIB_MKENUMS_SOURCE']=[k.abspath()for k in source_list] + target=self.settings_enum_namespace+'.enums.xml' + tgt_node=self.path.find_or_declare(target) + enums_task.set_outputs(tgt_node) + enums_task.env['GLIB_MKENUMS_TARGET']=tgt_node.abspath() + enums_tgt_node=[tgt_node] + install_files.append(tgt_node) + options='--comments "" --fhead "" --vhead " <@type@ id=\\"%s.@EnumName@\\">" --vprod " " --vtail " " --ftail "" '%(self.settings_enum_namespace) + enums_task.env['GLIB_MKENUMS_OPTIONS']=options + for schema in settings_schema_files: + schema_task=self.create_task('glib_validate_schema') + schema_node=self.path.find_resource(schema) + if not schema_node: + raise Errors.WafError("Cannot find the schema file '%s'"%schema) + install_files.append(schema_node) + source_list=enums_tgt_node+[schema_node] + schema_task.set_inputs(source_list) + schema_task.env['GLIB_COMPILE_SCHEMAS_OPTIONS']=[("--schema-file="+k.abspath())for k in source_list] + target_node=r_change_ext(schema_node,'.xml.valid') + schema_task.set_outputs(target_node) + schema_task.env['GLIB_VALIDATE_SCHEMA_OUTPUT']=target_node.abspath() + def compile_schemas_callback(bld): + if not bld.is_install:return + Logs.pprint('YELLOW','Updating GSettings schema cache') + command=Utils.subst_vars("${GLIB_COMPILE_SCHEMAS} ${GSETTINGSSCHEMADIR}",bld.env) + ret=self.bld.exec_command(command) + if self.bld.is_install: + if not self.env['GSETTINGSSCHEMADIR']: + raise Errors.WafError('GSETTINGSSCHEMADIR not defined (should have been set up automatically during configure)') + if install_files: + self.bld.install_files(self.env['GSETTINGSSCHEMADIR'],install_files) + if not hasattr(self.bld,'_compile_schemas_registered'): + self.bld.add_post_fun(compile_schemas_callback) + self.bld._compile_schemas_registered=True +class glib_validate_schema(Task.Task): + run_str='rm -f ${GLIB_VALIDATE_SCHEMA_OUTPUT} && ${GLIB_COMPILE_SCHEMAS} --dry-run ${GLIB_COMPILE_SCHEMAS_OPTIONS} && touch ${GLIB_VALIDATE_SCHEMA_OUTPUT}' + color='PINK' +def configure(conf): + conf.find_program('glib-genmarshal',var='GLIB_GENMARSHAL') + conf.find_perl_program('glib-mkenums',var='GLIB_MKENUMS') + conf.find_program('glib-compile-schemas',var='GLIB_COMPILE_SCHEMAS',mandatory=False) + def getstr(varname): + return getattr(Options.options,varname,getattr(conf.env,varname,'')) + gsettingsschemadir=getstr('GSETTINGSSCHEMADIR') + if not gsettingsschemadir: + datadir=getstr('DATADIR') + if not datadir: + prefix=conf.env['PREFIX'] + datadir=os.path.join(prefix,'share') + gsettingsschemadir=os.path.join(datadir,'glib-2.0','schemas') + conf.env['GSETTINGSSCHEMADIR']=gsettingsschemadir +def options(opt): + opt.add_option('--gsettingsschemadir',help='GSettings schema location [Default: ${datadir}/glib-2.0/schemas]',default='',dest='GSETTINGSSCHEMADIR') + +taskgen_method(add_marshal_file) +before_method('process_source')(process_marshal) +taskgen_method(add_enums_from_template) +taskgen_method(add_enums) +before_method('process_source')(process_enums) +taskgen_method(add_settings_schemas) +taskgen_method(add_settings_enums) +feature('glib2')(process_settings) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/gnu_dirs.py @@ -0,0 +1,65 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os +from waflib import Utils,Options,Context +_options=[x.split(', ')for x in''' +bindir, user executables, ${EXEC_PREFIX}/bin +sbindir, system admin executables, ${EXEC_PREFIX}/sbin +libexecdir, program executables, ${EXEC_PREFIX}/libexec +sysconfdir, read-only single-machine data, ${PREFIX}/etc +sharedstatedir, modifiable architecture-independent data, ${PREFIX}/com +localstatedir, modifiable single-machine data, ${PREFIX}/var +libdir, object code libraries, ${EXEC_PREFIX}/lib +includedir, C header files, ${PREFIX}/include +oldincludedir, C header files for non-gcc, /usr/include +datarootdir, read-only arch.-independent data root, ${PREFIX}/share +datadir, read-only architecture-independent data, ${DATAROOTDIR} +infodir, info documentation, ${DATAROOTDIR}/info +localedir, locale-dependent data, ${DATAROOTDIR}/locale +mandir, man documentation, ${DATAROOTDIR}/man +docdir, documentation root, ${DATAROOTDIR}/doc/${PACKAGE} +htmldir, html documentation, ${DOCDIR} +dvidir, dvi documentation, ${DOCDIR} +pdfdir, pdf documentation, ${DOCDIR} +psdir, ps documentation, ${DOCDIR} +'''.split('\n')if x] +def configure(conf): + def get_param(varname,default): + return getattr(Options.options,varname,'')or default + env=conf.env + conf.env.LIBDIR=conf.env.BINDIR=[] + env['EXEC_PREFIX']=get_param('EXEC_PREFIX',env['PREFIX']) + env['PACKAGE']=getattr(Context.g_module,'APPNAME',None)or env['PACKAGE'] + complete=False + iter=0 + while not complete and iter\d*)\.(?P\d*)",re.I).search + cmd=fc+['--version'] + out,err=fc_config.getoutput(conf,cmd,stdin=False) + if out: + match=version_re(out) + else: + match=version_re(err) + if not match: + conf.fatal('cannot determine ifort version.') + k=match.groupdict() + conf.env['FC_VERSION']=(k['major'],k['minor']) +def configure(conf): + conf.find_ifort() + conf.find_program('xiar',var='AR') + conf.env.ARFLAGS='rcs' + conf.fc_flags() + conf.ifort_modifier_platform() + +conf(find_ifort) +conf(ifort_modifier_cygwin) +conf(ifort_modifier_win32) +conf(ifort_modifier_darwin) +conf(ifort_modifier_platform) +conf(get_ifort_version) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/intltool.py @@ -0,0 +1,78 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,re +from waflib import Configure,TaskGen,Task,Utils,Runner,Options,Build,Logs +import waflib.Tools.ccroot +from waflib.TaskGen import feature,before_method +from waflib.Logs import error +def apply_intltool_in_f(self): + try:self.meths.remove('process_source') + except ValueError:pass + if not self.env.LOCALEDIR: + self.env.LOCALEDIR=self.env.PREFIX+'/share/locale' + for i in self.to_list(self.source): + node=self.path.find_resource(i) + podir=getattr(self,'podir','po') + podirnode=self.path.find_dir(podir) + if not podirnode: + error("could not find the podir %r"%podir) + continue + cache=getattr(self,'intlcache','.intlcache') + self.env['INTLCACHE']=os.path.join(self.path.bldpath(),podir,cache) + self.env['INTLPODIR']=podirnode.bldpath() + self.env['INTLFLAGS']=getattr(self,'flags',['-q','-u','-c']) + task=self.create_task('intltool',node,node.change_ext('')) + inst=getattr(self,'install_path','${LOCALEDIR}') + if inst: + self.bld.install_files(inst,task.outputs) +def apply_intltool_po(self): + try:self.meths.remove('process_source') + except ValueError:pass + if not self.env.LOCALEDIR: + self.env.LOCALEDIR=self.env.PREFIX+'/share/locale' + appname=getattr(self,'appname','set_your_app_name') + podir=getattr(self,'podir','') + inst=getattr(self,'install_path','${LOCALEDIR}') + linguas=self.path.find_node(os.path.join(podir,'LINGUAS')) + if linguas: + file=open(linguas.abspath()) + langs=[] + for line in file.readlines(): + if not line.startswith('#'): + langs+=line.split() + file.close() + re_linguas=re.compile('[-a-zA-Z_@.]+') + for lang in langs: + if re_linguas.match(lang): + node=self.path.find_resource(os.path.join(podir,re_linguas.match(lang).group()+'.po')) + task=self.create_task('po',node,node.change_ext('.mo')) + if inst: + filename=task.outputs[0].name + (langname,ext)=os.path.splitext(filename) + inst_file=inst+os.sep+langname+os.sep+'LC_MESSAGES'+os.sep+appname+'.mo' + self.bld.install_as(inst_file,task.outputs[0],chmod=getattr(self,'chmod',Utils.O644),env=task.env) + else: + Logs.pprint('RED',"Error no LINGUAS file found in po directory") +class po(Task.Task): + run_str='${MSGFMT} -o ${TGT} ${SRC}' + color='BLUE' +class intltool(Task.Task): + run_str='${INTLTOOL} ${INTLFLAGS} ${INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}' + color='BLUE' +def configure(conf): + conf.find_program('msgfmt',var='MSGFMT') + conf.find_perl_program('intltool-merge',var='INTLTOOL') + prefix=conf.env.PREFIX + datadir=conf.env.DATADIR + if not datadir: + datadir=os.path.join(prefix,'share') + conf.define('LOCALEDIR',os.path.join(datadir,'locale').replace('\\','\\\\')) + conf.define('DATADIR',datadir.replace('\\','\\\\')) + if conf.env.CC or conf.env.CXX: + conf.check(header_name='locale.h') + +before_method('process_source')(apply_intltool_in_f) +feature('intltool_in')(apply_intltool_in_f) +feature('intltool_po')(apply_intltool_po) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/irixcc.py @@ -0,0 +1,49 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os +from waflib import Utils +from waflib.Tools import ccroot,ar +from waflib.Configure import conf +def find_irixcc(conf): + v=conf.env + cc=None + if v['CC']:cc=v['CC'] + elif'CC'in conf.environ:cc=conf.environ['CC'] + if not cc:cc=conf.find_program('cc',var='CC') + if not cc:conf.fatal('irixcc was not found') + cc=conf.cmd_to_list(cc) + try: + conf.cmd_and_log(cc+['-version']) + except: + conf.fatal('%r -version could not be executed'%cc) + v['CC']=cc + v['CC_NAME']='irix' +def irixcc_common_flags(conf): + v=conf.env + v['CC_SRC_F']='' + v['CC_TGT_F']=['-c','-o'] + v['CPPPATH_ST']='-I%s' + v['DEFINES_ST']='-D%s' + if not v['LINK_CC']:v['LINK_CC']=v['CC'] + v['CCLNK_SRC_F']='' + v['CCLNK_TGT_F']=['-o'] + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STLIB_ST']='-l%s' + v['STLIBPATH_ST']='-L%s' + v['cprogram_PATTERN']='%s' + v['cshlib_PATTERN']='lib%s.so' + v['cstlib_PATTERN']='lib%s.a' +def configure(conf): + conf.find_irixcc() + conf.find_cpp() + conf.find_ar() + conf.irixcc_common_flags() + conf.cc_load_tools() + conf.cc_add_flags() + conf.link_add_flags() + +conf(find_irixcc) +conf(irixcc_common_flags) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/javaw.py @@ -0,0 +1,275 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import os,re,tempfile,shutil +from waflib.Configure import conf +from waflib import TaskGen,Task,Utils,Options,Build,Errors,Node,Logs +from waflib.TaskGen import feature,before_method,after_method +from waflib.Tools import ccroot +ccroot.USELIB_VARS['javac']=set(['CLASSPATH','JAVACFLAGS']) +SOURCE_RE='**/*.java' +JAR_RE='**/*' +class_check_source=''' +public class Test { + public static void main(String[] argv) { + Class lib; + if (argv.length < 1) { + System.err.println("Missing argument"); + System.exit(77); + } + try { + lib = Class.forName(argv[0]); + } catch (ClassNotFoundException e) { + System.err.println("ClassNotFoundException"); + System.exit(1); + } + lib = null; + System.exit(0); + } +} +''' +def apply_java(self): + Utils.def_attrs(self,jarname='',classpath='',sourcepath='.',srcdir='.',jar_mf_attributes={},jar_mf_classpath=[]) + nodes_lst=[] + outdir=getattr(self,'outdir',None) + if outdir: + if not isinstance(outdir,Node.Node): + outdir=self.path.get_bld().make_node(self.outdir) + else: + outdir=self.path.get_bld() + outdir.mkdir() + self.outdir=outdir + self.env['OUTDIR']=outdir.abspath() + self.javac_task=tsk=self.create_task('javac') + tmp=[] + srcdir=getattr(self,'srcdir','') + if isinstance(srcdir,Node.Node): + srcdir=[srcdir] + 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) + tsk.srcdir=tmp + if getattr(self,'compat',None): + tsk.env.append_value('JAVACFLAGS',['-source',self.compat]) + if hasattr(self,'sourcepath'): + fold=[isinstance(x,Node.Node)and x or self.path.find_dir(x)for x in self.to_list(self.sourcepath)] + names=os.pathsep.join([x.srcpath()for x in fold]) + else: + names=[x.srcpath()for x in tsk.srcdir] + if names: + tsk.env.append_value('JAVACFLAGS',['-sourcepath',names]) +def use_javac_files(self): + lst=[] + self.uselib=self.to_list(getattr(self,'uselib',[])) + names=self.to_list(getattr(self,'use',[])) + get=self.bld.get_tgen_by_name + for x in names: + try: + y=get(x) + except: + self.uselib.append(x) + else: + y.post() + lst.append(y.jar_task.outputs[0].abspath()) + self.javac_task.set_run_after(y.jar_task) + if lst: + self.env.append_value('CLASSPATH',lst) +def set_classpath(self): + self.env.append_value('CLASSPATH',getattr(self,'classpath',[])) + for x in self.tasks: + x.env.CLASSPATH=os.pathsep.join(self.env.CLASSPATH)+os.pathsep +def jar_files(self): + destfile=getattr(self,'destfile','test.jar') + jaropts=getattr(self,'jaropts',[]) + manifest=getattr(self,'manifest',None) + basedir=getattr(self,'basedir',None) + if basedir: + if not isinstance(self.basedir,Node.Node): + basedir=self.path.get_bld().make_node(basedir) + else: + basedir=self.path.get_bld() + if not basedir: + self.bld.fatal('Could not find the basedir %r for %r'%(self.basedir,self)) + self.jar_task=tsk=self.create_task('jar_create') + if manifest: + jarcreate=getattr(self,'jarcreate','cfm') + node=self.path.find_node(manifest) + tsk.dep_nodes.append(node) + jaropts.insert(0,node.abspath()) + else: + jarcreate=getattr(self,'jarcreate','cf') + if not isinstance(destfile,Node.Node): + destfile=self.path.find_or_declare(destfile) + if not destfile: + self.bld.fatal('invalid destfile %r for %r'%(destfile,self)) + tsk.set_outputs(destfile) + tsk.basedir=basedir + jaropts.append('-C') + jaropts.append(basedir.bldpath()) + jaropts.append('.') + tsk.env['JAROPTS']=jaropts + tsk.env['JARCREATE']=jarcreate + if getattr(self,'javac_task',None): + tsk.set_run_after(self.javac_task) +def use_jar_files(self): + lst=[] + self.uselib=self.to_list(getattr(self,'uselib',[])) + names=self.to_list(getattr(self,'use',[])) + get=self.bld.get_tgen_by_name + for x in names: + try: + y=get(x) + except: + self.uselib.append(x) + else: + y.post() + self.jar_task.run_after.update(y.tasks) +class jar_create(Task.Task): + color='GREEN' + run_str='${JAR} ${JARCREATE} ${TGT} ${JAROPTS}' + def runnable_status(self): + for t in self.run_after: + if not t.hasrun: + return Task.ASK_LATER + if not self.inputs: + global JAR_RE + try: + self.inputs=[x for x in self.basedir.ant_glob(JAR_RE,remove=False)if id(x)!=id(self.outputs[0])] + except: + raise Errors.WafError('Could not find the basedir %r for %r'%(self.basedir,self)) + return super(jar_create,self).runnable_status() +class javac(Task.Task): + color='BLUE' + nocache=True + vars=['CLASSPATH','JAVACFLAGS','JAVAC','OUTDIR'] + def runnable_status(self): + for t in self.run_after: + if not t.hasrun: + return Task.ASK_LATER + if not self.inputs: + global SOURCE_RE + self.inputs=[] + for x in self.srcdir: + self.inputs.extend(x.ant_glob(SOURCE_RE,remove=False)) + return super(javac,self).runnable_status() + def run(self): + env=self.env + gen=self.generator + bld=gen.bld + wd=bld.bldnode.abspath() + def to_list(xx): + if isinstance(xx,str):return[xx] + return xx + cmd=[] + cmd.extend(to_list(env['JAVAC'])) + cmd.extend(['-classpath']) + cmd.extend(to_list(env['CLASSPATH'])) + cmd.extend(['-d']) + cmd.extend(to_list(env['OUTDIR'])) + cmd.extend(to_list(env['JAVACFLAGS'])) + files=[a.path_from(bld.bldnode)for a in self.inputs] + tmp=None + try: + if len(str(files))+len(str(cmd))>8192: + (fd,tmp)=tempfile.mkstemp(dir=bld.bldnode.abspath()) + try: + os.write(fd,'\n'.join(files)) + finally: + if tmp: + os.close(fd) + if Logs.verbose: + Logs.debug('runner: %r'%(cmd+files)) + cmd.append('@'+tmp) + else: + cmd+=files + ret=self.exec_command(cmd,cwd=wd,env=env.env or None) + finally: + if tmp: + os.unlink(tmp) + return ret + def post_run(self): + for n in self.generator.outdir.ant_glob('**/*.class'): + n.sig=Utils.h_file(n.abspath()) + self.generator.bld.task_sigs[self.uid()]=self.cache_sig +def configure(self): + java_path=self.environ['PATH'].split(os.pathsep) + v=self.env + if'JAVA_HOME'in self.environ: + java_path=[os.path.join(self.environ['JAVA_HOME'],'bin')]+java_path + self.env['JAVA_HOME']=[self.environ['JAVA_HOME']] + for x in'javac java jar'.split(): + self.find_program(x,var=x.upper(),path_list=java_path) + self.env[x.upper()]=self.cmd_to_list(self.env[x.upper()]) + if'CLASSPATH'in self.environ: + v['CLASSPATH']=self.environ['CLASSPATH'] + if not v['JAR']:self.fatal('jar is required for making java packages') + if not v['JAVAC']:self.fatal('javac is required for compiling java classes') + v['JARCREATE']='cf' + v['JAVACFLAGS']=[] +def check_java_class(self,classname,with_classpath=None): + javatestdir='.waf-javatest' + classpath=javatestdir + if self.env['CLASSPATH']: + classpath+=os.pathsep+self.env['CLASSPATH'] + if isinstance(with_classpath,str): + classpath+=os.pathsep+with_classpath + shutil.rmtree(javatestdir,True) + os.mkdir(javatestdir) + java_file=open(os.path.join(javatestdir,'Test.java'),'w') + java_file.write(class_check_source) + java_file.close() + self.exec_command(self.env['JAVAC']+[os.path.join(javatestdir,'Test.java')],shell=False) + cmd=self.env['JAVA']+['-cp',classpath,'Test',classname] + self.to_log("%s\n"%str(cmd)) + found=self.exec_command(cmd,shell=False) + self.msg('Checking for java class %s'%classname,not found) + shutil.rmtree(javatestdir,True) + return found +def check_jni_headers(conf): + if not conf.env.CC_NAME and not conf.env.CXX_NAME: + conf.fatal('load a compiler first (gcc, g++, ..)') + if not conf.env.JAVA_HOME: + conf.fatal('set JAVA_HOME in the system environment') + javaHome=conf.env['JAVA_HOME'][0] + dir=conf.root.find_dir(conf.env.JAVA_HOME[0]+'/include') + if dir is None: + conf.fatal('JAVA_HOME does not seem to be set properly') + f=dir.ant_glob('**/(jni|jni_md).h') + incDirs=[x.parent.abspath()for x in f] + dir=conf.root.find_dir(conf.env.JAVA_HOME[0]) + f=dir.ant_glob('**/*jvm.(so|dll|dylib)') + libDirs=[x.parent.abspath()for x in f]or[javaHome] + f=dir.ant_glob('**/*jvm.(lib)') + if f: + libDirs=[[x,y.parent.abspath()]for x in libDirs for y in f] + for d in libDirs: + try: + conf.check(header_name='jni.h',define_name='HAVE_JNI_H',lib='jvm',libpath=d,includes=incDirs,uselib_store='JAVA',uselib='JAVA') + except: + pass + else: + break + else: + conf.fatal('could not find lib jvm in %r (see config.log)'%libDirs) + +feature('javac')(apply_java) +before_method('process_source')(apply_java) +feature('javac')(use_javac_files) +after_method('apply_java')(use_javac_files) +feature('javac')(set_classpath) +after_method('apply_java','propagate_uselib_vars','use_javac_files')(set_classpath) +feature('jar')(jar_files) +after_method('apply_java','use_javac_files')(jar_files) +before_method('process_source')(jar_files) +feature('jar')(use_jar_files) +after_method('jar_files')(use_jar_files) +conf(check_java_class) +conf(check_jni_headers) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/kde4.py @@ -0,0 +1,49 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys,re +from waflib import Options,TaskGen,Task,Utils +from waflib.TaskGen import feature,after_method +def apply_msgfmt(self): + for lang in self.to_list(self.langs): + node=self.path.find_resource(lang+'.po') + task=self.create_task('msgfmt',node,node.change_ext('.mo')) + langname=lang.split('/') + langname=langname[-1] + inst=getattr(self,'install_path','${KDE4_LOCALE_INSTALL_DIR}') + self.bld.install_as(inst+os.sep+langname+os.sep+'LC_MESSAGES'+os.sep+getattr(self,'appname','set_your_appname')+'.mo',task.outputs[0],chmod=getattr(self,'chmod',Utils.O644)) +class msgfmt(Task.Task): + color='BLUE' + run_str='${MSGFMT} ${SRC} -o ${TGT}' +def configure(self): + kdeconfig=self.find_program('kde4-config') + prefix=self.cmd_and_log('%s --prefix'%kdeconfig).strip() + fname='%s/share/apps/cmake/modules/KDELibsDependencies.cmake'%prefix + try:os.stat(fname) + except OSError: + fname='%s/share/kde4/apps/cmake/modules/KDELibsDependencies.cmake'%prefix + try:os.stat(fname) + except OSError:self.fatal('could not open %s'%fname) + try: + txt=Utils.readf(fname) + except(OSError,IOError): + self.fatal('could not read %s'%fname) + txt=txt.replace('\\\n','\n') + fu=re.compile('#(.*)\n') + txt=fu.sub('',txt) + setregexp=re.compile('([sS][eE][tT]\s*\()\s*([^\s]+)\s+\"([^"]+)\"\)') + found=setregexp.findall(txt) + for(_,key,val)in found: + self.env[key]=val + self.env['LIB_KDECORE']=['kdecore'] + self.env['LIB_KDEUI']=['kdeui'] + self.env['LIB_KIO']=['kio'] + self.env['LIB_KHTML']=['khtml'] + self.env['LIB_KPARTS']=['kparts'] + self.env['LIBPATH_KDECORE']=[self.env['KDE4_LIB_INSTALL_DIR']] + self.env['INCLUDES_KDECORE']=[self.env['KDE4_INCLUDE_INSTALL_DIR']] + self.env.append_value('INCLUDES_KDECORE',[self.env['KDE4_INCLUDE_INSTALL_DIR']+os.sep+'KDE']) + self.find_program('msgfmt',var='MSGFMT') + +feature('msgfmt')(apply_msgfmt) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/lua.py @@ -0,0 +1,19 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +from waflib.TaskGen import extension +from waflib import Task,Utils +def add_lua(self,node): + tsk=self.create_task('luac',node,node.change_ext('.luac')) + inst_to=getattr(self,'install_path',self.env.LUADIR and'${LUADIR}'or None) + if inst_to: + self.bld.install_files(inst_to,tsk.outputs) + return tsk +class luac(Task.Task): + run_str='${LUAC} -s -o ${TGT} ${SRC}' + color='PINK' +def configure(conf): + conf.find_program('luac',var='LUAC') + +extension('.lua')(add_lua) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/msvc.py @@ -0,0 +1,654 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys,re,tempfile +try: + import _winreg +except: + try: + import winreg as _winreg + except: + _winreg=None +from waflib import Utils,TaskGen,Runner,Configure,Task,Options +from waflib.Logs import debug,info,warn,error +from waflib.TaskGen import after_method,before_method,feature +from waflib.Configure import conf +from waflib.Tools import ccroot,c,cxx,ar,winres +g_msvc_systemlibs=''' +aclui activeds ad1 adptif adsiid advapi32 asycfilt authz bhsupp bits bufferoverflowu cabinet +cap certadm certidl ciuuid clusapi comctl32 comdlg32 comsupp comsuppd comsuppw comsuppwd comsvcs +credui crypt32 cryptnet cryptui d3d8thk daouuid dbgeng dbghelp dciman32 ddao35 ddao35d +ddao35u ddao35ud delayimp dhcpcsvc dhcpsapi dlcapi dnsapi dsprop dsuiext dtchelp +faultrep fcachdll fci fdi framedyd framedyn gdi32 gdiplus glauxglu32 gpedit gpmuuid +gtrts32w gtrtst32hlink htmlhelp httpapi icm32 icmui imagehlp imm32 iphlpapi iprop +kernel32 ksguid ksproxy ksuser libcmt libcmtd libcpmt libcpmtd loadperf lz32 mapi +mapi32 mgmtapi minidump mmc mobsync mpr mprapi mqoa mqrt msacm32 mscms mscoree +msdasc msimg32 msrating mstask msvcmrt msvcurt msvcurtd mswsock msxml2 mtx mtxdm +netapi32 nmapinmsupp npptools ntdsapi ntdsbcli ntmsapi ntquery odbc32 odbcbcp +odbccp32 oldnames ole32 oleacc oleaut32 oledb oledlgolepro32 opends60 opengl32 +osptk parser pdh penter pgobootrun pgort powrprof psapi ptrustm ptrustmd ptrustu +ptrustud qosname rasapi32 rasdlg rassapi resutils riched20 rpcndr rpcns4 rpcrt4 rtm +rtutils runtmchk scarddlg scrnsave scrnsavw secur32 sensapi setupapi sfc shell32 +shfolder shlwapi sisbkup snmpapi sporder srclient sti strsafe svcguid tapi32 thunk32 +traffic unicows url urlmon user32 userenv usp10 uuid uxtheme vcomp vcompd vdmdbg +version vfw32 wbemuuid webpost wiaguid wininet winmm winscard winspool winstrm +wintrust wldap32 wmiutils wow32 ws2_32 wsnmp32 wsock32 wst wtsapi32 xaswitch xolehlp +'''.split() +all_msvc_platforms=[('x64','amd64'),('x86','x86'),('ia64','ia64'),('x86_amd64','amd64'),('x86_ia64','ia64')] +all_wince_platforms=[('armv4','arm'),('armv4i','arm'),('mipsii','mips'),('mipsii_fp','mips'),('mipsiv','mips'),('mipsiv_fp','mips'),('sh4','sh'),('x86','cex86')] +all_icl_platforms=[('intel64','amd64'),('em64t','amd64'),('ia32','x86'),('Itanium','ia64')] +def options(opt): + opt.add_option('--msvc_version',type='string',help='msvc version, eg: "msvc 10.0,msvc 9.0"',default='') + opt.add_option('--msvc_targets',type='string',help='msvc targets, eg: "x64,arm"',default='') +def setup_msvc(conf,versions): + platforms=getattr(Options.options,'msvc_targets','').split(',') + if platforms==['']: + platforms=Utils.to_list(conf.env['MSVC_TARGETS'])or[i for i,j in all_msvc_platforms+all_icl_platforms+all_wince_platforms] + desired_versions=getattr(Options.options,'msvc_version','').split(',') + if desired_versions==['']: + desired_versions=conf.env['MSVC_VERSIONS']or[v for v,_ in versions][::-1] + versiondict=dict(versions) + for version in desired_versions: + try: + targets=dict(versiondict[version]) + for target in platforms: + try: + arch,(p1,p2,p3)=targets[target] + compiler,revision=version.rsplit(' ',1) + return compiler,revision,p1,p2,p3 + except KeyError:continue + except KeyError:continue + conf.fatal('msvc: Impossible to find a valid architecture for building (in setup_msvc)') +def get_msvc_version(conf,compiler,version,target,vcvars): + debug('msvc: get_msvc_version: %r %r %r',compiler,version,target) + batfile=conf.bldnode.make_node('waf-print-msvc.bat') + batfile.write("""@echo off +set INCLUDE= +set LIB= +call "%s" %s +echo PATH=%%PATH%% +echo INCLUDE=%%INCLUDE%% +echo LIB=%%LIB%% +"""%(vcvars,target)) + sout=conf.cmd_and_log(['cmd','/E:on','/V:on','/C',batfile.abspath()]) + lines=sout.splitlines() + if not lines[0]:lines=lines[1:] + for x in('Setting environment','Setting SDK environment','Intel(R) C++ Compiler','Intel Parallel Studio'): + if lines[0].find(x)!=-1: + break + else: + debug('msvc: get_msvc_version: %r %r %r -> not found',compiler,version,target) + conf.fatal('msvc: Impossible to find a valid architecture for building (in get_msvc_version)') + for line in lines[1:]: + if line.startswith('PATH='): + path=line[5:] + MSVC_PATH=path.split(';') + elif line.startswith('INCLUDE='): + MSVC_INCDIR=[i for i in line[8:].split(';')if i] + elif line.startswith('LIB='): + MSVC_LIBDIR=[i for i in line[4:].split(';')if i] + env={} + env.update(os.environ) + env.update(PATH=path) + compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler) + cxx=conf.find_program(compiler_name,path_list=MSVC_PATH) + cxx=conf.cmd_to_list(cxx) + if'CL'in env: + del(env['CL']) + try: + try: + conf.cmd_and_log(cxx+['/help'],env=env) + except Exception ,e: + debug('msvc: get_msvc_version: %r %r %r -> failure'%(compiler,version,target)) + debug(str(e)) + conf.fatal('msvc: cannot run the compiler (in get_msvc_version)') + else: + debug('msvc: get_msvc_version: %r %r %r -> OK',compiler,version,target) + finally: + conf.env[compiler_name]='' + return(MSVC_PATH,MSVC_INCDIR,MSVC_LIBDIR) +def gather_wsdk_versions(conf,versions): + version_pattern=re.compile('^v..?.?\...?.?') + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Microsoft SDKs\\Windows') + except WindowsError: + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows') + except WindowsError: + return + index=0 + while 1: + try: + version=_winreg.EnumKey(all_versions,index) + except WindowsError: + break + index=index+1 + if not version_pattern.match(version): + continue + try: + msvc_version=_winreg.OpenKey(all_versions,version) + path,type=_winreg.QueryValueEx(msvc_version,'InstallationFolder') + except WindowsError: + continue + if os.path.isfile(os.path.join(path,'bin','SetEnv.cmd')): + targets=[] + for target,arch in all_msvc_platforms: + try: + targets.append((target,(arch,conf.get_msvc_version('wsdk',version,'/'+target,os.path.join(path,'bin','SetEnv.cmd'))))) + except conf.errors.ConfigurationError: + pass + versions.append(('wsdk '+version[1:],targets)) +def gather_wince_supported_platforms(): + supported_wince_platforms=[] + try: + ce_sdk=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Windows CE Tools\\SDKs') + except WindowsError: + try: + ce_sdk=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Windows CE Tools\\SDKs') + except WindowsError: + ce_sdk='' + if not ce_sdk: + return supported_wince_platforms + ce_index=0 + while 1: + try: + sdk_device=_winreg.EnumKey(ce_sdk,ce_index) + except WindowsError: + break + ce_index=ce_index+1 + sdk=_winreg.OpenKey(ce_sdk,sdk_device) + try: + path,type=_winreg.QueryValueEx(sdk,'SDKRootDir') + except WindowsError: + try: + path,type=_winreg.QueryValueEx(sdk,'SDKInformation') + path,xml=os.path.split(path) + except WindowsError: + continue + path=str(path) + path,device=os.path.split(path) + if not device: + path,device=os.path.split(path) + for arch,compiler in all_wince_platforms: + platforms=[] + if os.path.isdir(os.path.join(path,device,'Lib',arch)): + platforms.append((arch,compiler,os.path.join(path,device,'Include',arch),os.path.join(path,device,'Lib',arch))) + if platforms: + supported_wince_platforms.append((device,platforms)) + return supported_wince_platforms +def gather_msvc_detected_versions(): + version_pattern=re.compile('^(\d\d?\.\d\d?)(Exp)?$') + detected_versions=[] + for vcver,vcvar in[('VCExpress','Exp'),('VisualStudio','')]: + try: + prefix='SOFTWARE\\Wow6432node\\Microsoft\\'+vcver + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,prefix) + except WindowsError: + try: + prefix='SOFTWARE\\Microsoft\\'+vcver + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,prefix) + except WindowsError: + continue + index=0 + while 1: + try: + version=_winreg.EnumKey(all_versions,index) + except WindowsError: + break + index=index+1 + match=version_pattern.match(version) + if not match: + continue + else: + versionnumber=float(match.group(1)) + detected_versions.append((versionnumber,version+vcvar,prefix+"\\"+version)) + def fun(tup): + return tup[0] + try: + detected_versions.sort(key=fun) + except: + detected_versions.sort(lambda x,y:cmp(x[0],y[0])) + return detected_versions +def gather_msvc_targets(conf,versions,version,vc_path): + targets=[] + if os.path.isfile(os.path.join(vc_path,'vcvarsall.bat')): + for target,realtarget in all_msvc_platforms[::-1]: + try: + targets.append((target,(realtarget,conf.get_msvc_version('msvc',version,target,os.path.join(vc_path,'vcvarsall.bat'))))) + except conf.errors.ConfigurationError: + pass + elif os.path.isfile(os.path.join(vc_path,'Common7','Tools','vsvars32.bat')): + try: + targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'x86',os.path.join(vc_path,'Common7','Tools','vsvars32.bat'))))) + except conf.errors.ConfigurationError: + pass + elif os.path.isfile(os.path.join(vc_path,'Bin','vcvars32.bat')): + try: + targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'',os.path.join(vc_path,'Bin','vcvars32.bat'))))) + except conf.errors.ConfigurationError: + pass + versions.append(('msvc '+version,targets)) +def gather_wince_targets(conf,versions,version,vc_path,vsvars,supported_platforms): + for device,platforms in supported_platforms: + cetargets=[] + for platform,compiler,include,lib in platforms: + winCEpath=os.path.join(vc_path,'ce') + if not os.path.isdir(winCEpath): + continue + try: + common_bindirs,_1,_2=conf.get_msvc_version('msvc',version,'x86',vsvars) + except conf.errors.ConfigurationError: + continue + if os.path.isdir(os.path.join(winCEpath,'lib',platform)): + bindirs=[os.path.join(winCEpath,'bin',compiler),os.path.join(winCEpath,'bin','x86_'+compiler)]+common_bindirs + incdirs=[os.path.join(winCEpath,'include'),os.path.join(winCEpath,'atlmfc','include'),include] + libdirs=[os.path.join(winCEpath,'lib',platform),os.path.join(winCEpath,'atlmfc','lib',platform),lib] + cetargets.append((platform,(platform,(bindirs,incdirs,libdirs)))) + if cetargets: + versions.append((device+' '+version,cetargets)) +def gather_msvc_versions(conf,versions): + vc_paths=[] + for(v,version,reg)in gather_msvc_detected_versions(): + try: + try: + msvc_version=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,reg+"\\Setup\\VC") + except WindowsError: + msvc_version=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,reg+"\\Setup\\Microsoft Visual C++") + path,type=_winreg.QueryValueEx(msvc_version,'ProductDir') + vc_paths.append((version,os.path.abspath(str(path)))) + except WindowsError: + continue + wince_supported_platforms=gather_wince_supported_platforms() + for version,vc_path in vc_paths: + vs_path=os.path.dirname(vc_path) + vsvars=os.path.join(vs_path,'Common7','Tools','vsvars32.bat') + if wince_supported_platforms and os.path.isfile(vsvars): + conf.gather_wince_targets(versions,version,vc_path,vsvars,wince_supported_platforms) + for version,vc_path in vc_paths: + vs_path=os.path.dirname(vc_path) + conf.gather_msvc_targets(versions,version,vc_path) +def gather_icl_versions(conf,versions): + version_pattern=re.compile('^...?.?\....?.?') + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Intel\\Compilers\\C++') + except WindowsError: + try: + all_versions=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Intel\\Compilers\\C++') + except WindowsError: + return + index=0 + while 1: + try: + version=_winreg.EnumKey(all_versions,index) + except WindowsError: + break + index=index+1 + if not version_pattern.match(version): + continue + targets=[] + for target,arch in all_icl_platforms: + try: + if target=='intel64':targetDir='EM64T_NATIVE' + else:targetDir=target + _winreg.OpenKey(all_versions,version+'\\'+targetDir) + icl_version=_winreg.OpenKey(all_versions,version) + path,type=_winreg.QueryValueEx(icl_version,'ProductDir') + if os.path.isfile(os.path.join(path,'bin','iclvars.bat')): + try: + targets.append((target,(arch,conf.get_msvc_version('intel',version,target,os.path.join(path,'bin','iclvars.bat'))))) + except conf.errors.ConfigurationError: + pass + except WindowsError: + pass + for target,arch in all_icl_platforms: + try: + icl_version=_winreg.OpenKey(all_versions,version+'\\'+target) + path,type=_winreg.QueryValueEx(icl_version,'ProductDir') + if os.path.isfile(os.path.join(path,'bin','iclvars.bat')): + try: + targets.append((target,(arch,conf.get_msvc_version('intel',version,target,os.path.join(path,'bin','iclvars.bat'))))) + except conf.errors.ConfigurationError: + pass + except WindowsError: + continue + major=version[0:2] + versions.append(('intel '+major,targets)) +def get_msvc_versions(conf): + if not conf.env['MSVC_INSTALLED_VERSIONS']: + lst=[] + conf.gather_icl_versions(lst) + conf.gather_wsdk_versions(lst) + conf.gather_msvc_versions(lst) + conf.env['MSVC_INSTALLED_VERSIONS']=lst + return conf.env['MSVC_INSTALLED_VERSIONS'] +def print_all_msvc_detected(conf): + for version,targets in conf.env['MSVC_INSTALLED_VERSIONS']: + info(version) + for target,l in targets: + info("\t"+target) +def detect_msvc(conf): + versions=get_msvc_versions(conf) + return setup_msvc(conf,versions) +def find_lt_names_msvc(self,libname,is_static=False): + lt_names=['lib%s.la'%libname,'%s.la'%libname,] + for path in self.env['LIBPATH']: + for la in lt_names: + laf=os.path.join(path,la) + dll=None + if os.path.exists(laf): + ltdict=Utils.read_la_file(laf) + lt_libdir=None + if ltdict.get('libdir',''): + lt_libdir=ltdict['libdir'] + if not is_static and ltdict.get('library_names',''): + dllnames=ltdict['library_names'].split() + dll=dllnames[0].lower() + dll=re.sub('\.dll$','',dll) + return(lt_libdir,dll,False) + elif ltdict.get('old_library',''): + olib=ltdict['old_library'] + if os.path.exists(os.path.join(path,olib)): + return(path,olib,True) + elif lt_libdir!=''and os.path.exists(os.path.join(lt_libdir,olib)): + return(lt_libdir,olib,True) + else: + return(None,olib,True) + else: + raise self.errors.WafError('invalid libtool object file: %s'%laf) + return(None,None,None) +def libname_msvc(self,libname,is_static=False): + lib=libname.lower() + lib=re.sub('\.lib$','',lib) + if lib in g_msvc_systemlibs: + return lib + lib=re.sub('^lib','',lib) + if lib=='m': + return None + (lt_path,lt_libname,lt_static)=self.find_lt_names_msvc(lib,is_static) + if lt_path!=None and lt_libname!=None: + if lt_static==True: + return os.path.join(lt_path,lt_libname) + if lt_path!=None: + _libpaths=[lt_path]+self.env['LIBPATH'] + else: + _libpaths=self.env['LIBPATH'] + static_libs=['lib%ss.lib'%lib,'lib%s.lib'%lib,'%ss.lib'%lib,'%s.lib'%lib,] + dynamic_libs=['lib%s.dll.lib'%lib,'lib%s.dll.a'%lib,'%s.dll.lib'%lib,'%s.dll.a'%lib,'lib%s_d.lib'%lib,'%s_d.lib'%lib,'%s.lib'%lib,] + libnames=static_libs + if not is_static: + libnames=dynamic_libs+static_libs + for path in _libpaths: + for libn in libnames: + if os.path.exists(os.path.join(path,libn)): + debug('msvc: lib found: %s'%os.path.join(path,libn)) + return re.sub('\.lib$','',libn) + self.fatal("The library %r could not be found"%libname) + return re.sub('\.lib$','',libname) +def check_lib_msvc(self,libname,is_static=False,uselib_store=None): + libn=self.libname_msvc(libname,is_static) + if not uselib_store: + uselib_store=libname.upper() + if False and is_static: + self.env['STLIB_'+uselib_store]=[libn] + else: + self.env['LIB_'+uselib_store]=[libn] +def check_libs_msvc(self,libnames,is_static=False): + for libname in Utils.to_list(libnames): + self.check_lib_msvc(libname,is_static) +def configure(conf): + conf.autodetect() + conf.find_msvc() + conf.msvc_common_flags() + conf.cc_load_tools() + conf.cxx_load_tools() + conf.cc_add_flags() + conf.cxx_add_flags() + conf.link_add_flags() + conf.visual_studio_add_flags() +def no_autodetect(conf): + conf.env.NO_MSVC_DETECT=1 + configure(conf) +def autodetect(conf): + v=conf.env + if v.NO_MSVC_DETECT: + return + compiler,version,path,includes,libdirs=conf.detect_msvc() + v['PATH']=path + v['INCLUDES']=includes + v['LIBPATH']=libdirs + v['MSVC_COMPILER']=compiler + try: + v['MSVC_VERSION']=float(version) + except: + v['MSVC_VERSION']=float(version[:-3]) +def _get_prog_names(conf,compiler): + if compiler=='intel': + compiler_name='ICL' + linker_name='XILINK' + lib_name='XILIB' + else: + compiler_name='CL' + linker_name='LINK' + lib_name='LIB' + return compiler_name,linker_name,lib_name +def find_msvc(conf): + if sys.platform=='cygwin': + conf.fatal('MSVC module does not work under cygwin Python!') + v=conf.env + path=v['PATH'] + compiler=v['MSVC_COMPILER'] + version=v['MSVC_VERSION'] + compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler) + v.MSVC_MANIFEST=(compiler=='msvc'and version>=8)or(compiler=='wsdk'and version>=6)or(compiler=='intel'and version>=11) + cxx=None + if v['CXX']:cxx=v['CXX'] + elif'CXX'in conf.environ:cxx=conf.environ['CXX'] + cxx=conf.find_program(compiler_name,var='CXX',path_list=path) + cxx=conf.cmd_to_list(cxx) + env=dict(conf.environ) + if path:env.update(PATH=';'.join(path)) + if not conf.cmd_and_log(cxx+['/nologo','/help'],env=env): + conf.fatal('the msvc compiler could not be identified') + v['CC']=v['CXX']=cxx + v['CC_NAME']=v['CXX_NAME']='msvc' + if not v['LINK_CXX']: + link=conf.find_program(linker_name,path_list=path) + if link:v['LINK_CXX']=link + else:conf.fatal('%s was not found (linker)'%linker_name) + v['LINK']=link + if not v['LINK_CC']: + v['LINK_CC']=v['LINK_CXX'] + if not v['AR']: + stliblink=conf.find_program(lib_name,path_list=path,var='AR') + if not stliblink:return + v['ARFLAGS']=['/NOLOGO'] + if v.MSVC_MANIFEST: + mt=conf.find_program('MT',path_list=path,var='MT') + v['MTFLAGS']=['/NOLOGO'] + conf.load('winres') + if not conf.env['WINRC']: + warn('Resource compiler not found. Compiling resource file is disabled') +def visual_studio_add_flags(self): + v=self.env + try:v.prepend_value('INCLUDES',self.environ['INCLUDE'].split(';')) + except:pass + try:v.prepend_value('LIBPATH',self.environ['LIB'].split(';')) + except:pass +def msvc_common_flags(conf): + v=conf.env + v['DEST_BINFMT']='pe' + v.append_value('CFLAGS',['/nologo']) + v.append_value('CXXFLAGS',['/nologo']) + v['DEFINES_ST']='/D%s' + v['CC_SRC_F']='' + v['CC_TGT_F']=['/c','/Fo'] + if v['MSVC_VERSION']>=8: + v['CC_TGT_F']=['/FC']+v['CC_TGT_F'] + v['CXX_SRC_F']='' + v['CXX_TGT_F']=['/c','/Fo'] + if v['MSVC_VERSION']>=8: + v['CXX_TGT_F']=['/FC']+v['CXX_TGT_F'] + v['CPPPATH_ST']='/I%s' + v['AR_TGT_F']=v['CCLNK_TGT_F']=v['CXXLNK_TGT_F']='/OUT:' + v['CFLAGS_CONSOLE']=v['CXXFLAGS_CONSOLE']=['/SUBSYSTEM:CONSOLE'] + v['CFLAGS_NATIVE']=v['CXXFLAGS_NATIVE']=['/SUBSYSTEM:NATIVE'] + v['CFLAGS_POSIX']=v['CXXFLAGS_POSIX']=['/SUBSYSTEM:POSIX'] + v['CFLAGS_WINDOWS']=v['CXXFLAGS_WINDOWS']=['/SUBSYSTEM:WINDOWS'] + v['CFLAGS_WINDOWSCE']=v['CXXFLAGS_WINDOWSCE']=['/SUBSYSTEM:WINDOWSCE'] + v['CFLAGS_CRT_MULTITHREADED']=v['CXXFLAGS_CRT_MULTITHREADED']=['/MT'] + v['CFLAGS_CRT_MULTITHREADED_DLL']=v['CXXFLAGS_CRT_MULTITHREADED_DLL']=['/MD'] + v['CFLAGS_CRT_MULTITHREADED_DBG']=v['CXXFLAGS_CRT_MULTITHREADED_DBG']=['/MTd'] + v['CFLAGS_CRT_MULTITHREADED_DLL_DBG']=v['CXXFLAGS_CRT_MULTITHREADED_DLL_DBG']=['/MDd'] + v['LIB_ST']='%s.lib' + v['LIBPATH_ST']='/LIBPATH:%s' + v['STLIB_ST']='lib%s.lib' + v['STLIBPATH_ST']='/LIBPATH:%s' + v.append_value('LINKFLAGS',['/NOLOGO']) + if v['MSVC_MANIFEST']: + v.append_value('LINKFLAGS',['/MANIFEST']) + v['CFLAGS_cshlib']=[] + v['CXXFLAGS_cxxshlib']=[] + v['LINKFLAGS_cshlib']=v['LINKFLAGS_cxxshlib']=['/DLL'] + v['cshlib_PATTERN']=v['cxxshlib_PATTERN']='%s.dll' + v['implib_PATTERN']='%s.lib' + v['IMPLIB_ST']='/IMPLIB:%s' + v['LINKFLAGS_cstlib']=[] + v['cstlib_PATTERN']=v['cxxstlib_PATTERN']='lib%s.lib' + v['cprogram_PATTERN']=v['cxxprogram_PATTERN']='%s.exe' +def apply_flags_msvc(self): + if self.env.CC_NAME!='msvc'or not getattr(self,'link_task',None): + return + is_static=isinstance(self.link_task,ccroot.stlink_task) + subsystem=getattr(self,'subsystem','') + if subsystem: + subsystem='/subsystem:%s'%subsystem + flags=is_static and'ARFLAGS'or'LINKFLAGS' + self.env.append_value(flags,subsystem) + if not is_static: + for f in self.env.LINKFLAGS: + d=f.lower() + if d[1:]=='debug': + pdbnode=self.link_task.outputs[0].change_ext('.pdb') + self.link_task.outputs.append(pdbnode) + try: + self.install_task.source.append(pdbnode) + except AttributeError: + pass + break +def apply_manifest(self): + if self.env.CC_NAME=='msvc'and self.env.MSVC_MANIFEST and getattr(self,'link_task',None): + out_node=self.link_task.outputs[0] + man_node=out_node.parent.find_or_declare(out_node.name+'.manifest') + self.link_task.outputs.append(man_node) + self.link_task.do_manifest=True +def exec_mf(self): + env=self.env + mtool=env['MT'] + if not mtool: + return 0 + self.do_manifest=False + outfile=self.outputs[0].abspath() + manifest=None + for out_node in self.outputs: + if out_node.name.endswith('.manifest'): + manifest=out_node.abspath() + break + if manifest is None: + return 0 + mode='' + if'cprogram'in self.generator.features or'cxxprogram'in self.generator.features: + mode='1' + elif'cshlib'in self.generator.features or'cxxshlib'in self.generator.features: + mode='2' + debug('msvc: embedding manifest in mode %r'%mode) + lst=[] + lst.append(env['MT']) + lst.extend(Utils.to_list(env['MTFLAGS'])) + lst.extend(['-manifest',manifest]) + lst.append('-outputresource:%s;%s'%(outfile,mode)) + lst=[lst] + return self.exec_command(*lst) +def quote_response_command(self,flag): + if flag.find(' ')>-1: + for x in('/LIBPATH:','/IMPLIB:','/OUT:','/I'): + if flag.startswith(x): + flag='%s"%s"'%(x,flag[len(x):]) + break + else: + flag='"%s"'%flag + return flag +def exec_response_command(self,cmd,**kw): + try: + tmp=None + if sys.platform.startswith('win')and isinstance(cmd,list)and len(' '.join(cmd))>=8192: + program=cmd[0] + cmd=[self.quote_response_command(x)for x in cmd] + (fd,tmp)=tempfile.mkstemp() + os.write(fd,'\r\n'.join(i.replace('\\','\\\\')for i in cmd[1:])) + os.close(fd) + cmd=[program,'@'+tmp] + ret=self.generator.bld.exec_command(cmd,**kw) + finally: + if tmp: + try: + os.remove(tmp) + except: + pass + return ret +def exec_command_msvc(self,*k,**kw): + if self.env['CC_NAME']=='msvc': + if isinstance(k[0],list): + lst=[] + carry='' + for a in k[0]: + if a=='/Fo'or a=='/doc'or a[-1]==':': + carry=a + else: + lst.append(carry+a) + carry='' + k=[lst] + if self.env['PATH']: + env=dict(os.environ) + env.update(PATH=';'.join(self.env['PATH'])) + kw['env']=env + bld=self.generator.bld + try: + if not kw.get('cwd',None): + kw['cwd']=bld.cwd + except AttributeError: + bld.cwd=kw['cwd']=bld.variant_dir + ret=self.exec_response_command(k[0],**kw) + if not ret and getattr(self,'do_manifest',None): + ret=self.exec_mf() + return ret +for k in'c cxx cprogram cxxprogram cshlib cxxshlib cstlib cxxstlib'.split(): + cls=Task.classes.get(k,None) + if cls: + cls.exec_command=exec_command_msvc + cls.exec_response_command=exec_response_command + cls.quote_response_command=quote_response_command + cls.exec_mf=exec_mf + +conf(get_msvc_version) +conf(gather_wsdk_versions) +conf(gather_msvc_targets) +conf(gather_wince_targets) +conf(gather_msvc_versions) +conf(gather_icl_versions) +conf(get_msvc_versions) +conf(print_all_msvc_detected) +conf(detect_msvc) +conf(find_lt_names_msvc) +conf(libname_msvc) +conf(check_lib_msvc) +conf(check_libs_msvc) +conf(no_autodetect) +conf(autodetect) +conf(find_msvc) +conf(visual_studio_add_flags) +conf(msvc_common_flags) +after_method('apply_link')(apply_flags_msvc) +feature('c','cxx')(apply_flags_msvc) +feature('cprogram','cshlib','cxxprogram','cxxshlib')(apply_manifest) +after_method('apply_link')(apply_manifest) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/nasm.py @@ -0,0 +1,14 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import waflib.Tools.asm +from waflib.TaskGen import feature +def apply_nasm_vars(self): + self.env.append_value('ASFLAGS',self.to_list(getattr(self,'nasm_flags',[]))) +def configure(conf): + nasm=conf.find_program(['nasm','yasm'],var='AS') + conf.env.AS_TGT_F=['-o'] + conf.env.ASLNK_TGT_F=['-o'] + +feature('asm')(apply_nasm_vars) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/perl.py @@ -0,0 +1,81 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os +from waflib import Task,Options,Utils +from waflib.Configure import conf +from waflib.TaskGen import extension,feature,before_method +def init_perlext(self): + self.uselib=self.to_list(getattr(self,'uselib',[])) + if not'PERLEXT'in self.uselib:self.uselib.append('PERLEXT') + self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['perlext_PATTERN'] +def xsubpp_file(self,node): + outnode=node.change_ext('.c') + self.create_task('xsubpp',node,outnode) + self.source.append(outnode) +class xsubpp(Task.Task): + run_str='${PERL} ${XSUBPP} -noprototypes -typemap ${EXTUTILS_TYPEMAP} ${SRC} > ${TGT}' + color='BLUE' + ext_out=['.h'] +def check_perl_version(self,minver=None): + res=True + if minver: + cver='.'.join(map(str,minver)) + else: + cver='' + self.start_msg('Checking for minimum perl version %s'%cver) + perl=getattr(Options.options,'perlbinary',None) + if not perl: + perl=self.find_program('perl',var='PERL') + if not perl: + self.end_msg("Perl not found",color="YELLOW") + return False + self.env['PERL']=perl + version=self.cmd_and_log([perl,"-e",'printf \"%vd\", $^V']) + if not version: + res=False + version="Unknown" + elif not minver is None: + ver=tuple(map(int,version.split("."))) + if ver +#ifdef __cplusplus +extern "C" { +#endif + void Py_Initialize(void); + void Py_Finalize(void); +#ifdef __cplusplus +} +#endif +int main() +{ + Py_Initialize(); + Py_Finalize(); + return 0; +} +''' +INST=''' +import sys, py_compile +py_compile.compile(sys.argv[1], sys.argv[2], sys.argv[3]) +''' +DISTUTILS_IMP=['from distutils.sysconfig import get_config_var, get_python_lib'] +def process_py(self,node): + try: + if not self.bld.is_install: + return + except: + return + try: + if not self.install_path: + return + except AttributeError: + self.install_path='${PYTHONDIR}' + def inst_py(ctx): + install_from=getattr(self,'install_from',None) + if install_from: + install_from=self.path.find_dir(install_from) + install_pyfile(self,node,install_from) + self.bld.add_post_fun(inst_py) +def install_pyfile(self,node,install_from=None): + from_node=install_from or node.parent + tsk=self.bld.install_as(self.install_path+'/'+node.path_from(from_node),node,postpone=False) + path=tsk.get_install_path() + if self.bld.is_install<0: + info("+ removing byte compiled python files") + for x in'co': + try: + os.remove(path+x) + except OSError: + pass + if self.bld.is_install>0: + try: + st1=os.stat(path) + except: + error('The python file is missing, this should not happen') + for x in['c','o']: + do_inst=self.env['PY'+x.upper()] + try: + st2=os.stat(path+x) + except OSError: + pass + else: + if st1.st_mtime<=st2.st_mtime: + do_inst=False + if do_inst: + lst=(x=='o')and[self.env['PYFLAGS_OPT']]or[] + (a,b,c)=(path,path+x,tsk.get_install_path(destdir=False)+x) + argv=self.env['PYTHON']+lst+['-c',INST,a,b,c] + info('+ byte compiling %r'%(path+x)) + env=self.env.env or None + ret=Utils.subprocess.Popen(argv,env=env).wait() + if ret: + raise Errors.WafError('py%s compilation failed %r'%(x,path)) +def feature_py(self): + pass +def init_pyext(self): + try: + if not self.install_path: + return + except AttributeError: + self.install_path='${PYTHONARCHDIR}' + self.uselib=self.to_list(getattr(self,'uselib',[])) + if not'PYEXT'in self.uselib: + self.uselib.append('PYEXT') + self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['macbundle_PATTERN']=self.env['pyext_PATTERN'] +def set_bundle(self): + if Utils.unversioned_sys_platform()=='darwin': + self.mac_bundle=True +def init_pyembed(self): + self.uselib=self.to_list(getattr(self,'uselib',[])) + if not'PYEMBED'in self.uselib: + self.uselib.append('PYEMBED') +def get_python_variables(self,variables,imports=None): + if not imports: + try: + imports=self.python_imports + except AttributeError: + imports=DISTUTILS_IMP + program=list(imports) + program.append('') + for v in variables: + program.append("print(repr(%s))"%v) + os_env=dict(os.environ) + try: + del os_env['MACOSX_DEPLOYMENT_TARGET'] + except KeyError: + pass + try: + out=self.cmd_and_log(self.env.PYTHON+['-c','\n'.join(program)],env=os_env) + except Errors.WafError: + self.fatal('The distutils module is unusable: install "python-devel"?') + return_values=[] + for s in out.split('\n'): + s=s.strip() + if not s: + continue + if s=='None': + return_values.append(None) + elif s[0]=="'"and s[-1]=="'": + return_values.append(s[1:-1]) + elif s[0].isdigit(): + return_values.append(int(s)) + else:break + return return_values +def check_python_headers(conf): + if not conf.env['CC_NAME']and not conf.env['CXX_NAME']: + conf.fatal('load a compiler first (gcc, g++, ..)') + if not conf.env['PYTHON_VERSION']: + conf.check_python_version() + env=conf.env + pybin=conf.env.PYTHON + if not pybin: + conf.fatal('could not find the python executable') + v='prefix SO LDFLAGS LIBDIR LIBPL INCLUDEPY Py_ENABLE_SHARED MACOSX_DEPLOYMENT_TARGET LDSHARED CFLAGS'.split() + try: + lst=conf.get_python_variables(["get_config_var('%s') or ''"%x for x in v]) + except RuntimeError: + conf.fatal("Python development headers not found (-v for details).") + vals=['%s = %r'%(x,y)for(x,y)in zip(v,lst)] + conf.to_log("Configuration returned from %r:\n%r\n"%(pybin,'\n'.join(vals))) + dct=dict(zip(v,lst)) + x='MACOSX_DEPLOYMENT_TARGET' + if dct[x]: + conf.env[x]=conf.environ[x]=dct[x] + env['pyext_PATTERN']='%s'+dct['SO'] + all_flags=dct['LDFLAGS']+' '+dct['CFLAGS'] + conf.parse_flags(all_flags,'PYEMBED') + all_flags=dct['LDFLAGS']+' '+dct['LDSHARED']+' '+dct['CFLAGS'] + conf.parse_flags(all_flags,'PYEXT') + result=None + for name in('python'+env['PYTHON_VERSION'],'python'+env['PYTHON_VERSION'].replace('.','')): + if not result and env['LIBPATH_PYEMBED']: + path=env['LIBPATH_PYEMBED'] + conf.to_log("\n\n# Trying default LIBPATH_PYEMBED: %r\n"%path) + result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in LIBPATH_PYEMBED'%name) + if not result and dct['LIBDIR']: + path=[dct['LIBDIR']] + conf.to_log("\n\n# try again with -L$python_LIBDIR: %r\n"%path) + result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in LIBDIR'%name) + if not result and dct['LIBPL']: + path=[dct['LIBPL']] + conf.to_log("\n\n# try again with -L$python_LIBPL (some systems don't install the python library in $prefix/lib)\n") + result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in python_LIBPL'%name) + if not result: + path=[os.path.join(dct['prefix'],"libs")] + conf.to_log("\n\n# try again with -L$prefix/libs, and pythonXY name rather than pythonX.Y (win32)\n") + result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in $prefix/libs'%name) + if result: + break + if result: + env['LIBPATH_PYEMBED']=path + env.append_value('LIB_PYEMBED',[name]) + else: + conf.to_log("\n\n### LIB NOT FOUND\n") + if(Utils.is_win32 or sys.platform.startswith('os2')or dct['Py_ENABLE_SHARED']): + env['LIBPATH_PYEXT']=env['LIBPATH_PYEMBED'] + env['LIB_PYEXT']=env['LIB_PYEMBED'] + num='.'.join(env['PYTHON_VERSION'].split('.')[:2]) + conf.find_program(['python%s-config'%num,'python-config-%s'%num,'python%sm-config'%num],var='PYTHON_CONFIG',mandatory=False) + includes=[] + if conf.env.PYTHON_CONFIG: + for incstr in conf.cmd_and_log([conf.env.PYTHON_CONFIG,'--includes']).strip().split(): + if(incstr.startswith('-I')or incstr.startswith('/I')): + incstr=incstr[2:] + if incstr not in includes: + includes.append(incstr) + conf.to_log("Include path for Python extensions (found via python-config --includes): %r\n"%(includes,)) + env['INCLUDES_PYEXT']=includes + env['INCLUDES_PYEMBED']=includes + else: + conf.to_log("Include path for Python extensions ""(found via distutils module): %r\n"%(dct['INCLUDEPY'],)) + env['INCLUDES_PYEXT']=[dct['INCLUDEPY']] + env['INCLUDES_PYEMBED']=[dct['INCLUDEPY']] + if env['CC_NAME']=='gcc': + env.append_value('CFLAGS_PYEMBED',['-fno-strict-aliasing']) + env.append_value('CFLAGS_PYEXT',['-fno-strict-aliasing']) + if env['CXX_NAME']=='gcc': + env.append_value('CXXFLAGS_PYEMBED',['-fno-strict-aliasing']) + env.append_value('CXXFLAGS_PYEXT',['-fno-strict-aliasing']) + if env.CC_NAME=="msvc": + from distutils.msvccompiler import MSVCCompiler + dist_compiler=MSVCCompiler() + dist_compiler.initialize() + env.append_value('CFLAGS_PYEXT',dist_compiler.compile_options) + env.append_value('CXXFLAGS_PYEXT',dist_compiler.compile_options) + env.append_value('LINKFLAGS_PYEXT',dist_compiler.ldflags_shared) + try: + conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',uselib='PYEMBED',fragment=FRAG,errmsg='Could not find the python development headers') + except conf.errors.ConfigurationError: + conf.check_cfg(path=conf.env.PYTHON_CONFIG,package='',uselib_store='PYEMBED',args=['--cflags','--libs']) + conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',msg='Getting the python flags from python-config',uselib='PYEMBED',fragment=FRAG,errmsg='Could not find the python development headers elsewhere') +def check_python_version(conf,minver=None): + assert minver is None or isinstance(minver,tuple) + pybin=conf.env['PYTHON'] + if not pybin: + conf.fatal('could not find the python executable') + cmd=pybin+['-c','import sys\nfor x in sys.version_info: print(str(x))'] + debug('python: Running python command %r'%cmd) + lines=conf.cmd_and_log(cmd).split() + assert len(lines)==5,"found %i lines, expected 5: %r"%(len(lines),lines) + pyver_tuple=(int(lines[0]),int(lines[1]),int(lines[2]),lines[3],int(lines[4])) + result=(minver is None)or(pyver_tuple>=minver) + if result: + pyver='.'.join([str(x)for x in pyver_tuple[:2]]) + conf.env['PYTHON_VERSION']=pyver + if'PYTHONDIR'in conf.environ: + pydir=conf.environ['PYTHONDIR'] + else: + if Utils.is_win32: + (python_LIBDEST,pydir)=conf.get_python_variables(["get_config_var('LIBDEST') or ''","get_python_lib(standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']]) + else: + python_LIBDEST=None + (pydir,)=conf.get_python_variables(["get_python_lib(standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']]) + if python_LIBDEST is None: + if conf.env['LIBDIR']: + python_LIBDEST=os.path.join(conf.env['LIBDIR'],"python"+pyver) + else: + python_LIBDEST=os.path.join(conf.env['PREFIX'],"lib","python"+pyver) + if'PYTHONARCHDIR'in conf.environ: + pyarchdir=conf.environ['PYTHONARCHDIR'] + else: + (pyarchdir,)=conf.get_python_variables(["get_python_lib(plat_specific=1, standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']]) + if not pyarchdir: + pyarchdir=pydir + if hasattr(conf,'define'): + conf.define('PYTHONDIR',pydir) + conf.define('PYTHONARCHDIR',pyarchdir) + conf.env['PYTHONDIR']=pydir + conf.env['PYTHONARCHDIR']=pyarchdir + pyver_full='.'.join(map(str,pyver_tuple[:3])) + if minver is None: + conf.msg('Checking for python version',pyver_full) + else: + minver_str='.'.join(map(str,minver)) + conf.msg('Checking for python version',pyver_tuple,">= %s"%(minver_str,)and'GREEN'or'YELLOW') + if not result: + conf.fatal('The python version is too old, expecting %r'%(minver,)) +PYTHON_MODULE_TEMPLATE=''' +import %s as current_module +version = getattr(current_module, '__version__', None) +if version is not None: + print(str(version)) +else: + print('unknown version') +''' +def check_python_module(conf,module_name,condition=''): + msg='Python module %s'%module_name + if condition: + msg='%s (%s)'%(msg,condition) + conf.start_msg(msg) + try: + ret=conf.cmd_and_log(conf.env['PYTHON']+['-c',PYTHON_MODULE_TEMPLATE%module_name]) + except Exception: + conf.end_msg(False) + conf.fatal('Could not find the python module %r'%module_name) + ret=ret.strip() + if condition: + conf.end_msg(ret) + if ret=='unknown version': + conf.fatal('Could not check the %s version'%module_name) + from distutils.version import LooseVersion + def num(*k): + if isinstance(k[0],int): + return LooseVersion('.'.join([str(x)for x in k])) + else: + return LooseVersion(k[0]) + d={'num':num,'ver':LooseVersion(ret)} + ev=eval(condition,{},d) + if not ev: + conf.fatal('The %s version does not satisfy the requirements'%module_name) + else: + if ret=='unknown version': + conf.end_msg(True) + else: + conf.end_msg(ret) +def configure(conf): + try: + conf.find_program('python',var='PYTHON') + except conf.errors.ConfigurationError: + warn("could not find a python executable, setting to sys.executable '%s'"%sys.executable) + conf.env.PYTHON=sys.executable + if conf.env.PYTHON!=sys.executable: + warn("python executable '%s' different from sys.executable '%s'"%(conf.env.PYTHON,sys.executable)) + conf.env.PYTHON=conf.cmd_to_list(conf.env.PYTHON) + v=conf.env + v['PYCMD']='"import sys, py_compile;py_compile.compile(sys.argv[1], sys.argv[2])"' + v['PYFLAGS']='' + v['PYFLAGS_OPT']='-O' + v['PYC']=getattr(Options.options,'pyc',1) + v['PYO']=getattr(Options.options,'pyo',1) +def options(opt): + opt.add_option('--nopyc',action='store_false',default=1,help='Do not install bytecode compiled .pyc files (configuration) [Default:install]',dest='pyc') + opt.add_option('--nopyo',action='store_false',default=1,help='Do not install optimised compiled .pyo files (configuration) [Default:install]',dest='pyo') + +extension('.py')(process_py) +feature('py')(feature_py) +feature('pyext')(init_pyext) +before_method('propagate_uselib_vars','apply_link')(init_pyext) +after_method('apply_bundle')(init_pyext) +feature('pyext')(set_bundle) +before_method('apply_link','apply_bundle')(set_bundle) +before_method('propagate_uselib_vars')(init_pyembed) +feature('pyembed')(init_pyembed) +conf(get_python_variables) +conf(check_python_headers) +conf(check_python_version) +conf(check_python_module) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/qt4.py @@ -0,0 +1,434 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +try: + from xml.sax import make_parser + from xml.sax.handler import ContentHandler +except ImportError: + has_xml=False + ContentHandler=object +else: + has_xml=True +import os,sys +from waflib.Tools import c_preproc,cxx +from waflib import Task,Utils,Options,Errors +from waflib.TaskGen import feature,after_method,extension +from waflib.Configure import conf +from waflib import Logs +MOC_H=['.h','.hpp','.hxx','.hh'] +EXT_RCC=['.qrc'] +EXT_UI=['.ui'] +EXT_QT4=['.cpp','.cc','.cxx','.C'] +QT4_LIBS="QtCore QtGui QtUiTools QtNetwork QtOpenGL QtSql QtSvg QtTest QtXml QtXmlPatterns QtWebKit Qt3Support QtHelp QtScript QtDeclarative" +class qxx(cxx.cxx): + def __init__(self,*k,**kw): + Task.Task.__init__(self,*k,**kw) + self.moc_done=0 + def scan(self): + (nodes,names)=c_preproc.scan(self) + for x in nodes: + if x.name.endswith('.moc'): + nodes.remove(x) + names.append(x.path_from(self.inputs[0].parent.get_bld())) + return(nodes,names) + def runnable_status(self): + if self.moc_done: + return Task.Task.runnable_status(self) + else: + for t in self.run_after: + if not t.hasrun: + return Task.ASK_LATER + self.add_moc_tasks() + return Task.Task.runnable_status(self) + def add_moc_tasks(self): + node=self.inputs[0] + bld=self.generator.bld + try: + self.signature() + except KeyError: + pass + else: + delattr(self,'cache_sig') + moctasks=[] + mocfiles=[] + try: + tmp_lst=bld.raw_deps[self.uid()] + bld.raw_deps[self.uid()]=[] + except KeyError: + tmp_lst=[] + for d in tmp_lst: + if not d.endswith('.moc'): + continue + if d in mocfiles: + Logs.error("paranoia owns") + continue + mocfiles.append(d) + h_node=None + try:ext=Options.options.qt_header_ext.split() + except AttributeError:pass + if not ext:ext=MOC_H + base2=d[:-4] + for x in[node.parent]+self.generator.includes_nodes: + for e in ext: + h_node=x.find_node(base2+e) + if h_node: + break + if h_node: + m_node=h_node.change_ext('.moc') + break + else: + for k in EXT_QT4: + if base2.endswith(k): + for x in[node.parent]+self.generator.includes_nodes: + h_node=x.find_node(base2) + if h_node: + break + if h_node: + m_node=h_node.change_ext(k+'.moc') + break + if not h_node: + raise Errors.WafError('no header found for %r which is a moc file'%d) + bld.node_deps[(self.inputs[0].parent.abspath(),m_node.name)]=h_node + task=Task.classes['moc'](env=self.env,generator=self.generator) + task.set_inputs(h_node) + task.set_outputs(m_node) + gen=bld.producer + gen.outstanding.insert(0,task) + gen.total+=1 + moctasks.append(task) + tmp_lst=bld.raw_deps[self.uid()]=mocfiles + lst=bld.node_deps.get(self.uid(),()) + for d in lst: + name=d.name + if name.endswith('.moc'): + task=Task.classes['moc'](env=self.env,generator=self.generator) + task.set_inputs(bld.node_deps[(self.inputs[0].parent.abspath(),name)]) + task.set_outputs(d) + gen=bld.producer + gen.outstanding.insert(0,task) + gen.total+=1 + moctasks.append(task) + self.run_after.update(set(moctasks)) + self.moc_done=1 + run=Task.classes['cxx'].__dict__['run'] +class trans_update(Task.Task): + run_str='${QT_LUPDATE} ${SRC} -ts ${TGT}' + color='BLUE' +Task.update_outputs(trans_update) +class XMLHandler(ContentHandler): + def __init__(self): + self.buf=[] + self.files=[] + def startElement(self,name,attrs): + if name=='file': + self.buf=[] + def endElement(self,name): + if name=='file': + self.files.append(str(''.join(self.buf))) + def characters(self,cars): + self.buf.append(cars) +def create_rcc_task(self,node): + rcnode=node.change_ext('_rc.cpp') + rcctask=self.create_task('rcc',node,rcnode) + cpptask=self.create_task('cxx',rcnode,rcnode.change_ext('.o')) + try: + self.compiled_tasks.append(cpptask) + except AttributeError: + self.compiled_tasks=[cpptask] + return cpptask +def create_uic_task(self,node): + uictask=self.create_task('ui4',node) + uictask.outputs=[self.path.find_or_declare(self.env['ui_PATTERN']%node.name[:-3])] +def add_lang(self,node): + self.lang=self.to_list(getattr(self,'lang',[]))+[node] +def apply_qt4(self): + if getattr(self,'lang',None): + qmtasks=[] + for x in self.to_list(self.lang): + if isinstance(x,str): + x=self.path.find_resource(x+'.ts') + qmtasks.append(self.create_task('ts2qm',x,x.change_ext('.qm'))) + if getattr(self,'update',None)and Options.options.trans_qt4: + cxxnodes=[a.inputs[0]for a in self.compiled_tasks]+[a.inputs[0]for a in self.tasks if getattr(a,'inputs',None)and a.inputs[0].name.endswith('.ui')] + for x in qmtasks: + self.create_task('trans_update',cxxnodes,x.inputs) + if getattr(self,'langname',None): + qmnodes=[x.outputs[0]for x in qmtasks] + rcnode=self.langname + if isinstance(rcnode,str): + rcnode=self.path.find_or_declare(rcnode+'.qrc') + t=self.create_task('qm2rcc',qmnodes,rcnode) + k=create_rcc_task(self,t.outputs[0]) + self.link_task.inputs.append(k.outputs[0]) + lst=[] + for flag in self.to_list(self.env['CXXFLAGS']): + if len(flag)<2:continue + f=flag[0:2] + if f in['-D','-I','/D','/I']: + if(f[0]=='/'): + lst.append('-'+flag[1:]) + else: + lst.append(flag) + self.env['MOC_FLAGS']=lst +def cxx_hook(self,node): + return self.create_compiled_task('qxx',node) +class rcc(Task.Task): + color='BLUE' + run_str='${QT_RCC} -name ${SRC[0].name} ${SRC[0].abspath()} ${RCC_ST} -o ${TGT}' + ext_out=['.h'] + def scan(self): + node=self.inputs[0] + if not has_xml: + Logs.error('no xml support was found, the rcc dependencies will be incomplete!') + return([],[]) + parser=make_parser() + curHandler=XMLHandler() + parser.setContentHandler(curHandler) + fi=open(self.inputs[0].abspath()) + parser.parse(fi) + fi.close() + nodes=[] + names=[] + root=self.inputs[0].parent + for x in curHandler.files: + nd=root.find_resource(x) + if nd:nodes.append(nd) + else:names.append(x) + return(nodes,names) +class moc(Task.Task): + color='BLUE' + run_str='${QT_MOC} ${MOC_FLAGS} ${MOCCPPPATH_ST:INCPATHS} ${MOCDEFINES_ST:DEFINES} ${SRC} ${MOC_ST} ${TGT}' +class ui4(Task.Task): + color='BLUE' + run_str='${QT_UIC} ${SRC} -o ${TGT}' + ext_out=['.h'] +class ts2qm(Task.Task): + color='BLUE' + run_str='${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}' +class qm2rcc(Task.Task): + color='BLUE' + after='ts2qm' + def run(self): + txt='\n'.join(['%s'%k.path_from(self.outputs[0].parent)for k in self.inputs]) + code='\n\n%s\n\n'%txt + self.outputs[0].write(code) +def configure(self): + self.find_qt4_binaries() + self.set_qt4_libs_to_check() + self.find_qt4_libraries() + self.add_qt4_rpath() + self.simplify_qt4_libs() +def find_qt4_binaries(self): + env=self.env + opt=Options.options + qtdir=getattr(opt,'qtdir','') + qtbin=getattr(opt,'qtbin','') + paths=[] + if qtdir: + qtbin=os.path.join(qtdir,'bin') + if not qtdir: + qtdir=self.environ.get('QT4_ROOT','') + qtbin=os.path.join(qtdir,'bin') + if qtbin: + paths=[qtbin] + if not qtdir: + paths=os.environ.get('PATH','').split(os.pathsep) + paths.append('/usr/share/qt4/bin/') + try: + lst=Utils.listdir('/usr/local/Trolltech/') + except OSError: + pass + else: + if lst: + lst.sort() + lst.reverse() + qtdir='/usr/local/Trolltech/%s/'%lst[0] + qtbin=os.path.join(qtdir,'bin') + paths.append(qtbin) + cand=None + prev_ver=['4','0','0'] + for qmk in['qmake-qt4','qmake4','qmake']: + try: + qmake=self.find_program(qmk,path_list=paths) + except self.errors.ConfigurationError: + pass + else: + try: + version=self.cmd_and_log([qmake,'-query','QT_VERSION']).strip() + except self.errors.ConfigurationError: + pass + else: + if version: + new_ver=version.split('.') + if new_ver>prev_ver: + cand=qmake + prev_ver=new_ver + if cand: + self.env.QMAKE=cand + else: + self.fatal('Could not find qmake for qt4') + qtbin=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_BINS']).strip()+os.sep + def find_bin(lst,var): + for f in lst: + try: + ret=self.find_program(f,path_list=paths) + except self.errors.ConfigurationError: + pass + else: + env[var]=ret + break + find_bin(['uic-qt3','uic3'],'QT_UIC3') + find_bin(['uic-qt4','uic'],'QT_UIC') + if not env['QT_UIC']: + self.fatal('cannot find the uic compiler for qt4') + try: + uicver=self.cmd_and_log(env['QT_UIC']+" -version 2>&1").strip() + except self.errors.ConfigurationError: + self.fatal('this uic compiler is for qt3, add uic for qt4 to your path') + uicver=uicver.replace('Qt User Interface Compiler ','').replace('User Interface Compiler for Qt','') + self.msg('Checking for uic version','%s'%uicver) + if uicver.find(' 3.')!=-1: + self.fatal('this uic compiler is for qt3, add uic for qt4 to your path') + find_bin(['moc-qt4','moc'],'QT_MOC') + find_bin(['rcc'],'QT_RCC') + find_bin(['lrelease-qt4','lrelease'],'QT_LRELEASE') + find_bin(['lupdate-qt4','lupdate'],'QT_LUPDATE') + env['UIC3_ST']='%s -o %s' + env['UIC_ST']='%s -o %s' + env['MOC_ST']='-o' + env['ui_PATTERN']='ui_%s.h' + env['QT_LRELEASE_FLAGS']=['-silent'] + env.MOCCPPPATH_ST='-I%s' + env.MOCDEFINES_ST='-D%s' +def find_qt4_libraries(self): + qtlibs=getattr(Options.options,'qtlibs','') + if not qtlibs: + try: + qtlibs=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_LIBS']).strip() + except Errors.WafError: + qtdir=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_PREFIX']).strip()+os.sep + qtlibs=os.path.join(qtdir,'lib') + self.msg('Found the Qt4 libraries in',qtlibs) + qtincludes=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_HEADERS']).strip() + env=self.env + if not'PKG_CONFIG_PATH'in os.environ: + os.environ['PKG_CONFIG_PATH']='%s:%s/pkgconfig:/usr/lib/qt4/lib/pkgconfig:/opt/qt4/lib/pkgconfig:/usr/lib/qt4/lib:/opt/qt4/lib'%(qtlibs,qtlibs) + try: + self.check_cfg(atleast_pkgconfig_version='0.1') + except self.errors.ConfigurationError: + for i in self.qt4_vars: + uselib=i.upper() + if Utils.unversioned_sys_platform()=="darwin": + frameworkName=i+".framework" + qtDynamicLib=os.path.join(qtlibs,frameworkName,i) + if os.path.exists(qtDynamicLib): + env.append_unique('FRAMEWORK_'+uselib,i) + self.msg('Checking for %s'%i,qtDynamicLib,'GREEN') + else: + self.msg('Checking for %s'%i,False,'YELLOW') + env.append_unique('INCLUDES_'+uselib,os.path.join(qtlibs,frameworkName,'Headers')) + elif sys.platform!="win32": + qtDynamicLib=os.path.join(qtlibs,"lib"+i+".so") + qtStaticLib=os.path.join(qtlibs,"lib"+i+".a") + if os.path.exists(qtDynamicLib): + env.append_unique('LIB_'+uselib,i) + self.msg('Checking for %s'%i,qtDynamicLib,'GREEN') + elif os.path.exists(qtStaticLib): + env.append_unique('LIB_'+uselib,i) + self.msg('Checking for %s'%i,qtStaticLib,'GREEN') + else: + self.msg('Checking for %s'%i,False,'YELLOW') + env.append_unique('LIBPATH_'+uselib,qtlibs) + env.append_unique('INCLUDES_'+uselib,qtincludes) + env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i)) + else: + for k in("lib%s.a","lib%s4.a","%s.lib","%s4.lib"): + lib=os.path.join(qtlibs,k%i) + if os.path.exists(lib): + env.append_unique('LIB_'+uselib,i+k[k.find("%s")+2:k.find('.')]) + self.msg('Checking for %s'%i,lib,'GREEN') + break + else: + self.msg('Checking for %s'%i,False,'YELLOW') + env.append_unique('LIBPATH_'+uselib,qtlibs) + env.append_unique('INCLUDES_'+uselib,qtincludes) + env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i)) + uselib=i.upper()+"_debug" + for k in("lib%sd.a","lib%sd4.a","%sd.lib","%sd4.lib"): + lib=os.path.join(qtlibs,k%i) + if os.path.exists(lib): + env.append_unique('LIB_'+uselib,i+k[k.find("%s")+2:k.find('.')]) + self.msg('Checking for %s'%i,lib,'GREEN') + break + else: + self.msg('Checking for %s'%i,False,'YELLOW') + env.append_unique('LIBPATH_'+uselib,qtlibs) + env.append_unique('INCLUDES_'+uselib,qtincludes) + env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i)) + else: + for i in self.qt4_vars_debug+self.qt4_vars: + self.check_cfg(package=i,args='--cflags --libs',mandatory=False) +def simplify_qt4_libs(self): + env=self.env + def process_lib(vars_,coreval): + for d in vars_: + var=d.upper() + if var=='QTCORE': + continue + value=env['LIBPATH_'+var] + if value: + core=env[coreval] + accu=[] + for lib in value: + if lib in core: + continue + accu.append(lib) + env['LIBPATH_'+var]=accu + process_lib(self.qt4_vars,'LIBPATH_QTCORE') + process_lib(self.qt4_vars_debug,'LIBPATH_QTCORE_DEBUG') +def add_qt4_rpath(self): + env=self.env + if Options.options.want_rpath: + def process_rpath(vars_,coreval): + for d in vars_: + var=d.upper() + value=env['LIBPATH_'+var] + if value: + core=env[coreval] + accu=[] + for lib in value: + if var!='QTCORE': + if lib in core: + continue + accu.append('-Wl,--rpath='+lib) + env['RPATH_'+var]=accu + process_rpath(self.qt4_vars,'LIBPATH_QTCORE') + process_rpath(self.qt4_vars_debug,'LIBPATH_QTCORE_DEBUG') +def set_qt4_libs_to_check(self): + if not hasattr(self,'qt4_vars'): + self.qt4_vars=QT4_LIBS + self.qt4_vars=Utils.to_list(self.qt4_vars) + if not hasattr(self,'qt4_vars_debug'): + self.qt4_vars_debug=[a+'_debug'for a in self.qt4_vars] + self.qt4_vars_debug=Utils.to_list(self.qt4_vars_debug) +def options(opt): + opt.add_option('--want-rpath',action='store_true',default=False,dest='want_rpath',help='enable the rpath for qt libraries') + opt.add_option('--header-ext',type='string',default='',help='header extension for moc files',dest='qt_header_ext') + for i in'qtdir qtbin qtlibs'.split(): + opt.add_option('--'+i,type='string',default='',dest=i) + opt.add_option('--translate',action="store_true",help="collect translation strings",dest="trans_qt4",default=False) + +extension(*EXT_RCC)(create_rcc_task) +extension(*EXT_UI)(create_uic_task) +extension('.ts')(add_lang) +feature('qt4')(apply_qt4) +after_method('apply_link')(apply_qt4) +extension(*EXT_QT4)(cxx_hook) +conf(find_qt4_binaries) +conf(find_qt4_libraries) +conf(simplify_qt4_libs) +conf(add_qt4_rpath) +conf(set_qt4_libs_to_check) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/ruby.py @@ -0,0 +1,104 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os +from waflib import Task,Options,Utils +from waflib.TaskGen import before_method,feature,after_method,Task,extension +from waflib.Configure import conf +def init_rubyext(self): + self.install_path='${ARCHDIR_RUBY}' + self.uselib=self.to_list(getattr(self,'uselib','')) + if not'RUBY'in self.uselib: + self.uselib.append('RUBY') + if not'RUBYEXT'in self.uselib: + self.uselib.append('RUBYEXT') +def apply_ruby_so_name(self): + self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['rubyext_PATTERN'] +def check_ruby_version(self,minver=()): + if Options.options.rubybinary: + self.env.RUBY=Options.options.rubybinary + else: + self.find_program('ruby',var='RUBY') + ruby=self.env.RUBY + try: + version=self.cmd_and_log([ruby,'-e','puts defined?(VERSION) ? VERSION : RUBY_VERSION']).strip() + except: + self.fatal('could not determine ruby version') + self.env.RUBY_VERSION=version + try: + ver=tuple(map(int,version.split("."))) + except: + self.fatal('unsupported ruby version %r'%version) + cver='' + if minver: + if ver=(1,9,0): + ruby_hdrdir=read_config('rubyhdrdir') + cpppath+=ruby_hdrdir + cpppath+=[os.path.join(ruby_hdrdir[0],read_config('arch')[0])] + self.check(header_name='ruby.h',includes=cpppath,errmsg='could not find ruby header file') + self.env.LIBPATH_RUBYEXT=read_config('libdir') + self.env.LIBPATH_RUBYEXT+=archdir + self.env.INCLUDES_RUBYEXT=cpppath + self.env.CFLAGS_RUBYEXT=read_config('CCDLFLAGS') + self.env.rubyext_PATTERN='%s.'+read_config('DLEXT')[0] + flags=read_config('LDSHARED') + while flags and flags[0][0]!='-': + flags=flags[1:] + if len(flags)>1 and flags[1]=="ppc": + flags=flags[2:] + self.env.LINKFLAGS_RUBYEXT=flags + self.env.LINKFLAGS_RUBYEXT+=read_config('LIBS') + self.env.LINKFLAGS_RUBYEXT+=read_config('LIBRUBYARG_SHARED') + if Options.options.rubyarchdir: + self.env.ARCHDIR_RUBY=Options.options.rubyarchdir + else: + self.env.ARCHDIR_RUBY=read_config('sitearchdir')[0] + if Options.options.rubylibdir: + self.env.LIBDIR_RUBY=Options.options.rubylibdir + else: + self.env.LIBDIR_RUBY=read_config('sitelibdir')[0] +def check_ruby_module(self,module_name): + self.start_msg('Ruby module %s'%module_name) + try: + self.cmd_and_log([self.env['RUBY'],'-e','require \'%s\';puts 1'%module_name]) + except: + self.end_msg(False) + self.fatal('Could not find the ruby module %r'%module_name) + self.end_msg(True) +def process(self,node): + tsk=self.create_task('run_ruby',node) +class run_ruby(Task.Task): + run_str='${RUBY} ${RBFLAGS} -I ${SRC[0].parent.abspath()} ${SRC}' +def options(opt): + opt.add_option('--with-ruby-archdir',type='string',dest='rubyarchdir',help='Specify directory where to install arch specific files') + opt.add_option('--with-ruby-libdir',type='string',dest='rubylibdir',help='Specify alternate ruby library path') + opt.add_option('--with-ruby-binary',type='string',dest='rubybinary',help='Specify alternate ruby binary') + +feature('rubyext')(init_rubyext) +before_method('apply_incpaths','apply_lib_vars','apply_bundle','apply_link')(init_rubyext) +feature('rubyext')(apply_ruby_so_name) +before_method('apply_link','propagate_uselib')(apply_ruby_so_name) +conf(check_ruby_version) +conf(check_ruby_ext_devel) +conf(check_ruby_module) +extension('.rb')(process) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/suncc.py @@ -0,0 +1,54 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os +from waflib import Utils +from waflib.Tools import ccroot,ar +from waflib.Configure import conf +def find_scc(conf): + v=conf.env + cc=None + if v['CC']:cc=v['CC'] + elif'CC'in conf.environ:cc=conf.environ['CC'] + if not cc:cc=conf.find_program('cc',var='CC') + if not cc:conf.fatal('Could not find a Sun C compiler') + cc=conf.cmd_to_list(cc) + try: + conf.cmd_and_log(cc+['-flags']) + except: + conf.fatal('%r is not a Sun compiler'%cc) + v['CC']=cc + v['CC_NAME']='sun' +def scc_common_flags(conf): + v=conf.env + v['CC_SRC_F']=[] + v['CC_TGT_F']=['-c','-o'] + if not v['LINK_CC']:v['LINK_CC']=v['CC'] + v['CCLNK_SRC_F']='' + v['CCLNK_TGT_F']=['-o'] + v['CPPPATH_ST']='-I%s' + v['DEFINES_ST']='-D%s' + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STLIB_ST']='-l%s' + v['STLIBPATH_ST']='-L%s' + v['SONAME_ST']='-Wl,-h,%s' + v['SHLIB_MARKER']='-Bdynamic' + v['STLIB_MARKER']='-Bstatic' + v['cprogram_PATTERN']='%s' + v['CFLAGS_cshlib']=['-Kpic','-DPIC'] + v['LINKFLAGS_cshlib']=['-G'] + v['cshlib_PATTERN']='lib%s.so' + v['LINKFLAGS_cstlib']=['-Bstatic'] + v['cstlib_PATTERN']='lib%s.a' +def configure(conf): + conf.find_scc() + conf.find_ar() + conf.scc_common_flags() + conf.cc_load_tools() + conf.cc_add_flags() + conf.link_add_flags() + +conf(find_scc) +conf(scc_common_flags) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/suncxx.py @@ -0,0 +1,55 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os +from waflib import Utils +from waflib.Tools import ccroot,ar +from waflib.Configure import conf +def find_sxx(conf): + v=conf.env + cc=None + if v['CXX']:cc=v['CXX'] + elif'CXX'in conf.environ:cc=conf.environ['CXX'] + if not cc:cc=conf.find_program('CC',var='CXX') + if not cc:cc=conf.find_program('c++',var='CXX') + if not cc:conf.fatal('Could not find a Sun C++ compiler') + cc=conf.cmd_to_list(cc) + try: + conf.cmd_and_log(cc+['-flags']) + except: + conf.fatal('%r is not a Sun compiler'%cc) + v['CXX']=cc + v['CXX_NAME']='sun' +def sxx_common_flags(conf): + v=conf.env + v['CXX_SRC_F']=[] + v['CXX_TGT_F']=['-c','-o'] + if not v['LINK_CXX']:v['LINK_CXX']=v['CXX'] + v['CXXLNK_SRC_F']=[] + v['CXXLNK_TGT_F']=['-o'] + v['CPPPATH_ST']='-I%s' + v['DEFINES_ST']='-D%s' + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STLIB_ST']='-l%s' + v['STLIBPATH_ST']='-L%s' + v['SONAME_ST']='-Wl,-h,%s' + v['SHLIB_MARKER']='-Bdynamic' + v['STLIB_MARKER']='-Bstatic' + v['cxxprogram_PATTERN']='%s' + v['CXXFLAGS_cxxshlib']=['-Kpic','-DPIC'] + v['LINKFLAGS_cxxshlib']=['-G'] + v['cxxshlib_PATTERN']='lib%s.so' + v['LINKFLAGS_cxxstlib']=['-Bstatic'] + v['cxxstlib_PATTERN']='lib%s.a' +def configure(conf): + conf.find_sxx() + conf.find_ar() + conf.sxx_common_flags() + conf.cxx_load_tools() + conf.cxx_add_flags() + conf.link_add_flags() + +conf(find_sxx) +conf(sxx_common_flags) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/tex.py @@ -0,0 +1,242 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,re +from waflib import Utils,Task,Errors +from waflib.TaskGen import feature,before_method +from waflib.Logs import error,warn,debug +re_bibunit=re.compile(r'\\(?Pputbib)\[(?P[^\[\]]*)\]',re.M) +def bibunitscan(self): + node=self.inputs[0] + nodes=[] + if not node:return nodes + code=Utils.readf(node.abspath()) + for match in re_bibunit.finditer(code): + path=match.group('file') + if path: + for k in['','.bib']: + debug('tex: trying %s%s'%(path,k)) + fi=node.parent.find_resource(path+k) + if fi: + nodes.append(fi) + else: + debug('tex: could not find %s'%path) + debug("tex: found the following bibunit files: %s"%nodes) + return nodes +exts_deps_tex=['','.ltx','.tex','.bib','.pdf','.png','.eps','.ps'] +exts_tex=['.ltx','.tex'] +re_tex=re.compile(r'\\(?Pinclude|bibliography|putbib|includegraphics|input|import|bringin|lstinputlisting)(\[[^\[\]]*\])?{(?P[^{}]*)}',re.M) +g_bibtex_re=re.compile('bibdata',re.M) +class tex(Task.Task): + bibtex_fun,_=Task.compile_fun('${BIBTEX} ${BIBTEXFLAGS} ${SRCFILE}',shell=False) + bibtex_fun.__doc__=""" + Execute the program **bibtex** + """ + makeindex_fun,_=Task.compile_fun('${MAKEINDEX} ${MAKEINDEXFLAGS} ${SRCFILE}',shell=False) + makeindex_fun.__doc__=""" + Execute the program **makeindex** + """ + def scan_aux(self,node): + nodes=[node] + re_aux=re.compile(r'\\@input{(?P[^{}]*)}',re.M) + def parse_node(node): + code=node.read() + for match in re_aux.finditer(code): + path=match.group('file') + found=node.parent.find_or_declare(path) + if found and found not in nodes: + debug('tex: found aux node '+found.abspath()) + nodes.append(found) + parse_node(found) + parse_node(node) + return nodes + def scan(self): + node=self.inputs[0] + nodes=[] + names=[] + seen=[] + if not node:return(nodes,names) + def parse_node(node): + if node in seen: + return + seen.append(node) + code=node.read() + global re_tex + for match in re_tex.finditer(code): + for path in match.group('file').split(','): + if path: + add_name=True + found=None + for k in exts_deps_tex: + debug('tex: trying %s%s'%(path,k)) + found=node.parent.find_resource(path+k) + if found and not found in self.outputs: + nodes.append(found) + add_name=False + for ext in exts_tex: + if found.name.endswith(ext): + parse_node(found) + break + if add_name: + names.append(path) + parse_node(node) + for x in nodes: + x.parent.get_bld().mkdir() + debug("tex: found the following : %s and names %s"%(nodes,names)) + return(nodes,names) + def check_status(self,msg,retcode): + if retcode!=0: + raise Errors.WafError("%r command exit status %r"%(msg,retcode)) + def bibfile(self): + need_bibtex=False + try: + for aux_node in self.aux_nodes: + ct=aux_node.read() + if g_bibtex_re.findall(ct): + need_bibtex=True + break + except(OSError,IOError): + error('error bibtex scan') + else: + if need_bibtex: + warn('calling bibtex') + self.env.env={} + self.env.env.update(os.environ) + self.env.env.update({'BIBINPUTS':self.TEXINPUTS,'BSTINPUTS':self.TEXINPUTS}) + self.env.SRCFILE=self.aux_nodes[0].name[:-4] + self.check_status('error when calling bibtex',self.bibtex_fun()) + def bibunits(self): + try: + bibunits=bibunitscan(self) + except FSError: + error('error bibunitscan') + else: + if bibunits: + fn=['bu'+str(i)for i in xrange(1,len(bibunits)+1)] + if fn: + warn('calling bibtex on bibunits') + for f in fn: + self.env.env={'BIBINPUTS':self.TEXINPUTS,'BSTINPUTS':self.TEXINPUTS} + self.env.SRCFILE=f + self.check_status('error when calling bibtex',self.bibtex_fun()) + def makeindex(self): + try: + idx_path=self.idx_node.abspath() + os.stat(idx_path) + except OSError: + warn('index file %s absent, not calling makeindex'%idx_path) + else: + warn('calling makeindex') + self.env.SRCFILE=self.idx_node.name + self.env.env={} + self.check_status('error when calling makeindex %s'%idx_path,self.makeindex_fun()) + def run(self): + env=self.env + if not env['PROMPT_LATEX']: + env.append_value('LATEXFLAGS','-interaction=batchmode') + env.append_value('PDFLATEXFLAGS','-interaction=batchmode') + env.append_value('XELATEXFLAGS','-interaction=batchmode') + fun=self.texfun + node=self.inputs[0] + srcfile=node.abspath() + texinputs=self.env.TEXINPUTS or'' + self.TEXINPUTS=node.parent.get_bld().abspath()+os.pathsep+node.parent.get_src().abspath()+os.pathsep+texinputs+os.pathsep + self.aux_node=node.change_ext('.aux') + self.cwd=self.inputs[0].parent.get_bld().abspath() + warn('first pass on %s'%self.__class__.__name__) + self.env.env={} + self.env.env.update(os.environ) + self.env.env.update({'TEXINPUTS':self.TEXINPUTS}) + self.env.SRCFILE=srcfile + self.check_status('error when calling latex',fun()) + self.aux_nodes=self.scan_aux(node.change_ext('.aux')) + self.idx_node=node.change_ext('.idx') + self.bibfile() + self.bibunits() + self.makeindex() + hash='' + for i in range(10): + prev_hash=hash + try: + hashes=[Utils.h_file(x.abspath())for x in self.aux_nodes] + hash=Utils.h_list(hashes) + except(OSError,IOError): + error('could not read aux.h') + pass + if hash and hash==prev_hash: + break + warn('calling %s'%self.__class__.__name__) + self.env.env={} + self.env.env.update(os.environ) + self.env.env.update({'TEXINPUTS':self.TEXINPUTS}) + self.env.SRCFILE=srcfile + self.check_status('error when calling %s'%self.__class__.__name__,fun()) +class latex(tex): + texfun,vars=Task.compile_fun('${LATEX} ${LATEXFLAGS} ${SRCFILE}',shell=False) +class pdflatex(tex): + texfun,vars=Task.compile_fun('${PDFLATEX} ${PDFLATEXFLAGS} ${SRCFILE}',shell=False) +class xelatex(tex): + texfun,vars=Task.compile_fun('${XELATEX} ${XELATEXFLAGS} ${SRCFILE}',shell=False) +class dvips(Task.Task): + run_str='${DVIPS} ${DVIPSFLAGS} ${SRC} -o ${TGT}' + color='BLUE' + after=['latex','pdflatex','xelatex'] +class dvipdf(Task.Task): + run_str='${DVIPDF} ${DVIPDFFLAGS} ${SRC} ${TGT}' + color='BLUE' + after=['latex','pdflatex','xelatex'] +class pdf2ps(Task.Task): + run_str='${PDF2PS} ${PDF2PSFLAGS} ${SRC} ${TGT}' + color='BLUE' + after=['latex','pdflatex','xelatex'] +def apply_tex(self): + if not getattr(self,'type',None)in['latex','pdflatex','xelatex']: + self.type='pdflatex' + tree=self.bld + outs=Utils.to_list(getattr(self,'outs',[])) + self.env['PROMPT_LATEX']=getattr(self,'prompt',1) + deps_lst=[] + if getattr(self,'deps',None): + deps=self.to_list(self.deps) + for filename in deps: + n=self.path.find_resource(filename) + if not n in deps_lst:deps_lst.append(n) + for node in self.to_nodes(self.source): + if self.type=='latex': + task=self.create_task('latex',node,node.change_ext('.dvi')) + elif self.type=='pdflatex': + task=self.create_task('pdflatex',node,node.change_ext('.pdf')) + elif self.type=='xelatex': + task=self.create_task('xelatex',node,node.change_ext('.pdf')) + task.env=self.env + if deps_lst: + try: + lst=tree.node_deps[task.uid()] + for n in deps_lst: + if not n in lst: + lst.append(n) + except KeyError: + tree.node_deps[task.uid()]=deps_lst + if self.type=='latex': + if'ps'in outs: + tsk=self.create_task('dvips',task.outputs,node.change_ext('.ps')) + tsk.env.env={'TEXINPUTS':node.parent.abspath()+os.pathsep+self.path.abspath()+os.pathsep+self.path.get_bld().abspath()} + if'pdf'in outs: + tsk=self.create_task('dvipdf',task.outputs,node.change_ext('.pdf')) + tsk.env.env={'TEXINPUTS':node.parent.abspath()+os.pathsep+self.path.abspath()+os.pathsep+self.path.get_bld().abspath()} + elif self.type=='pdflatex': + if'ps'in outs: + self.create_task('pdf2ps',task.outputs,node.change_ext('.ps')) + self.source=[] +def configure(self): + v=self.env + for p in'tex latex pdflatex xelatex bibtex dvips dvipdf ps2pdf makeindex pdf2ps'.split(): + try: + self.find_program(p,var=p.upper()) + except self.errors.ConfigurationError: + pass + v['DVIPSFLAGS']='-Ppdf' + +feature('tex')(apply_tex) +before_method('process_source')(apply_tex) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/vala.py @@ -0,0 +1,216 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os.path,shutil,re +from waflib import Context,Task,Utils,Logs,Options,Errors +from waflib.TaskGen import extension +from waflib.Configure import conf +class valac(Task.Task): + vars=["VALAC","VALAC_VERSION","VALAFLAGS"] + ext_out=['.h'] + def run(self): + env=self.env + cmd=[env['VALAC'],'-C','--quiet'] + cmd.extend(Utils.to_list(env['VALAFLAGS'])) + if self.threading: + cmd.append('--thread') + if self.profile: + cmd.append('--profile=%s'%self.profile) + if self.target_glib: + cmd.append('--target-glib=%s'%self.target_glib) + if self.is_lib: + cmd.append('--library='+self.target) + for x in self.outputs: + if x.name.endswith('.h'): + cmd.append('--header='+x.name) + if self.gir: + cmd.append('--gir=%s.gir'%self.gir) + for vapi_dir in self.vapi_dirs: + cmd.append('--vapidir=%s'%vapi_dir) + for package in self.packages: + cmd.append('--pkg=%s'%package) + for package in self.packages_private: + cmd.append('--pkg=%s'%package) + for define in self.vala_defines: + cmd.append('--define=%s'%define) + cmd.extend([a.abspath()for a in self.inputs]) + ret=self.exec_command(cmd,cwd=self.outputs[0].parent.abspath()) + if ret: + return ret + for x in self.outputs: + if id(x.parent)!=id(self.outputs[0].parent): + shutil.move(self.outputs[0].parent.abspath()+os.sep+x.name,x.abspath()) + if self.packages and getattr(self,'deps_node',None): + self.deps_node.write('\n'.join(self.packages)) + return ret +def vala_file(self,node): + valatask=getattr(self,"valatask",None) + if not valatask: + def _get_api_version(): + api_version='1.0' + if hasattr(Context.g_module,'API_VERSION'): + version=Context.g_module.API_VERSION.split(".") + if version[0]=="0": + api_version="0."+version[1] + else: + api_version=version[0]+".0" + return api_version + valatask=self.create_task('valac') + self.valatask=valatask + self.includes=Utils.to_list(getattr(self,'includes',[])) + self.uselib=self.to_list(getattr(self,'uselib',[])) + valatask.packages=[] + valatask.packages_private=Utils.to_list(getattr(self,'packages_private',[])) + valatask.vapi_dirs=[] + valatask.target=self.target + valatask.threading=False + valatask.install_path=getattr(self,'install_path','') + valatask.profile=getattr(self,'profile','gobject') + valatask.vala_defines=getattr(self,'vala_defines',[]) + valatask.target_glib=None + valatask.gir=getattr(self,'gir',None) + valatask.gir_path=getattr(self,'gir_path','${DATAROOTDIR}/gir-1.0') + valatask.vapi_path=getattr(self,'vapi_path','${DATAROOTDIR}/vala/vapi') + valatask.pkg_name=getattr(self,'pkg_name',self.env['PACKAGE']) + valatask.header_path=getattr(self,'header_path','${INCLUDEDIR}/%s-%s'%(valatask.pkg_name,_get_api_version())) + valatask.install_binding=getattr(self,'install_binding',True) + valatask.is_lib=False + if not'cprogram'in self.features: + valatask.is_lib=True + packages=Utils.to_list(getattr(self,'packages',[])) + vapi_dirs=Utils.to_list(getattr(self,'vapi_dirs',[])) + includes=[] + if hasattr(self,'use'): + local_packages=Utils.to_list(self.use)[:] + seen=[] + while len(local_packages)>0: + package=local_packages.pop() + if package in seen: + continue + seen.append(package) + try: + package_obj=self.bld.get_tgen_by_name(package) + except Errors.WafError: + continue + package_name=package_obj.target + package_node=package_obj.path + package_dir=package_node.path_from(self.path) + for task in package_obj.tasks: + for output in task.outputs: + if output.name==package_name+".vapi": + valatask.set_run_after(task) + if package_name not in packages: + packages.append(package_name) + if package_dir not in vapi_dirs: + vapi_dirs.append(package_dir) + if package_dir not in includes: + includes.append(package_dir) + if hasattr(package_obj,'use'): + lst=self.to_list(package_obj.use) + lst.reverse() + local_packages=[pkg for pkg in lst if pkg not in seen]+local_packages + valatask.packages=packages + for vapi_dir in vapi_dirs: + try: + valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath()) + valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).get_bld().abspath()) + except AttributeError: + Logs.warn("Unable to locate Vala API directory: '%s'"%vapi_dir) + self.includes.append(self.bld.srcnode.abspath()) + self.includes.append(self.bld.bldnode.abspath()) + for include in includes: + try: + self.includes.append(self.path.find_dir(include).abspath()) + self.includes.append(self.path.find_dir(include).get_bld().abspath()) + except AttributeError: + Logs.warn("Unable to locate include directory: '%s'"%include) + if valatask.profile=='gobject': + if hasattr(self,'target_glib'): + Logs.warn('target_glib on vala tasks is not supported --vala-target-glib=MAJOR.MINOR from the vala tool options') + if getattr(Options.options,'vala_target_glib',None): + valatask.target_glib=Options.options.vala_target_glib + if not'GOBJECT'in self.uselib: + self.uselib.append('GOBJECT') + if hasattr(self,'threading'): + if valatask.profile=='gobject': + valatask.threading=self.threading + if not'GTHREAD'in self.uselib: + self.uselib.append('GTHREAD') + else: + Logs.warn("Profile %s does not have threading support"%valatask.profile) + if valatask.is_lib: + valatask.outputs.append(self.path.find_or_declare('%s.h'%self.target)) + valatask.outputs.append(self.path.find_or_declare('%s.vapi'%self.target)) + if valatask.gir: + valatask.outputs.append(self.path.find_or_declare('%s.gir'%self.gir)) + if valatask.packages: + d=self.path.find_or_declare('%s.deps'%self.target) + valatask.outputs.append(d) + valatask.deps_node=d + valatask.inputs.append(node) + c_node=node.change_ext('.c') + valatask.outputs.append(c_node) + self.source.append(c_node) + if valatask.is_lib and valatask.install_binding: + headers_list=[o for o in valatask.outputs if o.suffix()==".h"] + try: + self.install_vheader.source=headers_list + except AttributeError: + self.install_vheader=self.bld.install_files(valatask.header_path,headers_list,self.env) + vapi_list=[o for o in valatask.outputs if(o.suffix()in(".vapi",".deps"))] + try: + self.install_vapi.source=vapi_list + except AttributeError: + self.install_vapi=self.bld.install_files(valatask.vapi_path,vapi_list,self.env) + gir_list=[o for o in valatask.outputs if o.suffix()==".gir"] + try: + self.install_gir.source=gir_list + except AttributeError: + self.install_gir=self.bld.install_files(valatask.gir_path,gir_list,self.env) +valac=Task.update_outputs(valac) +def find_valac(self,valac_name,min_version): + valac=self.find_program(valac_name,var='VALAC') + try: + output=self.cmd_and_log(valac+' --version') + except Exception: + valac_version=None + else: + ver=re.search(r'\d+.\d+.\d+',output).group(0).split('.') + valac_version=tuple([int(x)for x in ver]) + self.msg('Checking for %s version >= %r'%(valac_name,min_version),valac_version,valac_version and valac_version>=min_version) + if valac and valac_version= %r"%(valac_name,valac_version,min_version)) + self.env['VALAC_VERSION']=valac_version + return valac +def check_vala(self,min_version=(0,8,0),branch=None): + if not branch: + branch=min_version[:2] + try: + find_valac(self,'valac-%d.%d'%(branch[0],branch[1]),min_version) + except self.errors.ConfigurationError: + find_valac(self,'valac',min_version) +def check_vala_deps(self): + if not self.env['HAVE_GOBJECT']: + pkg_args={'package':'gobject-2.0','uselib_store':'GOBJECT','args':'--cflags --libs'} + if getattr(Options.options,'vala_target_glib',None): + pkg_args['atleast_version']=Options.options.vala_target_glib + self.check_cfg(**pkg_args) + if not self.env['HAVE_GTHREAD']: + pkg_args={'package':'gthread-2.0','uselib_store':'GTHREAD','args':'--cflags --libs'} + if getattr(Options.options,'vala_target_glib',None): + pkg_args['atleast_version']=Options.options.vala_target_glib + self.check_cfg(**pkg_args) +def configure(self): + self.load('gnu_dirs') + self.check_vala_deps() + self.check_vala() +def options(opt): + opt.load('gnu_dirs') + valaopts=opt.add_option_group('Vala Compiler Options') + valaopts.add_option('--vala-target-glib',default=None,dest='vala_target_glib',metavar='MAJOR.MINOR',help='Target version of glib for Vala GObject code generation') + +extension('.vala','.gs')(vala_file) +conf(find_valac) +conf(check_vala) +conf(check_vala_deps) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/waf_unit_test.py @@ -0,0 +1,79 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys +from waflib.TaskGen import feature,after_method +from waflib import Utils,Task,Logs,Options +testlock=Utils.threading.Lock() +def make_test(self): + if getattr(self,'link_task',None): + self.create_task('utest',self.link_task.outputs) +class utest(Task.Task): + color='PINK' + after=['vnum','inst'] + vars=[] + def runnable_status(self): + ret=super(utest,self).runnable_status() + if ret==Task.SKIP_ME: + if getattr(Options.options,'all_tests',False): + return Task.RUN_ME + return ret + def run(self): + filename=self.inputs[0].abspath() + self.ut_exec=getattr(self,'ut_exec',[filename]) + if getattr(self.generator,'ut_fun',None): + self.generator.ut_fun(self) + try: + fu=getattr(self.generator.bld,'all_test_paths') + except AttributeError: + fu=os.environ.copy() + self.generator.bld.all_test_paths=fu + lst=[] + for g in self.generator.bld.groups: + for tg in g: + if getattr(tg,'link_task',None): + lst.append(tg.link_task.outputs[0].parent.abspath()) + def add_path(dct,path,var): + dct[var]=os.pathsep.join(Utils.to_list(path)+[os.environ.get(var,'')]) + if Utils.is_win32: + add_path(fu,lst,'PATH') + elif Utils.unversioned_sys_platform()=='darwin': + add_path(fu,lst,'DYLD_LIBRARY_PATH') + add_path(fu,lst,'LD_LIBRARY_PATH') + else: + add_path(fu,lst,'LD_LIBRARY_PATH') + cwd=getattr(self.generator,'ut_cwd','')or self.inputs[0].parent.abspath() + proc=Utils.subprocess.Popen(self.ut_exec,cwd=cwd,env=fu,stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) + (stdout,stderr)=proc.communicate() + tup=(filename,proc.returncode,stdout,stderr) + self.generator.utest_result=tup + testlock.acquire() + try: + bld=self.generator.bld + Logs.debug("ut: %r",tup) + try: + bld.utest_results.append(tup) + except AttributeError: + bld.utest_results=[tup] + finally: + testlock.release() +def summary(bld): + lst=getattr(bld,'utest_results',[]) + if lst: + Logs.pprint('CYAN','execution summary') + total=len(lst) + tfail=len([x for x in lst if x[1]]) + Logs.pprint('CYAN',' tests that pass %d/%d'%(total-tfail,total)) + for(f,code,out,err)in lst: + if not code: + Logs.pprint('CYAN',' %s'%f) + Logs.pprint('CYAN',' tests that fail %d/%d'%(tfail,total)) + for(f,code,out,err)in lst: + if code: + Logs.pprint('CYAN',' %s'%f) +def options(opt): + opt.add_option('--alltests',action='store_true',default=False,help='Exec all unit tests',dest='all_tests') + +feature('test')(make_test) +after_method('apply_link')(make_test) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/winres.py @@ -0,0 +1,34 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +from waflib import Task +from waflib.TaskGen import extension +def rc_file(self,node): + obj_ext='.rc.o' + if self.env['WINRC_TGT_F']=='/fo': + obj_ext='.res' + rctask=self.create_task('winrc',node,node.change_ext(obj_ext)) + try: + self.compiled_tasks.append(rctask) + except AttributeError: + self.compiled_tasks=[rctask] +class winrc(Task.Task): + run_str='${WINRC} ${WINRCFLAGS} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${WINRC_TGT_F} ${TGT} ${WINRC_SRC_F} ${SRC}' + color='BLUE' +def configure(conf): + v=conf.env + v['WINRC_TGT_F']='-o' + v['WINRC_SRC_F']='-i' + if not conf.env.WINRC: + if v.CC_NAME=='msvc': + conf.find_program('RC',var='WINRC',path_list=v['PATH']) + v['WINRC_TGT_F']='/fo' + v['WINRC_SRC_F']='' + else: + conf.find_program('windres',var='WINRC',path_list=v['PATH']) + if not conf.env.WINRC: + conf.fatal('winrc was not found!') + v['WINRCFLAGS']=[] + +extension('.rc')(rc_file) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/xlc.py @@ -0,0 +1,46 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +from waflib.Tools import ccroot,ar +from waflib.Configure import conf +def find_xlc(conf): + cc=conf.find_program(['xlc_r','xlc'],var='CC') + cc=conf.cmd_to_list(cc) + conf.get_xlc_version(cc) + conf.env.CC_NAME='xlc' + conf.env.CC=cc +def xlc_common_flags(conf): + v=conf.env + v['CC_SRC_F']=[] + v['CC_TGT_F']=['-c','-o'] + if not v['LINK_CC']:v['LINK_CC']=v['CC'] + v['CCLNK_SRC_F']=[] + v['CCLNK_TGT_F']=['-o'] + v['CPPPATH_ST']='-I%s' + v['DEFINES_ST']='-D%s' + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STLIB_ST']='-l%s' + v['STLIBPATH_ST']='-L%s' + v['RPATH_ST']='-Wl,-rpath,%s' + v['SONAME_ST']=[] + v['SHLIB_MARKER']=[] + v['STLIB_MARKER']=[] + v['LINKFLAGS_cprogram']=['-Wl,-brtl'] + v['cprogram_PATTERN']='%s' + v['CFLAGS_cshlib']=['-fPIC'] + v['LINKFLAGS_cshlib']=['-G','-Wl,-brtl,-bexpfull'] + v['cshlib_PATTERN']='lib%s.so' + v['LINKFLAGS_cstlib']=[] + v['cstlib_PATTERN']='lib%s.a' +def configure(conf): + conf.find_xlc() + conf.find_ar() + conf.xlc_common_flags() + conf.cc_load_tools() + conf.cc_add_flags() + conf.link_add_flags() + +conf(find_xlc) +conf(xlc_common_flags) \ No newline at end of file --- /dev/null +++ b/waflib/Tools/xlcxx.py @@ -0,0 +1,46 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +from waflib.Tools import ccroot,ar +from waflib.Configure import conf +def find_xlcxx(conf): + cxx=conf.find_program(['xlc++_r','xlc++'],var='CXX') + cxx=conf.cmd_to_list(cxx) + conf.get_xlc_version(cxx) + conf.env.CXX_NAME='xlc++' + conf.env.CXX=cxx +def xlcxx_common_flags(conf): + v=conf.env + v['CXX_SRC_F']=[] + v['CXX_TGT_F']=['-c','-o'] + if not v['LINK_CXX']:v['LINK_CXX']=v['CXX'] + v['CXXLNK_SRC_F']=[] + v['CXXLNK_TGT_F']=['-o'] + v['CPPPATH_ST']='-I%s' + v['DEFINES_ST']='-D%s' + v['LIB_ST']='-l%s' + v['LIBPATH_ST']='-L%s' + v['STLIB_ST']='-l%s' + v['STLIBPATH_ST']='-L%s' + v['RPATH_ST']='-Wl,-rpath,%s' + v['SONAME_ST']=[] + v['SHLIB_MARKER']=[] + v['STLIB_MARKER']=[] + v['LINKFLAGS_cxxprogram']=['-Wl,-brtl'] + v['cxxprogram_PATTERN']='%s' + v['CXXFLAGS_cxxshlib']=['-fPIC'] + v['LINKFLAGS_cxxshlib']=['-G','-Wl,-brtl,-bexpfull'] + v['cxxshlib_PATTERN']='lib%s.so' + v['LINKFLAGS_cxxstlib']=[] + v['cxxstlib_PATTERN']='lib%s.a' +def configure(conf): + conf.find_xlcxx() + conf.find_ar() + conf.xlcxx_common_flags() + conf.cxx_load_tools() + conf.cxx_add_flags() + conf.link_add_flags() + +conf(find_xlcxx) +conf(xlcxx_common_flags) \ No newline at end of file --- /dev/null +++ b/waflib/Utils.py @@ -0,0 +1,336 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os,sys,errno,traceback,inspect,re,shutil,datetime,gc +try: + import subprocess +except: + try: + import waflib.extras.subprocess as subprocess + except: + print("The subprocess module is missing (python2.3?):\n try calling 'waf update --files=subprocess'\n or add a copy of subprocess.py to the python libraries") +try: + from collections import deque +except ImportError: + class deque(list): + def popleft(self): + return self.pop(0) +try: + import _winreg as winreg +except: + try: + import winreg + except: + winreg=None +from waflib import Errors +try: + from collections import UserDict +except: + from UserDict import UserDict +try: + from hashlib import md5 +except: + try: + from md5 import md5 + except: + pass +try: + import threading +except: + class threading(object): + pass + class Lock(object): + def acquire(self): + pass + def release(self): + pass + threading.Lock=threading.Thread=Lock +else: + run_old=threading.Thread.run + def run(*args,**kwargs): + try: + run_old(*args,**kwargs) + except(KeyboardInterrupt,SystemExit): + raise + except: + sys.excepthook(*sys.exc_info()) + threading.Thread.run=run +SIG_NIL='iluvcuteoverload' +O644=420 +O755=493 +rot_chr=['\\','|','/','-'] +rot_idx=0 +try: + from collections import defaultdict +except ImportError: + class defaultdict(dict): + def __init__(self,default_factory): + super(defaultdict,self).__init__() + self.default_factory=default_factory + def __getitem__(self,key): + try: + return super(defaultdict,self).__getitem__(key) + except KeyError: + value=self.default_factory() + self[key]=value + return value +is_win32=sys.platform in('win32','cli') +indicator='\x1b[K%s%s%s\r' +if is_win32 and'NOCOLOR'in os.environ: + indicator='%s%s%s\r' +def readf(fname,m='r'): + f=open(fname,m) + try: + txt=f.read() + finally: + f.close() + return txt +def h_file(filename): + f=open(filename,'rb') + m=md5() + try: + while filename: + filename=f.read(100000) + m.update(filename) + finally: + f.close() + return m.digest() +try: + x=''.encode('hex') +except: + import binascii + def to_hex(s): + ret=binascii.hexlify(s) + if not isinstance(ret,str): + ret=ret.decode('utf-8') + return ret +else: + def to_hex(s): + return s.encode('hex') +to_hex.__doc__=""" +Return the hexadecimal representation of a string + +:param s: string to convert +:type s: string +""" +listdir=os.listdir +if is_win32: + def listdir_win32(s): + if not s: + try: + import ctypes + except: + return[x+':\\'for x in list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')] + else: + dlen=4 + maxdrives=26 + buf=ctypes.create_string_buffer(maxdrives*dlen) + ndrives=ctypes.windll.kernel32.GetLogicalDriveStringsA(maxdrives,ctypes.byref(buf)) + return[buf.raw[4*i:4*i+3].decode('ascii')for i in range(int(ndrives/dlen))] + if len(s)==2 and s[1]==":": + s+=os.sep + if not os.path.isdir(s): + e=OSError() + e.errno=errno.ENOENT + raise e + return os.listdir(s) + listdir=listdir_win32 +def num2ver(ver): + if isinstance(ver,str): + ver=tuple(ver.split('.')) + if isinstance(ver,tuple): + ret=0 + for i in range(4): + if i=6 + try: + _type=unicode + except: + _type=str + to_int=lambda number,default:number and int(number)or default + wlock=threading.Lock() + STD_OUTPUT_HANDLE=-11 + STD_ERROR_HANDLE=-12 + class AnsiTerm(object): + def __init__(self): + self.encoding=sys.stdout.encoding + self.hconsole=windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) + self.cursor_history=[] + self.orig_sbinfo=CONSOLE_SCREEN_BUFFER_INFO() + self.orig_csinfo=CONSOLE_CURSOR_INFO() + windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(self.orig_sbinfo)) + windll.kernel32.GetConsoleCursorInfo(hconsole,byref(self.orig_csinfo)) + def screen_buffer_info(self): + sbinfo=CONSOLE_SCREEN_BUFFER_INFO() + windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(sbinfo)) + return sbinfo + def clear_line(self,param): + mode=param and int(param)or 0 + sbinfo=self.screen_buffer_info() + if mode==1: + line_start=COORD(0,sbinfo.CursorPosition.Y) + line_length=sbinfo.Size.X + elif mode==2: + line_start=COORD(sbinfo.CursorPosition.X,sbinfo.CursorPosition.Y) + line_length=sbinfo.Size.X-sbinfo.CursorPosition.X + else: + line_start=sbinfo.CursorPosition + line_length=sbinfo.Size.X-sbinfo.CursorPosition.X + chars_written=c_int() + windll.kernel32.FillConsoleOutputCharacterA(self.hconsole,c_wchar(' '),line_length,line_start,byref(chars_written)) + windll.kernel32.FillConsoleOutputAttribute(self.hconsole,sbinfo.Attributes,line_length,line_start,byref(chars_written)) + def clear_screen(self,param): + mode=to_int(param,0) + sbinfo=self.screen_buffer_info() + if mode==1: + clear_start=COORD(0,0) + clear_length=sbinfo.CursorPosition.X*sbinfo.CursorPosition.Y + elif mode==2: + clear_start=COORD(0,0) + clear_length=sbinfo.Size.X*sbinfo.Size.Y + windll.kernel32.SetConsoleCursorPosition(self.hconsole,clear_start) + else: + clear_start=sbinfo.CursorPosition + clear_length=((sbinfo.Size.X-sbinfo.CursorPosition.X)+sbinfo.Size.X*(sbinfo.Size.Y-sbinfo.CursorPosition.Y)) + chars_written=c_int() + windll.kernel32.FillConsoleOutputCharacterA(self.hconsole,c_wchar(' '),clear_length,clear_start,byref(chars_written)) + windll.kernel32.FillConsoleOutputAttribute(self.hconsole,sbinfo.Attributes,clear_length,clear_start,byref(chars_written)) + def push_cursor(self,param): + sbinfo=self.screen_buffer_info() + self.cursor_history.append(sbinfo.CursorPosition) + def pop_cursor(self,param): + if self.cursor_history: + old_pos=self.cursor_history.pop() + windll.kernel32.SetConsoleCursorPosition(self.hconsole,old_pos) + def set_cursor(self,param): + y,sep,x=param.partition(';') + x=to_int(x,1)-1 + y=to_int(y,1)-1 + sbinfo=self.screen_buffer_info() + new_pos=COORD(min(max(0,x),sbinfo.Size.X),min(max(0,y),sbinfo.Size.Y)) + windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos) + def set_column(self,param): + x=to_int(param,1)-1 + sbinfo=self.screen_buffer_info() + new_pos=COORD(min(max(0,x),sbinfo.Size.X),sbinfo.CursorPosition.Y) + windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos) + def move_cursor(self,x_offset=0,y_offset=0): + sbinfo=self.screen_buffer_info() + new_pos=COORD(min(max(0,sbinfo.CursorPosition.X+x_offset),sbinfo.Size.X),min(max(0,sbinfo.CursorPosition.Y+y_offset),sbinfo.Size.Y)) + windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos) + def move_up(self,param): + self.move_cursor(y_offset=-to_int(param,1)) + def move_down(self,param): + self.move_cursor(y_offset=to_int(param,1)) + def move_left(self,param): + self.move_cursor(x_offset=-to_int(param,1)) + def move_right(self,param): + self.move_cursor(x_offset=to_int(param,1)) + def next_line(self,param): + sbinfo=self.screen_buffer_info() + self.move_cursor(x_offset=-sbinfo.CursorPosition.X,y_offset=to_int(param,1)) + def prev_line(self,param): + sbinfo=self.screen_buffer_info() + self.move_cursor(x_offset=-sbinfo.CursorPosition.X,y_offset=-to_int(param,1)) + def rgb2bgr(self,c): + return((c&1)<<2)|(c&2)|((c&4)>>2) + def set_color(self,param): + cols=param.split(';') + sbinfo=CONSOLE_SCREEN_BUFFER_INFO() + windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(sbinfo)) + attr=sbinfo.Attributes + for c in cols: + if is_vista: + c=int(c) + else: + c=to_int(c,0) + if c in range(30,38): + attr=(attr&0xfff0)|self.rgb2bgr(c-30) + elif c in range(40,48): + attr=(attr&0xff0f)|(self.rgb2bgr(c-40)<<4) + elif c==0: + attr=self.orig_sbinfo.Attributes + elif c==1: + attr|=0x08 + elif c==4: + attr|=0x80 + elif c==7: + attr=(attr&0xff88)|((attr&0x70)>>4)|((attr&0x07)<<4) + windll.kernel32.SetConsoleTextAttribute(self.hconsole,attr) + def show_cursor(self,param): + csinfo.bVisible=1 + windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(csinfo)) + def hide_cursor(self,param): + csinfo.bVisible=0 + windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(csinfo)) + ansi_command_table={'A':move_up,'B':move_down,'C':move_right,'D':move_left,'E':next_line,'F':prev_line,'G':set_column,'H':set_cursor,'f':set_cursor,'J':clear_screen,'K':clear_line,'h':show_cursor,'l':hide_cursor,'m':set_color,'s':push_cursor,'u':pop_cursor,} + ansi_tokens=re.compile('(?:\x1b\[([0-9?;]*)([a-zA-Z])|([^\x1b]+))') + def write(self,text): + try: + wlock.acquire() + for param,cmd,txt in self.ansi_tokens.findall(text): + if cmd: + cmd_func=self.ansi_command_table.get(cmd) + if cmd_func: + cmd_func(self,param) + else: + self.writeconsole(txt) + finally: + wlock.release() + def writeconsole(self,txt): + chars_written=c_int() + writeconsole=windll.kernel32.WriteConsoleA + if isinstance(txt,_type): + writeconsole=windll.kernel32.WriteConsoleW + TINY_STEP=3000 + for x in range(0,len(txt),TINY_STEP): + tiny=txt[x:x+TINY_STEP] + writeconsole(self.hconsole,tiny,len(tiny),byref(chars_written),None) + def flush(self): + pass + def isatty(self): + return True + sys.stderr=sys.stdout=AnsiTerm() + os.environ['TERM']='vt100' --- /dev/null +++ b/waflib/extras/__init__.py @@ -0,0 +1,4 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + --- /dev/null +++ b/waflib/extras/compat15.py @@ -0,0 +1,223 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import sys +if sys.hexversion < 0x020400f0: from sets import Set as set +import sys +from waflib import ConfigSet,Logs,Options,Scripting,Task,Build,Configure,Node,Runner,TaskGen,Utils,Errors,Context +sys.modules['Environment']=ConfigSet +ConfigSet.Environment=ConfigSet.ConfigSet +sys.modules['Logs']=Logs +sys.modules['Options']=Options +sys.modules['Scripting']=Scripting +sys.modules['Task']=Task +sys.modules['Build']=Build +sys.modules['Configure']=Configure +sys.modules['Node']=Node +sys.modules['Runner']=Runner +sys.modules['TaskGen']=TaskGen +sys.modules['Utils']=Utils +from waflib.Tools import c_preproc +sys.modules['preproc']=c_preproc +from waflib.Tools import c_config +sys.modules['config_c']=c_config +ConfigSet.ConfigSet.copy=ConfigSet.ConfigSet.derive +ConfigSet.ConfigSet.set_variant=Utils.nada +Build.BuildContext.add_subdirs=Build.BuildContext.recurse +Build.BuildContext.new_task_gen=Build.BuildContext.__call__ +Build.BuildContext.is_install=0 +Node.Node.relpath_gen=Node.Node.path_from +def name_to_obj(self,s,env=None): + Logs.warn('compat: change "name_to_obj(name, env)" by "get_tgen_by_name(name)"') + return self.get_tgen_by_name(s) +Build.BuildContext.name_to_obj=name_to_obj +def env_of_name(self,name): + try: + return self.all_envs[name] + except KeyError: + Logs.error('no such environment: '+name) + return None +Build.BuildContext.env_of_name=env_of_name +def set_env_name(self,name,env): + self.all_envs[name]=env + return env +Configure.ConfigurationContext.set_env_name=set_env_name +def retrieve(self,name,fromenv=None): + try: + env=self.all_envs[name] + except KeyError: + env=ConfigSet.ConfigSet() + self.prepare_env(env) + self.all_envs[name]=env + else: + if fromenv:Logs.warn("The environment %s may have been configured already"%name) + return env +Configure.ConfigurationContext.retrieve=retrieve +Configure.ConfigurationContext.sub_config=Configure.ConfigurationContext.recurse +Configure.ConfigurationContext.check_tool=Configure.ConfigurationContext.load +Configure.conftest=Configure.conf +Configure.ConfigurationError=Errors.ConfigurationError +Options.OptionsContext.sub_options=Options.OptionsContext.recurse +Options.OptionsContext.tool_options=Context.Context.load +Options.Handler=Options.OptionsContext +Task.simple_task_type=Task.task_type_from_func=Task.task_factory +Task.TaskBase.classes=Task.classes +def setitem(self,key,value): + if key.startswith('CCFLAGS'): + key=key[1:] + self.table[key]=value +ConfigSet.ConfigSet.__setitem__=setitem +def old_importpaths(self): + if getattr(self,'importpaths',[]): + self.includes=self.importpaths +from waflib import Context +eld=Context.load_tool +def load_tool(*k,**kw): + ret=eld(*k,**kw) + if'set_options'in ret.__dict__: + Logs.warn('compat: rename "set_options" to options') + ret.options=ret.set_options + if'detect'in ret.__dict__: + Logs.warn('compat: rename "detect" to "configure"') + ret.configure=ret.detect + return ret +Context.load_tool=load_tool +rev=Context.load_module +def load_module(path): + ret=rev(path) + if'set_options'in ret.__dict__: + Logs.warn('compat: rename "set_options" to "options" (%r)'%path) + ret.options=ret.set_options + if'srcdir'in ret.__dict__: + Logs.warn('compat: rename "srcdir" to "top" (%r)'%path) + ret.top=ret.srcdir + if'blddir'in ret.__dict__: + Logs.warn('compat: rename "blddir" to "out" (%r)'%path) + ret.out=ret.blddir + return ret +Context.load_module=load_module +old_post=TaskGen.task_gen.post +def post(self): + self.features=self.to_list(self.features) + if'cc'in self.features: + Logs.warn('compat: the feature cc does not exist anymore (use "c")') + self.features.remove('cc') + self.features.append('c') + if'cstaticlib'in self.features: + Logs.warn('compat: the feature cstaticlib does not exist anymore (use "cstlib" or "cxxstlib")') + self.features.remove('cstaticlib') + self.features.append(('cxx'in self.features)and'cxxstlib'or'cstlib') + if getattr(self,'ccflags',None): + Logs.warn('compat: "ccflags" was renamed to "cflags"') + self.cflags=self.ccflags + return old_post(self) +TaskGen.task_gen.post=post +def waf_version(*k,**kw): + Logs.warn('wrong version (waf_version was removed in waf 1.6)') +Utils.waf_version=waf_version +import os +def apply_uselib_local(self): + env=self.env + from waflib.Tools.ccroot import stlink_task + self.uselib=self.to_list(getattr(self,'uselib',[])) + self.includes=self.to_list(getattr(self,'includes',[])) + names=self.to_list(getattr(self,'uselib_local',[])) + get=self.bld.get_tgen_by_name + seen=set([]) + tmp=Utils.deque(names) + if tmp: + Logs.warn('compat: "uselib_local" is deprecated, replace by "use"') + while tmp: + lib_name=tmp.popleft() + if lib_name in seen: + continue + y=get(lib_name) + y.post() + seen.add(lib_name) + if getattr(y,'uselib_local',None): + for x in self.to_list(getattr(y,'uselib_local',[])): + obj=get(x) + obj.post() + if getattr(obj,'link_task',None): + if not isinstance(obj.link_task,stlink_task): + tmp.append(x) + if getattr(y,'link_task',None): + link_name=y.target[y.target.rfind(os.sep)+1:] + if isinstance(y.link_task,stlink_task): + env.append_value('STLIB',[link_name]) + else: + env.append_value('LIB',[link_name]) + self.link_task.set_run_after(y.link_task) + self.link_task.dep_nodes+=y.link_task.outputs + tmp_path=y.link_task.outputs[0].parent.bldpath() + if not tmp_path in env['LIBPATH']: + env.prepend_value('LIBPATH',[tmp_path]) + for v in self.to_list(getattr(y,'uselib',[])): + if not env['STLIB_'+v]: + if not v in self.uselib: + self.uselib.insert(0,v) + if getattr(y,'export_includes',None): + self.includes.extend(y.to_incnodes(y.export_includes)) +def apply_objdeps(self): + names=getattr(self,'add_objects',[]) + if not names: + return + names=self.to_list(names) + get=self.bld.get_tgen_by_name + seen=[] + while names: + x=names[0] + if x in seen: + names=names[1:] + continue + y=get(x) + if getattr(y,'add_objects',None): + added=0 + lst=y.to_list(y.add_objects) + lst.reverse() + for u in lst: + if u in seen:continue + added=1 + names=[u]+names + if added:continue + y.post() + seen.append(x) + for t in getattr(y,'compiled_tasks',[]): + self.link_task.inputs.extend(t.outputs) +def process_obj_files(self): + if not hasattr(self,'obj_files'): + return + for x in self.obj_files: + node=self.path.find_resource(x) + self.link_task.inputs.append(node) +def add_obj_file(self,file): + if not hasattr(self,'obj_files'):self.obj_files=[] + if not'process_obj_files'in self.meths:self.meths.append('process_obj_files') + self.obj_files.append(file) +old_define=Configure.ConfigurationContext.__dict__['define'] +def define(self,key,val,quote=True): + old_define(self,key,val,quote) + if key.startswith('HAVE_'): + self.env[key]=1 +old_undefine=Configure.ConfigurationContext.__dict__['undefine'] +def undefine(self,key): + old_undefine(self,key) + if key.startswith('HAVE_'): + self.env[key]=0 +def set_incdirs(self,val): + Logs.warn('compat: change "export_incdirs" by "export_includes"') + self.export_includes=val +TaskGen.task_gen.export_incdirs=property(None,set_incdirs) + +TaskGen.feature('d')(old_importpaths) +TaskGen.before('apply_incpaths')(old_importpaths) +TaskGen.feature('c','cxx','d')(apply_uselib_local) +TaskGen.before('apply_incpaths','propagate_uselib_vars')(apply_uselib_local) +TaskGen.after('apply_link','process_source')(apply_uselib_local) +TaskGen.feature('cprogram','cxxprogram','cstlib','cxxstlib','cshlib','cxxshlib','dprogram','dstlib','dshlib')(apply_objdeps) +TaskGen.after('apply_link')(apply_objdeps) +TaskGen.after('apply_link')(process_obj_files) +TaskGen.taskgen_method(add_obj_file) +Configure.conf(define) +Configure.conf(undefine) \ No newline at end of file --- /dev/null +++ b/waflib/fixpy2.py @@ -0,0 +1,50 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file + +import os +all_modifs={} +def fixdir(dir): + global all_modifs + for k in all_modifs: + for v in all_modifs[k]: + modif(os.path.join(dir,'waflib'),k,v) +def modif(dir,name,fun): + if name=='*': + lst=[] + for y in'. Tools extras'.split(): + for x in os.listdir(os.path.join(dir,y)): + if x.endswith('.py'): + lst.append(y+os.sep+x) + for x in lst: + modif(dir,x,fun) + return + filename=os.path.join(dir,name) + f=open(filename,'r') + txt=f.read() + f.close() + txt=fun(txt) + f=open(filename,'w') + f.write(txt) + f.close() +def subst(*k): + def do_subst(fun): + global all_modifs + for x in k: + try: + all_modifs[x].append(fun) + except KeyError: + all_modifs[x]=[fun] + return fun + return do_subst +def r1(code): + code=code.replace(',e:',',e:') + code=code.replace("",'') + code=code.replace('','') + return code +def r4(code): + code=code.replace('next(self.biter)','self.biter.next()') + return code + +subst('*')(r1) +subst('Runner.py')(r4) \ No newline at end of file debian/control0000644000000000000000000000644112230526606010600 0ustar Source: jackd2 Section: sound Priority: optional Maintainer: Debian Multimedia Maintainers Uploaders: Adrian Knoth , Jonas Smedegaard , Reinhard Tartler Build-Depends: debhelper (>= 9~), cdbs (>= 0.4.93~), debhelper (>= 8.1.3), d-shlibs, python (>= 2.6.6-3~), libsamplerate-dev, libasound2-dev (>= 1.0.18) [linux-any], libdbus-1-dev, libexpat1-dev, libsndfile1-dev, libncurses-dev, libreadline-dev, libraw1394-dev [linux-any], libffado-dev (>= 2.0.0) [linux-any], libopus-dev, po-debconf Standards-Version: 3.9.4 Homepage: http://jackaudio.org/ Vcs-Git: git://git.debian.org/git/pkg-multimedia/jackd2.git Vcs-Browser: http://anonscm.debian.org/gitweb/?p=pkg-multimedia/jackd2.git Package: jackd2 Architecture: any Replaces: libjack0 (<= 1.9.5~dfsg-13), jackd (<< 3), jack-daemon Provides: jack-daemon Conflicts: jack-daemon, jackd (<< 3) Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, coreutils (>= 4.0), python-dbus, debconf | debconf-2.0, libjack-jackd2-0 (= ${binary:Version}) Pre-Depends: ${misc:Pre-Depends} Recommends: qjackctl, libpam-modules, jackd2-firewire [amd64 i386 powerpc] Suggests: jack-tools, meterbridge Description: JACK Audio Connection Kit (server and example clients) JACK is a low-latency sound server, allowing multiple applications to connect to one audio device, and to share audio between themselves. . This package contains the daemon jackd as well as some example clients. Package: libjack-jackd2-0 Architecture: any Section: libs Depends: ${shlibs:Depends}, ${misc:Depends} Conflicts: jackd2 (>> ${binary:Version}), jackd2 (<< ${binary:Version}), libjack0, libjack-0.116 Suggests: jackd2 (= ${binary:Version}) Provides: libjack-0.116 Replaces: libjack-0.116 Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} Description: JACK Audio Connection Kit (libraries) JACK is a low-latency sound server, allowing multiple applications to connect to one audio device, and to share audio between themselves. . This package contains the shared libraries. Package: jackd2-firewire Architecture: amd64 i386 powerpc Provides: jackd-firewire Replaces: jackd-firewire Conflicts: jackd-firewire Pre-Depends: ${misc:Pre-Depends} Depends: ${shlibs:Depends}, ${misc:Depends}, jackd2 (= ${binary:Version}) Description: JACK Audio Connection Kit (FFADO and FreeBoB backends) JACK is a low-latency sound server, allowing multiple applications to connect to one audio device, and to share audio between themselves. . This package contains the IEEE1394 (FireWire) backends FFADO and FreeBoB. Package: libjack-jackd2-dev Architecture: any Section: libdevel Multi-Arch: same Depends: libjack-jackd2-0 (= ${binary:Version}), ${asound:Depends}, ${misc:Depends}, ${shlibs:Depends}, pkg-config, libdbus-1-dev Conflicts: libjack0.100.0-dev (<< 0.102.20-2), libjack-dev Provides: libjack0.100.0-dev, libjack-dev-session, libjack-dev Replaces: libjack0.71.2-0 (<< 0.75.0-1) Description: JACK Audio Connection Kit (development files) JACK is a low-latency sound server, allowing multiple applications to connect to one audio device, and to share audio between themselves. . This package contains files needed for the development of JACK applications and an API reference. debian/TODO.Debian0000644000000000000000000000016312115643311011034 0ustar * Maybe start jackd as an init.d service. * Verify that optionally marked symbols are not part of library ABI. debian/bash_completion.d/0000755000000000000000000000000012115643311012553 5ustar debian/bash_completion.d/jackd0000644000000000000000000000541512115643311013557 0ustar #-*- mode: shell-script;-*- # Inputs: # $1 -- name of the command whose arguments are being completed # $2 -- word being completed # $3 -- word preceding the word being completed # $COMP_LINE -- current command line # $COMP_PONT -- cursor position # $COMP_WORDS -- array containing individual words in the current # command line # $COMP_CWORD -- index into ${COMP_WORDS} of the word containing the # current cursor position # Output: # COMPREPLY array variable contains possible completions # Syntax: # jack_connect # jack_disconnect # jackd [options] -d backend [backend-parameters] # jackstart [options] -d backend [backend-parameters] # Bugs/Todo: # jack_{dis,}connect should support for spaces in port names # restrict jack_disconnect completions to existing connections # Bugreports: Paul Brossier have jack_connect && _jack_lsp_type() { jack_lsp -p | grep -B1 $1 \ | grep -v 'properties.*,$' | grep -v ^-- \ | sed 's/\([\/ :]\)/\\\1/g' # | sed 's/\([\\: ]\)/\\\1/g' # | sed 's/\(.*\)/"\1"/g' } have jackd && _jackd_driver_help() { jackd -d $1 --help 2> /dev/null | grep - \ | sed 's/-\(.*\), --\([^\ .]*\) *\(.*\)/-\1 --\2/' } have jack_connect && _jack_connections() { local cur prev output IFS=$'\n' COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} # check if this is the first argument if [[ "$1" == "$prev" ]]; then COMPREPLY=( $( compgen -W "$(_jack_lsp_type output)" -- $cur ) ) else COMPREPLY=( $( compgen -W "$(_jack_lsp_type input)" -- $cur ) ) fi return 0 } have jackd && _jackd() { local cur prev special COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} # check if backend was specified for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do if [[ ${COMP_WORDS[i]} == @(alsa|dummy|oss|coreaudio|portaudio) ]]; then special=${COMP_WORDS[i]} fi done # list backends if [[ "$prev" == -d || "$prev" == --driver ]]; then COMPREPLY=( $( compgen -W 'alsa dummy oss coreaudio portaudio' -- $cur ) ) # list backend specific options elif [ -n "$special" ]; then COMPREPLY=( $( compgen -W '`_jackd_driver_help $special` --help' -- $cur ) ) # list common options else COMPREPLY=( $( compgen -W '--help -h \ --driver -d \ --realtime -R \ --realtime-priority -P \ --name -n \ --no-mlock -m \ --unlock -u \ --timeout -t \ --port-max -p \ --verbose -v \ --silent -s \ --version -V' -- $cur ) ) fi return 0 } [ "$have" ] && complete -F _jack_connections $filenames jack_connect [ "$have" ] && complete -F _jack_connections $filenames jack_disconnect [ "$have" ] && complete -F _jackd $filenames jackd [ "$have" ] && complete -F _jackd $filenames jackstart debian/rules0000755000000000000000000000732112115643344010254 0ustar #!/usr/bin/make -f -include /usr/share/cdbs/1/rules/upstream-tarball.mk -include /usr/share/cdbs/1/rules/utils.mk include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/makefile.mk # suppress optional build-dependencies CDBS_BUILD_DEPENDS_rules_upstream-tarball = CDBS_BUILD_DEPENDS_rules_utils_copyright-check = # Explicitly require these versions until cdbs knows about multiarch CDBS_BUILD_DEPENDS += , cdbs (>= 0.4.93~),\ debhelper (>= 8.1.3) CDBS_BUILD_DEPENDS_rules_debhelper_buildinfo = # Set tag to full 40 char git tag for git snapshot release tag = $(DEB_UPSTREAM_TARBALL_VERSION) DEB_UPSTREAM_URL = https://github.com/jackaudio/jack2/archive DEB_UPSTREAM_TARBALL_BASENAME = $(tag) DEB_UPSTREAM_TARBALL_SRCDIR = jack2-$(tag) # unneeded and possibly sourceless binaries DEB_UPSTREAM_REPACKAGE_EXCLUDES += *.a *.dll *.Lib # unneeded sources copyright-protected without licence DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./windows/**.rc # pure garbage in upstream tarball DEB_UPSTREAM_REPACKAGE_EXCLUDES += .DS_Store # sources not in prefered form of modification DEB_UPSTREAM_REPACKAGE_EXCLUDES += ./waf # Minimum assured version referenced upstream as library API/ABI ABI = 0.118.0 # Let's try to cut down noisy symbols to the official API CFLAGS += -fvisibility=hidden CXXFLAGS += -fvisibility=hidden waf-configure-options = --prefix=/usr --classic waf-configure-options += --libdir=/usr/lib/$(DEB_HOST_MULTIARCH) waf-configure-options += $(if $(filter linux,$(DEB_HOST_ARCH_OS)),--alsa --dbus) waf-configure-options += $(if $(filter amd64 i386 powerpc,$(DEB_HOST_ARCH)),--firewire) DEB_MAKE_INVOKE = ./waf-light -v --destdir=$(CURDIR)/debian/tmp DEB_MAKE_INSTALL_TARGET = install # TODO: use distclean and drop related clean target, when (or if) # upstream stop shipping waf dir DEB_MAKE_CLEAN_TARGET = clean clean:: rm -f .lock-wscript .lock-waf_linux2_build find waflib -name "*.pyc" -delete || true rm -f man/*.1 rm -rf build DEB_DH_MAKESHLIBS_ARGS = -Xintime -Xinprocess -Xjack_alsa -Xjack_oss -Xjack_dummy -Xjack_firewire # too noisy symbols, so only watch disappearing ones for now DEB_DH_MAKESHLIBS_ARGS += -- -c1 # Generate (and cleanup) files containing variables static per build infiles = $(filter-out debian/control.in, $(wildcard debian/*.in)) outfiles = $(basename $(infiles)) DEB_PHONY_RULES += $(outfiles) pre-build:: $(outfiles) $(outfiles): update-config debian/stamp-copyright-check sed 's/__ABI__/$(ABI)/' <$@.in >$@ clean:: rm -f $(outfiles) common-configure-arch common-configure-indep:: common-configure-impl common-configure-impl:: debian/stamp-waf-configure debian/stamp-waf-configure: chmod +x ./waf-light ./waf-light configure $(waf-configure-options) touch $@ clean:: rm -f debian/stamp-waf-configure install/jackd2:: ifeq ($(DEB_HOST_ARCH_OS),linux) dh_install -pjackd2 debian/tmp/usr/bin/alsa_in dh_install -pjackd2 debian/tmp/usr/bin/alsa_out dh_install -pjackd2 debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/jack/jack_alsa.so dh_install -pjackd2 debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/jack/jack_alsarawmidi.so dh_install -pjackd2 debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/jack/audioadapter.so dh_install -pjackd2 debian/tmp/usr/share/dbus-1/* endif binary-install/jackd2:: dh_python2 -pjackd2 # TODO: drop libstdc++6 override when bug#374049 closed in stable binary-post-install/libjack0:: d-devlibdeps \ --override s/libjackserver0-dev// \ --override s/libffado2-dev/libffado-dev/ \ --override s/libcelt0-0-dev/libcelt-dev/ \ --override s/libstdc++6-4.1-dev// \ debian/libjack-dev.substvars \ debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/*.so \ debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/jack/*.so #common-binary-post-install-arch:: # ln -s jackdmp debian/jackdmp/usr/bin/jackd debian/copyright_hints0000644000000000000000000007033412115643311012332 0ustar Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: FIXME Upstream-Contact: FIXME Source: FIXME Disclaimer: Autogenerated by CDBS Files: ChangeLog README README_NETJACK2 TODO common/wscript config.h.in dbus/org.jackaudio.service.in dbus/sigsegv.h dbus/wscript debian/TODO.Debian debian/asound.rc debian/audio.conf debian/bash_completion.d/jackd debian/compat debian/control debian/control.in debian/gbp.conf debian/jackd2-firewire.install debian/jackd2.config debian/jackd2.docs debian/jackd2.examples debian/jackd2.install debian/jackd2.manpages debian/jackd2.postinst debian/jackd2.postrm debian/jackd2.templates debian/libjack-jackd2-0.install debian/libjack-jackd2-0.lintian-overrides debian/libjack-jackd2-0.shlibs debian/libjack-jackd2-dev.README debian/libjack-jackd2-dev.install debian/libjack0.lintian-overrides debian/libjack0.symbols debian/patches/README debian/patches/no-selfconnect.patch debian/patches/series debian/po/POTFILES.in debian/rules debian/source/format debian/symbols-common.in debian/symbols-libjack.in debian/symbols-libjackserver.in debian/watch doxyfile example-clients/control.c example-clients/cpu_load.c example-clients/inprocess.c example-clients/jack_control example-clients/latent_client.c example-clients/midi_dump.c example-clients/simple_client.c example-clients/simple_session_client.c example-clients/thru_client.c example-clients/tw.c example-clients/wscript jack.pc.in linux/alsarawmidi/JackALSARawMidiUtil.cpp linux/wscript macosx/Jack-Info.plist macosx/Jackdmp.xcodeproj/project.pbxproj macosx/install_jackdmp macosx/iphone/Info.plist macosx/iphone/MainWindow.xib macosx/iphone/audio_thru.mm macosx/iphone/iPhoneNet.xcodeproj/project.pbxproj macosx/iphone/iPhoneNet_Prefix.pch macosx/remove_jackdmp macosx/wscript man/alsa_in.0 man/alsa_out.0 man/fill_template man/jack_bufsize.0 man/jack_connect.0 man/jack_disconnect.0 man/jack_freewheel.0 man/jack_impulse_grabber.0 man/jack_iodelay.0 man/jack_load.0 man/jack_lsp.0 man/jack_metro.0 man/jack_monitor_client.0 man/jack_netsource.0 man/jack_samplerate.0 man/jack_showtime.0 man/jack_simple_client.0 man/jack_transport.0 man/jack_unload.0 man/jack_wait.0 man/jackd.0 man/jackrec.0 man/wscript solaris/wscript svnversion_regenerate.sh tests/wscript waflib/Build.py waflib/ConfigSet.py waflib/Configure.py waflib/Context.py waflib/Errors.py waflib/Logs.py waflib/Node.py waflib/Options.py waflib/Runner.py waflib/Scripting.py waflib/Task.py waflib/TaskGen.py waflib/Tools/__init__.py waflib/Tools/ar.py waflib/Tools/asm.py waflib/Tools/bison.py waflib/Tools/c.py waflib/Tools/c_aliases.py waflib/Tools/c_config.py waflib/Tools/c_osx.py waflib/Tools/c_preproc.py waflib/Tools/c_tests.py waflib/Tools/ccroot.py waflib/Tools/compiler_c.py waflib/Tools/compiler_cxx.py waflib/Tools/compiler_d.py waflib/Tools/compiler_fc.py waflib/Tools/cs.py waflib/Tools/cxx.py waflib/Tools/d.py waflib/Tools/d_config.py waflib/Tools/d_scan.py waflib/Tools/dbus.py waflib/Tools/dmd.py waflib/Tools/errcheck.py waflib/Tools/fc.py waflib/Tools/fc_config.py waflib/Tools/fc_scan.py waflib/Tools/flex.py waflib/Tools/g95.py waflib/Tools/gas.py waflib/Tools/gcc.py waflib/Tools/gdc.py waflib/Tools/gfortran.py waflib/Tools/glib2.py waflib/Tools/gnu_dirs.py waflib/Tools/gxx.py waflib/Tools/icc.py waflib/Tools/icpc.py waflib/Tools/ifort.py waflib/Tools/intltool.py waflib/Tools/irixcc.py waflib/Tools/javaw.py waflib/Tools/kde4.py waflib/Tools/lua.py waflib/Tools/msvc.py waflib/Tools/nasm.py waflib/Tools/perl.py waflib/Tools/python.py waflib/Tools/qt4.py waflib/Tools/ruby.py waflib/Tools/suncc.py waflib/Tools/suncxx.py waflib/Tools/tex.py waflib/Tools/vala.py waflib/Tools/waf_unit_test.py waflib/Tools/winres.py waflib/Tools/xlc.py waflib/Tools/xlcxx.py waflib/Utils.py waflib/__init__.py waflib/ansiterm.py waflib/extras/__init__.py waflib/extras/compat15.py waflib/fixpy2.py windows/JackRouter/JackRouter.def windows/JackRouter/JackRouter.dsp windows/JackRouter/JackRouter.dsw windows/JackRouter/JackRouter.vcxproj windows/JackRouter/JackRouter.vcxproj.filters windows/JackRouter/JackRouter.vcxproj.user windows/JackRouter/README windows/JackRouter/profport.h windows/JackRouter/psapi.h windows/JackRouter/resource.h windows/README windows/Setup/README windows/Setup/jack.ci windows/Setup/jack64.ci windows/Setup/src/32bits/JackRouter.ini windows/Setup/src/64bits/JackRouter.ini windows/Setup/src/README windows/Setup/src/jack.ico windows/Setup/src/logo_installer.bmp windows/jack_audioadapter.cbp windows/jack_connect.cbp windows/jack_disconnect.cbp windows/jack_dummy.cbp windows/jack_latent_client.cbp windows/jack_load.cbp windows/jack_loopback.cbp windows/jack_lsp.cbp windows/jack_metro.cbp windows/jack_midi_dump.cbp windows/jack_midi_latency_test.cbp windows/jack_netadapter.cbp windows/jack_netdriver.cbp windows/jack_netmanager.cbp windows/jack_netonedriver.cbp windows/jack_netsource.cbp windows/jack_portaudio.cbp windows/jack_test.cbp windows/jack_unload.cbp windows/jack_winmme.cbp windows/jackd.cbp windows/jackd.workspace windows/libjack.cbp windows/libjacknet.cbp windows/libjackserver.cbp windows/multiple_metro.cbp windows/resource.h windows/resource_vc.h wscript Copyright: *No copyright* License: UNKNOWN FIXME Files: common/JackActivationCount.cpp common/JackActivationCount.h common/JackArgParser.cpp common/JackArgParser.h common/JackAtomic.h common/JackAtomicArrayState.h common/JackAtomicState.h common/JackChannel.h common/JackConnectionManager.cpp common/JackConnectionManager.h common/JackDebugClient.cpp common/JackDebugClient.h common/JackGenericClientChannel.cpp common/JackGenericClientChannel.h common/JackGlobals.cpp common/JackGlobals.h common/JackLibClient.cpp common/JackLibClient.h common/JackLibGlobals.h common/JackMutex.h common/JackNetAPI.cpp common/JackNotification.h common/JackPlatformPlug.h common/JackRequestDecoder.cpp common/JackRequestDecoder.h common/JackShmMem.cpp common/JackShmMem.h common/JackSynchro.h common/JackTools.cpp common/JackTools.h common/jack/net.h common/jack/systemdeps.h linux/JackAtomic_os.h linux/JackPlatformPlug_os.h macosx/JackAtomic_os.h macosx/JackMachSemaphore.cpp macosx/JackMachSemaphore.h macosx/JackPlatformPlug_os.h posix/JackFifo.cpp posix/JackFifo.h posix/JackPosixMutex.cpp posix/JackPosixMutex.h posix/JackPosixProcessSync.cpp posix/JackPosixProcessSync.h posix/JackPosixSemaphore.cpp posix/JackPosixSemaphore.h posix/JackSocket.cpp posix/JackSocket.h posix/JackSocketClientChannel.cpp posix/JackSocketClientChannel.h posix/JackSocketNotifyChannel.cpp posix/JackSocketNotifyChannel.h posix/JackSocketServerChannel.cpp posix/JackSocketServerChannel.h posix/JackSocketServerNotifyChannel.cpp posix/JackSocketServerNotifyChannel.h solaris/JackAtomic_os.h solaris/JackPlatformPlug_os.h windows/JackAtomic_os.h windows/JackCompilerDeps_os.h windows/JackMMCSS.cpp windows/JackMMCSS.h windows/JackNetWinSocket.cpp windows/JackNetWinSocket.h windows/JackPlatformPlug_os.h windows/JackShmMem_os.h windows/JackSystemDeps_os.h windows/JackTypes_os.h windows/JackWinEvent.cpp windows/JackWinEvent.h windows/JackWinMutex.cpp windows/JackWinMutex.h windows/JackWinNamedPipe.cpp windows/JackWinNamedPipe.h windows/JackWinNamedPipeClientChannel.cpp windows/JackWinNamedPipeClientChannel.h windows/JackWinNamedPipeNotifyChannel.cpp windows/JackWinNamedPipeNotifyChannel.h windows/JackWinNamedPipeServerChannel.cpp windows/JackWinNamedPipeServerChannel.h windows/JackWinNamedPipeServerNotifyChannel.h windows/JackWinProcessSync.cpp windows/JackWinProcessSync.h windows/JackWinSemaphore.cpp windows/JackWinSemaphore.h windows/JackWinThread.cpp windows/JackWinThread.h windows/JackWinTime.c Copyright: 2004-2008, Grame 2004-2012, Grame 2005, Grame 2006, Grame 2006-2008, Grame 2007, Grame 2009-2010, Grame 2009-2011, Grame 2012, Grame License: LGPL-2.1+ FIXME Files: common/JackAudioAdapter.cpp common/JackAudioAdapter.h common/JackAudioAdapterFactory.cpp common/JackAudioAdapterInterface.cpp common/JackAudioAdapterInterface.h common/JackCompilerDeps.h common/JackConstants.h common/JackEngine.cpp common/JackEngine.h common/JackException.cpp common/JackException.h common/JackFilters.h common/JackInternalClientChannel.h common/JackLibSampleRateResampler.cpp common/JackLibSampleRateResampler.h common/JackLockedEngine.h common/JackMidiDriver.h common/JackProfiler.cpp common/JackProfiler.h common/JackResampler.cpp common/JackResampler.h common/JackServerGlobals.cpp common/JackServerGlobals.h common/JackSystemDeps.h example-clients/netmaster.c example-clients/netslave.c example-clients/server_control.cpp linux/alsa/JackAlsaAdapter.cpp linux/alsa/JackAlsaAdapter.h macosx/JackCompilerDeps_os.h macosx/coreaudio/JackCoreAudioAdapter.cpp macosx/coreaudio/JackCoreAudioAdapter.h macosx/coreaudio/JackCoreAudioDriver.cpp macosx/coreaudio/JackCoreAudioDriver.h macosx/coreaudio/TiPhoneCoreAudioRenderer.cpp macosx/coreaudio/TiPhoneCoreAudioRenderer.h posix/JackCompilerDeps_os.h posix/JackSystemDeps_os.h solaris/oss/JackBoomerDriver.cpp solaris/oss/JackBoomerDriver.h tests/testAtomic.cpp tests/testMutex.cpp tests/testSem.cpp tests/testSynchroClient.cpp tests/testSynchroServer.cpp tests/testSynchroServerClient.cpp tests/testThread.cpp windows/JackWinNamedPipeServerNotifyChannel.cpp windows/portaudio/JackPortAudioAdapter.cpp windows/portaudio/JackPortAudioAdapter.h windows/portaudio/JackPortAudioDriver.cpp windows/portaudio/JackPortAudioDriver.h Copyright: 2004-2005, Grame 2004-2006, Grame 2004-2008, Grame 2005, Grame 2008, Grame 2008-2012, Grame 2009, Grame 2010, Grame License: GPL-2+ FIXME Files: linux/alsarawmidi/JackALSARawMidiDriver.cpp linux/alsarawmidi/JackALSARawMidiDriver.h linux/alsarawmidi/JackALSARawMidiInputPort.cpp linux/alsarawmidi/JackALSARawMidiInputPort.h linux/alsarawmidi/JackALSARawMidiOutputPort.cpp linux/alsarawmidi/JackALSARawMidiOutputPort.h linux/alsarawmidi/JackALSARawMidiPort.cpp linux/alsarawmidi/JackALSARawMidiPort.h linux/alsarawmidi/JackALSARawMidiReceiveQueue.cpp linux/alsarawmidi/JackALSARawMidiReceiveQueue.h linux/alsarawmidi/JackALSARawMidiSendQueue.cpp linux/alsarawmidi/JackALSARawMidiSendQueue.h linux/alsarawmidi/JackALSARawMidiUtil.h macosx/coremidi/JackCoreMidiInputPort.cpp macosx/coremidi/JackCoreMidiInputPort.h macosx/coremidi/JackCoreMidiOutputPort.cpp macosx/coremidi/JackCoreMidiOutputPort.h macosx/coremidi/JackCoreMidiPhysicalInputPort.cpp macosx/coremidi/JackCoreMidiPhysicalInputPort.h macosx/coremidi/JackCoreMidiPhysicalOutputPort.cpp macosx/coremidi/JackCoreMidiPhysicalOutputPort.h macosx/coremidi/JackCoreMidiPort.cpp macosx/coremidi/JackCoreMidiPort.h macosx/coremidi/JackCoreMidiUtil.cpp macosx/coremidi/JackCoreMidiUtil.h macosx/coremidi/JackCoreMidiVirtualInputPort.cpp macosx/coremidi/JackCoreMidiVirtualInputPort.h macosx/coremidi/JackCoreMidiVirtualOutputPort.cpp macosx/coremidi/JackCoreMidiVirtualOutputPort.h windows/winmme/JackWinMMEInputPort.cpp windows/winmme/JackWinMMEInputPort.h windows/winmme/JackWinMMEOutputPort.cpp windows/winmme/JackWinMMEOutputPort.h windows/winmme/JackWinMMEPort.cpp windows/winmme/JackWinMMEPort.h Copyright: 2011, Devin Anderson License: GPL-2+ FIXME Files: common/JackMidiAsyncQueue.cpp common/JackMidiAsyncQueue.h common/JackMidiAsyncWaitQueue.cpp common/JackMidiAsyncWaitQueue.h common/JackMidiBufferReadQueue.cpp common/JackMidiBufferReadQueue.h common/JackMidiBufferWriteQueue.cpp common/JackMidiBufferWriteQueue.h common/JackMidiRawInputWriteQueue.cpp common/JackMidiRawInputWriteQueue.h common/JackMidiRawOutputWriteQueue.cpp common/JackMidiRawOutputWriteQueue.h common/JackMidiReadQueue.cpp common/JackMidiReadQueue.h common/JackMidiReceiveQueue.cpp common/JackMidiReceiveQueue.h common/JackMidiSendQueue.cpp common/JackMidiSendQueue.h common/JackMidiUtil.cpp common/JackMidiUtil.h common/JackMidiWriteQueue.cpp common/JackMidiWriteQueue.h example-clients/midi_latency_test.c linux/firewire/JackFFADOMidiInputPort.cpp linux/firewire/JackFFADOMidiInputPort.h linux/firewire/JackFFADOMidiOutputPort.cpp linux/firewire/JackFFADOMidiOutputPort.h linux/firewire/JackFFADOMidiReceiveQueue.cpp linux/firewire/JackFFADOMidiReceiveQueue.h linux/firewire/JackFFADOMidiSendQueue.cpp linux/firewire/JackFFADOMidiSendQueue.h Copyright: 2010, Devin Anderson License: LGPL-2.1+ FIXME Files: common/JackAudioDriver.h common/JackDriver.cpp common/JackDriver.h common/JackDriverInfo.h common/JackDriverLoader.cpp common/JackDriverLoader.h common/JackDummyDriver.cpp common/JackDummyDriver.h common/JackExternalClient.cpp common/JackExternalClient.h common/JackFreewheelDriver.cpp common/JackFreewheelDriver.h common/JackInternalClient.cpp common/JackInternalClient.h common/JackLoopbackDriver.cpp common/JackLoopbackDriver.h common/JackRestartThreadedDriver.cpp common/JackRestartThreadedDriver.h common/JackServer.cpp common/JackServer.h common/JackServerAPI.cpp common/JackThreadedDriver.cpp common/JackThreadedDriver.h common/JackTimedDriver.cpp common/JackTimedDriver.h common/JackWaitThreadedDriver.cpp common/JackWaitThreadedDriver.h linux/alsa/JackAlsaDriver.cpp linux/alsa/JackAlsaDriver.h posix/JackShmMem_os.h Copyright: 2001, Paul Davis 2001-2003, Paul Davis 2001-2005, Paul Davis 2004, Grame 2004-2008, Grame License: GPL-2+ FIXME Files: common/JackAPI.cpp common/JackAudioPort.cpp common/JackClient.cpp common/JackClient.h common/JackClientControl.h common/JackClientInterface.h common/JackEngineControl.cpp common/JackEngineControl.h common/JackFrameTimer.cpp common/JackFrameTimer.h common/JackGraphManager.cpp common/JackGraphManager.h common/JackLibAPI.cpp common/JackPort.cpp common/JackPort.h common/JackRequest.h common/JackServerLaunch.h common/JackThread.h common/JackTime.h common/JackTransportEngine.cpp common/JackTransportEngine.h common/shm.c common/shm.h macosx/JackMachThread.cpp macosx/JackMachTime.c posix/JackPosixServerLaunch.cpp posix/JackPosixThread.cpp posix/JackPosixThread.h solaris/JackSolarisTime.c Copyright: 2001, Paul Davis 2001-2003, Paul Davis 2003, Paul Davis 2004-2006, Grame 2004-2008, Grame 2005-2012, Grame License: LGPL-2.1+ FIXME Files: common/JackNetAdapter.cpp common/JackNetAdapter.h common/JackNetDriver.cpp common/JackNetDriver.h common/JackNetInterface.cpp common/JackNetInterface.h common/JackNetManager.cpp common/JackNetManager.h common/JackNetSocket.h common/JackNetTool.cpp common/JackNetTool.h posix/JackNetUnixSocket.cpp posix/JackNetUnixSocket.h windows/portaudio/JackPortAudioDevices.cpp windows/portaudio/JackPortAudioDevices.h Copyright: 2008-2011, Romain Moret at Grame License: GPL-2+ FIXME Files: common/memops.c common/memops.h example-clients/evmon.c example-clients/freewheel.c linux/alsa/alsa_driver.c linux/alsa/alsa_driver.h linux/alsa/generic.h linux/alsa/generic_hw.c linux/alsa/hammerfall.c linux/alsa/hammerfall.h linux/alsa/hardware.h linux/alsa/hdsp.h linux/cycles.h linux/driver.h Copyright: 1999-2000, Paul Davis 2000, Paul Davis 2001, Paul Davis 2003, Paul Davis 2007, Paul Davis License: GPL-2+ FIXME Files: dbus/controller.h dbus/controller_iface_session_manager.c dbus/params.c dbus/params.h dbus/xml.c dbus/xml.h dbus/xml_expat.c dbus/xml_nop.c dbus/xml_write_raw.c Copyright: 2007, Nedko Arnaudov 2007-2008, Nedko Arnaudov 2007-2008,2011, Nedko Arnaudov 2011, Nedko Arnaudov License: GPL FIXME Files: common/JackTypes.h common/jack/thread.h common/jack/weakjack.h common/jack/weakmacros.h common/timestamps.c common/timestamps.h example-clients/internal_metro.h posix/JackTypes_os.h tests/external_metro.h Copyright: 2001, Paul Davis 2002, Paul Davis 2002-2003, Paul Davis 2004, Paul Davis 2010, Paul Davis License: LGPL-2.1+ FIXME Files: dbus/controller.c dbus/controller_iface_configure.c dbus/controller_iface_control.c dbus/controller_iface_introspectable.c dbus/controller_iface_patchbay.c dbus/controller_iface_transport.c dbus/controller_internal.h Copyright: 2007-2008, Juuso Alasuutari 2007-2008, Nedko Arnaudov 2007-2008,2010, Nedko Arnaudov 2007-2008,2010-2011, Nedko Arnaudov 2007-2008,2011, Nedko Arnaudov 2008, Juuso Alasuutari 2008, Nedko Arnaudov License: GPL FIXME Files: linux/alsa/alsa_midi.h linux/alsa/alsa_midi_impl.h linux/alsa/alsa_rawmidi.c linux/alsa/midi_pack.h linux/alsa/midi_unpack.h Copyright: 2006, Dmitry S. Baikov 2006-2007, Dmitry S. Baikov 2007, Dmitry S. Baikov License: GPL-2+ FIXME Files: macosx/coremidi/JackCoreMidiDriver.cpp macosx/coremidi/JackCoreMidiDriver.h windows/winmme/JackWinMMEDriver.cpp windows/winmme/JackWinMMEDriver.h Copyright: 2009, Grame 2011, Devin Anderson License: GPL-2+ FIXME Files: example-clients/bufsize.c example-clients/samplerate.c example-clients/transport.c linux/alsa/bitset.h Copyright: 2003, Jack O'Quin 2005, Jack O'Quin License: GPL-2+ FIXME Files: macosx/iphone/iPhoneNetAppDelegate.h macosx/iphone/iPhoneNetAppDelegate.m macosx/iphone/main_master.mm macosx/iphone/main_slave.mm Copyright: Grame 2009. License: UNKNOWN FIXME Files: common/JackMidiDriver.cpp dbus/audio_reserve.c dbus/audio_reserve.h Copyright: 2009, Grame License: GPL FIXME Files: example-clients/alias.c example-clients/ipload.c example-clients/lsp.c Copyright: License: GPL-2+ FIXME Files: example-clients/ipunload.c example-clients/monitor_client.c example-clients/showtime.c Copyright: *No copyright* License: GPL-2+ FIXME Files: common/JackMidiAPI.cpp common/JackMidiPort.cpp common/JackMidiPort.h Copyright: 2004, Ian Esten 2007, Dmitry Baikov License: LGPL-2.1+ FIXME Files: common/jack/jack.h common/jack/transport.h common/jack/types.h Copyright: 2001, Paul Davis 2002, Paul Davis 2003, Jack O'Quin 2004, Jack O'Quin License: LGPL-2.1+ FIXME Files: example-clients/alsa_in.c example-clients/alsa_out.c example-clients/wait.c Copyright: License: UNKNOWN FIXME Files: debian/po/ko.po debian/po/ru.po debian/po/templates.pot Copyright: YEAR THE PACKAGE'S HOLDER License: UNKNOWN FIXME Files: debian/patches/waf.patch waf-light Copyright: *No copyright* License: BSD-3-clause FIXME Files: windows/JackRouter/JackRouter.cpp windows/JackRouter/JackRouter.h Copyright: 2006-2011, Grame HOLDERS BE LIABLE FOR License: Expat FIXME Files: dbus/reserve.c dbus/reserve.h Copyright: 2009, Lennart Poettering HOLDERS License: Expat FIXME Files: windows/portaudio/pa_asio.h windows/portaudio/portaudio.h Copyright: 1999-2000, Ross Bencina and Phil Burk 1999-2002, Ross Bencina and Phil Burk HOLDERS BE LIABLE FOR License: Expat FIXME Files: dbus/jackdbus.c dbus/jackdbus.h Copyright: 2007-2008, Juuso Alasuutari 2007-2008, Nedko Arnaudov 2007-2008,2010, Nedko Arnaudov 2008, Marc-Olivier Barre License: GPL FIXME Files: common/JackControlAPI.cpp common/JackControlAPI.h Copyright: 2008, Grame 2008, Nedko Arnaudov License: GPL-2 FIXME Files: example-clients/metro.c tests/external_metro.cpp Copyright: 2002, Anthony Van Groningen License: GPL-2+ FIXME Files: linux/alsa/ice1712.c linux/alsa/ice1712.h Copyright: 2000, Jaroslav Kysela 2002, Anthony Van Groningen License: GPL-2+ FIXME Files: linux/alsa/alsa_midi_jackmp.cpp linux/alsa/alsa_seqmidi.c Copyright: 2006-2007, Dmitry S. Baikov License: GPL-2+ FIXME Files: common/JackAC3Encoder.cpp common/JackAC3Encoder.h Copyright: 2006, Jesse Chappell (AC3Jack) 2012, Grame License: GPL-2+ FIXME Files: linux/freebob/JackFreebobDriver.cpp linux/freebob/JackFreebobDriver.h Copyright: 2001, Paul Davis 2004, Grame 2007, Pieter Palmers License: GPL-2+ FIXME Files: solaris/oss/JackOSSAdapter.cpp solaris/oss/JackOSSAdapter.h Copyright: 2008, Grame & RTL 2008 License: GPL-2+ FIXME Files: solaris/oss/JackOSSDriver.cpp solaris/oss/JackOSSDriver.h Copyright: 2003-2007, Jussi Laako 2008, Grame & RTL 2008 License: GPL-2+ FIXME Files: example-clients/midiseq.c example-clients/midisine.c Copyright: 2004, Ian Esten License: GPL-2+ FIXME Files: example-clients/connect.c example-clients/zombie.c Copyright: 2002, Jeremy Hall License: GPL-2+ FIXME Files: linux/alsa/usx2y.c linux/alsa/usx2y.h Copyright: 2001, Paul Davis 2004, Karsten Wiese, Rui Nuno Capela 2005, Karsten Wiese, Rui Nuno Capela License: GPL-2+ FIXME Files: common/netjack_packet.c example-clients/netsource.c Copyright: 2006, Torben Hohn 2008, Marc-Olivier Barre 2008, Pieter Palmers License: GPL-2+ FIXME Files: common/JackNetOneDriver.cpp common/JackNetOneDriver.h Copyright: 2008-2011, Torben Horn License: GPL-2+ FIXME Files: windows/getopt.c windows/getopt1.c Copyright: 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 1987,88,89,90,91,92,93,94,96,97,98 License: LGPL-2+ FIXME Files: common/JackPortType.cpp common/JackPortType.h Copyright: 2007, Dmitry Baikov License: LGPL-2.1+ FIXME Files: common/JackError.cpp common/JackError.h Copyright: 2001, Paul Davis 2004-2008, Grame 2008, Nedko Arnaudov License: LGPL-2.1+ FIXME Files: common/JackMessageBuffer.cpp common/JackMessageBuffer.h Copyright: 2004, Rui Nuno Capela, Steve Harris 2008, Grame 2008, Nedko Arnaudov License: LGPL-2.1+ FIXME Files: common/JackEngineProfiling.cpp common/JackEngineProfiling.h Copyright: 2008, Grame & RTL License: LGPL-2.1+ FIXME Files: common/jack/intclient.h common/varargs.h Copyright: 2004, Jack O'Quin License: LGPL-2.1+ FIXME Files: common/JackSession.h common/jack/session.h Copyright: 2001, Paul Davis 2004, Jack O'Quin 2010, Torben Hohn License: LGPL-2.1+ FIXME Files: common/jack/jslist.h linux/alsa/jslist.h Copyright: 2002, Kai Vehmanen License: LGPL-2.1+ FIXME Files: common/jack/ringbuffer.h common/ringbuffer.c Copyright: 2000, Paul Davis 2003, Rohan Drape License: LGPL-2.1+ FIXME Files: debian/po/fi.po debian/po/sv.po Copyright: 2009 License: UNKNOWN FIXME Files: macosx/iphone/freeverb.mm macosx/iphone/iphone-faust.mm Copyright: "GRAME 2006" License: UNKNOWN FIXME Files: common/JackAudioDriver.cpp Copyright: 2001, Paul Davis 2004-2008, Grame License: GPL FIXME Files: windows/Setup/src/gpl_installer.rtf Copyright: 2001, Paul Davis\par 2004-2011, Grame\par License: GPL FIXME Files: common/jack/control.h Copyright: 2008, GRAME 2008, Nedko Arnaudov License: GPL-2 FIXME Files: dbus/list.h Copyright: holders of this code are unknown, they were not License: GPL-2 FIXME Files: linux/firewire/JackFFADODriver.h Copyright: 2001, Paul Davis 2004, Grame 2007, Pieter Palmers 2012, Adrian Knoth License: GPL-2+ FIXME Files: example-clients/internal_metro.cpp Copyright: 2002, Anthony Van Groningen 2005, Grame License: GPL-2+ FIXME Files: linux/alsa/hdsp.c Copyright: 2001, Paul Davis 2002, Dave LaRose License: GPL-2+ FIXME Files: linux/firewire/JackFFADODriver.cpp Copyright: 2001, Paul Davis 2004, Grame 2007, Pieter Palmers 2009, Devin Anderson 2012, Jonathan Woithe, Adrian Knoth License: GPL-2+ FIXME Files: linux/firewire/ffado_driver.h Copyright: 2005-2007, Pieter Palmers 2009, Devin Anderson License: GPL-2+ FIXME Files: windows/samplerate.h Copyright: 2002-2008, Erik de Castro Lopo License: GPL-2+ FIXME Files: debian/patches/alsa-portnames.patch Copyright: 2010, Florian Faber, faber@faberman.de License: GPL-2+ FIXME Files: tests/iodelay.cpp Copyright: 2003-2008, Fons Adriaensen License: GPL-2+ FIXME Files: common/Jackdmp.cpp Copyright: 2001, Paul Davis 2001-2005, Paul Davis and others.\n" 2004-2008, Grame 2004-2012, Grame.\n" License: GPL-2+ FIXME Files: tests/cpu.c Copyright: 2005, Samuel TRACOL 2008, Grame License: GPL-2+ FIXME Files: example-clients/capture_client.c Copyright: 2001, Paul Davis 2003, Jack O'Quin License: GPL-2+ FIXME Files: common/netjack.c Copyright: 2001, Paul Davis 2003, Robert Ham 2006, Torben Hohn 2008, Pieter Palmers License: GPL-2+ FIXME Files: linux/freebob/freebob_driver.h Copyright: 2005-2007, Pieter Palmers License: GPL-2+ FIXME Files: common/netjack.h Copyright: 2003, Robert Ham 2005, Torben Hohn License: GPL-2+ FIXME Files: tests/test.cpp Copyright: 2005, Samuel TRACOL for GRAME License: GPL-2+ FIXME Files: example-clients/impulse_grabber.c Copyright: 2001, Steve Harris License: GPL-2+ FIXME Files: example-clients/session_notify.c Copyright: 2010, Torben Hohn License: GPL-2+ FIXME Files: common/netjack_packet.h Copyright: 2006, Torben Hohn License: GPL-2+ FIXME Files: windows/Setup/src/COPYING Copyright: 2007, Free Software Foundation, Inc. HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS are not disclaimer" for the program, if necessary holder as a result of your choosing to follow a holder explicitly and holder is holder is reinstated (a) holder notifies you of the holder who authorizes use under this holder, and you cure the violation prior to 30 days after holders of if you do law law, except executing it on a on the Program, and are irrevocable provided the stated on the software, and (2) offer you this License permission permission, other than the making of an treaty adopted on 20 December 1996, or License: GPL-ever FIXME Files: windows/getopt.h Copyright: 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc License: LGPL-2+ FIXME Files: macosx/JackMachThread.h Copyright: 2001, Paul Davis 2002, Apple Computer, Inc. 2004-2008, Grame License: LGPL-2.1+ FIXME Files: common/driver_interface.h Copyright: 2003, Bob Ham 2008, Nedko Arnaudov License: LGPL-2.1+ FIXME Files: windows/JackWinServerLaunch.cpp Copyright: 2001-2003, Paul Davis 2004-2008, Grame 2011, John Emmas License: LGPL-2.1+ FIXME Files: linux/JackLinuxTime.c Copyright: 2001-2003, Paul Davis 2004-2008, Grame 2005, Jussi Laako License: LGPL-2.1+ FIXME Files: common/JackWeakAPI.c Copyright: 2002-2007, Werner Schweer and others 2009, Grame License: LGPL-2.1+ FIXME Files: common/jack/midiport.h Copyright: 2004, Ian Esten License: LGPL-2.1+ FIXME Files: common/jack/statistics.h Copyright: 2004, Rui Nuno Capela, Lee Revell License: LGPL-2.1+ FIXME Files: dbus/sigsegv.c Copyright: 2005, - 2008, Jaco Kroon License: Public domain FIXME Files: windows/JackRouter/profport.cpp Copyright: (isdigit || (c == '+') || (c == '-')) License: UNKNOWN FIXME Files: debian/po/gl.po Copyright: 2009, Debian admisíbel en ambientes multiusuario." License: UNKNOWN FIXME Files: debian/po/fr.po Copyright: 2009, Debian French l10n team en priorit temps rel, les dlais de latence seront " « realtime » et le " License: UNKNOWN FIXME Files: debian/po/ja.po Copyright: 2009, Debian Multimedia Maintainers License: UNKNOWN FIXME Files: debian/po/vi.po Copyright: 2009, Free Software Foundation, Inc License: UNKNOWN FIXME Files: debian/po/de.po Copyright: Helge Kreutzmann , 2009 License: UNKNOWN FIXME Files: debian/po/es.po Copyright: 2009, Software in the Public Interest License: UNKNOWN FIXME Files: debian/po/it.po Copyright: 2009, THE JACK-AUDIO-CONNECTION-KIT'S HOLDER License: UNKNOWN FIXME Files: debian/po/nl.po Copyright: 2011, THE PACKAGE'S HOLDER License: UNKNOWN FIXME Files: debian/po/pt_BR.po Copyright: 2010, THE jackd2'S HOLDER inaceitável em ambientes multi-usuário." License: UNKNOWN FIXME Files: macosx/iphone/icon.png Copyright: V ׋cP3Y1C< License: UNKNOWN FIXME Files: debian/po/cs.po Copyright: YEAR THE PACKAGE'S HOLDER paměti což je nepřípustn zejmna ve více-uživatelských prostředích." priority a memlock) pro skupinu audio." priority v /etc/security/limits.d?" priority, samozřejmě " License: UNKNOWN FIXME Files: debian/po/pt.po Copyright: 2009, the jack-audio-connection-kit's holder inaceitável em ambientes de multi-utilizador." License: UNKNOWN FIXME Files: debian/po/da.po Copyright: 2011, jackd2 & nedenstående oversættere License: UNKNOWN FIXME debian/audio.conf0000644000000000000000000000040612115643311011133 0ustar # Provided by the jackd package. # # Changes to this file will be preserved. # # If you want to enable/disable realtime permissions, run # # dpkg-reconfigure -p high jackd @audio - rtprio 95 @audio - memlock unlimited #@audio - nice -19 debian/source/0000755000000000000000000000000012115643311010463 5ustar debian/source/format0000644000000000000000000000001412115643311011671 0ustar 3.0 (quilt) debian/asound.rc0000644000000000000000000000075212115643311011006 0ustar # This is an example asoundrc file for a system where there's only one # soundcard. Note that the name "sblive" is arbitrary, you can call # your card whatever you like. # # Using this setup you can start jackd with "jackd -d alsa -d sblive" # # For more complex settings you should refer to the ALSA documentation: # # See http://www.alsa-project.org # http://alsa.opensrc.org # # Copy this file to ~/.asoundrc pcm.sblive { type hw card 0 } ctl.sblive { type hw card 0 } debian/README.source0000644000000000000000000000056312161270355011353 0ustar CDBS+git-buildpackage --------------------- This source package uses CDBS and git-buildpackage. NMUs need not (but are encouraged to) make special use of these tools. In particular, the debian/control.in file can be completely ignored. More info here: http://wiki.debian.org/CDBS+git-buildpackage -- Jonas Smedegaard Mon, 18 Feb 2013 12:55:37 +0100 debian/gbp.conf0000644000000000000000000000017112115643311010601 0ustar # Configuration file for git-buildpackage and friends [DEFAULT] pristine-tar = True sign-tags = True compression = gzip debian/libjack-jackd2-0.install0000644000000000000000000000006112115643311013440 0ustar usr/lib/*/libjack.so.* usr/lib/*/libjacknet.so.* debian/jackd2.manpages0000644000000000000000000000004012115643311012030 0ustar debian/tmp/usr/share/man/man1/* debian/watch0000644000000000000000000000032712115643311010216 0ustar # Run the "uscan" command to check for upstream updates and more. version=3 opts=uversionmangle=s/1\.90/1.9.0/,dversionmangle=s/\~dfsg.*// \ https://github.com/jackaudio/jack2/tags .*/archive/v?(\d[\d\.]+)\.tar\.gz debian/symbols-libjack.in0000644000000000000000000001220412115643311012577 0ustar jack_acquire_real_time_scheduling@Base __ABI__ jack_activate@Base __ABI__ jack_client_close@Base __ABI__ jack_client_create_thread@Base __ABI__ jack_client_max_real_time_priority@Base __ABI__ jack_client_name_size@Base __ABI__ jack_client_new@Base __ABI__ jack_client_open@Base __ABI__ jack_client_real_time_priority@Base __ABI__ jack_client_thread_id@Base __ABI__ jack_connect@Base __ABI__ jack_cpu_load@Base __ABI__ jack_cycle_signal@Base __ABI__ jack_cycle_wait@Base __ABI__ jack_deactivate@Base __ABI__ jack_disconnect@Base __ABI__ jack_drop_real_time_scheduling@Base __ABI__ jack_engine_takeover_timebase@Base __ABI__ jack_frames_since_cycle_start@Base __ABI__ jack_frames_to_time@Base __ABI__ jack_frame_time@Base __ABI__ jack_get_buffer_size@Base __ABI__ jack_get_client_name@Base __ABI__ jack_get_current_transport_frame@Base __ABI__ jack_get_internal_client_name@Base __ABI__ jack_get_max_delayed_usecs@Base __ABI__ jack_get_ports@Base __ABI__ jack_get_sample_rate@Base __ABI__ jack_get_time@Base __ABI__ jack_get_transport_info@Base __ABI__ jack_get_xrun_delayed_usecs@Base __ABI__ jack_internal_client_close@Base __ABI__ jack_internal_client_handle@Base __ABI__ jack_internal_client_load_aux@Base __ABI__ jack_internal_client_load@Base __ABI__ jack_internal_client_new@Base __ABI__ jack_internal_client_unload@Base __ABI__ jack_is_realtime@Base __ABI__ jack_last_frame_time@Base __ABI__ jack_midi_clear_buffer@Base __ABI__ jack_midi_event_get@Base __ABI__ jack_midi_event_reserve@Base __ABI__ jack_midi_event_write@Base __ABI__ jack_midi_get_event_count@Base __ABI__ jack_midi_get_lost_event_count@Base __ABI__ jack_midi_max_event_size@Base __ABI__ jack_on_shutdown@Base __ABI__ jack_port_by_id@Base __ABI__ jack_port_by_name@Base __ABI__ jack_port_connected@Base __ABI__ jack_port_connected_to@Base __ABI__ jack_port_disconnect@Base __ABI__ jack_port_ensure_monitor@Base __ABI__ jack_port_flags@Base __ABI__ jack_port_get_aliases@Base __ABI__ jack_port_get_all_connections@Base __ABI__ jack_port_get_buffer@Base __ABI__ jack_port_get_connections@Base __ABI__ jack_port_get_latency@Base __ABI__ jack_port_get_total_latency@Base __ABI__ jack_port_is_mine@Base __ABI__ jack_port_monitoring_input@Base __ABI__ jack_port_name@Base __ABI__ jack_port_name_size@Base __ABI__ jack_port_register@Base __ABI__ jack_port_request_monitor@Base __ABI__ jack_port_request_monitor_by_name@Base __ABI__ jack_port_set_alias@Base __ABI__ jack_port_set_latency@Base __ABI__ jack_port_set_name@Base __ABI__ jack_port_short_name@Base __ABI__ jack_port_tie@Base __ABI__ jack_port_type@Base __ABI__ jack_port_type_size@Base __ABI__ jack_port_unregister@Base __ABI__ jack_port_unset_alias@Base __ABI__ jack_port_untie@Base __ABI__ jack_recompute_total_latencies@Base __ABI__ jack_recompute_total_latency@Base __ABI__ jack_release_timebase@Base __ABI__ jack_reset_max_delayed_usecs@Base __ABI__ jack_ringbuffer_create@Base __ABI__ jack_ringbuffer_free@Base __ABI__ jack_ringbuffer_get_read_vector@Base __ABI__ jack_ringbuffer_get_write_vector@Base __ABI__ jack_ringbuffer_mlock@Base __ABI__ jack_ringbuffer_peek@Base __ABI__ jack_ringbuffer_read_advance@Base __ABI__ jack_ringbuffer_read@Base __ABI__ jack_ringbuffer_read_space@Base __ABI__ jack_ringbuffer_reset@Base __ABI__ jack_ringbuffer_write_advance@Base __ABI__ jack_ringbuffer_write@Base __ABI__ jack_ringbuffer_write_space@Base __ABI__ jack_set_buffer_size@Base __ABI__ jack_set_buffer_size_callback@Base __ABI__ jack_set_client_registration_callback@Base __ABI__ jack_set_error_function@Base __ABI__ jack_set_freewheel@Base __ABI__ jack_set_freewheel_callback@Base __ABI__ jack_set_graph_order_callback@Base __ABI__ jack_set_info_function@Base __ABI__ jack_set_port_connect_callback@Base __ABI__ jack_set_port_registration_callback@Base __ABI__ jack_set_process_callback@Base __ABI__ jack_set_process_thread@Base __ABI__ jack_set_sample_rate_callback@Base __ABI__ jack_set_sync_callback@Base __ABI__ jack_set_sync_timeout@Base __ABI__ jack_set_thread_creator@Base __ABI__ jack_set_thread_init_callback@Base __ABI__ jack_set_timebase_callback@Base __ABI__ jack_set_transport_info@Base __ABI__ jack_set_xrun_callback@Base __ABI__ jack_thread_wait@Base __ABI__ jack_time_to_frames@Base __ABI__ jack_transport_locate@Base __ABI__ jack_transport_query@Base __ABI__ jack_transport_reposition@Base __ABI__ jack_transport_start@Base __ABI__ jack_transport_stop@Base __ABI__ (optional)cpu_type@Base __ABI__ (optional)have_3dnow@Base __ABI__ (optional)have_sse@Base __ABI__ (optional)jack_dump_timestamps@Base __ABI__ (optional)jack_free@Base 0.118+svn3796 (optional)jack_hpet_init@Base __ABI__ (optional)jack_init_timestamps@Base __ABI__ (optional)jack_on_info_shutdown@Base 0.118+svn3796 (optional)jack_port_set_funcs@Base __ABI__ (optional)jack_reset_timestamps@Base __ABI__ (optional)jack_timestamp@Base __ABI__ (optional)x86_3dnow_add2f@Base __ABI__ (optional)x86_3dnow_copyf@Base __ABI__ (optional)x86_sse_add2f@Base __ABI__ (optional)x86_sse_copyf@Base __ABI__ (optional)x86_sse_f2i@Base __ABI__ (optional)x86_sse_i2f@Base __ABI__ (optional)_Z12jack_tls_getj@Base 1.9.5~