init
1
AUTHORS
Normal file
|
|
@ -0,0 +1 @@
|
|||
Daniel Nöthen (butt@danielnoethen.de)
|
||||
339
COPYING
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
555
ChangeLog
Normal file
|
|
@ -0,0 +1,555 @@
|
|||
|
||||
Version 1.45.0 (2025-04-19)
|
||||
---------------------------
|
||||
* Add support for custom URLs and mountpoints for listener statistics
|
||||
* Add seperate MIDI commands for START/STOP Broadcasting and Recording
|
||||
* Add support for controlling BUTT via MIDI NOTE_ON messages
|
||||
* Fix a crash when connecting to a Shoutcast server that is configued with streamhidestats=all
|
||||
* Fix an issue where "Listeners: 0" was shown after connecting to servers that don’t provide listener statistics
|
||||
* Fix several German translation issues
|
||||
* Update credentials for existing radio.co servers when re-adding them
|
||||
|
||||
|
||||
Version 1.44.0-1 (2025-01-17)
|
||||
-----------------------------
|
||||
The following change does only apply to the Linux source tar ball:
|
||||
|
||||
* Fix a compilation error if --disable-aac is passed to the configure script
|
||||
|
||||
Version 1.44.0 (2024-12-03)
|
||||
---------------------------
|
||||
* BUTT can now request the current song from an URL (website)
|
||||
* It is now possible to instruct BUTT to overwrite existing recordings
|
||||
* Add a new display mode which shows "On Air" and if available the current listeners
|
||||
* Fix memory corruption after canceling a connection attempt when using a different application language than English
|
||||
* Improve compatibility of UTF-8 in song names with some servers by making the update request compliant to RFC3986
|
||||
* Increase font size of the "Listeners" label to improve readability from far distances
|
||||
* Change the default answer from "Yes" to "Cancel" when asked to overwrite existing recordings to prevent accidental overwriting of existing recordings
|
||||
|
||||
Version 1.43.0 (2024-08-05)
|
||||
---------------------------
|
||||
* Recording: When file splitting is active, no samples between files are lost anymore
|
||||
* Recording: Fix compatibility issue with older MP3 decoders
|
||||
* Improve song update for Opus streams
|
||||
* Add more advanced MP3 encoder options:
|
||||
- Force minimum VBR bitrate
|
||||
- low-/highpass cutoff frequency
|
||||
- low-/highpass width
|
||||
- Resampling
|
||||
* Allow the user to pass floating point values like 0.5 to the -m/-M/-o/-O commands
|
||||
* Fix crash when connecting to an icecast server if the description field of the ICY information is empty
|
||||
* Fix an issue with Let's Encrypt TLS certificates
|
||||
* Fix an issue that can cause a connection attempt not to be canceled by a single stop button press
|
||||
|
||||
Version 1.42.0 (2024-05-25)
|
||||
---------------------------
|
||||
* Add WebRTC (WHIP) support (Thanks to Matt from codec.live)
|
||||
* Add setting to define the listeners update interval
|
||||
* Include ice-bitrate property to the HTTP header so the icecast status page shows the stream bit rate
|
||||
* Fix "Update devices" button
|
||||
* Improve VU-meter visibility
|
||||
* Let the user select the VU-meter colors and thresholds
|
||||
* Use momentary peak for the peak hold bar instead of an average peak
|
||||
* Assure that the signal detection still works after a recording failed to start
|
||||
* The threshold time for automatic streaming/recording can now be as low as 0.1 seconds
|
||||
* The signal detection level is now always based on the stream volume
|
||||
* Activating automatic streaming/recording did not work if the threshold time was set to 0 seconds
|
||||
* Reduce CPU usage on macOS
|
||||
* Pressing CMD+q on macOS now closes BUTT
|
||||
* Add a "manual" and "YouTube" button to the settings window for easier access
|
||||
* Make it easier for the user to go to the AAC install instructions after selecting the AAC codec
|
||||
* Improve the order of GUI element selection when pressing the tab key
|
||||
|
||||
|
||||
Version 1.41.1 (2024-04-25)
|
||||
---------------------------
|
||||
* Important: Fix a bug that could result in a corrupted configuration file after adding a server or stream info
|
||||
* Change versioning scheme to account for bugfix-only releases
|
||||
|
||||
Version 0.1.41 (2024-03-17)
|
||||
---------------------------
|
||||
* Add support for controlling BUTT via MIDI CC messages
|
||||
* EQ and compressor can now be enabled independently for the stream and record path
|
||||
* You can now use %N as a placeholder for the current server name in your record file/path
|
||||
* Prevent BUTT from being disconnected by the server when using FLAC and the audio signal is 100% silent
|
||||
* The signal and silence detection can now by activated/deactivated with a checkbox instead of simply setting the value to 0
|
||||
* Add -L parameter to get a list of available audio devices
|
||||
* The ICY name and ICY description now support the same placeholders as the record file/path (activate the "expand variables" checkbox)
|
||||
* Add Arabic language support (Thanks to Magd)
|
||||
* Fix an issue that could lead BUTT to freeze on startup if no internet connection is available
|
||||
* Overall stability improvements
|
||||
|
||||
Version 0.1.40 (2023-11-24)
|
||||
---------------------------
|
||||
* Support higher bitrates for AAC, Vorbis and Opus
|
||||
* Add support for Plexamp on Linux
|
||||
* Add Dutch language support (thanks to Timothy)
|
||||
* Fix an issue with audio device names that contain special characters
|
||||
* Fix possible buffer underflow when the connection to a shoutcast server fails
|
||||
|
||||
Version 0.1.39 (2023-09-20)
|
||||
---------------------------
|
||||
* Fix a bug that can cause the listener count to no longer be updated
|
||||
* Fix a bug that can cause the split record file function to stop working
|
||||
* Fix a bug that can cause butt not to reconnect after a connection loss
|
||||
* Fix a bug that can cause undefined behaviour
|
||||
* Clear song name if song file is empty
|
||||
|
||||
|
||||
Version 0.1.38 (2023-08-05)
|
||||
---------------------------
|
||||
* Users can now define a custom window title
|
||||
* Add option to set a delay between automatic reconnects
|
||||
* Add option to use the older Icecast SOURCE protocol instead of the newer PUT protocol
|
||||
* Increase robustness of the config file importer
|
||||
* Increase robustness of the show listeners function
|
||||
* Use green instead of yellow to indicate a valid streaming connection
|
||||
* Fix memory leak when using Icecast and showing the number of listeners
|
||||
* Fix UI drawing issues
|
||||
* Fix issue with the main window size on Windows 11
|
||||
* Fix issues with the tray agent on Windows
|
||||
|
||||
Version 0.1.37 (2022-12-24)
|
||||
---------------------------
|
||||
* Add support for a second audio device
|
||||
* Streaming and recording volume can be set independently
|
||||
* Add support for icecast-kh listener statistics
|
||||
* Highlight connect and record buttons when active
|
||||
* Restore window size if "Remember main window position" is active
|
||||
* Increase size of slider knobs
|
||||
* Start with default values in case the config file is damaged
|
||||
* Always overwrite existing files when recording is started automatically or via butt client
|
||||
* Do not stop recording if a butt client sends a disconnect command while butt is offline
|
||||
* Fix an issue were butt mistakenly says "Connecting..."
|
||||
* Fix memory leak if "Show listeners" is activate
|
||||
|
||||
Version 0.1.36 (2022-10-03)
|
||||
---------------------------
|
||||
* Number of current listeners can be displayed on the LCD (works only with original Icecast and Shoutcast implementations)
|
||||
* Fix connection issue with AIS streaming server
|
||||
* Fix connection issue with Icecast servers older than version 2.4.0
|
||||
* Fix issue with Shoutcast if mountpoint is already in use
|
||||
|
||||
|
||||
Version 0.1.35 (2022-06-19)
|
||||
---------------------------
|
||||
* Gain slider can be disabled to prevent inadvertently changing the volume
|
||||
* Audio device initialization can be skipped by holding down CTRL during startup
|
||||
* Fix crash if audio device can not be opened
|
||||
* Fix crash if no default audio device can be found
|
||||
* Fix wrong password detection for certain liquidsoap Shoutcast implementations
|
||||
* Fix crash of command client and command server when very long song names are specified
|
||||
|
||||
Version 0.1.34 (2022-04-21)
|
||||
---------------------------
|
||||
* Added equalizer presets
|
||||
* Added Spanish translation
|
||||
* Use 32 bit float for internal audio processing instead of 16 bit integer
|
||||
* FLAC can now be broadcasted and recorded as 16 bit or 24 bit
|
||||
* WAV can now be recorded as 16 bit, 24 bit or 32 bit
|
||||
* Massively improved client/server implementation for butt commands
|
||||
* Fixed bug that caused overwriting the first wav samples of a recording
|
||||
* Fixed read song name from Music.app for MacOS >= 11.0
|
||||
* Fixed record folder creation if folder contains format variables
|
||||
* butt commands can now also be sent via UDP
|
||||
* Added new fields to the server status message:
|
||||
- stream seconds, stream kBytes
|
||||
- record seconds, record kBytes
|
||||
- volume left/right
|
||||
- current song
|
||||
- record path
|
||||
|
||||
Version 0.1.33 (2022-02-06)
|
||||
---------------------------
|
||||
* Windows: You can broadcast what's playing on your computer (audio device must support WASAPI)
|
||||
* Windows/Linux: New butt-client for controlling running butt instances (Thanks to Hossam)
|
||||
* Added support for higher samplerates (88.2 kHz and 96 kHz)
|
||||
* Added Portuguese (Brazil) translation (Thanks to Bruno)
|
||||
* Added signal and silence detection flags to the status information
|
||||
* Time thresholds for signal detection can be changed via control commands (Thanks to Hossam)
|
||||
* Format place holders (%Y %m %d etc.) can also be used in the folder name
|
||||
* Song title update support for OPUS
|
||||
* Fixed wrong file size in wav header
|
||||
* Fixed compilation if --disable-ssl or --disable-aac was passed to ./configure
|
||||
|
||||
Version 0.1.32 (2021-10-28)
|
||||
---------------------------
|
||||
* Radio.co stations can now be easily added to butt
|
||||
* Advanced codec settings for mp3, aac, ogg/vorbis and opus can now be adjusted
|
||||
* The recordings folder may now contain environment variables like ~, $HOME and %USERPROFILE%
|
||||
* Fixed issue with characters like $,%,&,§ in the song name
|
||||
* Fixed connection issue in case the server domain has IPv4+6 addresses but Icecast is only listening on IPv4
|
||||
* Fixed missing song duration information in FLAC recordings
|
||||
|
||||
Version 0.1.31 (2021-07-12)
|
||||
---------------------------
|
||||
* A delay can now be added to the automatic song title update
|
||||
* Increased equalizer from 5 to 10 frequency bands
|
||||
* Fixed positioning issues on multi screen setups
|
||||
* Maximum number of supported audio devices has been increased from 100 to 256
|
||||
|
||||
Version 0.1.30 (2021-05-14)
|
||||
---------------------------
|
||||
* Added support for IPv6
|
||||
* Added French translation
|
||||
* Right click on a slider knob brings up an input field where you can type in the slider value with the keyboard
|
||||
* The selected audio device can now be remembered by device name instead by device id
|
||||
* You can now rescan for new audio devices manually (no butt restart needed anymore after plugging in a new audio device)
|
||||
* Holding the shift key during butt startup allows you to start with a fresh configuration file
|
||||
* Updated Portaudio to version v19.7.0
|
||||
* Windows: Added support for WASAPI audio driver
|
||||
* MacOS: Updated FLTK to version 1.3.6
|
||||
* MacOS: Native support for Apple Silicon (arm64)
|
||||
|
||||
Version 0.1.29 (2021-03-28)
|
||||
---------------------------
|
||||
* Added a new tool (butt Agent) which helps to minimize butt to tray and much more (Big thanks to Ivan Radolovic)
|
||||
* Added an indicator to the compressor which lights up if the threshold is exceeded
|
||||
* Added "Aggressive Mode" to the compressor. If activated, the signal power for threshold detection is not averraged
|
||||
* Added new command line options: -q (quit) -n (split recording) -u <songname> (update song name)
|
||||
* Added donation addresses for Bitcoin, Monero and Dash
|
||||
* Fixed crash when butt can not find any input channels
|
||||
* Fixed crash when reading song names from an UTF-8 formatted file that contains a BOM
|
||||
* Fixed issue with icecast-kh14+ when connecting to a mountpoint which is already in use
|
||||
* Fixed issue if both checkboxes "start recording after launch" and "start recording when connected" are checked
|
||||
* Fixed butt.desktop file. Icon was not shown on GNOME panel
|
||||
* Attack and Release compressor labels now have 2 decimal places instead of only 1
|
||||
* butt does not send bitrate information to the icecast server anymore if FLAC is used
|
||||
* butt now searches for a free command server port if default port is already in use
|
||||
* butt can now be started in minimized state
|
||||
* The recording file name can now contain any well known date format specifier
|
||||
* The window class name has been renamed from FLTK to butt_FLTK
|
||||
|
||||
Version 0.1.28 (2021-02-07)
|
||||
---------------------------
|
||||
* Fixed compressor issues
|
||||
* Fixed song update when using Strawberry audio player
|
||||
* The order of song update from an music app can be changed from "Title - Artist" to "Artist - Title"
|
||||
* Increased accuracy of recording split timer
|
||||
* VU-meter appearance can be changed to solid colors for better readability
|
||||
* Log window can be vertically resized
|
||||
* Windows: Changed default installation folder to %LOCALAPPDATA%\butt instead of %LOCALAPPDATA\butt-<version>
|
||||
|
||||
|
||||
Version 0.1.27 (2020-12-26)
|
||||
---------------------------
|
||||
* Fixed loading of AAC codec selection from configuration file
|
||||
* Fixed crash when using opus with a samplerate not equal to 48000 Hz
|
||||
|
||||
Version 0.1.26 (2020-12-24)
|
||||
---------------------------
|
||||
* Added ASIO support
|
||||
* Added support for multi-channel audio devices
|
||||
* Added multi-language support (i18n)
|
||||
* Added German translation
|
||||
* Added option to force reconnection regardless of the server response
|
||||
* Added support for Strawberry audio player (Thanks to Stefan S.)
|
||||
* Added config parameter to disable dithering (set disable_dithering=1 in cfg file)
|
||||
* Fixed possible crash if server is not reachable
|
||||
* Fixed possible crash when reconnecting
|
||||
* Fixed possible crash when using FLAC and song update
|
||||
* Fixed unwanted rounding of compressor values
|
||||
* Fixed overwriting of a DSP setting if it was set to -1.0
|
||||
* Improved CPU usage
|
||||
* Improved mono/stereo handling
|
||||
* Improved overall song update implementation
|
||||
* Compiles on FreeBSD (Thanks to Per G. and Tobias C. B.)
|
||||
|
||||
|
||||
Version 0.1.25 (2020-10-26)
|
||||
---------------------------
|
||||
* Added the ability to extend the song name with a prefix and a suffix
|
||||
* Fixed issue with automatic song update from text files
|
||||
* Fixed recording in FLAC
|
||||
|
||||
Version 0.1.24 (2020-10-14)
|
||||
---------------------------
|
||||
* VU-meter has been redesigned
|
||||
* Fixed issues with usernames that contain special characters
|
||||
* The port of the command server can be specified via command line
|
||||
* Commands can be received via network
|
||||
* It is possible to connect to a particular streaming server when sending the connect command
|
||||
* You can ask a butt instance about its current status with the -S command
|
||||
* butt can automatically check for updates after launch
|
||||
* Update of song name works with FLAC
|
||||
* Thresholds for signal detection can be specified
|
||||
* Added -h command line option to get an overview of all available commands
|
||||
* Updated the manual
|
||||
|
||||
Version 0.1.23 (2020-09-27)
|
||||
---------------------------
|
||||
* Fixed crash if the server is not reachable (e.g. unstable internet connections)
|
||||
* Fixed issue with transfering song meta data from music apps to butt (MacOS)
|
||||
* Improved handling of mic permissions dialog on MacOS
|
||||
|
||||
Version 0.1.22 (2020-07-09)
|
||||
---------------------------
|
||||
* Added Dynamic Range Compressor (thanks to Thomas P.)
|
||||
* Added ability to check for new versions
|
||||
* butt can now be controlled via command line
|
||||
* Replaced experimental portaudio version with the stable portaudio version
|
||||
* Fixed issue with stereo audio when using the Equalizer (thanks to Thomas P.)
|
||||
* Fixed traffic calculation when using OPUS
|
||||
* Fixed issue with OPUS encoding under some circumstances
|
||||
|
||||
Version 0.1.21 (2020-05-26)
|
||||
---------------------------
|
||||
* Streaming and recording can now be started automatically if an audio signal is present
|
||||
* Fixed reconnection issue on unreliable network connections. Should now behave like 0.1.19 again
|
||||
* wav recordings can now be up to 4 GB large
|
||||
* Removed advanced section from the Audio tab. Buffer time can still be set in the configuration file if you need to
|
||||
|
||||
Version 0.1.20 (2020-04-21)
|
||||
---------------------------
|
||||
* Added SSL/TLS support for icecast
|
||||
* Recording can now automatically be stopped if the user disconnects from the server
|
||||
* Fixed icecast connection issue (mostly occurring on mobile internet connections like 4G/LTE)
|
||||
* Fixed wrong password detection for liquidsoap based setups
|
||||
* Fixed configuration export on MacOS
|
||||
* Fixed logfile selection on MacOS
|
||||
* Song name is not updated on reconnect anymore if the manual song name input field has been cleared
|
||||
* Upgraded FLTK to version 1.3.5
|
||||
|
||||
Version 0.1.19 (2019-12-30)
|
||||
---------------------------
|
||||
* The song name can now be read from the last line instead from the first line of a file
|
||||
* Streaming and recording can now be automatically stopped after silence has been detected
|
||||
* The last window position can be remembered. Useful when running multiple instances
|
||||
* butt can now be started with hidden info window
|
||||
* The vu-meter runs smoother and needs less cpu
|
||||
* VU-meter peak hold is only active for the red light
|
||||
* Closing butt while streaming or recording must be confirmed now
|
||||
* Changes are now saved without asking for confirmation when closing the app
|
||||
* Removed a new line character from the server name in the title bar
|
||||
* Fixed recceiving song information from iTunes/Music in MacOS Catalina
|
||||
* Fixed wrong counting of sent bytes when using AAC
|
||||
|
||||
|
||||
Version 0.1.18 (2019-05-12)
|
||||
---------------------------
|
||||
* Added support for automatic recording after starting butt
|
||||
* Enabled AAC afterburner (improves audio quality)
|
||||
* Fixed issue with configure.ac and s390x architecture
|
||||
* Updated the FSF address in COPYING
|
||||
* AAC libs are not delivered with the setup files anymore (read the manual on how to activate AAC support again)
|
||||
|
||||
|
||||
Version 0.1.17 (2018-12-27)
|
||||
---------------------------
|
||||
* Added support for FLAC streaming (icecast only)
|
||||
* Added 5-band equalizer (thanks to Melchor Garau Madrigal)
|
||||
* Added the ability to read song informations from several apps on MacOS and Linux (thanks to Melchor Garau Madrigal)
|
||||
* Window title is automatically renamed to the connected server (useful when running multiple instances)
|
||||
* Fixed connection issue with airtime
|
||||
* Fixed integer overflow when gain is set too high
|
||||
* Fixed compilation error on ubuntu 18
|
||||
* Changed color of windows icon from black to yellow. So people using Win10 can now find butt in their black taskbar ;-)
|
||||
|
||||
|
||||
Version 0.1.16 (2017-09-17)
|
||||
---------------------------
|
||||
* Fixed compatibility issues with shoutcast v2.5.5.732
|
||||
* Replaced portaudio by newest stable version v190600_20161030
|
||||
* When using AAC+ the best AAC profile for the current bitrate is selected automatically +
|
||||
AAC+v2: bitrate < 48kBit/s (aac_aot = 29) +
|
||||
AAC+v1: 48 kBit/s \<= bitrate < 96kBit/s (aac_aot = 5) +
|
||||
AAC-LC: bitrate >= 96kBit/s (aac_aot = 2) +
|
||||
* You can force the AAC codec to a specific profile by setting
|
||||
aac_overwrite_aot = 1 and aac_aot to the appropriate aot value {2,5,29} in buttrc
|
||||
|
||||
|
||||
Version 0.1.15 (2016-05-28)
|
||||
---------------------------
|
||||
* Added AAC+ support
|
||||
* Added a "Split now" button to instantly start a new recording file
|
||||
* Improved look&feel on retina displays on OSX
|
||||
* Improved compatibility with proxies/load balancers (thanks to boyska)
|
||||
* Fixed handling of newline characters when reading the song name file
|
||||
* Fixed evlauation of time/date variables when automatic file splitting is enabled
|
||||
* Fixed compatibility with airtime servers
|
||||
* Fixed ogg and opus support for ShoutCast
|
||||
|
||||
Version 0.1.14 (2014-12-27)
|
||||
---------------------------
|
||||
* Added FLAC support for recording
|
||||
* Added Opus support (thanks to oneman)
|
||||
* Added logfile support (thanks to mikko)
|
||||
* Added support for more variables in the filename (%H %M %S) (thanks to mikko)
|
||||
* Automatic file splitting can be synced to full hour now (thanks to mikko)
|
||||
* LCD info can automatically rotate every 5 seconds now (thanks to mikko)
|
||||
* Added ability to change audio buffer size
|
||||
* Uncluttered LCD (thanks to mikko)
|
||||
* File extension of record filename gets automatically updated now
|
||||
* Dropped support of different samplerate/channels for stream and record
|
||||
* Resorted settings elements/widgets
|
||||
* Removed possible memleaks
|
||||
* Connecting to an unreachable server does not freeze the GUI anymore
|
||||
* Fixed icecast and shoutcast meta data handling
|
||||
* ;ade update song from file more robust
|
||||
* "update song name manually" reacts on Enter button now
|
||||
|
||||
Version 0.1.13 (2014-05-02)
|
||||
---------------------------
|
||||
* Has an icon now! - Thanks to Subrat (ipapuna) Nayak
|
||||
* Added support for lower bitrates (24k, 16k, 8k)
|
||||
* Added support for user defined configuration path e.g. "butt -c <path_to_config>"
|
||||
* Added support for user names in Icecast
|
||||
* Added gain slider. This slider multiplies the audio input samples with the given factor
|
||||
* Added .manifest file to disable the VirtualStore on Windows Vista and higher
|
||||
* Added the ability to automatically split the recording every 'n' minutes
|
||||
* Added feature for importing and exporting configuration files
|
||||
* Compiles with Xcode 5 on OS X Mavericks
|
||||
* Compiles with traditional GNU autoconf/automake environment on linux and mingw
|
||||
* Improved robustness against faulty config files
|
||||
* Improved compatibility to ShoutCast v2 servers
|
||||
* Improved look&feel
|
||||
* Fixed samplerate issues
|
||||
* Fixed mono playback/recording
|
||||
* Changed data volume information vom kBytes to MBytes
|
||||
* Changed default recording path to users home folder
|
||||
* Sends audio information (bitrate etc.) to Icecast server - Thanks to Dominik Durner
|
||||
* Reimplemented VU-Meter with peak hold
|
||||
* Comes with as an ubuntu package
|
||||
* Windows: can be installed as user without admin rights
|
||||
* Windows: uninstallation process also removes the configuration file
|
||||
* Instead of canceling the automatic song update in case the given file is not
|
||||
readable, butt now tries to reread the file every 5 seconds
|
||||
|
||||
Version 0.1.12 (2010-04-10)
|
||||
---------------------------
|
||||
* butt is now able to connect automatically after startup
|
||||
* Shortened time between connect attempts (fixes Shouted.FM connection problems)
|
||||
* Improved wrong password detection for shoutcast
|
||||
|
||||
Version 0.1.11-2 (2008-12-14)
|
||||
-----------------------------
|
||||
* Fixed display info after automatic reconnection
|
||||
|
||||
Version 0.1.11-1 (2008-11-09)
|
||||
-----------------------------
|
||||
* Fixed segfault if there is no '.' in the filename
|
||||
|
||||
Version 0.1.11 (2008-10-26)
|
||||
---------------------------
|
||||
* Fixed unintended disconnects
|
||||
* Fixed recording problems
|
||||
* Removed buffer overrun messages
|
||||
* Recording can be now stopped with the stop-button
|
||||
* Replaced pcm recording by wav recording
|
||||
* Recording as ogg is now possible
|
||||
* Added "stay on top" checkbox
|
||||
* Fixed possible crash when changing mp3 settings while streaming
|
||||
|
||||
Version 0.1.10 (2008-05-25)
|
||||
---------------------------
|
||||
* Removed xrun "led". Instead the msg window informs the user about overruns
|
||||
* Added dB values to the vu-meter
|
||||
* Fixed bitrate/samplerate selection for ogg
|
||||
* Network backend works with non-blocking sockets now
|
||||
* libshout is not needed anymore
|
||||
* Songname can be updated from a textfile now
|
||||
* More samplerates are supported now
|
||||
* Fixed samplerate selection problems
|
||||
* Fixed crash when connecting to icecast server on MacOS 10.4
|
||||
* Fixed crash when changing the server type from shoutcast to icecast
|
||||
* Some cosmetic changes (buttons, LEDs)
|
||||
|
||||
Version 0.1.9 (2008-04-10)
|
||||
--------------------------
|
||||
* Minor GUI makeup
|
||||
* Made butt more verbose
|
||||
* Fixed possible segfault when trying to EDIT stream info
|
||||
* Fixed automatic reconnection
|
||||
* Filenames can be indexed with the %i variable now
|
||||
* Renamed "rec not until connected" checkbox to "start rec. when connected"
|
||||
* Added orange record icon for "armed" state ("start rec. when connected" = 1)
|
||||
* butt starts recording as soon as connected, when in "armed" state
|
||||
|
||||
Version 0.1.8 (2008-03-30)
|
||||
--------------------------
|
||||
|
||||
* Text/bg color can be changed in the [GUI] tab
|
||||
* Removed the "Config saved" popup message
|
||||
* Added pcm recording
|
||||
* Improoved record handling
|
||||
* The config menu is more user friendly now
|
||||
* Fixed crash when connection loss
|
||||
* The user may select the samplerate now
|
||||
* The config window can be attached to the main window now
|
||||
* Fixed bitrate and codec ShoutCast info
|
||||
|
||||
Version 0.1.7rc1 (2008-01-04)
|
||||
-----------------------------
|
||||
* butt runs on MacOS 10.4 and 10.5 now!
|
||||
* Added recording time to the display info
|
||||
* Fixed bug with '&' in the song string
|
||||
* Changing the display mode works only when connected now
|
||||
* Added a checkbox which lets the user decide if the recording should start
|
||||
right after selecting the output file or when connected
|
||||
* Added a msg box which ask the user if he wants to stop the recording
|
||||
when disconnecting
|
||||
|
||||
|
||||
Version 0.1.6 (2007-12-08)
|
||||
---------------------------
|
||||
* Added status symbols to the display
|
||||
* Recording runs with a seperate thread now!
|
||||
* Added a button for showing/hiding the server password
|
||||
|
||||
Version 0.1.5 (2007-11-22)
|
||||
---------------------------
|
||||
* Minor GUI changes
|
||||
* Fixed streaming/recording with mp3 320kb/s
|
||||
* Fixed segfault in Fl_ILM216.cpp
|
||||
* The user may change the display colors now (right click on the display)
|
||||
* The "connecting" info on the display updates faster now
|
||||
* Changed default display colors to white/blue
|
||||
|
||||
Version 0.1.5rc1 (2007-11-16)
|
||||
-----------------------------
|
||||
* Replaced ALSA by PortAudio -> OSS is supported now
|
||||
* Ported butt to Microsoft Windows (tested with win2k and win xp)
|
||||
* butt reminds the user about unsaved changes when closing now
|
||||
* Starting the recording is possible at any time now
|
||||
* Added mono encoding for OGG
|
||||
* Improved some GUI stuff
|
||||
* Improved CPU usage
|
||||
|
||||
Version 0.1.4rc2 (2007-11-03)
|
||||
-----------------------------
|
||||
* butt should compile on more machines now
|
||||
|
||||
Version 0.1.4rc1 (2007-11-01)
|
||||
-----------------------------
|
||||
* Added IceCast support (ogg and mp3)
|
||||
* Added ./configure script
|
||||
* butt is now able to send the "Current Song" value to the ShoutCast/IceCast server
|
||||
* Changed stereo mode from joint-stereo to real-stereo
|
||||
* Code cleanup
|
||||
|
||||
Version 0.1.3 (2007-10-08)
|
||||
---------------------------
|
||||
* Bugfix: butt crashed if you press "apply" in the server/icy tab without
|
||||
having an server/ICY-entry
|
||||
* Bugfix: butt crashed if you change the bitrate without having an ICY-entry
|
||||
* Bugfix: there was some uncommented code in the [DEL]-server callback-routine
|
||||
which shouldn't be uncommented
|
||||
* Facelift: if you delete all server/ICY-entries, the input fields in the server/ICY
|
||||
still showed the values of the last server/ICY-entry
|
||||
|
||||
Version 0.1.2 (2007-10-07)
|
||||
--------------------------
|
||||
* Added a GUI for configuring butt
|
||||
* Comments behind config entries are not allowed anymore.
|
||||
* Removed the network init part. It was nonsense
|
||||
* Fixed mono playblack
|
||||
* Fixed recording problems
|
||||
* ICY entries can now be empty without causing butt to crash
|
||||
* butt shows the real port in its "connecting to..."-info line now and the "pseudeo" port in parenthesis
|
||||
* Fixed a bug which causes pcm data loss in some cases
|
||||
|
||||
Version 0.1.1 (2007-09-16)
|
||||
--------------------------
|
||||
* Added recording feature
|
||||
* Fixed seg fault on startup when compiled with gcc-4.1.2
|
||||
* Fixed seg fault when encoding with high bitrates
|
||||
47
INSTALL
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
Installation:
|
||||
-------------
|
||||
OS X:
|
||||
Mount the butt-<version>.dmg by double clicking and
|
||||
drop the butt file into the Applications folder.
|
||||
|
||||
WINDOWS:
|
||||
Just run the butt-<version>-setup.exe as usual and go through the
|
||||
installer pages.
|
||||
The default installation path might be unusual, but this way it is possible to install
|
||||
butt without administration rights.
|
||||
|
||||
Linux/MinGW (Windows):
|
||||
First of all the following libraries have to be installed on your system
|
||||
fltk-1.3, portaudio19, libmp3lame, libvorbis, libogg, libflac,
|
||||
libopus, libsamplerate, libfdk-aac, libdbus-1, libcurl, libssl, portmidi
|
||||
They are quite common and should be included in every popular linux distribution.
|
||||
|
||||
On Ubuntu you can install them with
|
||||
sudo apt-get install libfltk1.3-dev portaudio19-dev libopus-dev libmp3lame-dev libvorbis-dev \
|
||||
libogg-dev libflac-dev libfdk-aac-dev libdbus-1-dev libsamplerate0-dev \
|
||||
libssl-dev libcurl4-openssl-dev libportmidi-dev \
|
||||
|
||||
On openSUSE you can install them with
|
||||
sudo zypper in fltk-devel portaudio-devel libmp3lame-devel libvorbis-devel libogg-devel flac-devel \
|
||||
libfdk-aac-devel libopus-devel libopenssl-devel libopus-devel libsamplerate-devel dbus-1-devel \
|
||||
libcurl-devel portmidi-devel
|
||||
|
||||
On Distributions which don't have libfdk-aac like Debian you can compile without aac support:
|
||||
./configure --disable-aac
|
||||
|
||||
For compiling on Windows I recommend the msys2 x64 (www.msys2.org) environment.
|
||||
They have all the needed packages in their pacman repository. Additionally you need to install the libwinpthread-git package.
|
||||
Make sure that you select the x64 version of each package.
|
||||
|
||||
After installing the above libraries you can install butt from source as usual:
|
||||
|
||||
tar -xzf butt-<version>.tar.gz
|
||||
cd butt-<version>
|
||||
./configure
|
||||
make
|
||||
sudo make install
|
||||
|
||||
|
||||
In case the included configure script or the make process fails on your system, try to create a new configure script by invoking:
|
||||
autoreconf -i and start with ./configure again.
|
||||
|
||||
1
KNOWN_BUGS
Normal file
|
|
@ -0,0 +1 @@
|
|||
Please report bugs to butt@danielnoethen.de
|
||||
20
Makefile.am
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
AUTOMAKE_OPTIONS = foreign
|
||||
if CLIENT_ONLY
|
||||
SUBDIRS = src
|
||||
else
|
||||
SUBDIRS = po src
|
||||
endif
|
||||
EXTRA_DIST = config.rpath m4/ChangeLog src/aac_dll.h src/xpm config.h src/butt.manifest player_plugins icons usr ChangeLog \
|
||||
AUTHORS THANKS KNOWN_BUGS INSTALL README COPYING NEWS src/FLTK/flgui.fl \
|
||||
src/FLTK/Fl_My_Native_File_Chooser_MAC.mm src/FLTK/Fl_My_Native_File_Chooser_WIN32.cxx \
|
||||
src/FLTK/Fl_My_Native_File_Chooser_FLTK.cxx src/FLTK/Fl_My_Native_File_Chooser_common.cxx \
|
||||
src/FLTK/Fl_My_Native_File_Chooser_GTK.cxx src/AskForMicPermission.m src/AskForMicPermission.h \
|
||||
butt.1 gettext.h
|
||||
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
#install-exec-hook:
|
||||
# cp po/de.gmo locale/de/LC_MESSAGES/butt.mo
|
||||
# cp po/fr.gmo locale/fr/LC_MESSAGES/butt.mo
|
||||
# cp po/pt_BR.gmo locale/pt_BR/LC_MESSAGES/butt.mo
|
||||
840
Makefile.in
Normal file
|
|
@ -0,0 +1,840 @@
|
|||
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = .
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
|
||||
$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
|
||||
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
|
||||
$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \
|
||||
$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
||||
$(am__configure_deps) $(am__DIST_COMMON)
|
||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||
configure.lineno config.status.lineno
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||
install-data-recursive install-dvi-recursive \
|
||||
install-exec-recursive install-html-recursive \
|
||||
install-info-recursive install-pdf-recursive \
|
||||
install-ps-recursive install-recursive installcheck-recursive \
|
||||
installdirs-recursive pdf-recursive ps-recursive \
|
||||
tags-recursive uninstall-recursive
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||
distclean-recursive maintainer-clean-recursive
|
||||
am__recursive_targets = \
|
||||
$(RECURSIVE_TARGETS) \
|
||||
$(RECURSIVE_CLEAN_TARGETS) \
|
||||
$(am__extra_recursive_targets)
|
||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||
cscope distdir distdir-am dist dist-all distcheck
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \
|
||||
config.h.in
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
DIST_SUBDIRS = po src
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
|
||||
ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS README THANKS \
|
||||
compile config.guess config.rpath config.sub depcomp \
|
||||
install-sh missing
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
distdir = $(PACKAGE)-$(VERSION)
|
||||
top_distdir = $(distdir)
|
||||
am__remove_distdir = \
|
||||
if test -d "$(distdir)"; then \
|
||||
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||
&& rm -rf "$(distdir)" \
|
||||
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
||||
else :; fi
|
||||
am__post_remove_distdir = $(am__remove_distdir)
|
||||
am__relativize = \
|
||||
dir0=`pwd`; \
|
||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
||||
sed_rest='s,^[^/]*/*,,'; \
|
||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
||||
sed_butlast='s,/*[^/]*$$,,'; \
|
||||
while test -n "$$dir1"; do \
|
||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
||||
if test "$$first" != "."; then \
|
||||
if test "$$first" = ".."; then \
|
||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
||||
else \
|
||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
||||
if test "$$first2" = "$$first"; then \
|
||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
||||
else \
|
||||
dir2="../$$dir2"; \
|
||||
fi; \
|
||||
dir0="$$dir0"/"$$first"; \
|
||||
fi; \
|
||||
fi; \
|
||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
||||
done; \
|
||||
reldir="$$dir2"
|
||||
DIST_ARCHIVES = $(distdir).tar.gz
|
||||
GZIP_ENV = --best
|
||||
DIST_TARGETS = dist-gzip
|
||||
# Exists only to be overridden by the user if desired.
|
||||
AM_DISTCHECK_DVI_TARGET = dvi
|
||||
distuninstallcheck_listfiles = find . -type f -print
|
||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||
distcleancheck_listfiles = find . -type f -print
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CSCOPE = @CSCOPE@
|
||||
CTAGS = @CTAGS@
|
||||
CXX = @CXX@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DBUS_CFLAGS = @DBUS_CFLAGS@
|
||||
DBUS_LIBS = @DBUS_LIBS@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ETAGS = @ETAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
FLTKCONFIG = @FLTKCONFIG@
|
||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
||||
GMSGFMT = @GMSGFMT@
|
||||
GMSGFMT_015 = @GMSGFMT_015@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
INTLLIBS = @INTLLIBS@
|
||||
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBICONV = @LIBICONV@
|
||||
LIBINTL = @LIBINTL@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LTLIBICONV = @LTLIBICONV@
|
||||
LTLIBINTL = @LTLIBINTL@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MSGFMT = @MSGFMT@
|
||||
MSGFMT_015 = @MSGFMT_015@
|
||||
MSGMERGE = @MSGMERGE@
|
||||
OBJC = @OBJC@
|
||||
OBJCDEPMODE = @OBJCDEPMODE@
|
||||
OBJCFLAGS = @OBJCFLAGS@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
POSUB = @POSUB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
USE_NLS = @USE_NLS@
|
||||
VERSION = @VERSION@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XGETTEXT_015 = @XGETTEXT_015@
|
||||
XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
|
||||
XMKMF = @XMKMF@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_OBJC = @ac_ct_OBJC@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
@CLIENT_ONLY_FALSE@SUBDIRS = po src
|
||||
@CLIENT_ONLY_TRUE@SUBDIRS = src
|
||||
EXTRA_DIST = config.rpath m4/ChangeLog src/aac_dll.h src/xpm config.h src/butt.manifest player_plugins icons usr ChangeLog \
|
||||
AUTHORS THANKS KNOWN_BUGS INSTALL README COPYING NEWS src/FLTK/flgui.fl \
|
||||
src/FLTK/Fl_My_Native_File_Chooser_MAC.mm src/FLTK/Fl_My_Native_File_Chooser_WIN32.cxx \
|
||||
src/FLTK/Fl_My_Native_File_Chooser_FLTK.cxx src/FLTK/Fl_My_Native_File_Chooser_common.cxx \
|
||||
src/FLTK/Fl_My_Native_File_Chooser_GTK.cxx src/AskForMicPermission.m src/AskForMicPermission.h \
|
||||
butt.1 gettext.h
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
all: config.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||
|
||||
.SUFFIXES:
|
||||
am--refresh: Makefile
|
||||
@:
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
|
||||
$(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
|
||||
&& exit 0; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
echo ' $(SHELL) ./config.status'; \
|
||||
$(SHELL) ./config.status;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
config.h: stamp-h1
|
||||
@test -f $@ || rm -f stamp-h1
|
||||
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
|
||||
|
||||
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||
@rm -f stamp-h1
|
||||
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||
$(srcdir)/config.h.in: $(am__configure_deps)
|
||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||
rm -f stamp-h1
|
||||
touch $@
|
||||
|
||||
distclean-hdr:
|
||||
-rm -f config.h stamp-h1
|
||||
|
||||
# This directory's subdirectories are mostly independent; you can cd
|
||||
# into them and run 'make' without going through this Makefile.
|
||||
# To change the values of 'make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in 'config.status', edit 'config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run 'make');
|
||||
# (2) otherwise, pass the desired values on the 'make' command line.
|
||||
$(am__recursive_targets):
|
||||
@fail=; \
|
||||
if $(am__make_keepgoing); then \
|
||||
failcom='fail=yes'; \
|
||||
else \
|
||||
failcom='exit 1'; \
|
||||
fi; \
|
||||
dot_seen=no; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
case "$@" in \
|
||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||
*) list='$(SUBDIRS)' ;; \
|
||||
esac; \
|
||||
for subdir in $$list; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
dot_seen=yes; \
|
||||
local_target="$$target-am"; \
|
||||
else \
|
||||
local_target="$$target"; \
|
||||
fi; \
|
||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||
|| eval $$failcom; \
|
||||
done; \
|
||||
if test "$$dot_seen" = "no"; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||
fi; test -z "$$fail"
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-recursive
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||
include_option=--etags-include; \
|
||||
empty_fix=.; \
|
||||
else \
|
||||
include_option=--include; \
|
||||
empty_fix=; \
|
||||
fi; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
test ! -f $$subdir/TAGS || \
|
||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||
fi; \
|
||||
done; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-recursive
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscope: cscope.files
|
||||
test ! -s cscope.files \
|
||||
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
||||
clean-cscope:
|
||||
-rm -f cscope.files
|
||||
cscope.files: clean-cscope cscopelist
|
||||
cscopelist: cscopelist-recursive
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
distdir-am: $(DISTFILES)
|
||||
$(am__remove_distdir)
|
||||
test -d "$(distdir)" || mkdir "$(distdir)"
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
$(am__make_dryrun) \
|
||||
|| test -d "$(distdir)/$$subdir" \
|
||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||
|| exit 1; \
|
||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
||||
$(am__relativize); \
|
||||
new_distdir=$$reldir; \
|
||||
dir1=$$subdir; dir2="$(top_distdir)"; \
|
||||
$(am__relativize); \
|
||||
new_top_distdir=$$reldir; \
|
||||
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
||||
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
||||
($(am__cd) $$subdir && \
|
||||
$(MAKE) $(AM_MAKEFLAGS) \
|
||||
top_distdir="$$new_top_distdir" \
|
||||
distdir="$$new_distdir" \
|
||||
am__remove_distdir=: \
|
||||
am__skip_length_check=: \
|
||||
am__skip_mode_fix=: \
|
||||
distdir) \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
-test -n "$(am__skip_mode_fix)" \
|
||||
|| find "$(distdir)" -type d ! -perm -755 \
|
||||
-exec chmod u+rwx,go+rx {} \; -o \
|
||||
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||
|| chmod -R a+r "$(distdir)"
|
||||
dist-gzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-bzip2: distdir
|
||||
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-lzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-xz: distdir
|
||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-zstd: distdir
|
||||
tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-tarZ: distdir
|
||||
@echo WARNING: "Support for distribution archives compressed with" \
|
||||
"legacy program 'compress' is deprecated." >&2
|
||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-shar: distdir
|
||||
@echo WARNING: "Support for shar distribution archives is" \
|
||||
"deprecated." >&2
|
||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||
shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-zip: distdir
|
||||
-rm -f $(distdir).zip
|
||||
zip -rq $(distdir).zip $(distdir)
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist dist-all:
|
||||
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
# This target untars the dist file and tries a VPATH configuration. Then
|
||||
# it guarantees that the distribution is self-contained by making another
|
||||
# tarfile.
|
||||
distcheck: dist
|
||||
case '$(DIST_ARCHIVES)' in \
|
||||
*.tar.gz*) \
|
||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||
*.tar.bz2*) \
|
||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||
*.tar.lz*) \
|
||||
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
||||
*.tar.xz*) \
|
||||
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
||||
*.tar.Z*) \
|
||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||
*.shar.gz*) \
|
||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
||||
*.zip*) \
|
||||
unzip $(distdir).zip ;;\
|
||||
*.tar.zst*) \
|
||||
zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
|
||||
esac
|
||||
chmod -R a-w $(distdir)
|
||||
chmod u+w $(distdir)
|
||||
mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
|
||||
chmod a-w $(distdir)
|
||||
test -d $(distdir)/_build || exit 0; \
|
||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||
&& am__cwd=`pwd` \
|
||||
&& $(am__cd) $(distdir)/_build/sub \
|
||||
&& ../../configure \
|
||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||
distuninstallcheck \
|
||||
&& chmod -R a-w "$$dc_install_base" \
|
||||
&& ({ \
|
||||
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||
&& rm -rf "$$dc_destdir" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||
&& rm -rf $(DIST_ARCHIVES) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
||||
&& cd "$$am__cwd" \
|
||||
|| exit 1
|
||||
$(am__post_remove_distdir)
|
||||
@(echo "$(distdir) archives ready for distribution: "; \
|
||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||
distuninstallcheck:
|
||||
@test -n '$(distuninstallcheck_dir)' || { \
|
||||
echo 'ERROR: trying to run $@ with an empty' \
|
||||
'$$(distuninstallcheck_dir)' >&2; \
|
||||
exit 1; \
|
||||
}; \
|
||||
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
||||
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
||||
exit 1; \
|
||||
}; \
|
||||
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left after uninstall:" ; \
|
||||
if test -n "$(DESTDIR)"; then \
|
||||
echo " (check DESTDIR support)"; \
|
||||
fi ; \
|
||||
$(distuninstallcheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
distcleancheck: distclean
|
||||
@if test '$(srcdir)' = . ; then \
|
||||
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||
$(distcleancheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
check-am: all-am
|
||||
check: check-recursive
|
||||
all-am: Makefile config.h
|
||||
installdirs: installdirs-recursive
|
||||
installdirs-am:
|
||||
install: install-recursive
|
||||
install-exec: install-exec-recursive
|
||||
install-data: install-data-recursive
|
||||
uninstall: uninstall-recursive
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-recursive
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-recursive
|
||||
|
||||
clean-am: clean-generic mostlyclean-am
|
||||
|
||||
distclean: distclean-recursive
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
|
||||
|
||||
dvi: dvi-recursive
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-recursive
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-recursive
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am:
|
||||
|
||||
install-dvi: install-dvi-recursive
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-recursive
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-recursive
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-recursive
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-recursive
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-recursive
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -rf $(top_srcdir)/autom4te.cache
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-recursive
|
||||
|
||||
mostlyclean-am: mostlyclean-generic
|
||||
|
||||
pdf: pdf-recursive
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-recursive
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am:
|
||||
|
||||
.MAKE: $(am__recursive_targets) all install-am install-strip
|
||||
|
||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||
am--refresh check check-am clean clean-cscope clean-generic \
|
||||
cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
|
||||
dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
|
||||
dist-zstd distcheck distclean distclean-generic distclean-hdr \
|
||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-info install-info-am install-man install-pdf \
|
||||
install-pdf-am install-ps install-ps-am install-strip \
|
||||
installcheck installcheck-am installdirs installdirs-am \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
|
||||
uninstall-am
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
#install-exec-hook:
|
||||
# cp po/de.gmo locale/de/LC_MESSAGES/butt.mo
|
||||
# cp po/fr.gmo locale/fr/LC_MESSAGES/butt.mo
|
||||
# cp po/pt_BR.gmo locale/pt_BR/LC_MESSAGES/butt.mo
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
1
NEWS
Normal file
|
|
@ -0,0 +1 @@
|
|||
See ChangeLog for more
|
||||
953
README
Normal file
|
|
@ -0,0 +1,953 @@
|
|||
////
|
||||
execute as "asciidoctor manual.txt"
|
||||
////
|
||||
|
||||
BUTT (1.45.0) Manual
|
||||
====================
|
||||
:author: Daniel Nöthen
|
||||
:doctype: book
|
||||
:toc2:
|
||||
:numbered:
|
||||
:lang: en
|
||||
:email: butt at danielnoethen dot de
|
||||
:encoding: utf-8
|
||||
|
||||
About
|
||||
-----
|
||||
BUTT (Broadcast Using This Tool) is an easy to use, multi OS streaming tool. +
|
||||
It supports Icecast, Shoutcast and WebRTC and runs on Windows, macOS and Linux. +
|
||||
The main purpose of BUTT is to stream live audio data from your computers microphone or line input +
|
||||
to an Icecast, Shoutcast or WebRTC (WHIP) server. If you want you can also record your broadcast locally +
|
||||
on your computer. +
|
||||
With BUTT you can not directly stream audio files. However, with the help of tools like +
|
||||
Voicemeeter (Windows), Blackhole (macOS) and PulseAudio (Linux) you can also stream audio files +
|
||||
directly from your favorite music player.
|
||||
|
||||
Install
|
||||
-------
|
||||
.OS X:
|
||||
Mount the *butt-<version>.dmg* by double clicking and +
|
||||
drop the butt file on the Applications folder. +
|
||||
|
||||
.Windows:
|
||||
Just run the *butt-<version>-setup.exe* and follow the installer pages. +
|
||||
The default installation path might be unusual, but this way it is possible to install +
|
||||
BUTT without administration rights. +
|
||||
|
||||
[#Install_Linux]
|
||||
.Linux/MinGW (Windows):
|
||||
Note: If you want to only install the butt-client, skip directly to the butt-client section below. +
|
||||
First of all the following libraries have to be installed on your system +
|
||||
'fltk-1.3', 'portaudio19', 'libmp3lame', 'libvorbis', 'libogg', 'libflac', +
|
||||
'libopus', 'libsamplerate', 'libfdk-aac', +
|
||||
'libdbus-1, 'libcurl', libssl', 'portmidi +
|
||||
They are quite common and should be included in every popular linux distribution. +
|
||||
|
||||
On *Ubuntu* you can install them with +
|
||||
`sudo apt-get install libfltk1.3-dev portaudio19-dev libopus-dev libmp3lame-dev libvorbis-dev
|
||||
libogg-dev libflac-dev libfdk-aac-dev libdbus-1-dev libsamplerate0-dev
|
||||
libssl-dev libcurl4-openssl-dev libportmidi-dev`
|
||||
|
||||
On *openSUSE* you can install them with +
|
||||
`sudo zypper in fltk-devel portaudio-devel libmp3lame-devel libvorbis-devel libogg-devel flac-devel
|
||||
libfdk-aac-devel libopus-devel libopenssl-devel libopus-devel libsamplerate-devel dbus-1-devel libcurl-devel portmidi-devel`
|
||||
|
||||
On Distributions which don't have libfdk-aac like *debian*
|
||||
you can compile without aac support with: +
|
||||
`./configure --disable-aac`
|
||||
|
||||
For compiling on *Windows* I recommend the msys2 x64 (www.msys2.org) environment. +
|
||||
They have all the needed packages in their pacman repository. Additionally you need to install the `libwinpthread-git` package. +
|
||||
Make sure that you select the x64 version of each package.
|
||||
|
||||
After installing the above libraries you can install BUTT from source as usual:
|
||||
|
||||
- +tar -xzf butt-<version>.tar.gz+
|
||||
|
||||
- +cd butt-<version>+
|
||||
|
||||
- +autoreconf -i+ (only on Windows/MSYS2)
|
||||
|
||||
- +./configure+
|
||||
|
||||
- +make+
|
||||
|
||||
- +sudo make install+
|
||||
|
||||
In case the included configure script or the make process fails on your system, try to create a new configure script by invoking:
|
||||
`autoreconf -i`
|
||||
and start with `./configure` again.
|
||||
|
||||
butt-client
|
||||
-----------
|
||||
butt-client is a minimal binary which can be used to send commands to a running BUTT instance. +
|
||||
There are two ways to build butt-client: +
|
||||
1. Configure the build by adding --with-client to the configure command. +
|
||||
2. Configure it by adding --without-butt. +
|
||||
The first option builds both BUTT and butt-client and it requires all system dependencies. +
|
||||
The second option builds butt-client only and it requires none of the system dependencies. +
|
||||
This is the recommended option if you only need butt-client, especially if you are installing +
|
||||
it on a different machine. This is because the resulting binary is much smaller and it does +
|
||||
not link with any system dependencies, except the standard ones, which means that it is portable +
|
||||
as long as you copy it to another machine which shares the same operating system as the one you are building it on. +
|
||||
|
||||
|
||||
Quick start
|
||||
-----------
|
||||
When you start BUTT the first time, it will create a default configuration +
|
||||
file in in your home directory ('~/.buttrc') on Linux and macOS or at +
|
||||
'C:\Users\<username>\AppData\Roaming\buttrc' on Windows. +
|
||||
|
||||
In order to connect to a server, you need to add a new server in the config window. +
|
||||
Just open the settings window and click on [ADD]. +
|
||||
Now fill in the input fields with the server credentials and click on the [ADD] at
|
||||
the lower right corner. +
|
||||
To connect to the server just press the play button in the main window and enjoy +
|
||||
your broadcast.
|
||||
|
||||
Install AAC libraries
|
||||
---------------------
|
||||
.Windows:
|
||||
1. Download libfdk-aac-2.dll from link:https://danielnoethen.de/butt/release/1.45.0/AAC/libfdk-aac-2.dll[here]
|
||||
2. Go to the installation directory of BUTT by typing %LOCALAPPDATA%\butt into the file explorer
|
||||
3. Copy libfdk-aac-2.dll into the installation directory of BUTT
|
||||
4. Restart BUTT
|
||||
5. Enjoy AAC streaming
|
||||
|
||||
.MacOS:
|
||||
1. Download and install butt_libfdkaac_macOS.pkg from link:https://danielnoethen.de/butt/release/1.45.0/AAC/butt_libfdkaac_macOS.pkg[here]
|
||||
2. Restart BUTT
|
||||
3. Enjoy AAC streaming
|
||||
|
||||
Note: The installer will install libfdk-aac.2.dylib into /Library/Application Support/butt/
|
||||
|
||||
.Linux:
|
||||
In case your Linux distribution ships BUTT without AAC support, +
|
||||
you need to install BUTT from source. Please refer to the <<Install_Linux, Install>> section for more +
|
||||
information on that.
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
The command line option +-c <path_to_file>+ allows you to define a new standard configuration path. +
|
||||
This makes it possible to have multiple instances with different configurations +
|
||||
running. In case the file does not exists, BUTT will create a default file for you. +
|
||||
A tutorial on how to use the -c command line option to run multiple BUTT
|
||||
instances can be found
|
||||
http://danielnoethen.de/butt/howtos/multiple_servers.html[here].
|
||||
|
||||
[Save]: Saves your current settings to the standard configuration +
|
||||
file or to the file that was passed to the -c option +
|
||||
[Export]: Saves your current settings to the given file +
|
||||
[Import]: Loads the selected file and applies the settings +
|
||||
|
||||
CAUTION: If you use the -c command line option and import another configuration file +
|
||||
by using the import function, pressing [Save] will overwrite the file that was passed to the -c option.
|
||||
|
||||
TIP: In some cases the configuration file can become damaged and BUTT will not be
|
||||
able to start correctly. In that case you can hold down the shift key during
|
||||
BUTT startup to create a new configuration file.
|
||||
|
||||
|
||||
Main Window
|
||||
-----------
|
||||
The dot matrix display shows you the current state of the BUTT software. +
|
||||
The states are: idle, streaming, recording. +
|
||||
When in streaming and/or recording state you can cycle through the information by clicking on the display. +
|
||||
You can choose between online duration, data sent, recording duration, data recorded and On Air state +
|
||||
|
||||
The [>] symbol shines yellow if BUTT is connected to a server. +
|
||||
The [O] symbol shines orange if the +[start rec. when connected]+ checkbox is activated. +
|
||||
The [O] symbol shines red if BUTT is currently recording. +
|
||||
|
||||
Additionally the play and record buttons change their color to yellow and red when BUTT is connected or recording.
|
||||
|
||||
Gain slider:
|
||||
The slider is only visible when to log window is visible as well. +
|
||||
With this slider you can attenuate and amplify the input signal between '-24 dB' and '+24 dB', respectively. +
|
||||
Double clicking the slider handle resets the gain to '0 dB'. Use this slider only to fine tune your input signal. +
|
||||
To enter the gain as a number with your keyboard, right click the slider handle.
|
||||
The slider does not change the operating systems input volume setting. Instead, the input signal is multiplied +
|
||||
by the given factor. Thus, adding too much gain will also add lots of noise. +
|
||||
|
||||
VU meter:
|
||||
The vu meter shows the current streaming or recording volume in dBFS.
|
||||
|
||||
Audio Mixer
|
||||
-----------
|
||||
Click on +[Mixer]+ to open the Audio Mixer. The mixer allows you to individually adjust the volume of +
|
||||
your audio devices and have different volumes for streaming and recording. The Master Gain slider is coupled with the +
|
||||
gain slider on the main window. +
|
||||
The crossfader allows you to blend volumes between the primary and secondary audio device. Moving it +
|
||||
from the center to one side lowers the volume of the other side. +
|
||||
|
||||
Audio
|
||||
-----
|
||||
The audio settings tab allows you to select your primary and secondary audio interface and the desired sample rate. +
|
||||
If you have a multi-channel audio device you may also select the desired input channels for the left and +
|
||||
right audio channel. +
|
||||
If you want to stream in stereo, make sure that the left and right channels are mapped to different input channels +
|
||||
like 1 and 2. Otherwise you will only stream a mono signal.
|
||||
|
||||
With the channel mode setting you tell BUTT if the audio stream shall be encoded to stereo or mono. +
|
||||
This brings us to 4 possible combinations.
|
||||
|
||||
.Channel mode = *Stereo* and *different input channels* are selected for Left and Right:
|
||||
This is probably the most used combination. +
|
||||
Left and Right channels are encoded into a stereo stream.
|
||||
|
||||
.Channel mode = *Stereo* and the *same input channel* is selected for Left and Right:
|
||||
The selected input channel is used for the left and right channel in a stereo stream.
|
||||
|
||||
.Channel mode = *Mono* and *different input channels* are selected for Left and Right:
|
||||
Left and Right channels are averaged into a mono stream.
|
||||
|
||||
.Channel mode = *Mono* and the *same channel* is selected for Left and Right:
|
||||
The selected channel is used as mono channel in a mono stream.
|
||||
|
||||
The "Remember Device by" setting lets you choose if BUTT remembers the current device by its ID +
|
||||
or its name. As the ID may change when changing the number of connected audio devices on your computer +
|
||||
or when updating your operating system, it is recommended to let BUTT remember the audio device by its name.
|
||||
|
||||
Clicking on +[Update devices]+ will rescan the system for audio devices and update the Primary and Secondary +
|
||||
audio device list accordingly.
|
||||
|
||||
Within the Streaming and Recording section you can select invididual audio codecs and corresponding bitrate +
|
||||
for streaming and recording. Advanced users have the ability to change codec settings by clicking the gear symbol.
|
||||
|
||||
The Signal dection levels define at which level BUTT should treat the signal as present or absent. +
|
||||
These levels are used by the auto connect/disconnect or recording feature described below.
|
||||
|
||||
|
||||
Streaming
|
||||
---------
|
||||
Before you can start streaming you need to add a server first. If you have not added a server yet, +
|
||||
please refere to the quick start section of this manual.
|
||||
|
||||
To start streaming just click the play symbol. +
|
||||
BUTT will try to connect to the server until you press the stop button. +
|
||||
If the connection gets lost, BUTT will try to reconnect until the stop button is pressed +
|
||||
|
||||
You can stream in 5 different audio codecs: mp3, aac+, ogg/vorbis, ogg/opus and ogg/FLAC. +
|
||||
In case opus is selected the sample rate is always resampled to 48 kHz. +
|
||||
If you want to prevent BUTT from resampling, you should select 48 kHz as the device sample rate.
|
||||
|
||||
.Song name:
|
||||
If you want to inform the listener about which song is currently playing you +
|
||||
can do that on the +[Stream]+ tab. +
|
||||
You only need to type the song into the +Song Name+ input field +
|
||||
and hit Enter or click +[OK]+.
|
||||
|
||||
BUTT can also update the song automatically from a text file. +
|
||||
The first or the last line of the file must be the name of the song. +
|
||||
As soon as BUTT detects that the file has been changed, it updates the +
|
||||
name of the song on the server. +
|
||||
|
||||
To retrieve the current song name from an URL you can enter the URL into the +
|
||||
'Update song name from URL' field and enable the 'Activate' checkbox. +
|
||||
Set the 'Update interval' to the number of seconds you want BUTT to check for a new song name. +
|
||||
BUTT uses the first line from the server response for the song name update. +
|
||||
HTML tags are not parsed nor removed, so it is recommended use a URL that returns a +
|
||||
simple text file instead of a HTML formatted website.
|
||||
|
||||
If you run BUTT on macOS or Linux you can even transfer the current +
|
||||
song name from an audio player to BUTT. +
|
||||
Supported audio players: +
|
||||
Linux: Rhythmbox, Banshee, Clementine, Cantana, Spotify +
|
||||
MacOS: iTunes/Music, Vox, Spotify
|
||||
Windows: Not supported
|
||||
|
||||
As broadcasting with Icecast and Shoutcast is not realtime, the +
|
||||
listener receives the audio content with a few seconds of delay. +
|
||||
This delay introduces an offset between the current song name and +
|
||||
the actual song that is playing. To prevent confusion on the listeners side +
|
||||
you can add a delay to the automatic song update.
|
||||
|
||||
In case you want to add a prefix and/or a suffix to your song name +
|
||||
you can do that by entering the desired text into the corresponding +
|
||||
input field.
|
||||
|
||||
.Stream infos:
|
||||
In the +[Main]+ settings window you can add stream infos. +
|
||||
This allows you to deliver more details about your stream. +
|
||||
For example the genre of your music, description of your station, web address etc. +
|
||||
|
||||
Unfortunately, it is not possible to update stream infos during a broadcast. +
|
||||
You need to reconnect for updating the stream infos. +
|
||||
|
||||
For the name and description fields you may use the same placeholder variables as you can +
|
||||
in the recording file/path. Activate the 'Expand variables' checkbox to enable it.
|
||||
|
||||
.Automatic streaming:
|
||||
If you activate the checkbox 'Start streaming after launch' BUTT will +
|
||||
automatically connect to the server as soon as the application has been started.
|
||||
|
||||
BUTT can also connect and disconnect depending on the audio signal level: +
|
||||
|
||||
To connect automatically if a signal is present for a certain amount of time +
|
||||
enter an integral number larger than 0 into the 'Start if signal is present for [...] seconds' field +
|
||||
and activate the checkbox.
|
||||
|
||||
To disconnect automatically if the signal is absent for a certain amount of time +
|
||||
enter an integral number larger than 0 into the 'Stop if signal is absent for [...] seconds' field +
|
||||
and activate the checkbox.
|
||||
|
||||
The default signal detection levels are set to -50.0 dB and can be independently changed +
|
||||
for the present and absent signal cases in the +[Audio]+ tab.
|
||||
|
||||
Shoutcast
|
||||
---------
|
||||
Basically BUTT is a Shoutcast 1 source client and does not support the native Shoutcast 2 protocol. +
|
||||
However, Shoutcast 2 servers are compatible with Shoutcast 1 client by default. So you can also +
|
||||
connect to Shoutcast 2 servers with BUTT. +
|
||||
|
||||
To add a Shoutcast server, open the settings and click on [ADD]. Now enter the server address, port and +
|
||||
password. If you did not setup the Shoutcast server by your own, you will get the required information from +
|
||||
your streaming hoster. +
|
||||
|
||||
If you need to enter Shoutcast 2 specific login data like a user name or a stream ID you can add this +
|
||||
to your password as follows: +
|
||||
|
||||
Let's assume your user name is *MyUser*, your password is *MyPassword* and the *stream ID* is *3*. +
|
||||
To add the user name to the password field enter the following: +
|
||||
|
||||
MyUser:MyPassword
|
||||
|
||||
The stream ID 3 can be appended after the password like this: +
|
||||
|
||||
MyUser:MyPassword:#3
|
||||
|
||||
|
||||
Icecast
|
||||
-------
|
||||
To add an Icecast server open the settings and click on [ADD]. Now enter the server address, port and +
|
||||
credentials like, user, password and mounpoint. If you did not setup the Icecast server by your own, +
|
||||
you will get the required information from your streaming hoster.
|
||||
|
||||
|
||||
Secure Connection over SSL/TLS (Icecast only)
|
||||
---------------------------------------------
|
||||
To enable encryption for an icecast server, you only have to activate the +
|
||||
'Use SSL/TLS' checkbox in the server settings. Please bear in mind that the +
|
||||
server must be configured with SSL/TLS support in order to make this working. +
|
||||
The connection will fail if you activate SSL/TLS for a server which does not +
|
||||
support encryption. +
|
||||
If the certficicate validation fails, BUTT will ask you if you want to trust +
|
||||
that certificate anyway. If you click on +[TRUST]+ BUTT will establish the +
|
||||
connection and remembers the decision for that certificate and server. +
|
||||
By pressing the button '[Revoke certificate trust]' you can revoke that +
|
||||
decision. +
|
||||
If you want to specify your own file or folder with CA certificates, +
|
||||
you can enter the path to the file or folder in the +[TLS]+ tab of the +
|
||||
settings window. Usually you should not need to enter any information there.
|
||||
|
||||
|
||||
WebRTC (WHIP)
|
||||
-------------
|
||||
Since version 1.42.0 BUTT is able to stream to a WebRTC WHIP server. +
|
||||
WebRTC is a relatively new technology for realtime peer-to-peer communication for +
|
||||
video and audio. Although WebRTC is point-to-point by default, with the additional WHIP protocol +
|
||||
it is also possible to have a client/server connection like it is used by Icecast and Shoutcast. +
|
||||
|
||||
The biggest advantage of using WebRTC is its low latency which can be lower than 200 ms. However, +
|
||||
to accomblish such a low latency, the WebRTC protocol has to make use of certain techniques that +
|
||||
require a perfectly stable connection to the server. Otherwise small interruptions of the audio signal +
|
||||
may occur or the audio signal may sound speed up or slowed down for a short period of time. +
|
||||
Because of this, it is not recommanded to use WebRTC for streaming music but rather use it +
|
||||
for situations where you need near real time voice broadcasting like for a live commentary of a sports event.
|
||||
|
||||
To add a WebRTC server open the settings and click on [ADD]. Now select WebRTC and enter your WHIP URL. +
|
||||
If needed you can also enter a STUN or TURN server address into the ICE server field and a Bearer Authentication Token. +
|
||||
|
||||
WebRTC does only work with opus, so please make sure that you have opus selected als streaming codec. +
|
||||
|
||||
Recording
|
||||
---------
|
||||
BUTT is able to record and stream simultaneously in different bit rates. +
|
||||
For example you can stream with 96 kbit and record with 192 kbit. +
|
||||
Recording is possible in mp3, aac+, ogg/vorbis, ogg/opus, FLAC or wav.
|
||||
|
||||
To record your session you first need to select the destination folder and specify a file name +
|
||||
in the +[Record]+ tab. +
|
||||
BUTT will replace specific date variables with the current time and date.
|
||||
For example +rec_(%m_%d_%y).mp3+ expands to +rec_(03_28_2008).mp3+. +
|
||||
Other possible time variables are +%H+ (hours) +%M+ (minutes) +%S+ (seconds).
|
||||
Refer to the table below for more supported date variables.
|
||||
|
||||
With the +%i+ variable you can add an index number to your file name. +
|
||||
This means with +rec_%i.mp3+ BUTT first tries to record to +rec_0.mp3+. In case that +
|
||||
file already exists, BUTT tries +rec_1.mp3+ ... +
|
||||
|
||||
To manually start the recording simply press the record symbol. +
|
||||
To stop recording just click on the record symbol again. +
|
||||
|
||||
.Automatic recording:
|
||||
If the 'start recording when connected' checkbox is activated BUTT starts the +
|
||||
recording immediately after a connection with the server has been established. +
|
||||
Vice versa BUTT will stop the recording if the 'Stop recording when disconnected' checkbox +
|
||||
is active. +
|
||||
Additionally you can tell BUTT to immediately start recording after the application has been +
|
||||
launched by checking the 'Start recording after launch' box. +
|
||||
|
||||
To start recording automatically if a signal is present for a certain amount of time +
|
||||
enter an integral number larger than 0 into the 'Start if signal is present for [...] seconds' field.
|
||||
|
||||
To stop recording automatically if the signal is absent for a certain amount of time +
|
||||
enter an integral number larger than 0 into the 'Stop if signal is absent for [...] seconds' field.
|
||||
|
||||
The default signal detection levels are set to -50.0 dB and can be independently changed +
|
||||
for the present and absent signal cases in the +[Audio]+ tab.
|
||||
|
||||
You can also tell BUTT to split your recording into +
|
||||
separate files every *n* minutes. Just enter a number higher than 0 +
|
||||
into the 'Split file every [..] minutes' field. +
|
||||
|
||||
Let's assume your file name is +rec_(%m_%d_%y)\_%i.mp3+ Then the first file is +
|
||||
expanded to +rec\_(03_28_2008)\_0-1.mp3+, the second after *n* minutes to +
|
||||
+rec_(03_28_2008)\_0-2.mp3+, the third to +rec_(03_28_2008)_0-3.mp3+, you got it. +
|
||||
|
||||
If the 'sync to full hour' checkbox is activated the automatic file splitting +
|
||||
is synchronized to the full hour. This means if the current time is '8:55' and file +
|
||||
splitting is set to '15 minutes', the second file starts at '9:00' and the third +
|
||||
at '9:15'. +
|
||||
If you want to split the recording now, just click the '[Split now]' button.
|
||||
|
||||
*Supported variables:*
|
||||
[cols="1,8"]
|
||||
|===
|
||||
|Variable|Meaning
|
||||
|
||||
|%N
|
||||
|Server name
|
||||
|
||||
|%a
|
||||
|abbreviated weekday name (e.g. Fri)
|
||||
|
||||
|%A
|
||||
|full weekday name (e.g. Friday)
|
||||
|
||||
|%b
|
||||
|abbreviated month name (e.g. Oct)
|
||||
|
||||
|%B
|
||||
|full month name (e.g. October)
|
||||
|
||||
|%d
|
||||
|day of the month, as a number (1-31)
|
||||
|
||||
|%H
|
||||
|hour, 24 hour format (0-23)
|
||||
|
||||
|%I
|
||||
|hour, 12 hour format (1-12)
|
||||
|
||||
|%j
|
||||
|day of the year, as a number (1-366)
|
||||
|
||||
|%m
|
||||
|month as a number (1-12).
|
||||
|
||||
|%M
|
||||
|minute as a number (0-59)
|
||||
|
||||
|%p
|
||||
|AM or PM
|
||||
|
||||
|%S
|
||||
|second as a number (0-59)
|
||||
|
||||
|%U
|
||||
|week of the year, (0-53), where week 1 has the first Sunday
|
||||
|
||||
|%w
|
||||
|weekday as a decimal (0-6), where Sunday is 0
|
||||
|
||||
|%W
|
||||
|week of the year, (0-53), where week 1 has the first Monday
|
||||
|
||||
|%y
|
||||
|year in decimal, without the century (0-99)
|
||||
|
||||
|%Y
|
||||
|year in decimal, with the century
|
||||
|
||||
|%Z
|
||||
|time zone name
|
||||
|===
|
||||
|
||||
DSP
|
||||
---
|
||||
The DSP section contains two sound processors. A 10-band EQ and a Dynamic Range Compressor. +
|
||||
With the 'Stream' and the 'Rec' checkboxes you can decide if a sound processor should be activated +
|
||||
for the streaming and/or recording signal chain.
|
||||
|
||||
.10-Band Equalizer:
|
||||
The equalizer allows you to change the gain of certain frequency bands from -15 dB to 15 dB. +
|
||||
Note for professionals: The equalizer uses a Q of 2 on each frequency band.
|
||||
|
||||
.Dynamic Range Compressor:
|
||||
Dynamic range compression is used to reduce the difference between +
|
||||
loud and quiet parts of the signal, and thus provide a more consistent +
|
||||
experience for listeners. It is used by virtually all professional +
|
||||
radio stations. +
|
||||
|
||||
The recommended procedure for configuring the compressor is as follows: +
|
||||
|
||||
1. Start playing the loudest audio source you intend to broadcast +
|
||||
(typically music), and line it up with the master gain slider. +
|
||||
|
||||
2. Enable the compressor, and adjust the threshold and gain to suit. +
|
||||
The attack and release times can generally be kept as they are, unless +
|
||||
you have a particular reason to change them. You will notice that the +
|
||||
overall signal level goes down, as it is being compressed. +
|
||||
|
||||
3. Adjust the makeup gain to bring the signal back to its original level. +
|
||||
|
||||
4. Now test with a quieter audio source (such as your voice), and see +
|
||||
that the level of that is boosted in comparison. If the quieter source +
|
||||
is still too quiet, reset the makeup gain to 0 and repeat from step 2 +
|
||||
onwards, until you have a satisfactory result. +
|
||||
|
||||
This procedure can take some time to find the optimum settings, which +
|
||||
are determined by listening as much as by metering, but it generally +
|
||||
only needs to be done once - BUTT will save your settings, so once you +
|
||||
have values that work well for your content, you probably don't need +
|
||||
to adjust them again. +
|
||||
|
||||
As a rough guide, music should be compressed relatively subtly, with a +
|
||||
fairly high threshold and a ratio typically between 2 and 3. Pure +
|
||||
speech content can be compressed much more dramatically, with a low +
|
||||
threshold and a ratio of 5 or more; this will make the speech easier +
|
||||
for the listener to understand, and will also reduce the differences +
|
||||
between different speakers or by not keeping a very consistent +
|
||||
distance from the microphone. +
|
||||
|
||||
For mixed speech and music broadcasting, it is recommended to set +
|
||||
BUTT's compression as for music, and then have an additional +
|
||||
compressor (typically a hardware module) between the microphones and +
|
||||
the final mix. +
|
||||
|
||||
To check if the signal power exceeds the threshold, the compressor usually +
|
||||
averages the signal power over time and compares it with the threshold. +
|
||||
This averaging process reduces the speed of the compressor. In case you need +
|
||||
a very fast responding compressor you can activate the 'Aggressive Mode' option. +
|
||||
With this option enabled the compressor does not average the signal power +
|
||||
over time anymore.
|
||||
|
||||
MIDI
|
||||
----
|
||||
In the +[MIDI]+ tab you can set up a MIDI device to control BUTT via MIDI CC and +
|
||||
NOTE ON messages. +
|
||||
|
||||
To activate the MIDI interface simply select your MIDI device from the 'MIDI Device' +
|
||||
drop down menu. +
|
||||
|
||||
The 'MIDI indicator light' will blink if BUTT receives a MIDI message. This allows
|
||||
you to verify the connection between BUTT and your MIDI device. +
|
||||
|
||||
The 'MIDI Command' list shows you which parts of BUTT can be controlled via CC and NOTE ON +
|
||||
messages. By default all commands are disabled. To enable a command select the command from +
|
||||
the list and click on *Enable*. +
|
||||
|
||||
*MIDI implementation table for CC messages*
|
||||
[cols="3,2,3"]
|
||||
|===
|
||||
|Command|CC value|Action
|
||||
|
||||
|Start/Stop broadcasting
|
||||
|> 63 +
|
||||
< 64
|
||||
|Starts broadcasting +
|
||||
Stops broadcasting
|
||||
|
||||
|Start broadcasting
|
||||
|Any
|
||||
|Starts broadcasting
|
||||
|
||||
|Stop broadcasting
|
||||
|Any
|
||||
|Stops broadcasting
|
||||
|
||||
|Start/Stop recording
|
||||
|> 63 +
|
||||
< 64
|
||||
| Starts recording +
|
||||
Stops recording
|
||||
|
||||
|Start recording
|
||||
|Any
|
||||
|Starts recording
|
||||
|
||||
|Stop recording
|
||||
|Any
|
||||
|Stops recording
|
||||
|
||||
|Master Gain
|
||||
|0-127 (absolute mode)
|
||||
|Scales linearly between -24 dB and +24 dB
|
||||
|
||||
|Streaming Gain
|
||||
|0-127 (absolute mode)
|
||||
|Scales linearly between -18 dB and +18 dB
|
||||
|
||||
|Recording Gain
|
||||
|0-127 (absolute mode)
|
||||
|Scales linearly between -18 dB and +18 dB
|
||||
|
||||
|Primary Device Gain
|
||||
|0-127 (absolute mode)
|
||||
|Scales linearly between -18 dB and +18 dB
|
||||
|
||||
|Secondary Device Gain
|
||||
|0-127 (absolute mode)
|
||||
|Scales linearly between -18 dB and +18 dB
|
||||
|
||||
|Cross fader
|
||||
|0-127 (absolute mode)
|
||||
|Blends between Primary (0) and Secondary (127) Device
|
||||
|
||||
|Mute/Unmute Primary Device
|
||||
| Any
|
||||
| Toggles mute state
|
||||
|
||||
|Mute/Unmute Secondary Device
|
||||
| Any
|
||||
| Toggles mute state
|
||||
|
||||
|===
|
||||
|
||||
|
||||
*MIDI implementation table for NOTE ON messages* +
|
||||
|
||||
Instead of a NOTE OFF message, some MIDI devices send a NOTE ON message with a value +
|
||||
lower than 64 when a key is released. Therefore, BUTT does only accept MIDI ON +
|
||||
messages with a value higher than 63 to prevent reacting falsely on key releases. +
|
||||
|
||||
[cols="3,2,3"]
|
||||
|===
|
||||
|Command|NOTE ON value|Action
|
||||
|
||||
|Start/Stop broadcasting
|
||||
|> 63
|
||||
|Toggles broadcasting state
|
||||
|
||||
|Start broadcasting
|
||||
|> 63
|
||||
|Starts broadcasting
|
||||
|
||||
|Stop broadcasting
|
||||
|> 63
|
||||
|Stops broadcasting
|
||||
|
||||
|Start/Stop recording
|
||||
|> 63
|
||||
|Toggles recording state
|
||||
|
||||
|Start recording
|
||||
|> 63
|
||||
|Starts recording
|
||||
|
||||
|Stop recording
|
||||
|> 63
|
||||
|Stops recording
|
||||
|
||||
|Master Gain (not supported)
|
||||
|Any
|
||||
|Not supported
|
||||
|
||||
|Streaming Gain (not supported)
|
||||
|Any
|
||||
|Not supported
|
||||
|
||||
|Recording Gain (not supported)
|
||||
|Any
|
||||
|Not supported
|
||||
|
||||
|Primary Device Gain (not supported)
|
||||
|Any
|
||||
|Not supported
|
||||
|
||||
|Secondary Device Gain (not supported)
|
||||
|Any
|
||||
|Not supported
|
||||
|
||||
|Cross fader (not supported)
|
||||
|Any
|
||||
|Not supported
|
||||
|
||||
|Mute/Unmute Primary Device
|
||||
| Any
|
||||
| Toggles mute state
|
||||
|
||||
|Mute/Unmute Secondary Device
|
||||
| Any
|
||||
| Toggles mute state
|
||||
|
||||
|===
|
||||
|
||||
There are several options available to adapt BUTT to your MIDI controller:
|
||||
|
||||
.Channel:
|
||||
Select the channel where your MIDI controller sends MIDI messages to.
|
||||
|
||||
.CC:
|
||||
Type in a number from 0 to 127 which corresponds to the control element (button, knob, slider) +
|
||||
of your MIDI controller.
|
||||
|
||||
.Learn:
|
||||
If you don't know the channel of your MIDI device or the CC number of your control element +
|
||||
you can activate the *learning mode*. After pressing the '[Learn]' button, BUTT will +
|
||||
wait for an incoming CC message and set the channel and CC number for you automatically. +
|
||||
|
||||
.CC Mode:
|
||||
Volume controls can be controlled in two different ways:
|
||||
|
||||
1. In *absolute mode* BUTT maps the incoming CC values 0-127 linearly to its internal range.
|
||||
In case of a volume slider this means 0 maps to min and 127 to max volume. +
|
||||
+
|
||||
If you switch back and forth between controlling a slider via the mouse and via your MIDI controller +
|
||||
the UI and your MIDI controller will get out of sync which will cause value jumps when +
|
||||
controlling a slider via MIDI after you changed the slider position via mouse before. +
|
||||
To prevent those jumps activate the *Soft takeover* option. +
|
||||
|
||||
2. The *relative modes* interpret the incoming CC values as increments or decrements. +
|
||||
Select the relative mode that fits to your MIDI controller.
|
||||
|
||||
|
||||
GUI settings
|
||||
------------
|
||||
Within the +[GUI]+ settings you can change certain settings to your personal +
|
||||
preferences.
|
||||
|
||||
.Language:
|
||||
In case BUTT does not correctly detect your system language or you prefere a +
|
||||
different one you can select your preferred language here. +
|
||||
After changing the language a restart of BUTT is required.
|
||||
|
||||
.Display Color:
|
||||
Change the text and background color of the main display to your favorite color.
|
||||
|
||||
.VU meter:
|
||||
Select between gradient or solid colors for VU meter. For better visibility +
|
||||
the solid colors mode is recommended. +
|
||||
If the 'Always show tabs' checkbox is unchecked the Streaming and Recording tabs +
|
||||
on the VU meter are only visible if you hover your mouse over the meter. +
|
||||
|
||||
.Attach settings window to main window:
|
||||
If checked, the settings window will stick to the right side of the BUTT window.
|
||||
|
||||
.Stay always on top:
|
||||
If checked, BUTT will always be on top of other application windows.
|
||||
|
||||
.Remember main window position:
|
||||
If checked, BUTT will open on the previous position and screen. +
|
||||
In case the previous screen is not available BUTT will open on the default screen. +
|
||||
Additionally, this function also remembers the size of the log window.
|
||||
|
||||
.Hide log window after start up:
|
||||
If checked, BUTT will open with the log window hidden.
|
||||
|
||||
.Change display mode every 5 seconds:
|
||||
If checked, the display rotates automatically through the states +
|
||||
online duration, data sent, recording duration and data recorded.
|
||||
|
||||
.Start minimized:
|
||||
If checked, BUTT will start minimized to your Taskbar or Dock (macOS).
|
||||
|
||||
.Disable gain control:
|
||||
If checked, the gain control slider on the main window will be disabled. +
|
||||
This prevents users from accidentally changing the volume.
|
||||
|
||||
.Show listeners:
|
||||
If checked, BUTT retrieves the number of current listeners from +
|
||||
your server every 3 seconds. +
|
||||
If available the number of listeners are shown on the lower right corner at the display. +
|
||||
|
||||
NOTE: BUTT derives the URL for listener statistics from the server settings. +
|
||||
Usually this works only if you have a plain Icecast or Shoutcast server. +
|
||||
In case you are using a stream hoster they usually have a more complex setup +
|
||||
which provides the listener stats on a different mountpoint or URL. +
|
||||
For these situation you can enter a specific mountpoint or URL which BUTT will use +
|
||||
instead. +
|
||||
For example if you connect to the mountpoint */stream* but you want the listeners +
|
||||
from mountpoint */live*, simply enter */live* into the *Custom listener mountpoint* +
|
||||
field in the server settings. +
|
||||
+
|
||||
If you are unsure which URL or mountpoint to use, please contact your stream hoster.
|
||||
|
||||
|
||||
The BUTT agent (Windows only)
|
||||
-----------------------------
|
||||
With version 0.1.29 a little helper tool called BUTT agent was introduced. +
|
||||
The main purpose of the BUTT agent is to make it possible to minimize BUTT +
|
||||
into the windows system tray. +
|
||||
Minimizing to tray is not the only feature, though. You also have the +
|
||||
ability to let it display balloon notifications for connects/disconnects +
|
||||
and for song updates. If you want to start BUTT at windows start you can +
|
||||
also enable/disable this with the agent. +
|
||||
BUTT starts the agent automatically if the checkbox 'Minimize to tray' +
|
||||
is enabled. If you want to use the balloon notifications you should activate +
|
||||
the 'Start agent at startup' checkbox in the +[Main]+ settings tab. +
|
||||
Once the agent has been started you will find it in the system tray. +
|
||||
From here you can manage the minimized BUTT instances and activate the +
|
||||
features mentioned above. A left click on the tray icon minimizes or raises +
|
||||
the last BUTT instance. A right click opens up a context menu with more +
|
||||
options. +
|
||||
The BUTT agent closes itself if no more BUTT instance is running.
|
||||
|
||||
|
||||
|
||||
Command line control
|
||||
--------------------
|
||||
BUTT can be controlled from command line. +
|
||||
If you want you can even control BUTT from a remote computer. +
|
||||
Please refer to the section below for more information on that.
|
||||
|
||||
|
||||
Command line options
|
||||
--------------------
|
||||
BUTT has several command line options which can be seperated into two modes +
|
||||
which are the operating mode and control mode.
|
||||
|
||||
.Operating Mode:
|
||||
These options change the behaviour of the instance you are about to start. +
|
||||
|
||||
'-c <path>:' +
|
||||
This option allows you to select a different configuration path. It is useful if you +
|
||||
want to run several BUTT instances with different configurations. Just pass a different +
|
||||
configuration file with the -c option for every instance. +
|
||||
|
||||
'-L:' +
|
||||
Prints available audio devices.
|
||||
|
||||
'-A:' +
|
||||
This option tells BUTT to accept control commands from your network or even the internet. +
|
||||
|
||||
CAUTION: When using this option everyone in your network or even internet may +
|
||||
control your BUTT instance. Please use this option only if you have secured your network appropriately.
|
||||
|
||||
'-U:' +
|
||||
(uppercase U) +
|
||||
The command server will use UDP instead of TCP. If you pass the -U flag here
|
||||
you also need to pass it when sending control commands.
|
||||
|
||||
'-x:' +
|
||||
Use this option if you do not want to run a command server at all. This will also disable
|
||||
receiving commands from your local machine.
|
||||
|
||||
'-p <port>:' +
|
||||
With this option you can define the port of the command server. The default port is 1256.
|
||||
Use this option for example if you have several BUTT instances that you want to control from
|
||||
command line.
|
||||
|
||||
.Control Mode:
|
||||
With these options you can send control commands to a running BUTT instance. +
|
||||
Note that you can send these commands from either BUTT or butt-client binaries. +
|
||||
|
||||
'-s [name]:' +
|
||||
(lowercase s) +
|
||||
This command tells BUTT to connect to the server 'name'. If the 'name' parameter is omitted,
|
||||
BUTT will connect to the currently selected server.
|
||||
|
||||
'-d:' +
|
||||
When receiving this command, BUTT will disconnect from the current server.
|
||||
|
||||
'-r:' +
|
||||
This command starts the recording engine.
|
||||
|
||||
'-t:' +
|
||||
Use this option to stop the recording.
|
||||
|
||||
'-n:' +
|
||||
In case a recording session is active this option splits the current file +
|
||||
like it would if you press the +[Split now]+ button in the user interface.
|
||||
|
||||
'-q:' +
|
||||
Closes BUTT gracefully.
|
||||
|
||||
'-u <song name>:' +
|
||||
(lowercase u) +
|
||||
Sends a new song name to the server.
|
||||
|
||||
'-M <threshold>:' +
|
||||
Sends a new streaming signal threshold time to the server. +
|
||||
Minimum value is 0.1. Send 0 to disable automatic stream start.
|
||||
|
||||
'-m <threshold>:' +
|
||||
Sends a new streaming silence threshold time to the server. +
|
||||
Minimum value is 0.1. Send 0 to disable automatic stream stop.
|
||||
|
||||
'-O <threshold>:' +
|
||||
Sends a new recording signal threshold time to the server. +
|
||||
Minimum value is 0.1. Send 0 to disable automatic recording start.
|
||||
|
||||
'-o <threshold>:' +
|
||||
Sends a new recording silence threshold time to the server. +
|
||||
Minimum value is 0.1. Send 0 to disable automatic recording stop.
|
||||
|
||||
'-S:' +
|
||||
(uppercase S) +
|
||||
Requests a status information packet. The answer will be of the form: +
|
||||
`connected: 1` +
|
||||
`connecting: 0` +
|
||||
`recording: 1` +
|
||||
`signal present: 1` +
|
||||
`signal absent: 0` +
|
||||
`stream seconds: 10` +
|
||||
`stream kBytes: 164` +
|
||||
`record seconds: 38` +
|
||||
`record kBytes: 3581` +
|
||||
`volume left: -6.2` +
|
||||
`volume right: -6.2` +
|
||||
`song: Stanley Clarke Trio - Under the Bridge` +
|
||||
`record path: /home/butt/recordings/recording_20220312.flac` +
|
||||
`listeners: 256` +
|
||||
|
||||
|
||||
'-a <address>:' +
|
||||
Use this option to control a BUTT instance that is running on a remote computer. +
|
||||
In order to control a remote BUTT instance the BUTT instance must have been +
|
||||
started with the -A option. The parameter 'address' can be either a IP address or a hostname.
|
||||
|
||||
'-p <port>:' +
|
||||
This should be set to the same port that has been given to the BUTT instance you want to control. +
|
||||
By default the command will be sent to port 1256.
|
||||
|
||||
|
||||
'-U:' +
|
||||
(uppercase U) +
|
||||
Use this option to send commands via UDP instead of TCP.
|
||||
|
||||
|
||||
Uninstall
|
||||
---------
|
||||
.MacOS:
|
||||
Delete the *butt.app* from your 'Application' folder and +
|
||||
remove the configuration file from '/Users/<username>/.buttrc' +
|
||||
|
||||
.Windows:
|
||||
Run the Uninstaller from the BUTT folder in your windows start menu. +
|
||||
|
||||
.Linux/MinGW:
|
||||
Run +sudo make uninstall+ from the source tree and +
|
||||
remove the configuration file from '/home/<username>/.buttrc' +
|
||||
|
||||
|
||||
Contact
|
||||
-------
|
||||
butt at danielnoethen dot de
|
||||
|
||||
|
||||
Donate
|
||||
------
|
||||
Paypal:
|
||||
https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=LTRSQNTWN4L6L&source=url[paypal@danielnoethen.de] +
|
||||
Patreon: https://www.patreon.com/bePatron?u=31552247[Become a Patron] +
|
||||
Apple Pay, Google Pay and more: https://donorbox.org/butt[Donorbox] +
|
||||
|
||||
.Cryptocurrencies: +
|
||||
Bitcoin: bc1q4uq7h464rsu2cudrmuuqmc4tcr98d0edrhe5au +
|
||||
Litecoin: Ld9gntf8fsYpmVcbstFkzz5R3sNPC3AhTx +
|
||||
Monero: 85u8DacasxPNvKzY5kEiprBnbydDqg26yGAVEw7mdwccNFsrXMWCE4VQnV2JVfh5BTRheNnpDJqYjbqPrVRLEPAKP3dsYgc +
|
||||
|
||||
If you want to use a different cryptocurrency please contact me.
|
||||
22
THANKS
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
butt THANKS file
|
||||
|
||||
butt has originally been written by Daniel Nöthen. Many people have further
|
||||
contributed to butt by reporting problems, suggesting various improvements,
|
||||
writing tutorials or even submitting code. Thanks to all of you!
|
||||
|
||||
Special thanks go to:
|
||||
Heinrich Unrau, for suggestion me the name "butt"
|
||||
Thomas Ziebura, for teaching me C
|
||||
Jorge Suárez de Lis, for creating ubuntu packages
|
||||
Dominik Durner, for creating a patch for icecast stream infos
|
||||
Subrat (ipapuna) Nayak, for creating the icon and releasing it under cc
|
||||
Mikko Pikarinen, for writing a huge patch with some nice features
|
||||
Melchor Garau Madrigal, for forking butt and releasing it on github with new features
|
||||
Thomas Preece, for adding the dynamic range compressor
|
||||
Ivan Radolovic, for developing the butt agent
|
||||
Hossam Hammady, for adding threshold limit control commands and butt-client
|
||||
|
||||
Not to forget the developers of all the libraries butt depends on!
|
||||
|
||||
Drop me a mail in case I forgot to mention you ;-)
|
||||
|
||||
1435
aclocal.m4
vendored
Normal file
180
butt.1
Normal file
|
|
@ -0,0 +1,180 @@
|
|||
'\" t
|
||||
.\" Title: butt
|
||||
.\" Author: [see the "AUTHOR(S)" section]
|
||||
.\" Generator: Asciidoctor 2.0.10
|
||||
.\" Date: 2022-04-20
|
||||
.\" Manual: BUTT
|
||||
.\" Source: BUTT
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "BUTT" "1" "2022-04-20" "BUTT" "BUTT"
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.ss \n[.ss] 0
|
||||
.nh
|
||||
.ad l
|
||||
.de URL
|
||||
\fI\\$2\fP <\\$1>\\$3
|
||||
..
|
||||
.als MTO URL
|
||||
.if \n[.g] \{\
|
||||
. mso www.tmac
|
||||
. am URL
|
||||
. ad l
|
||||
. .
|
||||
. am MTO
|
||||
. ad l
|
||||
. .
|
||||
. LINKSTYLE blue R < >
|
||||
.\}
|
||||
.SH "NAME"
|
||||
butt \- Easy to use, multi OS streaming tool
|
||||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
\fBbutt\fP [\-h | \-v | \-s [name] | \-u <song name> | \-M <streaming signal threshold> | \-m <streaming silence threshold> | \-O <recording signal threshold> | \-o <recording silence threshold> | \-Sdrtqn | \-c <config_path>] [\-A | \-U | \-x] [\-a <addr>] [\-p <port>]
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
\fBbutt\fP (broadcast using this tool) is an easy to use, multi OS streaming tool.
|
||||
It supports ShoutCast and IceCast and runs on Linux, MacOS and Windows.
|
||||
The main purpose of \fBbutt\fP is to stream live audio data from your computers Mic or Line input
|
||||
to an Shoutcast or Icecast server. Recording is also possible.
|
||||
It is NOT intended to be a server by itself or automatically stream a set of audio files.
|
||||
.SH "OPTIONS"
|
||||
.sp
|
||||
Options:
|
||||
.sp
|
||||
\fB\-h\fP
|
||||
.RS 4
|
||||
Print help
|
||||
.RE
|
||||
.sp
|
||||
\fB\-v\fP
|
||||
.RS 4
|
||||
Print version information
|
||||
.RE
|
||||
.sp
|
||||
Options for operating mode:
|
||||
.sp
|
||||
\fB\-c <path>\fP
|
||||
.RS 4
|
||||
Path to configuration file
|
||||
.RE
|
||||
.sp
|
||||
\fB\-A\fP
|
||||
.RS 4
|
||||
Command server will be accessible from your network/internet (default: localhost only)
|
||||
.RE
|
||||
.sp
|
||||
\fB\-U\fP
|
||||
.RS 4
|
||||
Command server will use UDP instead of TCP
|
||||
.RE
|
||||
.sp
|
||||
\fB\-x\fP
|
||||
.RS 4
|
||||
Do not start a command server for receiving commands
|
||||
.RE
|
||||
.sp
|
||||
\fB\-p <port>\fP
|
||||
.RS 4
|
||||
Port where the command server shall listen to (default: 1256)
|
||||
.RE
|
||||
.sp
|
||||
Options for control mode:
|
||||
.sp
|
||||
\fB\-s [name]\fP
|
||||
.RS 4
|
||||
Connect to streaming server
|
||||
.RE
|
||||
.sp
|
||||
\fB\-d\fP
|
||||
.RS 4
|
||||
Disconnect from streaming server
|
||||
.RE
|
||||
.sp
|
||||
\fB\-r\fP
|
||||
.RS 4
|
||||
Start recording
|
||||
.RE
|
||||
.sp
|
||||
\fB\-t\fP
|
||||
.RS 4
|
||||
Stop recording
|
||||
.RE
|
||||
.sp
|
||||
\fB\-n\fP
|
||||
.RS 4
|
||||
Split recording
|
||||
.RE
|
||||
.sp
|
||||
\fB\-q\fP
|
||||
.RS 4
|
||||
Quit butt
|
||||
.RE
|
||||
.sp
|
||||
\fB\-u <song name>\fP
|
||||
.RS 4
|
||||
update song name
|
||||
.RE
|
||||
.sp
|
||||
\fB\-S\fP
|
||||
.RS 4
|
||||
Request status
|
||||
.RE
|
||||
.sp
|
||||
\fB\-M <seconds>\fP
|
||||
.RS 4
|
||||
Set streaming signal threshold
|
||||
.RE
|
||||
.sp
|
||||
\fB\-m <seconds>\fP
|
||||
.RS 4
|
||||
Set streaming silence threshold
|
||||
.RE
|
||||
.sp
|
||||
\fB\-O <seconds>\fP
|
||||
.RS 4
|
||||
Set recording signal threshold
|
||||
.RE
|
||||
.sp
|
||||
\fB\-o <seconds>\fP
|
||||
.RS 4
|
||||
Set recording silence threshold
|
||||
.RE
|
||||
.sp
|
||||
\fB\-U\fP
|
||||
.RS 4
|
||||
Connect via UDP instead of TCP
|
||||
.RE
|
||||
.sp
|
||||
\fB\-a <address>\fP
|
||||
.RS 4
|
||||
Address of the \fBbutt\fP instance to be controlled (default: 127.0.0.1)
|
||||
.RE
|
||||
.sp
|
||||
\fB\-p <port>\fP
|
||||
.RS 4
|
||||
Port of the \fBbutt\fP instance to be controlled (default: 1256)
|
||||
.RE
|
||||
.SH "RESSOURCES"
|
||||
.sp
|
||||
Project web site: \c
|
||||
.URL "https://danielnoethen.de/butt" "" ""
|
||||
.SH "SEE ALSO"
|
||||
.sp
|
||||
A more detailed description can be found in the manual at
|
||||
.URL "http://danielnoethen.de/butt/manual.html" "" ""
|
||||
.SH "FILES"
|
||||
.sp
|
||||
~/.buttrc
|
||||
.RS 4
|
||||
\fBbutt\fP configuration file.
|
||||
.RE
|
||||
.SH "BUGS"
|
||||
.sp
|
||||
Please contact me at \c
|
||||
.MTO "butt\(atdanielnoethen.de" "" " "
|
||||
if you find any bugs.
|
||||
.SH "AUTHORS"
|
||||
.sp
|
||||
\fBbutt\fP was written by Daniel Nöthen and other contributors.
|
||||
348
compile
Executable file
|
|
@ -0,0 +1,348 @@
|
|||
#! /bin/sh
|
||||
# Wrapper for compilers which do not understand '-c -o'.
|
||||
|
||||
scriptversion=2018-03-07.03; # UTC
|
||||
|
||||
# Copyright (C) 1999-2021 Free Software Foundation, Inc.
|
||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
nl='
|
||||
'
|
||||
|
||||
# We need space, tab and new line, in precisely that order. Quoting is
|
||||
# there to prevent tools from complaining about whitespace usage.
|
||||
IFS=" "" $nl"
|
||||
|
||||
file_conv=
|
||||
|
||||
# func_file_conv build_file lazy
|
||||
# Convert a $build file to $host form and store it in $file
|
||||
# Currently only supports Windows hosts. If the determined conversion
|
||||
# type is listed in (the comma separated) LAZY, no conversion will
|
||||
# take place.
|
||||
func_file_conv ()
|
||||
{
|
||||
file=$1
|
||||
case $file in
|
||||
/ | /[!/]*) # absolute file, and not a UNC file
|
||||
if test -z "$file_conv"; then
|
||||
# lazily determine how to convert abs files
|
||||
case `uname -s` in
|
||||
MINGW*)
|
||||
file_conv=mingw
|
||||
;;
|
||||
CYGWIN* | MSYS*)
|
||||
file_conv=cygwin
|
||||
;;
|
||||
*)
|
||||
file_conv=wine
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
case $file_conv/,$2, in
|
||||
*,$file_conv,*)
|
||||
;;
|
||||
mingw/*)
|
||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||
;;
|
||||
cygwin/* | msys/*)
|
||||
file=`cygpath -m "$file" || echo "$file"`
|
||||
;;
|
||||
wine/*)
|
||||
file=`winepath -w "$file" || echo "$file"`
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# func_cl_dashL linkdir
|
||||
# Make cl look for libraries in LINKDIR
|
||||
func_cl_dashL ()
|
||||
{
|
||||
func_file_conv "$1"
|
||||
if test -z "$lib_path"; then
|
||||
lib_path=$file
|
||||
else
|
||||
lib_path="$lib_path;$file"
|
||||
fi
|
||||
linker_opts="$linker_opts -LIBPATH:$file"
|
||||
}
|
||||
|
||||
# func_cl_dashl library
|
||||
# Do a library search-path lookup for cl
|
||||
func_cl_dashl ()
|
||||
{
|
||||
lib=$1
|
||||
found=no
|
||||
save_IFS=$IFS
|
||||
IFS=';'
|
||||
for dir in $lib_path $LIB
|
||||
do
|
||||
IFS=$save_IFS
|
||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.dll.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/$lib.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/lib$lib.a"; then
|
||||
found=yes
|
||||
lib=$dir/lib$lib.a
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS=$save_IFS
|
||||
|
||||
if test "$found" != yes; then
|
||||
lib=$lib.lib
|
||||
fi
|
||||
}
|
||||
|
||||
# func_cl_wrapper cl arg...
|
||||
# Adjust compile command to suit cl
|
||||
func_cl_wrapper ()
|
||||
{
|
||||
# Assume a capable shell
|
||||
lib_path=
|
||||
shared=:
|
||||
linker_opts=
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.[oO][bB][jJ])
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fo"$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fe"$file"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
-I)
|
||||
eat=1
|
||||
func_file_conv "$2" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-I*)
|
||||
func_file_conv "${1#-I}" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-l)
|
||||
eat=1
|
||||
func_cl_dashl "$2"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-l*)
|
||||
func_cl_dashl "${1#-l}"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-L)
|
||||
eat=1
|
||||
func_cl_dashL "$2"
|
||||
;;
|
||||
-L*)
|
||||
func_cl_dashL "${1#-L}"
|
||||
;;
|
||||
-static)
|
||||
shared=false
|
||||
;;
|
||||
-Wl,*)
|
||||
arg=${1#-Wl,}
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for flag in $arg; do
|
||||
IFS="$save_ifs"
|
||||
linker_opts="$linker_opts $flag"
|
||||
done
|
||||
IFS="$save_ifs"
|
||||
;;
|
||||
-Xlinker)
|
||||
eat=1
|
||||
linker_opts="$linker_opts $2"
|
||||
;;
|
||||
-*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||
func_file_conv "$1"
|
||||
set x "$@" -Tp"$file"
|
||||
shift
|
||||
;;
|
||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||
func_file_conv "$1" mingw
|
||||
set x "$@" "$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
if test -n "$linker_opts"; then
|
||||
linker_opts="-link$linker_opts"
|
||||
fi
|
||||
exec "$@" $linker_opts
|
||||
exit 1
|
||||
}
|
||||
|
||||
eat=
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Wrapper for compilers which do not understand '-c -o'.
|
||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||
arguments, and rename the output as expected.
|
||||
|
||||
If you are trying to build a whole package this is not the
|
||||
right script to run: please start by reading the file 'INSTALL'.
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "compile $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
||||
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
|
||||
func_cl_wrapper "$@" # Doesn't return...
|
||||
;;
|
||||
esac
|
||||
|
||||
ofile=
|
||||
cfile=
|
||||
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
# So we strip '-o arg' only if arg is an object.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.obj)
|
||||
ofile=$2
|
||||
;;
|
||||
*)
|
||||
set x "$@" -o "$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*.c)
|
||||
cfile=$1
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then
|
||||
# If no '-o' option was seen then we might have been invoked from a
|
||||
# pattern rule where we don't need one. That is ok -- this is a
|
||||
# normal compilation that the losing compiler can handle. If no
|
||||
# '.c' file was seen then we are probably linking. That is also
|
||||
# ok.
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# Name of file we expect compiler to create.
|
||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||
|
||||
# Create the lock directory.
|
||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||
# that we are using for the .o file. Also, base the name on the expected
|
||||
# object file name, since that is what matters with a parallel build.
|
||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||
while true; do
|
||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# FIXME: race condition here if user kills between mkdir and trap.
|
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||
|
||||
# Run the compile.
|
||||
"$@"
|
||||
ret=$?
|
||||
|
||||
if test -f "$cofile"; then
|
||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||
elif test -f "${cofile}bj"; then
|
||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||
fi
|
||||
|
||||
rmdir "$lockdir"
|
||||
exit $ret
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
1480
config.guess
vendored
Executable file
197
config.h
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* build only butt-client */
|
||||
/* #undef CLIENT_ONLY */
|
||||
|
||||
/* Define to 1 if translation of program messages to the user's native
|
||||
language is requested. */
|
||||
#define ENABLE_NLS 1
|
||||
|
||||
/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
|
||||
CoreFoundation framework. */
|
||||
/* #undef HAVE_CFLOCALECOPYCURRENT */
|
||||
|
||||
/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
|
||||
the CoreFoundation framework. */
|
||||
/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */
|
||||
|
||||
/* Use dbus to get current tracks */
|
||||
#define HAVE_DBUS 1
|
||||
|
||||
/* Define if the GNU dcgettext() function is already present or preinstalled.
|
||||
*/
|
||||
#define HAVE_DCGETTEXT 1
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the `gethostbyaddr' function. */
|
||||
#define HAVE_GETHOSTBYADDR 1
|
||||
|
||||
/* Define to 1 if you have the `gethostbyname' function. */
|
||||
#define HAVE_GETHOSTBYNAME 1
|
||||
|
||||
/* Define if the GNU gettext() function is already present or preinstalled. */
|
||||
#define HAVE_GETTEXT 1
|
||||
|
||||
/* Define if you have the iconv() function and it works. */
|
||||
/* #undef HAVE_ICONV */
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the `crypto' library (-lcrypto). */
|
||||
#define HAVE_LIBCRYPTO 1
|
||||
|
||||
/* Define to 1 if you have the `curl' library (-lcurl). */
|
||||
#define HAVE_LIBCURL 1
|
||||
|
||||
/* Define to 1 if you have the `datachannel' library (-ldatachannel). */
|
||||
/* #undef HAVE_LIBDATACHANNEL */
|
||||
|
||||
/* Define to 1 if you have the `FLAC' library (-lFLAC). */
|
||||
#define HAVE_LIBFLAC 1
|
||||
|
||||
/* Define to 1 if you have the `mp3lame' library (-lmp3lame). */
|
||||
#define HAVE_LIBMP3LAME 1
|
||||
|
||||
/* Define to 1 if you have the `ogg' library (-logg). */
|
||||
#define HAVE_LIBOGG 1
|
||||
|
||||
/* Define to 1 if you have the `opus' library (-lopus). */
|
||||
#define HAVE_LIBOPUS 1
|
||||
|
||||
/* Define to 1 if you have the `portaudio' library (-lportaudio). */
|
||||
#define HAVE_LIBPORTAUDIO 1
|
||||
|
||||
/* Define to 1 if you have the `portmidi' library (-lportmidi). */
|
||||
#define HAVE_LIBPORTMIDI 1
|
||||
|
||||
/* Define to 1 if you have the `pthread' library (-lpthread). */
|
||||
#define HAVE_LIBPTHREAD 1
|
||||
|
||||
/* Define to 1 if you have the `samplerate' library (-lsamplerate). */
|
||||
#define HAVE_LIBSAMPLERATE 1
|
||||
|
||||
/* Define to 1 if you have the `ssl' library (-lssl). */
|
||||
#define HAVE_LIBSSL 1
|
||||
|
||||
/* Define to 1 if you have the `vorbis' library (-lvorbis). */
|
||||
#define HAVE_LIBVORBIS 1
|
||||
|
||||
/* Define to 1 if you have the `vorbisenc' library (-lvorbisenc). */
|
||||
#define HAVE_LIBVORBISENC 1
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#define HAVE_LIMITS_H 1
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#define HAVE_MEMSET 1
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#define HAVE_NETDB_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#define HAVE_NETINET_IN_H 1
|
||||
|
||||
/* Define to 1 if you have the `pow' function. */
|
||||
/* #undef HAVE_POW */
|
||||
|
||||
/* Define to 1 if you have the `select' function. */
|
||||
#define HAVE_SELECT 1
|
||||
|
||||
/* Define to 1 if you have the `socket' function. */
|
||||
#define HAVE_SOCKET 1
|
||||
|
||||
/* Define to 1 if stdbool.h conforms to C99. */
|
||||
#define HAVE_STDBOOL_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#define HAVE_STDIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the `strchr' function. */
|
||||
#define HAVE_STRCHR 1
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#define HAVE_STRDUP 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the `strpbrk' function. */
|
||||
#define HAVE_STRPBRK 1
|
||||
|
||||
/* Define to 1 if you have the `strrchr' function. */
|
||||
#define HAVE_STRRCHR 1
|
||||
|
||||
/* Define to 1 if you have the `strstr' function. */
|
||||
#define HAVE_STRSTR 1
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#define HAVE_SYS_SOCKET_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the `X509_check_host' function. */
|
||||
#define HAVE_X509_CHECK_HOST 1
|
||||
|
||||
/* Define to 1 if the system has the type `_Bool'. */
|
||||
#define HAVE__BOOL 1
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "butt"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "BUG-REPORT-ADDRESS"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "butt"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "butt 1.45.0"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "butt"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "1.45.0"
|
||||
|
||||
/* Define to 1 if all of the C90 standard headers exist (not just the ones
|
||||
required in a freestanding environment). This macro is provided for
|
||||
backward compatibility; new code need not use it. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "1.45.0"
|
||||
|
||||
/* build butt and butt-client */
|
||||
/* #undef WITH_CLIENT */
|
||||
|
||||
/* Enable support for Radio.co authentification */
|
||||
/* #undef WITH_RADIOCO */
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
/* #undef inline */
|
||||
#endif
|
||||
196
config.h.in
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* build only butt-client */
|
||||
#undef CLIENT_ONLY
|
||||
|
||||
/* Define to 1 if translation of program messages to the user's native
|
||||
language is requested. */
|
||||
#undef ENABLE_NLS
|
||||
|
||||
/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
|
||||
CoreFoundation framework. */
|
||||
#undef HAVE_CFLOCALECOPYCURRENT
|
||||
|
||||
/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
|
||||
the CoreFoundation framework. */
|
||||
#undef HAVE_CFPREFERENCESCOPYAPPVALUE
|
||||
|
||||
/* Use dbus to get current tracks */
|
||||
#undef HAVE_DBUS
|
||||
|
||||
/* Define if the GNU dcgettext() function is already present or preinstalled.
|
||||
*/
|
||||
#undef HAVE_DCGETTEXT
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
|
||||
/* Define to 1 if you have the `gethostbyaddr' function. */
|
||||
#undef HAVE_GETHOSTBYADDR
|
||||
|
||||
/* Define to 1 if you have the `gethostbyname' function. */
|
||||
#undef HAVE_GETHOSTBYNAME
|
||||
|
||||
/* Define if the GNU gettext() function is already present or preinstalled. */
|
||||
#undef HAVE_GETTEXT
|
||||
|
||||
/* Define if you have the iconv() function and it works. */
|
||||
#undef HAVE_ICONV
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the `crypto' library (-lcrypto). */
|
||||
#undef HAVE_LIBCRYPTO
|
||||
|
||||
/* Define to 1 if you have the `curl' library (-lcurl). */
|
||||
#undef HAVE_LIBCURL
|
||||
|
||||
/* Define to 1 if you have the `datachannel' library (-ldatachannel). */
|
||||
#undef HAVE_LIBDATACHANNEL
|
||||
|
||||
/* Define to 1 if you have the `FLAC' library (-lFLAC). */
|
||||
#undef HAVE_LIBFLAC
|
||||
|
||||
/* Define to 1 if you have the `mp3lame' library (-lmp3lame). */
|
||||
#undef HAVE_LIBMP3LAME
|
||||
|
||||
/* Define to 1 if you have the `ogg' library (-logg). */
|
||||
#undef HAVE_LIBOGG
|
||||
|
||||
/* Define to 1 if you have the `opus' library (-lopus). */
|
||||
#undef HAVE_LIBOPUS
|
||||
|
||||
/* Define to 1 if you have the `portaudio' library (-lportaudio). */
|
||||
#undef HAVE_LIBPORTAUDIO
|
||||
|
||||
/* Define to 1 if you have the `portmidi' library (-lportmidi). */
|
||||
#undef HAVE_LIBPORTMIDI
|
||||
|
||||
/* Define to 1 if you have the `pthread' library (-lpthread). */
|
||||
#undef HAVE_LIBPTHREAD
|
||||
|
||||
/* Define to 1 if you have the `samplerate' library (-lsamplerate). */
|
||||
#undef HAVE_LIBSAMPLERATE
|
||||
|
||||
/* Define to 1 if you have the `ssl' library (-lssl). */
|
||||
#undef HAVE_LIBSSL
|
||||
|
||||
/* Define to 1 if you have the `vorbis' library (-lvorbis). */
|
||||
#undef HAVE_LIBVORBIS
|
||||
|
||||
/* Define to 1 if you have the `vorbisenc' library (-lvorbisenc). */
|
||||
#undef HAVE_LIBVORBISENC
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#undef HAVE_LIMITS_H
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#undef HAVE_MEMSET
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#undef HAVE_NETDB_H
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#undef HAVE_NETINET_IN_H
|
||||
|
||||
/* Define to 1 if you have the `pow' function. */
|
||||
#undef HAVE_POW
|
||||
|
||||
/* Define to 1 if you have the `select' function. */
|
||||
#undef HAVE_SELECT
|
||||
|
||||
/* Define to 1 if you have the `socket' function. */
|
||||
#undef HAVE_SOCKET
|
||||
|
||||
/* Define to 1 if stdbool.h conforms to C99. */
|
||||
#undef HAVE_STDBOOL_H
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#undef HAVE_STDIO_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the `strchr' function. */
|
||||
#undef HAVE_STRCHR
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the `strpbrk' function. */
|
||||
#undef HAVE_STRPBRK
|
||||
|
||||
/* Define to 1 if you have the `strrchr' function. */
|
||||
#undef HAVE_STRRCHR
|
||||
|
||||
/* Define to 1 if you have the `strstr' function. */
|
||||
#undef HAVE_STRSTR
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#undef HAVE_SYS_SOCKET_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to 1 if you have the `X509_check_host' function. */
|
||||
#undef HAVE_X509_CHECK_HOST
|
||||
|
||||
/* Define to 1 if the system has the type `_Bool'. */
|
||||
#undef HAVE__BOOL
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if all of the C90 standard headers exist (not just the ones
|
||||
required in a freestanding environment). This macro is provided for
|
||||
backward compatibility; new code need not use it. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* build butt and butt-client */
|
||||
#undef WITH_CLIENT
|
||||
|
||||
/* Enable support for Radio.co authentification */
|
||||
#undef WITH_RADIOCO
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
#undef inline
|
||||
#endif
|
||||
690
config.rpath
Executable file
|
|
@ -0,0 +1,690 @@
|
|||
#! /bin/sh
|
||||
# Output a system dependent set of variables, describing how to set the
|
||||
# run time search path of shared libraries in an executable.
|
||||
#
|
||||
# Copyright 1996-2014 Free Software Foundation, Inc.
|
||||
# Taken from GNU libtool, 2001
|
||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||
#
|
||||
# This file is free software; the Free Software Foundation gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved.
|
||||
#
|
||||
# The first argument passed to this file is the canonical host specification,
|
||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
||||
# or
|
||||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
||||
# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
|
||||
# should be set by the caller.
|
||||
#
|
||||
# The set of defined variables is at the end of this script.
|
||||
|
||||
# Known limitations:
|
||||
# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
|
||||
# than 256 bytes, otherwise the compiler driver will dump core. The only
|
||||
# known workaround is to choose shorter directory names for the build
|
||||
# directory and/or the installation directory.
|
||||
|
||||
# All known linkers require a '.a' archive for static linking (except MSVC,
|
||||
# which needs '.lib').
|
||||
libext=a
|
||||
shrext=.so
|
||||
|
||||
host="$1"
|
||||
host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
|
||||
host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
|
||||
host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
||||
|
||||
# Code taken from libtool.m4's _LT_CC_BASENAME.
|
||||
|
||||
for cc_temp in $CC""; do
|
||||
case $cc_temp in
|
||||
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
|
||||
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
|
||||
\-*) ;;
|
||||
*) break;;
|
||||
esac
|
||||
done
|
||||
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
|
||||
|
||||
# Code taken from libtool.m4's _LT_COMPILER_PIC.
|
||||
|
||||
wl=
|
||||
if test "$GCC" = yes; then
|
||||
wl='-Wl,'
|
||||
else
|
||||
case "$host_os" in
|
||||
aix*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
mingw* | cygwin* | pw32* | os2* | cegcc*)
|
||||
;;
|
||||
hpux9* | hpux10* | hpux11*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
irix5* | irix6* | nonstopux*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||
case $cc_basename in
|
||||
ecc*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
icc* | ifort*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
lf95*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
nagfor*)
|
||||
wl='-Wl,-Wl,,'
|
||||
;;
|
||||
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
ccc*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
xl* | bgxl* | bgf* | mpixl*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
como)
|
||||
wl='-lopt='
|
||||
;;
|
||||
*)
|
||||
case `$CC -V 2>&1 | sed 5q` in
|
||||
*Sun\ F* | *Sun*Fortran*)
|
||||
wl=
|
||||
;;
|
||||
*Sun\ C*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
newsos6)
|
||||
;;
|
||||
*nto* | *qnx*)
|
||||
;;
|
||||
osf3* | osf4* | osf5*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
rdos*)
|
||||
;;
|
||||
solaris*)
|
||||
case $cc_basename in
|
||||
f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
|
||||
wl='-Qoption ld '
|
||||
;;
|
||||
*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
sunos4*)
|
||||
wl='-Qoption ld '
|
||||
;;
|
||||
sysv4 | sysv4.2uw2* | sysv4.3*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
sysv4*MP*)
|
||||
;;
|
||||
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
unicos*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
uts4*)
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
|
||||
|
||||
hardcode_libdir_flag_spec=
|
||||
hardcode_libdir_separator=
|
||||
hardcode_direct=no
|
||||
hardcode_minus_L=no
|
||||
|
||||
case "$host_os" in
|
||||
cygwin* | mingw* | pw32* | cegcc*)
|
||||
# FIXME: the MSVC++ port hasn't been tested in a loooong time
|
||||
# When not using gcc, we currently assume that we are using
|
||||
# Microsoft Visual C++.
|
||||
if test "$GCC" != yes; then
|
||||
with_gnu_ld=no
|
||||
fi
|
||||
;;
|
||||
interix*)
|
||||
# we just hope/assume this is gcc and not c89 (= MSVC++)
|
||||
with_gnu_ld=yes
|
||||
;;
|
||||
openbsd*)
|
||||
with_gnu_ld=no
|
||||
;;
|
||||
esac
|
||||
|
||||
ld_shlibs=yes
|
||||
if test "$with_gnu_ld" = yes; then
|
||||
# Set some defaults for GNU ld with shared library support. These
|
||||
# are reset later if shared libraries are not supported. Putting them
|
||||
# here allows them to be overridden if necessary.
|
||||
# Unlike libtool, we use -rpath here, not --rpath, since the documented
|
||||
# option of GNU ld is called -rpath, not --rpath.
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
case "$host_os" in
|
||||
aix[3-9]*)
|
||||
# On AIX/PPC, the GNU linker is very broken
|
||||
if test "$host_cpu" != ia64; then
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
amigaos*)
|
||||
case "$host_cpu" in
|
||||
powerpc)
|
||||
;;
|
||||
m68k)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
beos*)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
cygwin* | mingw* | pw32* | cegcc*)
|
||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
||||
# no search path for DLLs.
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
haiku*)
|
||||
;;
|
||||
interix[3-9]*)
|
||||
hardcode_direct=no
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
netbsd*)
|
||||
;;
|
||||
solaris*)
|
||||
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
|
||||
ld_shlibs=no
|
||||
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
|
||||
case `$LD -v 2>&1` in
|
||||
*\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
|
||||
ld_shlibs=no
|
||||
;;
|
||||
*)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
sunos4*)
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
*)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
if test "$ld_shlibs" = no; then
|
||||
hardcode_libdir_flag_spec=
|
||||
fi
|
||||
else
|
||||
case "$host_os" in
|
||||
aix3*)
|
||||
# Note: this linker hardcodes the directories in LIBPATH if there
|
||||
# are no directories specified by -L.
|
||||
hardcode_minus_L=yes
|
||||
if test "$GCC" = yes; then
|
||||
# Neither direct hardcoding nor static linking is supported with a
|
||||
# broken collect2.
|
||||
hardcode_direct=unsupported
|
||||
fi
|
||||
;;
|
||||
aix[4-9]*)
|
||||
if test "$host_cpu" = ia64; then
|
||||
# On IA64, the linker does run time linking by default, so we don't
|
||||
# have to do anything special.
|
||||
aix_use_runtimelinking=no
|
||||
else
|
||||
aix_use_runtimelinking=no
|
||||
# Test if we are trying to use run time linking or normal
|
||||
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
||||
# need to do runtime linking.
|
||||
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
|
||||
for ld_flag in $LDFLAGS; do
|
||||
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
||||
aix_use_runtimelinking=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
hardcode_direct=yes
|
||||
hardcode_libdir_separator=':'
|
||||
if test "$GCC" = yes; then
|
||||
case $host_os in aix4.[012]|aix4.[012].*)
|
||||
collect2name=`${CC} -print-prog-name=collect2`
|
||||
if test -f "$collect2name" && \
|
||||
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
||||
then
|
||||
# We have reworked collect2
|
||||
:
|
||||
else
|
||||
# We have old collect2
|
||||
hardcode_direct=unsupported
|
||||
hardcode_minus_L=yes
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_libdir_separator=
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
# Begin _LT_AC_SYS_LIBPATH_AIX.
|
||||
echo 'int main () { return 0; }' > conftest.c
|
||||
${CC} ${LDFLAGS} conftest.c -o conftest
|
||||
aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
||||
}'`
|
||||
if test -z "$aix_libpath"; then
|
||||
aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
||||
}'`
|
||||
fi
|
||||
if test -z "$aix_libpath"; then
|
||||
aix_libpath="/usr/lib:/lib"
|
||||
fi
|
||||
rm -f conftest.c conftest
|
||||
# End _LT_AC_SYS_LIBPATH_AIX.
|
||||
if test "$aix_use_runtimelinking" = yes; then
|
||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
||||
else
|
||||
if test "$host_cpu" = ia64; then
|
||||
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
|
||||
else
|
||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
amigaos*)
|
||||
case "$host_cpu" in
|
||||
powerpc)
|
||||
;;
|
||||
m68k)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
bsdi[45]*)
|
||||
;;
|
||||
cygwin* | mingw* | pw32* | cegcc*)
|
||||
# When not using gcc, we currently assume that we are using
|
||||
# Microsoft Visual C++.
|
||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
||||
# no search path for DLLs.
|
||||
hardcode_libdir_flag_spec=' '
|
||||
libext=lib
|
||||
;;
|
||||
darwin* | rhapsody*)
|
||||
hardcode_direct=no
|
||||
if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
dgux*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
;;
|
||||
freebsd2.2*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
freebsd2*)
|
||||
hardcode_direct=yes
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
freebsd* | dragonfly*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
hpux9*)
|
||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
hardcode_direct=yes
|
||||
# hardcode_minus_L: Not really in the search PATH,
|
||||
# but as the default location of the library.
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
hpux10*)
|
||||
if test "$with_gnu_ld" = no; then
|
||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
hardcode_direct=yes
|
||||
# hardcode_minus_L: Not really in the search PATH,
|
||||
# but as the default location of the library.
|
||||
hardcode_minus_L=yes
|
||||
fi
|
||||
;;
|
||||
hpux11*)
|
||||
if test "$with_gnu_ld" = no; then
|
||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
case $host_cpu in
|
||||
hppa*64*|ia64*)
|
||||
hardcode_direct=no
|
||||
;;
|
||||
*)
|
||||
hardcode_direct=yes
|
||||
# hardcode_minus_L: Not really in the search PATH,
|
||||
# but as the default location of the library.
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
irix5* | irix6* | nonstopux*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
;;
|
||||
netbsd*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
newsos6)
|
||||
hardcode_direct=yes
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
;;
|
||||
*nto* | *qnx*)
|
||||
;;
|
||||
openbsd*)
|
||||
if test -f /usr/libexec/ld.so; then
|
||||
hardcode_direct=yes
|
||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
else
|
||||
case "$host_os" in
|
||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
;;
|
||||
*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
os2*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
osf3*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
;;
|
||||
osf4* | osf5*)
|
||||
if test "$GCC" = yes; then
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
else
|
||||
# Both cc and cxx compiler support -rpath directly
|
||||
hardcode_libdir_flag_spec='-rpath $libdir'
|
||||
fi
|
||||
hardcode_libdir_separator=:
|
||||
;;
|
||||
solaris*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
;;
|
||||
sunos4*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_direct=yes
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
sysv4)
|
||||
case $host_vendor in
|
||||
sni)
|
||||
hardcode_direct=yes # is this really true???
|
||||
;;
|
||||
siemens)
|
||||
hardcode_direct=no
|
||||
;;
|
||||
motorola)
|
||||
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
sysv4.3*)
|
||||
;;
|
||||
sysv4*MP*)
|
||||
if test -d /usr/nec; then
|
||||
ld_shlibs=yes
|
||||
fi
|
||||
;;
|
||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6*)
|
||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
||||
hardcode_libdir_separator=':'
|
||||
;;
|
||||
uts4*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
;;
|
||||
*)
|
||||
ld_shlibs=no
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Check dynamic linker characteristics
|
||||
# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
|
||||
# Unlike libtool.m4, here we don't care about _all_ names of the library, but
|
||||
# only about the one the linker finds when passed -lNAME. This is the last
|
||||
# element of library_names_spec in libtool.m4, or possibly two of them if the
|
||||
# linker has special search rules.
|
||||
library_names_spec= # the last element of library_names_spec in libtool.m4
|
||||
libname_spec='lib$name'
|
||||
case "$host_os" in
|
||||
aix3*)
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
aix[4-9]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
amigaos*)
|
||||
case "$host_cpu" in
|
||||
powerpc*)
|
||||
library_names_spec='$libname$shrext' ;;
|
||||
m68k)
|
||||
library_names_spec='$libname.a' ;;
|
||||
esac
|
||||
;;
|
||||
beos*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
bsdi[45]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
cygwin* | mingw* | pw32* | cegcc*)
|
||||
shrext=.dll
|
||||
library_names_spec='$libname.dll.a $libname.lib'
|
||||
;;
|
||||
darwin* | rhapsody*)
|
||||
shrext=.dylib
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
dgux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
freebsd* | dragonfly*)
|
||||
case "$host_os" in
|
||||
freebsd[123]*)
|
||||
library_names_spec='$libname$shrext$versuffix' ;;
|
||||
*)
|
||||
library_names_spec='$libname$shrext' ;;
|
||||
esac
|
||||
;;
|
||||
gnu*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
haiku*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
hpux9* | hpux10* | hpux11*)
|
||||
case $host_cpu in
|
||||
ia64*)
|
||||
shrext=.so
|
||||
;;
|
||||
hppa*64*)
|
||||
shrext=.sl
|
||||
;;
|
||||
*)
|
||||
shrext=.sl
|
||||
;;
|
||||
esac
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
interix[3-9]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
irix5* | irix6* | nonstopux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
case "$host_os" in
|
||||
irix5* | nonstopux*)
|
||||
libsuff= shlibsuff=
|
||||
;;
|
||||
*)
|
||||
case $LD in
|
||||
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
|
||||
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
|
||||
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
|
||||
*) libsuff= shlibsuff= ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
linux*oldld* | linux*aout* | linux*coff*)
|
||||
;;
|
||||
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
knetbsd*-gnu)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
netbsd*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
newsos6)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
*nto* | *qnx*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
openbsd*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
os2*)
|
||||
libname_spec='$name'
|
||||
shrext=.dll
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
osf3* | osf4* | osf5*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
rdos*)
|
||||
;;
|
||||
solaris*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sunos4*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
sysv4 | sysv4.3*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sysv4*MP*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
tpf*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
uts4*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
esac
|
||||
|
||||
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
||||
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
||||
escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
|
||||
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
||||
|
||||
# How to pass a linker flag through the compiler.
|
||||
wl="$escaped_wl"
|
||||
|
||||
# Static library suffix (normally "a").
|
||||
libext="$libext"
|
||||
|
||||
# Shared library suffix (normally "so").
|
||||
shlibext="$shlibext"
|
||||
|
||||
# Format of library name prefix.
|
||||
libname_spec="$escaped_libname_spec"
|
||||
|
||||
# Library names that the linker finds when passed -lNAME.
|
||||
library_names_spec="$escaped_library_names_spec"
|
||||
|
||||
# Flag to hardcode \$libdir into a binary during linking.
|
||||
# This must work even if \$libdir does not exist.
|
||||
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
||||
|
||||
# Whether we need a single -rpath flag with a separated argument.
|
||||
hardcode_libdir_separator="$hardcode_libdir_separator"
|
||||
|
||||
# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
|
||||
# resulting binary.
|
||||
hardcode_direct="$hardcode_direct"
|
||||
|
||||
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
|
||||
# resulting binary.
|
||||
hardcode_minus_L="$hardcode_minus_L"
|
||||
|
||||
EOF
|
||||
1801
config.sub
vendored
Executable file
278
configure.ac
Normal file
|
|
@ -0,0 +1,278 @@
|
|||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.68])
|
||||
AC_INIT([butt], [1.45.0], [BUG-REPORT-ADDRESS])
|
||||
AM_INIT_AUTOMAKE([subdir-objects foreign])
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
AC_CONFIG_SRCDIR([config.h.in])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
#predefined CXXFLAGS so AC_PROG_CXX does not add the -g flag
|
||||
CXXFLAGS="$CXXFLAGS -O2"
|
||||
|
||||
# Compile with address sanitizer
|
||||
# CXXFLAGS="$CXXFLAGS -O2 -g -fsanitize=address"
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CC
|
||||
AC_PROG_OBJC
|
||||
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
|
||||
# Compile with address sanitizer
|
||||
#LDFLAGS="$LDFLAGS -L/usr/local/lib -fsanitize=address"
|
||||
|
||||
|
||||
AC_ARG_WITH([radioco],
|
||||
AS_HELP_STRING([--with-radioco], [Include support for Radio.co]))
|
||||
|
||||
AC_ARG_WITH([client],
|
||||
AS_HELP_STRING([--with-client], [Build butt and butt-client]),
|
||||
[with_client=yes],
|
||||
[]
|
||||
)
|
||||
|
||||
AC_ARG_WITH([butt],
|
||||
AS_HELP_STRING([--without-butt], [Build only butt-client]),
|
||||
[client_only=yes],
|
||||
[],
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE([aac],
|
||||
AS_HELP_STRING([--disable-aac], [Disable aac support]))
|
||||
|
||||
|
||||
AS_IF([test "x$with_radioco" = "xyes"],
|
||||
[
|
||||
AC_DEFINE([WITH_RADIOCO], [1], [Enable support for Radio.co authentification])
|
||||
])
|
||||
|
||||
AS_IF([test "x$client_only" = "xyes"],
|
||||
[
|
||||
AC_DEFINE([CLIENT_ONLY], [1], [build only butt-client])
|
||||
])
|
||||
|
||||
AS_IF([test "x$with_client" = "xyes"],
|
||||
[
|
||||
AC_DEFINE([WITH_CLIENT], [1], [build butt and butt-client])
|
||||
])
|
||||
|
||||
AS_IF([test "x$client_only" != "xyes"],
|
||||
[
|
||||
# Checks for libraries.
|
||||
AC_CHECK_LIB([ogg], [ogg_stream_init], [],
|
||||
[AC_MSG_ERROR([**** Could not find libogg ****])]
|
||||
)
|
||||
AC_CHECK_LIB([vorbis], [vorbis_info_init], [],
|
||||
[AC_MSG_ERROR([**** Could not find libvorbis ****])]
|
||||
)
|
||||
AC_CHECK_LIB([vorbisenc], [vorbis_encode_init], [],
|
||||
[AC_MSG_ERROR([**** Could not find libvorbisenc ****])]
|
||||
)
|
||||
AC_CHECK_LIB([opus], [opus_encoder_create], [],
|
||||
[AC_MSG_ERROR([**** Could not find libopus ****])]
|
||||
)
|
||||
AC_CHECK_LIB([mp3lame], [lame_init], [],
|
||||
[AC_MSG_ERROR([**** Could not find libmp3lame ****])]
|
||||
|
||||
)
|
||||
AC_CHECK_LIB([FLAC], [FLAC__stream_encoder_new], [],
|
||||
[AC_MSG_ERROR([**** Could not find libFLAC ****])]
|
||||
)
|
||||
AC_CHECK_LIB([portaudio], [Pa_Initialize], [],
|
||||
[AC_MSG_ERROR([**** Could not find libportaudio ****])]
|
||||
)
|
||||
AC_CHECK_LIB([portmidi], [Pm_Initialize], [],
|
||||
[AC_MSG_ERROR([**** Could not find libportmidi ****])]
|
||||
)
|
||||
AC_CHECK_LIB([samplerate], [src_new], [],
|
||||
[AC_MSG_ERROR([**** Could not find samplerate ****])]
|
||||
)
|
||||
AC_CHECK_LIB([pthread], [pthread_create], [],
|
||||
[AC_MSG_ERROR([**** Could not find libpthread ****])]
|
||||
)
|
||||
AC_CHECK_LIB([curl], [curl_global_init], [],
|
||||
[AC_MSG_ERROR([**** Could not find libcurl ****])]
|
||||
)
|
||||
AC_CHECK_LIB([ssl], [SSL_CTX_new], [],
|
||||
[AC_MSG_ERROR([**** Could not find libssl ****])]
|
||||
)
|
||||
AC_CHECK_LIB([crypto], [EVP_EncryptInit], [],
|
||||
[AC_MSG_ERROR([**** Could not find libcrypto ****])]
|
||||
)
|
||||
|
||||
])
|
||||
|
||||
AC_CHECK_HEADER([winsock2.h],
|
||||
[
|
||||
LIBS="$LIBS -lws2_32"
|
||||
host_os="windows"
|
||||
],
|
||||
)
|
||||
|
||||
AM_GNU_GETTEXT([external])
|
||||
AM_GNU_GETTEXT_VERSION([0.19])
|
||||
|
||||
AM_CONDITIONAL(WINDOWS, test "$host_os" = "windows")
|
||||
|
||||
|
||||
build_linux=no
|
||||
build_windows=no
|
||||
build_mac=no
|
||||
build_freebsd=no
|
||||
|
||||
# Detect the target system
|
||||
case "${host_os}" in
|
||||
linux*)
|
||||
build_linux=yes
|
||||
AC_MSG_NOTICE([Linux detected])
|
||||
|
||||
AS_IF([test "x$enable_aac" != "xno" -a "x$client_only" != "xyes"],
|
||||
[
|
||||
AC_CHECK_LIB([fdk-aac], [aacEncOpen],
|
||||
[
|
||||
CPPFLAGS="$CPPFLAGS -DHAVE_LIBFDK_AAC"
|
||||
LIBS="$LIBS -ldl"
|
||||
],
|
||||
[AC_MSG_ERROR([**** Could not find libfdk-aac - run ./configure --disable-aac to build without aac support ****])]
|
||||
)
|
||||
])
|
||||
AC_ARG_ENABLE([webrtc],
|
||||
AS_HELP_STRING([--enable-webrtc], [Enable WebRTC support]),
|
||||
[
|
||||
AS_IF([test "x$client_only" != "xyes"],
|
||||
[
|
||||
AC_CHECK_LIB([datachannel], [rtcCreatePeerConnection], [],
|
||||
[AC_MSG_ERROR([**** Could not find datachannel ****])])
|
||||
])
|
||||
])
|
||||
;;
|
||||
cygwin*|mingw*|windows)
|
||||
build_windows=yes
|
||||
AC_MSG_NOTICE([Windows detected])
|
||||
|
||||
# Do NOT check for aac lib here because butt must not depend on libfdk-aac dll.
|
||||
# Instead define HAVE_LIBFDK_AAC manually, so butt runs with and without the dll
|
||||
CPPFLAGS="$CPPFLAGS -DHAVE_LIBFDK_AAC"
|
||||
|
||||
AS_IF([test "x$client_only" != "xyes"],
|
||||
[
|
||||
AC_CHECK_LIB([datachannel], [rtcCreatePeerConnection], [],
|
||||
[AC_MSG_ERROR([**** Could not find datachannel ****])])
|
||||
])
|
||||
;;
|
||||
darwin*)
|
||||
build_mac=yes
|
||||
AC_MSG_NOTICE([MacOS detected])
|
||||
CPPFLAGS="$CPPFLAGS -x objective-c++"
|
||||
LIBS="$LIBS -framework AVFoundation -lintl -framework ScriptingBridge"
|
||||
LDFLAGS="$LDFLAGS -rpath /usr/local/lib"
|
||||
|
||||
AS_IF([test "x$client_only" != "xyes"],
|
||||
[
|
||||
AC_CHECK_LIB([datachannel], [rtcCreatePeerConnection], [],
|
||||
[AC_MSG_ERROR([**** Could not find datachannel ****])])
|
||||
])
|
||||
;;
|
||||
freebsd*)
|
||||
build_freebsd=yes
|
||||
AC_MSG_NOTICE([FreeBSD detected])
|
||||
|
||||
AS_IF([test "x$enable_aac" != "xno" -a "x$client_only" != "xyes"],
|
||||
[
|
||||
# By default AC_CHECK_LIB adds -lfdk-aac to the linker flags if the check succeeds. But as the library is loaded with dlopen() during runtime
|
||||
# the linker flag is not needed. So we only define HAVE_LIBFDK_AAC in case the library was found
|
||||
AC_CHECK_LIB([fdk-aac], [aacEncOpen], [CPPFLAGS="$CPPFLAGS -DHAVE_LIBFDK_AAC"],
|
||||
[AC_MSG_ERROR([**** Could not find libfdk-aac - run ./configure --disable-aac to build without aac support ****])]
|
||||
)
|
||||
])
|
||||
|
||||
AC_ARG_ENABLE([webrtc],
|
||||
AS_HELP_STRING([--enable-webrtc], [Enable WebRTC support]),
|
||||
[
|
||||
AS_IF([test "x$client_only" != "xyes"],
|
||||
[
|
||||
AC_CHECK_LIB([datachannel], [rtcCreatePeerConnection], [],
|
||||
[AC_MSG_ERROR([**** Could not find datachannel ****])])
|
||||
])
|
||||
])
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR(["OS $host_os is not supported"])
|
||||
;;
|
||||
esac
|
||||
|
||||
# Pass the conditionals to automake
|
||||
AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"])
|
||||
AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"])
|
||||
AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"])
|
||||
AM_CONDITIONAL([FREEBSD], [test "$build_freebsd" = "yes"])
|
||||
AM_CONDITIONAL([WITH_RADIOCO], [test "x$with_radioco" = "xyes"])
|
||||
AM_CONDITIONAL([WITH_CLIENT], [test "x$with_client" = "xyes" -o "x$client_only" = "xyes"])
|
||||
AM_CONDITIONAL([CLIENT_ONLY], [test "x$client_only" = "xyes"])
|
||||
|
||||
AC_CHECK_PROG([FLTKCONFIG],[fltk-config], [fltk-config])
|
||||
|
||||
if test "x$client_only" != "xyes"; then
|
||||
if test "$FLTKCONFIG" = "fltk-config"; then
|
||||
AC_CHECK_LIB([fltk], [main],
|
||||
[
|
||||
LIBS="$LIBS `fltk-config --ldflags --use-images`"
|
||||
CXXFLAGS="$CXXFLAGS `fltk-config --cxxflags`"
|
||||
],
|
||||
[AC_MSG_ERROR([**** Could not find libfltk ****])]
|
||||
)
|
||||
else
|
||||
AC_MSG_ERROR([**** Could not find fltk-config ****])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
#Add dbus library for Linux
|
||||
if test "$build_linux" = "yes" -a "x$client_only" != "xyes"; then
|
||||
AC_MSG_NOTICE([])
|
||||
PKG_CHECK_MODULES([DBUS], [dbus-1], [
|
||||
AC_DEFINE([HAVE_DBUS], [1], [Use dbus to get current tracks])
|
||||
LIBS="$LIBS $DBUS_LIBS"
|
||||
CFLAGS="$CFLAGS $LIBS $DBUS_CFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS $DBUS_CFLAGS"
|
||||
], [
|
||||
AC_DEFINE([HAVE_DBUS], [0], [Use dbus to get current tracks])
|
||||
AC_MSG_ERROR([**** Coud not find dbus dev files])
|
||||
])
|
||||
# Explicitly add X11 library because it is not added by fltk-config on OpenSUSE
|
||||
LIBS="$LIBS -lX11"
|
||||
|
||||
fi
|
||||
|
||||
#Add dbus library for FreeBSD
|
||||
if test "$build_freebsd" = "yes" -a "x$client_only" != "xyes"; then
|
||||
AC_MSG_NOTICE([])
|
||||
PKG_CHECK_MODULES([DBUS], [dbus-1], [
|
||||
AC_DEFINE([HAVE_DBUS], [1], [Use dbus to get current tracks])
|
||||
LIBS="$LIBS $DBUS_LIBS"
|
||||
CFLAGS="$CFLAGS $LIBS $DBUS_CFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS $DBUS_CFLAGS"
|
||||
], [
|
||||
AC_DEFINE([HAVE_DBUS], [0], [Use dbus to get current tracks])
|
||||
AC_MSG_ERROR([**** Coud not find dbus dev files])
|
||||
])
|
||||
fi
|
||||
# Checks for header files.
|
||||
AC_PATH_X
|
||||
AC_CHECK_HEADERS([fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_HEADER_STDBOOL
|
||||
AC_C_INLINE
|
||||
|
||||
# Checks for library functions.
|
||||
#AC_FUNC_MALLOC
|
||||
#AC_FUNC_REALLOC
|
||||
AC_CHECK_FUNCS([gethostbyaddr gethostbyname memset pow select socket strchr strdup strpbrk strrchr strstr X509_check_host])
|
||||
|
||||
AC_CONFIG_FILES([Makefile po/Makefile.in src/Makefile])
|
||||
AC_OUTPUT
|
||||
791
depcomp
Executable file
|
|
@ -0,0 +1,791 @@
|
|||
#! /bin/sh
|
||||
# depcomp - compile a program generating dependencies as side-effects
|
||||
|
||||
scriptversion=2018-03-07.03; # UTC
|
||||
|
||||
# Copyright (C) 1999-2021 Free Software Foundation, Inc.
|
||||
|
||||
# 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.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||
as side-effects.
|
||||
|
||||
Environment variables:
|
||||
depmode Dependency tracking mode.
|
||||
source Source file read by 'PROGRAMS ARGS'.
|
||||
object Object file output by 'PROGRAMS ARGS'.
|
||||
DEPDIR directory where to store dependencies.
|
||||
depfile Dependency file to output.
|
||||
tmpdepfile Temporary file to use when outputting dependencies.
|
||||
libtool Whether libtool is used (yes/no).
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "depcomp $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
|
||||
# Get the directory component of the given path, and save it in the
|
||||
# global variables '$dir'. Note that this directory component will
|
||||
# be either empty or ending with a '/' character. This is deliberate.
|
||||
set_dir_from ()
|
||||
{
|
||||
case $1 in
|
||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
||||
*) dir=;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Get the suffix-stripped basename of the given path, and save it the
|
||||
# global variable '$base'.
|
||||
set_base_from ()
|
||||
{
|
||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
||||
}
|
||||
|
||||
# If no dependency file was actually created by the compiler invocation,
|
||||
# we still have to create a dummy depfile, to avoid errors with the
|
||||
# Makefile "include basename.Plo" scheme.
|
||||
make_dummy_depfile ()
|
||||
{
|
||||
echo "#dummy" > "$depfile"
|
||||
}
|
||||
|
||||
# Factor out some common post-processing of the generated depfile.
|
||||
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
||||
aix_post_process_depfile ()
|
||||
{
|
||||
# If the compiler actually managed to produce a dependency file,
|
||||
# post-process it.
|
||||
if test -f "$tmpdepfile"; then
|
||||
# Each line is of the form 'foo.o: dependency.h'.
|
||||
# Do two passes, one to just change these to
|
||||
# $object: dependency.h
|
||||
# and one to simply output
|
||||
# dependency.h:
|
||||
# which is needed to avoid the deleted-header problem.
|
||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
||||
} > "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
}
|
||||
|
||||
# A tabulation character.
|
||||
tab=' '
|
||||
# A newline character.
|
||||
nl='
|
||||
'
|
||||
# Character ranges might be problematic outside the C locale.
|
||||
# These definitions help.
|
||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
lower=abcdefghijklmnopqrstuvwxyz
|
||||
digits=0123456789
|
||||
alpha=${upper}${lower}
|
||||
|
||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||
depfile=${depfile-`echo "$object" |
|
||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||
|
||||
rm -f "$tmpdepfile"
|
||||
|
||||
# Avoid interferences from the environment.
|
||||
gccflag= dashmflag=
|
||||
|
||||
# Some modes work just like other modes, but use different flags. We
|
||||
# parameterize here, but still list the modes in the big case below,
|
||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||
# here, because this file can only contain one case statement.
|
||||
if test "$depmode" = hp; then
|
||||
# HP compiler uses -M and no extra arg.
|
||||
gccflag=-M
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
if test "$depmode" = dashXmstdout; then
|
||||
# This is just like dashmstdout with a different argument.
|
||||
dashmflag=-xM
|
||||
depmode=dashmstdout
|
||||
fi
|
||||
|
||||
cygpath_u="cygpath -u -f -"
|
||||
if test "$depmode" = msvcmsys; then
|
||||
# This is just like msvisualcpp but w/o cygpath translation.
|
||||
# Just convert the backslash-escaped backslashes to single forward
|
||||
# slashes to satisfy depend.m4
|
||||
cygpath_u='sed s,\\\\,/,g'
|
||||
depmode=msvisualcpp
|
||||
fi
|
||||
|
||||
if test "$depmode" = msvc7msys; then
|
||||
# This is just like msvc7 but w/o cygpath translation.
|
||||
# Just convert the backslash-escaped backslashes to single forward
|
||||
# slashes to satisfy depend.m4
|
||||
cygpath_u='sed s,\\\\,/,g'
|
||||
depmode=msvc7
|
||||
fi
|
||||
|
||||
if test "$depmode" = xlc; then
|
||||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
||||
gccflag=-qmakedep=gcc,-MF
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
case "$depmode" in
|
||||
gcc3)
|
||||
## gcc 3 implements dependency tracking that does exactly what
|
||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||
## the command line argument order; so add the flags where they
|
||||
## appear in depend2.am. Note that the slowdown incurred here
|
||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||
*) set fnord "$@" "$arg" ;;
|
||||
esac
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
done
|
||||
"$@"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
mv "$tmpdepfile" "$depfile"
|
||||
;;
|
||||
|
||||
gcc)
|
||||
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
||||
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
||||
## (see the conditional assignment to $gccflag above).
|
||||
## There are various ways to get dependency output from gcc. Here's
|
||||
## why we pick this rather obscure method:
|
||||
## - Don't want to use -MD because we'd like the dependencies to end
|
||||
## up in a subdir. Having to rename by hand is ugly.
|
||||
## (We might end up doing this anyway to support other compilers.)
|
||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
||||
## supported by the other compilers which use the 'gcc' depmode.
|
||||
## - Using -M directly means running the compiler twice (even worse
|
||||
## than renaming).
|
||||
if test -z "$gccflag"; then
|
||||
gccflag=-MD,
|
||||
fi
|
||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
# The second -e expression handles DOS-style file names with drive
|
||||
# letters.
|
||||
sed -e 's/^[^:]*: / /' \
|
||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||
## This next piece of magic avoids the "deleted header file" problem.
|
||||
## The problem is that when a header file which appears in a .P file
|
||||
## is deleted, the dependency causes make to die (because there is
|
||||
## typically no way to rebuild the header). We avoid this by adding
|
||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||
## this for us directly.
|
||||
## Some versions of gcc put a space before the ':'. On the theory
|
||||
## that the space means something, we add a space to the output as
|
||||
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||
## to the object. Take care to not repeat it in the output.
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
sgi)
|
||||
if test "$libtool" = yes; then
|
||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||
else
|
||||
"$@" -MDupdate "$tmpdepfile"
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
|
||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||
echo "$object : \\" > "$depfile"
|
||||
# Clip off the initial element (the dependent). Don't try to be
|
||||
# clever and replace this with sed code, as IRIX sed won't handle
|
||||
# lines with more than a fixed number of characters (4096 in
|
||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||
# dependency line.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
||||
| tr "$nl" ' ' >> "$depfile"
|
||||
echo >> "$depfile"
|
||||
# The second pass generates a dummy entry for each header file.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||
>> "$depfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
xlc)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
aix)
|
||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||
# in a .u file. In older versions, this file always lives in the
|
||||
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||
# start of each line; $object doesn't have directory information.
|
||||
# Version 6 uses the directory in both cases.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$base.u
|
||||
tmpdepfile3=$dir.libs/$base.u
|
||||
"$@" -Wc,-M
|
||||
else
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$dir$base.u
|
||||
tmpdepfile3=$dir$base.u
|
||||
"$@" -M
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
tcc)
|
||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
||||
# FIXME: That version still under development at the moment of writing.
|
||||
# Make that this statement remains true also for stable, released
|
||||
# versions.
|
||||
# It will wrap lines (doesn't matter whether long or short) with a
|
||||
# trailing '\', as in:
|
||||
#
|
||||
# foo.o : \
|
||||
# foo.c \
|
||||
# foo.h \
|
||||
#
|
||||
# It will put a trailing '\' even on the last line, and will use leading
|
||||
# spaces rather than leading tabs (at least since its commit 0394caf7
|
||||
# "Emit spaces for -MD").
|
||||
"$@" -MD -MF "$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
||||
# We have to change lines of the first kind to '$object: \'.
|
||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
||||
# And for each line of the second kind, we have to emit a 'dep.h:'
|
||||
# dummy dependency, to avoid the deleted-header problem.
|
||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
## The order of this option in the case statement is important, since the
|
||||
## shell code in configure will try each of these formats in the order
|
||||
## listed in this file. A plain '-MD' option would be understood by many
|
||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||
pgcc)
|
||||
# Portland's C compiler understands '-MD'.
|
||||
# Will always output deps to 'file.d' where file is the root name of the
|
||||
# source file under compilation, even if file resides in a subdirectory.
|
||||
# The object file name does not affect the name of the '.d' file.
|
||||
# pgcc 10.2 will output
|
||||
# foo.o: sub/foo.c sub/foo.h
|
||||
# and will wrap long lines using '\' :
|
||||
# foo.o: sub/foo.c ... \
|
||||
# sub/foo.h ... \
|
||||
# ...
|
||||
set_dir_from "$object"
|
||||
# Use the source, not the object, to determine the base name, since
|
||||
# that's sadly what pgcc will do too.
|
||||
set_base_from "$source"
|
||||
tmpdepfile=$base.d
|
||||
|
||||
# For projects that build the same source file twice into different object
|
||||
# files, the pgcc approach of using the *source* file root name can cause
|
||||
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
||||
# the same $tmpdepfile.
|
||||
lockdir=$base.d-lock
|
||||
trap "
|
||||
echo '$0: caught signal, cleaning up...' >&2
|
||||
rmdir '$lockdir'
|
||||
exit 1
|
||||
" 1 2 13 15
|
||||
numtries=100
|
||||
i=$numtries
|
||||
while test $i -gt 0; do
|
||||
# mkdir is a portable test-and-set.
|
||||
if mkdir "$lockdir" 2>/dev/null; then
|
||||
# This process acquired the lock.
|
||||
"$@" -MD
|
||||
stat=$?
|
||||
# Release the lock.
|
||||
rmdir "$lockdir"
|
||||
break
|
||||
else
|
||||
# If the lock is being held by a different process, wait
|
||||
# until the winning process is done or we timeout.
|
||||
while test -d "$lockdir" && test $i -gt 0; do
|
||||
sleep 1
|
||||
i=`expr $i - 1`
|
||||
done
|
||||
fi
|
||||
i=`expr $i - 1`
|
||||
done
|
||||
trap - 1 2 13 15
|
||||
if test $i -le 0; then
|
||||
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
||||
echo "$0: check lockdir '$lockdir'" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each line is of the form `foo.o: dependent.h',
|
||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||
# Do two passes, one to just change these to
|
||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp2)
|
||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||
# compilers, which have integrated preprocessors. The correct option
|
||||
# to use with these is +Maked; it writes dependencies to a file named
|
||||
# 'foo.d', which lands next to the object file, wherever that
|
||||
# happens to be.
|
||||
# Much of this is similar to the tru64 case; see comments there.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir.libs/$base.d
|
||||
"$@" -Wc,+Maked
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
"$@" +Maked
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
if test -f "$tmpdepfile"; then
|
||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||
# Add 'dependent.h:' lines.
|
||||
sed -ne '2,${
|
||||
s/^ *//
|
||||
s/ \\*$//
|
||||
s/$/:/
|
||||
p
|
||||
}' "$tmpdepfile" >> "$depfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||
;;
|
||||
|
||||
tru64)
|
||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||
# dependencies in 'foo.d' instead, so we check for that too.
|
||||
# Subdirectories are respected.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
|
||||
if test "$libtool" = yes; then
|
||||
# Libtool generates 2 separate objects for the 2 libraries. These
|
||||
# two compilations output dependencies in $dir.libs/$base.o.d and
|
||||
# in $dir$base.o.d. We have to check for both files, because
|
||||
# one of the two compilations can be disabled. We should prefer
|
||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||
# the former would cause a distcleancheck panic.
|
||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||
"$@" -Wc,-MD
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
tmpdepfile3=$dir$base.d
|
||||
"$@" -MD
|
||||
fi
|
||||
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
# Same post-processing that is required for AIX mode.
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
msvc7)
|
||||
if test "$libtool" = yes; then
|
||||
showIncludes=-Wc,-showIncludes
|
||||
else
|
||||
showIncludes=-showIncludes
|
||||
fi
|
||||
"$@" $showIncludes > "$tmpdepfile"
|
||||
stat=$?
|
||||
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
# The first sed program below extracts the file names and escapes
|
||||
# backslashes for cygpath. The second sed program outputs the file
|
||||
# name when reading, but also accumulates all include files in the
|
||||
# hold buffer in order to output them again at the end. This only
|
||||
# works with sed implementations that can handle large buffers.
|
||||
sed < "$tmpdepfile" -n '
|
||||
/^Note: including file: *\(.*\)/ {
|
||||
s//\1/
|
||||
s/\\/\\\\/g
|
||||
p
|
||||
}' | $cygpath_u | sort -u | sed -n '
|
||||
s/ /\\ /g
|
||||
s/\(.*\)/'"$tab"'\1 \\/p
|
||||
s/.\(.*\) \\/\1:/
|
||||
H
|
||||
$ {
|
||||
s/.*/'"$tab"'/
|
||||
G
|
||||
p
|
||||
}' >> "$depfile"
|
||||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvc7msys)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
#nosideeffect)
|
||||
# This comment above is used by automake to tell side-effect
|
||||
# dependency tracking mechanisms from slower ones.
|
||||
|
||||
dashmstdout)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout, regardless of -o.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
test -z "$dashmflag" && dashmflag=-M
|
||||
# Require at least two characters before searching for ':'
|
||||
# in the target name. This is to cope with DOS-style filenames:
|
||||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||
"$@" $dashmflag |
|
||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
cat < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
dashXmstdout)
|
||||
# This case only exists to satisfy depend.m4. It is never actually
|
||||
# run, as this mode is specially recognized in the preamble.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
makedepend)
|
||||
"$@" || exit $?
|
||||
# Remove any Libtool call
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
# X makedepend
|
||||
shift
|
||||
cleared=no eat=no
|
||||
for arg
|
||||
do
|
||||
case $cleared in
|
||||
no)
|
||||
set ""; shift
|
||||
cleared=yes ;;
|
||||
esac
|
||||
if test $eat = yes; then
|
||||
eat=no
|
||||
continue
|
||||
fi
|
||||
case "$arg" in
|
||||
-D*|-I*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
# Strip any option that makedepend may not understand. Remove
|
||||
# the object too, otherwise makedepend will parse it as a source file.
|
||||
-arch)
|
||||
eat=yes ;;
|
||||
-*|$object)
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
esac
|
||||
done
|
||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||
touch "$tmpdepfile"
|
||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||
rm -f "$depfile"
|
||||
# makedepend may prepend the VPATH from the source file name to the object.
|
||||
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed '1,2d' "$tmpdepfile" \
|
||||
| tr ' ' "$nl" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||
;;
|
||||
|
||||
cpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
"$@" -E \
|
||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
cat < "$tmpdepfile" >> "$depfile"
|
||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvisualcpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case "$arg" in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||
set fnord "$@"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
"$@" -E 2>/dev/null |
|
||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||
echo "$tab" >> "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvcmsys)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
none)
|
||||
exec "$@"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown depmode $depmode" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
294
gettext.h
Normal file
|
|
@ -0,0 +1,294 @@
|
|||
/* Convenience header for conditional use of GNU <libintl.h>.
|
||||
Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2016 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _LIBGETTEXT_H
|
||||
#define _LIBGETTEXT_H 1
|
||||
|
||||
#include "config.h"
|
||||
|
||||
/* NLS can be disabled through the configure --disable-nls option. */
|
||||
#if ENABLE_NLS
|
||||
|
||||
/* Get declarations of GNU message catalog functions. */
|
||||
# include <libintl.h>
|
||||
|
||||
/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
|
||||
the gettext() and ngettext() macros. This is an alternative to calling
|
||||
textdomain(), and is useful for libraries. */
|
||||
# ifdef DEFAULT_TEXT_DOMAIN
|
||||
# undef gettext
|
||||
# define gettext(Msgid) \
|
||||
dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
|
||||
# undef ngettext
|
||||
# define ngettext(Msgid1, Msgid2, N) \
|
||||
dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
|
||||
# endif
|
||||
|
||||
#else
|
||||
|
||||
/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
|
||||
chokes if dcgettext is defined as a macro. So include it now, to make
|
||||
later inclusions of <locale.h> a NOP. We don't include <libintl.h>
|
||||
as well because people using "gettext.h" will not include <libintl.h>,
|
||||
and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
|
||||
is OK. */
|
||||
#if defined(__sun)
|
||||
# include <locale.h>
|
||||
#endif
|
||||
|
||||
/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
|
||||
<libintl.h>, which chokes if dcgettext is defined as a macro. So include
|
||||
it now, to make later inclusions of <libintl.h> a NOP. */
|
||||
#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
|
||||
# include <cstdlib>
|
||||
# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Disabled NLS.
|
||||
The casts to 'const char *' serve the purpose of producing warnings
|
||||
for invalid uses of the value returned from these functions.
|
||||
On pre-ANSI systems without 'const', the config.h file is supposed to
|
||||
contain "#define const". */
|
||||
# undef gettext
|
||||
# define gettext(Msgid) ((const char *) (Msgid))
|
||||
# undef dgettext
|
||||
# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
|
||||
# undef dcgettext
|
||||
# define dcgettext(Domainname, Msgid, Category) \
|
||||
((void) (Category), dgettext (Domainname, Msgid))
|
||||
# undef ngettext
|
||||
# define ngettext(Msgid1, Msgid2, N) \
|
||||
((N) == 1 \
|
||||
? ((void) (Msgid2), (const char *) (Msgid1)) \
|
||||
: ((void) (Msgid1), (const char *) (Msgid2)))
|
||||
# undef dngettext
|
||||
# define dngettext(Domainname, Msgid1, Msgid2, N) \
|
||||
((void) (Domainname), ngettext (Msgid1, Msgid2, N))
|
||||
# undef dcngettext
|
||||
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
|
||||
((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
|
||||
# undef textdomain
|
||||
# define textdomain(Domainname) ((const char *) (Domainname))
|
||||
# undef bindtextdomain
|
||||
# define bindtextdomain(Domainname, Dirname) \
|
||||
((void) (Domainname), (const char *) (Dirname))
|
||||
# undef bind_textdomain_codeset
|
||||
# define bind_textdomain_codeset(Domainname, Codeset) \
|
||||
((void) (Domainname), (const char *) (Codeset))
|
||||
|
||||
#endif
|
||||
|
||||
/* Prefer gnulib's setlocale override over libintl's setlocale override. */
|
||||
#ifdef GNULIB_defined_setlocale
|
||||
# undef setlocale
|
||||
# define setlocale rpl_setlocale
|
||||
#endif
|
||||
|
||||
/* A pseudo function call that serves as a marker for the automated
|
||||
extraction of messages, but does not call gettext(). The run-time
|
||||
translation is done at a different place in the code.
|
||||
The argument, String, should be a literal string. Concatenated strings
|
||||
and other string expressions won't work.
|
||||
The macro's expansion is not parenthesized, so that it is suitable as
|
||||
initializer for static 'char[]' or 'const char[]' variables. */
|
||||
#define gettext_noop(String) String
|
||||
|
||||
/* The separator between msgctxt and msgid in a .mo file. */
|
||||
#define GETTEXT_CONTEXT_GLUE "\004"
|
||||
|
||||
/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
|
||||
MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
|
||||
short and rarely need to change.
|
||||
The letter 'p' stands for 'particular' or 'special'. */
|
||||
#ifdef DEFAULT_TEXT_DOMAIN
|
||||
# define pgettext(Msgctxt, Msgid) \
|
||||
pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||
#else
|
||||
# define pgettext(Msgctxt, Msgid) \
|
||||
pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||
#endif
|
||||
#define dpgettext(Domainname, Msgctxt, Msgid) \
|
||||
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||
#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
|
||||
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
|
||||
#ifdef DEFAULT_TEXT_DOMAIN
|
||||
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
|
||||
npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
#else
|
||||
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
|
||||
npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
#endif
|
||||
#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
|
||||
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
|
||||
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#else
|
||||
#ifdef __cplusplus
|
||||
inline
|
||||
#endif
|
||||
#endif
|
||||
static const char *
|
||||
pgettext_aux (const char *domain,
|
||||
const char *msg_ctxt_id, const char *msgid,
|
||||
int category)
|
||||
{
|
||||
const char *translation = dcgettext (domain, msg_ctxt_id, category);
|
||||
if (translation == msg_ctxt_id)
|
||||
return msgid;
|
||||
else
|
||||
return translation;
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#else
|
||||
#ifdef __cplusplus
|
||||
inline
|
||||
#endif
|
||||
#endif
|
||||
static const char *
|
||||
npgettext_aux (const char *domain,
|
||||
const char *msg_ctxt_id, const char *msgid,
|
||||
const char *msgid_plural, unsigned long int n,
|
||||
int category)
|
||||
{
|
||||
const char *translation =
|
||||
dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
|
||||
if (translation == msg_ctxt_id || translation == msgid_plural)
|
||||
return (n == 1 ? msgid : msgid_plural);
|
||||
else
|
||||
return translation;
|
||||
}
|
||||
|
||||
/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
|
||||
can be arbitrary expressions. But for string literals these macros are
|
||||
less efficient than those above. */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
|
||||
/* || __STDC_VERSION__ >= 199901L */ )
|
||||
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
|
||||
#else
|
||||
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
|
||||
#endif
|
||||
|
||||
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#define pgettext_expr(Msgctxt, Msgid) \
|
||||
dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
|
||||
#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
|
||||
dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#else
|
||||
#ifdef __cplusplus
|
||||
inline
|
||||
#endif
|
||||
#endif
|
||||
static const char *
|
||||
dcpgettext_expr (const char *domain,
|
||||
const char *msgctxt, const char *msgid,
|
||||
int category)
|
||||
{
|
||||
size_t msgctxt_len = strlen (msgctxt) + 1;
|
||||
size_t msgid_len = strlen (msgid) + 1;
|
||||
const char *translation;
|
||||
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
char msg_ctxt_id[msgctxt_len + msgid_len];
|
||||
#else
|
||||
char buf[1024];
|
||||
char *msg_ctxt_id =
|
||||
(msgctxt_len + msgid_len <= sizeof (buf)
|
||||
? buf
|
||||
: (char *) malloc (msgctxt_len + msgid_len));
|
||||
if (msg_ctxt_id != NULL)
|
||||
#endif
|
||||
{
|
||||
int found_translation;
|
||||
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
|
||||
msg_ctxt_id[msgctxt_len - 1] = '\004';
|
||||
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
|
||||
translation = dcgettext (domain, msg_ctxt_id, category);
|
||||
found_translation = (translation != msg_ctxt_id);
|
||||
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
if (msg_ctxt_id != buf)
|
||||
free (msg_ctxt_id);
|
||||
#endif
|
||||
if (found_translation)
|
||||
return translation;
|
||||
}
|
||||
return msgid;
|
||||
}
|
||||
|
||||
#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
|
||||
dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
|
||||
dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#else
|
||||
#ifdef __cplusplus
|
||||
inline
|
||||
#endif
|
||||
#endif
|
||||
static const char *
|
||||
dcnpgettext_expr (const char *domain,
|
||||
const char *msgctxt, const char *msgid,
|
||||
const char *msgid_plural, unsigned long int n,
|
||||
int category)
|
||||
{
|
||||
size_t msgctxt_len = strlen (msgctxt) + 1;
|
||||
size_t msgid_len = strlen (msgid) + 1;
|
||||
const char *translation;
|
||||
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
char msg_ctxt_id[msgctxt_len + msgid_len];
|
||||
#else
|
||||
char buf[1024];
|
||||
char *msg_ctxt_id =
|
||||
(msgctxt_len + msgid_len <= sizeof (buf)
|
||||
? buf
|
||||
: (char *) malloc (msgctxt_len + msgid_len));
|
||||
if (msg_ctxt_id != NULL)
|
||||
#endif
|
||||
{
|
||||
int found_translation;
|
||||
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
|
||||
msg_ctxt_id[msgctxt_len - 1] = '\004';
|
||||
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
|
||||
translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
|
||||
found_translation = !(translation == msg_ctxt_id || translation == msgid_plural);
|
||||
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
if (msg_ctxt_id != buf)
|
||||
free (msg_ctxt_id);
|
||||
#endif
|
||||
if (found_translation)
|
||||
return translation;
|
||||
}
|
||||
return (n == 1 ? msgid : msgid_plural);
|
||||
}
|
||||
|
||||
#endif /* _LIBGETTEXT_H */
|
||||
BIN
icons/butt.icns
Normal file
BIN
icons/butt.ico
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
icons/butt.xcf
Normal file
BIN
icons/butt_yellow.ico
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
icons/butt_yellow_512x512.jpg
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
icons/butt_yellow_512x512.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
icons/butt_yellow_Mac_512x512.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
icons/icon_128x128.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
icons/icon_128x128@2x.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
icons/icon_16x16.png
Normal file
|
After Width: | Height: | Size: 3 KiB |
BIN
icons/icon_16x16@2x.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
icons/icon_22x22.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
icons/icon_24x24.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
icons/icon_256x256.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
icons/icon_256x256@2x.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
icons/icon_32x32.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
icons/icon_32x32@2x.png
Normal file
|
After Width: | Height: | Size: 5 KiB |
BIN
icons/icon_48x48.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
icons/icon_512x512.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
icons/icon_512x512@2x.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
icons/icon_64x64.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
icons/icon_96x96.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
441
icons/icon_scalable.svg
Normal file
|
|
@ -0,0 +1,441 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg3055"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
width="512"
|
||||
height="512"
|
||||
sodipodi:docname="New document 6">
|
||||
<metadata
|
||||
id="metadata3061">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3059" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="885"
|
||||
inkscape:window-height="710"
|
||||
id="namedview3057"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.95703125"
|
||||
inkscape:cx="256"
|
||||
inkscape:cy="256"
|
||||
inkscape:window-x="75"
|
||||
inkscape:window-y="34"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg3055" />
|
||||
<image
|
||||
width="512"
|
||||
height="512"
|
||||
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAIABJREFU
|
||||
eJzs3XecLFWZ//HPqbmkS84ZDCCgCAgqsriigCIKpl11zSjm7M+0KwZcd5XVXRWzuIKYWFBRQRAU
|
||||
dWEJgpIMiICi5EsGucC9d+Y8vz9O1Ux1dVWn6a5T3f19v1716rmdzpk7M/08J4OIiIiIiIiIiIiI
|
||||
iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI
|
||||
iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhITC52BSS6TYEdgS2BjYBtgDlgY2BD
|
||||
wMermoj0IQHuA5alX98K3A7cDPw1vUTmKQGYPlsBewD7AY8Dtkiv1WJWSkRGZo6QCNwOXA6cmd7+
|
||||
KWalJD4lANNhKXAw8AxgX2DruNURkcjuAy4CTgN+SOg1kCmjBGCybQ28CHgxoZtfRKRoGXAycCxw
|
||||
ZeS6SI2UAEymjYDXA68kdO+LiHRzN3AS8Dng2sh1kRrMxK6ADN0/AV8Gng2sE7kuIjI+1gT2Al5I
|
||||
mER4ObAqao1kpNQDMDm2Bz4CPDd2RURkIvwKOAK4IHZFZDTUAzAZDgKOA/YZYRk2wvcWkfp1awBu
|
||||
DfwjsAK4cPTVkbqpB2C8OeBtwIeAJUN6T6v4uuzfIjKeip/9rsNjAMcD7wHuH1mNpHZKAMaXA/4T
|
||||
eO0Q3stKbsu+BiUBIuOuLNi73FW8P3MO8DrghpHWTmqjBGA8JYTg/5pFvEcx6HsWgn3+ouRrERlv
|
||||
xWDf7cqedwlhkuAtdVZWRkMJwPhJgE8Chw/4+mJQNxaCf/G2KiEAJQIi46ishe8InyvFr4u32Wsu
|
||||
RUnARFACMH6OAt40wOuKgd/nruK/8/fPX865/PuIyHhyZgbtrfx8wC+78s/5BfBS4G81112GSAnA
|
||||
eHk98Ik+X9Mp8M+Vfe2cK/YCFN9HRMZXVS+AM7OywD9TuM0SgW8Cb0EHho0tJQDj4++AHwBr9fGa
|
||||
Yvd9FujzlwfmnHOlrX6qA78SAZHxUjXzP387H+BzycBM7sonAglhZcAxo622jIoSgPGwEXAGsEsf
|
||||
r6lq8c8Bs+mtd87lewF6CfydyhORZunlM75qMmDCQiIwU3GtJBw0dtlwqy110EZA4+HDhD+yXuQD
|
||||
dzHor0pvZ51zs2nwz/cE5BOB/HuJyOQqW/Ez34BwzlnaQ1jWMFgC7A6cSPgckTGiBKD5nkgY9+/l
|
||||
Z5Vf0lca/J1zq9LAP5t7TtksfxGZTqXLf9NEoCwJ2IKF44VljGgIoNnWBE4FntDDc4tj/Vk3/ywL
|
||||
rf5ia18tfRHppGx+wAwwY2ZLCD0AS4B7gQOAG2NUUgajHoBm+0fgjT08Lx/8863+WWBV2t0/P+6P
|
||||
Wvwi0r+Wz420NyCzFqHBclaEesmA1APQXEuBnwK7dXleVfDPuvyzRECtfhFZrJYJgrT2BDwAPAu4
|
||||
Ol71pB9J7ApIpafQW/DPbovBf5VzLpv0p5a/iAxDcUnxbPo5s4rQC/D8iHWTPikBaK5et/rNT/jL
|
||||
B/+s5a9JfiIyTG37iqTDjKuAQ4ENYlZOeqcEoJl2Imz800lbJk578C+u7xcRGYaqocdNgCfHq5b0
|
||||
QwlAMx0CrN3h8bLgP7++n9bgnz1fRGTYWpKA9PPnGWh+2VhQAtA8M8D+PTyvLQEozPRX8BeROhST
|
||||
gN2BreJWSXqhBKB5tqbzuv+yff3LlvmBgr+I1CP/ubQO/W1bLpEoAWiefYDVKx6r7PqndUtfjfmL
|
||||
SAzZ59PesSsi3SkBaJ59uzyeP+Ana/0r+ItIbPMNlCRJdo1dGelOCUCzOOAhFY8VT/ebJYy3KfiL
|
||||
SFMYYGa2CeEUU2kwJQDNsiGwbYfHy5bdFMf9RURiMmBdwnwmaTAlAM2yIbBpxWNlm28U1/krCRCR
|
||||
JliT6s8yaQglAM2yPmEGbVEx+PvC1wr+ItIkRvg8kwZTAtAsa1B9QmPL5L907F/BX0SaSlsCN5wS
|
||||
gGZZs+Q+K1xlLX8lACLSNOoBaDglAM1SNWmmuAJAe/yLSNP57k+RmJQANEvV/tktwT+d/JfdJyIi
|
||||
0jclAM1X1v2fb/mrB0BERPqmBKDZ8kE+SwCKcwJERET6pgSg+VqCf2Htv4iIyECWxK6AdFVs8avr
|
||||
XzrxwH3AcufcLcDN3vt7gFvTx/LzTLLfoU2SJNkA2NzMtiLs4rY2+nwQmWj6Ax8fxSEAUBIgwXXO
|
||||
uSu899cAVwN/Bm42s7le38D7+fmkCbAZsD2wM7BdkiS7mNlOqMdQZKIoAWi2qta/TLcHnHO/995f
|
||||
BJwPXG9m9w7pvT1wS3pdCOC9XwpsBTwuSZK9zWw3wrbVIjLGlACMHyUD08k7567y3p8BnG9mV9dY
|
||||
9v3ANcA13vsTCAdW7Z0kydPN7NHA6jXWRUSGRAnAeFDQn15zzrmzvPc/MrPzaMbvwPXA9d777wKP
|
||||
AZ7pnDuI8nMsRKShlAA0XxM+8KV+s865n3rvTzCz38auTAeXApea2deBFznnDkGJgMhYUAIwPop7
|
||||
Ashk8s65n3vvjzWzP8SuTB+uA/7DzE4EXuCcew6wVuQ6iUgHSgCay0q+VuCfYOlM/s+b2fmx67II
|
||||
fwE+bmanJUnyRjP7u9gVEpFySgBE4nvQzL5hZscDy2NXZkh+771/C/Ac59wbgY1jV0hEWmldr0hE
|
||||
zrmrzewtwBeYnOCf8cDJZvZK59w5sSsjIq2UAIhE4pw7zXv/OuDXsesyYtd7799pZl9EJ1iKNIaG
|
||||
AETqt8rMPm1m345dkRrNAseY2dXOuSPQkIBIdOoBEKnXfWb2HmCagn/eL8zsTcC1sSsiMu2UAIjU
|
||||
53ozezvwv7ErEtkfzewNzrlLYldEZJopARCpx41m9k7g4tgVaYhl3vv3Oud+E7siItNKCYDI6N1o
|
||||
Zu8gnNQnC2733r/TOXd57IqITCMlACKjdY+ZvRsF/yq3e+/foZ4AkfopARAZnQfN7J+BcdrSN4a7
|
||||
vPdHADfErojINFECIDIiZnYU8MvY9RgTN5jZvxCOHnaxKyMyDZQAiIyAmX0T+GHseoyZ35nZR9Ov
|
||||
lQSIjJgSAJEhc85dBnwudj3G1Glm9i1CAqAkQGSElACIDNfd3vsPAytiV2SMfdY59zuUBIiMlBIA
|
||||
kSEys6MJR+LK4B703v87sAolASIjowRAZEicc+cCP4hdjwlxhZkdR/iMUhIgMgJKAESG4wHv/dGx
|
||||
KzFhvkrYP2EGJQEiQ6cEQGQIzOxE4JrY9ZgwD5rZZwifU+oJEBkyJQAii3cz8LXYlZhQ/5sOrcyg
|
||||
JEBkqJbEroDIuDOz7wD3xK5HiaXA7sCOwMOAbYC1ACME0VWE3fduAK4CLgHujlLTDrz3xzjnnsDC
|
||||
55VPby1SlUQmghIAkcW5hWZN/FsH2Bt4QXq7DbBGD6/zwPXAFcB3CEcW3zaaKvbt12Z2gXPuyYSg
|
||||
nw/8SgJEBqQEQGQRzOwk4K7Y9SC09l8KvALYbYDXJ8D26XUw8GfgW8DxwLIh1XExvmZm+zvnss+s
|
||||
ORT8RRZFcwBEBncP8OPYlQCeAfwE+C8GC/5lHgZ8ADgbeD2w2pDed1AXAheZ2QyaDyAyFEoARAbk
|
||||
nDubMAQQy/rAZ4H/IYz1j8LWwCeAkwi9A7F44EfAEiUBIsOhBEBkMOa9PyVi+Y8iHDZ0GPUEwAOB
|
||||
nwIH1VBWldOA2wlDl/kEQEQGoARAZADOuT8Al0cqfhfg28BeNZe7JfAN4CU1l5u5l5CEqBdAZAiU
|
||||
AIgMwHt/NjAboeidgRMIY/TDYD1ceWsRTjp83pDK79ep6W2WBGiTIJEBKQEQ6d9K4KII5W5OmJn/
|
||||
8EW8Rz6w+9xt1WWFr43QBf8ZYJ9F1GNQfyBsvDSDhgJEFkUJgEj/bgB+X3OZqxEm/D1igNeWBfy5
|
||||
9JrN3Rav/OPFhGA94IvAJoN+QwO6i7Bh0Qwwk+sFcKgXQKQvSgBE+mRmlxF20avTqwnr8/tRbO17
|
||||
ygP9qh6v7PnZez0U+NdFfE+DyrYGzl/qBRDpkzYCEunfr2oubwfgiD5f00tXf/4xaB3vd7nbJHdb
|
||||
/PrFwPcJk/Pq8su0DjOEuQDeOZf1UmT11iZBIl0oARDpz0rgTzWX+WbCmv9e5IN5FujnCrfFJMCc
|
||||
c2UB05lZvms9YaG1nf/6fYQNg1b2+40N6CbgSsKESM9CL0B+noKIdKEhAJH+3AzcWmN5jwCe3+Nz
|
||||
8y3+bPw+675fmV3OuexalV1UdPsXnrsSWJG+T35YYFfgmcP5dntyP2EyYJaIJGam1QAifVIPgEgf
|
||||
nHM3mlmdJ/+9mDDhrpviWH9+At8cMOucy+6v6vqvGgLIbp1zLgHmcuvws9n4LwROSd+/DtfS2hMx
|
||||
k5adsDAUoJ4AkQ6UAIj0wXt/Q43FrQP8Qw/PK7b8W2b1p+PjxZn8ZUG/+J6ZfBLggSRLJsxsSXrf
|
||||
4wlzFf7Y03e2eFezMA9gjnRFQPq9JtSXiIiMLQ0BiPSnzgRgT+AhXZ7Tqds/371ftZyvl42AivMG
|
||||
8slFVoYDnjSE77lX1xOGI7IkIKF9UyANBYh0oARApD8311jWAV0eLwv+s6SBPw3MxcC/mIlyZXsJ
|
||||
zJcH7D3Aew7qZuBBWicoah6ASB+UAIj05+6aynHAYzo8XmyhF4Nxfvx/2LPji3MNsjkGDwWWDqmM
|
||||
bpax0ANQNRlQRDpQAiDSn2U1lbMusEWX5xjt4/2raJ0AWLWn/zAUE5C1CccH12EF8ACdewCUBIh0
|
||||
oARApHdGfTsAbkJ1AlA14z8f/OtaE5+vy1JgsxGXl3cTrcG+mASAkgCRSkoARHpX57Ky1YDVOzxe
|
||||
NiFvVF3+3eR7GdauqUxYmOlfHAZQD4BID7QMUKR3dxC6nuuwBiEJKCod+3fO5Sf7xdgNLytv3RrL
|
||||
dBWXJgKK9EA9ACK9qzOgWIfyihPwYrX8i2JuvFMW/JUEiHSgBECkd5sAa9ZUVrbdbl5Z638udxBO
|
||||
fne/WO6KUGbLboW09wAoCRApoQRApHdZ4K1DNsu9qg5VLf+YCYAR9umPoWwoABT8RSopARDpT109
|
||||
AHfSfuhQ2+586Za82RXbcuD2mspytO6S2BL8cxMBRaSCEgCR3jlg05rKuhe4LvfvsmN+i93+sbv/
|
||||
76a+nRJXZ2GVRHEIQHMARHqgBECkPxvWWNZlhX+X7c/fhK5/AJxzVxN6AeqwNeW9MQr8Ij1SAiDS
|
||||
n61qLOvskvvmA75zrjHBH8B7f1GNxW1KewLQqSdARAqUAIj0Z9say7qY1uN1863/YvCPnQSsAC6s
|
||||
sbyHEvZKyGjSn0iflACI9CFJkjoTgPuBk9Ovi4G+MS1/AOfchcBfayxyW6qDvVr+Ij1QAiDSBzPb
|
||||
Ali/xiJPYmFpXVnwb0QS4L0/hfpWIjhg15rKEplYSgBE+rMF9R54cw1wQsVjjUgCnHOXUz5fYVTW
|
||||
BnapsTyRiaQEQKQ/qwOPqLnMTwK31Vxmr+a8918mHEhUl82p/2cgMnGUAIj077E1l3cdIQkoij7x
|
||||
zTn3Y+CCmot9AjBTc5kiE0cJgEifnHN7Un5S3ygdA5yRVYEGBH/gWu/9pyOUe0CEMkUmjhIAkf5t
|
||||
Sf2T0GaBtwNX0oxZ7veY2QcJRyTXaT1gry7PadT+CCJNpQRApH+rAftEKPdW4FXpbczNblaY2UeA
|
||||
39VYZuaxwMNK7m/k8kiRJlMCIDKAJEn2o3UjmrpcA7wGuDnSgTcPmNn7gZ/VXG7mkA6PWeFr9QSI
|
||||
dKAEQGQAZvYIYI9Ixf8KeH56W2cPwC1m9nbgrBrKKrMhcGiX5yjoi/RICYDIgJIkeUbE4m8AXuOc
|
||||
O5GFv+ORJQHOubPN7DVAnfv9Fz2DsA9DUbH7X61/kR4siV0BkXFlZvsRJgTWdQRu0XLv/ZHA2UmS
|
||||
vMbMHjmCMm4ws+PN7GTq2+mvTAK8tMPjLUE/d1CSiFRQAiAyuPUJXdLHRK7HL7z35wEHJEnyMjPb
|
||||
icX37l1vZj8EfkD9M/3LPAV4YofHq1r+SgJEKigBEFkE59yhZnYC8LfIVVkJ/Nh7fyZho5x9nXP7
|
||||
AtvQ26Y5HrjVzC4gnOp3LrB8VJUdwOEdHisOAeRPS8w/LiI5SgBEFmdb4FnAt2JXJOWB84HzzewL
|
||||
hHMLdgO2SZJkC1r/5s17vwy4Efg9YV5B7ESmzF7A07o8p+qoZAV/kQpKAEQWyTn3KjM7g2Z0lect
|
||||
B65NL7yPOYQ/MAe8n+oll2Vd/8UeABEpoVUAIotjwCbAy2NXZEIdAuzf5TlZ0PeAz00AVAIg0oES
|
||||
AJHFM+fcC4AdY1dkwqwNvJfOn1PFln92afxfpAslACLDsXaSJO9Cp9QN01uB3Ts83in4qwdApAsl
|
||||
ACLDYWa2L/DC2BWZEHsSDj/qptj9X+wBEJEKSgBEFi+/Ac1b0VDAYq0NfBxY2uE5ZRP/1AMg0gcl
|
||||
ACLDY8C6SZJ8BFgrdmXG2IeAvXt4Xhb45wq3Cv4iPVACIDI8RhgK2AN4T+zKjKmXAG/o4XnFlv9c
|
||||
2v2f3SciXSgBEBmOloDknHspmg/Qr8cD/9nD89qCPwutf597joh0oARAZLjy3dIfAJ4ctTbjY1vg
|
||||
y8A6XZ5XHPefo33yn4K/SA+UAIgMTzE4rQEcTZjRLtW2Br4N7NDj8/PBP39p9r9IH5QAiAxfNgww
|
||||
B6xLOC1wt7hVaqz1CC3/PXp4brHlP0cY+y9O/lMSINIDJQAiw9XSC5AGp02BY+m8qc002gT4GrBf
|
||||
H69R619kSJQAiIxGfoLaLLA58HVgn5iVapDtgO8BT+3x+WUT/2bV+hcZnBIAkeFr6apOg9QsocX7
|
||||
TeDQiHVrgscAJ9P73Ihi1/8sav2LLJoSAJHRKXZXzxJ2t/syYZ/7aXQIoeW/U4/Pz7fs80E/3/rX
|
||||
7H+RASgBEBmNYi/ALCEBmCX83X0I+BKwYbQa1msNwuZI3yDMiehHPvjPshD8tfOfyCIoARAZnaqh
|
||||
gOx6PnAa8KRoNazHLsB3CfsiLOnjdWWz/rP/O3X9iyySEgCR0SuOX+eD2M7AdwjBcb1YFRwRB7ya
|
||||
kOQ8uc/XlgX/VYTWfzEBUBIgMgAlACKj1WkoIAtkqwHvAs4AnhmpnsO2N3AK8CkG6/IvJk354K9x
|
||||
f5EhUAIgMnq9JAFzwKOAE4CTgMfFqeqi7UAI+oO0+qE8+Gfj/vn/KwV+kUXqZzxORBYnO6hmzjnn
|
||||
zEpj2AzwdOAAwtDAV4CL66neouwAHA68DFh/wPfoJfhrzb/IkCgBEKmHEcbEswA365zDzFx6f94M
|
||||
YVjgJcBzgbOBLwK/BB6orca9eRxwGGHoYuNFvE9V8F/lnFtF+8Q/BX+RRVICIFKfLGjlewKo6AlI
|
||||
0mst4OD0ugT4CXAi8BdCUIxhW+AZwLOBvx/C+3UL/lryJzICSgBE6lVMAsglAZZ7Tva36XK3e6bX
|
||||
/wPOBc5Lb38NrBxprcPufY8HnkjYvnftIbxn/v+iuNRPwV9kxJQAiNSvKgmwwuMzLPQEwEIysDqw
|
||||
f3o9CCwDLgUuAq4Abkzvu2uAuq0HbAZsRditby/CjP4tGU7QzxR3+PO0tvyzr7PEQMFfZMiUAIjE
|
||||
UUwCrNATkF0z6eP5FTv5OQNrAtun13PS++4DbgJuB+4GbgHuB+5M70vSctcDtiDMN9gm/fcm6X2j
|
||||
2qEwn+QUD0zKgn9+v3+1/EVGRAmASDz5JMAAwuIAyycA2ZUQkoF88C9OHsysAzwivZqk5ahkCnv7
|
||||
szDbX2v9RWqgBEAkrnxwmyP0BBjgzSwLgksIwT9LBBJa5wY0XTGZKdvat7i/v4K/yIgpARCJrzj2
|
||||
D2kikOsNyILiDAtzA1zhapp8APeUT/bLB36t8xepkRIAkWYoDgcYC0lAFviX0JoI5HsD8klAzGQg
|
||||
n8wUk5di8J/Lbe1bPNxHwV9kxJQAiDRLWyLgnPMsDAnkk4BsXkCWBGS32aZDUE8yYIWvOwX+ORZO
|
||||
RlSrXyQiJQAizVPWis4nAtkwwAwLiUD+yvcI5JMBGE5CUAz4xbp6KoJ/GvjzLX61+kUiUQIg0kz5
|
||||
YJgFSQ/4NIjO5BKBfE9AWRJQTAhgsESgrKWf/7oY+OeDfy7w5y+1+kUiUgIg0mz5IJsFcKM1EciC
|
||||
fjEJ6JQIZHpJBDoFfl9yOx/suwT+4nuLSI2UAIg0X1kAdiwE2SzYz+WSgXwCULylw21ZuWW3+UDe
|
||||
1vLPhitoTxAU+EUaQgmAyPgoJgL50wUdkDjnskCfpCcNFnsCiklAVW9Ap3H+YvDPeiRahipyz1Hg
|
||||
F2kgJQAi46c4LJAFbp/7d5YMzF9p70DZksFOwwBVExLLkoHifcXXi0iDKAEQGW/5IYH8jP98MuAA
|
||||
lyYE0J4AUPJ1px6A/NedWvkK+iINpgRAZDKUTRaE8pZ+VdCvSgCK75/dlgV6BX2RMaEEQGTyVM0V
|
||||
yBS7/HsZAuj13yIyJpQAiEy+TkG7mBz08noRmQBKAESmm4K7yJRKYldARERE6qcEQEREZAopARAR
|
||||
EZlCSgBERESmkBIAERGRKaQEQEREZAopARAREZlCSgBERESmkBIAERGRKaQEQEREZAopARAREZlC
|
||||
SgBERESmkA4DEpkcc8AKwgE/K9NbnHM3A6soP/bXgMTMtmKhQbBG+vXqwMyI6ywikSgBEBkvdzrn
|
||||
lgG3eu9vA+4CbgfuAe5Ov14F3EZICDCzWbqf+rdaeuuALdJ/bwysA2wIbAZskCTJZsAmZrZpep+I
|
||||
jCklACLNdGvacr/Fe38N8GfgL8DfzGw5cP+Qy1uZ+/qv6e01xSd57wGWAmsB6wJbAw9PkmQHYLs0
|
||||
MdgCDS+KNJ4SAJH4/uacu8V7/xvgN8CNwI1mdkvkelW5P73uICQl56WJAYReg23Sa9ckSfYwsy2A
|
||||
DSLUU0Q6UAIgUr+Vzrk/eu9/D/weuNzMro9dqSG5I70uB05LE4PNgN2BRyZJ8kgz24Mwv0BEIlIC
|
||||
IFKP651zV3nvLwLON7PbgQdjV6omtwI/BX7qvV8N2ATYM0mSJ5jZrsBDYlZOZFopARAZDQ9cZ2bn
|
||||
A78Efmdmd0WuUxOsAm4m9A6cBqwH7ATs65x7MmHoQCsPRGqgBEBkuG4xs/8DzgYuIgQ8qXYv8Cvg
|
||||
V2b2BWAvYB/n3BOBh0atmciEUwIgsngPOOcu8t6fAVxAWJIn/VtJ+P+7wMy+DDw2SZKDzezxhKWI
|
||||
IjJESgBEBnetmZ0KnGNmf4pdmQmzHDjbe382YVjg75MkOdTMdqZ8QyMR6ZMSAJH+eOfc/3nvTwXO
|
||||
Y3om8sV0A3CC9/4EYN80EXgyYcdCERmQEgCR3tznnPuZ9/4UM7uU7jvryWic570/D9gReJ5z7mnA
|
||||
RpHrJDKWlACIdHaHmf0IONnMrotdGZl3NfAfZvYN4GDn3POArSLXSWSsKAEQKXePmZ0MnEzogpZm
|
||||
ugn4qpl9D3iOc+4FwJaR6yQyFpQAiLS618x+CJxI2JJXxsPdwNfM7AeERODFwKaR6yTSaEoARIJV
|
||||
ZnYa8HXg2tiVkYFlicAZwAudc88H1o5cJ5FGUgIgU885d773/hjC/vUyGW4Bjjaz05MkeaWZHYRO
|
||||
KBRpoQRAptk1Znasmf04dkVkZK723r8P+FGSJG80s0fFrpBIUygBkGm03My+AxxH2IpWJt/53vtL
|
||||
gRc45w5DxxOLqEtMpotz7kIzezVwNAr+0+YB4Hgze4VzTr0+MvXUAyDT4k4z+4qZfReYjV0Zieq6
|
||||
dFjgbOfcG4HtYldIJAb1AMjEc86db2aHA/+Dgr8sONPMXuWcOy12RURiUA+ATLIHzOyYdLe4udiV
|
||||
kUa6w3v/fuAC59zb0N4BMkXUAyATyTn3BzN7A/A1FPylu9PM7HXOufNjV0SkLkoAZOKY2Xe9969F
|
||||
6/qlP9d6799qZp8DVsaujMioaQhAJsnfzOwTwKmxKyJja45wtsAVzrkjgK1jV0hkVNQDIBPBOXel
|
||||
mb0OBX8ZjgvM7PUaEpBJph4AGXvOubO890cBd8SuSwOsCaxL2OhmBtgMcIAHlgIb5p57N7A8fTwB
|
||||
biN0fd8D/I2wbn6a3eC9fzvw9vRwIZGJogRAxpqZHWdmn2d6Jvo5wkz1DYFtgB2BbYHtCd3V6xAC
|
||||
/TqEoL4+CwlAWY+fTx93hI2RVhGSggcIScDthMORrgeuJJyQeGd6TcM4+SrgE2b2V+fcO4HVY1dI
|
||||
ZFiUAMi4WmlmRwHfj12REVsH2AnYK73dAXg4IfjP9PE+VcN9+fvXS2837vJe16fX1cAfgYuB3wL3
|
||||
AdZHncbJSWZ2vXPuw2ipoEwIJQAyju4xs/cBkzg+uzYh2O8G7A08HtiEZrU8t02vv0v/PUsYTrgY
|
||||
uICQDFzM5A3JXGBmb3TO/Sehx0VkrCkBkHFzg5m9F7gidkWGaEdgd+Bg4HGE4DpOf5tLCEnKQekF
|
||||
oYfgN8CPgQuBqwjDDePuGjN7XZIkHzOzx8SujMhijNOHjEw559yl3vsPEYLLuNsOOBQ4gNCSXjtu
|
||||
dYYu6yV4JrACuAg4BziFMGwwznM2lnnv35kkyfvM7MDYlREZlBIAGQvOucu89+8hTEobV+sSWvnP
|
||||
SG+Xxq1ObdYA/j693gP8AjgNOAO4KWK9FuMu7/0RSZJ4M3ta7MqIDEIJgDSec+5C7/0RjO+Y8qOB
|
||||
5wP/gE6eWw14WnrdQhgi+CZwCeN3UNPK9ByBO5xzL4pdGZF+KQGQRnPO/dR7/wFCN/I4WZMwHv4y
|
||||
4CnEmcRXNiN/GLP0XY/3dbMF8Mr0+iUhEfgeYTXBuFgFfNzMVjjnXsnkroKQCaQEQBrLOfcT7/0H
|
||||
Ga/gvyahpf8qwgz+Otgivi77d14xsLtFfN3JE9LrTcC3gK8Dd/X42iY42swS59wrUBIgY0IJgDSS
|
||||
c+6ctOU/LpvNLAWeC7wZ2HWE5XQK6lbxddlt8etuyoJ62W2nx8req2gX4N+A1wJfAv6HsEPhOPhU
|
||||
mgS8DCUBMgaUAEjjpLP9P8h4BP81gBcAryes3R+FsiBe/No63F/2mvxsvY7jAAAgAElEQVRt8etM
|
||||
P0G/GPw73Wcl71O0HfBR4NXAsen1t4rnNsl/Oec2MLNDURIgDacEQBrFOXe59/7dhP3om+7pwNuB
|
||||
fYf8vmUt+2Ig95QH/24XJbe96CXwJyX356+k4rWdegceRugR+Cfgs8AJfda7dt77f0uSZHUzO4iG
|
||||
11WmmxIAaZLrslnVsSvSxc7AvwDPYbgnanZq1ReDvu9w3/zlnCvrAYD2wNStB6D47/nAbWadAn7+
|
||||
ttPXxUSgWN6uwJeBFwMfIWwu1FQrvPdHJkmyvpk9ASUB0lBKAKQpbjezdwE3xK5IB+sQxvjfRDht
|
||||
bxg6Bf1ikPe5q+X+NND30u1f/LqsLlDdNd/WWnfOlXb1p4lBMQlIOnzdS6/AfoTJgl8H/gNYVlHP
|
||||
2B7w3r8vSZKjzezRKAmQBlICIE2w3MyOIBwu01QHAh8C9hjS+xWDc6dg3xb404BfNgxAh9ti+f3q
|
||||
tPyv7TaXGMy3+HNJQfEq3p/vJSjOGVgDeA1hL4GPACcO8L3U4U7v/RHOuS8QDm8CJQLSIEoAJDZv
|
||||
Zh8jbBXbRBsQdq97I/2dvlemqrVfFew9Yctcc87lE4BBxvaHEXiK7+Eq7ivezl+5pKAsGZihPTHI
|
||||
jjEu6xXYHvhv4KnAvwLXLe7bG4nrzOz9zrnPE7Z7Lvs/E4limOOXIn0zsy8QtoVtov0I29W+hcUF
|
||||
/7JgP0fY+W5V7lqZXiuAFc65lc65Vc657PHZwjWXXmW9BGUJwrBVDVsUE5jse81fq7LvzTmX/75X
|
||||
5q7895z/Xovf1wuBswjzA5roMjP719y/B9k0SWTo1AMg0TjnfmJmx8WuR4klwDuAf2ZxO/hVzdzP
|
||||
B+25/G2upd+ttQ/NbkkW65lv+eZ7BxIWegYSYM7MynoFynoH8oF0S8IkwX2AI2neRNIzzWw759xb
|
||||
CD9b9QRIdEoAJArn3JXe+3+neUfEbg/8FwvH2g6iW+DPt2bnCkG/OKu/+H7jqiohyCcFWTIwPyfA
|
||||
zPIJQFUykE8EDiPsx/A24LIRfS+D+opzbgczOxglAdIAGgKQGO7w3r8PuDd2RQoOBM5k8cE/C975
|
||||
7u9iN//KrIs/91i+q3uO1uRh0gJF2UqH4lDBqtz/0Uo6Dw/k/58eA5wOvLzG76cn3vuPEo5D1mev
|
||||
RKdfQqmbmdl/ANfGrkjB6wnbzm494OuL49+9Bv6q8fxJDPpVynpKWpKn3FyBYjJQlQisA3weOIo4
|
||||
BzFVucfM3g8sp733QqRWSgCkVmb2beCnseuRs5Sww9wnCMvL+lWcANdL4O9lYtu06jhhsjApspfe
|
||||
gDcSdg/cvN5vo6M/mtknKF/dIFIbJQBSG+fc5YRWWVNsCBxHGDceRE/d/RWBv2zMXxaUrSroJREo
|
||||
DqUYYZngScCjav4eOjnZzL5DmM+gJECiUAIgdbnHe/8R4IHYFUntBPwAeMYAr+2p1Z8LUp0Cv3RX
|
||||
NjxQHBrIJwDZle9h2QP4HnBA7bWv9gngGtQTIJEoAZBamNlngD/FrkfqkcB3gD0HeG0vgb84xq/A
|
||||
PxxViddsh0QgnwRsSejx2b/+qpe638w+SvVmRyIjpQRARs459zPg5Nj1SO0LfBd4aJ+v66XVnwUh
|
||||
tfhHq2r1wKrCioGyIYH1gG8Dr6i/2qUuMrMv074FssjIKQGQUbvNe/+p2JVIHUAYC962z9dVBf75
|
||||
Wekduvs1vj86pXMESuYHFHsD1gQ+yeBzP4btGOfcZWhVgNRMCYCMlJl9Drgxdj0I3b7HEVqA/Sjt
|
||||
cibX8q/o7tes/vqUTsYs7CFQ/BklhA2fmrBXwGy6KdYDlG9uJDISSgBkZNKu/1Nj1wN4EnA8YdZ/
|
||||
rzp1+ecn+VW1+BX461X285pjYVigeM0SguwngZfFqHDBFWb2dRZ2OdRQgIycEgAZlbu9958lfiDc
|
||||
lXBi3AZ9vCarc1Wrv3hAj7r7m6OqN6BTT8CngEOi1LbVVwlHYms+gNRCCYCMhJl9Dfhr5GrsQNjd
|
||||
b8s+XtOpy7+4pl+t/mYq7b1xzs2W9AZkPQGfA54Sp7rzlpvZx8mdi4CSABkhJQAydM653xIm28W0
|
||||
GaHlv30fr6na2Ge+y5/22f0K/M1VuWSQ9iRgHeBLhCWiMZ1rZqcQDmrLNgkSGQklADJs5r3/EnE3
|
||||
/FmTcDTsXn28ptMSv1WF4K8u//FR1RtQlgRsTJgr0u8qkWH7rJndgYYCZMSUAMhQOedOB86PWQXC
|
||||
xK4D+3hNt+CvwD/+SpOAkkOZHgIcA6wbqZ4ANwDHmtkSlATICCkBkGFa7r0/JnId3kp/s7orx/wL
|
||||
a/sV/MdfLxMEZ4HHAh+LVcnUicCfCUMBWhYoI6EEQIYmPdzkuohVOAg4so/nZwGh1y7/7DUyvvJD
|
||||
Avl5Afmf/yzwQuDNsSoJ/A34nJnNoKWBMiJKAGRYbgG+FbH8HQkzuZf0+Px8EGhr+ef+PUdr0JDJ
|
||||
UOwNKO4XMAv8M/DkWBUETiNsFawkQEZCCYAMhZmdDNweqfi1CGu5t+jx+Z2Cv7bynR7FI4eLPQEJ
|
||||
8HF6/70aNk9IaqE1ARAZCiUAMgw3EU7Xi+U9wH49PrfjmD8K/tOmdL8AFnoBtiHMB4j1WXk+8Ev1
|
||||
AsgoKAGQRTOz/wbujlT8gcDbenxut+Cvmf7TqW1eQCEJeDrw6oh1+wIwoyRAhk0JgCzWjcBPIpW9
|
||||
CaHrf7Uentsp+GuZn3RKAlYB7ybeJkEXAuexsCJAQwEyFEoAZFHM7PvA8kjFv5+wbrubbsFf3f4C
|
||||
1UnALGFzqY8T5pvUzRM2tkrSvQHUCyBDoQRAFuNm4PuRyj4EOLyH51We6qfgLyWKvy/5XQN3B14b
|
||||
qV7nAOeyEPyzS2Rg+gWSgZnZ6cCdEYreAPi3Pp7fNuNf3f7SQXF1wFwuWXwdsFOken2bhV4AHRYk
|
||||
i6YEQAa1HPhBpLLfBTy8h+d1OtlPLX/ppOr8gKWE/QFmItTpTOAayicEivRNCYAMxMzOJOxZXrfd
|
||||
Ca2wbopr/edY2OUvf5+Cv1Rp6wkg/A49BXhuhPrMEk64nKF9QqCSAOmbEgAZxErg1AjlOuCDhAlZ
|
||||
nbRt8ELa6s915arlL71oSSTT5HEWeAdhKKpuZwK3stALoKEAGZgSAOmbc+53wGURij6U3k/5Kzv0
|
||||
Jd/t7zu8ViSvOClwlrA7YIy9Ae4gJN8zuUvDADIQJQDSN+/9SRGKXRt4L91/Z0vH/QvB33LPFelV
|
||||
cVLgS4CHRqjHt9N6qBdAFkUJgPTrZsLGJHU7DNity3OqJv1pxr8sVj5pzJKAdYDXRKjLVcD/ol4A
|
||||
WSQlANIXMzuX+rf93QB4Qw/PK3b7l3X9K/jLoMrmljyT+pcFGuGkwBnUCyCLoARA+vWjCGW+FNi+
|
||||
y3N67fpX8JfFaPk9c86tCbw5Qj3OBG4jfIarF0AGogRAeuacuxy4ouZiN6R7679st78sCSiO+4ss
|
||||
VnGToKcCj665DncBPyYN/GamJYHSNyUA0jPv/TmEoFqnlwDb9fC8st3+8jP+1fqXYct+5wx4UYTy
|
||||
z6C1B0BnBEhflABIrx4k7EVep6XAy7s8p2xcdk5d/zJixaGAg+htd8phuoh0Z0DCXAD1AkhflABI
|
||||
T5xzVxNmH9fpH4BdOjxe1u2f9QDkW/4io5D//VsLeEHN5d8H/IzqeQBKAqQjJQDSE+/9WTUXuRqh
|
||||
+7+bYut/NrfVr1r/UgcDvHPuGcDGNZd9OrnTAXO9APpsl670SyK9WEn9a/8fC+zT4fGyfdrnNO4v
|
||||
Ncv/Hm4EHFRz+b8D/kL1PAD1AkglJQDSlXPuKsJYY51eQe+7/uU3/dGsf6nbfBLgnHsu4aCeuvwN
|
||||
OIf2YQAtCZSulABIV977SwiBtS5bAwd3eLx07F+tf4ko+33cGdiz5rL/Ny0/GwaYQT0A0gMlANKL
|
||||
82ou72BCd2onZZP/NPFPYpnfiyJJkmfXXPYvCbtzZr0AxXkASgKklBIA6eZm6t38JyHM/q9SNvav
|
||||
Nf/SFGZmj6feyYC3ApeyEPTz2wPrM14q6ZdDOnLO/QZYXmORjwD27vKcYuvf567scZG6ZYnn5sDj
|
||||
ay77bEJLP9/6d2goQDpQAiAdee9/T70B9QWEJYBlOs381+Q/aQpLkuTAmsu8mPA3kFCeBIi0UQIg
|
||||
nawCfltjeWsC+3d5Tr71n2/5588DEInFCMMAewKb1ljulcBN5HoBCjsDirRRAiCd3A78ocbyHgo8
|
||||
suKxYus/24I13/oXaYqNqHcY4G7CXJ0sASguB1RPgLRRAiCVnHN/AFbUWOT+hC1Vq5Qt/8t3+6v1
|
||||
L02QrQbotJHVKFxEa/e/lgNKR3VuWCFjxnt/ec1FdtpFrS34O+c067+zO5xztwJ/9d5fT+gifpAQ
|
||||
DLL967dMkmRz4CFmtiWwWbTaThgzeyxhWOvBmor8NQvBfn4YwDmXoB4yKaEEQDq5ssaytqH6TPUs
|
||||
uPvCpf3+291oZj8nLAu7ysxu7PYC7+djw+bATsBuzrkDgIeMqpJTwAjJ1G6Elnkd/gTcBaxH64qA
|
||||
fC+A/k5knhIAqXIXocVYl93pvHY6C/TFXf8U/AHn3K+996cAP2fwZZvL0uscMzsG2DdJkkPM7Cmo
|
||||
C3kQCfA46ksA7iDM2XkC1asBlATIPCUAUso5d6uZ3VpjkftQHmTys/uLPQBTH/ydc7/x3h9rZucR
|
||||
zkIYlpXAL7z3vwAekyTJYWb2pCG+/zSwJEl2897PUM9W2isIvXZ/R/j7cGgYQDpQAiBV/kIIAnWY
|
||||
Afbt8Hi3BGAak4C7zewrZvZdRv9zutR7fylwgHPuLcD2Iy5vYpjZwwkrAm6rqcg/p7dVQwDqAZB5
|
||||
WgUgpbz3f6qxuE3pfflf1v2f3Td1nHOXmNnrgG9TX5IG8DMze51z7qwayxx3mxDmt9Tld4TehpbJ
|
||||
gLSuBNBwjgBKAKTaVTWWtQfly//yy/uKLf+p3PbXOfdD7/0bqffnk7fMe/9eM/syU5qA9cmAvWos
|
||||
72rCUEAW/KuSABElAFLKA9fVWN6jqf5gKm79O7Xj/2Z2nPf+SOrdm6GMB75kZh9lyn4Gg0iSZJca
|
||||
i7slvbK/p2w5oPYDkDZKAKTMbcA9NZbXrft/PgkorP2fGmZ2HPCZ2PUo+J6ZfQz1BHSzLfXNt5oD
|
||||
rk2/rhoGUBIggBIAKZFuHnN/TcWtDexYcn+x+z/fEzBVO/+Z2fdpXvDPfMfMPhW7Ek1mZptR3zwA
|
||||
I0zgLU780zwAaaMEQMoso77dyzamelZ5vgeguO5/KoK/c+5XwFGx69HFN9PVCFJufcImS3UprgSo
|
||||
SgJkyikBkDbe+2U1FrclsEHFYy2tfufcVAV/4Hbv/Yepd6b/oD6Vnh0h5bausaxsAy/NA5COlABI
|
||||
mTo3AHpYxf1VGwBNS/e/mdlngK5b+TbE/d77TxKOkFaAafeQGsu6jYW/j+JQgJIAmacEQMrcXmNZ
|
||||
ZQlAPsgXx/6nogfAOXcBcFrsevTp12b2PRRg2iRJsl2Nxd0O/I3qeQAigBIAaecJZ4vX5REV9+eD
|
||||
v03Z7H/vvT+G8Zxd/zVCC1QtzVZbUN//xZ0srOIpG//XREABlABIuxXUt20pVI+NFocApqn1/3/A
|
||||
b2LXY0DLzOwUwvbO2efL1AcaM9uEcDRwHe6hdRLvfODXPADJUwIgRbPAvTWVtZQwQ7qobPzfCo9P
|
||||
LO/9iYz393gyoQtaO9AtWJOwLXAdHiScCFls7WsvAGmhBECKZgldiHXYAFi3cF9x/L/smljpTPoL
|
||||
Y9djkW4wswsJm9/MoKADsDrhzIu65Dfyqpr8N80/D0EJgLS7n/qC7Dp0PgMg2/1vKoI/gPf+LMZz
|
||||
7L/oTDPLEoD85LNpDTpLKO/tGpVsKW+xF0DJmMxTAiAtnHO3U8/Z5RB6ANaueGzqWv+E9f4Xx67E
|
||||
kFwC3JUmAUtYGA6YVo6w6VVdZkvKV/CXFtP8Bynl6vydWBNYo+T+TsF/kpOAm4BJ2UznNuCPwGol
|
||||
PQHTGoBmaiwrv39Ep30ApvVnISgBkHZ1HgK0Fu0BvRj0p2XpH865GxiPXf964QnJTNYDkCUA05wE
|
||||
1DkHoPh7pGEAaVPXCVUyPu6gvoC7IZ2PAZ6qIQDv/aS0/jNZAmBmVpzLMdE/ywqr1VhWvnHXEvzN
|
||||
DOcU+0UJgLSrs5uyqNsKgEl3U/enjJXrCEFnBlhiZmXnOUzDzzVT5/eanebp0nK1HbC0UQIgTdOS
|
||||
BOQCxjQYl33/e3ULYShgCQvDOXOE1unUDO1EUva7pMAvLTQHQJqorHU4DcHivtgVGLIH0tuE0Asw
|
||||
Y2ZTOxcgSZKNYtchR8mAKAGQxpnWFQAweR/G+X3o55MAWhOAaVK24qUO6vqXUkoApKmmaew/M2nf
|
||||
azb23JIAlPQCTIsm/HyVBMg8JQDSJNPS0q9S12ExdckH+GIvwNStRffe31pncTWWJWNKCYA0TaeV
|
||||
AJNuy9gVGLKtCUvfikMBiZklufumRV07bEI4fjivaktgmWLT9Mcnvamz5VD1+zcNwb7M5rErMGTb
|
||||
0X4YUFK4YHoCUZ3f5wZ91GFa/v+lQAmAFC2tsaxOs96npdU/L0mSh8euw5DtlPu6OAlt6lYBUO/n
|
||||
badEXicCCqAEQNptSn0fCndSvhXwtHoEk7U3x6MK/y4L/tPUHb2s+1NGahr+j6UPSgCkqO7JQ1UB
|
||||
vzgXYOKZ2VbAQ2PXY0jWB3YruX8+CTCzaQn8mRU1llU1n6Q4D0CmmBIAaWFm61HfB8PtwL1l1Sjc
|
||||
Tou1gZ1jV2JIdgZ2yP27bNb/NLX+Dbi7xvLqHMqTMaUEQIo2pr7fi+Us7BY3bcG+VJIkT41dhyF5
|
||||
Np0nnE1D0M+bozzZHZX1Cv9uGfc305+bKAGQdgmh+7YOdwJ/q6mssWBmewM7xq7HIm0AHNLh8Wlq
|
||||
+WdWEHq86jJpK0pkBJQASNES6ksAljN5+98v1urAobErsUjPYnLmMgzLLCHhrcPqTN6mUjICSgCk
|
||||
aA1gkxrLm7QT8BbNOXco47sp0FLgzbEr0UB3A/fUVNZ6wLo1lSVjTAmAFM0AG9ZY3l9rLGtcbAAc
|
||||
FrsSA3oxsEuX50zT7o4AOOduor7vdyNgnZrKkjGmBEDKbFxjWX+usayxkfYCFNfRN92WwLu7PGdq
|
||||
gn6e977Onq71CStK8qbtaG3pgRIAKVPnBKI/pbdlu5NN0ySxoqVJkryHeEfIDuLDwFYVjxUD0LSd
|
||||
83BdjWVtRpffG+em+U9LMkoApE2SJJvWWNxfgPs7PD5ts8XnmdkewFtj16NHLwde2OU5LUHfOTct
|
||||
wR/C73ldigcB5U3dBltSTQmAlNmU+rakvYvWiYBq/QcG4Jx7GfC8yHXp5gnAx+j+eZJPADzT0wPw
|
||||
AHBbjeVVrcCY9P9n6ZMSAGljZpvTPoY4KncD11Q8piQAnHPuCOApsStTYTfgq7RvPFNUFfzzj0+q
|
||||
ZdQ7BLB9l8en5f9dulACIGW2pPsH+rAYcFXhvqnt9i9hwFrOuaOBpu0SuAdwIuHY306KwT+7pqIH
|
||||
wDm3jM7DXMM0QzhUSqQrJQBSZgmdxxGH7YoOj03jrnF5WdBcA/gU8I9xqzPv74ATgG16fH5L8HfO
|
||||
5ZOAiea97/T7PWybANuW3F828XJaz9yQlBIAqVJnK+IiYCXTeURsJ/kPaA+sBXySsNRutViVAl4F
|
||||
nERvwb8YcMp6ACbdJTWW9TC0C6D0SAmAVHl4jWX9hephACUBaeB0zs0RAuc7gG8Bu9Zcl62ALwFH
|
||||
09920Vngn8td0zIEsBy4tsbydqFzcjgN/+fSIyUAUipJkh2o7/djFrgw/bqsF2DaVwbkW89ZAN0P
|
||||
+BHwPka/dfNS4HDgZ8BL+nhdsdU/B8zluv/9kOvZOM65PwK31lhk2XHS6uqXUkoApJSZbUrYUrQu
|
||||
F5bcV7Y50LRpCaJpL0B2rU0YDvgF8E66T8br18bAK4CzgE/T+3g/lCct+WsqgpL3/ipgVU3FLaF6
|
||||
6K64/l89AVLbWm8ZP5sQunzrOsL0UsLRwOuQa/mbmXPatgzaW9KzhATeEQLzB4HXE1rp3wH+ANw0
|
||||
QDmbE4Z/nk040ncxSUW+zrOE1v8crXMAJl2d4/8b0fkcBgV9aaEEQKosIQSC39RU3h+Bq4HHpP/W
|
||||
hMAF2Qe2JwRRZ2YJIajm/382J3TRvwS4AfgdYYXFFYRDl24AHsy975rA1oREb2fCmv5H030deS/1
|
||||
zbf+s+A/y3RNALybMMG1LltQfYpkscdl0v/vpQdKAKSTXYHv11SWAf9HSACqAr9juj+45oOqc27W
|
||||
zMr+n/K9AtsAT0/v94Su6Pz/nyNMGBvmUGAW2LOu/tnclZ/8N/Gcc5ebWV1HAAM8lvZEubjcL9uC
|
||||
Gabk5yDVNAdAKiVJ8mjq/R35CenudxXXNCtOqJstuTq1rhPCXgJr5q41qCn4p63/4uz/iea9L5vX
|
||||
Mkp7d3isLREYfXWk6ZQASCUz2wZ4SI1FXkoYCsg4Flq0074SAApd62lQrUoCsufXWa9i8F8FrCoE
|
||||
/4mf+Z9aTvnE1lFZk7AzY5lOGwApEZhiSgCkk7UIY8J1uY8wDKBlgJ0Vk4BVVHe1j/oDvmy2/3yd
|
||||
cklKvut/4oOOc+4q4M81FvlwejsDYGp6YKQ7JQDSzaNqLu8UCsE/nfCW9QRMu2JrezaXBBQTgVFu
|
||||
tlPc3a+l1U9o+a+iteU/NYHHe//zmovcjfIDvLT9r1RSAiAdOef2JGwEU5dfA1ey0P2vIYB2ZUlA
|
||||
FnhXUt4jMKxEoCrwF4N/jN6IprgX+N+ay+x2WqSSAGmjBEC6eRhhqVhd7gd+QGsvQDEJkO49AWU9
|
||||
AmWt8W5BoBjwi1392ZUlHlnLf9qW/M1zzl0K3FhjkWsB+5TcX9b6114AMk8JgHTjgCfWXOYpwAO0
|
||||
B3+tCGhVDM6zzrmsN2Al1b0B+f34e73yr8snGvPlOOdW5oL/NLb8AfDen0m93/OedE7S539H0iWA
|
||||
U/XzkGpKAKSrJEk6LS8ahd8DvyLXA5DOA1Dwb1c6Du+cW1WSCFT1ChQTg7nC/fnn598ne++VzrmV
|
||||
VPcyTJObgXNqLvNAqg8AUi+AVNJGQNKVme1I2GXslhqLPRb4e1rnASSEADPtGwIV5f8v8oE3Oztg
|
||||
Jk2gZmj//6yaX1FcKpYfApjvFUgP9qkK+lP3MzKzUwlLAOuyOvDkiseKPzsFfWmhBEB6sRGhm/H0
|
||||
Gss8m3BM8LZUTwbUh1mryqDtnEuAuVxPSv4W2ntXiu81H+ALp/l5WgNM/rXT5gHCZlZ12omF7bOr
|
||||
lCUB0/ozkhwNAUhPkiR5as1F3g18m9aJgFoO2F3VpjzZ0MDKdHgg67ZfQejGX1F1OedW5F6XH0bI
|
||||
zyWY+sDinDsX+FPNxT6d0LNTVOzq189I2igBkJ6Y2Z7AZjUXewJwB2ng1zyAvpQt1yvbpS9/rcxd
|
||||
qwoBPz93oHis79Ts79+J9/7EmotcE3hml+fM/3xyEwCn/mclgRIA6dV6wBNqLvNGFpYElo1bKxHo
|
||||
rmoJX9lSvqqr+Bq1JguccxcDv6252EcAj6x4rFMPAOjnJigBkD4kSfIU6g+6xxH2BsgmsSn4D65y
|
||||
Ml+Hq2ycX4G/wHt/PGEopU4HEfYAqFL8mamnRlooAZCemdm+wHY1F3sl8F0WhgGymexKAhav2xIx
|
||||
LRnrgXPuIuDcmotdAryw4rGy1r+SN2mjBED6sRqh1VG3YwgzrMsmAioJkJi89/4b1B9U9yXs0lml
|
||||
uApEgV/aKAGQviRJsj9h8lGdrgJOonUyoFYDSHTOuUuA8yMU/UK6b/6TH7pRD4C0UQIgfTGznYDd
|
||||
IxT9KeAuWjezURIgMc16779ICK512gZ4VsVjlfs3oOAvBUoApF8uSZLnRCj3ZsLugPkd7TQhUKJx
|
||||
zv0CuCRC0c8B1u/weLH7X7sASiklANIvM7MnEnboq9sxwLW0DwMoAZC6PeC9/1KEclcHnt/h8arJ
|
||||
f1oBIG2UAMgg1gUOjlDuvcC/o8mAEpmZHQ/8OULRTwL2qHgs3/1ftl1z/jkiSgBkMM65ZwPrRCj6
|
||||
dOAsFg64yS6RuvwF+Gaksl9D59/3luBf6P5X8JcW+uCUQRhhIlKMJYEA/wE8iOYCSP3MzD5HvSf+
|
||||
Zfag+uQ/KO/+L/YAiMxTAiCDsiRJng+sEaHsPwBHExKAfBIgMlLOudOBn0cq/nBgacVjWYAvBn51
|
||||
/0slJQAyMDPbBdgvUvHHApcVhgHUCyCjdIv3/rPECaQPB/6hy3M6zf5X8Jc2SgBkUAaQJMlhVG9I
|
||||
MkoPAh8g7L+uXgAZOTP7NLAsUvFvIEy+rVLs9i+e4yDSRgmALIaZ2aOAp0Qq/zfAZ9QLIKPmnPsR
|
||||
cGak4h8GvKjD42VHP6v7X7pSAiCLlvYCzEQq/r+Bc3OHBOl3WobtOu/9f0Ys/w2E47g7KZv9rw2A
|
||||
pCN9WMpiGICZPRp4aqQ6rALeR+ia1XHBMmwrzOzfgXsilf8Q4J86PF518p+Cv3SlBEAWywgrAl5B
|
||||
nBUBADcCR5iZo31poMjAzOxLwEURq/D/gA26PCff9Z9dmgAoXSkBkGGwtBeg6oCSOpxNODBIhwTJ
|
||||
UDjnTgOOj1iFPYGXdnlO25r/XPd/3YcUyZhRAiCLNd/16Jx7Jd3HKkfpGDP7KZoQKIvknPud9/7j
|
||||
xGs9O+Bf6LzCpmzyX771D2r9SwdKAGRYDNgOeFnEOswB7ydsFKReABnUnd77fyWcPRHL09Krk7Zx
|
||||
f03+k34oAZBhmG+JOOdeDjw0Yl3uNrO3E44PVi+A9OsBMzsCuDpiHZYCR9J9z39oXfefXRr7l54o
|
||||
AZBh8sA6SZK8OXI9rjOz9wD3oyRAeufN7Cjgl5HrcRiwa5fn5Fv+c8Ccc06b/0hflADIsMy3SMzs
|
||||
6XQ+tKQOF5vZkenXCv7SVTrj/5TI1dgOeFeX51S1/tX1L31RAiDDNP/h45z7f8DacavD6Wb2YcIH
|
||||
o+YESCUzOxb4Sux6AB8BNu3ynGLr35e0/pUESFdKAGSY8pOSdnrrJeUAABQ/SURBVAReHbc6AHzX
|
||||
zLLlgRoKkDbOuVOBz8auB/Bc4HldnlN26t8s6vqXASgBkGHLLwt8BfDoyPUBON7MjkFJgBQ4537k
|
||||
vT8ydj2A9YEP9/C8srF/7f4nA1ECIMOW7wVYi7Asb62oNQo+k47xKvgLEDb68d5nQ0SxHUn31TPF
|
||||
ZX9zhNZ/ce2/SE+UAMgo5HsB9gBeG7k+mc+nwwGGEoGp5pw7NW35z8auC/B04PAuzynd9Edj/7IY
|
||||
SgBkFIotlVcDe0Wt0YLj0sNdPEoCppKZfdV7/yGaEfy3BD5Bb7+LVXv+q/UvA1ECIKMy/2HlnFud
|
||||
0MUZe1VA5rtm9n7CPgFKAqaHN7MvAJ+jGQHTAR8jnPjXSdl2v1nrX8v/ZGBKAGRU8nuRzwE7A/8c
|
||||
rzptTjezdwC3oiRgGtyfLgltwlK/zGHAP/T4XI39y9ApAZBRmv/QSlsrLybuiYFFF5rZW4E/oSRg
|
||||
kt1mZu8m/iY/ebsDH+rheWUT//Jj/9r2VwamBEBGqeXDK/3QOhLYKWalCq40s8Odcz9DScDEcc79
|
||||
1szeBJwfuy45GxCGITbu8rxus/7V+pdFUQIgdciPX64PHEUzlgZm7vbev9fMjkNJwMRIl/m9hbgH
|
||||
+5T5KLBHj88tG/svdv8rCZCBKAGQUSv2AswSPvz+NWqt2s0CR5vZe4E7YldGFmWFmX3ae/9+4J7Y
|
||||
lSl4A70dmV028W82/fvRsj8ZCiUAUpd8V+Ys8AKasz9A3plm9nrn3K9jV0QG8uf0OOjjY1ekxFPp
|
||||
PfEt6/rXxD8ZKiUAUoeW1kw6F2AWeDewX8yKVbjGe/8mM/sqzVgrLj0ws++b2auIf5xvmYcTxv3X
|
||||
7OG5Va1/bfojQ6UEQOpSlgQsAT5DsyYFZlYCnzOzNzvnroxdGenoJjP7Z0Lrumld/gAbAV8Dturh
|
||||
uaUT/0rW/IssmhIAqVu+ZTNLmBH9ebofgRrLhd77V5vZ1whJgTSIc+5UMzscODN2XSqsSfj97mXS
|
||||
XzH457v91fqXoVMCIHWqGgrYCfgCsE7EunWynDBB8LWaG9AY15jZO733HwRuiV2ZDj4GHNLH86sm
|
||||
/mnWvwydEgCpW1USsA/wSWCNiHXr5nLv/evN7GPAstiVmVLLzezL6Vj/z2NXposjCOdg9KI47j9L
|
||||
efAXGZolsSsgUyv/YefS6xDgJsJmQU01B5xkZucAL3fOPYvmnHEwyeacc2d5779K89b1lzmc3re+
|
||||
Lp30R/mmP0oCZGhmYldAWuwOPLNwX3EL0InbAcw5l22+44DHEzYLOptmf4/3AecB5yRJsh6wHfp7
|
||||
Ggnn3AVmdqSZfRO4M3Z9evBK4FP0fsJfWfBflesdG9fgfxlwYexKSDX1AEgs2YdZNhTgzGyW8KH5
|
||||
WuBe4D9jVa4P13jv/wV4TJIkLzSzp6KhtaFwzl3gvT/RzM6OXZc+HEo43ref34Gyrv988PfDrqQI
|
||||
KAGQ+PLzAZyZZcMB7yIs6WrS6W2dXOq9vxQ4KUmSF5nZfsBqsSs1jpxzv/Lef8vMziUExXHxDOC/
|
||||
6X0eS+m4P+Ub/oxb61/GgBIAiSnfCwALcwGy6yOEltSX66/awC7x3l9COP74Oc65A+l+6IvAfc65
|
||||
c7z33zOzSxm/gPdM4FhgaY/Pz4J/ccxfs/6lNkoAJLbiUAC5XgAH/BthLfXRkeo3qCuBo8zseODA
|
||||
JEkONrNdYleqga4zszOAs8xsHCb3lXkWcAz9B//ien8Ff6mVEgBpgpaegMJQgAM+QNgw6MNxqrco
|
||||
NwPf8N6fCDw+TQT2Zrp7Be5zzl3kvf8ZYbLn8tgVWoTXEOaq9DrmX9ntXwj+GveXkVMCIE2SfegV
|
||||
5wM44C2E39ePMJ478q0EzvXenwtsAeydJMnTzGxnwlaxk+4+59w13vszgfPM7PrYFRqCVzNY8O91
|
||||
vb9a/zJSSgCkKYwQ6KsmBTrgjYT91N8MPBCrokNwC/BD7/0PgW0IKwj2NrPHAZswOasI7nLOXe69
|
||||
Px+4bIy7+Mt8kHCYVa/yQb2q5a+uf6mVEgBpkuKkQNI5AfnnPAdYj5AM3FZf1UbmBuAG7/2phA2F
|
||||
HgPsmSTJTmb2KMKeCOPifufcH7z3V5GuATezJh7OsxhrAP8FvKKP17TMcyG31j+9NO4vUSgBkKbJ
|
||||
f1g6WncKzK79gR8Qxl+viFDHUVkOnEsYKnDA5iz0EOxmZlsAmxESoNiWA7c555Z5768ALgb+ambL
|
||||
CEFtEm0MfBE4eIDXtpzuR3nrX8FfaqUEQJoo+xCcg/legOKuajsDJwNvAn5WY93qYoShgluAX3vv
|
||||
AVYnJARbE+YRPCxJkm3MbEvCPILVCS3UYfxdzwIrCMH8Xufcdd77G0h7LAhbNt9kZuM8ga8fuxNm
|
||||
+j+yz9eVzfZfRdjpTy1/iUoJgDRVcWVANhSQ9QJAOEL4m4RDV46tu4IRrAT+nF4ApIlBAqxF6B3Y
|
||||
hNBDsCHh73tzFv6/1kiSZMPs3977e4D7c+9/GyHo303YifE2wta795nZOG3IM2xPBz4DbNnn6/LB
|
||||
XzP+pXGUAEiTZR+gwPzywOJz1iCcIvhI4EOM95KyQXnC931telU/0SvW9CEB3k5YhtrvZ2VV8F/l
|
||||
nFtFa7c/qPUvEUzKbGOZbPNdqGnLKT95KmtJvZowJLBDrErKRNkYOI6w90Q/wb+4yU/LhL+KMX8F
|
||||
f4lCCYA0XX4oIFseWDaDeg7YGziFcKywyKAeB5wKPK/P17X9rtIe/LPfVwV/iU4JgIyDtmVUHZKA
|
||||
rYCvA0fR+9asIhBa+m8DfgQ8us/XFoN//vczH/zzE/4U/CUqJQAyLoobqRSTgPy4qgPeQFgq+Nj6
|
||||
qypj6CHAtwhnT/SbOFZt71sW/DXjXxpDCYCMk3zLaY7WOQH52+yDdm9Ca+5t6Hddqj0f+AnhON9+
|
||||
FX8n893+s+mEPy33k0bSh6KMm7aT1DpMDPSE5XEfAf6HsHeASGYrwsY+x9L/Ej8ob/nnu/2Ls/0V
|
||||
/KVRlADIOGobb00/bPNXcbb104EzCfu3a27AdJsBDiNsIPXSAd+j125/BX9pLCUAMq5KVwc451ZS
|
||||
Pi/AE44U/gBwGvCk2mssTfAY4ETgs4RdFfvVMfCz0PLXmL80nhIAGWfFD+NsXkCxJ6DYEtsL+CHw
|
||||
aWC7+qstEWwM/AtwOnDQgO/RbY3/yood/hT8pZGUAMgkaJuElUsCVtI+L8AI3cCHE7qB3wSsW3+1
|
||||
pQarEbr5fwq8D1hnwPfpZby/eKxv9jqRRlICIJOi7QO6JAkoDgkYYa/8o4AzCBu/zNRecxmV/YHv
|
||||
Eyb67Tjge+TH73sN/hrzl7GgBEAmSVkSkH1Y5+cGFJMAA3YDjidsJ7x/7TWXYdqLsKb/+8B+i3if
|
||||
fsb7tcxPxo4OA5JJUzxcZdY5Z4BZOEkou7Lf/YTWRHh/4MmELuPPAOeMusIyNHsQhnOexeJWeuR/
|
||||
h/Lj/fNJQGGWv3b3k7GkBEAmkRF2A2z5YA6HCVq+VbeE0OU/Q0gCsmNzE8JEsYMIicAXgV8QPvCl
|
||||
WRywJ/B6whDO6ot8v2KXf9lRvtm/PZrsJ2NMCYBMqvyH8fwHdJoEZME//2GfJQH53gAHPDW9fkY4
|
||||
He4MYMVoqy49egrwWkKittoi36tTq7/Y8s/P8lerX8aWEgCZdPn9AuZ7AghDAtmH+JL0tqw3ILs9
|
||||
IL1+D3yFkAjcWMc3IC02Bg4EXgU8nuF8hlW1+ssCv7r8ZWIoAfj/7d3pqyVHGcfxb/VgMjoxkJgE
|
||||
UaKThRlNiEQDLtE3IohRfKGvxAXMK/FNRBAVBAVBBP0bVEQElbyIIMQlJu4mJhhcGCfbJJnExOAs
|
||||
0XEms3C7fFGn59ap233Onbt19znfDzRnmbvUnRnu8+unqqu1DPKzu/O/6EMI9WRKoOwI5CEgPwBu
|
||||
JO0f8CzplrE/AP5CKgzaHgHYT7qc7wPA9Vv0ddd71p+/13xs/vnSKBkAtCzKKYG8G1B3dAMq2qcF
|
||||
IO0i92ngU6TpgZ+Qdhh8YRt/hmVzKXAb8CHgvWy+zd8oC3++h0S+l0TZ7rflr4ViANCyWU83YBfT
|
||||
CwQj09MCML1gsFkn8CXSXeV+DPwB+O+2/iSL6eXA20nz+h9k63dqbGv310xfx5+f9ZeF3+KvhWEA
|
||||
0DLabDegLQgAXEVqU38ceIQUAu4C/gb8e1t+ksVwOXAD6Wz/3cBN2/A9ImuLf9tZf1n4m/8fYPHX
|
||||
gjEAaJl1dgOAlUkQaLoBFWsXCXYFAUhz1vuB24FnSPsJPADcM3m97F5N2qTnHaR9F67bpu/TVvjb
|
||||
5vpXiuJffp60cAwAWnat3QCgyi4ZbIJA/jzvBswKAgBXAx+bHC8CB4B7gYeAv7Mc6wauIp3lv4lU
|
||||
8G8hnflvl1mFf6rlb7tfy8oAICXzugHN2X95XEgQgHRL4lsnB8DhyfFn4PfAQeAo8J8t+an6sQe4
|
||||
ArgWeCep2O9j+++82PpvSPtZf1vht92vpWIAkFblv/RXSEW86QbUTK8PWGE6BOyafPysNQJtXjc5
|
||||
3gXcQdpk6AnSGoKDwKPAP4CngdMMazfCXcBuYC/pZjv7imPPDo1js4Xfdr+WkgFgWJahFTwGbdMC
|
||||
NakjsALsmnQE8iBQs3ahYMXqtsQwPwwAXExqld+QvXcKeAl4CnicFAaeIS0sPAIcB44B/yOFhK2y
|
||||
m7Qq/3LgMtImPFcCr58c108eL2Fze+9vVF6w80KeF/ey8DfvRWz3bzdvNjdwBoBh8bKxYWkKQ9Pe
|
||||
bwsC+eLAvBtQsRoK1js90OUVk+NVpHZ67gxwktXif4JU4A6TugVngOdY7Wi0/YyBtK/B7sl7V5OC
|
||||
yCXZ4x5SGOhb19l+2wK/mvmFP/+a2lon+x6AZjMADMu5vgegVnmhKINAxfQagfJqgXKNQLmz4IWG
|
||||
gdLFk6NcUPfWTX7dISkLdV7Ay1b/+QDQrN9gOiBY+HfOkb4HoNkMAMNygnQmd0nfA9EasXieB4Eq
|
||||
WyyYdwDKx3yNwEanCJZFWaTLAt5V+OvsjN/C368TfQ9AsxkAhuU4aV7XADBcs4JAaDoCQDXpCuQB
|
||||
oDxqujsDsFyBoPx7bTvygj41z5+d7efhoJzft/DvnHOkq1k0YAaAYTlGmq+9pu+BaK5yWiBkr5sw
|
||||
0ASBthBQXjXQNk2QdwdgsQJBWfCbx1lFvzzjby7TLC/jK2/WY+HfeS+SbpilATMADMsK8Bjp2mmN
|
||||
R75YsFlsF1idHmjeb8LArKOtI5AHAhhfKCgL8KyCX7b412zikxX9MiB4tj8QIYQjMUbXAAycAWB4
|
||||
HgI+2fcgtCFt0wPNlQD5FEFgdhjo6giUiwe7QkHb653QVeib5/MKf9vZfn6m39Xet/APTF3XB/Hf
|
||||
YvAMAMPzR1bnhjVO5fRA2RUItIeBpvB3BYHmuupZgYDsNTNeb4ULKfj5e20Fvyz8seNM36I/Dg/1
|
||||
PQDNZwAYnqeBh4G39D0QbYkyDEB7GJgq9ll3YN46gVmXFnYFgs2EgVnt/PJxXot/6rG5G2PLx7QV
|
||||
/baxaBhOAn/texCazwAwPGdI95S/hbXtXbsC49ZWvPLifb5TkHUH8kCQdwLmBYH1hoFZ77UV2K7F
|
||||
e81jW6u/tahnbf31HLPGpAEJIRyIMT7f9zg0nwFgmO4GPgtclL3X1erV+LStFaB4zKeBmg7B1FGE
|
||||
gq4pgfVOEWxk3M3j3Pn9SbFv/rx5Xnd8Tvn1NSJ1Xd9LCrMaOAPAMD0MPEi6GsBiv/jKaYK2zs+a
|
||||
522hACDG2FX419sN6BpfOdbm8fzzSRs/f78rILQ9b/t+GpfjwD19D0LrYwAYru+xejlgeTanxdXW
|
||||
HSgDQf58TYGfBIPyY7o+fzNja3tv3pqAWV9LIxdj/AVuATwaBoDhuhs4RLrbWi7/Ze4vzsXXtW4g
|
||||
f78rGLT9edvrjY6nfL2es3n/zy6ul4A7+x6E1m9X3wNQp9OkgPYeVudNmzubtS2O0vKaOwdfHOXO
|
||||
eRfyOW3vz2v1awmEEO6NMf6o73Fo/WwpD9se4GfAftLe2mdCCGcnz5vtUKWN2OwUgJQ7E2P8KKlr
|
||||
qZGo5n+IenQS+BqzL/+SNmK9Z/52mzRXjPH7WPxHxymA4Xsc2EfqAjTbovpLWdJQHAK+TOpMakTs
|
||||
AIzDV4B/YQdA0rCcizF+k9St1MgYAMbhn8DnWb2xTNu13ZK0o2KM3wLu73sc2hinAMbjCVIAuJXp
|
||||
u6M5DSBpx4UQfh1j/AYuRh4tA8C4PAhcDbyxWAdgCJC0Y0IIj9Z1/TngVN9j0cYZAMYlAr8Cbgwh
|
||||
7GX1GmxJ2imHYox34I5/o2cAGJ8V4JfAGyYhwJumSNoph2KMXyTdtlwjZwAYp3PAfVVVXQNch8Vf
|
||||
0jYLITwWY/wMFv+FYQAYr7Mxxp8Dl4YQbup7MJIWVwjhN3VdfwF4oe+xaOsYAMYtAr8FjoQQ3gxc
|
||||
1PN4JC2WOsb43Rjj14ETfQ9GW8sAsBgOAPdXVbUXeE3PY5G0GJ6KMX4V+CFp7ZEWjJvILJaXAR8J
|
||||
IdwOXNb3YCSN0tkY453At4GjfQ9G28cAsJheC3wihPB+4JV9D0bSKKyEEO6r6/o7pK6iFpwBYLFd
|
||||
B3w4hPA+4PK+ByNpkE5PCv9dwJ/6Hox2jgFgOVwB3FZV1a0xxpuB3X0PSFK/QggH6rr+HfBT4Mm+
|
||||
x6OdZwBYPnuBm6uqeluMcT8pHDhNIC22U8DxEMLhuq4fIJ3pPwmc7ndY6pMBYLlVwLWkNQNXAlcB
|
||||
V1RVdSluLiSNVQBO1nV9FDgGPA88BzyLl/JJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJ
|
||||
kiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJ
|
||||
kiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkjRg/wcFcukwqN+itAAAAABJRU5E
|
||||
rkJggg==
|
||||
"
|
||||
id="image3063"
|
||||
x="0"
|
||||
y="0" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 30 KiB |
BIN
icons/icon_scalable_yellow.xcf
Normal file
BIN
icons/icon_yellow_512x512@2x.xcf
Normal file
BIN
icons/radio_co_badge.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
541
install-sh
Executable file
|
|
@ -0,0 +1,541 @@
|
|||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2020-11-14.01; # UTC
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
# following copyright and license.
|
||||
#
|
||||
# Copyright (C) 1994 X Consortium
|
||||
#
|
||||
# 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
|
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the X Consortium shall not
|
||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
# ings in this Software without prior written authorization from the X Consor-
|
||||
# tium.
|
||||
#
|
||||
#
|
||||
# FSF changes to this file are in the public domain.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# 'make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch.
|
||||
|
||||
tab=' '
|
||||
nl='
|
||||
'
|
||||
IFS=" $tab$nl"
|
||||
|
||||
# Set DOITPROG to "echo" to test this script.
|
||||
|
||||
doit=${DOITPROG-}
|
||||
doit_exec=${doit:-exec}
|
||||
|
||||
# Put in absolute file names if you don't have them in your path;
|
||||
# or use environment vars.
|
||||
|
||||
chgrpprog=${CHGRPPROG-chgrp}
|
||||
chmodprog=${CHMODPROG-chmod}
|
||||
chownprog=${CHOWNPROG-chown}
|
||||
cmpprog=${CMPPROG-cmp}
|
||||
cpprog=${CPPROG-cp}
|
||||
mkdirprog=${MKDIRPROG-mkdir}
|
||||
mvprog=${MVPROG-mv}
|
||||
rmprog=${RMPROG-rm}
|
||||
stripprog=${STRIPPROG-strip}
|
||||
|
||||
posix_mkdir=
|
||||
|
||||
# Desired mode of installed file.
|
||||
mode=0755
|
||||
|
||||
# Create dirs (including intermediate dirs) using mode 755.
|
||||
# This is like GNU 'install' as of coreutils 8.32 (2020).
|
||||
mkdir_umask=22
|
||||
|
||||
backupsuffix=
|
||||
chgrpcmd=
|
||||
chmodcmd=$chmodprog
|
||||
chowncmd=
|
||||
mvcmd=$mvprog
|
||||
rmcmd="$rmprog -f"
|
||||
stripcmd=
|
||||
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dst_arg=
|
||||
|
||||
copy_on_change=false
|
||||
is_target_a_directory=possibly
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
-c (ignored)
|
||||
-C install only if different (preserve data modification time)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-p pass -p to $cpprog.
|
||||
-s $stripprog installed files.
|
||||
-S SUFFIX attempt to back up existing files, with suffix SUFFIX.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||
RMPROG STRIPPROG
|
||||
|
||||
By default, rm is invoked with -f; when overridden with RMPROG,
|
||||
it's up to you to specify -f if you want it.
|
||||
|
||||
If -S is not specified, no backups are attempted.
|
||||
|
||||
Email bug reports to bug-automake@gnu.org.
|
||||
Automake home page: https://www.gnu.org/software/automake/
|
||||
"
|
||||
|
||||
while test $# -ne 0; do
|
||||
case $1 in
|
||||
-c) ;;
|
||||
|
||||
-C) copy_on_change=true;;
|
||||
|
||||
-d) dir_arg=true;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) mode=$2
|
||||
case $mode in
|
||||
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
||||
echo "$0: invalid mode: $mode" >&2
|
||||
exit 1;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift;;
|
||||
|
||||
-p) cpprog="$cpprog -p";;
|
||||
|
||||
-s) stripcmd=$stripprog;;
|
||||
|
||||
-S) backupsuffix="$2"
|
||||
shift;;
|
||||
|
||||
-t)
|
||||
is_target_a_directory=always
|
||||
dst_arg=$2
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-T) is_target_a_directory=never;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
--) shift
|
||||
break;;
|
||||
|
||||
-*) echo "$0: invalid option: $1" >&2
|
||||
exit 1;;
|
||||
|
||||
*) break;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# We allow the use of options -d and -T together, by making -d
|
||||
# take the precedence; this is for compatibility with GNU install.
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
if test -n "$dst_arg"; then
|
||||
echo "$0: target directory not allowed when installing a directory." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||
# When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dst_arg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dst_arg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dst_arg=$arg
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if test $# -eq 0; then
|
||||
if test -z "$dir_arg"; then
|
||||
echo "$0: no input file specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
# It's OK to call 'install-sh -d' without argument.
|
||||
# This can happen when creating conditional directories.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
||||
if test ! -d "$dst_arg"; then
|
||||
echo "$0: $dst_arg: Is not a directory." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
do_exit='(exit $ret); exit $ret'
|
||||
trap "ret=129; $do_exit" 1
|
||||
trap "ret=130; $do_exit" 2
|
||||
trap "ret=141; $do_exit" 13
|
||||
trap "ret=143; $do_exit" 15
|
||||
|
||||
# Set umask so as not to create temps with too-generous modes.
|
||||
# However, 'strip' requires both read and write access to temps.
|
||||
case $mode in
|
||||
# Optimize common cases.
|
||||
*644) cp_umask=133;;
|
||||
*755) cp_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw='% 200'
|
||||
fi
|
||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||
*)
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw=,u+rw
|
||||
fi
|
||||
cp_umask=$mode$u_plus_rw;;
|
||||
esac
|
||||
fi
|
||||
|
||||
for src
|
||||
do
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $src in
|
||||
-* | [=\(\)!]) src=./$src;;
|
||||
esac
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
dst=$src
|
||||
dstdir=$dst
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
# Don't chown directories that already exist.
|
||||
if test $dstdir_status = 0; then
|
||||
chowncmd=""
|
||||
fi
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
if test ! -f "$src" && test ! -d "$src"; then
|
||||
echo "$0: $src does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dst_arg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst_arg
|
||||
|
||||
# If destination is a directory, append the input filename.
|
||||
if test -d "$dst"; then
|
||||
if test "$is_target_a_directory" = never; then
|
||||
echo "$0: $dst_arg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dstdir=$dst
|
||||
dstbase=`basename "$src"`
|
||||
case $dst in
|
||||
*/) dst=$dst$dstbase;;
|
||||
*) dst=$dst/$dstbase;;
|
||||
esac
|
||||
dstdir_status=0
|
||||
else
|
||||
dstdir=`dirname "$dst"`
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
case $dstdir in
|
||||
*/) dstdirslash=$dstdir;;
|
||||
*) dstdirslash=$dstdir/;;
|
||||
esac
|
||||
|
||||
obsolete_mkdir_used=false
|
||||
|
||||
if test $dstdir_status != 0; then
|
||||
case $posix_mkdir in
|
||||
'')
|
||||
# With -d, create the new directory with the user-specified mode.
|
||||
# Otherwise, rely on $mkdir_umask.
|
||||
if test -n "$dir_arg"; then
|
||||
mkdir_mode=-m$mode
|
||||
else
|
||||
mkdir_mode=
|
||||
fi
|
||||
|
||||
posix_mkdir=false
|
||||
# The $RANDOM variable is not portable (e.g., dash). Use it
|
||||
# here however when possible just to lower collision chance.
|
||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||
|
||||
trap '
|
||||
ret=$?
|
||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
|
||||
exit $ret
|
||||
' 0
|
||||
|
||||
# Because "mkdir -p" follows existing symlinks and we likely work
|
||||
# directly in world-writeable /tmp, make sure that the '$tmpdir'
|
||||
# directory is successfully created first before we actually test
|
||||
# 'mkdir -p'.
|
||||
if (umask $mkdir_umask &&
|
||||
$mkdirprog $mkdir_mode "$tmpdir" &&
|
||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
||||
then
|
||||
if test -z "$dir_arg" || {
|
||||
# Check for POSIX incompatibilities with -m.
|
||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||
# other-writable bit of parent directory when it shouldn't.
|
||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||
test_tmpdir="$tmpdir/a"
|
||||
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
||||
case $ls_ld_tmpdir in
|
||||
d????-?r-*) different_mode=700;;
|
||||
d????-?--*) different_mode=755;;
|
||||
*) false;;
|
||||
esac &&
|
||||
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
||||
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||
}
|
||||
}
|
||||
then posix_mkdir=:
|
||||
fi
|
||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
||||
else
|
||||
# Remove any dirs left behind by ancient mkdir implementations.
|
||||
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
||||
fi
|
||||
trap '' 0;;
|
||||
esac
|
||||
|
||||
if
|
||||
$posix_mkdir && (
|
||||
umask $mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||
)
|
||||
then :
|
||||
else
|
||||
|
||||
# mkdir does not conform to POSIX,
|
||||
# or it failed possibly due to a race condition. Create the
|
||||
# directory the slow way, step by step, checking for races as we go.
|
||||
|
||||
case $dstdir in
|
||||
/*) prefix='/';;
|
||||
[-=\(\)!]*) prefix='./';;
|
||||
*) prefix='';;
|
||||
esac
|
||||
|
||||
oIFS=$IFS
|
||||
IFS=/
|
||||
set -f
|
||||
set fnord $dstdir
|
||||
shift
|
||||
set +f
|
||||
IFS=$oIFS
|
||||
|
||||
prefixes=
|
||||
|
||||
for d
|
||||
do
|
||||
test X"$d" = X && continue
|
||||
|
||||
prefix=$prefix$d
|
||||
if test -d "$prefix"; then
|
||||
prefixes=
|
||||
else
|
||||
if $posix_mkdir; then
|
||||
(umask $mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||
# Don't fail if two instances are running concurrently.
|
||||
test -d "$prefix" || exit 1
|
||||
else
|
||||
case $prefix in
|
||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||
*) qprefix=$prefix;;
|
||||
esac
|
||||
prefixes="$prefixes '$qprefix'"
|
||||
fi
|
||||
fi
|
||||
prefix=$prefix/
|
||||
done
|
||||
|
||||
if test -n "$prefixes"; then
|
||||
# Don't fail if two instances are running concurrently.
|
||||
(umask $mkdir_umask &&
|
||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||
test -d "$dstdir" || exit 1
|
||||
obsolete_mkdir_used=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||
else
|
||||
|
||||
# Make a couple of temp file names in the proper directory.
|
||||
dsttmp=${dstdirslash}_inst.$$_
|
||||
rmtmp=${dstdirslash}_rm.$$_
|
||||
|
||||
# Trap to clean up those temp files at exit.
|
||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
(umask $cp_umask &&
|
||||
{ test -z "$stripcmd" || {
|
||||
# Create $dsttmp read-write so that cp doesn't create it read-only,
|
||||
# which would cause strip to fail.
|
||||
if test -z "$doit"; then
|
||||
: >"$dsttmp" # No need to fork-exec 'touch'.
|
||||
else
|
||||
$doit touch "$dsttmp"
|
||||
fi
|
||||
}
|
||||
} &&
|
||||
$doit_exec $cpprog "$src" "$dsttmp") &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits.
|
||||
#
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||
|
||||
# If -C, don't bother to copy if it wouldn't change the file.
|
||||
if $copy_on_change &&
|
||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||
set -f &&
|
||||
set X $old && old=:$2:$4:$5:$6 &&
|
||||
set X $new && new=:$2:$4:$5:$6 &&
|
||||
set +f &&
|
||||
test "$old" = "$new" &&
|
||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||
then
|
||||
rm -f "$dsttmp"
|
||||
else
|
||||
# If $backupsuffix is set, and the file being installed
|
||||
# already exists, attempt a backup. Don't worry if it fails,
|
||||
# e.g., if mv doesn't support -f.
|
||||
if test -n "$backupsuffix" && test -f "$dst"; then
|
||||
$doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
|
||||
fi
|
||||
|
||||
# Rename the file to the real destination.
|
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
{
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
test ! -f "$dst" ||
|
||||
$doit $rmcmd "$dst" 2>/dev/null ||
|
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||
{ $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
|
||||
} ||
|
||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||
(exit 1); exit 1
|
||||
}
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dst"
|
||||
}
|
||||
fi || exit 1
|
||||
|
||||
trap '' 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
487
m4/ChangeLog
Normal file
|
|
@ -0,0 +1,487 @@
|
|||
Version 0.1.41 (2024-03-17)
|
||||
---------------------------
|
||||
* Add support for controlling BUTT via MIDI CC messages
|
||||
* EQ and compressor can now be enabled independently for the stream and record path
|
||||
* You can now use %N as a placeholder for the current server name in your record file/path
|
||||
* Prevent BUTT from being disconnected by the server when using FLAC and the audio signal is 100% silent
|
||||
* The signal and silence detection can now by activated/deactivated with a checkbox instead of simply setting the value to 0
|
||||
* Add -L parameter to get a list of available audio devices
|
||||
* The ICY name and ICY description now support the same placeholders as the record file/path (activate the "expand variables" checkbox)
|
||||
* Add Arabic language support (Thanks to Magd)
|
||||
* Fix an issue that could lead BUTT to freeze on startup if no internet connection is available
|
||||
* Overall stability improvements
|
||||
|
||||
Version 0.1.40 (2023-11-24)
|
||||
---------------------------
|
||||
* Support higher bitrates for AAC, Vorbis and Opus
|
||||
* Add support for Plexamp on Linux
|
||||
* Add Dutch language support (thanks to Timothy)
|
||||
* Fix an issue with audio device names that contain special characters
|
||||
* Fix possible buffer underflow when the connection to a shoutcast server fails
|
||||
|
||||
Version 0.1.39 (2023-09-20)
|
||||
---------------------------
|
||||
* Fix a bug that can cause the listener count to no longer be updated
|
||||
* Fix a bug that can cause the split record file function to stop working
|
||||
* Fix a bug that can cause butt not to reconnect after a connection loss
|
||||
* Fix a bug that can cause undefined behaviour
|
||||
* Clear song name if song file is empty
|
||||
|
||||
|
||||
Version 0.1.38 (2023-08-05)
|
||||
---------------------------
|
||||
* Users can now define a custom window title
|
||||
* Add option to set a delay between automatic reconnects
|
||||
* Add option to use the older Icecast SOURCE protocol instead of the newer PUT protocol
|
||||
* Increase robustness of the config file importer
|
||||
* Increase robustness of the show listeners function
|
||||
* Use green instead of yellow to indicate a valid streaming connection
|
||||
* Fix memory leak when using Icecast and showing the number of listeners
|
||||
* Fix UI drawing issues
|
||||
* Fix issue with the main window size on Windows 11
|
||||
* Fix issues with the tray agent on Windows
|
||||
|
||||
Version 0.1.37 (2022-12-24)
|
||||
---------------------------
|
||||
* Add support for a second audio device
|
||||
* Streaming and recording volume can be set independently
|
||||
* Add support for icecast-kh listener statistics
|
||||
* Highlight connect and record buttons when active
|
||||
* Restore window size if "Remember main window position" is active
|
||||
* Increase size of slider knobs
|
||||
* Start with default values in case the config file is damaged
|
||||
* Always overwrite existing files when recording is started automatically or via butt client
|
||||
* Do not stop recording if a butt client sends a disconnect command while butt is offline
|
||||
* Fix an issue were butt mistakenly says "Connecting..."
|
||||
* Fix memory leak if "Show listeners" is activate
|
||||
|
||||
Version 0.1.36 (2022-10-03)
|
||||
---------------------------
|
||||
* Number of current listeners can be displayed on the LCD (works only with original Icecast and Shoutcast implementations)
|
||||
* Fix connection issue with AIS streaming server
|
||||
* Fix connection issue with Icecast servers older than version 2.4.0
|
||||
* Fix issue with Shoutcast if mountpoint is already in use
|
||||
|
||||
|
||||
Version 0.1.35 (2022-06-19)
|
||||
---------------------------
|
||||
* Gain slider can be disabled to prevent inadvertently changing the volume
|
||||
* Audio device initialization can be skipped by holding down CTRL during startup
|
||||
* Fix crash if audio device can not be opened
|
||||
* Fix crash if no default audio device can be found
|
||||
* Fix wrong password detection for certain liquidsoap Shoutcast implementations
|
||||
* Fix crash of command client and command server when very long song names are specified
|
||||
|
||||
Version 0.1.34 (2022-04-21)
|
||||
---------------------------
|
||||
* Added equalizer presets
|
||||
* Added Spanish translation
|
||||
* Use 32 bit float for internal audio processing instead of 16 bit integer
|
||||
* FLAC can now be broadcasted and recorded as 16 bit or 24 bit
|
||||
* WAV can now be recorded as 16 bit, 24 bit or 32 bit
|
||||
* Massively improved client/server implementation for butt commands
|
||||
* Fixed bug that caused overwriting the first wav samples of a recording
|
||||
* Fixed read song name from Music.app for MacOS >= 11.0
|
||||
* Fixed record folder creation if folder contains format variables
|
||||
* butt commands can now also be sent via UDP
|
||||
* Added new fields to the server status message:
|
||||
- stream seconds, stream kBytes
|
||||
- record seconds, record kBytes
|
||||
- volume left/right
|
||||
- current song
|
||||
- record path
|
||||
|
||||
Version 0.1.33 (2022-02-06)
|
||||
---------------------------
|
||||
* Windows: You can broadcast what's playing on your computer (audio device must support WASAPI)
|
||||
* Windows/Linux: New butt-client for controlling running butt instances (Thanks to Hossam)
|
||||
* Added support for higher samplerates (88.2 kHz and 96 kHz)
|
||||
* Added Portuguese (Brazil) translation (Thanks to Bruno)
|
||||
* Added signal and silence detection flags to the status information
|
||||
* Time thresholds for signal detection can be changed via control commands (Thanks to Hossam)
|
||||
* Format place holders (%Y %m %d etc.) can also be used in the folder name
|
||||
* Song title update support for OPUS
|
||||
* Fixed wrong file size in wav header
|
||||
* Fixed compilation if --disable-ssl or --disable-aac was passed to ./configure
|
||||
|
||||
Version 0.1.32 (2021-10-28)
|
||||
---------------------------
|
||||
* Radio.co stations can now be easily added to butt
|
||||
* Advanced codec settings for mp3, aac, ogg/vorbis and opus can now be adjusted
|
||||
* The recordings folder may now contain environment variables like ~, $HOME and %USERPROFILE%
|
||||
* Fixed issue with characters like $,%,&,§ in the song name
|
||||
* Fixed connection issue in case the server domain has IPv4+6 addresses but Icecast is only listening on IPv4
|
||||
* Fixed missing song duration information in FLAC recordings
|
||||
|
||||
Version 0.1.31 (2021-07-12)
|
||||
---------------------------
|
||||
* A delay can now be added to the automatic song title update
|
||||
* Increased equalizer from 5 to 10 frequency bands
|
||||
* Fixed positioning issues on multi screen setups
|
||||
* Maximum number of supported audio devices has been increased from 100 to 256
|
||||
|
||||
Version 0.1.30 (2021-05-14)
|
||||
---------------------------
|
||||
* Added support for IPv6
|
||||
* Added French translation
|
||||
* Right click on a slider knob brings up an input field where you can type in the slider value with the keyboard
|
||||
* The selected audio device can now be remembered by device name instead by device id
|
||||
* You can now rescan for new audio devices manually (no butt restart needed anymore after plugging in a new audio device)
|
||||
* Holding the shift key during butt startup allows you to start with a fresh configuration file
|
||||
* Updated Portaudio to version v19.7.0
|
||||
* Windows: Added support for WASAPI audio driver
|
||||
* MacOS: Updated FLTK to version 1.3.6
|
||||
* MacOS: Native support for Apple Silicon (arm64)
|
||||
|
||||
Version 0.1.29 (2021-03-28)
|
||||
---------------------------
|
||||
* Added a new tool (butt Agent) which helps to minimize butt to tray and much more (Big thanks to Ivan Radolovic)
|
||||
* Added an indicator to the compressor which lights up if the threshold is exceeded
|
||||
* Added "Aggressive Mode" to the compressor. If activated, the signal power for threshold detection is not averraged
|
||||
* Added new command line options: -q (quit) -n (split recording) -u <songname> (update song name)
|
||||
* Added donation addresses for Bitcoin, Monero and Dash
|
||||
* Fixed crash when butt can not find any input channels
|
||||
* Fixed crash when reading song names from an UTF-8 formatted file that contains a BOM
|
||||
* Fixed issue with icecast-kh14+ when connecting to a mountpoint which is already in use
|
||||
* Fixed issue if both checkboxes "start recording after launch" and "start recording when connected" are checked
|
||||
* Fixed butt.desktop file. Icon was not shown on GNOME panel
|
||||
* Attack and Release compressor labels now have 2 decimal places instead of only 1
|
||||
* butt does not send bitrate information to the icecast server anymore if FLAC is used
|
||||
* butt now searches for a free command server port if default port is already in use
|
||||
* butt can now be started in minimized state
|
||||
* The recording file name can now contain any well known date format specifier
|
||||
* The window class name has been renamed from FLTK to butt_FLTK
|
||||
|
||||
Version 0.1.28 (2021-02-07)
|
||||
---------------------------
|
||||
* Fixed compressor issues
|
||||
* Fixed song update when using Strawberry audio player
|
||||
* The order of song update from an music app can be changed from "Title - Artist" to "Artist - Title"
|
||||
* Increased accuracy of recording split timer
|
||||
* VU-meter appearance can be changed to solid colors for better readability
|
||||
* Log window can be vertically resized
|
||||
* Windows: Changed default installation folder to %LOCALAPPDATA%\butt instead of %LOCALAPPDATA\butt-<version>
|
||||
|
||||
|
||||
Version 0.1.27 (2020-12-26)
|
||||
---------------------------
|
||||
* Fixed loading of AAC codec selection from configuration file
|
||||
* Fixed crash when using opus with a samplerate not equal to 48000 Hz
|
||||
|
||||
Version 0.1.26 (2020-12-24)
|
||||
---------------------------
|
||||
* Added ASIO support
|
||||
* Added support for multi-channel audio devices
|
||||
* Added multi-language support (i18n)
|
||||
* Added German translation
|
||||
* Added option to force reconnection regardless of the server response
|
||||
* Added support for Strawberry audio player (Thanks to Stefan S.)
|
||||
* Added config parameter to disable dithering (set disable_dithering=1 in cfg file)
|
||||
* Fixed possible crash if server is not reachable
|
||||
* Fixed possible crash when reconnecting
|
||||
* Fixed possible crash when using FLAC and song update
|
||||
* Fixed unwanted rounding of compressor values
|
||||
* Fixed overwriting of a DSP setting if it was set to -1.0
|
||||
* Improved CPU usage
|
||||
* Improved mono/stereo handling
|
||||
* Improved overall song update implementation
|
||||
* Compiles on FreeBSD (Thanks to Per G. and Tobias C. B.)
|
||||
|
||||
|
||||
Version 0.1.25 (2020-10-26)
|
||||
---------------------------
|
||||
* Added the ability to extend the song name with a prefix and a suffix
|
||||
* Fixed issue with automatic song update from text files
|
||||
* Fixed recording in FLAC
|
||||
|
||||
Version 0.1.24 (2020-10-14)
|
||||
---------------------------
|
||||
* VU-meter has been redesigned
|
||||
* Fixed issues with usernames that contain special characters
|
||||
* The port of the command server can be specified via command line
|
||||
* Commands can be received via network
|
||||
* It is possible to connect to a particular streaming server when sending the connect command
|
||||
* You can ask a butt instance about its current status with the -S command
|
||||
* butt can automatically check for updates after launch
|
||||
* Update of song name works with FLAC
|
||||
* Thresholds for signal detection can be specified
|
||||
* Added -h command line option to get an overview of all available commands
|
||||
* Updated the manual
|
||||
|
||||
Version 0.1.23 (2020-09-27)
|
||||
---------------------------
|
||||
* Fixed crash if the server is not reachable (e.g. unstable internet connections)
|
||||
* Fixed issue with transfering song meta data from music apps to butt (MacOS)
|
||||
* Improved handling of mic permissions dialog on MacOS
|
||||
|
||||
Version 0.1.22 (2020-07-09)
|
||||
---------------------------
|
||||
* Added Dynamic Range Compressor (thanks to Thomas P.)
|
||||
* Added ability to check for new versions
|
||||
* butt can now be controlled via command line
|
||||
* Replaced experimental portaudio version with the stable portaudio version
|
||||
* Fixed issue with stereo audio when using the Equalizer (thanks to Thomas P.)
|
||||
* Fixed traffic calculation when using OPUS
|
||||
* Fixed issue with OPUS encoding under some circumstances
|
||||
|
||||
Version 0.1.21 (2020-05-26)
|
||||
---------------------------
|
||||
* Streaming and recording can now be started automatically if an audio signal is present
|
||||
* Fixed reconnection issue on unreliable network connections. Should now behave like 0.1.19 again
|
||||
* wav recordings can now be up to 4 GB large
|
||||
* Removed advanced section from the Audio tab. Buffer time can still be set in the configuration file if you need to
|
||||
|
||||
Version 0.1.20 (2020-04-21)
|
||||
---------------------------
|
||||
* Added SSL/TLS support for icecast
|
||||
* Recording can now automatically be stopped if the user disconnects from the server
|
||||
* Fixed icecast connection issue (mostly occurring on mobile internet connections like 4G/LTE)
|
||||
* Fixed wrong password detection for liquidsoap based setups
|
||||
* Fixed configuration export on MacOS
|
||||
* Fixed logfile selection on MacOS
|
||||
* Song name is not updated on reconnect anymore if the manual song name input field has been cleared
|
||||
* Upgraded FLTK to version 1.3.5
|
||||
|
||||
Version 0.1.19 (2019-12-30)
|
||||
---------------------------
|
||||
* The song name can now be read from the last line instead from the first line of a file
|
||||
* Streaming and recording can now be automatically stopped after silence has been detected
|
||||
* The last window position can be remembered. Useful when running multiple instances
|
||||
* butt can now be started with hidden info window
|
||||
* The vu-meter runs smoother and needs less cpu
|
||||
* VU-meter peak hold is only active for the red light
|
||||
* Closing butt while streaming or recording must be confirmed now
|
||||
* Changes are now saved without asking for confirmation when closing the app
|
||||
* Removed a new line character from the server name in the title bar
|
||||
* Fixed recceiving song information from iTunes/Music in MacOS Catalina
|
||||
* Fixed wrong counting of sent bytes when using AAC
|
||||
|
||||
|
||||
Version 0.1.18 (2019-05-12)
|
||||
---------------------------
|
||||
* Added support for automatic recording after starting butt
|
||||
* Enabled AAC afterburner (improves audio quality)
|
||||
* Fixed issue with configure.ac and s390x architecture
|
||||
* Updated the FSF address in COPYING
|
||||
* AAC libs are not delivered with the setup files anymore (read the manual on how to activate AAC support again)
|
||||
|
||||
|
||||
Version 0.1.17 (2018-12-27)
|
||||
---------------------------
|
||||
* Added support for FLAC streaming (icecast only)
|
||||
* Added 5-band equalizer (thanks to Melchor Garau Madrigal)
|
||||
* Added the ability to read song informations from several apps on MacOS and Linux (thanks to Melchor Garau Madrigal)
|
||||
* Window title is automatically renamed to the connected server (useful when running multiple instances)
|
||||
* Fixed connection issue with airtime
|
||||
* Fixed integer overflow when gain is set too high
|
||||
* Fixed compilation error on ubuntu 18
|
||||
* Changed color of windows icon from black to yellow. So people using Win10 can now find butt in their black taskbar ;-)
|
||||
|
||||
|
||||
Version 0.1.16 (2017-09-17)
|
||||
---------------------------
|
||||
* Fixed compatibility issues with shoutcast v2.5.5.732
|
||||
* Replaced portaudio by newest stable version v190600_20161030
|
||||
* When using AAC+ the best AAC profile for the current bitrate is selected automatically +
|
||||
AAC+v2: bitrate < 48kBit/s (aac_aot = 29) +
|
||||
AAC+v1: 48 kBit/s \<= bitrate < 96kBit/s (aac_aot = 5) +
|
||||
AAC-LC: bitrate >= 96kBit/s (aac_aot = 2) +
|
||||
* You can force the AAC codec to a specific profile by setting
|
||||
aac_overwrite_aot = 1 and aac_aot to the appropriate aot value {2,5,29} in buttrc
|
||||
|
||||
|
||||
Version 0.1.15 (2016-05-28)
|
||||
---------------------------
|
||||
* Added AAC+ support
|
||||
* Added a "Split now" button to instantly start a new recording file
|
||||
* Improved look&feel on retina displays on OSX
|
||||
* Improved compatibility with proxies/load balancers (thanks to boyska)
|
||||
* Fixed handling of newline characters when reading the song name file
|
||||
* Fixed evlauation of time/date variables when automatic file splitting is enabled
|
||||
* Fixed compatibility with airtime servers
|
||||
* Fixed ogg and opus support for ShoutCast
|
||||
|
||||
Version 0.1.14 (2014-12-27)
|
||||
---------------------------
|
||||
* Added FLAC support for recording
|
||||
* Added Opus support (thanks to oneman)
|
||||
* Added logfile support (thanks to mikko)
|
||||
* Added support for more variables in the filename (%H %M %S) (thanks to mikko)
|
||||
* Automatic file splitting can be synced to full hour now (thanks to mikko)
|
||||
* LCD info can automatically rotate every 5 seconds now (thanks to mikko)
|
||||
* Added ability to change audio buffer size
|
||||
* Uncluttered LCD (thanks to mikko)
|
||||
* File extension of record filename gets automatically updated now
|
||||
* Dropped support of different samplerate/channels for stream and record
|
||||
* Resorted settings elements/widgets
|
||||
* Removed possible memleaks
|
||||
* Connecting to an unreachable server does not freeze the GUI anymore
|
||||
* Fixed icecast and shoutcast meta data handling
|
||||
* ;ade update song from file more robust
|
||||
* "update song name manually" reacts on Enter button now
|
||||
|
||||
Version 0.1.13 (2014-05-02)
|
||||
---------------------------
|
||||
* Has an icon now! - Thanks to Subrat (ipapuna) Nayak
|
||||
* Added support for lower bitrates (24k, 16k, 8k)
|
||||
* Added support for user defined configuration path e.g. "butt -c <path_to_config>"
|
||||
* Added support for user names in Icecast
|
||||
* Added gain slider. This slider multiplies the audio input samples with the given factor
|
||||
* Added .manifest file to disable the VirtualStore on Windows Vista and higher
|
||||
* Added the ability to automatically split the recording every 'n' minutes
|
||||
* Added feature for importing and exporting configuration files
|
||||
* Compiles with Xcode 5 on OS X Mavericks
|
||||
* Compiles with traditional GNU autoconf/automake environment on linux and mingw
|
||||
* Improved robustness against faulty config files
|
||||
* Improved compatibility to ShoutCast v2 servers
|
||||
* Improved look&feel
|
||||
* Fixed samplerate issues
|
||||
* Fixed mono playback/recording
|
||||
* Changed data volume information vom kBytes to MBytes
|
||||
* Changed default recording path to users home folder
|
||||
* Sends audio information (bitrate etc.) to Icecast server - Thanks to Dominik Durner
|
||||
* Reimplemented VU-Meter with peak hold
|
||||
* Comes with as an ubuntu package
|
||||
* Windows: can be installed as user without admin rights
|
||||
* Windows: uninstallation process also removes the configuration file
|
||||
* Instead of canceling the automatic song update in case the given file is not
|
||||
readable, butt now tries to reread the file every 5 seconds
|
||||
|
||||
Version 0.1.12 (2010-04-10)
|
||||
---------------------------
|
||||
* butt is now able to connect automatically after startup
|
||||
* Shortened time between connect attempts (fixes Shouted.FM connection problems)
|
||||
* Improved wrong password detection for shoutcast
|
||||
|
||||
Version 0.1.11-2 (2008-12-14)
|
||||
-----------------------------
|
||||
* Fixed display info after automatic reconnection
|
||||
|
||||
Version 0.1.11-1 (2008-11-09)
|
||||
-----------------------------
|
||||
* Fixed segfault if there is no '.' in the filename
|
||||
|
||||
Version 0.1.11 (2008-10-26)
|
||||
---------------------------
|
||||
* Fixed unintended disconnects
|
||||
* Fixed recording problems
|
||||
* Removed buffer overrun messages
|
||||
* Recording can be now stopped with the stop-button
|
||||
* Replaced pcm recording by wav recording
|
||||
* Recording as ogg is now possible
|
||||
* Added "stay on top" checkbox
|
||||
* Fixed possible crash when changing mp3 settings while streaming
|
||||
|
||||
Version 0.1.10 (2008-05-25)
|
||||
---------------------------
|
||||
* Removed xrun "led". Instead the msg window informs the user about overruns
|
||||
* Added dB values to the vu-meter
|
||||
* Fixed bitrate/samplerate selection for ogg
|
||||
* Network backend works with non-blocking sockets now
|
||||
* libshout is not needed anymore
|
||||
* Songname can be updated from a textfile now
|
||||
* More samplerates are supported now
|
||||
* Fixed samplerate selection problems
|
||||
* Fixed crash when connecting to icecast server on MacOS 10.4
|
||||
* Fixed crash when changing the server type from shoutcast to icecast
|
||||
* Some cosmetic changes (buttons, LEDs)
|
||||
|
||||
Version 0.1.9 (2008-04-10)
|
||||
--------------------------
|
||||
* Minor GUI makeup
|
||||
* Made butt more verbose
|
||||
* Fixed possible segfault when trying to EDIT stream info
|
||||
* Fixed automatic reconnection
|
||||
* Filenames can be indexed with the %i variable now
|
||||
* Renamed "rec not until connected" checkbox to "start rec. when connected"
|
||||
* Added orange record icon for "armed" state ("start rec. when connected" = 1)
|
||||
* butt starts recording as soon as connected, when in "armed" state
|
||||
|
||||
Version 0.1.8 (2008-03-30)
|
||||
--------------------------
|
||||
|
||||
* Text/bg color can be changed in the [GUI] tab
|
||||
* Removed the "Config saved" popup message
|
||||
* Added pcm recording
|
||||
* Improoved record handling
|
||||
* The config menu is more user friendly now
|
||||
* Fixed crash when connection loss
|
||||
* The user may select the samplerate now
|
||||
* The config window can be attached to the main window now
|
||||
* Fixed bitrate and codec ShoutCast info
|
||||
|
||||
Version 0.1.7rc1 (2008-01-04)
|
||||
-----------------------------
|
||||
* butt runs on MacOS 10.4 and 10.5 now!
|
||||
* Added recording time to the display info
|
||||
* Fixed bug with '&' in the song string
|
||||
* Changing the display mode works only when connected now
|
||||
* Added a checkbox which lets the user decide if the recording should start
|
||||
right after selecting the output file or when connected
|
||||
* Added a msg box which ask the user if he wants to stop the recording
|
||||
when disconnecting
|
||||
|
||||
|
||||
Version 0.1.6 (2007-12-08)
|
||||
---------------------------
|
||||
* Added status symbols to the display
|
||||
* Recording runs with a seperate thread now!
|
||||
* Added a button for showing/hiding the server password
|
||||
|
||||
Version 0.1.5 (2007-11-22)
|
||||
---------------------------
|
||||
* Minor GUI changes
|
||||
* Fixed streaming/recording with mp3 320kb/s
|
||||
* Fixed segfault in Fl_ILM216.cpp
|
||||
* The user may change the display colors now (right click on the display)
|
||||
* The "connecting" info on the display updates faster now
|
||||
* Changed default display colors to white/blue
|
||||
|
||||
Version 0.1.5rc1 (2007-11-16)
|
||||
-----------------------------
|
||||
* Replaced ALSA by PortAudio -> OSS is supported now
|
||||
* Ported butt to Microsoft Windows (tested with win2k and win xp)
|
||||
* butt reminds the user about unsaved changes when closing now
|
||||
* Starting the recording is possible at any time now
|
||||
* Added mono encoding for OGG
|
||||
* Improved some GUI stuff
|
||||
* Improved CPU usage
|
||||
|
||||
Version 0.1.4rc2 (2007-11-03)
|
||||
-----------------------------
|
||||
* butt should compile on more machines now
|
||||
|
||||
Version 0.1.4rc1 (2007-11-01)
|
||||
-----------------------------
|
||||
* Added IceCast support (ogg and mp3)
|
||||
* Added ./configure script
|
||||
* butt is now able to send the "Current Song" value to the ShoutCast/IceCast server
|
||||
* Changed stereo mode from joint-stereo to real-stereo
|
||||
* Code cleanup
|
||||
|
||||
Version 0.1.3 (2007-10-08)
|
||||
---------------------------
|
||||
* Bugfix: butt crashed if you press "apply" in the server/icy tab without
|
||||
having an server/ICY-entry
|
||||
* Bugfix: butt crashed if you change the bitrate without having an ICY-entry
|
||||
* Bugfix: there was some uncommented code in the [DEL]-server callback-routine
|
||||
which shouldn't be uncommented
|
||||
* Facelift: if you delete all server/ICY-entries, the input fields in the server/ICY
|
||||
still showed the values of the last server/ICY-entry
|
||||
|
||||
Version 0.1.2 (2007-10-07)
|
||||
--------------------------
|
||||
* Added a GUI for configuring butt
|
||||
* Comments behind config entries are not allowed anymore.
|
||||
* Removed the network init part. It was nonsense
|
||||
* Fixed mono playblack
|
||||
* Fixed recording problems
|
||||
* ICY entries can now be empty without causing butt to crash
|
||||
* butt shows the real port in its "connecting to..."-info line now and the "pseudeo" port in parenthesis
|
||||
* Fixed a bug which causes pcm data loss in some cases
|
||||
|
||||
Version 0.1.1 (2007-09-16)
|
||||
--------------------------
|
||||
* Added recording feature
|
||||
* Fixed seg fault on startup when compiled with gcc-4.1.2
|
||||
* Fixed seg fault when encoding with high bitrates
|
||||
401
m4/gettext.m4
Normal file
|
|
@ -0,0 +1,401 @@
|
|||
# gettext.m4 serial 66 (gettext-0.18.2)
|
||||
dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
dnl
|
||||
dnl This file can can be used in projects which are not available under
|
||||
dnl the GNU General Public License or the GNU Library General Public
|
||||
dnl License but which still want to provide support for the GNU gettext
|
||||
dnl functionality.
|
||||
dnl Please note that the actual code of the GNU gettext library is covered
|
||||
dnl by the GNU Library General Public License, and the rest of the GNU
|
||||
dnl gettext package package is covered by the GNU General Public License.
|
||||
dnl They are *not* in the public domain.
|
||||
|
||||
dnl Authors:
|
||||
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
|
||||
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
|
||||
|
||||
dnl Macro to add for using GNU gettext.
|
||||
|
||||
dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
|
||||
dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
|
||||
dnl default (if it is not specified or empty) is 'no-libtool'.
|
||||
dnl INTLSYMBOL should be 'external' for packages with no intl directory,
|
||||
dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory.
|
||||
dnl If INTLSYMBOL is 'use-libtool', then a libtool library
|
||||
dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
|
||||
dnl depending on --{enable,disable}-{shared,static} and on the presence of
|
||||
dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
|
||||
dnl $(top_builddir)/intl/libintl.a will be created.
|
||||
dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
|
||||
dnl implementations (in libc or libintl) without the ngettext() function
|
||||
dnl will be ignored. If NEEDSYMBOL is specified and is
|
||||
dnl 'need-formatstring-macros', then GNU gettext implementations that don't
|
||||
dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
|
||||
dnl INTLDIR is used to find the intl libraries. If empty,
|
||||
dnl the value '$(top_builddir)/intl/' is used.
|
||||
dnl
|
||||
dnl The result of the configuration is one of three cases:
|
||||
dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
|
||||
dnl and used.
|
||||
dnl Catalog format: GNU --> install in $(datadir)
|
||||
dnl Catalog extension: .mo after installation, .gmo in source tree
|
||||
dnl 2) GNU gettext has been found in the system's C library.
|
||||
dnl Catalog format: GNU --> install in $(datadir)
|
||||
dnl Catalog extension: .mo after installation, .gmo in source tree
|
||||
dnl 3) No internationalization, always use English msgid.
|
||||
dnl Catalog format: none
|
||||
dnl Catalog extension: none
|
||||
dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
|
||||
dnl The use of .gmo is historical (it was needed to avoid overwriting the
|
||||
dnl GNU format catalogs when building on a platform with an X/Open gettext),
|
||||
dnl but we keep it in order not to force irrelevant filename changes on the
|
||||
dnl maintainers.
|
||||
dnl
|
||||
AC_DEFUN([AM_GNU_GETTEXT],
|
||||
[
|
||||
dnl Argument checking.
|
||||
ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
|
||||
[errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
|
||||
])])])])])
|
||||
ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
|
||||
[AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
|
||||
ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
|
||||
[errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
|
||||
])])])])
|
||||
define([gt_included_intl],
|
||||
ifelse([$1], [external],
|
||||
ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
|
||||
[yes]))
|
||||
define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
|
||||
gt_NEEDS_INIT
|
||||
AM_GNU_GETTEXT_NEED([$2])
|
||||
|
||||
AC_REQUIRE([AM_PO_SUBDIRS])dnl
|
||||
ifelse(gt_included_intl, yes, [
|
||||
AC_REQUIRE([AM_INTL_SUBDIR])dnl
|
||||
])
|
||||
|
||||
dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
|
||||
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||
AC_REQUIRE([AC_LIB_RPATH])
|
||||
|
||||
dnl Sometimes libintl requires libiconv, so first search for libiconv.
|
||||
dnl Ideally we would do this search only after the
|
||||
dnl if test "$USE_NLS" = "yes"; then
|
||||
dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
|
||||
dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
|
||||
dnl the configure script would need to contain the same shell code
|
||||
dnl again, outside any 'if'. There are two solutions:
|
||||
dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
|
||||
dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
|
||||
dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
|
||||
dnl documented, we avoid it.
|
||||
ifelse(gt_included_intl, yes, , [
|
||||
AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
|
||||
])
|
||||
|
||||
dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
|
||||
gt_INTL_MACOSX
|
||||
|
||||
dnl Set USE_NLS.
|
||||
AC_REQUIRE([AM_NLS])
|
||||
|
||||
ifelse(gt_included_intl, yes, [
|
||||
BUILD_INCLUDED_LIBINTL=no
|
||||
USE_INCLUDED_LIBINTL=no
|
||||
])
|
||||
LIBINTL=
|
||||
LTLIBINTL=
|
||||
POSUB=
|
||||
|
||||
dnl Add a version number to the cache macros.
|
||||
case " $gt_needs " in
|
||||
*" need-formatstring-macros "*) gt_api_version=3 ;;
|
||||
*" need-ngettext "*) gt_api_version=2 ;;
|
||||
*) gt_api_version=1 ;;
|
||||
esac
|
||||
gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
|
||||
gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
|
||||
|
||||
dnl If we use NLS figure out what method
|
||||
if test "$USE_NLS" = "yes"; then
|
||||
gt_use_preinstalled_gnugettext=no
|
||||
ifelse(gt_included_intl, yes, [
|
||||
AC_MSG_CHECKING([whether included gettext is requested])
|
||||
AC_ARG_WITH([included-gettext],
|
||||
[ --with-included-gettext use the GNU gettext library included here],
|
||||
nls_cv_force_use_gnu_gettext=$withval,
|
||||
nls_cv_force_use_gnu_gettext=no)
|
||||
AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
|
||||
|
||||
nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
|
||||
if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
|
||||
])
|
||||
dnl User does not insist on using GNU NLS library. Figure out what
|
||||
dnl to use. If GNU gettext is available we use this. Else we have
|
||||
dnl to fall back to GNU NLS library.
|
||||
|
||||
if test $gt_api_version -ge 3; then
|
||||
gt_revision_test_code='
|
||||
#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
|
||||
#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
|
||||
#endif
|
||||
changequote(,)dnl
|
||||
typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
|
||||
changequote([,])dnl
|
||||
'
|
||||
else
|
||||
gt_revision_test_code=
|
||||
fi
|
||||
if test $gt_api_version -ge 2; then
|
||||
gt_expression_test_code=' + * ngettext ("", "", 0)'
|
||||
else
|
||||
gt_expression_test_code=
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
|
||||
[AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[
|
||||
#include <libintl.h>
|
||||
$gt_revision_test_code
|
||||
extern int _nl_msg_cat_cntr;
|
||||
extern int *_nl_domain_bindings;
|
||||
]],
|
||||
[[
|
||||
bindtextdomain ("", "");
|
||||
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
|
||||
]])],
|
||||
[eval "$gt_func_gnugettext_libc=yes"],
|
||||
[eval "$gt_func_gnugettext_libc=no"])])
|
||||
|
||||
if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
|
||||
dnl Sometimes libintl requires libiconv, so first search for libiconv.
|
||||
ifelse(gt_included_intl, yes, , [
|
||||
AM_ICONV_LINK
|
||||
])
|
||||
dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
|
||||
dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
|
||||
dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
|
||||
dnl even if libiconv doesn't exist.
|
||||
AC_LIB_LINKFLAGS_BODY([intl])
|
||||
AC_CACHE_CHECK([for GNU gettext in libintl],
|
||||
[$gt_func_gnugettext_libintl],
|
||||
[gt_save_CPPFLAGS="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $INCINTL"
|
||||
gt_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS $LIBINTL"
|
||||
dnl Now see whether libintl exists and does not depend on libiconv.
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[
|
||||
#include <libintl.h>
|
||||
$gt_revision_test_code
|
||||
extern int _nl_msg_cat_cntr;
|
||||
extern
|
||||
#ifdef __cplusplus
|
||||
"C"
|
||||
#endif
|
||||
const char *_nl_expand_alias (const char *);
|
||||
]],
|
||||
[[
|
||||
bindtextdomain ("", "");
|
||||
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
|
||||
]])],
|
||||
[eval "$gt_func_gnugettext_libintl=yes"],
|
||||
[eval "$gt_func_gnugettext_libintl=no"])
|
||||
dnl Now see whether libintl exists and depends on libiconv.
|
||||
if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
|
||||
LIBS="$LIBS $LIBICONV"
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[
|
||||
#include <libintl.h>
|
||||
$gt_revision_test_code
|
||||
extern int _nl_msg_cat_cntr;
|
||||
extern
|
||||
#ifdef __cplusplus
|
||||
"C"
|
||||
#endif
|
||||
const char *_nl_expand_alias (const char *);
|
||||
]],
|
||||
[[
|
||||
bindtextdomain ("", "");
|
||||
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
|
||||
]])],
|
||||
[LIBINTL="$LIBINTL $LIBICONV"
|
||||
LTLIBINTL="$LTLIBINTL $LTLIBICONV"
|
||||
eval "$gt_func_gnugettext_libintl=yes"
|
||||
])
|
||||
fi
|
||||
CPPFLAGS="$gt_save_CPPFLAGS"
|
||||
LIBS="$gt_save_LIBS"])
|
||||
fi
|
||||
|
||||
dnl If an already present or preinstalled GNU gettext() is found,
|
||||
dnl use it. But if this macro is used in GNU gettext, and GNU
|
||||
dnl gettext is already preinstalled in libintl, we update this
|
||||
dnl libintl. (Cf. the install rule in intl/Makefile.in.)
|
||||
if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
|
||||
|| { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
|
||||
&& test "$PACKAGE" != gettext-runtime \
|
||||
&& test "$PACKAGE" != gettext-tools; }; then
|
||||
gt_use_preinstalled_gnugettext=yes
|
||||
else
|
||||
dnl Reset the values set by searching for libintl.
|
||||
LIBINTL=
|
||||
LTLIBINTL=
|
||||
INCINTL=
|
||||
fi
|
||||
|
||||
ifelse(gt_included_intl, yes, [
|
||||
if test "$gt_use_preinstalled_gnugettext" != "yes"; then
|
||||
dnl GNU gettext is not found in the C library.
|
||||
dnl Fall back on included GNU gettext library.
|
||||
nls_cv_use_gnu_gettext=yes
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$nls_cv_use_gnu_gettext" = "yes"; then
|
||||
dnl Mark actions used to generate GNU NLS library.
|
||||
BUILD_INCLUDED_LIBINTL=yes
|
||||
USE_INCLUDED_LIBINTL=yes
|
||||
LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
|
||||
LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
|
||||
LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
|
||||
fi
|
||||
|
||||
CATOBJEXT=
|
||||
if test "$gt_use_preinstalled_gnugettext" = "yes" \
|
||||
|| test "$nls_cv_use_gnu_gettext" = "yes"; then
|
||||
dnl Mark actions to use GNU gettext tools.
|
||||
CATOBJEXT=.gmo
|
||||
fi
|
||||
])
|
||||
|
||||
if test -n "$INTL_MACOSX_LIBS"; then
|
||||
if test "$gt_use_preinstalled_gnugettext" = "yes" \
|
||||
|| test "$nls_cv_use_gnu_gettext" = "yes"; then
|
||||
dnl Some extra flags are needed during linking.
|
||||
LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
|
||||
LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$gt_use_preinstalled_gnugettext" = "yes" \
|
||||
|| test "$nls_cv_use_gnu_gettext" = "yes"; then
|
||||
AC_DEFINE([ENABLE_NLS], [1],
|
||||
[Define to 1 if translation of program messages to the user's native language
|
||||
is requested.])
|
||||
else
|
||||
USE_NLS=no
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([whether to use NLS])
|
||||
AC_MSG_RESULT([$USE_NLS])
|
||||
if test "$USE_NLS" = "yes"; then
|
||||
AC_MSG_CHECKING([where the gettext function comes from])
|
||||
if test "$gt_use_preinstalled_gnugettext" = "yes"; then
|
||||
if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
|
||||
gt_source="external libintl"
|
||||
else
|
||||
gt_source="libc"
|
||||
fi
|
||||
else
|
||||
gt_source="included intl directory"
|
||||
fi
|
||||
AC_MSG_RESULT([$gt_source])
|
||||
fi
|
||||
|
||||
if test "$USE_NLS" = "yes"; then
|
||||
|
||||
if test "$gt_use_preinstalled_gnugettext" = "yes"; then
|
||||
if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
|
||||
AC_MSG_CHECKING([how to link with libintl])
|
||||
AC_MSG_RESULT([$LIBINTL])
|
||||
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
|
||||
fi
|
||||
|
||||
dnl For backward compatibility. Some packages may be using this.
|
||||
AC_DEFINE([HAVE_GETTEXT], [1],
|
||||
[Define if the GNU gettext() function is already present or preinstalled.])
|
||||
AC_DEFINE([HAVE_DCGETTEXT], [1],
|
||||
[Define if the GNU dcgettext() function is already present or preinstalled.])
|
||||
fi
|
||||
|
||||
dnl We need to process the po/ directory.
|
||||
POSUB=po
|
||||
fi
|
||||
|
||||
ifelse(gt_included_intl, yes, [
|
||||
dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
|
||||
dnl to 'yes' because some of the testsuite requires it.
|
||||
if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
|
||||
BUILD_INCLUDED_LIBINTL=yes
|
||||
fi
|
||||
|
||||
dnl Make all variables we use known to autoconf.
|
||||
AC_SUBST([BUILD_INCLUDED_LIBINTL])
|
||||
AC_SUBST([USE_INCLUDED_LIBINTL])
|
||||
AC_SUBST([CATOBJEXT])
|
||||
|
||||
dnl For backward compatibility. Some configure.ins may be using this.
|
||||
nls_cv_header_intl=
|
||||
nls_cv_header_libgt=
|
||||
|
||||
dnl For backward compatibility. Some Makefiles may be using this.
|
||||
DATADIRNAME=share
|
||||
AC_SUBST([DATADIRNAME])
|
||||
|
||||
dnl For backward compatibility. Some Makefiles may be using this.
|
||||
INSTOBJEXT=.mo
|
||||
AC_SUBST([INSTOBJEXT])
|
||||
|
||||
dnl For backward compatibility. Some Makefiles may be using this.
|
||||
GENCAT=gencat
|
||||
AC_SUBST([GENCAT])
|
||||
|
||||
dnl For backward compatibility. Some Makefiles may be using this.
|
||||
INTLOBJS=
|
||||
if test "$USE_INCLUDED_LIBINTL" = yes; then
|
||||
INTLOBJS="\$(GETTOBJS)"
|
||||
fi
|
||||
AC_SUBST([INTLOBJS])
|
||||
|
||||
dnl Enable libtool support if the surrounding package wishes it.
|
||||
INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
|
||||
AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
|
||||
])
|
||||
|
||||
dnl For backward compatibility. Some Makefiles may be using this.
|
||||
INTLLIBS="$LIBINTL"
|
||||
AC_SUBST([INTLLIBS])
|
||||
|
||||
dnl Make all documented variables known to autoconf.
|
||||
AC_SUBST([LIBINTL])
|
||||
AC_SUBST([LTLIBINTL])
|
||||
AC_SUBST([POSUB])
|
||||
])
|
||||
|
||||
|
||||
dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
|
||||
m4_define([gt_NEEDS_INIT],
|
||||
[
|
||||
m4_divert_text([DEFAULTS], [gt_needs=])
|
||||
m4_define([gt_NEEDS_INIT], [])
|
||||
])
|
||||
|
||||
|
||||
dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
|
||||
AC_DEFUN([AM_GNU_GETTEXT_NEED],
|
||||
[
|
||||
m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
|
||||
])
|
||||
|
||||
|
||||
dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
|
||||
AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
|
||||
268
m4/iconv.m4
Normal file
|
|
@ -0,0 +1,268 @@
|
|||
# iconv.m4 serial 18 (gettext-0.18.2)
|
||||
dnl Copyright (C) 2000-2002, 2007-2014 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl From Bruno Haible.
|
||||
|
||||
AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
|
||||
[
|
||||
dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
|
||||
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||
AC_REQUIRE([AC_LIB_RPATH])
|
||||
|
||||
dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
|
||||
dnl accordingly.
|
||||
AC_LIB_LINKFLAGS_BODY([iconv])
|
||||
])
|
||||
|
||||
AC_DEFUN([AM_ICONV_LINK],
|
||||
[
|
||||
dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
|
||||
dnl those with the standalone portable GNU libiconv installed).
|
||||
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||
|
||||
dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
|
||||
dnl accordingly.
|
||||
AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
|
||||
|
||||
dnl Add $INCICONV to CPPFLAGS before performing the following checks,
|
||||
dnl because if the user has installed libiconv and not disabled its use
|
||||
dnl via --without-libiconv-prefix, he wants to use it. The first
|
||||
dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
|
||||
am_save_CPPFLAGS="$CPPFLAGS"
|
||||
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
|
||||
|
||||
AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
|
||||
am_cv_func_iconv="no, consider installing GNU libiconv"
|
||||
am_cv_lib_iconv=no
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[
|
||||
#include <stdlib.h>
|
||||
#include <iconv.h>
|
||||
]],
|
||||
[[iconv_t cd = iconv_open("","");
|
||||
iconv(cd,NULL,NULL,NULL,NULL);
|
||||
iconv_close(cd);]])],
|
||||
[am_cv_func_iconv=yes])
|
||||
if test "$am_cv_func_iconv" != yes; then
|
||||
am_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS $LIBICONV"
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[
|
||||
#include <stdlib.h>
|
||||
#include <iconv.h>
|
||||
]],
|
||||
[[iconv_t cd = iconv_open("","");
|
||||
iconv(cd,NULL,NULL,NULL,NULL);
|
||||
iconv_close(cd);]])],
|
||||
[am_cv_lib_iconv=yes]
|
||||
[am_cv_func_iconv=yes])
|
||||
LIBS="$am_save_LIBS"
|
||||
fi
|
||||
])
|
||||
if test "$am_cv_func_iconv" = yes; then
|
||||
AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
|
||||
dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
|
||||
dnl Solaris 10.
|
||||
am_save_LIBS="$LIBS"
|
||||
if test $am_cv_lib_iconv = yes; then
|
||||
LIBS="$LIBS $LIBICONV"
|
||||
fi
|
||||
AC_RUN_IFELSE(
|
||||
[AC_LANG_SOURCE([[
|
||||
#include <iconv.h>
|
||||
#include <string.h>
|
||||
int main ()
|
||||
{
|
||||
int result = 0;
|
||||
/* Test against AIX 5.1 bug: Failures are not distinguishable from successful
|
||||
returns. */
|
||||
{
|
||||
iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
|
||||
if (cd_utf8_to_88591 != (iconv_t)(-1))
|
||||
{
|
||||
static const char input[] = "\342\202\254"; /* EURO SIGN */
|
||||
char buf[10];
|
||||
const char *inptr = input;
|
||||
size_t inbytesleft = strlen (input);
|
||||
char *outptr = buf;
|
||||
size_t outbytesleft = sizeof (buf);
|
||||
size_t res = iconv (cd_utf8_to_88591,
|
||||
(char **) &inptr, &inbytesleft,
|
||||
&outptr, &outbytesleft);
|
||||
if (res == 0)
|
||||
result |= 1;
|
||||
iconv_close (cd_utf8_to_88591);
|
||||
}
|
||||
}
|
||||
/* Test against Solaris 10 bug: Failures are not distinguishable from
|
||||
successful returns. */
|
||||
{
|
||||
iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
|
||||
if (cd_ascii_to_88591 != (iconv_t)(-1))
|
||||
{
|
||||
static const char input[] = "\263";
|
||||
char buf[10];
|
||||
const char *inptr = input;
|
||||
size_t inbytesleft = strlen (input);
|
||||
char *outptr = buf;
|
||||
size_t outbytesleft = sizeof (buf);
|
||||
size_t res = iconv (cd_ascii_to_88591,
|
||||
(char **) &inptr, &inbytesleft,
|
||||
&outptr, &outbytesleft);
|
||||
if (res == 0)
|
||||
result |= 2;
|
||||
iconv_close (cd_ascii_to_88591);
|
||||
}
|
||||
}
|
||||
/* Test against AIX 6.1..7.1 bug: Buffer overrun. */
|
||||
{
|
||||
iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
|
||||
if (cd_88591_to_utf8 != (iconv_t)(-1))
|
||||
{
|
||||
static const char input[] = "\304";
|
||||
static char buf[2] = { (char)0xDE, (char)0xAD };
|
||||
const char *inptr = input;
|
||||
size_t inbytesleft = 1;
|
||||
char *outptr = buf;
|
||||
size_t outbytesleft = 1;
|
||||
size_t res = iconv (cd_88591_to_utf8,
|
||||
(char **) &inptr, &inbytesleft,
|
||||
&outptr, &outbytesleft);
|
||||
if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
|
||||
result |= 4;
|
||||
iconv_close (cd_88591_to_utf8);
|
||||
}
|
||||
}
|
||||
#if 0 /* This bug could be worked around by the caller. */
|
||||
/* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
|
||||
{
|
||||
iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
|
||||
if (cd_88591_to_utf8 != (iconv_t)(-1))
|
||||
{
|
||||
static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
|
||||
char buf[50];
|
||||
const char *inptr = input;
|
||||
size_t inbytesleft = strlen (input);
|
||||
char *outptr = buf;
|
||||
size_t outbytesleft = sizeof (buf);
|
||||
size_t res = iconv (cd_88591_to_utf8,
|
||||
(char **) &inptr, &inbytesleft,
|
||||
&outptr, &outbytesleft);
|
||||
if ((int)res > 0)
|
||||
result |= 8;
|
||||
iconv_close (cd_88591_to_utf8);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
|
||||
provided. */
|
||||
if (/* Try standardized names. */
|
||||
iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
|
||||
/* Try IRIX, OSF/1 names. */
|
||||
&& iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
|
||||
/* Try AIX names. */
|
||||
&& iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
|
||||
/* Try HP-UX names. */
|
||||
&& iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
|
||||
result |= 16;
|
||||
return result;
|
||||
}]])],
|
||||
[am_cv_func_iconv_works=yes],
|
||||
[am_cv_func_iconv_works=no],
|
||||
[
|
||||
changequote(,)dnl
|
||||
case "$host_os" in
|
||||
aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
|
||||
*) am_cv_func_iconv_works="guessing yes" ;;
|
||||
esac
|
||||
changequote([,])dnl
|
||||
])
|
||||
LIBS="$am_save_LIBS"
|
||||
])
|
||||
case "$am_cv_func_iconv_works" in
|
||||
*no) am_func_iconv=no am_cv_lib_iconv=no ;;
|
||||
*) am_func_iconv=yes ;;
|
||||
esac
|
||||
else
|
||||
am_func_iconv=no am_cv_lib_iconv=no
|
||||
fi
|
||||
if test "$am_func_iconv" = yes; then
|
||||
AC_DEFINE([HAVE_ICONV], [1],
|
||||
[Define if you have the iconv() function and it works.])
|
||||
fi
|
||||
if test "$am_cv_lib_iconv" = yes; then
|
||||
AC_MSG_CHECKING([how to link with libiconv])
|
||||
AC_MSG_RESULT([$LIBICONV])
|
||||
else
|
||||
dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
|
||||
dnl either.
|
||||
CPPFLAGS="$am_save_CPPFLAGS"
|
||||
LIBICONV=
|
||||
LTLIBICONV=
|
||||
fi
|
||||
AC_SUBST([LIBICONV])
|
||||
AC_SUBST([LTLIBICONV])
|
||||
])
|
||||
|
||||
dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
|
||||
dnl avoid warnings like
|
||||
dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
|
||||
dnl This is tricky because of the way 'aclocal' is implemented:
|
||||
dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
|
||||
dnl Otherwise aclocal's initial scan pass would miss the macro definition.
|
||||
dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
|
||||
dnl Otherwise aclocal would emit many "Use of uninitialized value $1"
|
||||
dnl warnings.
|
||||
m4_define([gl_iconv_AC_DEFUN],
|
||||
m4_version_prereq([2.64],
|
||||
[[AC_DEFUN_ONCE(
|
||||
[$1], [$2])]],
|
||||
[m4_ifdef([gl_00GNULIB],
|
||||
[[AC_DEFUN_ONCE(
|
||||
[$1], [$2])]],
|
||||
[[AC_DEFUN(
|
||||
[$1], [$2])]])]))
|
||||
gl_iconv_AC_DEFUN([AM_ICONV],
|
||||
[
|
||||
AM_ICONV_LINK
|
||||
if test "$am_cv_func_iconv" = yes; then
|
||||
AC_MSG_CHECKING([for iconv declaration])
|
||||
AC_CACHE_VAL([am_cv_proto_iconv], [
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[
|
||||
#include <stdlib.h>
|
||||
#include <iconv.h>
|
||||
extern
|
||||
#ifdef __cplusplus
|
||||
"C"
|
||||
#endif
|
||||
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
|
||||
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
|
||||
#else
|
||||
size_t iconv();
|
||||
#endif
|
||||
]],
|
||||
[[]])],
|
||||
[am_cv_proto_iconv_arg1=""],
|
||||
[am_cv_proto_iconv_arg1="const"])
|
||||
am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
|
||||
am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
|
||||
AC_MSG_RESULT([
|
||||
$am_cv_proto_iconv])
|
||||
AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
|
||||
[Define as const if the declaration of iconv() needs const.])
|
||||
dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
|
||||
m4_ifdef([gl_ICONV_H_DEFAULTS],
|
||||
[AC_REQUIRE([gl_ICONV_H_DEFAULTS])
|
||||
if test -n "$am_cv_proto_iconv_arg1"; then
|
||||
ICONV_CONST="const"
|
||||
fi
|
||||
])
|
||||
fi
|
||||
])
|
||||
56
m4/intlmacosx.m4
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
# intlmacosx.m4 serial 5 (gettext-0.18.2)
|
||||
dnl Copyright (C) 2004-2014 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
dnl
|
||||
dnl This file can can be used in projects which are not available under
|
||||
dnl the GNU General Public License or the GNU Library General Public
|
||||
dnl License but which still want to provide support for the GNU gettext
|
||||
dnl functionality.
|
||||
dnl Please note that the actual code of the GNU gettext library is covered
|
||||
dnl by the GNU Library General Public License, and the rest of the GNU
|
||||
dnl gettext package package is covered by the GNU General Public License.
|
||||
dnl They are *not* in the public domain.
|
||||
|
||||
dnl Checks for special options needed on Mac OS X.
|
||||
dnl Defines INTL_MACOSX_LIBS.
|
||||
AC_DEFUN([gt_INTL_MACOSX],
|
||||
[
|
||||
dnl Check for API introduced in Mac OS X 10.2.
|
||||
AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
|
||||
[gt_cv_func_CFPreferencesCopyAppValue],
|
||||
[gt_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[#include <CoreFoundation/CFPreferences.h>]],
|
||||
[[CFPreferencesCopyAppValue(NULL, NULL)]])],
|
||||
[gt_cv_func_CFPreferencesCopyAppValue=yes],
|
||||
[gt_cv_func_CFPreferencesCopyAppValue=no])
|
||||
LIBS="$gt_save_LIBS"])
|
||||
if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
|
||||
AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
|
||||
[Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
|
||||
fi
|
||||
dnl Check for API introduced in Mac OS X 10.3.
|
||||
AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
|
||||
[gt_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[#include <CoreFoundation/CFLocale.h>]],
|
||||
[[CFLocaleCopyCurrent();]])],
|
||||
[gt_cv_func_CFLocaleCopyCurrent=yes],
|
||||
[gt_cv_func_CFLocaleCopyCurrent=no])
|
||||
LIBS="$gt_save_LIBS"])
|
||||
if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
|
||||
AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
|
||||
[Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
|
||||
fi
|
||||
INTL_MACOSX_LIBS=
|
||||
if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
|
||||
INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
|
||||
fi
|
||||
AC_SUBST([INTL_MACOSX_LIBS])
|
||||
])
|
||||
119
m4/lib-ld.m4
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
# lib-ld.m4 serial 6
|
||||
dnl Copyright (C) 1996-2003, 2009-2014 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl Subroutines of libtool.m4,
|
||||
dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
|
||||
dnl collision with libtool.m4.
|
||||
|
||||
dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
|
||||
AC_DEFUN([AC_LIB_PROG_LD_GNU],
|
||||
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
|
||||
[# I'd rather use --version here, but apparently some GNU lds only accept -v.
|
||||
case `$LD -v 2>&1 </dev/null` in
|
||||
*GNU* | *'with BFD'*)
|
||||
acl_cv_prog_gnu_ld=yes
|
||||
;;
|
||||
*)
|
||||
acl_cv_prog_gnu_ld=no
|
||||
;;
|
||||
esac])
|
||||
with_gnu_ld=$acl_cv_prog_gnu_ld
|
||||
])
|
||||
|
||||
dnl From libtool-2.4. Sets the variable LD.
|
||||
AC_DEFUN([AC_LIB_PROG_LD],
|
||||
[AC_REQUIRE([AC_PROG_CC])dnl
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||
|
||||
AC_ARG_WITH([gnu-ld],
|
||||
[AS_HELP_STRING([--with-gnu-ld],
|
||||
[assume the C compiler uses GNU ld [default=no]])],
|
||||
[test "$withval" = no || with_gnu_ld=yes],
|
||||
[with_gnu_ld=no])dnl
|
||||
|
||||
# Prepare PATH_SEPARATOR.
|
||||
# The user is always right.
|
||||
if test "${PATH_SEPARATOR+set}" != set; then
|
||||
# Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
|
||||
# contains only /bin. Note that ksh looks also at the FPATH variable,
|
||||
# so we have to set that as well for the test.
|
||||
PATH_SEPARATOR=:
|
||||
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
|
||||
&& { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
|
||||
|| PATH_SEPARATOR=';'
|
||||
}
|
||||
fi
|
||||
|
||||
ac_prog=ld
|
||||
if test "$GCC" = yes; then
|
||||
# Check if gcc -print-prog-name=ld gives a path.
|
||||
AC_MSG_CHECKING([for ld used by $CC])
|
||||
case $host in
|
||||
*-*-mingw*)
|
||||
# gcc leaves a trailing carriage return which upsets mingw
|
||||
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
|
||||
*)
|
||||
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
|
||||
esac
|
||||
case $ac_prog in
|
||||
# Accept absolute paths.
|
||||
[[\\/]]* | ?:[[\\/]]*)
|
||||
re_direlt='/[[^/]][[^/]]*/\.\./'
|
||||
# Canonicalize the pathname of ld
|
||||
ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
|
||||
while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
|
||||
ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
|
||||
done
|
||||
test -z "$LD" && LD="$ac_prog"
|
||||
;;
|
||||
"")
|
||||
# If it fails, then pretend we aren't using GCC.
|
||||
ac_prog=ld
|
||||
;;
|
||||
*)
|
||||
# If it is relative, then search for the first ld in PATH.
|
||||
with_gnu_ld=unknown
|
||||
;;
|
||||
esac
|
||||
elif test "$with_gnu_ld" = yes; then
|
||||
AC_MSG_CHECKING([for GNU ld])
|
||||
else
|
||||
AC_MSG_CHECKING([for non-GNU ld])
|
||||
fi
|
||||
AC_CACHE_VAL([acl_cv_path_LD],
|
||||
[if test -z "$LD"; then
|
||||
acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
|
||||
for ac_dir in $PATH; do
|
||||
IFS="$acl_save_ifs"
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
|
||||
acl_cv_path_LD="$ac_dir/$ac_prog"
|
||||
# Check to see if the program is GNU ld. I'd rather use --version,
|
||||
# but apparently some variants of GNU ld only accept -v.
|
||||
# Break only if it was the GNU/non-GNU ld that we prefer.
|
||||
case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
|
||||
*GNU* | *'with BFD'*)
|
||||
test "$with_gnu_ld" != no && break
|
||||
;;
|
||||
*)
|
||||
test "$with_gnu_ld" != yes && break
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
IFS="$acl_save_ifs"
|
||||
else
|
||||
acl_cv_path_LD="$LD" # Let the user override the test with a path.
|
||||
fi])
|
||||
LD="$acl_cv_path_LD"
|
||||
if test -n "$LD"; then
|
||||
AC_MSG_RESULT([$LD])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
|
||||
AC_LIB_PROG_LD_GNU
|
||||
])
|
||||
777
m4/lib-link.m4
Normal file
|
|
@ -0,0 +1,777 @@
|
|||
# lib-link.m4 serial 26 (gettext-0.18.2)
|
||||
dnl Copyright (C) 2001-2014 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl From Bruno Haible.
|
||||
|
||||
AC_PREREQ([2.54])
|
||||
|
||||
dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
|
||||
dnl the libraries corresponding to explicit and implicit dependencies.
|
||||
dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
|
||||
dnl augments the CPPFLAGS variable.
|
||||
dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
|
||||
dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
|
||||
AC_DEFUN([AC_LIB_LINKFLAGS],
|
||||
[
|
||||
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||
AC_REQUIRE([AC_LIB_RPATH])
|
||||
pushdef([Name],[m4_translit([$1],[./+-], [____])])
|
||||
pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
|
||||
AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
|
||||
AC_LIB_LINKFLAGS_BODY([$1], [$2])
|
||||
ac_cv_lib[]Name[]_libs="$LIB[]NAME"
|
||||
ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
|
||||
ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
|
||||
ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
|
||||
])
|
||||
LIB[]NAME="$ac_cv_lib[]Name[]_libs"
|
||||
LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
|
||||
INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
|
||||
LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
|
||||
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
|
||||
AC_SUBST([LIB]NAME)
|
||||
AC_SUBST([LTLIB]NAME)
|
||||
AC_SUBST([LIB]NAME[_PREFIX])
|
||||
dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
|
||||
dnl results of this search when this library appears as a dependency.
|
||||
HAVE_LIB[]NAME=yes
|
||||
popdef([NAME])
|
||||
popdef([Name])
|
||||
])
|
||||
|
||||
dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
|
||||
dnl searches for libname and the libraries corresponding to explicit and
|
||||
dnl implicit dependencies, together with the specified include files and
|
||||
dnl the ability to compile and link the specified testcode. The missing-message
|
||||
dnl defaults to 'no' and may contain additional hints for the user.
|
||||
dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
|
||||
dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
|
||||
dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
|
||||
dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
|
||||
dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
|
||||
dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
|
||||
AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
|
||||
[
|
||||
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||
AC_REQUIRE([AC_LIB_RPATH])
|
||||
pushdef([Name],[m4_translit([$1],[./+-], [____])])
|
||||
pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
|
||||
|
||||
dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
|
||||
dnl accordingly.
|
||||
AC_LIB_LINKFLAGS_BODY([$1], [$2])
|
||||
|
||||
dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
|
||||
dnl because if the user has installed lib[]Name and not disabled its use
|
||||
dnl via --without-lib[]Name-prefix, he wants to use it.
|
||||
ac_save_CPPFLAGS="$CPPFLAGS"
|
||||
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
|
||||
|
||||
AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
|
||||
ac_save_LIBS="$LIBS"
|
||||
dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
|
||||
dnl because these -l options might require -L options that are present in
|
||||
dnl LIBS. -l options benefit only from the -L options listed before it.
|
||||
dnl Otherwise, add it to the front of LIBS, because it may be a static
|
||||
dnl library that depends on another static library that is present in LIBS.
|
||||
dnl Static libraries benefit only from the static libraries listed after
|
||||
dnl it.
|
||||
case " $LIB[]NAME" in
|
||||
*" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
|
||||
*) LIBS="$LIB[]NAME $LIBS" ;;
|
||||
esac
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM([[$3]], [[$4]])],
|
||||
[ac_cv_lib[]Name=yes],
|
||||
[ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
|
||||
LIBS="$ac_save_LIBS"
|
||||
])
|
||||
if test "$ac_cv_lib[]Name" = yes; then
|
||||
HAVE_LIB[]NAME=yes
|
||||
AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
|
||||
AC_MSG_CHECKING([how to link with lib[]$1])
|
||||
AC_MSG_RESULT([$LIB[]NAME])
|
||||
else
|
||||
HAVE_LIB[]NAME=no
|
||||
dnl If $LIB[]NAME didn't lead to a usable library, we don't need
|
||||
dnl $INC[]NAME either.
|
||||
CPPFLAGS="$ac_save_CPPFLAGS"
|
||||
LIB[]NAME=
|
||||
LTLIB[]NAME=
|
||||
LIB[]NAME[]_PREFIX=
|
||||
fi
|
||||
AC_SUBST([HAVE_LIB]NAME)
|
||||
AC_SUBST([LIB]NAME)
|
||||
AC_SUBST([LTLIB]NAME)
|
||||
AC_SUBST([LIB]NAME[_PREFIX])
|
||||
popdef([NAME])
|
||||
popdef([Name])
|
||||
])
|
||||
|
||||
dnl Determine the platform dependent parameters needed to use rpath:
|
||||
dnl acl_libext,
|
||||
dnl acl_shlibext,
|
||||
dnl acl_libname_spec,
|
||||
dnl acl_library_names_spec,
|
||||
dnl acl_hardcode_libdir_flag_spec,
|
||||
dnl acl_hardcode_libdir_separator,
|
||||
dnl acl_hardcode_direct,
|
||||
dnl acl_hardcode_minus_L.
|
||||
AC_DEFUN([AC_LIB_RPATH],
|
||||
[
|
||||
dnl Tell automake >= 1.10 to complain if config.rpath is missing.
|
||||
m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
|
||||
AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
|
||||
AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
|
||||
AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
|
||||
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
|
||||
AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
|
||||
CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
|
||||
${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
|
||||
. ./conftest.sh
|
||||
rm -f ./conftest.sh
|
||||
acl_cv_rpath=done
|
||||
])
|
||||
wl="$acl_cv_wl"
|
||||
acl_libext="$acl_cv_libext"
|
||||
acl_shlibext="$acl_cv_shlibext"
|
||||
acl_libname_spec="$acl_cv_libname_spec"
|
||||
acl_library_names_spec="$acl_cv_library_names_spec"
|
||||
acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
|
||||
acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
|
||||
acl_hardcode_direct="$acl_cv_hardcode_direct"
|
||||
acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
|
||||
dnl Determine whether the user wants rpath handling at all.
|
||||
AC_ARG_ENABLE([rpath],
|
||||
[ --disable-rpath do not hardcode runtime library paths],
|
||||
:, enable_rpath=yes)
|
||||
])
|
||||
|
||||
dnl AC_LIB_FROMPACKAGE(name, package)
|
||||
dnl declares that libname comes from the given package. The configure file
|
||||
dnl will then not have a --with-libname-prefix option but a
|
||||
dnl --with-package-prefix option. Several libraries can come from the same
|
||||
dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
|
||||
dnl macro call that searches for libname.
|
||||
AC_DEFUN([AC_LIB_FROMPACKAGE],
|
||||
[
|
||||
pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
|
||||
define([acl_frompackage_]NAME, [$2])
|
||||
popdef([NAME])
|
||||
pushdef([PACK],[$2])
|
||||
pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
|
||||
define([acl_libsinpackage_]PACKUP,
|
||||
m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
|
||||
popdef([PACKUP])
|
||||
popdef([PACK])
|
||||
])
|
||||
|
||||
dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
|
||||
dnl the libraries corresponding to explicit and implicit dependencies.
|
||||
dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
|
||||
dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
|
||||
dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
|
||||
AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
|
||||
[
|
||||
AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
|
||||
pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
|
||||
pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
|
||||
pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
|
||||
pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
|
||||
dnl Autoconf >= 2.61 supports dots in --with options.
|
||||
pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)])
|
||||
dnl By default, look in $includedir and $libdir.
|
||||
use_additional=yes
|
||||
AC_LIB_WITH_FINAL_PREFIX([
|
||||
eval additional_includedir=\"$includedir\"
|
||||
eval additional_libdir=\"$libdir\"
|
||||
])
|
||||
AC_ARG_WITH(P_A_C_K[-prefix],
|
||||
[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib
|
||||
--without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]],
|
||||
[
|
||||
if test "X$withval" = "Xno"; then
|
||||
use_additional=no
|
||||
else
|
||||
if test "X$withval" = "X"; then
|
||||
AC_LIB_WITH_FINAL_PREFIX([
|
||||
eval additional_includedir=\"$includedir\"
|
||||
eval additional_libdir=\"$libdir\"
|
||||
])
|
||||
else
|
||||
additional_includedir="$withval/include"
|
||||
additional_libdir="$withval/$acl_libdirstem"
|
||||
if test "$acl_libdirstem2" != "$acl_libdirstem" \
|
||||
&& ! test -d "$withval/$acl_libdirstem"; then
|
||||
additional_libdir="$withval/$acl_libdirstem2"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
])
|
||||
dnl Search the library and its dependencies in $additional_libdir and
|
||||
dnl $LDFLAGS. Using breadth-first-seach.
|
||||
LIB[]NAME=
|
||||
LTLIB[]NAME=
|
||||
INC[]NAME=
|
||||
LIB[]NAME[]_PREFIX=
|
||||
dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
|
||||
dnl computed. So it has to be reset here.
|
||||
HAVE_LIB[]NAME=
|
||||
rpathdirs=
|
||||
ltrpathdirs=
|
||||
names_already_handled=
|
||||
names_next_round='$1 $2'
|
||||
while test -n "$names_next_round"; do
|
||||
names_this_round="$names_next_round"
|
||||
names_next_round=
|
||||
for name in $names_this_round; do
|
||||
already_handled=
|
||||
for n in $names_already_handled; do
|
||||
if test "$n" = "$name"; then
|
||||
already_handled=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$already_handled"; then
|
||||
names_already_handled="$names_already_handled $name"
|
||||
dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
|
||||
dnl or AC_LIB_HAVE_LINKFLAGS call.
|
||||
uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
|
||||
eval value=\"\$HAVE_LIB$uppername\"
|
||||
if test -n "$value"; then
|
||||
if test "$value" = yes; then
|
||||
eval value=\"\$LIB$uppername\"
|
||||
test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
|
||||
eval value=\"\$LTLIB$uppername\"
|
||||
test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
|
||||
else
|
||||
dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
|
||||
dnl that this library doesn't exist. So just drop it.
|
||||
:
|
||||
fi
|
||||
else
|
||||
dnl Search the library lib$name in $additional_libdir and $LDFLAGS
|
||||
dnl and the already constructed $LIBNAME/$LTLIBNAME.
|
||||
found_dir=
|
||||
found_la=
|
||||
found_so=
|
||||
found_a=
|
||||
eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
|
||||
if test -n "$acl_shlibext"; then
|
||||
shrext=".$acl_shlibext" # typically: shrext=.so
|
||||
else
|
||||
shrext=
|
||||
fi
|
||||
if test $use_additional = yes; then
|
||||
dir="$additional_libdir"
|
||||
dnl The same code as in the loop below:
|
||||
dnl First look for a shared library.
|
||||
if test -n "$acl_shlibext"; then
|
||||
if test -f "$dir/$libname$shrext"; then
|
||||
found_dir="$dir"
|
||||
found_so="$dir/$libname$shrext"
|
||||
else
|
||||
if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
|
||||
ver=`(cd "$dir" && \
|
||||
for f in "$libname$shrext".*; do echo "$f"; done \
|
||||
| sed -e "s,^$libname$shrext\\\\.,," \
|
||||
| sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
|
||||
| sed 1q ) 2>/dev/null`
|
||||
if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
|
||||
found_dir="$dir"
|
||||
found_so="$dir/$libname$shrext.$ver"
|
||||
fi
|
||||
else
|
||||
eval library_names=\"$acl_library_names_spec\"
|
||||
for f in $library_names; do
|
||||
if test -f "$dir/$f"; then
|
||||
found_dir="$dir"
|
||||
found_so="$dir/$f"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
dnl Then look for a static library.
|
||||
if test "X$found_dir" = "X"; then
|
||||
if test -f "$dir/$libname.$acl_libext"; then
|
||||
found_dir="$dir"
|
||||
found_a="$dir/$libname.$acl_libext"
|
||||
fi
|
||||
fi
|
||||
if test "X$found_dir" != "X"; then
|
||||
if test -f "$dir/$libname.la"; then
|
||||
found_la="$dir/$libname.la"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if test "X$found_dir" = "X"; then
|
||||
for x in $LDFLAGS $LTLIB[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
case "$x" in
|
||||
-L*)
|
||||
dir=`echo "X$x" | sed -e 's/^X-L//'`
|
||||
dnl First look for a shared library.
|
||||
if test -n "$acl_shlibext"; then
|
||||
if test -f "$dir/$libname$shrext"; then
|
||||
found_dir="$dir"
|
||||
found_so="$dir/$libname$shrext"
|
||||
else
|
||||
if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
|
||||
ver=`(cd "$dir" && \
|
||||
for f in "$libname$shrext".*; do echo "$f"; done \
|
||||
| sed -e "s,^$libname$shrext\\\\.,," \
|
||||
| sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
|
||||
| sed 1q ) 2>/dev/null`
|
||||
if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
|
||||
found_dir="$dir"
|
||||
found_so="$dir/$libname$shrext.$ver"
|
||||
fi
|
||||
else
|
||||
eval library_names=\"$acl_library_names_spec\"
|
||||
for f in $library_names; do
|
||||
if test -f "$dir/$f"; then
|
||||
found_dir="$dir"
|
||||
found_so="$dir/$f"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
dnl Then look for a static library.
|
||||
if test "X$found_dir" = "X"; then
|
||||
if test -f "$dir/$libname.$acl_libext"; then
|
||||
found_dir="$dir"
|
||||
found_a="$dir/$libname.$acl_libext"
|
||||
fi
|
||||
fi
|
||||
if test "X$found_dir" != "X"; then
|
||||
if test -f "$dir/$libname.la"; then
|
||||
found_la="$dir/$libname.la"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
if test "X$found_dir" != "X"; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if test "X$found_dir" != "X"; then
|
||||
dnl Found the library.
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
|
||||
if test "X$found_so" != "X"; then
|
||||
dnl Linking with a shared library. We attempt to hardcode its
|
||||
dnl directory into the executable's runpath, unless it's the
|
||||
dnl standard /usr/lib.
|
||||
if test "$enable_rpath" = no \
|
||||
|| test "X$found_dir" = "X/usr/$acl_libdirstem" \
|
||||
|| test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
|
||||
dnl No hardcoding is needed.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||
else
|
||||
dnl Use an explicit option to hardcode DIR into the resulting
|
||||
dnl binary.
|
||||
dnl Potentially add DIR to ltrpathdirs.
|
||||
dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
|
||||
haveit=
|
||||
for x in $ltrpathdirs; do
|
||||
if test "X$x" = "X$found_dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
ltrpathdirs="$ltrpathdirs $found_dir"
|
||||
fi
|
||||
dnl The hardcoding into $LIBNAME is system dependent.
|
||||
if test "$acl_hardcode_direct" = yes; then
|
||||
dnl Using DIR/libNAME.so during linking hardcodes DIR into the
|
||||
dnl resulting binary.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||
else
|
||||
if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
|
||||
dnl Use an explicit option to hardcode DIR into the resulting
|
||||
dnl binary.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||
dnl Potentially add DIR to rpathdirs.
|
||||
dnl The rpathdirs will be appended to $LIBNAME at the end.
|
||||
haveit=
|
||||
for x in $rpathdirs; do
|
||||
if test "X$x" = "X$found_dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
rpathdirs="$rpathdirs $found_dir"
|
||||
fi
|
||||
else
|
||||
dnl Rely on "-L$found_dir".
|
||||
dnl But don't add it if it's already contained in the LDFLAGS
|
||||
dnl or the already constructed $LIBNAME
|
||||
haveit=
|
||||
for x in $LDFLAGS $LIB[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-L$found_dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
|
||||
fi
|
||||
if test "$acl_hardcode_minus_L" != no; then
|
||||
dnl FIXME: Not sure whether we should use
|
||||
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
|
||||
dnl here.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||
else
|
||||
dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
|
||||
dnl here, because this doesn't fit in flags passed to the
|
||||
dnl compiler. So give up. No hardcoding. This affects only
|
||||
dnl very old systems.
|
||||
dnl FIXME: Not sure whether we should use
|
||||
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
|
||||
dnl here.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if test "X$found_a" != "X"; then
|
||||
dnl Linking with a static library.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
|
||||
else
|
||||
dnl We shouldn't come here, but anyway it's good to have a
|
||||
dnl fallback.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
|
||||
fi
|
||||
fi
|
||||
dnl Assume the include files are nearby.
|
||||
additional_includedir=
|
||||
case "$found_dir" in
|
||||
*/$acl_libdirstem | */$acl_libdirstem/)
|
||||
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
|
||||
if test "$name" = '$1'; then
|
||||
LIB[]NAME[]_PREFIX="$basedir"
|
||||
fi
|
||||
additional_includedir="$basedir/include"
|
||||
;;
|
||||
*/$acl_libdirstem2 | */$acl_libdirstem2/)
|
||||
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
|
||||
if test "$name" = '$1'; then
|
||||
LIB[]NAME[]_PREFIX="$basedir"
|
||||
fi
|
||||
additional_includedir="$basedir/include"
|
||||
;;
|
||||
esac
|
||||
if test "X$additional_includedir" != "X"; then
|
||||
dnl Potentially add $additional_includedir to $INCNAME.
|
||||
dnl But don't add it
|
||||
dnl 1. if it's the standard /usr/include,
|
||||
dnl 2. if it's /usr/local/include and we are using GCC on Linux,
|
||||
dnl 3. if it's already present in $CPPFLAGS or the already
|
||||
dnl constructed $INCNAME,
|
||||
dnl 4. if it doesn't exist as a directory.
|
||||
if test "X$additional_includedir" != "X/usr/include"; then
|
||||
haveit=
|
||||
if test "X$additional_includedir" = "X/usr/local/include"; then
|
||||
if test -n "$GCC"; then
|
||||
case $host_os in
|
||||
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if test -z "$haveit"; then
|
||||
for x in $CPPFLAGS $INC[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-I$additional_includedir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_includedir"; then
|
||||
dnl Really add $additional_includedir to $INCNAME.
|
||||
INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
dnl Look for dependencies.
|
||||
if test -n "$found_la"; then
|
||||
dnl Read the .la file. It defines the variables
|
||||
dnl dlname, library_names, old_library, dependency_libs, current,
|
||||
dnl age, revision, installed, dlopen, dlpreopen, libdir.
|
||||
save_libdir="$libdir"
|
||||
case "$found_la" in
|
||||
*/* | *\\*) . "$found_la" ;;
|
||||
*) . "./$found_la" ;;
|
||||
esac
|
||||
libdir="$save_libdir"
|
||||
dnl We use only dependency_libs.
|
||||
for dep in $dependency_libs; do
|
||||
case "$dep" in
|
||||
-L*)
|
||||
additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
|
||||
dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
|
||||
dnl But don't add it
|
||||
dnl 1. if it's the standard /usr/lib,
|
||||
dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
|
||||
dnl 3. if it's already present in $LDFLAGS or the already
|
||||
dnl constructed $LIBNAME,
|
||||
dnl 4. if it doesn't exist as a directory.
|
||||
if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
|
||||
&& test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
|
||||
haveit=
|
||||
if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
|
||||
|| test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
|
||||
if test -n "$GCC"; then
|
||||
case $host_os in
|
||||
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if test -z "$haveit"; then
|
||||
haveit=
|
||||
for x in $LDFLAGS $LIB[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-L$additional_libdir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_libdir"; then
|
||||
dnl Really add $additional_libdir to $LIBNAME.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
|
||||
fi
|
||||
fi
|
||||
haveit=
|
||||
for x in $LDFLAGS $LTLIB[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-L$additional_libdir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_libdir"; then
|
||||
dnl Really add $additional_libdir to $LTLIBNAME.
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
-R*)
|
||||
dir=`echo "X$dep" | sed -e 's/^X-R//'`
|
||||
if test "$enable_rpath" != no; then
|
||||
dnl Potentially add DIR to rpathdirs.
|
||||
dnl The rpathdirs will be appended to $LIBNAME at the end.
|
||||
haveit=
|
||||
for x in $rpathdirs; do
|
||||
if test "X$x" = "X$dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
rpathdirs="$rpathdirs $dir"
|
||||
fi
|
||||
dnl Potentially add DIR to ltrpathdirs.
|
||||
dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
|
||||
haveit=
|
||||
for x in $ltrpathdirs; do
|
||||
if test "X$x" = "X$dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
ltrpathdirs="$ltrpathdirs $dir"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
-l*)
|
||||
dnl Handle this in the next round.
|
||||
names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
|
||||
;;
|
||||
*.la)
|
||||
dnl Handle this in the next round. Throw away the .la's
|
||||
dnl directory; it is already contained in a preceding -L
|
||||
dnl option.
|
||||
names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
|
||||
;;
|
||||
*)
|
||||
dnl Most likely an immediate library name.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
else
|
||||
dnl Didn't find the library; assume it is in the system directories
|
||||
dnl known to the linker and runtime loader. (All the system
|
||||
dnl directories known to the linker should also be known to the
|
||||
dnl runtime loader, otherwise the system is severely misconfigured.)
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
if test "X$rpathdirs" != "X"; then
|
||||
if test -n "$acl_hardcode_libdir_separator"; then
|
||||
dnl Weird platform: only the last -rpath option counts, the user must
|
||||
dnl pass all path elements in one option. We can arrange that for a
|
||||
dnl single library, but not when more than one $LIBNAMEs are used.
|
||||
alldirs=
|
||||
for found_dir in $rpathdirs; do
|
||||
alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
|
||||
done
|
||||
dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
|
||||
acl_save_libdir="$libdir"
|
||||
libdir="$alldirs"
|
||||
eval flag=\"$acl_hardcode_libdir_flag_spec\"
|
||||
libdir="$acl_save_libdir"
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
|
||||
else
|
||||
dnl The -rpath options are cumulative.
|
||||
for found_dir in $rpathdirs; do
|
||||
acl_save_libdir="$libdir"
|
||||
libdir="$found_dir"
|
||||
eval flag=\"$acl_hardcode_libdir_flag_spec\"
|
||||
libdir="$acl_save_libdir"
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
|
||||
done
|
||||
fi
|
||||
fi
|
||||
if test "X$ltrpathdirs" != "X"; then
|
||||
dnl When using libtool, the option that works for both libraries and
|
||||
dnl executables is -R. The -R options are cumulative.
|
||||
for found_dir in $ltrpathdirs; do
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
|
||||
done
|
||||
fi
|
||||
popdef([P_A_C_K])
|
||||
popdef([PACKLIBS])
|
||||
popdef([PACKUP])
|
||||
popdef([PACK])
|
||||
popdef([NAME])
|
||||
])
|
||||
|
||||
dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
|
||||
dnl unless already present in VAR.
|
||||
dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
|
||||
dnl contains two or three consecutive elements that belong together.
|
||||
AC_DEFUN([AC_LIB_APPENDTOVAR],
|
||||
[
|
||||
for element in [$2]; do
|
||||
haveit=
|
||||
for x in $[$1]; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X$element"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
[$1]="${[$1]}${[$1]:+ }$element"
|
||||
fi
|
||||
done
|
||||
])
|
||||
|
||||
dnl For those cases where a variable contains several -L and -l options
|
||||
dnl referring to unknown libraries and directories, this macro determines the
|
||||
dnl necessary additional linker options for the runtime path.
|
||||
dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
|
||||
dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
|
||||
dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
|
||||
dnl otherwise linking without libtool is assumed.
|
||||
AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
|
||||
[
|
||||
AC_REQUIRE([AC_LIB_RPATH])
|
||||
AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
|
||||
$1=
|
||||
if test "$enable_rpath" != no; then
|
||||
if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
|
||||
dnl Use an explicit option to hardcode directories into the resulting
|
||||
dnl binary.
|
||||
rpathdirs=
|
||||
next=
|
||||
for opt in $2; do
|
||||
if test -n "$next"; then
|
||||
dir="$next"
|
||||
dnl No need to hardcode the standard /usr/lib.
|
||||
if test "X$dir" != "X/usr/$acl_libdirstem" \
|
||||
&& test "X$dir" != "X/usr/$acl_libdirstem2"; then
|
||||
rpathdirs="$rpathdirs $dir"
|
||||
fi
|
||||
next=
|
||||
else
|
||||
case $opt in
|
||||
-L) next=yes ;;
|
||||
-L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
|
||||
dnl No need to hardcode the standard /usr/lib.
|
||||
if test "X$dir" != "X/usr/$acl_libdirstem" \
|
||||
&& test "X$dir" != "X/usr/$acl_libdirstem2"; then
|
||||
rpathdirs="$rpathdirs $dir"
|
||||
fi
|
||||
next= ;;
|
||||
*) next= ;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
if test "X$rpathdirs" != "X"; then
|
||||
if test -n ""$3""; then
|
||||
dnl libtool is used for linking. Use -R options.
|
||||
for dir in $rpathdirs; do
|
||||
$1="${$1}${$1:+ }-R$dir"
|
||||
done
|
||||
else
|
||||
dnl The linker is used for linking directly.
|
||||
if test -n "$acl_hardcode_libdir_separator"; then
|
||||
dnl Weird platform: only the last -rpath option counts, the user
|
||||
dnl must pass all path elements in one option.
|
||||
alldirs=
|
||||
for dir in $rpathdirs; do
|
||||
alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
|
||||
done
|
||||
acl_save_libdir="$libdir"
|
||||
libdir="$alldirs"
|
||||
eval flag=\"$acl_hardcode_libdir_flag_spec\"
|
||||
libdir="$acl_save_libdir"
|
||||
$1="$flag"
|
||||
else
|
||||
dnl The -rpath options are cumulative.
|
||||
for dir in $rpathdirs; do
|
||||
acl_save_libdir="$libdir"
|
||||
libdir="$dir"
|
||||
eval flag=\"$acl_hardcode_libdir_flag_spec\"
|
||||
libdir="$acl_save_libdir"
|
||||
$1="${$1}${$1:+ }$flag"
|
||||
done
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([$1])
|
||||
])
|
||||
224
m4/lib-prefix.m4
Normal file
|
|
@ -0,0 +1,224 @@
|
|||
# lib-prefix.m4 serial 7 (gettext-0.18)
|
||||
dnl Copyright (C) 2001-2005, 2008-2014 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl From Bruno Haible.
|
||||
|
||||
dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
|
||||
dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
|
||||
dnl require excessive bracketing.
|
||||
ifdef([AC_HELP_STRING],
|
||||
[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
|
||||
[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
|
||||
|
||||
dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
|
||||
dnl to access previously installed libraries. The basic assumption is that
|
||||
dnl a user will want packages to use other packages he previously installed
|
||||
dnl with the same --prefix option.
|
||||
dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
|
||||
dnl libraries, but is otherwise very convenient.
|
||||
AC_DEFUN([AC_LIB_PREFIX],
|
||||
[
|
||||
AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
|
||||
AC_REQUIRE([AC_PROG_CC])
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
|
||||
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||
dnl By default, look in $includedir and $libdir.
|
||||
use_additional=yes
|
||||
AC_LIB_WITH_FINAL_PREFIX([
|
||||
eval additional_includedir=\"$includedir\"
|
||||
eval additional_libdir=\"$libdir\"
|
||||
])
|
||||
AC_LIB_ARG_WITH([lib-prefix],
|
||||
[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
|
||||
--without-lib-prefix don't search for libraries in includedir and libdir],
|
||||
[
|
||||
if test "X$withval" = "Xno"; then
|
||||
use_additional=no
|
||||
else
|
||||
if test "X$withval" = "X"; then
|
||||
AC_LIB_WITH_FINAL_PREFIX([
|
||||
eval additional_includedir=\"$includedir\"
|
||||
eval additional_libdir=\"$libdir\"
|
||||
])
|
||||
else
|
||||
additional_includedir="$withval/include"
|
||||
additional_libdir="$withval/$acl_libdirstem"
|
||||
fi
|
||||
fi
|
||||
])
|
||||
if test $use_additional = yes; then
|
||||
dnl Potentially add $additional_includedir to $CPPFLAGS.
|
||||
dnl But don't add it
|
||||
dnl 1. if it's the standard /usr/include,
|
||||
dnl 2. if it's already present in $CPPFLAGS,
|
||||
dnl 3. if it's /usr/local/include and we are using GCC on Linux,
|
||||
dnl 4. if it doesn't exist as a directory.
|
||||
if test "X$additional_includedir" != "X/usr/include"; then
|
||||
haveit=
|
||||
for x in $CPPFLAGS; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-I$additional_includedir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test "X$additional_includedir" = "X/usr/local/include"; then
|
||||
if test -n "$GCC"; then
|
||||
case $host_os in
|
||||
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_includedir"; then
|
||||
dnl Really add $additional_includedir to $CPPFLAGS.
|
||||
CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
dnl Potentially add $additional_libdir to $LDFLAGS.
|
||||
dnl But don't add it
|
||||
dnl 1. if it's the standard /usr/lib,
|
||||
dnl 2. if it's already present in $LDFLAGS,
|
||||
dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
|
||||
dnl 4. if it doesn't exist as a directory.
|
||||
if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
|
||||
haveit=
|
||||
for x in $LDFLAGS; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-L$additional_libdir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
|
||||
if test -n "$GCC"; then
|
||||
case $host_os in
|
||||
linux*) haveit=yes;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_libdir"; then
|
||||
dnl Really add $additional_libdir to $LDFLAGS.
|
||||
LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
|
||||
dnl acl_final_exec_prefix, containing the values to which $prefix and
|
||||
dnl $exec_prefix will expand at the end of the configure script.
|
||||
AC_DEFUN([AC_LIB_PREPARE_PREFIX],
|
||||
[
|
||||
dnl Unfortunately, prefix and exec_prefix get only finally determined
|
||||
dnl at the end of configure.
|
||||
if test "X$prefix" = "XNONE"; then
|
||||
acl_final_prefix="$ac_default_prefix"
|
||||
else
|
||||
acl_final_prefix="$prefix"
|
||||
fi
|
||||
if test "X$exec_prefix" = "XNONE"; then
|
||||
acl_final_exec_prefix='${prefix}'
|
||||
else
|
||||
acl_final_exec_prefix="$exec_prefix"
|
||||
fi
|
||||
acl_save_prefix="$prefix"
|
||||
prefix="$acl_final_prefix"
|
||||
eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
|
||||
prefix="$acl_save_prefix"
|
||||
])
|
||||
|
||||
dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
|
||||
dnl variables prefix and exec_prefix bound to the values they will have
|
||||
dnl at the end of the configure script.
|
||||
AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
|
||||
[
|
||||
acl_save_prefix="$prefix"
|
||||
prefix="$acl_final_prefix"
|
||||
acl_save_exec_prefix="$exec_prefix"
|
||||
exec_prefix="$acl_final_exec_prefix"
|
||||
$1
|
||||
exec_prefix="$acl_save_exec_prefix"
|
||||
prefix="$acl_save_prefix"
|
||||
])
|
||||
|
||||
dnl AC_LIB_PREPARE_MULTILIB creates
|
||||
dnl - a variable acl_libdirstem, containing the basename of the libdir, either
|
||||
dnl "lib" or "lib64" or "lib/64",
|
||||
dnl - a variable acl_libdirstem2, as a secondary possible value for
|
||||
dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
|
||||
dnl "lib/amd64".
|
||||
AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
|
||||
[
|
||||
dnl There is no formal standard regarding lib and lib64.
|
||||
dnl On glibc systems, the current practice is that on a system supporting
|
||||
dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
|
||||
dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
|
||||
dnl the compiler's default mode by looking at the compiler's library search
|
||||
dnl path. If at least one of its elements ends in /lib64 or points to a
|
||||
dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
|
||||
dnl Otherwise we use the default, namely "lib".
|
||||
dnl On Solaris systems, the current practice is that on a system supporting
|
||||
dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
|
||||
dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
|
||||
dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
acl_libdirstem=lib
|
||||
acl_libdirstem2=
|
||||
case "$host_os" in
|
||||
solaris*)
|
||||
dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
|
||||
dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
|
||||
dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
|
||||
dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
|
||||
dnl symlink is missing, so we set acl_libdirstem2 too.
|
||||
AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
|
||||
[AC_EGREP_CPP([sixtyfour bits], [
|
||||
#ifdef _LP64
|
||||
sixtyfour bits
|
||||
#endif
|
||||
], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
|
||||
])
|
||||
if test $gl_cv_solaris_64bit = yes; then
|
||||
acl_libdirstem=lib/64
|
||||
case "$host_cpu" in
|
||||
sparc*) acl_libdirstem2=lib/sparcv9 ;;
|
||||
i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
|
||||
if test -n "$searchpath"; then
|
||||
acl_save_IFS="${IFS= }"; IFS=":"
|
||||
for searchdir in $searchpath; do
|
||||
if test -d "$searchdir"; then
|
||||
case "$searchdir" in
|
||||
*/lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
|
||||
*/../ | */.. )
|
||||
# Better ignore directories of this form. They are misleading.
|
||||
;;
|
||||
*) searchdir=`cd "$searchdir" && pwd`
|
||||
case "$searchdir" in
|
||||
*/lib64 ) acl_libdirstem=lib64 ;;
|
||||
esac ;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
IFS="$acl_save_IFS"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
|
||||
])
|
||||
32
m4/nls.m4
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
# nls.m4 serial 5 (gettext-0.18)
|
||||
dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation,
|
||||
dnl Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
dnl
|
||||
dnl This file can can be used in projects which are not available under
|
||||
dnl the GNU General Public License or the GNU Library General Public
|
||||
dnl License but which still want to provide support for the GNU gettext
|
||||
dnl functionality.
|
||||
dnl Please note that the actual code of the GNU gettext library is covered
|
||||
dnl by the GNU Library General Public License, and the rest of the GNU
|
||||
dnl gettext package package is covered by the GNU General Public License.
|
||||
dnl They are *not* in the public domain.
|
||||
|
||||
dnl Authors:
|
||||
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
|
||||
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
|
||||
|
||||
AC_PREREQ([2.50])
|
||||
|
||||
AC_DEFUN([AM_NLS],
|
||||
[
|
||||
AC_MSG_CHECKING([whether NLS is requested])
|
||||
dnl Default is enabled NLS
|
||||
AC_ARG_ENABLE([nls],
|
||||
[ --disable-nls do not use Native Language Support],
|
||||
USE_NLS=$enableval, USE_NLS=yes)
|
||||
AC_MSG_RESULT([$USE_NLS])
|
||||
AC_SUBST([USE_NLS])
|
||||
])
|
||||
453
m4/po.m4
Normal file
|
|
@ -0,0 +1,453 @@
|
|||
# po.m4 serial 22 (gettext-0.19)
|
||||
dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
dnl
|
||||
dnl This file can can be used in projects which are not available under
|
||||
dnl the GNU General Public License or the GNU Library General Public
|
||||
dnl License but which still want to provide support for the GNU gettext
|
||||
dnl functionality.
|
||||
dnl Please note that the actual code of the GNU gettext library is covered
|
||||
dnl by the GNU Library General Public License, and the rest of the GNU
|
||||
dnl gettext package package is covered by the GNU General Public License.
|
||||
dnl They are *not* in the public domain.
|
||||
|
||||
dnl Authors:
|
||||
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
|
||||
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
|
||||
|
||||
AC_PREREQ([2.60])
|
||||
|
||||
dnl Checks for all prerequisites of the po subdirectory.
|
||||
AC_DEFUN([AM_PO_SUBDIRS],
|
||||
[
|
||||
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||
AC_REQUIRE([AC_PROG_INSTALL])dnl
|
||||
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
||||
AC_REQUIRE([AC_PROG_SED])dnl
|
||||
AC_REQUIRE([AM_NLS])dnl
|
||||
|
||||
dnl Release version of the gettext macros. This is used to ensure that
|
||||
dnl the gettext macros and po/Makefile.in.in are in sync.
|
||||
AC_SUBST([GETTEXT_MACRO_VERSION], [0.19])
|
||||
|
||||
dnl Perform the following tests also if --disable-nls has been given,
|
||||
dnl because they are needed for "make dist" to work.
|
||||
|
||||
dnl Search for GNU msgfmt in the PATH.
|
||||
dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
|
||||
dnl The second test excludes FreeBSD msgfmt.
|
||||
AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
|
||||
[$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
|
||||
(if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
|
||||
:)
|
||||
AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
|
||||
|
||||
dnl Test whether it is GNU msgfmt >= 0.15.
|
||||
changequote(,)dnl
|
||||
case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
|
||||
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
|
||||
*) MSGFMT_015=$MSGFMT ;;
|
||||
esac
|
||||
changequote([,])dnl
|
||||
AC_SUBST([MSGFMT_015])
|
||||
changequote(,)dnl
|
||||
case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
|
||||
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
|
||||
*) GMSGFMT_015=$GMSGFMT ;;
|
||||
esac
|
||||
changequote([,])dnl
|
||||
AC_SUBST([GMSGFMT_015])
|
||||
|
||||
dnl Search for GNU xgettext 0.12 or newer in the PATH.
|
||||
dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
|
||||
dnl The second test excludes FreeBSD xgettext.
|
||||
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
|
||||
[$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
|
||||
(if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
|
||||
:)
|
||||
dnl Remove leftover from FreeBSD xgettext call.
|
||||
rm -f messages.po
|
||||
|
||||
dnl Test whether it is GNU xgettext >= 0.15.
|
||||
changequote(,)dnl
|
||||
case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
|
||||
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
|
||||
*) XGETTEXT_015=$XGETTEXT ;;
|
||||
esac
|
||||
changequote([,])dnl
|
||||
AC_SUBST([XGETTEXT_015])
|
||||
|
||||
dnl Search for GNU msgmerge 0.11 or newer in the PATH.
|
||||
AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
|
||||
[$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
|
||||
|
||||
dnl Installation directories.
|
||||
dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we
|
||||
dnl have to define it here, so that it can be used in po/Makefile.
|
||||
test -n "$localedir" || localedir='${datadir}/locale'
|
||||
AC_SUBST([localedir])
|
||||
|
||||
dnl Support for AM_XGETTEXT_OPTION.
|
||||
test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
|
||||
AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
|
||||
|
||||
AC_CONFIG_COMMANDS([po-directories], [[
|
||||
for ac_file in $CONFIG_FILES; do
|
||||
# Support "outfile[:infile[:infile...]]"
|
||||
case "$ac_file" in
|
||||
*:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
|
||||
esac
|
||||
# PO directories have a Makefile.in generated from Makefile.in.in.
|
||||
case "$ac_file" in */Makefile.in)
|
||||
# Adjust a relative srcdir.
|
||||
ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
|
||||
ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
|
||||
ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
|
||||
# In autoconf-2.13 it is called $ac_given_srcdir.
|
||||
# In autoconf-2.50 it is called $srcdir.
|
||||
test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
|
||||
case "$ac_given_srcdir" in
|
||||
.) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
|
||||
/*) top_srcdir="$ac_given_srcdir" ;;
|
||||
*) top_srcdir="$ac_dots$ac_given_srcdir" ;;
|
||||
esac
|
||||
# Treat a directory as a PO directory if and only if it has a
|
||||
# POTFILES.in file. This allows packages to have multiple PO
|
||||
# directories under different names or in different locations.
|
||||
if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
|
||||
rm -f "$ac_dir/POTFILES"
|
||||
test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
|
||||
gt_tab=`printf '\t'`
|
||||
cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
|
||||
POMAKEFILEDEPS="POTFILES.in"
|
||||
# ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
|
||||
# on $ac_dir but don't depend on user-specified configuration
|
||||
# parameters.
|
||||
if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
|
||||
# The LINGUAS file contains the set of available languages.
|
||||
if test -n "$OBSOLETE_ALL_LINGUAS"; then
|
||||
test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
|
||||
fi
|
||||
ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
|
||||
# Hide the ALL_LINGUAS assignment from automake < 1.5.
|
||||
eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
|
||||
POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
|
||||
else
|
||||
# The set of available languages was given in configure.in.
|
||||
# Hide the ALL_LINGUAS assignment from automake < 1.5.
|
||||
eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
|
||||
fi
|
||||
# Compute POFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
|
||||
# Compute UPDATEPOFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
|
||||
# Compute DUMMYPOFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
|
||||
# Compute GMOFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
|
||||
case "$ac_given_srcdir" in
|
||||
.) srcdirpre= ;;
|
||||
*) srcdirpre='$(srcdir)/' ;;
|
||||
esac
|
||||
POFILES=
|
||||
UPDATEPOFILES=
|
||||
DUMMYPOFILES=
|
||||
GMOFILES=
|
||||
for lang in $ALL_LINGUAS; do
|
||||
POFILES="$POFILES $srcdirpre$lang.po"
|
||||
UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
|
||||
DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
|
||||
GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
|
||||
done
|
||||
# CATALOGS depends on both $ac_dir and the user's LINGUAS
|
||||
# environment variable.
|
||||
INST_LINGUAS=
|
||||
if test -n "$ALL_LINGUAS"; then
|
||||
for presentlang in $ALL_LINGUAS; do
|
||||
useit=no
|
||||
if test "%UNSET%" != "$LINGUAS"; then
|
||||
desiredlanguages="$LINGUAS"
|
||||
else
|
||||
desiredlanguages="$ALL_LINGUAS"
|
||||
fi
|
||||
for desiredlang in $desiredlanguages; do
|
||||
# Use the presentlang catalog if desiredlang is
|
||||
# a. equal to presentlang, or
|
||||
# b. a variant of presentlang (because in this case,
|
||||
# presentlang can be used as a fallback for messages
|
||||
# which are not translated in the desiredlang catalog).
|
||||
case "$desiredlang" in
|
||||
"$presentlang"*) useit=yes;;
|
||||
esac
|
||||
done
|
||||
if test $useit = yes; then
|
||||
INST_LINGUAS="$INST_LINGUAS $presentlang"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
CATALOGS=
|
||||
if test -n "$INST_LINGUAS"; then
|
||||
for lang in $INST_LINGUAS; do
|
||||
CATALOGS="$CATALOGS $lang.gmo"
|
||||
done
|
||||
fi
|
||||
test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
|
||||
sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
|
||||
for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
|
||||
if test -f "$f"; then
|
||||
case "$f" in
|
||||
*.orig | *.bak | *~) ;;
|
||||
*) cat "$f" >> "$ac_dir/Makefile" ;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done]],
|
||||
[# Capture the value of obsolete ALL_LINGUAS because we need it to compute
|
||||
# POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
|
||||
# from automake < 1.5.
|
||||
eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
|
||||
# Capture the value of LINGUAS because we need it to compute CATALOGS.
|
||||
LINGUAS="${LINGUAS-%UNSET%}"
|
||||
])
|
||||
])
|
||||
|
||||
dnl Postprocesses a Makefile in a directory containing PO files.
|
||||
AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
|
||||
[
|
||||
# When this code is run, in config.status, two variables have already been
|
||||
# set:
|
||||
# - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
|
||||
# - LINGUAS is the value of the environment variable LINGUAS at configure
|
||||
# time.
|
||||
|
||||
changequote(,)dnl
|
||||
# Adjust a relative srcdir.
|
||||
ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
|
||||
ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
|
||||
ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
|
||||
# In autoconf-2.13 it is called $ac_given_srcdir.
|
||||
# In autoconf-2.50 it is called $srcdir.
|
||||
test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
|
||||
case "$ac_given_srcdir" in
|
||||
.) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
|
||||
/*) top_srcdir="$ac_given_srcdir" ;;
|
||||
*) top_srcdir="$ac_dots$ac_given_srcdir" ;;
|
||||
esac
|
||||
|
||||
# Find a way to echo strings without interpreting backslash.
|
||||
if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
|
||||
gt_echo='echo'
|
||||
else
|
||||
if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
|
||||
gt_echo='printf %s\n'
|
||||
else
|
||||
echo_func () {
|
||||
cat <<EOT
|
||||
$*
|
||||
EOT
|
||||
}
|
||||
gt_echo='echo_func'
|
||||
fi
|
||||
fi
|
||||
|
||||
# A sed script that extracts the value of VARIABLE from a Makefile.
|
||||
tab=`printf '\t'`
|
||||
sed_x_variable='
|
||||
# Test if the hold space is empty.
|
||||
x
|
||||
s/P/P/
|
||||
x
|
||||
ta
|
||||
# Yes it was empty. Look if we have the expected variable definition.
|
||||
/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
|
||||
# Seen the first line of the variable definition.
|
||||
s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
|
||||
ba
|
||||
}
|
||||
bd
|
||||
:a
|
||||
# Here we are processing a line from the variable definition.
|
||||
# Remove comment, more precisely replace it with a space.
|
||||
s/#.*$/ /
|
||||
# See if the line ends in a backslash.
|
||||
tb
|
||||
:b
|
||||
s/\\$//
|
||||
# Print the line, without the trailing backslash.
|
||||
p
|
||||
tc
|
||||
# There was no trailing backslash. The end of the variable definition is
|
||||
# reached. Clear the hold space.
|
||||
s/^.*$//
|
||||
x
|
||||
bd
|
||||
:c
|
||||
# A trailing backslash means that the variable definition continues in the
|
||||
# next line. Put a nonempty string into the hold space to indicate this.
|
||||
s/^.*$/P/
|
||||
x
|
||||
:d
|
||||
'
|
||||
changequote([,])dnl
|
||||
|
||||
# Set POTFILES to the value of the Makefile variable POTFILES.
|
||||
sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
|
||||
POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
|
||||
# Compute POTFILES_DEPS as
|
||||
# $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
|
||||
POTFILES_DEPS=
|
||||
for file in $POTFILES; do
|
||||
POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
|
||||
done
|
||||
POMAKEFILEDEPS=""
|
||||
|
||||
if test -n "$OBSOLETE_ALL_LINGUAS"; then
|
||||
test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
|
||||
fi
|
||||
if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
|
||||
# The LINGUAS file contains the set of available languages.
|
||||
ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
|
||||
POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
|
||||
else
|
||||
# Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
|
||||
sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
|
||||
ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
|
||||
fi
|
||||
# Hide the ALL_LINGUAS assignment from automake < 1.5.
|
||||
eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
|
||||
# Compute POFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
|
||||
# Compute UPDATEPOFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
|
||||
# Compute DUMMYPOFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
|
||||
# Compute GMOFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
|
||||
# Compute PROPERTIESFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
|
||||
# Compute CLASSFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
|
||||
# Compute QMFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
|
||||
# Compute MSGFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
|
||||
# Compute RESOURCESDLLFILES
|
||||
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
|
||||
case "$ac_given_srcdir" in
|
||||
.) srcdirpre= ;;
|
||||
*) srcdirpre='$(srcdir)/' ;;
|
||||
esac
|
||||
POFILES=
|
||||
UPDATEPOFILES=
|
||||
DUMMYPOFILES=
|
||||
GMOFILES=
|
||||
PROPERTIESFILES=
|
||||
CLASSFILES=
|
||||
QMFILES=
|
||||
MSGFILES=
|
||||
RESOURCESDLLFILES=
|
||||
for lang in $ALL_LINGUAS; do
|
||||
POFILES="$POFILES $srcdirpre$lang.po"
|
||||
UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
|
||||
DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
|
||||
GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
|
||||
PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
|
||||
CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
|
||||
QMFILES="$QMFILES $srcdirpre$lang.qm"
|
||||
frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
|
||||
MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
|
||||
frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
|
||||
RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
|
||||
done
|
||||
# CATALOGS depends on both $ac_dir and the user's LINGUAS
|
||||
# environment variable.
|
||||
INST_LINGUAS=
|
||||
if test -n "$ALL_LINGUAS"; then
|
||||
for presentlang in $ALL_LINGUAS; do
|
||||
useit=no
|
||||
if test "%UNSET%" != "$LINGUAS"; then
|
||||
desiredlanguages="$LINGUAS"
|
||||
else
|
||||
desiredlanguages="$ALL_LINGUAS"
|
||||
fi
|
||||
for desiredlang in $desiredlanguages; do
|
||||
# Use the presentlang catalog if desiredlang is
|
||||
# a. equal to presentlang, or
|
||||
# b. a variant of presentlang (because in this case,
|
||||
# presentlang can be used as a fallback for messages
|
||||
# which are not translated in the desiredlang catalog).
|
||||
case "$desiredlang" in
|
||||
"$presentlang"*) useit=yes;;
|
||||
esac
|
||||
done
|
||||
if test $useit = yes; then
|
||||
INST_LINGUAS="$INST_LINGUAS $presentlang"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
CATALOGS=
|
||||
JAVACATALOGS=
|
||||
QTCATALOGS=
|
||||
TCLCATALOGS=
|
||||
CSHARPCATALOGS=
|
||||
if test -n "$INST_LINGUAS"; then
|
||||
for lang in $INST_LINGUAS; do
|
||||
CATALOGS="$CATALOGS $lang.gmo"
|
||||
JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
|
||||
QTCATALOGS="$QTCATALOGS $lang.qm"
|
||||
frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
|
||||
TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
|
||||
frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
|
||||
CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
|
||||
done
|
||||
fi
|
||||
|
||||
sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
|
||||
tab=`printf '\t'`
|
||||
if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
|
||||
# Add dependencies that cannot be formulated as a simple suffix rule.
|
||||
for lang in $ALL_LINGUAS; do
|
||||
frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
|
||||
cat >> "$ac_file.tmp" <<EOF
|
||||
$frobbedlang.msg: $lang.po
|
||||
${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
|
||||
${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
|
||||
EOF
|
||||
done
|
||||
fi
|
||||
if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
|
||||
# Add dependencies that cannot be formulated as a simple suffix rule.
|
||||
for lang in $ALL_LINGUAS; do
|
||||
frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
|
||||
cat >> "$ac_file.tmp" <<EOF
|
||||
$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
|
||||
${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
|
||||
${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
|
||||
EOF
|
||||
done
|
||||
fi
|
||||
if test -n "$POMAKEFILEDEPS"; then
|
||||
cat >> "$ac_file.tmp" <<EOF
|
||||
Makefile: $POMAKEFILEDEPS
|
||||
EOF
|
||||
fi
|
||||
mv "$ac_file.tmp" "$ac_file"
|
||||
])
|
||||
|
||||
dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
|
||||
AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
|
||||
[
|
||||
XGETTEXT_EXTRA_OPTIONS=
|
||||
])
|
||||
|
||||
dnl Registers an option to be passed to xgettext in the po subdirectory.
|
||||
AC_DEFUN([AM_XGETTEXT_OPTION],
|
||||
[
|
||||
AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
|
||||
XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
|
||||
])
|
||||
91
m4/progtest.m4
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
# progtest.m4 serial 7 (gettext-0.18.2)
|
||||
dnl Copyright (C) 1996-2003, 2005, 2008-2014 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
dnl
|
||||
dnl This file can can be used in projects which are not available under
|
||||
dnl the GNU General Public License or the GNU Library General Public
|
||||
dnl License but which still want to provide support for the GNU gettext
|
||||
dnl functionality.
|
||||
dnl Please note that the actual code of the GNU gettext library is covered
|
||||
dnl by the GNU Library General Public License, and the rest of the GNU
|
||||
dnl gettext package package is covered by the GNU General Public License.
|
||||
dnl They are *not* in the public domain.
|
||||
|
||||
dnl Authors:
|
||||
dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
AC_PREREQ([2.50])
|
||||
|
||||
# Search path for a program which passes the given test.
|
||||
|
||||
dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
|
||||
dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
|
||||
AC_DEFUN([AM_PATH_PROG_WITH_TEST],
|
||||
[
|
||||
# Prepare PATH_SEPARATOR.
|
||||
# The user is always right.
|
||||
if test "${PATH_SEPARATOR+set}" != set; then
|
||||
# Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
|
||||
# contains only /bin. Note that ksh looks also at the FPATH variable,
|
||||
# so we have to set that as well for the test.
|
||||
PATH_SEPARATOR=:
|
||||
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
|
||||
&& { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
|
||||
|| PATH_SEPARATOR=';'
|
||||
}
|
||||
fi
|
||||
|
||||
# Find out how to test for executable files. Don't use a zero-byte file,
|
||||
# as systems may use methods other than mode bits to determine executability.
|
||||
cat >conf$$.file <<_ASEOF
|
||||
#! /bin/sh
|
||||
exit 0
|
||||
_ASEOF
|
||||
chmod +x conf$$.file
|
||||
if test -x conf$$.file >/dev/null 2>&1; then
|
||||
ac_executable_p="test -x"
|
||||
else
|
||||
ac_executable_p="test -f"
|
||||
fi
|
||||
rm -f conf$$.file
|
||||
|
||||
# Extract the first word of "$2", so it can be a program name with args.
|
||||
set dummy $2; ac_word=[$]2
|
||||
AC_MSG_CHECKING([for $ac_word])
|
||||
AC_CACHE_VAL([ac_cv_path_$1],
|
||||
[case "[$]$1" in
|
||||
[[\\/]]* | ?:[[\\/]]*)
|
||||
ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
|
||||
;;
|
||||
*)
|
||||
ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
|
||||
for ac_dir in ifelse([$5], , $PATH, [$5]); do
|
||||
IFS="$ac_save_IFS"
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
|
||||
echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
|
||||
if [$3]; then
|
||||
ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
|
||||
break 2
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS="$ac_save_IFS"
|
||||
dnl If no 4th arg is given, leave the cache variable unset,
|
||||
dnl so AC_PATH_PROGS will keep looking.
|
||||
ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
|
||||
])dnl
|
||||
;;
|
||||
esac])dnl
|
||||
$1="$ac_cv_path_$1"
|
||||
if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
|
||||
AC_MSG_RESULT([$][$1])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AC_SUBST([$1])dnl
|
||||
])
|
||||
215
missing
Executable file
|
|
@ -0,0 +1,215 @@
|
|||
#! /bin/sh
|
||||
# Common wrapper for a few potentially missing GNU programs.
|
||||
|
||||
scriptversion=2018-03-07.03; # UTC
|
||||
|
||||
# Copyright (C) 1996-2021 Free Software Foundation, Inc.
|
||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||
|
||||
# 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.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo 1>&2 "Try '$0 --help' for more information"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case $1 in
|
||||
|
||||
--is-lightweight)
|
||||
# Used by our autoconf macros to check whether the available missing
|
||||
# script is modern enough.
|
||||
exit 0
|
||||
;;
|
||||
|
||||
--run)
|
||||
# Back-compat with the calling convention used by older automake.
|
||||
shift
|
||||
;;
|
||||
|
||||
-h|--h|--he|--hel|--help)
|
||||
echo "\
|
||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||
|
||||
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
||||
to PROGRAM being missing or too old.
|
||||
|
||||
Options:
|
||||
-h, --help display this help and exit
|
||||
-v, --version output version information and exit
|
||||
|
||||
Supported PROGRAM values:
|
||||
aclocal autoconf autoheader autom4te automake makeinfo
|
||||
bison yacc flex lex help2man
|
||||
|
||||
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
||||
'g' are ignored when checking the name.
|
||||
|
||||
Send bug reports to <bug-automake@gnu.org>."
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||
echo "missing $scriptversion (GNU Automake)"
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-*)
|
||||
echo 1>&2 "$0: unknown '$1' option"
|
||||
echo 1>&2 "Try '$0 --help' for more information"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# Run the given program, remember its exit status.
|
||||
"$@"; st=$?
|
||||
|
||||
# If it succeeded, we are done.
|
||||
test $st -eq 0 && exit 0
|
||||
|
||||
# Also exit now if we it failed (or wasn't found), and '--version' was
|
||||
# passed; such an option is passed most likely to detect whether the
|
||||
# program is present and works.
|
||||
case $2 in --version|--help) exit $st;; esac
|
||||
|
||||
# Exit code 63 means version mismatch. This often happens when the user
|
||||
# tries to use an ancient version of a tool on a file that requires a
|
||||
# minimum version.
|
||||
if test $st -eq 63; then
|
||||
msg="probably too old"
|
||||
elif test $st -eq 127; then
|
||||
# Program was missing.
|
||||
msg="missing on your system"
|
||||
else
|
||||
# Program was found and executed, but failed. Give up.
|
||||
exit $st
|
||||
fi
|
||||
|
||||
perl_URL=https://www.perl.org/
|
||||
flex_URL=https://github.com/westes/flex
|
||||
gnu_software_URL=https://www.gnu.org/software
|
||||
|
||||
program_details ()
|
||||
{
|
||||
case $1 in
|
||||
aclocal|automake)
|
||||
echo "The '$1' program is part of the GNU Automake package:"
|
||||
echo "<$gnu_software_URL/automake>"
|
||||
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
||||
echo "<$gnu_software_URL/autoconf>"
|
||||
echo "<$gnu_software_URL/m4/>"
|
||||
echo "<$perl_URL>"
|
||||
;;
|
||||
autoconf|autom4te|autoheader)
|
||||
echo "The '$1' program is part of the GNU Autoconf package:"
|
||||
echo "<$gnu_software_URL/autoconf/>"
|
||||
echo "It also requires GNU m4 and Perl in order to run:"
|
||||
echo "<$gnu_software_URL/m4/>"
|
||||
echo "<$perl_URL>"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
give_advice ()
|
||||
{
|
||||
# Normalize program name to check for.
|
||||
normalized_program=`echo "$1" | sed '
|
||||
s/^gnu-//; t
|
||||
s/^gnu//; t
|
||||
s/^g//; t'`
|
||||
|
||||
printf '%s\n' "'$1' is $msg."
|
||||
|
||||
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
||||
case $normalized_program in
|
||||
autoconf*)
|
||||
echo "You should only need it if you modified 'configure.ac',"
|
||||
echo "or m4 files included by it."
|
||||
program_details 'autoconf'
|
||||
;;
|
||||
autoheader*)
|
||||
echo "You should only need it if you modified 'acconfig.h' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'autoheader'
|
||||
;;
|
||||
automake*)
|
||||
echo "You should only need it if you modified 'Makefile.am' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'automake'
|
||||
;;
|
||||
aclocal*)
|
||||
echo "You should only need it if you modified 'acinclude.m4' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'aclocal'
|
||||
;;
|
||||
autom4te*)
|
||||
echo "You might have modified some maintainer files that require"
|
||||
echo "the 'autom4te' program to be rebuilt."
|
||||
program_details 'autom4te'
|
||||
;;
|
||||
bison*|yacc*)
|
||||
echo "You should only need it if you modified a '.y' file."
|
||||
echo "You may want to install the GNU Bison package:"
|
||||
echo "<$gnu_software_URL/bison/>"
|
||||
;;
|
||||
lex*|flex*)
|
||||
echo "You should only need it if you modified a '.l' file."
|
||||
echo "You may want to install the Fast Lexical Analyzer package:"
|
||||
echo "<$flex_URL>"
|
||||
;;
|
||||
help2man*)
|
||||
echo "You should only need it if you modified a dependency" \
|
||||
"of a man page."
|
||||
echo "You may want to install the GNU Help2man package:"
|
||||
echo "<$gnu_software_URL/help2man/>"
|
||||
;;
|
||||
makeinfo*)
|
||||
echo "You should only need it if you modified a '.texi' file, or"
|
||||
echo "any other file indirectly affecting the aspect of the manual."
|
||||
echo "You might want to install the Texinfo package:"
|
||||
echo "<$gnu_software_URL/texinfo/>"
|
||||
echo "The spurious makeinfo call might also be the consequence of"
|
||||
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
||||
echo "want to install GNU make:"
|
||||
echo "<$gnu_software_URL/make/>"
|
||||
;;
|
||||
*)
|
||||
echo "You might have modified some files without having the proper"
|
||||
echo "tools for further handling them. Check the 'README' file, it"
|
||||
echo "often tells you about the needed prerequisites for installing"
|
||||
echo "this package. You may also peek at any GNU archive site, in"
|
||||
echo "case some other package contains this missing '$1' program."
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
||||
-e '2,$s/^/ /' >&2
|
||||
|
||||
# Propagate the correct exit status (expected to be 127 for a program
|
||||
# not found, 63 for a program that failed due to version mismatch).
|
||||
exit $st
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
BIN
player_plugins/amarok/butt_amarok.amarokscript.tar.bz2
Normal file
66
player_plugins/amarok/butt_amarok.rb
Executable file
|
|
@ -0,0 +1,66 @@
|
|||
#!/usr/bin/env ruby
|
||||
#
|
||||
# Now playing script for IRC.
|
||||
|
||||
# Use with the "/exec -o" command of your client. You can bind an alias like this:
|
||||
# /alias np exec -o /home/myself/amaroknowplaying.rb
|
||||
#
|
||||
# (c) 2005-2006 Mark Kretschmann <markey@web.de>
|
||||
# License: GNU General Public License V2
|
||||
#
|
||||
# modified by Daniel Nöthen for use in combination with butt
|
||||
|
||||
|
||||
loop do
|
||||
message = gets().chomp() #Read message from stdin
|
||||
command = /[A-Za-z]*/.match( message ).to_s()
|
||||
|
||||
case command
|
||||
when "configure"
|
||||
msg = '"This script does not have configuration options."'
|
||||
`dcop amarok playlist popupMessage "#{msg}"`
|
||||
|
||||
when "trackChange"
|
||||
|
||||
title = `dcop amarok player title 2> /dev/null`.chomp
|
||||
exit( 1 ) unless $?.success? # Abort if Amarok isn't running
|
||||
artist = `dcop amarok player artist`.chomp
|
||||
album = `dcop amarok player album`.chomp
|
||||
year = `dcop amarok player year`.chomp
|
||||
lastfm = `dcop amarok player lastfmStation`.chomp
|
||||
|
||||
output = ""
|
||||
|
||||
if title.empty?
|
||||
output += `dcop amarok player nowPlaying`.chomp
|
||||
else
|
||||
# Strip file extension
|
||||
extensions = ".ogg", ".mp3", ".wav", ".flac", ".fla", ".wma", ".mpc"
|
||||
ext = File.extname( title ).downcase
|
||||
|
||||
if extensions.include?( ext )
|
||||
title = title[0, title.length - ext.length]
|
||||
end
|
||||
|
||||
if artist.empty?
|
||||
output += "#{title}"
|
||||
else
|
||||
output += "#{artist} - #{title}"
|
||||
end
|
||||
|
||||
unless album.empty?
|
||||
output += " [#{album}"
|
||||
output += ", #{year}" unless year == "0"
|
||||
output += "]"
|
||||
end
|
||||
|
||||
unless lastfm.empty?
|
||||
output += " (Last.fm #{lastfm})"
|
||||
end
|
||||
end
|
||||
f = File.open(File.expand_path("~/.amarok_song"), File::WRONLY|File::TRUNC|File::CREAT)
|
||||
f.puts "#{output}"
|
||||
f.close
|
||||
|
||||
end
|
||||
end
|
||||
1
po/LINGUAS
Normal file
|
|
@ -0,0 +1 @@
|
|||
ar de es fr pt_BR nl
|
||||
475
po/Makefile.in.in
Normal file
|
|
@ -0,0 +1,475 @@
|
|||
# Makefile for PO directory in any package using GNU gettext.
|
||||
# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
|
||||
#
|
||||
# This file can be copied and used freely without restrictions. It can
|
||||
# be used in projects which are not available under the GNU General Public
|
||||
# License but which still want to provide support for the GNU gettext
|
||||
# functionality.
|
||||
# Please note that the actual code of GNU gettext is covered by the GNU
|
||||
# General Public License and is *not* in the public domain.
|
||||
#
|
||||
# Origin: gettext-0.19
|
||||
GETTEXT_MACRO_VERSION = 0.19
|
||||
|
||||
PACKAGE = @PACKAGE@
|
||||
VERSION = @VERSION@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
|
||||
SED = @SED@
|
||||
SHELL = /bin/sh
|
||||
@SET_MAKE@
|
||||
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
datarootdir = @datarootdir@
|
||||
datadir = @datadir@
|
||||
localedir = @localedir@
|
||||
gettextsrcdir = $(datadir)/gettext/po
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
||||
# We use $(mkdir_p).
|
||||
# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
|
||||
# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
|
||||
# @install_sh@ does not start with $(SHELL), so we add it.
|
||||
# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
|
||||
# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
|
||||
# versions, $(mkinstalldirs) and $(install_sh) are unused.
|
||||
mkinstalldirs = $(SHELL) @install_sh@ -d
|
||||
install_sh = $(SHELL) @install_sh@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
mkdir_p = @mkdir_p@
|
||||
|
||||
GMSGFMT_ = @GMSGFMT@
|
||||
GMSGFMT_no = @GMSGFMT@
|
||||
GMSGFMT_yes = @GMSGFMT_015@
|
||||
GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
|
||||
MSGFMT_ = @MSGFMT@
|
||||
MSGFMT_no = @MSGFMT@
|
||||
MSGFMT_yes = @MSGFMT_015@
|
||||
MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
|
||||
XGETTEXT_ = @XGETTEXT@
|
||||
XGETTEXT_no = @XGETTEXT@
|
||||
XGETTEXT_yes = @XGETTEXT_015@
|
||||
XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
|
||||
MSGMERGE = msgmerge
|
||||
MSGMERGE_UPDATE = @MSGMERGE@ --update
|
||||
MSGINIT = msginit
|
||||
MSGCONV = msgconv
|
||||
MSGFILTER = msgfilter
|
||||
|
||||
POFILES = @POFILES@
|
||||
GMOFILES = @GMOFILES@
|
||||
UPDATEPOFILES = @UPDATEPOFILES@
|
||||
DUMMYPOFILES = @DUMMYPOFILES@
|
||||
DISTFILES.common = Makefile.in.in remove-potcdate.sin \
|
||||
$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
|
||||
DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
|
||||
$(POFILES) $(GMOFILES) \
|
||||
$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
|
||||
|
||||
POTFILES = \
|
||||
|
||||
CATALOGS = @CATALOGS@
|
||||
|
||||
POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot
|
||||
POFILESDEPS_yes = $(POFILESDEPS_)
|
||||
POFILESDEPS_no =
|
||||
POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT))
|
||||
|
||||
DISTFILESDEPS_ = update-po
|
||||
DISTFILESDEPS_yes = $(DISTFILESDEPS_)
|
||||
DISTFILESDEPS_no =
|
||||
DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO))
|
||||
|
||||
# Makevars gets inserted here. (Don't remove this line!)
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
|
||||
|
||||
.po.mo:
|
||||
@echo "$(MSGFMT) -c -o $@ $<"; \
|
||||
$(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
|
||||
|
||||
.po.gmo:
|
||||
@lang=`echo $* | sed -e 's,.*/,,'`; \
|
||||
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
|
||||
echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \
|
||||
cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
|
||||
|
||||
.sin.sed:
|
||||
sed -e '/^#/d' $< > t-$@
|
||||
mv t-$@ $@
|
||||
|
||||
|
||||
all: all-@USE_NLS@
|
||||
|
||||
all-yes: stamp-po
|
||||
all-no:
|
||||
|
||||
# Ensure that the gettext macros and this Makefile.in.in are in sync.
|
||||
CHECK_MACRO_VERSION = \
|
||||
test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
|
||||
|| { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
|
||||
exit 1; \
|
||||
}
|
||||
|
||||
# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
|
||||
# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
|
||||
# we don't want to bother translators with empty POT files). We assume that
|
||||
# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
|
||||
# In this case, stamp-po is a nop (i.e. a phony target).
|
||||
|
||||
# stamp-po is a timestamp denoting the last time at which the CATALOGS have
|
||||
# been loosely updated. Its purpose is that when a developer or translator
|
||||
# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
|
||||
# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
|
||||
# invocations of "make" will do nothing. This timestamp would not be necessary
|
||||
# if updating the $(CATALOGS) would always touch them; however, the rule for
|
||||
# $(POFILES) has been designed to not touch files that don't need to be
|
||||
# changed.
|
||||
stamp-po: $(srcdir)/$(DOMAIN).pot
|
||||
@$(CHECK_MACRO_VERSION)
|
||||
test ! -f $(srcdir)/$(DOMAIN).pot || \
|
||||
test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
|
||||
@test ! -f $(srcdir)/$(DOMAIN).pot || { \
|
||||
echo "touch stamp-po" && \
|
||||
echo timestamp > stamp-poT && \
|
||||
mv stamp-poT stamp-po; \
|
||||
}
|
||||
|
||||
# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
|
||||
# otherwise packages like GCC can not be built if only parts of the source
|
||||
# have been downloaded.
|
||||
|
||||
# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
|
||||
# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
|
||||
# The determination of whether the package xyz is a GNU one is based on the
|
||||
# heuristic whether some file in the top level directory mentions "GNU xyz".
|
||||
# If GNU 'find' is available, we avoid grepping through monster files.
|
||||
$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
|
||||
package_gnu="$(PACKAGE_GNU)"; \
|
||||
test -n "$$package_gnu" || { \
|
||||
if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \
|
||||
LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f \
|
||||
-size -10000000c -exec grep 'GNU @PACKAGE@' \
|
||||
/dev/null '{}' ';' 2>/dev/null; \
|
||||
else \
|
||||
LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \
|
||||
fi; \
|
||||
} | grep -v 'libtool:' >/dev/null; then \
|
||||
package_gnu=yes; \
|
||||
else \
|
||||
package_gnu=no; \
|
||||
fi; \
|
||||
}; \
|
||||
if test "$$package_gnu" = "yes"; then \
|
||||
package_prefix='GNU '; \
|
||||
else \
|
||||
package_prefix=''; \
|
||||
fi; \
|
||||
if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
|
||||
msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
|
||||
else \
|
||||
msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
|
||||
fi; \
|
||||
case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
|
||||
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
|
||||
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
|
||||
--add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
|
||||
--files-from=$(srcdir)/POTFILES.in \
|
||||
--copyright-holder='$(COPYRIGHT_HOLDER)' \
|
||||
--msgid-bugs-address="$$msgid_bugs_address" \
|
||||
;; \
|
||||
*) \
|
||||
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
|
||||
--add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
|
||||
--files-from=$(srcdir)/POTFILES.in \
|
||||
--copyright-holder='$(COPYRIGHT_HOLDER)' \
|
||||
--package-name="$${package_prefix}@PACKAGE@" \
|
||||
--package-version='@VERSION@' \
|
||||
--msgid-bugs-address="$$msgid_bugs_address" \
|
||||
;; \
|
||||
esac
|
||||
test ! -f $(DOMAIN).po || { \
|
||||
if test -f $(srcdir)/$(DOMAIN).pot; then \
|
||||
sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
|
||||
sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
|
||||
if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
|
||||
rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
|
||||
else \
|
||||
rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
|
||||
mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
|
||||
fi; \
|
||||
else \
|
||||
mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
|
||||
fi; \
|
||||
}
|
||||
|
||||
# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
|
||||
# every "make" invocation, only create it when it is missing.
|
||||
# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
|
||||
$(srcdir)/$(DOMAIN).pot:
|
||||
$(MAKE) $(DOMAIN).pot-update
|
||||
|
||||
# This target rebuilds a PO file if $(DOMAIN).pot has changed.
|
||||
# Note that a PO file is not touched if it doesn't need to be changed.
|
||||
$(POFILES): $(POFILESDEPS)
|
||||
@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
|
||||
if test -f "$(srcdir)/$${lang}.po"; then \
|
||||
test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot; \
|
||||
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
|
||||
echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \
|
||||
cd $(srcdir) \
|
||||
&& { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
|
||||
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
|
||||
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
|
||||
*) \
|
||||
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \
|
||||
esac; \
|
||||
}; \
|
||||
else \
|
||||
$(MAKE) $${lang}.po-create; \
|
||||
fi
|
||||
|
||||
|
||||
install: install-exec install-data
|
||||
install-exec:
|
||||
install-data: install-data-@USE_NLS@
|
||||
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||
$(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
|
||||
for file in $(DISTFILES.common) Makevars.template; do \
|
||||
$(INSTALL_DATA) $(srcdir)/$$file \
|
||||
$(DESTDIR)$(gettextsrcdir)/$$file; \
|
||||
done; \
|
||||
for file in Makevars; do \
|
||||
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
|
||||
done; \
|
||||
else \
|
||||
: ; \
|
||||
fi
|
||||
install-data-no: all
|
||||
install-data-yes: all
|
||||
@catalogs='$(CATALOGS)'; \
|
||||
for cat in $$catalogs; do \
|
||||
cat=`basename $$cat`; \
|
||||
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
|
||||
dir=$(localedir)/$$lang/LC_MESSAGES; \
|
||||
$(mkdir_p) $(DESTDIR)$$dir; \
|
||||
if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
|
||||
$(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
|
||||
echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
|
||||
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
|
||||
if test -n "$$lc"; then \
|
||||
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
|
||||
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
|
||||
mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
|
||||
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
|
||||
(cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
|
||||
for file in *; do \
|
||||
if test -f $$file; then \
|
||||
ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
|
||||
fi; \
|
||||
done); \
|
||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
|
||||
else \
|
||||
if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
|
||||
:; \
|
||||
else \
|
||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
|
||||
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
|
||||
fi; \
|
||||
fi; \
|
||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
|
||||
ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
|
||||
ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
|
||||
cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
|
||||
echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
|
||||
fi; \
|
||||
done; \
|
||||
done
|
||||
|
||||
install-strip: install
|
||||
|
||||
installdirs: installdirs-exec installdirs-data
|
||||
installdirs-exec:
|
||||
installdirs-data: installdirs-data-@USE_NLS@
|
||||
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||
$(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
|
||||
else \
|
||||
: ; \
|
||||
fi
|
||||
installdirs-data-no:
|
||||
installdirs-data-yes:
|
||||
@catalogs='$(CATALOGS)'; \
|
||||
for cat in $$catalogs; do \
|
||||
cat=`basename $$cat`; \
|
||||
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
|
||||
dir=$(localedir)/$$lang/LC_MESSAGES; \
|
||||
$(mkdir_p) $(DESTDIR)$$dir; \
|
||||
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
|
||||
if test -n "$$lc"; then \
|
||||
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
|
||||
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
|
||||
mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
|
||||
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
|
||||
(cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
|
||||
for file in *; do \
|
||||
if test -f $$file; then \
|
||||
ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
|
||||
fi; \
|
||||
done); \
|
||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
|
||||
else \
|
||||
if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
|
||||
:; \
|
||||
else \
|
||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
|
||||
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
|
||||
fi; \
|
||||
fi; \
|
||||
fi; \
|
||||
done; \
|
||||
done
|
||||
|
||||
# Define this as empty until I found a useful application.
|
||||
installcheck:
|
||||
|
||||
uninstall: uninstall-exec uninstall-data
|
||||
uninstall-exec:
|
||||
uninstall-data: uninstall-data-@USE_NLS@
|
||||
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||
for file in $(DISTFILES.common) Makevars.template; do \
|
||||
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
|
||||
done; \
|
||||
else \
|
||||
: ; \
|
||||
fi
|
||||
uninstall-data-no:
|
||||
uninstall-data-yes:
|
||||
catalogs='$(CATALOGS)'; \
|
||||
for cat in $$catalogs; do \
|
||||
cat=`basename $$cat`; \
|
||||
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
|
||||
for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
|
||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
|
||||
done; \
|
||||
done
|
||||
|
||||
check: all
|
||||
|
||||
info dvi ps pdf html tags TAGS ctags CTAGS ID:
|
||||
|
||||
mostlyclean:
|
||||
rm -f remove-potcdate.sed
|
||||
rm -f stamp-poT
|
||||
rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
|
||||
rm -fr *.o
|
||||
|
||||
clean: mostlyclean
|
||||
|
||||
distclean: clean
|
||||
rm -f Makefile Makefile.in POTFILES *.mo
|
||||
|
||||
maintainer-clean: distclean
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
rm -f stamp-po $(GMOFILES)
|
||||
|
||||
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||
dist distdir:
|
||||
test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
|
||||
@$(MAKE) dist2
|
||||
# This is a separate target because 'update-po' must be executed before.
|
||||
dist2: stamp-po $(DISTFILES)
|
||||
dists="$(DISTFILES)"; \
|
||||
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||
dists="$$dists Makevars.template"; \
|
||||
fi; \
|
||||
if test -f $(srcdir)/$(DOMAIN).pot; then \
|
||||
dists="$$dists $(DOMAIN).pot stamp-po"; \
|
||||
fi; \
|
||||
if test -f $(srcdir)/ChangeLog; then \
|
||||
dists="$$dists ChangeLog"; \
|
||||
fi; \
|
||||
for i in 0 1 2 3 4 5 6 7 8 9; do \
|
||||
if test -f $(srcdir)/ChangeLog.$$i; then \
|
||||
dists="$$dists ChangeLog.$$i"; \
|
||||
fi; \
|
||||
done; \
|
||||
if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
|
||||
for file in $$dists; do \
|
||||
if test -f $$file; then \
|
||||
cp -p $$file $(distdir) || exit 1; \
|
||||
else \
|
||||
cp -p $(srcdir)/$$file $(distdir) || exit 1; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
update-po: Makefile
|
||||
$(MAKE) $(DOMAIN).pot-update
|
||||
test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
|
||||
$(MAKE) update-gmo
|
||||
|
||||
# General rule for creating PO files.
|
||||
|
||||
.nop.po-create:
|
||||
@lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
|
||||
echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
|
||||
exit 1
|
||||
|
||||
# General rule for updating PO files.
|
||||
|
||||
.nop.po-update:
|
||||
@lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
|
||||
if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
|
||||
tmpdir=`pwd`; \
|
||||
echo "$$lang:"; \
|
||||
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
|
||||
echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
|
||||
cd $(srcdir); \
|
||||
if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
|
||||
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
|
||||
$(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
|
||||
*) \
|
||||
$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
|
||||
esac; \
|
||||
}; then \
|
||||
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
|
||||
rm -f $$tmpdir/$$lang.new.po; \
|
||||
else \
|
||||
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
|
||||
:; \
|
||||
else \
|
||||
echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
fi; \
|
||||
else \
|
||||
echo "msgmerge for $$lang.po failed!" 1>&2; \
|
||||
rm -f $$tmpdir/$$lang.new.po; \
|
||||
fi
|
||||
|
||||
$(DUMMYPOFILES):
|
||||
|
||||
update-gmo: Makefile $(GMOFILES)
|
||||
@:
|
||||
|
||||
# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
|
||||
# because execution permission bits may not work on the current file system.
|
||||
# Use @SHELL@, which is the shell determined by autoconf for the use by its
|
||||
# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
|
||||
Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
|
||||
cd $(top_builddir) \
|
||||
&& @SHELL@ ./config.status $(subdir)/$@.in po-directories
|
||||
|
||||
force:
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make not to export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
78
po/Makevars
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
# Makefile variables for PO directory in any package using GNU gettext.
|
||||
|
||||
# Usually the message domain is the same as the package name.
|
||||
DOMAIN = $(PACKAGE)
|
||||
|
||||
# These two variables depend on the location of this directory.
|
||||
subdir = po
|
||||
top_builddir = ..
|
||||
|
||||
# These options get passed to xgettext.
|
||||
XGETTEXT_OPTIONS = --keyword=_ --from-code=UTF-8
|
||||
|
||||
# This is the copyright holder that gets inserted into the header of the
|
||||
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
|
||||
# package. (Note that the msgstr strings, extracted from the package's
|
||||
# sources, belong to the copyright holder of the package.) Translators are
|
||||
# expected to transfer the copyright for their translations to this person
|
||||
# or entity, or to disclaim their copyright. The empty string stands for
|
||||
# the public domain; in this case the translators are expected to disclaim
|
||||
# their copyright.
|
||||
COPYRIGHT_HOLDER = Daniel Nöthen
|
||||
|
||||
# This tells whether or not to prepend "GNU " prefix to the package
|
||||
# name that gets inserted into the header of the $(DOMAIN).pot file.
|
||||
# Possible values are "yes", "no", or empty. If it is empty, try to
|
||||
# detect it automatically by scanning the files in $(top_srcdir) for
|
||||
# "GNU packagename" string.
|
||||
PACKAGE_GNU = no
|
||||
|
||||
# This is the email address or URL to which the translators shall report
|
||||
# bugs in the untranslated strings:
|
||||
# - Strings which are not entire sentences, see the maintainer guidelines
|
||||
# in the GNU gettext documentation, section 'Preparing Strings'.
|
||||
# - Strings which use unclear terms or require additional context to be
|
||||
# understood.
|
||||
# - Strings which make invalid assumptions about notation of date, time or
|
||||
# money.
|
||||
# - Pluralisation problems.
|
||||
# - Incorrect English spelling.
|
||||
# - Incorrect formatting.
|
||||
# It can be your email address, or a mailing list address where translators
|
||||
# can write to without being subscribed, or the URL of a web page through
|
||||
# which the translators can contact you.
|
||||
MSGID_BUGS_ADDRESS = butt@danielnoethen.de
|
||||
|
||||
# This is the list of locale categories, beyond LC_MESSAGES, for which the
|
||||
# message catalogs shall be used. It is usually empty.
|
||||
EXTRA_LOCALE_CATEGORIES =
|
||||
|
||||
# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
|
||||
# context. Possible values are "yes" and "no". Set this to yes if the
|
||||
# package uses functions taking also a message context, like pgettext(), or
|
||||
# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
|
||||
USE_MSGCTXT = no
|
||||
|
||||
# These options get passed to msgmerge.
|
||||
# Useful options are in particular:
|
||||
# --previous to keep previous msgids of translated messages,
|
||||
# --quiet to reduce the verbosity.
|
||||
MSGMERGE_OPTIONS =
|
||||
|
||||
# These options get passed to msginit.
|
||||
# If you want to disable line wrapping when writing PO files, add
|
||||
# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
|
||||
# MSGINIT_OPTIONS.
|
||||
MSGINIT_OPTIONS =
|
||||
|
||||
# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
|
||||
# has changed. Possible values are "yes" and "no". Set this to no if
|
||||
# the POT file is checked in the repository and the version control
|
||||
# program ignores timestamps.
|
||||
PO_DEPENDS_ON_POT = yes
|
||||
|
||||
# This tells whether or not to forcibly update $(DOMAIN).pot and
|
||||
# regenerate PO files on "make dist". Possible values are "yes" and
|
||||
# "no". Set this to no if the POT file and PO files are maintained
|
||||
# externally.
|
||||
DIST_DEPENDS_ON_UPDATE_PO = yes
|
||||
15
po/POTFILES.in
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
# List of source files which contain translatable strings.
|
||||
src/AskForMicPermission.m
|
||||
src/butt.cpp
|
||||
src/cfg.cpp
|
||||
src/FLTK/flgui.cpp
|
||||
src/FLTK/fl_timer_funcs.cpp
|
||||
src/FLTK/fl_callbacks.cpp
|
||||
src/FLTK/flgui.cpp
|
||||
src/FLTK/fl_funcs.cpp
|
||||
src/icecast.cpp
|
||||
src/lame_encode.cpp
|
||||
src/port_audio.cpp
|
||||
src/port_midi.cpp
|
||||
src/shoutcast.cpp
|
||||
src/tls.cpp
|
||||
58
po/Rules-quot
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
# This file, Rules-quot, can be copied and used freely without restrictions.
|
||||
# Special Makefile rules for English message catalogs with quotation marks.
|
||||
|
||||
DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
|
||||
|
||||
.SUFFIXES: .insert-header .po-update-en
|
||||
|
||||
en@quot.po-create:
|
||||
$(MAKE) en@quot.po-update
|
||||
en@boldquot.po-create:
|
||||
$(MAKE) en@boldquot.po-update
|
||||
|
||||
en@quot.po-update: en@quot.po-update-en
|
||||
en@boldquot.po-update: en@boldquot.po-update-en
|
||||
|
||||
.insert-header.po-update-en:
|
||||
@lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
|
||||
if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
|
||||
tmpdir=`pwd`; \
|
||||
echo "$$lang:"; \
|
||||
ll=`echo $$lang | sed -e 's/@.*//'`; \
|
||||
LC_ALL=C; export LC_ALL; \
|
||||
cd $(srcdir); \
|
||||
if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \
|
||||
| $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \
|
||||
{ case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
|
||||
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \
|
||||
$(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \
|
||||
;; \
|
||||
*) \
|
||||
$(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \
|
||||
;; \
|
||||
esac } 2>/dev/null > $$tmpdir/$$lang.new.po \
|
||||
; then \
|
||||
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
|
||||
rm -f $$tmpdir/$$lang.new.po; \
|
||||
else \
|
||||
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
|
||||
:; \
|
||||
else \
|
||||
echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
fi; \
|
||||
else \
|
||||
echo "creation of $$lang.po failed!" 1>&2; \
|
||||
rm -f $$tmpdir/$$lang.new.po; \
|
||||
fi
|
||||
|
||||
en@quot.insert-header: insert-header.sin
|
||||
sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
|
||||
|
||||
en@boldquot.insert-header: insert-header.sin
|
||||
sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
|
||||
|
||||
mostlyclean: mostlyclean-quot
|
||||
mostlyclean-quot:
|
||||
rm -f *.insert-header
|
||||
BIN
po/ar.gmo
Normal file
10
po/boldquot.sed
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
s/"\([^"]*\)"/“\1”/g
|
||||
s/`\([^`']*\)'/‘\1’/g
|
||||
s/ '\([^`']*\)' / ‘\1’ /g
|
||||
s/ '\([^`']*\)'$/ ‘\1’/g
|
||||
s/^'\([^`']*\)' /‘\1’ /g
|
||||
s/“”/""/g
|
||||
s/“/“[1m/g
|
||||
s/”/[0m”/g
|
||||
s/‘/‘[1m/g
|
||||
s/’/[0m’/g
|
||||
2867
po/butt.pot
Normal file
BIN
po/de.gmo
Normal file
25
po/en@boldquot.header
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# All this catalog "translates" are quotation characters.
|
||||
# The msgids must be ASCII and therefore cannot contain real quotation
|
||||
# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
|
||||
# and double quote (0x22). These substitutes look strange; see
|
||||
# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
|
||||
#
|
||||
# This catalog translates grave accent (0x60) and apostrophe (0x27) to
|
||||
# left single quotation mark (U+2018) and right single quotation mark (U+2019).
|
||||
# It also translates pairs of apostrophe (0x27) to
|
||||
# left single quotation mark (U+2018) and right single quotation mark (U+2019)
|
||||
# and pairs of quotation mark (0x22) to
|
||||
# left double quotation mark (U+201C) and right double quotation mark (U+201D).
|
||||
#
|
||||
# When output to an UTF-8 terminal, the quotation characters appear perfectly.
|
||||
# When output to an ISO-8859-1 terminal, the single quotation marks are
|
||||
# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
|
||||
# grave/acute accent (by libiconv), and the double quotation marks are
|
||||
# transliterated to 0x22.
|
||||
# When output to an ASCII terminal, the single quotation marks are
|
||||
# transliterated to apostrophes, and the double quotation marks are
|
||||
# transliterated to 0x22.
|
||||
#
|
||||
# This catalog furthermore displays the text between the quotation marks in
|
||||
# bold face, assuming the VT100/XTerm escape sequences.
|
||||
#
|
||||
22
po/en@quot.header
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# All this catalog "translates" are quotation characters.
|
||||
# The msgids must be ASCII and therefore cannot contain real quotation
|
||||
# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
|
||||
# and double quote (0x22). These substitutes look strange; see
|
||||
# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
|
||||
#
|
||||
# This catalog translates grave accent (0x60) and apostrophe (0x27) to
|
||||
# left single quotation mark (U+2018) and right single quotation mark (U+2019).
|
||||
# It also translates pairs of apostrophe (0x27) to
|
||||
# left single quotation mark (U+2018) and right single quotation mark (U+2019)
|
||||
# and pairs of quotation mark (0x22) to
|
||||
# left double quotation mark (U+201C) and right double quotation mark (U+201D).
|
||||
#
|
||||
# When output to an UTF-8 terminal, the quotation characters appear perfectly.
|
||||
# When output to an ISO-8859-1 terminal, the single quotation marks are
|
||||
# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
|
||||
# grave/acute accent (by libiconv), and the double quotation marks are
|
||||
# transliterated to 0x22.
|
||||
# When output to an ASCII terminal, the single quotation marks are
|
||||
# transliterated to apostrophes, and the double quotation marks are
|
||||
# transliterated to 0x22.
|
||||
#
|
||||
BIN
po/es.gmo
Normal file
BIN
po/fr.gmo
Normal file
23
po/insert-header.sin
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# Sed script that inserts the file called HEADER before the header entry.
|
||||
#
|
||||
# At each occurrence of a line starting with "msgid ", we execute the following
|
||||
# commands. At the first occurrence, insert the file. At the following
|
||||
# occurrences, do nothing. The distinction between the first and the following
|
||||
# occurrences is achieved by looking at the hold space.
|
||||
/^msgid /{
|
||||
x
|
||||
# Test if the hold space is empty.
|
||||
s/m/m/
|
||||
ta
|
||||
# Yes it was empty. First occurrence. Read the file.
|
||||
r HEADER
|
||||
# Output the file's contents by reading the next line. But don't lose the
|
||||
# current line while doing this.
|
||||
g
|
||||
N
|
||||
bb
|
||||
:a
|
||||
# The hold space was nonempty. Following occurrences. Do nothing.
|
||||
x
|
||||
:b
|
||||
}
|
||||
BIN
po/nl.gmo
Normal file
BIN
po/pt_BR.gmo
Normal file
3232
po/pt_BR.po
Normal file
6
po/quot.sed
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
s/"\([^"]*\)"/“\1”/g
|
||||
s/`\([^`']*\)'/‘\1’/g
|
||||
s/ '\([^`']*\)' / ‘\1’ /g
|
||||
s/ '\([^`']*\)'$/ ‘\1’/g
|
||||
s/^'\([^`']*\)' /‘\1’ /g
|
||||
s/“”/""/g
|
||||
19
po/remove-potcdate.sin
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# Sed script that remove the POT-Creation-Date line in the header entry
|
||||
# from a POT file.
|
||||
#
|
||||
# The distinction between the first and the following occurrences of the
|
||||
# pattern is achieved by looking at the hold space.
|
||||
/^"POT-Creation-Date: .*"$/{
|
||||
x
|
||||
# Test if the hold space is empty.
|
||||
s/P/P/
|
||||
ta
|
||||
# Yes it was empty. First occurrence. Remove the line.
|
||||
g
|
||||
d
|
||||
bb
|
||||
:a
|
||||
# The hold space was nonempty. Following occurrences. Do nothing.
|
||||
x
|
||||
:b
|
||||
}
|
||||
1
po/stamp-po
Normal file
|
|
@ -0,0 +1 @@
|
|||
timestamp
|
||||
14
src/AskForMicPermission.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
//
|
||||
// AskForMicPermission.h
|
||||
// butt
|
||||
//
|
||||
// Created by Daniel Nöthen on 26.09.20.
|
||||
// Copyright © 2020 Daniel Nöthen. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef AskForMicPermission_h
|
||||
#define AskForMicPermission_h
|
||||
|
||||
void askForMicPermission();
|
||||
|
||||
#endif /* AskForMicPermission_h */
|
||||
64
src/AskForMicPermission.m
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
//
|
||||
// AskForMicPermission.m
|
||||
// butt
|
||||
//
|
||||
// Created by Daniel Nöthen on 26.09.20.
|
||||
// Copyright © 2020 Daniel Nöthen. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
#import <AppKit/AppKit.h>
|
||||
#import <dispatch/dispatch.h>
|
||||
#import "gettext.h"
|
||||
|
||||
|
||||
void showAlert() {
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setMessageText:@(_("Microphone access"))];
|
||||
[alert setInformativeText:@(_("butt needs access to your microphone.\n\nPlease go to\nSystem Preferences->Privacy & Security->Microphone\nand activate the check mark next to the butt entry."))];
|
||||
[alert addButtonWithTitle:@"Ok"];
|
||||
[alert runModal];
|
||||
[alert release];
|
||||
});
|
||||
}
|
||||
|
||||
void askForMicPermission()
|
||||
{
|
||||
if (@available(macOS 10.14, *)) {
|
||||
// Request permission to access the camera and microphone.
|
||||
switch ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio])
|
||||
{
|
||||
case AVAuthorizationStatusAuthorized:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case AVAuthorizationStatusNotDetermined:
|
||||
{
|
||||
// The app hasn't yet asked the user for microphone access.
|
||||
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
|
||||
if (granted) {
|
||||
} else {
|
||||
showAlert();
|
||||
}
|
||||
}];
|
||||
|
||||
break;
|
||||
}
|
||||
case AVAuthorizationStatusDenied:
|
||||
{
|
||||
// The user has previously denied access.
|
||||
showAlert();
|
||||
return;
|
||||
}
|
||||
case AVAuthorizationStatusRestricted:
|
||||
{
|
||||
showAlert();
|
||||
// The user can't grant access due to restrictions.
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
179
src/Biquad.cpp
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
//
|
||||
// Biquad.cpp
|
||||
//
|
||||
// Created by Nigel Redmon on 11/24/12
|
||||
// EarLevel Engineering: earlevel.com
|
||||
// Copyright 2012 Nigel Redmon
|
||||
//
|
||||
// For a complete explanation of the Biquad code:
|
||||
// http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/
|
||||
//
|
||||
// License:
|
||||
//
|
||||
// This source code is provided as is, without warranty.
|
||||
// You may copy and distribute verbatim copies of this document.
|
||||
// You may modify and use this source code to create binary code
|
||||
// for your own purposes, free or commercial.
|
||||
//
|
||||
|
||||
// Modifications by melchor629 on 20/08/2016
|
||||
|
||||
#include <math.h>
|
||||
#include "Biquad.h"
|
||||
|
||||
Biquad::Biquad()
|
||||
{
|
||||
type = bq_type_lowpass;
|
||||
a0 = 1.0;
|
||||
a1 = a2 = b1 = b2 = 0.0;
|
||||
Fc = 0.50;
|
||||
Q = 0.707;
|
||||
peakGain = 0.0;
|
||||
z1 = z2 = 0.0;
|
||||
}
|
||||
|
||||
Biquad::Biquad(int type, double Fc, double Q, double peakGainDB)
|
||||
{
|
||||
setBiquad(type, Fc, Q, peakGainDB);
|
||||
z1 = z2 = 0.0;
|
||||
}
|
||||
|
||||
Biquad::~Biquad() {}
|
||||
|
||||
void Biquad::setType(int type)
|
||||
{
|
||||
if (this->type != type) {
|
||||
this->type = type;
|
||||
calcBiquad();
|
||||
}
|
||||
}
|
||||
|
||||
void Biquad::setQ(double Q)
|
||||
{
|
||||
if (this->Q != Q) {
|
||||
this->Q = Q;
|
||||
calcBiquad();
|
||||
}
|
||||
}
|
||||
|
||||
void Biquad::setFc(double Fc)
|
||||
{
|
||||
if (this->Fc != Fc) {
|
||||
this->Fc = Fc;
|
||||
calcBiquad();
|
||||
}
|
||||
}
|
||||
|
||||
void Biquad::setPeakGain(double peakGainDB)
|
||||
{
|
||||
if (this->peakGain != peakGainDB) {
|
||||
this->peakGain = peakGainDB;
|
||||
calcBiquad();
|
||||
}
|
||||
}
|
||||
|
||||
void Biquad::setBiquad(int type, double Fc, double Q, double peakGainDB)
|
||||
{
|
||||
this->type = type;
|
||||
this->Q = Q;
|
||||
this->Fc = Fc;
|
||||
this->peakGain = peakGainDB;
|
||||
calcBiquad();
|
||||
}
|
||||
|
||||
void Biquad::calcBiquad(void)
|
||||
{
|
||||
double norm;
|
||||
double V = pow(10, fabs(peakGain) / 20.0);
|
||||
double K = tan(M_PI * Fc);
|
||||
switch (this->type) {
|
||||
case bq_type_lowpass:
|
||||
norm = 1 / (1 + K / Q + K * K);
|
||||
a0 = K * K * norm;
|
||||
a1 = 2 * a0;
|
||||
a2 = a0;
|
||||
b1 = 2 * (K * K - 1) * norm;
|
||||
b2 = (1 - K / Q + K * K) * norm;
|
||||
break;
|
||||
case bq_type_highpass:
|
||||
norm = 1 / (1 + K / Q + K * K);
|
||||
a0 = 1 * norm;
|
||||
a1 = -2 * a0;
|
||||
a2 = a0;
|
||||
b1 = 2 * (K * K - 1) * norm;
|
||||
b2 = (1 - K / Q + K * K) * norm;
|
||||
break;
|
||||
case bq_type_bandpass:
|
||||
norm = 1 / (1 + K / Q + K * K);
|
||||
a0 = K / Q * norm;
|
||||
a1 = 0;
|
||||
a2 = -a0;
|
||||
b1 = 2 * (K * K - 1) * norm;
|
||||
b2 = (1 - K / Q + K * K) * norm;
|
||||
break;
|
||||
case bq_type_notch:
|
||||
norm = 1 / (1 + K / Q + K * K);
|
||||
a0 = (1 + K * K) * norm;
|
||||
a1 = 2 * (K * K - 1) * norm;
|
||||
a2 = a0;
|
||||
b1 = a1;
|
||||
b2 = (1 - K / Q + K * K) * norm;
|
||||
break;
|
||||
case bq_type_peak:
|
||||
if (peakGain >= 0) { // boost
|
||||
norm = 1 / (1 + 1 / Q * K + K * K);
|
||||
a0 = (1 + V / Q * K + K * K) * norm;
|
||||
a1 = 2 * (K * K - 1) * norm;
|
||||
a2 = (1 - V / Q * K + K * K) * norm;
|
||||
b1 = a1;
|
||||
b2 = (1 - 1 / Q * K + K * K) * norm;
|
||||
}
|
||||
else { // cut
|
||||
norm = 1 / (1 + V / Q * K + K * K);
|
||||
a0 = (1 + 1 / Q * K + K * K) * norm;
|
||||
a1 = 2 * (K * K - 1) * norm;
|
||||
a2 = (1 - 1 / Q * K + K * K) * norm;
|
||||
b1 = a1;
|
||||
b2 = (1 - V / Q * K + K * K) * norm;
|
||||
}
|
||||
break;
|
||||
case bq_type_lowshelf:
|
||||
if (peakGain >= 0) { // boost
|
||||
norm = 1 / (1 + sqrt(2) * K + K * K);
|
||||
a0 = (1 + sqrt(2 * V) * K + V * K * K) * norm;
|
||||
a1 = 2 * (V * K * K - 1) * norm;
|
||||
a2 = (1 - sqrt(2 * V) * K + V * K * K) * norm;
|
||||
b1 = 2 * (K * K - 1) * norm;
|
||||
b2 = (1 - sqrt(2) * K + K * K) * norm;
|
||||
}
|
||||
else { // cut
|
||||
norm = 1 / (1 + sqrt(2 * V) * K + V * K * K);
|
||||
a0 = (1 + sqrt(2) * K + K * K) * norm;
|
||||
a1 = 2 * (K * K - 1) * norm;
|
||||
a2 = (1 - sqrt(2) * K + K * K) * norm;
|
||||
b1 = 2 * (V * K * K - 1) * norm;
|
||||
b2 = (1 - sqrt(2 * V) * K + V * K * K) * norm;
|
||||
}
|
||||
break;
|
||||
case bq_type_highshelf:
|
||||
if (peakGain >= 0) { // boost
|
||||
norm = 1 / (1 + sqrt(2) * K + K * K);
|
||||
a0 = (V + sqrt(2 * V) * K + K * K) * norm;
|
||||
a1 = 2 * (K * K - V) * norm;
|
||||
a2 = (V - sqrt(2 * V) * K + K * K) * norm;
|
||||
b1 = 2 * (K * K - 1) * norm;
|
||||
b2 = (1 - sqrt(2) * K + K * K) * norm;
|
||||
}
|
||||
else { // cut
|
||||
norm = 1 / (V + sqrt(2 * V) * K + K * K);
|
||||
a0 = (1 + sqrt(2) * K + K * K) * norm;
|
||||
a1 = 2 * (K * K - 1) * norm;
|
||||
a2 = (1 - sqrt(2) * K + K * K) * norm;
|
||||
b1 = 2 * (K * K - V) * norm;
|
||||
b2 = (V - sqrt(2 * V) * K + K * K) * norm;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
63
src/Biquad.h
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
//
|
||||
// Biquad.h
|
||||
//
|
||||
// Created by Nigel Redmon on 11/24/12
|
||||
// EarLevel Engineering: earlevel.com
|
||||
// Copyright 2012 Nigel Redmon
|
||||
//
|
||||
// For a complete explanation of the Biquad code:
|
||||
// http://www.earlevel.com/main/2012/11/25/biquad-c-source-code/
|
||||
//
|
||||
// License:
|
||||
//
|
||||
// This source code is provided as is, without warranty.
|
||||
// You may copy and distribute verbatim copies of this document.
|
||||
// You may modify and use this source code to create binary code
|
||||
// for your own purposes, free or commercial.
|
||||
//
|
||||
|
||||
// Modifications by melchor629 on 20/08/2016
|
||||
|
||||
#ifndef Biquad_h
|
||||
#define Biquad_h
|
||||
|
||||
enum {
|
||||
bq_type_lowpass = 0,
|
||||
bq_type_highpass,
|
||||
bq_type_bandpass,
|
||||
bq_type_notch,
|
||||
bq_type_peak,
|
||||
bq_type_lowshelf,
|
||||
bq_type_highshelf,
|
||||
};
|
||||
|
||||
class Biquad {
|
||||
public:
|
||||
Biquad();
|
||||
Biquad(int type, double Fc, double Q, double peakGainDB);
|
||||
~Biquad();
|
||||
void setType(int type);
|
||||
void setQ(double Q);
|
||||
void setFc(double Fc);
|
||||
void setPeakGain(double peakGainDB);
|
||||
void setBiquad(int type, double Fc, double Q, double peakGain);
|
||||
float process(float in);
|
||||
|
||||
protected:
|
||||
void calcBiquad(void);
|
||||
|
||||
int type;
|
||||
double a0, a1, a2, b1, b2;
|
||||
double Fc, Q, peakGain;
|
||||
double z1, z2;
|
||||
};
|
||||
|
||||
inline float Biquad::process(float in)
|
||||
{
|
||||
double out = in * a0 + z1;
|
||||
z1 = in * a1 + z2 - b1 * out;
|
||||
z2 = in * a2 - b2 * out;
|
||||
return out;
|
||||
}
|
||||
|
||||
#endif // Biquad_h
|
||||
27
src/CurrentTrackOSX.h
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
//
|
||||
// CurrentTrackOSX.h
|
||||
// butt
|
||||
//
|
||||
// Created by Melchor Garau Madrigal on 8/7/15.
|
||||
// Copyright (c) 2015 Daniel Nöthen. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/**
|
||||
* Gets the current track from iTunes in a string formated as:
|
||||
* TITLE - ARTIST, or NULL if iTunes is closed or stopped.
|
||||
*/
|
||||
const char *getCurrentTrackFromiTunes(int);
|
||||
|
||||
/**
|
||||
* Gets the current track from Spotify in a string formated as:
|
||||
* TITLE - ARTIST, or NULL if Spotify is closed or stopped.
|
||||
*/
|
||||
const char *getCurrentTrackFromSpotify(int);
|
||||
|
||||
/**
|
||||
* Gets the current track from VOX in a string formated as:
|
||||
* TITLE - ARTIST, or NULL if VOX is closed or stopped.
|
||||
*/
|
||||
const char *getCurrentTrackFromVOX(int);
|
||||
90
src/CurrentTrackOSX.m
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
//
|
||||
// CurrentTrackOSX.m
|
||||
// butt
|
||||
//
|
||||
// Created by Melchor Garau Madrigal on 8/7/15.
|
||||
// Copyright (c) 2015 Daniel Nöthen. All rights reserved.
|
||||
//
|
||||
|
||||
#import "CurrentTrackOSX.h"
|
||||
#import "iTunes.h"
|
||||
#import "Spotify.h"
|
||||
#import "VOX.h"
|
||||
|
||||
const char* getCurrentTrackFromiTunes(int artist_title_order) {
|
||||
NSProcessInfo *pInfo = [NSProcessInfo processInfo];
|
||||
NSOperatingSystemVersion version = [pInfo operatingSystemVersion];
|
||||
|
||||
char* ret = NULL;
|
||||
iTunesApplication *iTunes;
|
||||
if(version.majorVersion < 11 && version.minorVersion < 15)
|
||||
iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.itunes"];
|
||||
else
|
||||
iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.music"];
|
||||
|
||||
if([iTunes isRunning]) {
|
||||
if([iTunes playerState] != iTunesEPlSStopped) {
|
||||
NSString* track;
|
||||
if(artist_title_order == 0) {
|
||||
track = [NSString stringWithFormat:@"%@ - %@", [[iTunes currentTrack] artist], [[iTunes currentTrack] name]];
|
||||
}
|
||||
else {
|
||||
track = [NSString stringWithFormat:@"%@ - %@", [[iTunes currentTrack] name], [[iTunes currentTrack] artist]];
|
||||
}
|
||||
ret = (char*) malloc([track lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1);
|
||||
[track getCString:ret maxLength:([track lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1) encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char* getCurrentTrackFromSpotify(int artist_title_order) {
|
||||
char* ret = NULL;
|
||||
SpotifyApplication *spotify = [SBApplication applicationWithBundleIdentifier:@"com.spotify.client"];
|
||||
if([spotify isRunning]) {
|
||||
if([spotify playerState] != SpotifyEPlSStopped) {
|
||||
NSString* track;
|
||||
if(artist_title_order == 0) {
|
||||
track = [NSString stringWithFormat:@"%@ - %@", [[spotify currentTrack] artist], [[spotify currentTrack] name]];
|
||||
}
|
||||
else {
|
||||
track = [NSString stringWithFormat:@"%@ - %@", [[spotify currentTrack] name], [[spotify currentTrack] artist]];
|
||||
}
|
||||
ret = (char*) malloc([track lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1);
|
||||
[track getCString:ret maxLength:([track lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1) encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char* getCurrentTrackFromVOX(int artist_title_order) {
|
||||
char* ret = NULL;
|
||||
VOXApplication *vox = [SBApplication applicationWithBundleIdentifier:@"com.coppertino.Vox"];
|
||||
if([vox isRunning]) {
|
||||
if([vox playerState]) {
|
||||
NSString* track;
|
||||
if(artist_title_order == 0) {
|
||||
track = [NSString stringWithFormat:@"%@ - %@", [vox artist], [vox track]];
|
||||
}
|
||||
else {
|
||||
track = [NSString stringWithFormat:@"%@ - %@", [vox track], [vox artist]];
|
||||
}
|
||||
ret = (char*) malloc([track lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1);
|
||||
[track getCString:ret maxLength:([track lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1) encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
typedef const char* (*currentTrackFunction)(int);
|
||||
currentTrackFunction getCurrentTrackFunctionFromId(int i) {
|
||||
switch(i) {
|
||||
case 0: return &getCurrentTrackFromiTunes;
|
||||
case 1: return &getCurrentTrackFromSpotify;
|
||||
case 2: return &getCurrentTrackFromVOX;
|
||||
default: return NULL;
|
||||
}
|
||||
}
|
||||
96
src/FLTK/FL/Fl_My_Double_Window.H
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
//
|
||||
// Copyright 2007-2018 by Daniel Noethen.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
|
||||
#ifndef FL_MY_DOUBLE_WINDOW_H
|
||||
#define FL_MY_DOUBLE_WINDOW_H
|
||||
|
||||
#include <FL/x.H>
|
||||
#include <FL/Fl_Double_Window.H>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#include "tray_agent.h"
|
||||
#include "fl_timer_funcs.h"
|
||||
#include "fl_callbacks.h"
|
||||
#elif __APPLE__
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#else
|
||||
#include <X11/Xlib.h>
|
||||
#endif
|
||||
|
||||
class Fl_My_Double_Window : public Fl_Double_Window {
|
||||
public:
|
||||
bool is_main_window = false;
|
||||
bool minimize_to_tray = false;
|
||||
|
||||
void stay_on_top(int ontop)
|
||||
{
|
||||
#ifdef WIN32
|
||||
SetWindowPos(fl_xid(this), ontop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER);
|
||||
|
||||
#elif __APPLE__
|
||||
|
||||
if (ontop) {
|
||||
[fl_xid(this) setLevel:NSFloatingWindowLevel];
|
||||
}
|
||||
else {
|
||||
[fl_xid(this) setLevel:NSNormalWindowLevel];
|
||||
}
|
||||
|
||||
#else // UNIX
|
||||
XEvent e;
|
||||
|
||||
Atom WM_STATE = XInternAtom(fl_display, "_NET_WM_STATE", 0);
|
||||
Atom WM_STATE_ABOVE = XInternAtom(fl_display, "_NET_WM_STATE_ABOVE", 0);
|
||||
|
||||
e.xclient.type = ClientMessage;
|
||||
e.xclient.window = fl_xid(this);
|
||||
e.xclient.message_type = WM_STATE;
|
||||
e.xclient.format = 32;
|
||||
e.xclient.data.l[0] = (long)ontop;
|
||||
e.xclient.data.l[1] = (long)WM_STATE_ABOVE;
|
||||
e.xclient.data.l[2] = (long)0;
|
||||
e.xclient.data.l[3] = (long)0;
|
||||
e.xclient.data.l[4] = (long)0;
|
||||
|
||||
XSendEvent(fl_display, RootWindow(fl_display, fl_screen), 0, SubstructureNotifyMask | SubstructureRedirectMask, &e);
|
||||
XFlush(fl_display);
|
||||
#endif
|
||||
}
|
||||
|
||||
int handle(int event)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (event == FL_HIDE && is_main_window == true && minimize_to_tray == true) {
|
||||
int ret = tray_agent_send_cmd(TA_MINIMIZE);
|
||||
if (ret == 0) {
|
||||
Fl::remove_timeout(&agent_watchdog_timer);
|
||||
Fl::add_timeout(1, &agent_watchdog_timer);
|
||||
}
|
||||
}
|
||||
return Fl_Double_Window::handle(event);
|
||||
#else
|
||||
Fl_Double_Window::handle(event);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
Fl_My_Double_Window(int W, int H, const char *l = 0) : Fl_Double_Window(W, H, l) {}
|
||||
|
||||
Fl_My_Double_Window(int X, int Y, int W, int H, const char *l = 0) : Fl_Double_Window(X, Y, W, H, l) {}
|
||||
|
||||
~Fl_My_Double_Window() { hide(); }
|
||||
};
|
||||
|
||||
#endif // FL_MY_DOUBLE_WINDOW_H
|
||||
50
src/FLTK/FL/Fl_My_Invisible_Box.H
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
//
|
||||
// Copyright 2007-2018 by Daniel Noethen.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
|
||||
#ifndef FL_MY_INVISIBLE_BOX
|
||||
#define FL_MY_INVISIBLE_BOX
|
||||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Box.H>
|
||||
|
||||
#include "fl_callbacks.h"
|
||||
|
||||
class Fl_My_Invisible_Box : public Fl_Box {
|
||||
public:
|
||||
Fl_My_Invisible_Box(int x, int y, int w, int h, const char *label = 0) : Fl_Box(x, y, w, h, label) { enabled = 0; }
|
||||
|
||||
void disable(void) { enabled = 0; }
|
||||
|
||||
void enable(void) { enabled = 1; }
|
||||
|
||||
int handle(int e)
|
||||
{
|
||||
if (enabled == 1) {
|
||||
switch (e) {
|
||||
case FL_ENTER:
|
||||
show_vu_tabs();
|
||||
break;
|
||||
case FL_LEAVE:
|
||||
hide_vu_tabs();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return Fl_Box::handle(e);
|
||||
}
|
||||
|
||||
private:
|
||||
int enabled;
|
||||
};
|
||||
|
||||
#endif
|
||||
348
src/FLTK/FL/Fl_My_Native_File_Chooser.H
Normal file
|
|
@ -0,0 +1,348 @@
|
|||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// FLTK native OS file chooser widget
|
||||
//
|
||||
// Copyright 1998-2014 by Bill Spitzak and others.
|
||||
// Copyright 2004 Greg Ercolano.
|
||||
//
|
||||
// This library is free software. Distribution and use rights are outlined in
|
||||
// the file "COPYING" which should have been included with this file. If this
|
||||
// file is missing or damaged, see the license at:
|
||||
//
|
||||
// http://www.fltk.org/COPYING.php
|
||||
//
|
||||
// Please report all bugs and problems on the following page:
|
||||
//
|
||||
// http://www.fltk.org/str.php
|
||||
//
|
||||
|
||||
/** \file
|
||||
Fl_My_Native_File_Chooser widget. */
|
||||
|
||||
#ifndef FL_MY_NATIVE_FILE_CHOOSER_H
|
||||
#define FL_MY_NATIVE_FILE_CHOOSER_H
|
||||
|
||||
// Use Windows' chooser
|
||||
#ifdef WIN32
|
||||
// #define _WIN32_WINNT 0x0501 // needed for OPENFILENAME's 'FlagsEx'
|
||||
#if defined(FL_LIBRARY) || FLTK_ABI_VERSION < 10304
|
||||
#include <windows.h>
|
||||
#include <commdlg.h> // OPENFILENAMEW, GetOpenFileName()
|
||||
#include <shlobj.h> // BROWSEINFOW, SHBrowseForFolder()
|
||||
typedef OPENFILENAMEW fl_OPENFILENAMEW;
|
||||
typedef BROWSEINFOW fl_BROWSEINFOW;
|
||||
#else
|
||||
typedef void fl_OPENFILENAMEW;
|
||||
typedef void fl_BROWSEINFOW;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Use Apple's chooser
|
||||
#ifdef __APPLE__
|
||||
#define MAXFILTERS 80
|
||||
#endif
|
||||
|
||||
// All else falls back to FLTK's own chooser
|
||||
#if !defined(__APPLE__) && !defined(WIN32)
|
||||
#include <FL/Fl_File_Chooser.H>
|
||||
#else
|
||||
#include <FL/filename.H> // FL_EXPORT
|
||||
#endif
|
||||
|
||||
class Fl_FLTK_File_Chooser;
|
||||
class Fl_GTK_File_Chooser;
|
||||
|
||||
/**
|
||||
This class lets an FLTK application easily and consistently access
|
||||
the operating system's native file chooser. Some operating systems
|
||||
have very complex and specific file choosers that many users want
|
||||
access to specifically, instead of FLTK's default file chooser(s).
|
||||
|
||||
In cases where there is no native file browser, FLTK's own file browser
|
||||
is used instead.
|
||||
|
||||
To use this widget, use the following include in your code:
|
||||
\code
|
||||
#include <FL/Fl_My_Native_File_Chooser.H>
|
||||
\endcode
|
||||
|
||||
The following example shows how to pick a single file:
|
||||
\code
|
||||
// Create and post the local native file chooser
|
||||
#include <FL/Fl_My_Native_File_Chooser.H>
|
||||
[..]
|
||||
Fl_My_Native_File_Chooser fnfc;
|
||||
fnfc.title("Pick a file");
|
||||
fnfc.type(Fl_My_Native_File_Chooser::BROWSE_FILE);
|
||||
fnfc.filter("Text\t*.txt\n"
|
||||
"C Files\t*.{cxx,h,c}");
|
||||
fnfc.directory("/var/tmp"); // default directory to use
|
||||
// Show native chooser
|
||||
switch ( fnfc.show() ) {
|
||||
case -1: printf("ERROR: %s\n", fnfc.errmsg()); break; // ERROR
|
||||
case 1: printf("CANCEL\n"); break; // CANCEL
|
||||
default: printf("PICKED: %s\n", fnfc.filename()); break; // FILE CHOSEN
|
||||
}
|
||||
\endcode
|
||||
|
||||
The Fl_My_Native_File_Chooser widget transmits UTF-8 encoded filenames to its user. It is
|
||||
recommended to open files that may have non-ASCII names with the fl_fopen() or
|
||||
fl_open() utility functions that handle these names in a cross-platform way
|
||||
(whereas the standard fopen()/open() functions fail on the MSWindows platform
|
||||
to open files with a non-ASCII name).
|
||||
|
||||
<B>Platform Specific Caveats</B>
|
||||
|
||||
- Under X windows, and if Fl::OPTION_FNFC_USES_GTK has not been switched off,
|
||||
the widget attempts to use standard GTK file chooser dialogs if they are
|
||||
available at run-time on the platform, and falls back to use FLTK's Fl_File_Chooser if they are not.
|
||||
In the latter case, it's best if you call Fl_File_Icon::load_system_icons()
|
||||
at the start of main(), to enable the nicer looking file browser widgets.
|
||||
Use the static public attributes of class Fl_File_Chooser to localize
|
||||
the browser.
|
||||
- Some operating systems support certain OS specific options; see
|
||||
Fl_My_Native_File_Chooser::options() for a list.
|
||||
|
||||
\image html Fl_My_Native_File_Chooser.png "The Fl_My_Native_File_Chooser on different platforms."
|
||||
\image latex Fl_My_Native_File_Chooser.png "The Fl_My_Native_File_Chooser on different platforms" width=14cm
|
||||
|
||||
*/
|
||||
class FL_EXPORT Fl_My_Native_File_Chooser {
|
||||
public:
|
||||
enum Type {
|
||||
BROWSE_FILE = 0, ///< browse files (lets user choose one file)
|
||||
BROWSE_DIRECTORY, ///< browse directories (lets user choose one directory)
|
||||
BROWSE_MULTI_FILE, ///< browse files (lets user choose multiple files)
|
||||
BROWSE_MULTI_DIRECTORY, ///< browse directories (lets user choose multiple directories)
|
||||
BROWSE_SAVE_FILE, ///< browse to save a file
|
||||
BROWSE_SAVE_DIRECTORY ///< browse to save a directory
|
||||
};
|
||||
enum Option {
|
||||
NO_OPTIONS = 0x0000, ///< no options enabled
|
||||
SAVEAS_CONFIRM = 0x0001, ///< Show native 'Save As' overwrite confirm dialog
|
||||
NEW_FOLDER = 0x0002, ///< Show 'New Folder' icon (if supported)
|
||||
PREVIEW = 0x0004, ///< enable preview mode (if supported)
|
||||
USE_FILTER_EXT = 0x0008 ///< Chooser filter pilots the output file extension (if supported)
|
||||
};
|
||||
/** Localizable message */
|
||||
static const char *file_exists_message;
|
||||
|
||||
public:
|
||||
Fl_My_Native_File_Chooser(int val = BROWSE_FILE);
|
||||
~Fl_My_Native_File_Chooser();
|
||||
|
||||
// Public methods
|
||||
void type(int t);
|
||||
int type() const;
|
||||
void options(int o);
|
||||
int options() const;
|
||||
int count() const;
|
||||
const char *filename() const;
|
||||
const char *filename(int i) const;
|
||||
void directory(const char *val);
|
||||
const char *directory() const;
|
||||
void title(const char *t);
|
||||
const char *title() const;
|
||||
const char *filter() const;
|
||||
void filter(const char *f);
|
||||
int filters() const;
|
||||
void filter_value(int i);
|
||||
int filter_value() const;
|
||||
void preset_file(const char *f);
|
||||
const char *preset_file() const;
|
||||
const char *errmsg() const;
|
||||
int show();
|
||||
|
||||
#ifdef WIN32
|
||||
private:
|
||||
int _btype; // kind-of browser to show()
|
||||
int _options; // general options
|
||||
#if FLTK_ABI_VERSION >= 10304
|
||||
fl_OPENFILENAMEW *_ofn_ptr; // GetOpenFileName() & GetSaveFileName() struct
|
||||
fl_BROWSEINFOW *_binf_ptr; // SHBrowseForFolder() struct
|
||||
WCHAR *_wpattern; // pattern buffer for filter
|
||||
#else
|
||||
fl_OPENFILENAMEW _ofn;
|
||||
fl_BROWSEINFOW _binf;
|
||||
#endif
|
||||
char **_pathnames; // array of pathnames
|
||||
int _tpathnames; // total pathnames
|
||||
char *_directory; // default pathname to use
|
||||
char *_title; // title for window
|
||||
char *_filter; // user-side search filter
|
||||
char *_parsedfilt; // filter parsed for Windows dialog
|
||||
int _nfilters; // number of filters parse_filter counted
|
||||
char *_preset_file; // the file to preselect
|
||||
char *_errmsg; // error message
|
||||
|
||||
// Private methods
|
||||
void errmsg(const char *msg);
|
||||
|
||||
void clear_pathnames();
|
||||
void set_single_pathname(const char *s);
|
||||
void add_pathname(const char *s);
|
||||
|
||||
void ClearOFN();
|
||||
void ClearBINF();
|
||||
void Win2Unix(char *s);
|
||||
void Unix2Win(char *s);
|
||||
int showfile();
|
||||
int showdir();
|
||||
|
||||
void parse_filter(const char *);
|
||||
void clear_filters();
|
||||
void add_filter(const char *, const char *);
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
private:
|
||||
int _btype; // kind-of browser to show()
|
||||
int _options; // general options
|
||||
void *_panel;
|
||||
char **_pathnames; // array of pathnames
|
||||
int _tpathnames; // total pathnames
|
||||
char *_directory; // default pathname to use
|
||||
char *_title; // title for window
|
||||
char *_preset_file; // the 'save as' filename
|
||||
|
||||
char *_filter; // user-side search filter, eg:
|
||||
// C Files\t*.[ch]\nText Files\t*.txt"
|
||||
|
||||
char *_filt_names; // filter names (tab delimited)
|
||||
// eg. "C Files\tText Files"
|
||||
|
||||
char *_filt_patt[MAXFILTERS];
|
||||
// array of filter patterns, eg:
|
||||
// _filt_patt[0]="*.{cxx,h}"
|
||||
// _filt_patt[1]="*.txt"
|
||||
|
||||
int _filt_total; // parse_filter() # of filters loaded
|
||||
int _filt_value; // index of the selected filter
|
||||
char *_errmsg; // error message
|
||||
|
||||
// Private methods
|
||||
void errmsg(const char *msg);
|
||||
void clear_pathnames();
|
||||
void set_single_pathname(const char *s);
|
||||
int get_saveas_basename(void);
|
||||
void clear_filters();
|
||||
void add_filter(const char *, const char *);
|
||||
void parse_filter(const char *from);
|
||||
int post();
|
||||
int runmodal();
|
||||
#endif
|
||||
|
||||
#if !defined(__APPLE__) && !defined(WIN32)
|
||||
private:
|
||||
#if FLTK_ABI_VERSION <= 10302
|
||||
int _btype; // kind-of browser to show()
|
||||
int _options; // general options
|
||||
int _nfilters;
|
||||
char *_filter; // user supplied filter
|
||||
char *_parsedfilt; // parsed filter
|
||||
int _filtvalue; // selected filter
|
||||
char *_preset_file;
|
||||
char *_prevvalue; // Returned filename
|
||||
char *_directory;
|
||||
char *_errmsg; // error message
|
||||
#endif
|
||||
static int have_looked_for_GTK_libs;
|
||||
union {
|
||||
Fl_FLTK_File_Chooser *_x11_file_chooser;
|
||||
Fl_GTK_File_Chooser *_gtk_file_chooser;
|
||||
};
|
||||
#endif
|
||||
};
|
||||
|
||||
#if !defined(__APPLE__) && !defined(WIN32)
|
||||
class FL_EXPORT Fl_FLTK_File_Chooser {
|
||||
friend class Fl_My_Native_File_Chooser;
|
||||
|
||||
protected:
|
||||
int _btype; // kind-of browser to show()
|
||||
int _options; // general options
|
||||
int _nfilters;
|
||||
char *_filter; // user supplied filter
|
||||
char *_parsedfilt; // parsed filter
|
||||
int _filtvalue; // selected filter
|
||||
char *_preset_file;
|
||||
char *_prevvalue; // Returned filename
|
||||
char *_directory;
|
||||
char *_errmsg; // error message
|
||||
Fl_FLTK_File_Chooser(int val);
|
||||
virtual ~Fl_FLTK_File_Chooser();
|
||||
void errmsg(const char *msg);
|
||||
int type_fl_file(int);
|
||||
void parse_filter();
|
||||
int exist_dialog();
|
||||
Fl_File_Chooser *_file_chooser;
|
||||
virtual void type(int);
|
||||
int type() const;
|
||||
void options(int);
|
||||
int options() const;
|
||||
virtual int count() const;
|
||||
virtual const char *filename() const;
|
||||
virtual const char *filename(int i) const;
|
||||
void directory(const char *val);
|
||||
const char *directory() const;
|
||||
virtual void title(const char *);
|
||||
virtual const char *title() const;
|
||||
const char *filter() const;
|
||||
void filter(const char *);
|
||||
int filters() const;
|
||||
void filter_value(int i);
|
||||
int filter_value() const;
|
||||
void preset_file(const char *);
|
||||
const char *preset_file() const;
|
||||
const char *errmsg() const;
|
||||
virtual int show();
|
||||
};
|
||||
|
||||
class FL_EXPORT Fl_GTK_File_Chooser : public Fl_FLTK_File_Chooser {
|
||||
friend class Fl_My_Native_File_Chooser;
|
||||
|
||||
private:
|
||||
typedef struct _GtkWidget GtkWidget;
|
||||
typedef struct _GtkFileFilterInfo GtkFileFilterInfo;
|
||||
struct pair {
|
||||
Fl_GTK_File_Chooser *running; // the running Fl_GTK_File_Chooser
|
||||
const char *filter; // a filter string of the chooser
|
||||
pair(Fl_GTK_File_Chooser *c, const char *f)
|
||||
{
|
||||
running = c;
|
||||
filter = strdup(f);
|
||||
};
|
||||
~pair() { free((char *)filter); };
|
||||
};
|
||||
GtkWidget *gtkw_ptr; // used to hold a GtkWidget* without pulling GTK into everything...
|
||||
void *gtkw_slist; // used to hold a GLib GSList...
|
||||
unsigned gtkw_count; // number of files read back - if any
|
||||
mutable char *gtkw_filename; // last name we read back
|
||||
char *gtkw_title; // the title to be applied to the dialog
|
||||
const char *previous_filter;
|
||||
|
||||
int fl_gtk_chooser_wrapper(); // method that wraps the GTK widget
|
||||
Fl_GTK_File_Chooser(int val);
|
||||
virtual ~Fl_GTK_File_Chooser();
|
||||
static int did_find_GTK_libs;
|
||||
static void probe_for_GTK_libs(void);
|
||||
virtual void type(int);
|
||||
virtual int count() const;
|
||||
virtual const char *filename() const;
|
||||
virtual const char *filename(int i) const;
|
||||
virtual void title(const char *);
|
||||
virtual const char *title() const;
|
||||
virtual int show();
|
||||
void changed_output_type(const char *filter);
|
||||
|
||||
static int custom_gtk_filter_function(const GtkFileFilterInfo *, Fl_GTK_File_Chooser::pair *);
|
||||
static void free_pair(pair *p);
|
||||
};
|
||||
#endif // !defined(__APPLE__) && !defined(WIN32)
|
||||
|
||||
#endif /*FL_NATIVE_FILE_CHOOSER_H*/
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
250
src/FLTK/FL/Fl_My_Value_Slider.H
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
//
|
||||
// Copyright 2007-2018 by Daniel Noethen.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
|
||||
#ifndef FL_MY_VALUE_SLIDER
|
||||
#define FL_MY_VALUE_SLIDER
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <FL/fl_draw.H>
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Double_Window.H>
|
||||
#include <FL/Fl_Group.H>
|
||||
#include <FL/Fl_Slider.H>
|
||||
#include <FL/Fl_Menu_Window.H>
|
||||
#include <FL/Fl_Tooltip.H>
|
||||
#include <FL/Fl_Spinner.H>
|
||||
|
||||
#include "gettext.h"
|
||||
|
||||
class Fl_My_Value_Slider;
|
||||
|
||||
// FLOATING TIP WINDOW
|
||||
class TipWin : public Fl_Menu_Window {
|
||||
char tip[40];
|
||||
|
||||
public:
|
||||
TipWin() : Fl_Menu_Window(1, 1)
|
||||
{ // will autosize
|
||||
strcpy(tip, "X.XX");
|
||||
set_override();
|
||||
end();
|
||||
}
|
||||
void draw(void)
|
||||
{
|
||||
draw_box(FL_BORDER_BOX, 0, 0, w(), h(), Fl_Color(175));
|
||||
fl_color(FL_BLACK);
|
||||
fl_font(labelfont(), labelsize());
|
||||
fl_draw(tip, 3, 3, w() - 6, h() - 6, Fl_Align(FL_ALIGN_LEFT | FL_ALIGN_WRAP));
|
||||
show();
|
||||
}
|
||||
void value(char *t)
|
||||
{
|
||||
strncpy(tip, t, sizeof(tip) - 1);
|
||||
// Recalc size of window
|
||||
fl_font(labelfont(), labelsize());
|
||||
int W = w(), H = h();
|
||||
fl_measure(tip, W, H, 0);
|
||||
W += 8;
|
||||
size(W, H);
|
||||
redraw();
|
||||
}
|
||||
};
|
||||
|
||||
class My_Value_Input : public Fl_Value_Input {
|
||||
public:
|
||||
My_Value_Input(int x, int y, int w, int h, const char *label = 0) : Fl_Value_Input(x, y, w, h, label) {}
|
||||
|
||||
void (*custom_callback)(Fl_Widget *, void *);
|
||||
void *data = NULL;
|
||||
|
||||
int handle(int e)
|
||||
{
|
||||
switch (e) {
|
||||
case FL_KEYDOWN:
|
||||
if (Fl::event_key() == FL_Enter) {
|
||||
custom_callback(this, data);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return Fl_Value_Input::handle(e);
|
||||
}
|
||||
};
|
||||
|
||||
// VALUE SLIDER WITH FLOATING TIP WINDOW
|
||||
class Fl_My_Value_Slider : public Fl_Slider {
|
||||
TipWin *tipwin;
|
||||
Fl_Window *window_value;
|
||||
My_Value_Input *input_value;
|
||||
|
||||
public:
|
||||
float default_value = 0.0;
|
||||
bool hide_tipwin = false;
|
||||
|
||||
Fl_My_Value_Slider(int x, int y, int w, int h, const char *l = 0) : Fl_Slider(x, y, w, h, l)
|
||||
{
|
||||
// type(FL_HORIZONTAL);
|
||||
|
||||
Fl_Group *save = Fl_Group::current(); // save current widget..
|
||||
tipwin = new TipWin(); // ..because this trashes it
|
||||
tipwin->hide();
|
||||
create_value_window();
|
||||
Fl_Group::current(save); // ..then back to previous.
|
||||
}
|
||||
|
||||
void value_cb2(const char *suffix)
|
||||
{
|
||||
char tip[40];
|
||||
snprintf(tip, sizeof(tip), "%.2f%s", value(), suffix);
|
||||
tipwin->value(tip);
|
||||
tipwin->position(Fl::event_x_root() + 20, Fl::event_y_root());
|
||||
}
|
||||
|
||||
void create_value_window()
|
||||
{
|
||||
int window_width = 180, window_height = 90;
|
||||
|
||||
window_value = new Fl_Window(0, 0, window_width, window_height);
|
||||
window_value->user_data(this);
|
||||
window_value->set_modal();
|
||||
window_value->label(label());
|
||||
// window_value->border(0);
|
||||
window_value->color(fl_darker(window_value->color()));
|
||||
|
||||
/* Fl_Box *title = new Fl_Box(0, 5, window_width, 10);
|
||||
title->label(label());
|
||||
title->align(FL_ALIGN_INSIDE);*/
|
||||
|
||||
input_value = new My_Value_Input(5, 25, 165, 22);
|
||||
input_value->align(FL_ALIGN_TOP_LEFT);
|
||||
input_value->custom_callback = &input_value_cb_;
|
||||
|
||||
Fl_Button *button_close = new Fl_Button(5, 55, 80, 22, _("Close"));
|
||||
button_close->box(FL_ENGRAVED_BOX);
|
||||
button_close->callback((Fl_Callback *)button_close_cb_);
|
||||
|
||||
Fl_Button *button_ok = new Fl_Button(5 + 80 + 5, 55, 80, 22, _("Ok"));
|
||||
button_ok->box(FL_ENGRAVED_BOX);
|
||||
button_ok->callback((Fl_Callback *)button_ok_cb_);
|
||||
|
||||
window_value->end();
|
||||
}
|
||||
|
||||
// MARK: Callbacks
|
||||
|
||||
// Close button
|
||||
static void button_close_cb_(Fl_Widget *widget, void *data)
|
||||
{
|
||||
Fl_Widget *p = widget;
|
||||
while (p->parent()) {
|
||||
p = p->parent();
|
||||
}
|
||||
|
||||
((Fl_My_Value_Slider *)p->user_data())->button_close_cb(widget, p->user_data());
|
||||
}
|
||||
void button_close_cb(Fl_Widget *widget, void *data) { this->window_value->hide(); }
|
||||
|
||||
// ok button
|
||||
static void button_ok_cb_(Fl_Widget *widget, void *data)
|
||||
{
|
||||
Fl_Widget *p = widget;
|
||||
while (p->parent()) {
|
||||
p = p->parent();
|
||||
}
|
||||
|
||||
((Fl_My_Value_Slider *)p->user_data())->button_ok_cb(widget, data);
|
||||
}
|
||||
|
||||
void button_ok_cb(Fl_Widget *button, void *data)
|
||||
{
|
||||
this->set_value(clamp(this->input_value->value()));
|
||||
this->do_callback();
|
||||
this->parent()->redraw();
|
||||
this->window_value->hide();
|
||||
}
|
||||
|
||||
// input field
|
||||
static void input_value_cb_(Fl_Widget *widget, void *data)
|
||||
{
|
||||
Fl_Widget *p = widget;
|
||||
while (p->parent()) {
|
||||
p = p->parent();
|
||||
}
|
||||
|
||||
((Fl_My_Value_Slider *)p->user_data())->input_value_cb(widget, data);
|
||||
}
|
||||
|
||||
void input_value_cb(Fl_Widget *button, void *data)
|
||||
{
|
||||
this->set_value(clamp(this->input_value->value()));
|
||||
this->do_callback();
|
||||
this->parent()->redraw();
|
||||
}
|
||||
|
||||
int handle(int e)
|
||||
{
|
||||
switch (e) {
|
||||
case FL_PUSH:
|
||||
if (Fl::event_button() == FL_LEFT_MOUSE) {
|
||||
if (Fl::event_clicks()) // move slider to zero when double clicking
|
||||
{
|
||||
this->value(default_value);
|
||||
this->do_callback();
|
||||
this->parent()->redraw();
|
||||
return 1;
|
||||
}
|
||||
if (hide_tipwin == false) {
|
||||
tipwin->position(Fl::event_x_root() + 20, Fl::event_y_root());
|
||||
tipwin->show();
|
||||
}
|
||||
}
|
||||
if (Fl::event_button() == FL_RIGHT_MOUSE) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
break;
|
||||
case FL_RELEASE: // release mouse
|
||||
tipwin->hide();
|
||||
if (Fl::event_button() == FL_RIGHT_MOUSE) {
|
||||
char input_label[64];
|
||||
float current_slider_value = value();
|
||||
input_value->value(current_slider_value);
|
||||
window_value->position(Fl::event_x_root() - window_value->w() / 2, Fl::event_y_root() - window_value->h() - 15);
|
||||
|
||||
if (this->minimum() < this->maximum()) {
|
||||
snprintf(input_label, sizeof(input_label), "Min: %.2f Max: %.2f", this->minimum(), this->maximum());
|
||||
}
|
||||
else {
|
||||
snprintf(input_label, sizeof(input_label), "Min: %.2f Max: %.2f", this->maximum(),
|
||||
this->minimum()); // Reversed direction (for vertical sliders)
|
||||
}
|
||||
|
||||
input_value->copy_label(input_label);
|
||||
input_value->take_focus();
|
||||
window_value->show();
|
||||
|
||||
return 1;
|
||||
}
|
||||
case FL_HIDE: // valuator goes away
|
||||
case FL_LEAVE: // leave focus
|
||||
// Make sure tipwin closes when app closes
|
||||
tipwin->hide();
|
||||
break;
|
||||
}
|
||||
return (Fl_Slider::handle(e));
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
577
src/FLTK/Fl_ILM216.cpp
Normal file
|
|
@ -0,0 +1,577 @@
|
|||
//
|
||||
// "$Id: Fl_ILM216.cxx,v 1.8 2003/02/26 01:59:31 easysw Exp $"
|
||||
//
|
||||
// ILM-216 LCD emulator widget code for flcdsim.
|
||||
//
|
||||
// Copyright 2003 by Michael Sweet.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// Fl_ILM216::Fl_ILM216() - Create a new ILM-216 widget.
|
||||
// Fl_ILM216::~Fl_ILM216() - Delete an ILM-216 widget.
|
||||
// Fl_ILM216::draw() - Draw the widget.
|
||||
// Fl_LCD216::load_char() - Load a single character in the font.
|
||||
// Fl_LCD216::load_font() - Load the standard ILM-216 font.
|
||||
// Fl_LCD216::process() - Process data like an ILM-216.
|
||||
//
|
||||
|
||||
// modified by Daniel Noethen
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
#include <FL/fl_draw.H>
|
||||
|
||||
#include "butt.h"
|
||||
#include "flgui.h"
|
||||
|
||||
#include "../xpm/rec.xpm" //rec_xpm
|
||||
#include "../xpm/rec_dark.xpm" //rec_xpm
|
||||
#include "../xpm/rec_armed.xpm" //rec_xpm
|
||||
#include "../xpm/conn.xpm" //conn_xpm
|
||||
#include "../xpm/conn_dark.xpm" //conn_xpm
|
||||
|
||||
//
|
||||
// Font data for the LCD-216...
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
static const uchar standard_font[224][8] = {
|
||||
// 0x20 to 0x2f
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00},
|
||||
{0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x0a, 0x0a, 0x1f, 0x0a, 0x1f, 0x0a, 0x0a, 0x00},
|
||||
{0x04, 0x0f, 0x14, 0x0e, 0x05, 0x1e, 0x04, 0x00},
|
||||
{0x18, 0x19, 0x02, 0x04, 0x08, 0x13, 0x03, 0x00},
|
||||
{0x0c, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0d, 0x00},
|
||||
{0x0c, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02, 0x00},
|
||||
{0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00},
|
||||
{0x00, 0x04, 0x15, 0x0e, 0x15, 0x04, 0x00, 0x00},
|
||||
{0x00, 0x04, 0x04, 0x1f, 0x04, 0x04, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x08},
|
||||
{0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00},
|
||||
{0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00},
|
||||
|
||||
// 0x30 to 0x3f
|
||||
{0x0e, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0e, 0x00},
|
||||
{0x04, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x1f, 0x00},
|
||||
{0x0e, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1f, 0x00},
|
||||
{0x1f, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0e, 0x00},
|
||||
{0x02, 0x06, 0x0a, 0x12, 0x1f, 0x02, 0x02, 0x00},
|
||||
{0x1f, 0x10, 0x1e, 0x01, 0x01, 0x11, 0x0e, 0x00},
|
||||
{0x06, 0x08, 0x10, 0x1e, 0x11, 0x11, 0x0e, 0x00},
|
||||
{0x1f, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x00},
|
||||
{0x0e, 0x11, 0x11, 0x0e, 0x11, 0x11, 0x0e, 0x00},
|
||||
{0x0e, 0x11, 0x11, 0x0f, 0x01, 0x02, 0x0c, 0x00},
|
||||
{0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x0c, 0x00, 0x00},
|
||||
{0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x04, 0x08, 0x00},
|
||||
{0x02, 0x04, 0x08, 0x10, 0x08, 0x04, 0x02, 0x00},
|
||||
{0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00},
|
||||
{0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x00},
|
||||
{0x0e, 0x11, 0x01, 0x02, 0x04, 0x00, 0x04, 0x00},
|
||||
|
||||
// 0x40 to 0x4f
|
||||
{0x0e, 0x11, 0x01, 0x0d, 0x15, 0x15, 0x0e, 0x00},
|
||||
{0x0e, 0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x00},
|
||||
{0x1e, 0x11, 0x11, 0x1e, 0x11, 0x11, 0x1e, 0x00},
|
||||
{0x0e, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0e, 0x00},
|
||||
{0x1c, 0x12, 0x11, 0x11, 0x11, 0x12, 0x1c, 0x00},
|
||||
{0x1f, 0x10, 0x10, 0x1e, 0x10, 0x10, 0x1f, 0x00},
|
||||
{0x1f, 0x10, 0x10, 0x1e, 0x10, 0x10, 0x10, 0x00},
|
||||
{0x0e, 0x11, 0x10, 0x17, 0x11, 0x11, 0x0f, 0x00},
|
||||
{0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11, 0x00},
|
||||
{0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1f, 0x00},
|
||||
{0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0c, 0x00},
|
||||
{0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11, 0x00},
|
||||
{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00},
|
||||
{0x11, 0x1b, 0x15, 0x15, 0x11, 0x11, 0x11, 0x00},
|
||||
{0x11, 0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x00},
|
||||
{0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00},
|
||||
|
||||
// 0x50 to 0x5f
|
||||
{0x1e, 0x11, 0x11, 0x1e, 0x10, 0x10, 0x10, 0x00},
|
||||
{0x0e, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0d, 0x00},
|
||||
{0x1e, 0x11, 0x11, 0x1e, 0x14, 0x12, 0x11, 0x00},
|
||||
{0x0f, 0x10, 0x10, 0x0e, 0x01, 0x01, 0x1e, 0x00},
|
||||
{0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00},
|
||||
{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00},
|
||||
{0x11, 0x11, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00},
|
||||
{0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x0a, 0x00},
|
||||
{0x11, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x11, 0x00},
|
||||
{0x11, 0x11, 0x11, 0x0a, 0x04, 0x04, 0x04, 0x00},
|
||||
{0x1f, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1f, 0x00},
|
||||
{0x0e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x00},
|
||||
{0x11, 0x0a, 0x1f, 0x04, 0x1f, 0x04, 0x04, 0x00},
|
||||
{0x0e, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0e, 0x00},
|
||||
{0x04, 0x0a, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f},
|
||||
|
||||
// 0x60 to 0x6f
|
||||
{0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00},
|
||||
{0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x1e, 0x00},
|
||||
{0x00, 0x00, 0x0e, 0x10, 0x10, 0x11, 0x0e, 0x00},
|
||||
{0x01, 0x01, 0x0d, 0x13, 0x11, 0x11, 0x0f, 0x00},
|
||||
{0x00, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00},
|
||||
{0x06, 0x09, 0x08, 0x1c, 0x08, 0x08, 0x08, 0x00},
|
||||
{0x00, 0x0f, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00},
|
||||
{0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00},
|
||||
{0x04, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x0e, 0x00},
|
||||
{0x02, 0x00, 0x02, 0x02, 0x02, 0x12, 0x0c, 0x00},
|
||||
{0x10, 0x10, 0x12, 0x14, 0x18, 0x14, 0x12, 0x00},
|
||||
{0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00},
|
||||
{0x00, 0x00, 0x1a, 0x15, 0x15, 0x11, 0x11, 0x00},
|
||||
{0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00},
|
||||
{0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00},
|
||||
|
||||
// 0x70 to 0x7f
|
||||
{0x00, 0x1e, 0x11, 0x11, 0x1e, 0x10, 0x10, 0x00},
|
||||
{0x00, 0x0d, 0x13, 0x11, 0x0f, 0x01, 0x01, 0x00},
|
||||
{0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10, 0x00},
|
||||
{0x00, 0x00, 0x0e, 0x10, 0x0e, 0x01, 0x1e, 0x00},
|
||||
{0x08, 0x08, 0x1c, 0x08, 0x08, 0x09, 0x06, 0x00},
|
||||
{0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0x00},
|
||||
{0x00, 0x00, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00},
|
||||
{0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0a, 0x00},
|
||||
{0x00, 0x00, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x00},
|
||||
{0x00, 0x11, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00},
|
||||
{0x00, 0x00, 0x1f, 0x02, 0x04, 0x08, 0x1f, 0x00},
|
||||
{0x02, 0x04, 0x04, 0x08, 0x04, 0x04, 0x02, 0x00},
|
||||
{0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00},
|
||||
{0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0x00},
|
||||
{0x00, 0x04, 0x02, 0x1f, 0x02, 0x04, 0x00, 0x00},
|
||||
{0x00, 0x04, 0x08, 0x1f, 0x08, 0x04, 0x00, 0x00},
|
||||
|
||||
// 0x80 to 0x8f
|
||||
{0x1c, 0x10, 0x18, 0x10, 0x12, 0x02, 0x02, 0x02},
|
||||
{0x1c, 0x10, 0x18, 0x16, 0x11, 0x02, 0x04, 0x07},
|
||||
{0x1c, 0x10, 0x18, 0x16, 0x11, 0x02, 0x01, 0x06},
|
||||
{0x1c, 0x10, 0x18, 0x15, 0x15, 0x07, 0x01, 0x01},
|
||||
{0x08, 0x14, 0x14, 0x08, 0x05, 0x06, 0x05, 0x05},
|
||||
{0x08, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f},
|
||||
{0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
|
||||
// 0x90 to 0x9f
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
|
||||
// 0xa0 to 0xaf
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x14, 0x1c},
|
||||
{0x07, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x1c},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x04},
|
||||
{0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x1f, 0x01, 0x1f, 0x01, 0x02, 0x04, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x1f, 0x01, 0x06, 0x04, 0x08},
|
||||
{0x00, 0x00, 0x00, 0x02, 0x04, 0x0c, 0x14, 0x04},
|
||||
{0x00, 0x00, 0x00, 0x04, 0x1f, 0x11, 0x01, 0x06},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x1f, 0x04, 0x04, 0x1f},
|
||||
{0x00, 0x00, 0x00, 0x02, 0x1f, 0x06, 0x0a, 0x12},
|
||||
{0x00, 0x00, 0x00, 0x08, 0x1f, 0x09, 0x0a, 0x08},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x1f},
|
||||
{0x00, 0x00, 0x00, 0x1e, 0x02, 0x1e, 0x02, 0x1e},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x01, 0x06},
|
||||
|
||||
// 0xb0 to 0xbf
|
||||
{0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x1f, 0x01, 0x05, 0x06, 0x04, 0x04, 0x08, 0x00},
|
||||
{0x01, 0x02, 0x04, 0x0c, 0x14, 0x04, 0x04, 0x00},
|
||||
{0x04, 0x1f, 0x11, 0x11, 0x01, 0x02, 0x04, 0x00},
|
||||
{0x00, 0x1f, 0x04, 0x04, 0x04, 0x04, 0x1f, 0x00},
|
||||
{0x02, 0x1f, 0x02, 0x06, 0x0a, 0x12, 0x02, 0x00},
|
||||
{0x08, 0x1f, 0x09, 0x09, 0x09, 0x09, 0x12, 0x00},
|
||||
{0x04, 0x1f, 0x04, 0x1f, 0x04, 0x04, 0x04, 0x00},
|
||||
{0x00, 0x0f, 0x09, 0x11, 0x01, 0x02, 0x0c, 0x00},
|
||||
{0x08, 0x0f, 0x12, 0x02, 0x02, 0x02, 0x04, 0x00},
|
||||
{0x00, 0x1f, 0x01, 0x01, 0x01, 0x01, 0x1f, 0x00},
|
||||
{0x0a, 0x1f, 0x0a, 0x0a, 0x02, 0x04, 0x08, 0x00},
|
||||
{0x00, 0x18, 0x01, 0x19, 0x01, 0x02, 0x1c, 0x00},
|
||||
{0x00, 0x1f, 0x01, 0x02, 0x04, 0x0a, 0x11, 0x00},
|
||||
{0x08, 0x1f, 0x09, 0x0a, 0x08, 0x08, 0x07, 0x00},
|
||||
{0x00, 0x11, 0x11, 0x09, 0x01, 0x02, 0x0c, 0x00},
|
||||
|
||||
// 0xc0 to 0xcf
|
||||
{0x00, 0x0f, 0x09, 0x15, 0x03, 0x02, 0x0c, 0x00},
|
||||
{0x02, 0x1c, 0x04, 0x1f, 0x04, 0x04, 0x08, 0x00},
|
||||
{0x00, 0x15, 0x15, 0x15, 0x01, 0x02, 0x04, 0x00},
|
||||
{0x0e, 0x00, 0x1f, 0x04, 0x04, 0x04, 0x08, 0x00},
|
||||
{0x08, 0x08, 0x08, 0x0c, 0x0a, 0x08, 0x08, 0x00},
|
||||
{0x04, 0x04, 0x1f, 0x04, 0x04, 0x08, 0x10, 0x00},
|
||||
{0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00},
|
||||
{0x00, 0x1f, 0x01, 0x0a, 0x04, 0x0a, 0x10, 0x00},
|
||||
{0x04, 0x1f, 0x02, 0x04, 0x0e, 0x15, 0x04, 0x00},
|
||||
{0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00},
|
||||
{0x00, 0x04, 0x02, 0x11, 0x11, 0x11, 0x11, 0x00},
|
||||
{0x10, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x0f, 0x00},
|
||||
{0x00, 0x1f, 0x01, 0x01, 0x01, 0x02, 0x04, 0x00},
|
||||
{0x00, 0x08, 0x14, 0x02, 0x01, 0x01, 0x00, 0x00},
|
||||
{0x04, 0x1f, 0x04, 0x04, 0x15, 0x15, 0x04, 0x00},
|
||||
{0x00, 0x1f, 0x01, 0x01, 0x0a, 0x04, 0x02, 0x00},
|
||||
|
||||
// 0xd0 to 0xdf
|
||||
{0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x01, 0x00},
|
||||
{0x00, 0x04, 0x08, 0x10, 0x11, 0x1f, 0x01, 0x00},
|
||||
{0x00, 0x01, 0x01, 0x0a, 0x04, 0x0a, 0x10, 0x00},
|
||||
{0x00, 0x1f, 0x08, 0x1f, 0x08, 0x08, 0x07, 0x00},
|
||||
{0x08, 0x08, 0x1f, 0x09, 0x0a, 0x08, 0x08, 0x00},
|
||||
{0x00, 0x0e, 0x02, 0x02, 0x02, 0x02, 0x1f, 0x00},
|
||||
{0x00, 0x1f, 0x01, 0x1f, 0x01, 0x01, 0x1f, 0x00},
|
||||
{0x0e, 0x00, 0x1f, 0x01, 0x01, 0x02, 0x04, 0x00},
|
||||
{0x12, 0x12, 0x12, 0x12, 0x02, 0x04, 0x08, 0x00},
|
||||
{0x00, 0x04, 0x14, 0x14, 0x15, 0x15, 0x16, 0x00},
|
||||
{0x00, 0x10, 0x10, 0x11, 0x12, 0x14, 0x18, 0x00},
|
||||
{0x00, 0x1f, 0x11, 0x11, 0x11, 0x11, 0x1f, 0x00},
|
||||
{0x00, 0x1f, 0x11, 0x11, 0x01, 0x02, 0x04, 0x00},
|
||||
{0x00, 0x18, 0x00, 0x01, 0x01, 0x02, 0x1c, 0x00},
|
||||
{0x04, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x1c, 0x14, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
|
||||
// 0xe0 to 0xef
|
||||
{0x00, 0x00, 0x09, 0x15, 0x12, 0x12, 0x0d, 0x00},
|
||||
{0x0a, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00},
|
||||
{0x00, 0x00, 0x0e, 0x11, 0x1e, 0x11, 0x1e, 0x00},
|
||||
{0x00, 0x00, 0x0e, 0x10, 0x0c, 0x11, 0x0e, 0x00},
|
||||
{0x00, 0x00, 0x11, 0x11, 0x13, 0x1d, 0x10, 0x00},
|
||||
{0x00, 0x00, 0x0f, 0x14, 0x12, 0x11, 0x0e, 0x00},
|
||||
{0x00, 0x00, 0x06, 0x19, 0x11, 0x19, 0x16, 0x00},
|
||||
{0x00, 0x00, 0x0f, 0x11, 0x11, 0x13, 0x0d, 0x00},
|
||||
{0x00, 0x00, 0x07, 0x04, 0x04, 0x14, 0x08, 0x00},
|
||||
{0x00, 0x02, 0x1a, 0x02, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x02, 0x00, 0x06, 0x02, 0x02, 0x02, 0x02, 0x00},
|
||||
{0x00, 0x14, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x00, 0x04, 0x0e, 0x14, 0x15, 0x0e, 0x04, 0x00},
|
||||
{0x08, 0x08, 0x1c, 0x08, 0x1c, 0x08, 0x0f, 0x00},
|
||||
{0x0e, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00},
|
||||
{0x0a, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00},
|
||||
|
||||
// 0xf0 to 0xff
|
||||
{0x00, 0x00, 0x16, 0x19, 0x11, 0x19, 0x16, 0x00},
|
||||
{0x00, 0x00, 0x0d, 0x13, 0x11, 0x13, 0x0d, 0x00},
|
||||
{0x00, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x0e, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x0b, 0x11, 0x1a, 0x00, 0x00},
|
||||
{0x00, 0x00, 0x0e, 0x11, 0x11, 0x0a, 0x1b, 0x00},
|
||||
{0x0a, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0x00},
|
||||
{0x1f, 0x80, 0x04, 0x02, 0x04, 0x08, 0x1f, 0x00},
|
||||
{0x00, 0x00, 0x1f, 0x0a, 0x0a, 0x0a, 0x13, 0x00},
|
||||
{0x1f, 0x00, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x00},
|
||||
{0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0f, 0x00},
|
||||
{0x00, 0x01, 0x1e, 0x04, 0x1f, 0x04, 0x04, 0x00},
|
||||
{0x00, 0x00, 0x1f, 0x08, 0x0f, 0x09, 0x11, 0x00},
|
||||
{0x00, 0x00, 0x1f, 0x15, 0x1f, 0x11, 0x11, 0x00},
|
||||
{0x00, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x04, 0x00},
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f}};
|
||||
|
||||
//
|
||||
// 'Fl_ILM216::Fl_ILM216()' - Create a new ILM-216 widget.
|
||||
//
|
||||
|
||||
Fl_ILM216::Fl_ILM216(int X, // I - X position
|
||||
int Y, // I - Y position
|
||||
int W, // I - Width
|
||||
int H, // I - Height
|
||||
const char *L) // I - Label string
|
||||
: Fl_Widget(X, Y, W, H, L)
|
||||
{
|
||||
// Initialize defaults...
|
||||
backlight_ = 0;
|
||||
|
||||
rec_ = new Fl_Pixmap(rec_xpm);
|
||||
rec_dark_ = new Fl_Pixmap(rec_dark_xpm);
|
||||
rec_armed_ = new Fl_Pixmap(rec_armed_xpm);
|
||||
conn_ = new Fl_Pixmap(conn_xpm);
|
||||
conn_dark_ = new Fl_Pixmap(conn_dark_xpm);
|
||||
|
||||
// Load the standard font...
|
||||
load_font();
|
||||
}
|
||||
|
||||
//
|
||||
// 'Fl_ILM216::~Fl_ILM216()' - Delete an ILM-216 widget.
|
||||
//
|
||||
|
||||
Fl_ILM216::~Fl_ILM216(void)
|
||||
{
|
||||
// Unload the font data...
|
||||
for (int i = 0; i < 256; i++) {
|
||||
if (font_[i]) {
|
||||
delete font_[i];
|
||||
}
|
||||
|
||||
if (outline_[i]) {
|
||||
delete outline_[i];
|
||||
}
|
||||
}
|
||||
delete rec_;
|
||||
delete rec_dark_;
|
||||
delete rec_armed_;
|
||||
delete conn_;
|
||||
delete conn_dark_;
|
||||
}
|
||||
|
||||
int Fl_ILM216::handle(int event)
|
||||
{
|
||||
if (event == FL_RELEASE) {
|
||||
do_callback();
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 'Fl_ILM216::draw()' - Draw the widget.
|
||||
//
|
||||
|
||||
void Fl_ILM216::draw(void)
|
||||
{
|
||||
int i; // Looping var
|
||||
int X = x() + (w() - 16 * 24) / 2; // X base position
|
||||
int Y = y() + (h() - 2 * 40) / 2; // Y base position
|
||||
Fl_Color oc; // Outline color
|
||||
|
||||
// Draw the background...
|
||||
if (backlight_) {
|
||||
draw_box(box(), x(), y(), w(), h(), fl_lighter((Fl_Color)cfg.main.bg_color));
|
||||
oc = fl_color_average((Fl_Color)cfg.main.txt_color, fl_lighter((Fl_Color)cfg.main.bg_color), 0.5f);
|
||||
}
|
||||
else {
|
||||
draw_box(box(), x(), y(), w(), h(), (Fl_Color)cfg.main.bg_color);
|
||||
oc = fl_color_average((Fl_Color)cfg.main.txt_color, (Fl_Color)cfg.main.bg_color, 0.5f);
|
||||
}
|
||||
|
||||
// draw the right line
|
||||
fl_color((Fl_Color)cfg.main.txt_color);
|
||||
|
||||
fl_line_style(FL_SOLID, 1, NULL);
|
||||
fl_line(X + 15 * 25 - 15, Y, X + 15 * 25 - 15, Y + 40 * 2);
|
||||
fl_line_style(0);
|
||||
|
||||
// draw the status symbols
|
||||
if (connected) {
|
||||
conn_->draw(X + 15 * 25 - 5, Y + 8);
|
||||
}
|
||||
else {
|
||||
conn_dark_->draw(X + 15 * 25 - 5, Y + 8);
|
||||
}
|
||||
|
||||
if (recording) {
|
||||
rec_->draw(X + 15 * 25 - 7, Y + 8 + 50);
|
||||
}
|
||||
else if (cfg.rec.start_rec) {
|
||||
rec_armed_->draw(X + 15 * 25 - 7, Y + 8 + 50);
|
||||
}
|
||||
else {
|
||||
rec_dark_->draw(X + 15 * 25 - 7, Y + 8 + 50);
|
||||
}
|
||||
|
||||
// Draw the LCD contents...
|
||||
for (i = 0; i < 16; i++) {
|
||||
fl_color((Fl_Color)cfg.main.txt_color);
|
||||
|
||||
if (font_[chars_[i + 0]]) {
|
||||
font_[chars_[i + 0]]->draw(X + i * 24, Y);
|
||||
}
|
||||
if (font_[chars_[i + 16]]) {
|
||||
font_[chars_[i + 16]]->draw(X + i * 24, Y + 40);
|
||||
}
|
||||
|
||||
fl_color(oc);
|
||||
|
||||
if (outline_[chars_[i + 0]]) {
|
||||
outline_[chars_[i + 0]]->draw(X + i * 24, Y);
|
||||
}
|
||||
if (outline_[chars_[i + 16]]) {
|
||||
outline_[chars_[i + 16]]->draw(X + i * 24, Y + 40);
|
||||
}
|
||||
}
|
||||
fl_g->label_current_listeners->labelcolor((Fl_Color)cfg.main.txt_color);
|
||||
fl_g->label_current_listeners->redraw();
|
||||
}
|
||||
|
||||
//
|
||||
// 'Fl_LCD216::load_char()' - Load a single character in the font.
|
||||
//
|
||||
|
||||
void Fl_ILM216::load_char(uchar ch, // I - Character
|
||||
const uchar *data) // I - 5x8 bitmap data
|
||||
{
|
||||
int i; // Looping var
|
||||
uchar *fdata; // Pointer to font data
|
||||
uchar *odata; // Pointer to outline data
|
||||
|
||||
// Delete the existing character, if any...
|
||||
if (font_[ch]) {
|
||||
delete font_[ch];
|
||||
font_[ch] = 0;
|
||||
}
|
||||
|
||||
if (outline_[ch]) {
|
||||
// delete outline_[ch];
|
||||
outline_[ch] = 0;
|
||||
}
|
||||
|
||||
// Don't need to define blank chars...
|
||||
if (data[0] == 0 && !memcmp(data, data + 1, 7)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a 20x32 bitmap from the 5x8 data, so that it looks like the
|
||||
// LCD display.
|
||||
fdata = fdata_[ch - ' '];
|
||||
odata = odata_[ch - ' '];
|
||||
|
||||
memset(fdata, 0, 96);
|
||||
memset(odata, 0, 96);
|
||||
|
||||
for (i = 0; i < 8; i++, fdata += 12, odata += 12, data++) {
|
||||
// Each bit in the source byte is mapped to a 3x3 "pixel" and a 4x4
|
||||
// "outline" in the LCD bitmap.
|
||||
if (*data & 0x10) {
|
||||
fdata[0] |= 0x07;
|
||||
fdata[3] |= 0x07;
|
||||
fdata[6] |= 0x07;
|
||||
|
||||
odata[0] |= 0x08;
|
||||
odata[3] |= 0x08;
|
||||
odata[6] |= 0x08;
|
||||
odata[9] |= 0x0f;
|
||||
}
|
||||
|
||||
if (*data & 0x08) {
|
||||
fdata[0] |= 0x70;
|
||||
fdata[3] |= 0x70;
|
||||
fdata[6] |= 0x70;
|
||||
|
||||
odata[0] |= 0x80;
|
||||
odata[3] |= 0x80;
|
||||
odata[6] |= 0x80;
|
||||
odata[9] |= 0xf0;
|
||||
}
|
||||
|
||||
if (*data & 0x04) {
|
||||
fdata[1] |= 0x07;
|
||||
fdata[4] |= 0x07;
|
||||
fdata[7] |= 0x07;
|
||||
|
||||
odata[1] |= 0x08;
|
||||
odata[4] |= 0x08;
|
||||
odata[7] |= 0x08;
|
||||
odata[10] |= 0x0f;
|
||||
}
|
||||
|
||||
if (*data & 0x02) {
|
||||
fdata[1] |= 0x70;
|
||||
fdata[4] |= 0x70;
|
||||
fdata[7] |= 0x70;
|
||||
|
||||
odata[1] |= 0x80;
|
||||
odata[4] |= 0x80;
|
||||
odata[7] |= 0x80;
|
||||
odata[10] |= 0xf0;
|
||||
}
|
||||
|
||||
if (*data & 0x01) {
|
||||
fdata[2] |= 0x07;
|
||||
fdata[5] |= 0x07;
|
||||
fdata[8] |= 0x07;
|
||||
|
||||
odata[2] |= 0x08;
|
||||
odata[5] |= 0x08;
|
||||
odata[8] |= 0x08;
|
||||
odata[11] |= 0x0f;
|
||||
}
|
||||
}
|
||||
|
||||
// Create the bitmap image for this char...
|
||||
font_[ch] = new Fl_Bitmap(fdata_[ch - ' '], 20, 32);
|
||||
outline_[ch] = new Fl_Bitmap(odata_[ch - ' '], 20, 32);
|
||||
}
|
||||
|
||||
//
|
||||
// 'Fl_LCD216::load_font()' - Load the standard ILM-216 font.
|
||||
//
|
||||
|
||||
void Fl_ILM216::load_font(void)
|
||||
{
|
||||
// Clear the font list...
|
||||
memset(font_, 0, sizeof(font_));
|
||||
memset(outline_, 0, sizeof(outline_));
|
||||
|
||||
// Load standard font data for 224 chars...
|
||||
for (int i = 0; i < 224; i++)
|
||||
load_char(i + ' ', standard_font[i]);
|
||||
}
|
||||
|
||||
//
|
||||
// 'Fl_LCD216::process()' - Process data like an ILM-216.
|
||||
//
|
||||
|
||||
int Fl_ILM216::print(const uchar *in, int inbytes)
|
||||
{
|
||||
int nbytes;
|
||||
|
||||
// Loop through the input bytes...
|
||||
nbytes = 0;
|
||||
|
||||
for (; inbytes > 0; inbytes--, in++) {
|
||||
if (cursor_pos_ < sizeof(chars_) - 1) {
|
||||
chars_[cursor_pos_++] = *in;
|
||||
|
||||
if (*in == '\n') {
|
||||
cursor_pos_ = 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
redraw();
|
||||
|
||||
// Return the number of bytes of output...
|
||||
return (nbytes);
|
||||
}
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_ILM216.cxx,v 1.8 2003/02/26 01:59:31 easysw Exp $".
|
||||
//
|
||||
106
src/FLTK/Fl_ILM216.h
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
//
|
||||
// "$Id: Fl_ILM216.h,v 1.5 2003/02/26 00:40:22 easysw Exp $"
|
||||
//
|
||||
// ILM-216 LCD emulation widget header file for flcdsim.
|
||||
//
|
||||
// Copyright 2003 by Michael Sweet.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
|
||||
// modified by Daniel Noethen
|
||||
|
||||
#ifndef FL_ILM216_H
|
||||
#define FL_ILM216_H
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
#include <stdint.h>
|
||||
#include <FL/Fl_Widget.H>
|
||||
#include <FL/Fl_Bitmap.H>
|
||||
#include <FL/Fl_Pixmap.H>
|
||||
|
||||
//
|
||||
// Backlight color...
|
||||
//
|
||||
|
||||
#define FL_NOLIGHT (Fl_Color)76
|
||||
#define FL_BACKLIGHT (Fl_Color)85
|
||||
|
||||
//
|
||||
// ILM-216 emulation widget...
|
||||
//
|
||||
|
||||
class Fl_ILM216 : public Fl_Widget {
|
||||
public:
|
||||
enum {
|
||||
CURSOR_NONE = 0,
|
||||
CURSOR_UNDERLINE,
|
||||
CURSOR_BLINK,
|
||||
};
|
||||
|
||||
private:
|
||||
bool backlight_; // Backlight enabled?
|
||||
uchar buttons_; // Current button state
|
||||
uint32_t cursor_pos_; // Cursor position
|
||||
bool cursor_state_; // Cursor state (blinking)
|
||||
int cursor_type_; // Cursor type
|
||||
Fl_Bitmap *font_[256]; // Images for characters
|
||||
Fl_Bitmap *outline_[256]; // Outline images for characters
|
||||
Fl_Pixmap *rec_; // blinks if recording
|
||||
Fl_Pixmap *rec_dark_; // blinks if recording
|
||||
Fl_Pixmap *rec_armed_; // blinks if recording
|
||||
Fl_Pixmap *conn_; // blinks if streaming
|
||||
Fl_Pixmap *conn_dark_; // blinks if streaming
|
||||
uchar fdata_[224][96]; // Bitmap data (20x32)
|
||||
uchar odata_[224][96]; // Outline data (20x32)
|
||||
uchar prev_char_; // Previous character
|
||||
|
||||
void draw(void);
|
||||
void load_char(uchar ch, const uchar *data);
|
||||
void load_font(void);
|
||||
|
||||
public:
|
||||
Fl_ILM216(int X, int Y, int W, int H, const char *L = 0);
|
||||
~Fl_ILM216(void);
|
||||
|
||||
uchar chars_[32]; // Characters on-screen
|
||||
|
||||
virtual int handle(int);
|
||||
|
||||
bool backlight() const { return backlight_; }
|
||||
void backlight(bool b)
|
||||
{
|
||||
backlight_ = b;
|
||||
redraw();
|
||||
}
|
||||
uchar buttons() const { return buttons_; }
|
||||
void buttons(uchar b) { buttons_ = b; }
|
||||
void clear()
|
||||
{
|
||||
for (int i = 0; i < 32; i++)
|
||||
chars_[i] = ' ';
|
||||
home();
|
||||
redraw();
|
||||
}
|
||||
int cursor_pos() const { return cursor_pos_; }
|
||||
void cursor_pos(int p) { cursor_pos_ = p; }
|
||||
void home() { cursor_pos(0); }
|
||||
int print(const uchar *in, int inbytes);
|
||||
};
|
||||
|
||||
#endif // !Fl_ILM216_h
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_ILM216.h,v 1.5 2003/02/26 00:40:22 easysw Exp $".
|
||||
//
|
||||