This commit is contained in:
audioprog 2025-08-13 22:05:17 +02:00
commit 031ca812ad
224 changed files with 98227 additions and 0 deletions

1282
ABOUT-NLS Normal file

File diff suppressed because it is too large Load diff

1
AUTHORS Normal file
View file

@ -0,0 +1 @@
Daniel Nöthen (butt@danielnoethen.de)

339
COPYING Normal file
View 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
View 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 dont 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
View 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
View file

@ -0,0 +1 @@
Please report bugs to butt@danielnoethen.de

20
Makefile.am Normal file
View 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
View 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
View file

@ -0,0 +1 @@
See ChangeLog for more

953
README Normal file
View 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
View 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

File diff suppressed because it is too large Load diff

180
butt.1 Normal file
View 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
View 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

File diff suppressed because it is too large Load diff

197
config.h Normal file
View 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
View 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
View 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

File diff suppressed because it is too large Load diff

12011
configure vendored Executable file

File diff suppressed because it is too large Load diff

278
configure.ac Normal file
View 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
View 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
View 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

Binary file not shown.

BIN
icons/butt.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
icons/butt.xcf Normal file

Binary file not shown.

BIN
icons/butt_yellow.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
icons/icon_128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
icons/icon_128x128@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
icons/icon_16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

BIN
icons/icon_16x16@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
icons/icon_22x22.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
icons/icon_24x24.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
icons/icon_256x256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
icons/icon_256x256@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
icons/icon_32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
icons/icon_32x32@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

BIN
icons/icon_48x48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
icons/icon_512x512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
icons/icon_512x512@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
icons/icon_64x64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
icons/icon_96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

441
icons/icon_scalable.svg Normal file
View 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,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
rkJggg==
"
id="image3063"
x="0"
y="0" />
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Binary file not shown.

BIN
icons/radio_co_badge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

541
install-sh Executable file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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:

Binary file not shown.

View 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
View file

@ -0,0 +1 @@
ar de es fr pt_BR nl

475
po/Makefile.in.in Normal file
View 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
View 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
View 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
View 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

Binary file not shown.

3173
po/ar.po Normal file

File diff suppressed because it is too large Load diff

10
po/boldquot.sed Normal file
View file

@ -0,0 +1,10 @@
s/"\([^"]*\)"/“\1”/g
s/`\([^`']*\)'/\1/g
s/ '\([^`']*\)' / \1 /g
s/ '\([^`']*\)'$/ \1/g
s/^'\([^`']*\)' /\1 /g
s/“”/""/g
s///g
s//”/g
s///g
s///g

2867
po/butt.pot Normal file

File diff suppressed because it is too large Load diff

BIN
po/de.gmo Normal file

Binary file not shown.

3253
po/de.po Normal file

File diff suppressed because it is too large Load diff

25
po/en@boldquot.header Normal file
View 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
View 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

Binary file not shown.

3239
po/es.po Normal file

File diff suppressed because it is too large Load diff

BIN
po/fr.gmo Normal file

Binary file not shown.

3202
po/fr.po Normal file

File diff suppressed because it is too large Load diff

23
po/insert-header.sin Normal file
View 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

Binary file not shown.

3207
po/nl.po Normal file

File diff suppressed because it is too large Load diff

BIN
po/pt_BR.gmo Normal file

Binary file not shown.

3232
po/pt_BR.po Normal file

File diff suppressed because it is too large Load diff

6
po/quot.sed Normal file
View 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
View 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
View file

@ -0,0 +1 @@
timestamp

14
src/AskForMicPermission.h Normal file
View 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
View 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
View 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
View 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
View 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
View 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;
}
}

View 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

View 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

View 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$".
//

View 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
View 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
View 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 $".
//

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