diff options
-rw-r--r-- | .gitignore | 23 | ||||
-rw-r--r-- | COPYING | 674 | ||||
-rw-r--r-- | DEPENDENCIES | 22 | ||||
-rw-r--r-- | INSTALL | 77 | ||||
-rw-r--r-- | Makefile.in | 84 | ||||
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | README | 10 | ||||
-rwxr-xr-x | configure | 48 | ||||
-rw-r--r-- | mk/README | 71 | ||||
-rw-r--r-- | mk/all.mk | 32 | ||||
-rw-r--r-- | mk/clean.mk | 45 | ||||
-rw-r--r-- | mk/configure | 732 | ||||
-rw-r--r-- | mk/copy.mk | 78 | ||||
-rw-r--r-- | mk/dist.mk | 189 | ||||
-rw-r--r-- | mk/empty.mk | 103 | ||||
-rw-r--r-- | mk/i18n.mk | 111 | ||||
-rw-r--r-- | mk/lang-c.mk | 307 | ||||
-rw-r--r-- | mk/lowerpath.mk | 279 | ||||
-rw-r--r-- | mk/man.mk | 111 | ||||
-rw-r--r-- | mk/path.mk | 176 | ||||
-rw-r--r-- | mk/prologue.mk | 16 | ||||
-rw-r--r-- | mk/shell.mk | 233 | ||||
-rw-r--r-- | mk/tags.mk | 25 | ||||
-rw-r--r-- | mk/texinfo.mk | 294 | ||||
-rw-r--r-- | mk/tools.mk | 163 |
25 files changed, 3908 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..892d3ac --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +_/ +/bin/ +/aux/ +/obj/ +\#*\# +.* +!.git* +*~ +*.bak +*.new +*.swo +*.swp +*.out +*.o +*.su +*.gch +*.info +*.pdf +*.ps +*.dvi +/config.status +/Makefile + @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state 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 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/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU 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. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/DEPENDENCIES b/DEPENDENCIES new file mode 100644 index 0000000..cfd6079 --- /dev/null +++ b/DEPENDENCIES @@ -0,0 +1,22 @@ +RUNTIME DEPENDENCIES: + + libc + + +BUILD DEPENDENCIES: + + make + coreutils + cc + texinfo>=4.11 (opt-out, for info, pdf, dvi, ps, and html manuals) + texlive-plainextra (opt-in, for pdf, dvi, and ps manuals) + + texinfo<4.11 can be used if '@frenchspacing on' is removed. + + +INSTALL DEPENDENCIES: + + make + coreutils + texinfo (opt-out, for dir-entry of info manual) + @@ -0,0 +1,77 @@ +Type './configure --help' for configuration options. The normal settings for a +GNU package should work. If not, please make a bug report. + + On a common GNU/Linux distribution the following should + be sufficient for most users: + + ./configure --prefix=/usr + make + make install DESTDIR="somewhere you want the files for now" + # Now let the package manager put the files in place... + + Or for an unstaged install: + + ./configure --prefix=/usr + make + sudo make install + +By default any applicable pre-install, post-install, pre-uninstall, and +post-install commands is run. This suppress these, run 'make' with 'N=true' +or 'N=:'. IF you want to know which these commands are, you can use the +methods specificed in the GNU Coding Standards. Another method is found in +mk/README. However, for this packages, these will be: + + infodir="usr/local/share/info" ## Assuming default prefix. + + post_install () { + install-info -- "${infodir}/libcolour.info" "${infodir}/dir" + } + + pre_uninstall () { + install-info --delete -- "${infodir}/libcolour.info" "${infodir}/dir" + } + + +──────────────────────────────────────────────────────────────────────────────── +CUSTOMISED COMPILATION +──────────────────────────────────────────────────────────────────────────────── + +The makefile is configured to compile the C code with -O2 -g, you can +change this by setting OPTIMISE, or with CFLAGS and LDFLAGS if you want +to change all optional flags compiling and linking flags: + + ./configure OPTIMISE="-Og -g" + + +──────────────────────────────────────────────────────────────────────────────── +CUSTOMISED INSTALLATION +──────────────────────────────────────────────────────────────────────────────── + +If you want to install absolutely everything, you can +instead use the commands below: + + make everything + make install-everything DESTDIR="pkg" + +Or if you only want to absolute basics: + + make base + make install-base DESTDIR="pkg" + +You can select freely what parts of the package to install and not +to install. This rules are available: + +┌─────────────┬─────────────────────┬────────────────────────────────────────────┐ +│ COMPILATION │ INSTALLATION │ DESCRIPTION │ +├─────────────┼─────────────────────┼────────────────────────────────────────────┤ +│ base │ install-base │ Install the basics: │ +│ │ install-lib │ Install the libcolour library. │ +│ │ install-copyright │ Install the the GPL v3 license. │ +│ doc │ install-doc │ Include all manuals: │ +│ info │ install-info │ Include info manual. (Texinfo) │ +│ dvi │ install-dvi │ Include DVI manual. (Texinfo) │ +│ pdf │ install-pdf │ Include PDF manual. (Texinfo) │ +│ ps │ install-ps │ Include PostScript manual. (Texinfo) │ +│ html │ install-html │ Include multifile HTML manual. (Texinfo) │ +└─────────────┴─────────────────────┴────────────────────────────────────────────┘ + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..b735d36 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,84 @@ +# Copyright (C) 2016 Mattias Andrée <maandree@kth.se> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +### This file will be stored to Makefile once you have run ./configure. ### +### See INSTALL for information on how to install this package. ### + + + +##### What is below this line is configurable, but is seldom useful. ##### + + +# Additional options for compiling info and HTML manuals. +INFO_FLAGS = + +# Additional options for compiling DVI, PDF, and PostScript manuals. +TEXINFO_FLAGS = + +# The name of the package as it should be installed. +PKGNAME = libcolour + + + +##### Nothing interesting below this. ##### + + +# In case you want add some configurations. Primarily +# intended for maintainers. Perhaps add GPG_KEY here. +# Of course, you can declare everthing with ./configure, +# but with this you are less likely to forget it. +-include .make-configurations + + +# YOU, AS A USER, SHOULD NOT CHANGE THESE VARIABLES. {{ +# They specify how the reusable makefiles in mk/ shall behave. + +# Package information. +_PROJECT = libcolour +_VERSION = 0.1 + +# Used by mk/lang-c.mk +_C_STD = c99 +_H = libcolour +_HEADER_DIRLEVELS = 1 +_LIB = libcolour +_OBJ_libcolour = libcolour +_SO_VERSION_libcolour = $(_VERSION) +_SO_MAJOR_libcolour = $(shell echo $(_SO_VERSION_libcolour) | cut -d . -f 1) + +# Used by mk/texinfo.mk +_TEXINFO_DIRLEVELS = 2 +_INFOPARTS = 0 +_HAVE_TEXINFO_MANUAL = yes +_HTML_FILES = Free-Software-Needs-Free-Documentation.html GNU-Free-Documentation-License.html \ + GNU-General-Public-License.html index.html Overview.html CLUT-Manipulation.html \ + Colour-Spaces.html + +# Used by mk/man.mk +#_MAN_PAGE_SECTIONS = 0 3 7 +#_MAN_0 = libcolour.h +#_MAN_3 = +#_MAN_7 = libcolour + +# Used by mk/copy.mk +_COPYING = COPYING + +# Used by mk/dist.mk +___EVERYTHING_INFO = autohaltd titlepage-data content hardcopy-copying \ + appx/fdl appx/free-software-needs-free-documentation appx/gpl \ + reusable/macros reusable/paper reusable/titlepage \ + chap/overview chap/clut-manipulation.texinfo chap/colour-spaces.texinfo +_EVERYTHING = $(__EVERYTHING_ALL_COMMON) DEPENDENCIES INSTALL NEWS \ + $(foreach F,$(___EVERYTHING_INFO),doc/info/$(F).texinfo) libcolour.h + +# }} + + +# Reusable make rules and the configurations. +include $(v)mk/all.mk + @@ -0,0 +1,5 @@ +libcolour NEWS -*- outline -*- + +* Noteworthy changes in release 1.0 (TBA) [stable] + + Initial release. @@ -0,0 +1,10 @@ +NAME + libcolour - A C colour space library + +DESCRIPTION + libcolour is C library for colour space conversions. + +SEE ALSO + libclut(7), libred(7), redshift(1), blueshift(1), libgamma(7), + libcoopgamma(7) + diff --git a/configure b/configure new file mode 100755 index 0000000..d1cad10 --- /dev/null +++ b/configure @@ -0,0 +1,48 @@ +#!/bin/sh + +# Copyright (C) 2016 Mattias Andrée <maandree@kth.se> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +# Run './configure --help' for usage information. + + +PKGNAME=libcolour +MAN_SECTION_SUFFIX= + + +list_optional_features_help () +{ + true +} + +unrecognised_argument () +{ + option="${1}" + case "${option}" in + (--build | --target | --host) + incomplete="${option}" ;; + (--build=*) + ;; + (--target=*) + ;; + (--host=*) + ;; + (*) + ;; + esac +} + +. "$(dirname "${0}")"/mk/configure + + +cat <<EOF + +You can now run 'make && make install'. + +EOF + diff --git a/mk/README b/mk/README new file mode 100644 index 0000000..e79926d --- /dev/null +++ b/mk/README @@ -0,0 +1,71 @@ +This is a collection of generic enough makefiles. +Please feel free to use them in your project. + +Usage: + Include all.mk from your makefile. + + Read the top of each file for details. + + Define the variables: + + _VERSION + This version of the package. + + _PROJECT + The name of the project. Must only include [a-z0-9_-]. + + _PROJECT_FULL + The name of the project. May include any character. + + _SRC + All source code files. This list is used when + generating the translation template file. + + _COPYRIGHT_HOLDER + The copyright holder's full name and e-mail address. + + COMMAND + The name of the command. Must not be declared if + the package does not include exactly one runnable + command. + + PKGNAME + The name of the package. + + Variables beginning with __ are used internally by + the files where they appear, or in rare cases, + internally between these files. + + Variables beginning with _ but not __ are set in the + makefile to specify for these files how they should + behave. They should not be changed by a user of the + package. + + Variables that do not begin with _ are configurable + by the user of the package. + + Do no use single character variables in your Makefile. + + To suppress pre-install, post-install, pre-uninstall, + and post-uninstall instructions, set N=true. + PRE_INSTALL, POST_INSTALL, PRE_UNINSTALL, and + POST_UNINSTALL are supportered as specified by the + GNU coding standardars. + + To figure out what pre-install commands to run in your package, run: + make -n a=% install | sed -e 's/\\$//' -e 's/^ *//' | sed -n '/^% /s/^..//p' + + To figure out what post-install commands to run in your package, run: + make -n z=% uninstall | sed -e 's/\\$//' -e 's/^ *//' | sed -n '/^% /s/^..//p' + + To figure out what pre-uninstall commands to run in your package, run: + make -n a=% uninstall | sed -e 's/\\$//' -e 's/^ *//' | sed -n '/^% /s/^..//p' + + To figure out what post-uninstall commands to run in your package, run: + make -n z=% uninstall | sed -e 's/\\$//' -e 's/^ *//' | sed -n '/^% /s/^..//p' + + To suppress verbatim which commands Make runs, + set Q=@. (Excluding the period.) + +Developers should use DEBUG=1 when running make, when possible. + diff --git a/mk/all.mk b/mk/all.mk new file mode 100644 index 0000000..032718d --- /dev/null +++ b/mk/all.mk @@ -0,0 +1,32 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== This file includes all the other files in appropriate order. ===# + + +ifndef Q +A = \e[35m +Z = [m[D +endif + +include $(v)mk/path.mk +include .config.mk +include $(v)mk/path.mk +include $(v)mk/lowerpath.mk +include $(v)mk/empty.mk +include $(v)mk/tools.mk +include $(v)mk/copy.mk +include $(v)mk/lang-c.mk +include $(v)mk/texinfo.mk +include $(v)mk/man.mk +include $(v)mk/i18n.mk +include $(v)mk/clean.mk +include $(v)mk/dist.mk +include $(v)mk/tags.mk +include $(v)mk/prologue.mk + diff --git a/mk/clean.mk b/mk/clean.mk new file mode 100644 index 0000000..1ae4fdc --- /dev/null +++ b/mk/clean.mk @@ -0,0 +1,45 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== These rules are used for cleaning the repository of generated files. ===# + + +# Delete all files are normally created during a build. +.PHONY: clean +clean: clean-dist + @$(PRINTF_INFO) '\e[00;01;31mCLEANING BUILT FILES\e[34m\e[00m\n' + -$(Q)$(RM) -r -- bin aux *.su src/*.su src/*/*.su src/*/*/*.su src/*/*/*/*.su + @$(ECHO) + +# Delete all files that are created during configuration or building. +.PHONY: distclean +distclean: clean + @$(PRINTF_INFO) '\e[00;01;31mCLEANING CONFIGURATIONS\e[34m\e[00m\n' + -$(Q)$(RM) -- .config.mk config.status Makefile + @$(ECHO) + +# Like `make clean` but do not remove massive binaries +# that are seldom recompiled. +.PHONY: mostlyclean +mostlyclean: clean + +# Delete everything except ./configure +.PHONY: maintainer-clean +maintainer-clean: clean distclean + @$(ECHO) + @$(ECHO) 'This command is intended for maintainers to use; it' + @$(ECHO) 'deletes files that may need special tools to rebuild.' + @$(ECHO) + +# Delete all files generated by `make dist` +.PHONY: clean-dist +clean-dist: + @$(PRINTF_INFO) '\e[00;01;31mCLEANING RELEASES\e[34m\e[00m\n' + -$(Q)$(RM) -r -- $(_PROJECT)-*.tar* $(_PROJECT)-*.checksums* $(_PROJECT)-* + @$(ECHO) + diff --git a/mk/configure b/mk/configure new file mode 100644 index 0000000..4b6e61a --- /dev/null +++ b/mk/configure @@ -0,0 +1,732 @@ +# -*- shell-script -*- + +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +# Run './configure --help' for usage information. + + +# FOR DEVELOPERS USING THIS SCRIPT: +# This file is used by include this file, via the . builtin, +# in your ./configure. Before doing so, you must declare +# PKGNAME=the_name_of_your_package +# MAN_SECTION_SUFFIX=default_suffix_to_append_to_man_page_section # (usually empty) +# MAN_SECTION=the_section_your_man_page_is_in # (do no declare if you do not use exacly one section) +# Define the function list_optional_features_help, see the help output. +# Define the function unrecognised_argument to deal with any unrecognised argument. + + + +# Store command for rebuilding Makefile to config.status. +exec 10>config.status + +# Store configurations to .config.mk. +exec 20>.config.mk + + +# Print a quoted (if necessary) version of a string +quote () +{ + value="$1" + if ! test "${value%%\'*}" = "${value}"; then + value="'$(echo "${value}" | sed "s/'/'\\\\''/g")'" + elif ! test "$(printf '%s' ${value})" = "${value}"; then + value="'${value}'" + elif ! test "$(echo ${value}) | tr -d a-zA-Z0-9+_@%/=-" = ""; then + value="'${value}'" + fi + echo "${value}" +} + + +# Parse command line. +incomplete= +dashed= +f_help= +f_gnulinux= +f_bin_merger= +for option; do + if test -n "${incomplete}"; then + option="${incomplete}=${option}" + incomplete= + fi + + # For --{with{,out},{en,dis}able}-*. + feature="${option#--*}" + feature="${feature#*-}" + feature="$(echo "${feature}" | tr a-z- A-Z_)" + + # For directories and filename tweaks. + nodash=_novar + + case "${dashed}${option}" in +# general + (--) + dashed=yes ;; + (--help) + f_help=yes ;; + (--destdir | --destdir=* | --pkgdir | --pkgdir=*) + nodash=destdir ;; + (--srcdir | --srcdir) + nodash=srcdir ;; + +# directory automation + (--gnu-linux) + f_gnulinux=yes ;; + (--bin-merger) + f_bin_merger=yes ;; + +# directories and filenames + (--prefix | --prefix=*) + nodash=prefix ;; + (--exec-prefix | --exec-prefix=* | --exec_prefix | --exec_prefix=*) + nodash=exec_prefix ;; + (--bindir | --bindir=*) + nodash=bindir ;; + (--sbindir | --sbindir=*) + nodash=sbindir ;; + (--libexecdir | --libexecdir=*) + nodash=libexecdir ;; + (--libdir | --libdir=*) + nodash=libdir ;; + (--includedir | --includedir=*) + nodash=includedir ;; + (--oldincludedir | --oldincludedir=*) + nodash=oldincludedir ;; + (--datarootdir | --datarootdir=*) + nodash=datarootdir ;; + (--datadir | --datadir=*) + nodash=datadir ;; + (--libdatarootdir | --libdatarootdir=*) + nodash=libdatarootdir ;; + (--libdatadir | --libdatadir=*) + nodash=libdatadir ;; + (--sysconfdir | --sysconfdir=*) + nodash=sysconfdir ;; + (--sharedstatedir | --=sharedstatedir*) + nodash=sharedstatedir ;; + (--localstatedir | --localstatedir=*) + nodash=localstatedir ;; + (--runstatedir | --runstatedir=*) + nodash=runstatedir ;; + (--lispdir | --lispdir=*) + nodash=lispdir ;; + (--localedir | --localedir=*) + nodash=localedir ;; + (--licensedir | --licensedir=*) + nodash=licensedir ;; + (--emptydir | --emptydir=*) + nodash=emptydir ;; + (--cachedir | --cachedir=*) + nodash=cachedir ;; + (--spooldir | --spooldir=*) + nodash=spooldir ;; + (--logdir | --logdir=*) + nodash=logdir ;; + (--statedir | --statedir=*) + nodash=statedir ;; + (--gamedir | --gamedir=*) + nodash=gamedir ;; + (--sharedcachedir | --sharedcachedir=*) + nodash=sharedcachedir ;; + (--sharedspooldir | --sharedspooldir=*) + nodash=sharedspooldir ;; + (--sharedlogdir | --sharedlogdir=*) + nodash=sharedlogdir ;; + (--sharedstatedir | --sharedstatedir=*) + nodash=sharedstatedir ;; + (--sharedgamedir | --sharedgamedir=*) + nodash=sharedgamedir ;; + (--tmpdir | --tmpdir=*) + nodash=tmpdir ;; + (--localtmpdir | --localtmpdir=*) + nodash=localtmpdir ;; + (--sharedtmpdir | --sharedtmpdir=*) + nodash=sharedtmpdir ;; + (--lockdir | --lockdir=*) + nodash=lockdir ;; + (--skeldir | --skeldir=*) + nodash=skeldir ;; + (--devdir | --devdir=*) + nodash=devdir ;; + (--sysdir | --sysdir=*) + nodash=sysdir ;; + (--procdir | --procdir=*) + nodash=procdir ;; + (--selfprocdir | --selfprocdir=*) + nodash=selfprocdir ;; + (--docdir | --docdir=*) + nodash=docdir ;; + (--infodir | --infodir=*) + nodash=infodir ;; + (--dvidir | --dvidir=*) + nodash=dvidir ;; + (--pdfdir | --pdfdir=*) + nodash=pdfdir ;; + (--psdir | --psdir=*) + nodash=psdir ;; + (--htmldir | --htmldir=*) + nodash=htmldir ;; + (--mandir | --mandir=*) + nodash=mandir ;; + (--man0 | --man0=*) + nodash=man0 ;; + (--man1 | --man1=*) + nodash=man1 ;; + (--man2 | --man2=*) + nodash=man2 ;; + (--man3 | --man3=*) + nodash=man3 ;; + (--man4 | --man4=*) + nodash=man4 ;; + (--man5 | --man5=*) + nodash=man5 ;; + (--man6 | --man6=*) + nodash=man6 ;; + (--man7 | --man7=*) + nodash=man7 ;; + (--man8 | --man8=*) + nodash=man8 ;; + (--man9 | --man9=*) + nodash=man9 ;; + (--man0ext | --man0ext=*) + nodash=man0ext ;; + (--man1ext | --man1ext=*) + nodash=man1ext ;; + (--man2ext | --man2ext=*) + nodash=man2ext ;; + (--man3ext | --man3ext=*) + nodash=man3ext ;; + (--man4ext | --man4ext=*) + nodash=man4ext ;; + (--man5ext | --man5ext=*) + nodash=man5ext ;; + (--man6ext | --man6ext=*) + nodash=man6ext ;; + (--man7ext | --man7ext=*) + nodash=man7ext ;; + (--man8ext | --man8ext=*) + nodash=man8ext ;; + (--man9ext | --man9ext=*) + nodash=man9ext ;; + (--manext | --manext=*) + if test -n "${MAN_SECTION}"; then + nodash=manext + else + printf "\e[01;31m%s: warning: ignoring: %s\e[00m\n" "${0}" "${option}" >&2 + sleep 1 + fi + ;; + +# ignored + # Unrecognised directories, and settings that cannot be used with internationalisation. + (--*dir=* | --*dir | --man?dir | --man?dir=*) + printf "\e[01;31m%s: warning: ignoring: %s\e[00m\n" "${0}" "${option}" >&2 + sleep 1 + ;; + +# feature tweaking + (--with-*) + feature="WITH_${feature}" + echo "${feature}" = yes >&20 + export "${feature}"=yes + option="${option}=x" + ;; + + (--without-*) + feature="WITHOUT_${feature}" + echo "${feature}" = yes >&20 + export "${feature}"=yes + option="${option}=x" + ;; + + (--enable-*=*) + param="${feature#*=}" + feature="${feature%%=*}" + if ! test "${param}" = "no"; then + feature="ENABLE_${feature}" + else + feature="DISABLE_${feature}" + param=yes + fi + echo "${feature}" = "${param}" >&20 + export "${feature}"="${param}" + ;; + + (--enable-*) + feature="DISABLE_${feature}" + echo "${feature}" = yes >&20 + export "${feature}"=yes + option="${option}=x" + ;; + + (--disable-*) + feature="DISABLE_${feature}" + echo "${feature}" = yes >&20 + export "${feature}"=yes + option="${option}=x" + ;; + +# unrecognised + (${dashed}--*) + unrecognised_argument "${option}" + ;; + +# variables + (${dashed}*=*) + var="${option%%=*}" + val="${option#*=}" + if test -n "$(echo "${var}" | tr -d '[_a-zA-Z0-9-]')"; then + # Variable is not used and is potentially not + # formatted in a compatible way. + printf "\e[01;31m%s: warning: ignoring because of bad format: %s\e[00m\n" "${0}" "${option}" >&2 + sleep 1 + fi + echo "${var}" = "${val}" >&20 + ;; + +# unrecognised + (*) + unrecognised_argument "${option}" + ;; + esac + + if test "${option%%=*}" = "${option}"; then + incomplete="${option}" + else + eval "${nodash}=$(quote "${option#*=}")" + eval "have_${nodash}=yes" + fi +done + + +# Print usage information. This is parsed by +# the auto-completion script for ./configure. +if test -n "${f_help}"; then + cat <<EOF +Configure the package (${PKGNAME}) before building and installing. + +OPTIONS + +general + --help Print usage information. + --destdir=DIR Output directory for staged install. + --srcdir=DIR The directory for the sources being compiled. + VARIABLE=VALUE Override a variable in the Makefile. + +directory automation + --gnu-linux Use default configurations for GNU/Linux. + --bin-merger The OS distribution has symlinked sbin to bin for the select exec-prefix. + +tweaking of features +EOF + list_optional_features_help + cat <<EOF + +tweaking of directories and filenames + --prefix=DIR Prefix used for other directories than. + --exec-prefix=DIR Prefix used for /bin, /sbin, /libexec, and /lib. + --bindir=DIR Executable programs that users can run. + --sbindir=DIR Executable administrative programs. + --libexecdir=DIR Executable programs run by other programs and not be users. + --libdir=DIR Object files and libraries of object code. + --includedir=DIR Header files. + --oldincludedir=DIR Header files. Should have the prefix /usr if the canonical prefix is /usr/local. + --datarootdir=DIR Architecture-independent data files. + --datadir=DIR Architecture-independent resource files. + --libdatarootdir=DIR Architecture-dependent data files. + --libdatadir=DIR Architecture-dependent resource files. + --sysconfdir=DIR Machine-local configuration files. + --sharedstatedir=DIR Network-shared architecture-independent state files. + --localstatedir=DIR Machine-local architecture-independent state files. + --runstatedir=DIR Machine-local runtime state files. + --lispdir=DIR Emacs LISP files. + --localedir=DIR Locale-specific message catalogues. + --licensedir=DIR License files. + --emptydir=DIR An always empty directory. + --cachedir=DIR Machine-local cached files. + --spooldir=DIR Machine-local spooled files. + --logdir=DIR Machine-local log files + --statedir=DIR Machine-local persistent state files + --gamedir=DIR Machine-local highscore files. + --sharedcachedir=DIR Network-shared cached files. + --sharedspooldir=DIR Network-shared spooled files. + --sharedlogdir=DIR Network-shared log files + --sharedstatedir=DIR Network-shared persistent state files + --sharedgamedir=DIR Network-shared highscore files. + --tmpdir=DIR Machine-local volatile temporary files. + --localtmpdir=DIR Machine-local persistent temporary files. + --sharedtmpdir=DIR Network-shared temporary files. + --lockdir=DIR Lock files. + --skeldir=DIR User skeleton. + --devdir=DIR Devices and pseudo-devices. + --sysdir=DIR System-information logical file. + --procdir=DIR Process-information logical file. + --selfprocdir=DIR Process-information logical file for the process itself. + --docdir=DIR Documentation files, other then info manuals and man pages. + --infodir=DIR Info manuals. + --dvidir=DIR DVI manuals. + --pdfdir=DIR PDF manuals. + --psdir=DIR PostScript manuals. + --htmldir=DIR HTML manuals. + --mandir=DIR Top-level directory for man pages. + --man0=DIR Basename of the directory for section 0 man pages. + --man1=DIR Basename of the directory for section 1 man pages. + --man2=DIR Basename of the directory for section 2 man pages. + --man3=DIR Basename of the directory for section 3 man pages. + --man4=DIR Basename of the directory for section 4 man pages. + --man5=DIR Basename of the directory for section 5 man pages. + --man6=DIR Basename of the directory for section 6 man pages. + --man7=DIR Basename of the directory for section 7 man pages. + --man8=DIR Basename of the directory for section 8 man pages. + --man9=DIR Basename of the directory for section 9 man pages. +EOF + if test -n "${MAN_SECTION}"; then + cat <<EOF + --manext=EXT Filename suffix for the man page. +EOF + fi + cat <<EOF + --man0ext=EXT Filename suffix for section 0 man pages. + --man1ext=EXT Filename suffix for section 1 man pages. + --man2ext=EXT Filename suffix for section 2 man pages. + --man3ext=EXT Filename suffix for section 3 man pages. + --man4ext=EXT Filename suffix for section 4 man pages. + --man5ext=EXT Filename suffix for section 5 man pages. + --man6ext=EXT Filename suffix for section 6 man pages. + --man7ext=EXT Filename suffix for section 7 man pages. + --man8ext=EXT Filename suffix for section 8 man pages. + --man9ext=EXT Filename suffix for section 9 man pages. +EOF + exit 0 +fi + + +# Set unset directories to their default. +defdir () +{ + p="$(quote "${2}")" + if ! test -n "$(eval echo '${have_'"${1}"'}')"; then + eval "${1}=${p}" + fi +} +if test -n "${f_gnulinux}"; then + defdir prefix "/usr" + _prefix= + case ${prefix} in + ('' | / | /usr | /usr/ | /games | /games | /usr/games | /usr/games/) + _infix= + ;; + (/usr/local | /usr/local/ | /usr/local/games | /usr/local/games/) + _infix=/local + ;; + (/opt/*) + _infix=${prefix} + ;; + (*) + # This probably means somewhere in /home, we do not + # checked because we do not know what else to do. + _infix= + _prefix="${prefix}" + ;; + esac + defdir sysconfdir "${_prefix}/etc${_infix}" + defdir sharedstatedir "${_prefix}/com${_infix}" + defdir localstatedir "${_prefix}/var${_infix}" + defdir runstatedir "${_prefix}/run${_infix}" + defdir tmpdir "${_prefix}/tmp${_infix}" +else + defdir prefix "/usr/local" + defdir sysconfdir "${prefix}/etc" + defdir sharedstatedir "${prefix}/com" + defdir localstatedir "${prefix}/var" + defdir runstatedir "${localstatedir}/run" + defdir tmpdir "${prefix}/tmp" +fi +defdir exec_prefix "${prefix}" +defdir bindir "${exec_prefix}/bin" +if test -n "${f_bin_merger}"; then + defdir sbindir "${bindir}" +else + defdir sbindir "${exec_prefix}/sbin" +fi +defdir libexecdir "${exec_prefix}/libexec" +defdir libdir "${exec_prefix}/lib" +defdir includedir "${prefix}/include" +defdir oldincludedir "${includedir}" +defdir datarootdir "${prefix}/share" +defdir datadir "${datarootdir}" +defdir libdatarootdir "${libdir}" +defdir libdatadir "${libdir}" +defdir lispdir "${datarootdir}/emacs/site-lisp" +defdir localedir "${datarootdir}/locale" +defdir licensedir "${datarootdir}/licenses" +defdir cachedir "${localstatedir}/cache" +defdir spooldir "${localstatedir}/spool" +defdir emptydir "${localstatedir}/empty" +defdir logdir "${localstatedir}/log" +defdir statedir "${localstatedir}/lib" +defdir gamedir "${localstatedir}/games" +defdir sharedcachedir "${sharedstatedir}/cache" +defdir sharedpooldir "${sharedstatedir}/spool" +defdir sharedlogdir "${sharedstatedir}/log" +defdir sharedstatedir "${sharedstatedir}/lib" +defdir sharedgamedir "${sharedstatedir}/games" +defdir localtmpdir "${localstatedir}/tmp" +defdir sharedtmpdir "${sharedstatedir}/tmp" +defdir lockdir "${runstatedir}/lock" +defdir skeldir "${sysconfdir}/skel" +defdir devdir "/dev" +defdir sysdir "/sys" +defdir procdir "/proc" +defdir selfprocdir "${procdir}/self" +defdir docdir "${datarootdir}/doc/${PKGNAME}" +defdir infodir "${datarootdir}/info" +defdir dvidir "${docdir}" +defdir pdfdir "${docdir}" +defdir psdir "${docdir}" +defdir htmldir "${docdir}" +defdir mandir "${datarootdir}/man" +defdir man0 "man0${MAN_SECTION_SUFFIX}" +defdir man1 "man1${MAN_SECTION_SUFFIX}" +defdir man2 "man2${MAN_SECTION_SUFFIX}" +defdir man3 "man3${MAN_SECTION_SUFFIX}" +defdir man4 "man4${MAN_SECTION_SUFFIX}" +defdir man5 "man5${MAN_SECTION_SUFFIX}" +defdir man6 "man6${MAN_SECTION_SUFFIX}" +defdir man7 "man7${MAN_SECTION_SUFFIX}" +defdir man8 "man8${MAN_SECTION_SUFFIX}" +defdir man9 "man9${MAN_SECTION_SUFFIX}" +if test -n "${MAN_SECTION}" && ! test -n "$(eval echo '${man'"${MAN_SECTION}"'ext}')"; then + defdir "man${MAN_SECTION}ext" "$(eval echo '${man'"${MAN_SECTION}"'ext}')" +fi +defdir man0ext ".0" +defdir man1ext ".1" +defdir man2ext ".2" +defdir man3ext ".3" +defdir man4ext ".4" +defdir man5ext ".5" +defdir man6ext ".6" +defdir man7ext ".7" +defdir man8ext ".8" +defdir man9ext ".9" + +# Found source directory. +if ! test -n "${srcdir}"; then + if test -f "Makefile.in"; then + : + elif test -f "${PWD}/Makefile.in"; then + srcdir="${PWD}" + elif test -f "${PWD}/../Makefile.in"; then + srcdir="${PWD}/.." + fi +fi +if test -n "${srcdir}"; then + srcdir="$(realpath "${srcdir}")/" + srcdir_proper="${srcdir}" + srcdir="$(quote "${srcdir}")" +fi +if ! test -f "${srcdir_proper}Makefile.in"; then + echo "${0}: error: cannot found source directory." + exit 1 +fi + + +# Add shebang and "generated"-comment to config.status. +echo '#!/bin/sh' >&10 +echo >&10 +echo '# This file was generated by ./configure, its purpose is two-fold:' >&10 +echo '# 1) It lets you rebuild Makefile with the same configurations you' >&10 +echo '# used last time you run ./configure.' >&10 +echo '# 2) It lets Makefile rebuild itself transparently when out of date.' >&10 +echo >&10 + +# config.status should adjust CWD. +echo 'cd "$(dirname "${0}")"' >&10 + +# config.status calls ./configure with all arguments you called ./configure. +printf "exec %s" "${0}" >&10 +for option; do + printf " %s" "$(quote "${option}")" >&10 +done +echo >&10 + +# Close config.status. +exec 10>&- + + +# Store environment (with restrictions). +env | while read line; do + var="${line%%=*}" + val="${line#*=}" + if test "${var}" = "${line}"; then + # Malformated variables. (Can happen!, sigh...) + continue + elif test -n "$(echo "${var}" | tr -d '[_a-zA-Z0-9-]')"; then + # Variable is not used and is potentially not + # formatted in a compatible way. + continue + fi + case "${var}" in + (_ | PWD | SHELL | SHLVL | TERM | COLORTERM | MAKEFLAGS) + # We do not want to propagate these. + ;; + (*) + echo "${var}" = "${val}" >&20 + ;; + esac +done + +# Store directories and filenames. +if test -n "${destdir}"; then + echo DESTDIR = "${destdir}" >&20 +fi +echo PREFIX = "${prefix}" >&20 +echo SYSCONFDIR = "${sysconfdir}" >&20 +echo COMDIR = "${sharedstatedir}" >&20 +echo VARDIR = "${localstatedir}" >&20 +echo RUNDIR = "${runstatedir}" >&20 +echo TMPDIR = "${tmpdir}" >&20 +echo DEVDIR = "${devdir}" >&20 +echo SYSDIR = "${sysdir}" >&20 +echo PROCDIR = "${procdir}" >&20 +echo EXEC_PREFIX = "${exec_prefix}" >&20 +echo BINDIR = "${bindir}" >&20 +echo SBINDIR = "${sbindir}" >&20 +echo LIBEXECDIR = "${libexecdir}" >&20 +echo LIBDIR = "${libdir}" >&20 +echo INCLUDEDIR = "${includedir}" >&20 +echo OLDINCLUDEDIR = "${oldincludedir}" >&20 +echo DATADIR = "${datarootdir}" >&20 +echo RESDIR = "${datadir}" >&20 +echo SYSDEPDATADIR = "${libdatarootdir}" >&20 +echo SYSDEPRESDIR = "${libdatadir}" >&20 +echo LISPDIR = "${lispdir}" >&20 +echo LOCALEDIR = "${localedir}" >&20 +echo LICENSEDIR = "${licensedir}" >&20 +echo CACHEDIR = "${cachedir}" >&20 +echo SPOOLDIR = "${spooldir}" >&20 +echo EMPTYDIR = "${emptydir}" >&20 +echo LOGDIR = "${logdir}" >&20 +echo STATEDIR = "${statedir}" >&20 +echo GAMEDIR = "${gamedir}" >&20 +echo COMCACHEDIR = "${sharedcachedir}" >&20 +echo COMPOOLDIR = "${sharedpooldir}" >&20 +echo COMLOGDIR = "${sharedlogdir}" >&20 +echo COMSTATEDIR = "${sharedstatedir}" >&20 +echo COMGAMEDIR = "${sharedgamedir}" >&20 +echo LOCALTMPDIR = "${localtmpdir}" >&20 +echo SHAREDTMPDIR = "${sharedtmpdir}" >&20 +echo LOCKDIR = "${lockdir}" >&20 +echo SKELDIR = "${skeldir}" >&20 +echo SELFPROCDIR = "${selfprocdir}" >&20 +echo DOCDIR = "${docdir}" >&20 +echo INFODIR = "${infodir}" >&20 +echo DVIDIR = "${dvidir}" >&20 +echo PDFDIR = "${pdfdir}" >&20 +echo PSDIR = "${psdir}" >&20 +echo HTMLDIR = "${htmldir}" >&20 +echo MANDIR = "${mandir}" >&20 +echo MAN0 = "${man0}" >&20 +echo MAN1 = "${man1}" >&20 +echo MAN2 = "${man2}" >&20 +echo MAN3 = "${man3}" >&20 +echo MAN4 = "${man4}" >&20 +echo MAN5 = "${man5}" >&20 +echo MAN6 = "${man6}" >&20 +echo MAN7 = "${man7}" >&20 +echo MAN8 = "${man8}" >&20 +echo MAN9 = "${man9}" >&20 +echo MAN0EXT = "${man0ext}" >&20 +echo MAN1EXT = "${man1ext}" >&20 +echo MAN2EXT = "${man2ext}" >&20 +echo MAN3EXT = "${man3ext}" >&20 +echo MAN4EXT = "${man4ext}" >&20 +echo MAN5EXT = "${man5ext}" >&20 +echo MAN6EXT = "${man6ext}" >&20 +echo MAN7EXT = "${man7ext}" >&20 +echo MAN8EXT = "${man8ext}" >&20 +echo MAN9EXT = "${man9ext}" >&20 + +# Close .config.mk. +exec 20>&- + +# Now, make Makefile available. +if test -f Makefile; then + chmod u+w Makefile # This scripts makes it read-only. +fi +exec 30>Makefile +echo "# ----------------------------------------------------- #" >&30 +echo "# This file was created by ./configure from Makefile.in #" >&30 +echo "# ----------------------------------------------------- #" >&30 +echo >&30 +if test -n "${srcdir}"; then + echo v = "${srcdir}" >&30 +fi +cat "${srcdir_proper}"Makefile.in >&30 +exec 30>&- + + +# config.status should be executable. +chmod a+x config.status + +# Makefile should be read-only to ones does not edit it by mistake. +chmod a-w Makefile + + +# Help functions for the parent script. +test_with () +{ + with="$(eval echo '${WITH_'"${1}"'}')" + without="$(eval echo '${WITHOUT_'"${1}"'}')" + if ! test -n "${with}" && ! test -n "${without}"; then + echo "${2}" + elif ! test -n "${with}" && test -n "${without}"; then + echo "no" + elif test -n "${with}" && ! test -n "${without}"; then + echo "yes" + elif test "${2}" = yes; then + echo "no" + else + echo "yes" + fi +} +test_enable () +{ + enable="$(eval echo '${ENABLE_'"${1}"'}')" + disable="$(eval echo '${DISABLE_'"${1}"'}')" + if ! test -n "${enable}" && ! test -n "${disable}"; then + echo "${2}" + elif ! test -n "${enable}" && test -n "${disable}"; then + echo "no" + elif test -n "${enable}" && ! test -n "${disable}"; then + echo "${enable}" + elif test "${2}" = yes ; then + echo "no" + else + echo "${enable}" + fi +} + + +# After including this file, you may want +# to do something like: +# +# cat <<EOF +# +# Enabled features, see ${0} for more infomation: +# +# Internationalisation $(test_with GETTEXT yes) +# GNU Bash tab-completion $(test_with BASH yes) +# Fish tab-completion $(test_with FISH yes) +# Z shell tab-completion $(test_with ZSH yes) +# +# You can now run 'make && make install'. +# +# EOF + diff --git a/mk/copy.mk b/mk/copy.mk new file mode 100644 index 0000000..c9067a4 --- /dev/null +++ b/mk/copy.mk @@ -0,0 +1,78 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== These rules are used for legal files. ===# + + +# Enables the rules: +# install-copyright Install all files in _COPYING and _LICENSE +# install-copying Install all files in _COPYING +# install-license Install all files in _LICENSE + + +# WHEN TO BUILD, INSTALL, AND UNINSTALL: + +install-base: install-copyright +uninstall: uninstall-copyright + + +# INSTALL RULES: + +.PHONY: install-copyright +install-copyright: + +ifdef _COPYING +.PHONY: install-copyright +install-copyright: install-copying + +.PHONY: install-copying +install-copying: $(foreach F,$(_COPYING),$(v)$(F)) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" + @$(ECHO_EMPTY) +endif + +ifdef _LICENSE +.PHONY: install-copyright +install-copyright: install-license + +.PHONY: install-license +install-license: $(foreach F,$(_LICENSE),$(v)$(F)) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" + @$(ECHO_EMPTY) +endif + + +# UNINSTALL RULES: + +.PHONY: uninstall-copyright +uninstall-copyright: + +ifdef _COPYING +.PHONY: uninstall-copyright +uninstall-copyright: uninstall-copying + +.PHONY: uninstall-copying +uninstall-copying: + -$(Q)$(RM) -- $(foreach F,$(_COPYING),"$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)/$(F)") + -$(Q)$(RMDIR) -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" +endif + +ifdef _LICENSE +.PHONY: uninstall-copyright +uninstall-copyright: uninstall-license + +.PHONY: uninstall-license +uninstall-license: + -$(Q)$(RM) -- $(foreach F,$(_LICENSE),"$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)/$(F)") + -$(Q)$(RMDIR) -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" +endif + diff --git a/mk/dist.mk b/mk/dist.mk new file mode 100644 index 0000000..9f8c48b --- /dev/null +++ b/mk/dist.mk @@ -0,0 +1,189 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== These rules are used for making releases. ===# + + +# CONFIGURATIONS: + +# Formats for packages to generate. +DIST_FORMATS = tar tar.xz tar.bz2 tar.gz + +# Define DO_NOT_SIGN if you do not want sign the release. + +# You can select checksums to generate: +# Declaring NO_BSD_SUM will omit `sum -r`. +# Declaring NO_SYSV_SUM will omit `sum -s`. +# List all checksum programs, that do not require any flags, in DIST_CHECKSUMS. + +# Any missing flags for GnuPG? +GPG_FLAGS = + +# What key should be used for signing? +GPG_KEY ?= + +# You should define _EVERYTHING to enumerate all files that belong in +# the release tarball, lest 'git archive' will be used as a fallback. + + + +# HELP VARIALES: + +# You may use these to help list all files in _EVERYTHING +__EVERYTHING_COMMON = $(_COPYING) $(_LICENSE) README +__EVERYTHING_SRC = $(foreach F,$(_SRC),src/$(F)) +__EVERYTHING_LOCALE = $(foreach L,$(LOCALES),po/$(L).po) +__EVERYTHING_SHELL = $(foreach F,$(_AUTO_COMPLETE),src/$(F).auto-completion) \ + $(foreach F,$(_AUTO_COMPLETE),$(foreac F,$(_SHELL_LOCALES),src/$(F).$(L),auto-completion)) +__EVERYTHING_MK_ = all clean copy dist empty i18n lang-c lowerpath man path prologue shell tags texinfo tools +__EVERYTHING_MK = $(foreach F,$(__EVERYTHING_MK_),mk/$(F).mk) mk/configure mk/README configure Makefile.in +__EVERYTHING_MAN = $(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(S)),doc/man/$(P).$(S))) \ + $(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach L,$(MAN_LOCALES),$(foreach P,$(_MAN_$(L)_$(S)),doc/man/$(P).$(L).$(S)))) +__EVERYTHING_ALL_COMMON = $(__EVERYTHING_COMMON) $(__EVERYTHING_MK) $(__EVERYTHING_MAN) \ + $(__EVERYTHING_LOCALE) $(__EVERYTHING_SRC) $(__EVERYTHING_SHELL) +# This one (__todo) if you have a todo file, but do not want it to be greped. +__TO__ = TO +__DO__ = DO +__todo = $(__TO__)$(__DO__) + + +# The packages and there detached signatures (if any.) +ifndef DO_NOT_SIGN +__DIST_FILES = $(foreach F,$(DIST_FORMATS),$(_PROJECT)-$(_VERSION).$(F) $(_PROJECT)-$(_VERSION).$(F).sig) +endif +ifdef DO_NOT_SIGN +__DIST_FILES = $(foreach F,$(DIST_FORMATS),$(_PROJECT)-$(_VERSION).$(F)) +endif + +# All known checksum programs that are unambiguous. +__DIST_CHECKSUMS_ALL = cksum md2sum md4sum md5sum md6sum sha0sum sha1sum sha224sum \ + sha256sum sha384sum sha512sum sha512-224sum sha512-256sum \ + sha3-224sum sha3-256sum sha3-384sum sha3-512sum shake256sum \ + shake512sum rawshake256sum rawshake512sum keccak-224sum \ + keccak-256sum keccak-384sum keccak-512sum keccaksum + +# All installed checksum programs that are unambiguous. +DIST_CHECKSUMS = $(foreach C,$(__DIST_CHECKSUMS_ALL),$(shell if command -v $(C) >/dev/null; then $(ECHO) $(C); fi)) + + + +# MAKE RULES: + +# Generate release files. (Tarballs, compressed and uncompressed; signatures; checksums.) +.PHONY: dist +dist: dist-balls dist-checksums + + + +# HELP MAKE RULES: + +# Generate tarballs, compressed and uncompressed, +.PHONY: dist-balls +dist-balls: $(__DIST_FILES) + +ifndef DO_NOT_SIGN +# Generate checksums and signature of checksums. +.PHONY: dist-checksums +dist-checksums: $(_PROJECT)-$(_VERSION).checksums $(_PROJECT)-$(_VERSION).checksums.sig + +# Generate uncompressed tarball and signature of it. +.PHONY: dist-tar +dist-tar: $(_PROJECT)-$(_VERSION).tar $(_PROJECT)-$(_VERSION).tar.sig + +# Generate xz-copressed tarball and signature of it. +.PHONY: dist-xz +dist-xz: $(_PROJECT)-$(_VERSION).tar.xz $(_PROJECT)-$(_VERSION).tar.xz.sig + +# Generate bz2-copressed tarball and signature of it. +.PHONY: dist-bzip2 +dist-bz2: $(_PROJECT)-$(_VERSION).tar.bz2 $(_PROJECT)-$(_VERSION).tar.bz2.sig + +# Generate gzip-copressed tarball and signature of it. +.PHONY: dist-gz +dist-gz: $(_PROJECT)-$(_VERSION).tar.gz $(_PROJECT)-$(_VERSION).tar.sig +endif +ifdef DO_NOT_SIGN +# Generate checksums, but no signature. +.PHONY: dist-checksums +dist-checksums: $(_PROJECT)-$(_VERSION).checksums + +# Generate uncompressed tarball, but no signature. +.PHONY: dist-tar +dist-tar: $(_PROJECT)-$(_VERSION).tar + +# Generate xz-compressed tarball, but no signature. +.PHONY: dist-xz +dist-xz: $(_PROJECT)-$(_VERSION).tar.xz + +# Generate bzip2-compressed tarball, but no signature. +.PHONY: dist-bz2 +dist-bz2: $(_PROJECT)-$(_VERSION).tar.bz2 + +# Generate gzip-compressed tarball, but no signature. +.PHONY: dist-gz +dist-gz: $(_PROJECT)-$(_VERSION).tar.gz +endif + +# Generate the tarball for the release. +ifdef v +__GIT_DIR = --git-dir=$(v) +endif +$(_PROJECT)-$(_VERSION).tar: $(foreach F,$(_EVERYTHING),$(v)$(F)) + @$(PRINTF_INFO) '\e[00;01;31mTAR\e[34m %s\e[00m$A\n' "$@" + @if $(TEST) -f $@; then $(RM) $@; fi +ifndef _EVERYTHING + $(Q)git archive --prefix=$(_PROJECT)-$(_VERSION)/ --format=tar $(__GIT_DIR) $(_VERSION) -o $@ #$Z +endif +ifdef _EVERYTHING + $(Q)$(LN) -s . $(_PROJECT)-$(_VERSION) + $(Q)$(TAR) c -- $(foreach F,$(_EVERYTHING),$(v)$(_PROJECT)-$(_VERSION)/$(F)) > $@ + $(Q)$(RM) $(_PROJECT)-$(_VERSION) +endif + @$(ECHO_EMPTY) + +# Compression rule for xz-compression. Used on the tarball. +%.xz: % + @$(PRINTF_INFO) '\e[00;01;31mXZ\e[34m %s\e[00m$A\n' "$@" + @if $(TEST) -f $@; then $(RM) $@; fi + $(Q)$(XZ_COMPRESS) $< #$Z + @$(ECHO_EMPTY) + +# Compression rule for bzip2-compression. Used on the tarball. +%.bz2: % + @$(PRINTF_INFO) '\e[00;01;31mBZIP2\e[34m %s\e[00m$A\n' "$@" + @if $(TEST) -f $@; then $(RM) $@; fi + $(Q)$(BZIP2_COMPRESS) $< #$Z + @$(ECHO_EMPTY) + +# Compression rule for gzip-compression. Used on the tarball. +%.gz: % + @$(PRINTF_INFO) '\e[00;01;31mGZIP\e[34m %s\e[00m$A\n' "$@" + @if $(TEST) -f $@; then $(RM) $@; fi + $(Q)$(GZIP_COMPRESS) $< #$Z + @$(ECHO_EMPTY) + +# Generate checksums of tarballs, compressed and uncompressed, and of their detached signatures. +$(_PROJECT)-$(_VERSION).checksums: $(__DIST_FILES) + @$(PRINTF_INFO) '\e[00;01;31mCHECKSUM\e[34m %s\e[00m\n' "$@" + @$(PRINTF) '' > $@ +ifndef NO_BSD_SUM + @if ! ($(ECHO) ':: sum -r ::' && sum -r $^ && $(ECHO)) >> $@ ; then $(PRINTF) '' > $@; fi +endif +ifndef NO_SYSV_SUM + @if ! ($(ECHO) ':: sum -s ::' && sum -s $^ && $(ECHO)) >> $@ ; then $(PRINTF) '' > $@; fi +endif + @$(foreach C,$(DIST_CHECKSUMS),$(ECHO) ':: $(C) ::' >> $@ && $(C) $^ | $(GREP) -v '^--' >> $@ && $(ECHO) >> $@ &&) $(TRUE) + @$(ECHO_EMPTY) + +# Signing rule. Used on the tarballs, compressed and uncompressed, and on the checksum file. +%.sig: % + @$(PRINTF_INFO) '\e[00;01;31mSIG\e[34m %s\e[00m$A\n' "$@" + @if $(TEST) -f $@; then $(RM) $@; fi + $(Q)$(GPG) $(GPG_FLAGS) --local-user $(GPG_KEY) --detach-sign --armor --output $@ < $< #$Z + @$(ECHO_EMPTY) + diff --git a/mk/empty.mk b/mk/empty.mk new file mode 100644 index 0000000..fd684f6 --- /dev/null +++ b/mk/empty.mk @@ -0,0 +1,103 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== This file includes empty rules that are filled by other files. ===# + + +.PHONY: all +all: + +.PHONY: everything +everything: + +.PHONY: base +base: + +.PHONY: cmd +cmd: + +.PHONY: lib +lib: + +.PHONY: doc +doc: + + +.PHONY: check +check: + + +.PHONY: install +install: + +.PHONY: install-everything +install-everything: + +.PHONY: install-base +install-base: + +.PHONY: install-cmd +install-cmd: + +.PHONY: install-lib +install-lib: + +.PHONY: install-doc +install-doc: + + +.PHONY: installcheck +installcheck: + + +.PHONY: uninstall +uninstall: + + + +.PHONY: all +all: base + +.PHONY: everything +everything: base + +.PHONY: base +base: cmd lib + + +.PHONY: install +install: install-base + +.PHONY: install-everything +install-everything: install-base + +.PHONY: install-base +install-base: install-cmd install-lib + + + +.PHONY: install-strip +install-strip: __STRIP = -s +install-strip: install + +.PHONY: install-everything-strip +install-everything-strip: __STRIP = -s +install-everything-strip: install-everything + +.PHONY: install-base-strip +install-base-strip: __STRIP = -s +install-base-strip: install-base + +.PHONY: install-cmd-strip +install-cmd-strip: __STRIP = -s +install-cmd-strip: install-cmd + +.PHONY: install-lib-strip +install-lib-strip: __STRIP = -s +install-lib-strip: install-lib + diff --git a/mk/i18n.mk b/mk/i18n.mk new file mode 100644 index 0000000..ed6ec79 --- /dev/null +++ b/mk/i18n.mk @@ -0,0 +1,111 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== These rules are used for internationalisation. ===# + + +# Enables the rules: +# locale Build all translations. +# update-po Update all .po files for further translation. +# install-locale Install all locales. +# +# "All locales" are those listed in LOCALES. +# If LOCALES is not defined, this file is ignored. +# +# If WITHOUT_GETTEXT is defined, `locale` and +# `install-locale` will not do anything. +# +# _SRC should list all sources files, excluding the src/ +# at the beginning of the pathnames. + + +ifdef LOCALES + + +# WHEN TO BUILD, INSTALL, AND UNINSTALL: + +all: locale +everything: locale +install: install-locale +install-everything: install-locale +uninstall: uninstall-locale + + +# BUILD RULES: + +# Build all translations. +ifdef WITHOUT_GETTEXT +.PHONY: locale +locale: +endif +ifndef WITHOUT_GETTEXT +.PHONY: locale +locale: $(foreach L,$(LOCALES),bin/mo/$(L)/messages.mo) +endif + +# Update all translation files for further translation. +.PHONY: update-po +update-po: $(foreach L,$(LOCALES),po/$(L).po) + +# Generate template for translations. +aux/$(_PROJECT).pot: $(foreach S,$(_SRC),$(v)src/$(S)) + @$(PRINTF_INFO) '\e[00;01;31mPOT\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p aux + $(Q)$(CPP) -DUSE_GETTEXT=1 $^ | \ + $(XGETTEXT) -o "$@" -Lc --from-code utf-8 --package-name "$(_PROJECT_FULL)" \ + --package-version $(_VERSION) --no-wrap --force-po \ + --copyright-holder '$(_COPYRIGHT_HOLDER)' - #$Z + @$(ECHO_EMPTY) + +# Create or update a translation file. +po/%.po: aux/$(_PROJECT).pot + @$(PRINTF_INFO) '\e[00;01;31mPO\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p po + $(Q)if ! $(TEST) -e $@; then \ + $(MSGINIT) --no-translator --no-wrap -i aux/$(_PROJECT).pot -o $@ -l $*; \ + else \ + $(MSGMERGE) --no-wrap -U $@ aux/$(_PROJECT).pot; \ + fi #$Z + @$(TOUCH) $@ + @$(ECHO_EMPTY) + +# Compile a translation file. +bin/mo/%/messages.mo: $(v)po/%.po + @$(PRINTF_INFO) '\e[00;01;31mMO\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p bin/mo/$* + $(Q)cd bin/mo/$* && $(MSGFMT) $(__back3unless_v)$< #$Z + @$(ECHO_EMPTY) + + +# INSTALL RULES: + +# Install all locales. +ifdef WITHOUT_GETTEXT +.PHONY: install-locale +install-locale: +endif +ifndef WITHOUT_GETTEXT +.PHONY: install-locale +install-locale: $(foreach L,$(LOCALES),bin/mo/$(L)/messages.mo) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL) -dm755 -- $(foreach L,$(LOCALES),"$(DESTDIR)$(LOCALEDIR)/$(L)/LC_MESSAGES") + $(Q)$(foreach L,$(LOCALES),$(INSTALL_DATA) bin/mo/$(L)/messages.mo -- "$(DESTDIR)$(LOCALEDIR)/$(L)/LC_MESSAGES/$(PKGNAME).mo" &&) $(TRUE) + @$(ECHO_EMPTY) +endif + + +# UNINSTALL RULES: + +# Uninstall all locales. +.PHONY: uninstall-locale +uninstall-locale: + -$(Q)$(RM) -- $(foreach L,$(LOCALES),"$(DESTDIR)$(LOCALEDIR)/$(L)/LC_MESSAGES/$(PKGNAME).mo") + + +endif + diff --git a/mk/lang-c.mk b/mk/lang-c.mk new file mode 100644 index 0000000..e96c0b3 --- /dev/null +++ b/mk/lang-c.mk @@ -0,0 +1,307 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== This file includes rules for C programs. ===# + + +# This file is ignored unless _C_STD is defined. +# _C_STD should be set the the version of C that +# is used. +# +# If you want to compile with -pedantic, define +# the variable _PEDANTIC. +# +# Define _CPPFLAGS with any additional CPP +# flags to use, _CFLAGS with any additional CC +# flags to use, and _LDFLAGS with any additional +# LD flags to use. +# +# Defined in path.mk, you can change _ALL_DIRS +# if you do not want CPP definitions for all +# directories. +# +# Define _HEADER_DIRLEVELS to specify the directory +# nesting level in src. It is assumed that all +# directories contain header files. Set to '0' if +# there are no header files. +# +# _BIN shall list all commands to build. These +# should be the basenames. For each command +# you should be the variable _OBJ_$(COMMAND) +# that lists all objects files (without the +# suffix and without the aux/ prefix) that +# are required to build the command. +# +# Binary you want installed to /sbin rather than +# /bin shall be listed in _SBIN rather than in +# _BIN. _SBIN and _BIN may not list binaries +# with identical names. Analogically, you may +# add _LIBEXEC for binary to be installed to +# /libexec. +# +# If you only have one binary, you may select +# to define _BINDIR to name the variable with +# the pathname for the directory the binary +# shall be installed. For example, if you want +# the binary to be installed to /usr/sbin, +# define _BINDIR = SBINDIR. +# +# List libraries to compile in in _LIB. For each +# library, sould should also define +# _SO_VERSION_$(LIBRARY) and _SO_MAJOR_$(LIBRARY) +# with the full version number and the major +# version number, respectively. Additionally, +# list all header files that shall be installed +# in _H, these should not contain the 'src/' prefix +# or the '.h' suffix. + + +ifdef _C_STD + + + +# HELP VARIABLES: + +# Figure out whether the GCC is being used. +ifeq ($(shell $(PRINTF) '%s\n' ${CC} | $(HEAD) -n 1),gcc) +__USING_GCC = 1 +endif + +# Are there any commands? +ifdef _BIN +__HAVE_CMD_C = 1 +endif +ifdef _SBIN +__HAVE_CMD_C = 1 +endif +ifdef _LIBEXEC +__HAVE_CMD_C = 1 +endif + + +# WHEN TO BUILD, INSTALL, AND UNINSTALL: + +ifdef __HAVE_CMD_C +cmd: cmd-c +install-cmd: install-cmd-c +uninstall: uninstall-cmd-c +endif +ifdef _LIB +lib: lib-c +install-lib: install-lib-c +uninstall: uninstall-lib-c +endif + + +# BUILD VARIABLES: + +# Optimisation settings for C code compilation. +ifndef OPTIMISE +ifndef DEBUG +OPTIMISE = -O2 -g +endif +ifdef DEBUG +ifdef __USING_GCC +OPTIMISE = -Og -g +endif +ifndef __USING_GCC +OPTIMISE = -g +endif +endif +endif + +# Warning settings for C code compilation. +ifdef _PEDANTIC +_PEDANTIC = -pedantic +endif +ifndef WARN +ifndef DEBUG +WARN = -Wall +endif +ifdef DEBUG +ifdef __USING_GCC +WARN = -Wall -Wextra $(_PEDANTIC) -Wdouble-promotion -Wformat=2 -Winit-self -Wmissing-include-dirs \ + -Wtrampolines -Wmissing-prototypes -Wmissing-declarations -Wnested-externs \ + -Wno-variadic-macros -Wsync-nand -Wunsafe-loop-optimizations -Wcast-align \ + -Wdeclaration-after-statement -Wundef -Wbad-function-cast -Wwrite-strings -Wlogical-op \ + -Wstrict-prototypes -Wold-style-definition -Wpacked -Wvector-operation-performance \ + -Wunsuffixed-float-constants -Wsuggest-attribute=const -Wsuggest-attribute=noreturn \ + -Wsuggest-attribute=format -Wnormalized=nfkc -fstrict-aliasing -fipa-pure-const -ftree-vrp \ + -fstack-usage -funsafe-loop-optimizations -Wshadow -Wredundant-decls -Winline -Wcast-qual \ + -Wsign-conversion -Wstrict-overflow=5 -Wconversion -Wsuggest-attribute=pure -Wswitch-default \ + -Wstrict-aliasing=1 -fstrict-overflow -Wfloat-equal -Wpadded -Waggregate-return \ + -Wtraditional-conversion +endif +ifndef __USING_GCC +WARN = -Wall -Wextra $(_PEDANTIC) +endif +endif +endif + +# Support for internationalisation? +ifndef WITHOUT_GETTEXT +_CPPFLAGS += -D'USE_GETTEXT=1' +endif + +# Add CPP definitions for all directories. +_CPPFLAGS += $(foreach D,$(_ALL_DIRS),-D'$(D)="$($(D))"') + +# Compilation and linking flags, and command. +ifndef CPPFLAGS +CPPFLAGS = +endif +ifndef CFLAGS +CFLAGS = $(OPTIMISE) $(WARN) +endif +ifndef LDFLAGS +LDFLAGS = $(OPTIMISE) $(WARN) +endif +__CC = $(CC) -std=$(_C_STD) -c $(_CPPFLAGS) $(_CFLAGS) +__LD = $(CC) -std=$(_C_STD) $(_LDFLAGS) +__CC_POST = $(CPPFLAGS) $(CFLAGS) $(EXTRA_CPPFLAGS) $(EXTRA_CFLAGS) +__LD_POST = $(LDFLAGS) $(EXTRA_LDFLAGS) + +# Header files. +__H = +ifdef _HEADER_DIRLEVELS +ifeq ($(_HEADER_DIRLEVELS),1) +__H += src/*.h +endif +ifneq ($(_HEADER_DIRLEVELS),1) +ifeq ($(_HEADER_DIRLEVELS),2) +__H += src/*.h +__H += src/*/*.h +endif +ifneq ($(_HEADER_DIRLEVELS),2) +ifneq ($(_HEADER_DIRLEVELS),0) +__H += $(foreach W,$(shell $(SEQ) $(_HEADER_DIRLEVELS) | while read n; do $(ECHO) $$($(SEQ) $$n)" " | $(SED) 's/[^ ]* /\/\*/g'; done | $(XARGS) $(ECHO)),src$(W).h) +endif +endif +endif +endif + +# Directory for the binary if there is only one binary. +ifndef _BINDIR +_BINDIR = BINDIR +endif + + +# BUILD RULES: + +.PHONY: cmd-c +cmd-c: $(foreach B,$(_BIN) $(_SBIN) $(_LIBEXEC),bin/$(B)) + +.PHONY: lib-c +lib-c: $(foreach B,$(_LIB),bin/$(B).so) + +# Compile a C file into an object file for a command. +aux/%.o: $(v)src/%.c $(foreach H,$(__H),$(v)$(H)) + @$(PRINTF_INFO) '\e[00;01;31mCC\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p $(shell $(DIRNAME) $@) + $(Q)$(__CC) -o $@ $< $(__CC_POST) #$Z + @$(ECHO_EMPTY) + +# Compile a C file into an object file for a library. +aux/%.pic.o: $(v)src/%.c $(foreach H,$(__H),$(v)$(H)) + @$(PRINTF_INFO) '\e[00;01;31mCC\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p $(shell $(DIRNAME) $@) + $(Q)$(__CC) -fPIC -o $@ $< $(__CC_POST) #$Z + @$(ECHO_EMPTY) + +# Link object files into a library. +# Dependencies are declared below. +bin/%.so: + @$(PRINTF_INFO) '\e[00;01;31mLD\e[34m %s\e[00;32m$A\n' "$@" + @$(MKDIR) -p bin + $(Q)$(__LD) -shared -Wl,-soname,$*.so.$(_SO_MAJOR_$*) -o $@ $^ $(__LD_POST) #$Z + @$(ECHO_EMPTY) + +# Link object files into a command. +# Dependencies are declared below. +bin/%: + @$(PRINTF_INFO) '\e[00;01;31mLD\e[34m %s\e[00;32m$A\n' "$@" + @$(MKDIR) -p bin + $(Q)$(__LD) -o $@ $^ $(__LD_POST) #$Z + @$(ECHO_EMPTY) + +# Dependencies for the rule above. +include aux/lang-c.mk +aux/lang-c.mk: Makefile + @$(MKDIR) -p aux + @$(ECHO) > aux/lang-c.mk + @$(foreach B,$(_BIN) $(_SBIN) $(_LIBEXEC),$(ECHO) bin/$(B): $(foreach O,$(_OBJ_$(B)),aux/$(O).o) >> aux/lang-c.mk &&) $(TRUE) + @$(foreach B,$(_LIB),$(ECHO) bin/$(B).so: $(foreach O,$(_OBJ_$(B)),aux/$(O).pic.o) >> aux/lang-c.mk &&) $(TRUE) + + +# INSTALL RULES: + +.PHONY: install-cmd-c +install-cmd-c: $(foreach B,$(_BIN) $(_SBIN) $(_LIBEXEC),bin/$(B)) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" +ifndef COMMAND +ifdef _BIN + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(BINDIR)" + $(Q)$(INSTALL_PROGRAM) $(__STRIP) $(foreach B,$(_BIN),bin/$(B)) -- "$(DESTDIR)$(BINDIR)" +endif +ifdef _SBIN + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(SBINDIR)" + $(Q)$(INSTALL_PROGRAM) $(__STRIP) $(foreach B,$(_SBIN),bin/$(B)) -- "$(DESTDIR)$(SBINDIR)" +endif +ifdef _LIBEXEC + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(LIBEXECDIR)/$(PKGNAME)" + $(Q)$(INSTALL_PROGRAM) $(__STRIP) $(foreach B,$(_LIBEXEC),bin/$(B)) -- "$(DESTDIR)$(LIBEXECDIR)/$(PKGNAME)" +endif +endif +ifdef COMMAND + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$($(_BINDIR))" + $(Q)$(INSTALL_PROGRAM) $(__STRIP) $^ -- "$(DESTDIR)$($(_BINDIR))/$(COMMAND)" +endif + @$(ECHO_EMPTY) + +.PHONY: install-lib-c +install-lib-c: $(foreach B,$(_LIB),bin/$(B).so) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(LIBDIR)" + $(Q)$(foreach B,$(_LIB),$(LN) -sf -- "$(B).so.$(_SO_VERSION_$(B))" "$(DESTDIR)$(LIBDIR)/$(B).so.$(_SO_MAJOR_$(B))" &&) $(TRUE) + $(Q)$(foreach B,$(_LIB),$(INSTALL_PROGRAM) $(foreach B,$(_LIB),bin/$(B).so) -- "$(DESTDIR)$(LIBDIR)/$(B).so.$(_SO_VERSION_$(B))" &&) $(TRUE) + $(Q)$(foreach B,$(_LIB),$(LN) -sf -- "$(B).so.$(_SO_VERSION_$(B))" "$(DESTDIR)$(LIBDIR)/$(B).so" &&) $(TRUE) + $(Q)$(INSTALL_DIR) -- $(foreach H,$(_H),"$(DESTDIR)$(INCLUDEDIR)/$(shell $(DIRNAME) "$(H)")") + $(Q)$(foreach H,$(_H),$(INSTALL_DATA) "src/$(H).h" -- "$(DESTDIR)$(INCLUDEDIR)/$(H).h" &&) $(TRUE) + @$(ECHO_EMPTY) + + +# UNINSTALL RULES: + +.PHONY: uninstall-cmd-c +uninstall-cmd-c: +ifdef COMMAND + -$(Q)$(RM) -- "$(DESTDIR)$($(_BINDIR))/$(COMMAND)" +endif +ifndef COMMAND +ifdef _BIN + -$(Q)$(RM) -- $(foreach B,$(_BIN),"$(DESTDIR)$(BINDIR)/$(B)") +endif +ifdef _SBIN + -$(Q)$(RM) -- $(foreach B,$(_SBIN),"$(DESTDIR)$(SBINDIR)/$(B)") +endif +ifdef _LIBEXEC + -$(Q)$(RM) -- $(foreach B,$(_LIBEXEC),"$(DESTDIR)$(LIBEXECDIR)/$(PKGNAME)/$(B)") + -$(Q)$(RMDIR) -- "$(DESTDIR)$(LIBEXECDIR)/$(PKGNAME)" +endif +endif + +.PHONY: uninstall-lib-c +uninstall-lib-c: + -$(Q)$(RM) -- $(foreach B,$(_LIB),"$(DESTDIR)$(LIBDIR)/$(B).so") + -$(Q)$(RM) -- $(foreach B,$(_LIB),"$(DESTDIR)$(LIBDIR)/$(B).so.$(_SO_MAJOR_$(B))") + -$(Q)$(RM) -- $(foreach B,$(_LIB),"$(DESTDIR)$(LIBDIR)/$(B).so.$(_SO_VERSION_$(B))") + -$(Q)$(RM) -- $(foreach H,$(_H),"$(DESTDIR)$(INCLUDEDIR)/$(H).h") + -$(Q)$(foreach H,$(_H),if ! $(TEST) "$(shell $(ECHO) "$(H)" | $(CUT) -d / -f 1)" = "$(H)"; then $(RMDIR) -- "$(DESTDIR)$(INCLUDEDIR)/$(shell $(DIRNAME) "$(H)")"; fi;) + +endif + diff --git a/mk/lowerpath.mk b/mk/lowerpath.mk new file mode 100644 index 0000000..77b3542 --- /dev/null +++ b/mk/lowerpath.mk @@ -0,0 +1,279 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== This file overrides values uppercase path variables with values lowercase path variables. ===# + + +ifdef srcdir +VPATH = $(srcdir) +endif + +ifdef prefix +PREFIX = $(prefix) +endif + +ifdef sysconfdir +SYSCONFDIR = $(sysconfdir) +endif + +ifdef sharedstatedir +COMDIR = $(sharedstatedir) +endif + +ifdef localstatedir +VARDIR = $(localstatedir) +endif + +ifdef runstatedir +RUNDIR = $(runstatedir) +endif + +ifdef tmpdir +TMPDIR = $(tmpdir) +endif + +ifdef devdir +DEVDIR = $(devdir) +endif + +ifdef sysdir +SYSDIR = $(sysdir) +endif + +ifdef procdir +PROCDIR = $(procdir) +endif + +ifdef exec_prefix +EXEC_PREFIX = $(exec_prefix) +endif + +ifdef bindir +BINDIR = $(bindir) +endif + +ifdef sbindir +SBINDIR = $(sbindir) +endif + +ifdef libexecdir +LIBEXECDIR = $(libexecdir) +endif + +ifdef libdir +LIBDIR = $(libdir) +endif + +ifdef includedir +INCLUDEDIR = $(includedir) +endif + +ifdef oldincludedir +OLDINCLUDEDIR = $(oldincludedir) +endif + +ifdef datarootdir +DATADIR = $(datarootdir) +endif + +ifdef datadir +RESDIR = $(datadir) +endif + +ifdef libdatarootdir +SYSDEPDATADIR = $(libdatarootdir) +endif + +ifdef libdatadir +SYSDEPRESDIR = $(libdatadir) +endif + +ifdef lispdir +LISPDIR = $(lispdir) +endif + +ifdef localedir +LOCALEDIR = $(localedir) +endif + +ifdef licensedir +LICENSEDIR = $(licensedir) +endif + +ifdef cachedir +CACHEDIR = $(cachedir) +endif + +ifdef spooldir +SPOOLDIR = $(spooldir) +endif + +ifdef emptydir +EMPTYDIR = $(emptydir) +endif + +ifdef logdir +LOGDIR = $(logdir) +endif + +ifdef statedir +STATEDIR = $(statedir) +endif + +ifdef gamedir +GAMEDIR = $(gamedir) +endif + +ifdef sharedcachedir +COMCACHEDIR = $(sharedcachedir) +endif + +ifdef sharedpooldir +COMPOOLDIR = $(sharedpooldir) +endif + +ifdef sharedlogdir +COMLOGDIR = $(sharedlogdir) +endif + +ifdef sharedlogdir +COMSTATEDIR = $(sharedstatedir) +endif + +ifdef sharedgamedir +COMGAMEDIR = $(sharedgamedir) +endif + +ifdef localtmpdir +VARTMPDIR = $(localtmpdir) +endif + +ifdef sharedtmpdir +COMTMPDIR = $(sharedtmpdir) +endif + +ifdef lockdir +LOCKDIR = $(lockdir) +endif + +ifdef skeldir +SKELDIR = $(skeldir) +endif + +ifdef selfprocdir +SELFPROCDIR = $(selfprocdir) +endif + +ifdef docdir +DOCDIR = $(docdir) +endif + +ifdef infodir +INFODIR = $(infodir) +endif + +ifdef dvidir +DVIDIR = $(dvidir) +endif + +ifdef pdfdir +PDFDIR = $(pdfdir) +endif + +ifdef psdir +PSDIR = $(psdir) +endif + +ifdef htmldir +HTMLDIR = $(htmldir) +endif + +ifdef mandir +MANDIR = $(mandir) +endif + +ifdef man0 +MAN0 = $(man0) +endif + +ifdef man1 +MAN1 = $(man1) +endif + +ifdef man2 +MAN2 = $(man2) +endif + +ifdef man3 +MAN3 = $(man3) +endif + +ifdef man4 +MAN4 = $(man4) +endif + +ifdef man5 +MAN5 = $(man5) +endif + +ifdef man6 +MAN6 = $(man6) +endif + +ifdef man7 +MAN7 = $(man7) +endif + +ifdef man8 +MAN8 = $(man8) +endif + +ifdef man9 +MAN9 = $(man9) +endif + +ifdef man0ext +MAN0EXT = $(man0ext) +endif + +ifdef man1ext +MAN1EXT = $(man1ext) +endif + +ifdef man2ext +MAN2EXT = $(man2ext) +endif + +ifdef man3ext +MAN3EXT = $(man3ext) +endif + +ifdef man4ext +MAN4EXT = $(man4ext) +endif + +ifdef man5ext +MAN5EXT = $(man5ext) +endif + +ifdef man6ext +MAN6EXT = $(man6ext) +endif + +ifdef man7ext +MAN7EXT = $(man7ext) +endif + +ifdef man8ext +MAN8EXT = $(man8ext) +endif + +ifdef man9ext +MAN9EXT = $(man9ext) +endif + diff --git a/mk/man.mk b/mk/man.mk new file mode 100644 index 0000000..acde35e --- /dev/null +++ b/mk/man.mk @@ -0,0 +1,111 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== These rules are used for man pages. ===# + + +# Enables the rules: +# install-man Install all man page +# install-man-untranslated Install untranslated man page +# install-man-locale Install translated man page +# +# This file is ignored unless _MAN_PAGE_SECTIONS +# is defined. _MAN_PAGE_SECTIONS should list all +# used man page sections. For all used sections +# there should also be a variable named +# _MAN_$(SECTION) that lists the suffixless +# basename of all man pages in that section. +# +# The pathname of a man page should look +# like this: doc/man/$(DOCUMENT).$(SECTION) +# Translations looks like this: +# doc/man/$(DOCUMENT).$(LANGUAGE).$(SECTION) +# +# For each language and section, there should +# be a variable _MAN_$(LANGUAGE)_$(SECTION) +# that lists all translated documents in that +# section and for that lanuage. These should +# be suffixless basenames. The lanuage counts +# as a suffix. +# +# The translations of the man pages to +# install should be specified, by language, +# in the variable MAN_LOCALES. + + +ifdef _MAN_PAGE_SECTIONS + + +# WHEN TO BUILD, INSTALL, AND UNINSTALL: + +install: install-man +install-everything: install-man +install-doc: install-man +uninstall: uninstall-man + + +# HELP VARIABLES + +# Customisable man page filename. +ifdef COMMAND +ifeq ($(shell $(PRINTF) '%s\n' $(COMMAND) | $(WC) -l),1) +ifeq ($(shell $(PRINTF) '%s\n' $(_MAN_PAGE_SECTIONS) | $(WC) -l),1) +ifeq ($(shell $(PRINTF) '%s\n' $(_MAN_$(_MAN_PAGE_SECTIONS)) | $(WC) -l),1) +__MAN_COMMAND = $(COMMAND)$(MAN$(_MAN_PAGE_SECTIONS)EXT) +endif +endif +endif +endif + + +# INSTALL RULES: + +.PHONY: install-man +install-man: install-man-untranslated install-man-locale + +.PHONY: install-man-untranslated +install-man-untranslated: + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- $(foreach S,$(_MAN_PAGE_SECTIONS),"$(DESTDIR)$(MANDIR)/$(MAN$(S))") +ifndef __MAN_COMMAND + $(Q)$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(S)),$(INSTALL_DATA) $(v)doc/man/$(P).$(S) -- "$(DESTDIR)$(MANDIR)/$(MAN$(S))/$(P)$(MAN$(S)EXT)" &&)) $(TRUE) +endif +ifdef __MAN_COMMAND + $(Q)$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(S)),$(INSTALL_DATA) $(v)doc/man/$(P).$(S) -- "$(DESTDIR)$(MANDIR)/$(MAN$(S))/$(__MAN_COMMAND)" &&)) $(TRUE) +endif + @$(ECHO_EMPTY) + +.PHONY: install-man-locale +install-man-locale: + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(foreach L,$(MAN_LOCALES),$(INSTALL_DIR) -- $(foreach S,$(_MAN_PAGE_SECTIONS),"$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))") &&) $(TRUE) +ifndef __MAN_COMMAND + $(Q)$(foreach L,$(MAN_LOCALES),$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(L)_$(S)),$(INSTALL_DATA) $(v)doc/man/$(P).$(L).$(S) -- "$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))/$(P)$(MAN$(S)EXT)" &&))) $(TRUE) +endif +ifdef __MAN_COMMAND + $(Q)$(foreach L,$(MAN_LOCALES),$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(L)_$(S)),$(INSTALL_DATA) $(v)doc/man/$(P).$(L).$(S) -- "$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))/$(__MAN_COMMAND)" &&))) $(TRUE) +endif + @$(ECHO_EMPTY) + + +# UNINSTALL RULES: + +.PHONY: uninstall-man +uninstall-man: +ifndef __MAN_COMMAND + -$(Q)$(RM) -- $(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(S)),"$(DESTDIR)$(MANDIR)/$(MAN$(S))/$(P).$(MAN$(S)EXT)")) + -$(Q)$(RM) -- $(foreach L,$(MAN_LOCALES),$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(L)_$(S)),"$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))/$(P)$(MAN$(S)EXT)"))) +endif +ifdef __MAN_COMMAND + -$(Q)$(RM) -- "$(DESTDIR)$(MANDIR)/$(MAN$(_MAN_PAGE_SECTIONS))/$(__MAN_COMMAND)" + -$(Q)$(RM) -- $(foreach L,$(MAN_LOCALES),$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(L)_$(S)),"$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))/$(__MAN_COMMAND)"))) +endif + + +endif + diff --git a/mk/path.mk b/mk/path.mk new file mode 100644 index 0000000..9d9d855 --- /dev/null +++ b/mk/path.mk @@ -0,0 +1,176 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== This file define path variables. ===# + + +ifndef __PATH_MK_INCLUDED +__PATH_MK_INCLUDED = 1 + + +# DIRECTORIES: + +# The package path prefix, if you want to install to another root, set DESTDIR to that root. +PREFIX = /usr +# The package path prefix for /bin, /sbin, /lib and /libexec. +EXEC_PREFIX = /usr +# The command path excluding prefix. +BIN = /bin +# The administration command path excluding prefix. +SBIN = /sbin +# The library path excluding prefix. +LIB = /lib +# The executable library path excluding prefix. +LIBEXEC = /libexec +# The header-file path excluding prefix. +INCLUDE = /include +# The resource path excluding prefix. +DATA = /share +# The man page sections path excluding prefix. +MAN0 = /man0 +MAN1 = /man1 +MAN2 = /man2 +MAN3 = /man3 +MAN4 = /man4 +MAN5 = /man5 +MAN6 = /man6 +MAN7 = /man7 +MAN8 = /man8 +MAN9 = /man9 + +# The command path including prefix. +BINDIR = $(EXEC_PREFIX)$(BIN) +# The administration command path including prefix. +SBINDIR = $(EXEC_PREFIX)$(SBIN) +# The library path including prefix. +LIBDIR = $(EXEC_PREFIX)$(LIB) +# The executable library path including prefix. +LIBEXECDIR = $(EXEC_PREFIX)$(LIBEXEC) +# The header-file path including prefix. +INCLUDEDIR = $(PREFIX)$(INCLUDE) +# The header-file path including prefix. Must not be /usr/local. +ifeq ($(PREFIX),/usr/lcoal) +OLDINCLUDEDIR = /usr$(INCLUDE) +endif +ifneq ($(PREFIX),/usr/lcoal) +OLDINCLUDEDIR = $(PREFIX)$(INCLUDE) +endif +# The data path including prefix. +DATADIR = $(PREFIX)$(DATA) +# The architecture-dependent data path including prefix. +SYSDEPDATADIR = $(DATADIR) +# The resource path including prefix. +RESDIR = $(DATADIR) +# The architecture-dependent resource path including prefix. +SYSDEPRESDIR = $(RESDIR) +# The generic documentation path including prefix. +DOCDIR = $(DATADIR)/doc/$(PKGNAME) +# The info manual documentation path including prefix. +INFODIR = $(DATADIR)/info +# The DVI documentation path including prefix. +DVIDIR = $(DOCDIR) +# The PDF documentation path including prefix. +PDFDIR = $(DOCDIR) +# The PostScript documentation path including prefix. +PSDIR = $(DOCDIR) +# The HTML documentation path including prefix. +HTMLDIR = $(DOCDIR) +# The man page documentation path including prefix. +MANDIR = $(DATADIR)/man +# The Emacs LISP path including prefix. +LISPDIR = $(DATADIR)/emacs/site-lisp +# The locale path including prefix. +LOCALEDIR = $(DATADIR)/locale +# The license base path including prefix. +LICENSEDIR = $(DATADIR)/licenses +# The persistent variable data directory. +VARDIR = /var +# The persistent directory for temporary files. +VARTMPDIR = $(VARDIR)/tmp +# The network-common persistent variable data directory. +COMDIR = /com +# The network-common persistent directory for temporary files. +COMTMPDIR = $(COMDIR)/tmp +# The transient directory for temporary files. +TMPDIR = /tmp +# The transient directory for runtime files. +RUNDIR = /run +# The directory for site-specific configurations. +SYSCONFDIR = /etc +# The directory for pseudo-devices. +DEVDIR = /dev +# The /sys directory. +SYSDIR = /sys +# The /proc directory +PROCDIR = /proc +# The /proc/self directory +SELFPROCDIR = $(PROCDIR)/self +# The cache directory. +CACHEDIR = $(VARDIR)/cache +# The spool directory. +SPOOLDIR = $(VARDIR)/spool +# The empty directory. +EMPTYDIR = $(VARDIR)/empty +# The logfile directory. +LOGDIR = $(VARDIR)/log +# The state directory. +STATEDIR = $(VARDIR)/lib +# The highscore directory. +GAMEDIR = $(VARDIR)/games +# The lockfile directory. +LOCKDIR = $(RUNDIR)/lock +# The user skeleton directory. +SKELDIR = $(SYSCONFDIR)/skel +# The network-common cache directory. +COMCACHEDIR = $(COMDIR)/cache +# The network-common spool directory. +COMSPOOLDIR = $(COMDIR)/spool +# The network-common logfile directory. +COMLOGDIR = $(COMDIR)/log +# The network-common state directory. +COMSTATEDIR = $(COMDIR)/lib +# The network-common highscore directory. +COMGAMEDIR = $(COMDIR)/games + + +# FILENAME SUFFIXES: + +# Filename suffixes for man pages by section. +MAN0EXT = .0 +MAN1EXT = .1 +MAN2EXT = .2 +MAN3EXT = .3 +MAN4EXT = .4 +MAN5EXT = .5 +MAN6EXT = .6 +MAN7EXT = .7 +MAN8EXT = .8 +MAN9EXT = .9 + + +# HELP VARIABLES: + +# All path variables that includes the prefix, +# or are unaffected by the prefix. +_ALL_DIRS = BINDIR SBINDIR LIBDIR LIBEXECDIR INCLUDEDIR DATADIR SYSDEPDATADIR DOCDIR \ + INFODIR DVIDIR PDFDIR PSDIR HTMLDIR MANDIR LOCALEDIR LICENSEDIR VARDIR \ + RESDIR VARTMPDIR COMDIR COMTMPDIR TMPDIR RUNDIR SYSCONFDIR DEVDIR SYSDIR \ + PROCDIR SELFPROCDIR CACHEDIR SPOOLDIR EMPTYDIR LOGDIR STATEDIR GAMEDIR \ + LOCKDIR SKELDIR COMCACHEDIR COMSPOOLDIR COMLOGDIR COMSTATEDIR COMGAMEDIR \ + SYSDEPRESDIR OLDINCLUDEDIR + +# ../, ../../, and ../../../, ignored if v is used, which if an absolute path. +ifndef v +__back1unless_v = ../ +__back2unless_v = ../../ +__back3unless_v = ../../../ +endif + + +endif + diff --git a/mk/prologue.mk b/mk/prologue.mk new file mode 100644 index 0000000..5d9a558 --- /dev/null +++ b/mk/prologue.mk @@ -0,0 +1,16 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== This file includes rules for automatically rebuilding the makefile. ===# + + +base: Makefile + +Makefile: $(v)Makefile.in config.status $(v)configure $(v)mk/configure + ./config.status + diff --git a/mk/shell.mk b/mk/shell.mk new file mode 100644 index 0000000..2747152 --- /dev/null +++ b/mk/shell.mk @@ -0,0 +1,233 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== These rules are used for shell tab-completion using auto-auto-complete. ===# + + +# Enables the rules: +# shell Build tab-completion for all supported shells +# bash Build GNU Bash tab-completion +# fish Build fish tab-completion +# zhs Build Z shell tab-completion +# install-shell Install tab-completion for all supported shells +# install-bash Install GNU Bash tab-completion +# install-fish Install fish tab-completion +# install-zsh Install Z shell tab-completion +# +# This file is ignored unless +# _AUTO_COMPLETE is defined. +# +# _AUTO_COMPLETE shall list all commands that +# have an auto-auto-complete. These should be +# named src/$(COMMAND).auto-completion, where +# $(COMMAND) is the command with the script. +# If all auto-auto-complete scripts translations +# named src/$(COMMAND).$(LOCALE).auto-completion, +# SHELL_LOCALE can be set to install exactly +# on translation in place of the non-translated +# versions. +# +# Although not used by this file, you should +# define _SHELL_LOCALES that lists all available +# translations. (it is used by dist.mk.) +# +# You should also define _WITH_SHELL if you +# want shell tab-completion unless the user +# specifies otherwise. If you want it for +# just some shells, define _WITH_$(SHELL) +# for those shells instead of _WITH_SHELL. + + +ifdef _AUTO_COMPLETE + + +# HELP VARIABLES: + +# Include all that were not explicitly excluded? +ifdef _WITH_SHELL +_WITH_BASH = 1 +_WITH_FISH = 1 +_WITH_ZSH = 1 +endif + +# Include for GNU Bash? +ifdef WITH_BASH +__WITH_BASH = 1 +endif +ifndef WITH_BASH +ifndef WITHOUT_BASH +ifdef _WITH_BASH +__WITH_BASH = 1 +endif +endif +endif + +# Include for fish? +ifdef WITH_FISH +__WITH_FISH = 1 +endif +ifndef WITH_FISH +ifndef WITHOUT_FISH +ifdef _WITH_FISH +__WITH_FISH = 1 +endif +endif +endif + +# Include for Z Shell? +ifdef WITH_ZSH +__WITH_ZSH = 1 +endif +ifndef WITH_ZSH +ifndef WITHOUT_ZSH +ifdef _WITH_ZSH +__WITH_ZSH = 1 +endif +endif +endif + +# WHEN TO BUILD, INSTALL, AND UNINSTALL: + +all: shell +everything: shell +install: install-shell +install-doc: install-info install-dvi install-pdf install-ps install-html +uninstall: uninstall-shell + +shell: +install-shell: + +ifdef __WITH_BASH +shell: bash +install-shell: install-bash +endif +ifdef __WITH_FISH +shell: fish +install-shell: install-fish +endif +ifdef __WITH_ZSH +shell: zsh +install-shell: install-zsh +endif + + +# HELP VARIABLES: + +# Affixes on the source files. +ifdef SHELL_LOCALE +__AAC_L = .$(SHELL_LOCALE) +endif +__AAC = $(__AAC_L).auto-completion + +# Customised command name. +ifdef COMMAND +ifeq ($(shell $(PRINTF) '%s\n' $(COMMAND) | $(WC) -l),1) +ifeq ($(shell $(PRINTF) '%s\n' $(_AUTO_COMPLETE) | $(WC) -l),1) +__SHELL_COMMAND = "command=$(COMMAND)" +endif +endif +endif + + +# BUILD RULES: + +# Built tab-completion scripts for GNU Bash. +.PHONY: bash +bash: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).bash-completion) + +# Built tab-completion scripts for fish. +.PHONY: fish +fish: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).fish-completion) + +# Built tab-completion scripts for Z shell. +.PHONY: zsh +zsh: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).zsh-completion) + +# Built a tab-completion script for GNU Bash. +bin/%.bash-completion: $(v)src/%$(__AAC) + @$(PRINTF_INFO) '\e[00;01;31mAUTO-AUTO-COMPLETE\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p bin + $(Q)$(AUTO_AUTO_COMPLETE) bash -o $@ -s $< $(__SHELL_COMMAND) #$Z + @$(ECHO_EMPTY) + +# Built a tab-completion script for fish. +bin/%.fish-completion: $(v)src/%$(__AAC) + @$(PRINTF_INFO) '\e[00;01;31mAUTO-AUTO-COMPLETE\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p bin + $(Q)$(AUTO_AUTO_COMPLETE) fish -o $@ -s $< $(__SHELL_COMMAND) #$Z + @$(ECHO_EMPTY) + +# Built a tab-completion script for Z shell. +bin/%.zsh-completion: $(v)src/%$(__AAC) + @$(PRINTF_INFO) '\e[00;01;31mAUTO-AUTO-COMPLETE\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p bin + $(Q)$(AUTO_AUTO_COMPLETE) zsh -o $@ -s $< $(__SHELL_COMMAND) #$Z + @$(ECHO_EMPTY) + + +# INSTALL RULES: + +# Install tab-completion scripts for GNU Bash. +.PHONY: install-bash +install-bash: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).bash-completion) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(DATADIR)/bash-completion/completions" +ifndef __SHELL_COMMAND + $(Q)$(foreach F,$(_AUTO_COMPLETE),$(INSTALL_DATA) bin/$(F).bash-completion -- "$(DESTDIR)$(DATADIR)/bash-completion/completions/$(F)" &&) $(TRUE) +endif +ifdef __SHELL_COMMAND + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(DATADIR)/bash-completion/completions/$(COMMAND)" +endif + @$(ECHO_EMPTY) + +# Install tab-completion scripts for fish. +.PHONY: install-fish +install-fish: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).fish-completion) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(DATADIR)/fish/completions" +ifndef __SHELL_COMMAND + $(Q)$(foreach F,$(_AUTO_COMPLETE),$(INSTALL_DATA) bin/$(F).fish-completion -- "$(DESTDIR)$(DATADIR)/fish/completions/$(F).fish" &&) $(TRUE) +endif +ifdef __SHELL_COMMAND + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(DATADIR)/fish/completions/$(COMMAND).fish" +endif + @$(ECHO_EMPTY) + +# Install tab-completion scripts for Z shell. +.PHONY: install-zsh +install-zsh: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).zsh-completion) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(DATADIR)/zsh/site-functions" +ifndef __SHELL_COMMAND + $(Q)$(foreach F,$(_AUTO_COMPLETE),$(INSTALL_DATA) bin/$(F).zsh-completion -- "$(DESTDIR)$(DATADIR)/zsh/site-functions/_$(F)" &&) $(TRUE) +endif +ifdef __SHELL_COMMAND + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(DATADIR)/zsh/site-functions/_$(COMMAND)" +endif + @$(ECHO_EMPTY) + + +# UNINSTALL RULES: + +# Uninstall tab-completion. +.PHONY: uninstall-shell +uninstall-shell: +ifndef __SHELL_COMMAND + -$(Q)$(RM) -- $(foreach F,$(_AUTO_COMPLETE),"$(DESTDIR)$(DATADIR)/bash-completion/completions/$(F)") + -$(Q)$(RM) -- $(foreach F,$(_AUTO_COMPLETE),"$(DESTDIR)$(DATADIR)/fish/completions/$(F).fish") + -$(Q)$(RM) -- $(foreach F,$(_AUTO_COMPLETE),"$(DESTDIR)$(DATADIR)/zsh/site-functions/_$(F)") +endif +ifdef __SHELL_COMMAND + -$(Q)$(RM) -- "$(DESTDIR)$(DATADIR)/bash-completion/completions/$(COMMAND)" + -$(Q)$(RM) -- "$(DESTDIR)$(DATADIR)/fish/completions/$(COMMAND).fish" + -$(Q)$(RM) -- "$(DESTDIR)$(DATADIR)/zsh/site-functions/_$(COMMAND)" +endif + + +endif + diff --git a/mk/tags.mk b/mk/tags.mk new file mode 100644 index 0000000..926cb5d --- /dev/null +++ b/mk/tags.mk @@ -0,0 +1,25 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== These rules are used for generate etags- and ctags-tablse. ===# + + +# Generate etags-table. +.PHONY: TAGS +TAGS: + @$(ECHO) + @$(ECHO) "TAGS is not implemented. Did not see the need. Feel free to implement if you want." + @$(ECHO) + +# Generate ctags-table +.PHONY: tags +tags: + @$(ECHO) + @$(ECHO) "tags is not implemented. Did not see the need. Feel free to implement if you want." + @$(ECHO) + diff --git a/mk/texinfo.mk b/mk/texinfo.mk new file mode 100644 index 0000000..e2ccb12 --- /dev/null +++ b/mk/texinfo.mk @@ -0,0 +1,294 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +# TODO ((support translations)) +#=== These rules are used for Texinfo manuals. ===# + + +# Enables the rules: +# info Build info manual +# dvi Build DVI manual +# pdf Build PDF manual +# ps Build PostScript manual +# html Build HTML manual +# install-info Install info manual +# install-dvi Install DVI manual +# install-pdf Install PDF manual +# install-ps Install PostScript manual +# install-html Install HTML manual +# +# This file is ignored unless +# _HAVE_TEXINFO_MANUAL is defined. +# +# This file can only build output for +# one Texinfo manual. This manual must +# be named doc/info/$(_PROJECT).texinfo. +# Additional sourced are set by specifing +# how man directories deep doc/info nests +# in the variable _TEXINFO_DIRLEVELS. +# +# If the info manual splits, specify the +# split-number, of the file with the highest +# split-number, in the variable _INFOPARTS. +# +# If the project has a logo, _LOGO should +# name the suffixless basename of the SVG +# files that contains the logo. This file +# must be located in doc/. +# +# _HTML_FILES should the basename (with +# suffix) of all files generated by `html`. +# +# The user may define TEXINFO_FLAGS that +# adds additional flags when compiling +# DVI, PDF, and PostScript manuals. The +# user may also define INFO_FLAGS that +# adds additional flags when compiling +# info and HTML manuals. + + +ifdef _HAVE_TEXINFO_MANUAL + + +# WHEN TO BUILD, INSTALL, AND UNINSTALL: + +all: info +everything: info dvi pdf ps html +doc: info dvi pdf ps html +install: install-info +install-everything: install-info install-dvi install-pdf install-ps install-html +install-doc: install-info install-dvi install-pdf install-ps install-html +uninstall: uninstall-info uninstall-dvi uninstall-pdf uninstall-ps uninstall-html + + +# HELP VARIABLES: + +# Files from which the Texinfo manuals are built. +ifdef _TEXINFO_DIRLEVELS +ifeq ($(_TEXINFO_DIRLEVELS),1) +__TEXI_SRC_ = *.texinfo +endif +ifeq ($(_TEXINFO_DIRLEVELS),2) +__TEXI_SRC_ = *.texinfo */*.texinfo +endif +ifeq ($(_TEXINFO_DIRLEVELS),3) +__TEXI_SRC_ = *.texinfo */*.texinfo */*/*.texinfo +endif +ifneq ($(_TEXINFO_DIRLEVELS),1) +ifneq ($(_TEXINFO_DIRLEVELS),2) +ifneq ($(_TEXINFO_DIRLEVELS),3) +__TEXI_SRC_ = $(foreach W,$(shell $(SEQ) $(_TEXINFO_DIRLEVELS) | while read n; do $(ECHO) $$($(SEQ) $$n)" " | $(SED) 's/[^ ]* /\/\*/g'; done | $(XARGS) $(ECHO)),$(shell $(ECHO) $(W).texinfo | $(SED) 's/^.//')) +endif +endif +endif +__TEXI_SRC = $(foreach S,$(__TEXI_SRC_),$(foreach F,$(shell cd $(v)doc/info && $(ECHO) $(S)),aux/doc/$(F))) +endif + +# Split parts of the info manual. +ifdef _INFOPARTS +ifneq ($(_INFOPARTS),0) +__INFOPARTS = $(shell $(SEQ)) +endif +endif + +# Flags for TeX processed output. +__TEXINFO_FLAGS = $(TEXINFO_FLAGS) +ifdef _LOGO +__TEXINFO_FLAGS += '--texinfo="@set LOGO $(_LOGO)"' +endif + + +# BUILD RULES: + +ifdef _LOGO +# Prepare conversion of logo. +aux/$(_LOGO).svg: $(v)doc/$(_LOGO).svg + @$(PRINTF_INFO) '\e[00;01;31mCP\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p aux + $(Q)$(CP) $^ $@ #$Z + @$(ECHO_EMPTY) + +# Intermediate format for the logo for DVI and PostScript manuals. +aux/$(_LOGO).ps: $(v)doc/$(_LOGO).svg + @$(PRINTF_INFO) '\e[00;01;31mPS\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p aux + $(Q)$(SVG2PS) $^ > $@ #$Z + @$(ECHO_EMPTY) + +# Logo for DVI and PostScript manuals. +aux/$(_LOGO).eps: aux/$(_LOGO).ps + @$(PRINTF_INFO) '\e[00;01;31mEPS\e[34m %s\e[00m$A\n' "$@" + $(Q)$(PS2EPS) $^ #$Z + @$(ECHO_EMPTY) + +# Logo for PDF manual. +aux/$(_LOGO).pdf: $(v)doc/$(_LOGO).svg + @$(PRINTF_INFO) '\e[00;01;31mPDF\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p aux + $(Q)$(SVG2PDF) $^ > $@ #$Z + @$(ECHO_EMPTY) +endif + +# Copy texinfo files to aux/doc. +aux/doc/%.texinfo: $(v)doc/info/%.texinfo + @$(PRINTF_INFO) '\e[00;01;31mCP\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p $(shell $(DIRNAME) $@) + $(Q)$(CP) $< $@ #$Z + @$(ECHO_EMPTY) + +# Build info manual. +.PHONY: info +info: $(__TEXI_SRC) bin/$(_PROJECT).info +bin/%.info $(foreach P,$(__INFOPARTS),bin/%.info-$(P)): aux/doc/%.texinfo $(__TEXI_SRC) + @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" + @$(MKDIR) -p bin + $(Q)$(MAKEINFO) $(INFO_FLAGS) $< #$Z + @$(PRINTF_INFO) '$A' + $(Q)$(MV) $*.info $@ #$Z + @$(ECHO_EMPTY) + +# Build DVI manual. +.PHONY: dvi +dvi: $(__TEXI_SRC) bin/$(_PROJECT).dvi +bin/%.dvi: aux/doc/%.texinfo $(__TEXI_SRC) $(foreach L,$(_LOGO),aux/$(L).eps) + @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" + @! $(TEST) -d aux/dvi/$* || $(RM) -rf aux/dvi/$* + @$(MKDIR) -p aux/dvi/$* bin + $(Q)cd aux/dvi/$* && $(TEXI2DVI) $(__back3unless_v)$< $(__TEXINFO_FLAGS) < /dev/null #$Z + @$(PRINTF_INFO) '$A' + $(Q)$(MV) aux/dvi/$*/$*.dvi $@ #$Z + @$(ECHO_EMPTY) + +# Build PDF manual. +.PHONY: pdf +pdf: $(__TEXI_SRC) bin/$(_PROJECT).pdf +bin/%.pdf: aux/doc/%.texinfo $(__TEXI_SRC) $(foreach L,$(_LOGO),aux/$(L).pdf) + @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" + @! $(TEST) -d aux/pdf/$* || $(RM) -rf aux/pdf/$* + @$(MKDIR) -p aux/pdf/$* bin + $(Q)cd aux/pdf/$* && $(TEXI2PDF) $(__back3unless_v)$< $(__TEXINFO_FLAGS) < /dev/null #$Z + @$(PRINTF_INFO) '$A' + $(Q)$(MV) aux/pdf/$*/$*.pdf $@ #$Z + @$(ECHO_EMPTY) + +# Build PostScript manual. +.PHONY: ps +ps: $(__TEXI_SRC) bin/$(_PROJECT).ps +bin/%.ps: aux/doc/%.texinfo $(__TEXI_SRC) $(foreach L,$(_LOGO),aux/$(L).eps) + @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" + @! $(TEST) -d aux/ps/$* || $(RM) -rf aux/ps/$* + @$(MKDIR) -p aux/ps/$* bin + $(Q)cd aux/ps/$* && $(TEXI2PS) $(__back3unless_v)$< $(__TEXINFO_FLAGS) < /dev/null #$Z + @$(PRINTF_INFO) '$A' + $(Q)$(MV) aux/ps/$*/$*.ps $@ #$Z + @$(ECHO_EMPTY) + +# Build HTML manual. +.PHONY: html +html: $(__TEXI_SRC) bin/html/$(_PROJECT)/index.html +bin/html/%/index.html: aux/doc/%.texinfo $(__TEXI_SRC) + @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" + @! $(TEST) -d bin/html/$* || $(RM) -rf bin/html/$* + @$(MKDIR) -p bin/html + $(Q)cd bin/html && $(MAKEINFO_HTML) $(INFO_FLAGS) $(__back2unless_v)$< < /dev/null #$Z + @$(ECHO_EMPTY) + + +# INSTALL RULES: + +# Install info manual. +.PHONY: install-info +install-info: bin/$(_PROJECT).info $(foreach P,$(__INFOPARTS),bin/%.info-$(P)) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(INFODIR)" + $(Q)$(INSTALL_DATA) bin/$(_PROJECT).info -- "$(DESTDIR)$(INFODIR)/$(PKGNAME).info" + $(Q)$(forearch P,$(__INFOPARTS),$(INSTALL_DATA) bin/$*.info-$(P) -- "$(DESTDIR)$(INFODIR)/$(PKGNAME).info-$(P)" &&) $(TRUE) +ifdef POST_INSTALL + $(POST_INSTALL) +endif + $(Q)if $(SHELL) -c '$(N) $(INSTALL_INFO) --version' > /dev/null 2>&1; then \ + $(N)$(z) $(INSTALL_INFO) -- "${DESTDIR}${INFODIR}/$(PKGNAME).info" "${DESTDIR}${INFODIR}/dir"; \ + else \ + $(TRUE); \ + fi +ifdef POST_INSTALL + $(NORMAL_INSTALL) +endif + @$(ECHO_EMPTY) + +# Install DVI manual. +.PHONY: install-dvi +install-dvi: bin/$(_PROJECT).dvi + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(DVIDIR)" + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(DVIDIR)/$(PKGNAME).dvi" + @$(ECHO_EMPTY) + +# Install PDF manual. +.PHONY: install-pdf +install-pdf: bin/$(_PROJECT).pdf + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(PDFDIR)" + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(PDFDIR)/$(PKGNAME).pdf" + @$(ECHO_EMPTY) + +# Install PostScript manual. +.PHONY: install-ps +install-ps: bin/$(_PROJECT).ps + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(PSDIR)" + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(PSDIR)/$(PKGNAME).ps" + @$(ECHO_EMPTY) + +# Install HTML manual. +.PHONY: install-html +install-html: $(foreach F,$(_HTML_FILES),bin/html/$(_PROJECT)/$(F)) + @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" + $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(HTMLDIR)/$(PKGNAME)" + $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(HTMLDIR)/$(PKGNAME)/" + @$(ECHO_EMPTY) + + +# UNINSTALL RULES: + +# Uninstall info manual. +.PHONY: uninstall-info +uninstall-info: +ifdef PRE_UNINSTALL + $(PRE_UNINSTALL) +endif + -$(Q)$(N)$(a) $(INSTALL_INFO) --delete -- "${DESTDIR}${INFODIR}/$(PKGNAME).info" "${DESTDIR}${INFODIR}/dir" +ifdef PRE_UNINSTALL + $(NORMAL_UNINSTALL) +endif + -$(Q)$(RM) -- "$(DESTDIR)$(INFODIR)/$(PKGNAME).info" $(forearch P,$(__INFOPARTS),"$(DESTDIR)$(INFODIR)/$(PKGNAME).info-$(P)") + +# Uninstall DVI manual. +.PHONY: uninstall-dvi +uninstall-dvi: + -$(Q)$(RM) -- "$(DESTDIR)$(DVIDIR)/$(PKGNAME).dvi" + +# Uninstall PDF manual. +.PHONY: uninstall-pdf +uninstall-pdf: + -$(Q)$(RM) -- "$(DESTDIR)$(PDFDIR)/$(PKGNAME).pdf" + +# Uninstall PostScript manual. +.PHONY: uninstall-ps +uninstall-ps: + -$(Q)$(RM) -- "$(DESTDIR)$(PSDIR)/$(PKGNAME).ps" + +# Uninstall HTML manual. +.PHONY: uninstall-html +uninstall-html: + -$(Q)$(RM) -- $(foreach F,$(_HTML_FILES),"$(DESTDIR)$(HTMLDIR)/$(PKGNAME)/$(F)") + -$(Q)$(RM) -- "$(DESTDIR)$(HTMLDIR)/$(PKGNAME)" + + +endif + diff --git a/mk/tools.mk b/mk/tools.mk new file mode 100644 index 0000000..e3d9bfe --- /dev/null +++ b/mk/tools.mk @@ -0,0 +1,163 @@ +# Copyright (C) 2015, 2016 Mattias Andrée <maandree@member.fsf.org> +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + + +#=== This file defines variables for all used commands. ===# + + +# Part of GNU Coreutils: +BASENAME ?= basename +CHGRP ?= chgrp +CHMOD ?= chmod +CHOWN ?= chown +CP ?= cp +CPLIT ?= cplit +CUT ?= cut +DATE ?= date +DIRNAME ?= dirname +ECHO ?= echo +ENV ?= env +EXPAND ?= expand +EXPR ?= expr +FALS ?= false +FMT ?= fmt +FOLD ?= fold +HEAD ?= head +INSTALL ?= install +INSTALL_DATA ?= $(INSTALL) -m644 +INSTALL_DIR ?= $(INSTALL) -dm755 +INSTALL_PROGRAM ?= $(INSTALL) -m755 +JOIN ?= join +LN ?= ln +MKDIR ?= mkdir +MKFIFO ?= mkfifo +MKNOD ?= mknod +MV ?= mv +NL ?= nl +NPROC ?= nproc +NUMFMT ?= numfmt +OD ?= od +PASTE ?= paste +PATHCHK ?= pathchk +PR ?= pr +PRINTF ?= printf +READLINK ?= readlink +REALPATH ?= realpath +RM ?= rm +RMDIR ?= rmdir +SEQ ?= seq +SLEEP ?= sleep +SORT ?= sort +SPLIT ?= split +STAT ?= stat +TAC ?= tac +TAIL ?= tail +TEE ?= tee +TEST ?= test +TOUCH ?= touch +TR ?= tr +TRUE ?= true +TRUNCATE ?= truncate +TSORT ?= tsort +UNAME ?= uname +UNEXPAND ?= unexpand +UNIQ ?= uniq +WC ?= wc +YES ?= yes + +# Part of GNU help2man: +HELP2MAN ?= help2man + +# Part of GNU tar: +TAR ?= tar + +# Part of GNU Findutils: +FIND ?= find +XARGS ?= xargs + +# Part of GNU Grep: +GREP ?= grep +EGREP ?= egrep +FGREP ?= fgrep + +# Part of GNU Sed: +SED ?= sed + +# Part of GNU Privacy Guard: +GPG ?= gpg + +# Part of Texinfo: +MAKEINFO ?= makeinfo +MAKEINFO_HTML ?= $(MAKEINFO) --html +INSTALL_INFO ?= install-info + +# Part of Texlive-plainextra: +TEXI2PDF ?= texi2pdf +TEXI2DVI ?= texi2dvi +TEXI2PS ?= texi2pdf --ps + +# Part of Texlive-core: +PS2EPS ?= ps2eps + +# Part of librsvg: +RSVG_CONVERT ?= rsvg-convert +SVG2PS ?= $(RSVG_CONVERT) --format=ps +SVG2PDF ?= $(RSVG_CONVERT) --format=pdf + +# Part of GNU Compiler Collection: +CC ?= cc +CPP ?= cpp +CXX ?= c++ + +# Part of GNU Binutils: +AR ?= ar +LD ?= ld +RANLIB ?= ranlib + +# Part of GNU Bison: +BISON ?= bison +YACC ?= yacc + +# Part of Flex: +FLEX ?= FLEX +LEX ?= lex + +# Part of GNU C Library: +LDCONFIG ?= ldconfig + +# Part of GNU Gettext: +XGETTEXT ?= xgettext +MSGFMT ?= msgfmt +MSGMERGE ?= msgmerge +MSGINIT ?= msginit + +# Part of gzip: +GZIP ?= gzip +GZIP_COMPRESS ?= $(GZIP) -k9 + +# Part of bzip2: +BZIP2 ?= bzip2 +BZIP2_COMPRESS ?= $(BZIP2) -k9 + +# Part of xz: +XZ ?= xz +XZ_COMPRESS ?= $(XZ) -ke9 + +# Part of auto-auto-complete: +AUTO_AUTO_COMPLETE ?= auto-auto-complete + + +# Change to $(TRUE) to suppress the bold red and blue output. +ifndef PRINTF_INFO +PRINTF_INFO = $(PRINTF) +endif + +# Change to $(TRUE) to suppress empty lines +ifndef ECHO_EMPTY +ECHO_EMPTY = $(ECHO) +endif + |